残剑

Stop walking today and you'll have to run tomorrow!

古道小贩

| Comments

严格来说,他根本算不上是商贩,他只是山里小地方里的一个普普通通的农民,和其他的村民没有任何的区别。非要找出一些差别的话,只是他走出大山的次数比其他人多一些,也算是一个见过世面的人,每次从外面回来,小孩都围在他的周围,听他讲述外面精彩的世界。就凭他那敢于走出去的勇气,也值得人们敬重,毕竟很多山里人一辈子也只是在那狭小的方圆几十公里内走动。

农忙的时候忙着田地里的活,闲的时候就打理一下田里庄稼和地里的作物,或者是带着他的牛在大山里转悠。碰上丰收的话,会有很多剩余的农产品,一旦有收购商上门的话,村里人就会把多出的那些卖给他们。可他并不会便宜那些收购商,总想着给那些东西卖个好价钱,甚至有时走上几十里到城市里去打听行情。

临近出发的前一晚,他就让自己的老伴把东西,每次都把两箩筐装得满满的,其实也没有什么值钱的东西,就是一些农村人不需要而城里人特别喜欢的农产品。收拾好后检查一遍,然后早早的就睡了,因为第二天起他将要出一趟远门,来回一趟可能就要花去七、八天的时间。他没有选择离家最近的那个城市,毕竟它也只是一个内陆的城市,远没有沿海城市的需求旺盛,说白了,就是沿海那些城市的人更愿意为此花“大”价钱购买,而他也只是想赚取这小小的差价。和收购商的交谈中,他能很快就能估摸出外面市场的行情,只要他提前行动,准能卖个好价钱,他利用的就是收购商的周转时间差来赚取他的利润差。

弯曲的老树

| Comments

盼着盼着,老两口终于在四十多岁的时候迎来了他们的第一个孩子,而且是一个男孩。对于这两口子来说,这是他们活了半辈子遇到的最幸福的事情。

老两口别提有对这个孩子多宠爱了,抱在手里怕把他摔了,含在口里又怕他化了。农村的生活条件并不是那么的好,但他们以自己最大的能力去宠着这个孩子,从来不让孩子去干一点农活和家务活。孩子有什么需求,他们都尽量满足,即便达不到那个条件,他们也会去创造。老两口过得再苦再累,在他们看来,只要孩子快乐,他们做什么都是值得的,谁让自家只有这么一个宝贝儿子呢。孩子过着小皇帝般的生活,让村里的同龄人都艳羡不已。在小孩看来,这一切也是顺理成章的,毕竟他也只是一个孩子,根本无法体会到生活的艰辛和不易。

时间一晃就过去了七、八年,小孩也到了上学的年龄,虽然有老师的教育,但在父母的宠爱下,他还是变得越来越顽皮,一切都以自己为中心。就算他做了很多的错事,父母也从来不会去打他,甚至不会去责骂他。身边的亲戚朋友都提醒他们“再这样下去,会把孩子给惯坏的”,可每次他们总是笑笑,然后回道“现在孩子还小,等到他长大了自然会懂事的”。他们也不是没有听进去别人的话,只是真的舍不得,要打下不了手,要骂也张不开口。

一位邻村的朋友办喜事,碰巧也刚好是周末的日子,两口子商量着让老头带孩子去酒席,当然也把这个消息告诉了孩子。虽然距离那个喜庆的日子还有一段日子,但那孩子也是天天盼着,恨不得那天赶紧的到来。农村的那个年代,没有多少好东西可吃,只有碰上红白事的时候才能让孩子们解解馋,更何况那是喜事。

布谷鸟的由来

| Comments

在春忙的时候,田野间总能听到一种鸟在叫,嘴里不停地叫着“bo gu,bo gu…”,母亲告诉我那鸟叫“布谷鸟”,它的叫声是在提醒人们不要忘记播种的时节。当然,母亲也讲述了一个关于布谷鸟的传说。小时候总是缠着母亲给我讲故事,听过很多,记下的却很少,至今能够记得的就只有两个,这就是其中的一个。

古时候,在一个偏僻的山村里有一户人家,家里只有兄嫂叔三口人,他们的父母死得早,所以弟弟一直跟着哥哥生活,但并不被待见。等到弟弟稍微年长,他们就分了家,哥嫂霸占了大部分的财产(他们说这是养弟弟这么多年应得的,当然他也没有任何的怨言),他也没有幸运到能够分到一头牛,只分到一些谷物(不多,只能勉强够他生活到下一个收获的季节),一些农具、种子和一间破败的小屋。

生活虽然很艰辛,但他也那样美美地生活着,而且把那间破屋收拾的井井有条,也算是有一个可以安身的家了。小伙子也算勤快,忙完田地里的活,也总是到山里采摘些野菜,回家煮了吃,他很清楚,就凭他分到的那点粮食根本活不了多久。每天劳作完,饭后经常坐在家门口,仰望着星空,幻想在未来的某天也能够娶妻生子,幸福美满的过着安详的生活。

山林与野孩

| Comments

他没有琴棋书画的才艺,却有一个幸福精彩的童年,每当听他讲起儿时的生活,都让我羡慕不已,尤其是他栩栩如生地描述他和山林间故事的时候。

他出生在一个山里的小地方,他的家在半山腰下,家的后面有几户人家,再后面一点就是山林了,家门口是一片小竹林,竹子上留有他的名字(或许那些竹子也早已被砍掉了),也曾在竹子间搭建过小屋,爬竹子是他经常的一项活动,经常从这棵爬到另外一棵,当然他每次都是小心翼翼地,不是担心自己的安全,更多的是防止被他的母亲抓到,抓到后的滋味并不好受,纤细的竹枝落在身上的疼痛不是一时能够抚平的,虽然有很多次的教训,可他还是乐此不疲。从竹子上摔下来的事情也不是没有发生过,但他每次也只是拍拍身上的尘土重新来过,真的疼了,就休息一会,或者是下次继续。

上了三年级,他每天需要徒步三、四里到村里的小学上学,每次放学他总喜欢翻越学校后面的山回家。尽管后山有坟场,却也不能让他产生畏惧。他清楚在哪些时节,山上的地里会长一些水果,如果没有人的话,他可以顺手摘一些,解解馋,他告诉我他最喜欢吃那些嫩嫩的豌豆了。

母亲买来了两头羊,在周末和假期的时候,它们就是他的伙伴,他带着它两跑窜在各个山头。他说,羊最大的愿望就是能够找到丰盛的草,然后美美地吃上一顿,而他的乐趣就是在山里跑来跑去,他把自己的乐趣强加到了羊的身上,却始终没有顾及过它们的感受,带着它们四处乱跑,有时羊不愿往上爬,他也是硬把它们拉了上去,同他一起欣赏远方的美景。每每提到此,他都会傻笑不止。有时他自己玩得尽兴,却把羊给放丢了,它们没有吃饱,只能去祸害邻居的庄稼了,搞得他的母亲不得不向别人道歉,当然他也不能逃脱他母亲的惩罚。

徽杭古道行

| Comments

alt text

按照老妈的话讲就是“吃饱了撑着没事去爬山啊,要是喜欢爬,可以回去爬老家的山嘛,反正现在我们家的天地也空着”,我清楚母亲是不希望我待在家乡的山沟里的,只是她对那种生活看不到希望,一直以来都鼓励我走出去。就我来说,我也并不喜欢那种生活,小时候母亲让我挑一些轻便的东西的时候,我总是躲避或者是找各种理由推脱。小时候母亲之所以会那么做,主要还是想让我体验一下农村的艰苦生活,可那时我并不懂得这些。和家乡的很多同龄人相比,我的童年并没有做太多的农活。那时的我喜欢在山林间乱窜,却不愿身上有任何的负担,我清楚那种滋味让人难受。

长大后的自己,还是喜欢行走在山林间,时而就有去爬山的冲动。现在不会有人强迫我挑担子,也就淡忘了那种艰辛的滋味。每次爬山,不知疲惫,或许只是为了探寻远去的生活,让自己有所警醒。

沉寂的岁月

| Comments

自己都没有为沉寂一个月找到一个合适的理由,或许这只是一个对自己小小的许诺,它的意义可能就是如此。过去小小的一段日子里因为没有发布什么信息而不用去关注朋友回复的信息,其实个体的存在根本不会有多少人会在意你,即便有那么一天你悄悄的离开了这个世界,除非你那天已经强大到足够让人去回忆。可是该死的托和欺诈电话还是不停地往我这里打,我不知道我上辈子到底“骗”了他们多少钱了。

过去的一段时间,心情有些不好,幸亏有@语文书 的指点,让我能够从世俗中缓拖出来,让自己明白了一些道理,褪去了一些幼稚。有所成长,但我始终认为我还是很幼稚,我甚至不愿脱离这种状态,总觉得这样活着才会让自己更快乐,又何必去考虑那些繁杂的事情。

有两本书从去年开始看,终于在过去的一个月里把它们看完了,其实书并不厚,每本就两百多页。我看书不快,总是一个字一个字看过去(真心羡慕那些一目十行的阅读者)。读书最大的体会就是对“读万卷书不如行万里路”这句话的理解:当你读到别人文字的时候,你觉得很有道理,时而会不停地点头,一旦放下就会遗忘;可当你真正做过、体会一件事情后,去阅读别人写的文字,有的不仅仅是赞同,更多的是自身反省后的体会,这是一种财富,将会伴随着你的一生,为以后的决断作判断的依据。最近在看《创客》一书,对我的触动比较大,虽然还未投身到这个行列中去,却始终认为我们这个时代会迎来第三次工业革命。当我们抱怨缺乏机会的时候,它们可能已悄悄地来到我们身边,只是当我们选择不理会它们的时候,它们又悄悄地离开了。这个时代赋予了我们太多的机会,我们又是否意识到了它们的橄榄枝呢?

RobotsBrain: Log输出

| Comments

在构建一个库的时候,通常会写专门的log输出函数,下面介绍一个简单的实现。根据不同的需求,需要对日志的输出作一个级别限定,便于查阅及跟踪流程。以下是对级别的设置:

1
2
3
4
5
6
7
8
9
10
11
12
typedef enum log_level_en {
  RB_LOG_MIN,
  RB_LOG_DEBUG,
  RB_LOG_INFO,
  RB_LOG_NOTICE,
  RB_LOG_WARNING,
  RB_LOG_ERROR,
  RB_LOG_CRIT,
  RB_LOG_ALERT,
  RB_LOG_EMERG,
  RB_LOG_MAX
}log_level;

该部分参考内核的级别设定,不同的是数值越低其信息的重要程度越低。

具体的日志输出,我们采用了宏定义的方式,因为考虑到要输出__FUNCTION__等信息,其具体的实现如下所示:

1
2
3
4
5
6
7
8
9
#define RB_LOG(level, fmt, args...)  \
  do {    \
      if(rb_log_check_level(level) == 0)  \
          break;  \
      char rb_log_buf[RB_LOG_BUFFER_LEN] = {0};   \
      snprintf(rb_log_buf, RB_LOG_BUFFER_LEN, "pid(%d) %s %s(%d)", \
                  getpid(), __FILE__, __FUNCTION__, __LINE__);    \
      rb_log_printf(level, rb_log_buf, fmt, ##args);  \
  } while(0)

每个级别输出的宏定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define RB_DEBUG(fmt, args...)   RB_LOG(RB_LOG_DEBUG, fmt, ##args)

#define RB_INFO(fmt, args...) RB_LOG(RB_LOG_INFO, fmt, ##args)

#define RB_NOTICE(fmt, args...)   RB_LOG(RB_LOG_NOTICE, fmt, ##args)
  
#define RB_WARNING(fmt, args...)  RB_LOG(RB_LOG_WARNING, fmt, ##args)

#define RB_ERROR(fmt, args...)    RB_LOG(RB_LOG_ERROR, fmt, ##args)

#define RB_CRIT(fmt, args...) RB_LOG(RB_LOG_CRIT, fmt, ##args)

#define RB_ALERT(fmt, args...)    RB_LOG(RB_LOG_ALERT, fmt, ##args)

#define RB_EMERG(fmt, args...)    RB_LOG(RB_LOG_EMERG, fmt, ##args)

__FILE__显示全路径的问题

| Comments

在日志中,使用到__FILE__来显示源码的文件名,可它显示了绝对路径,这样使得整个log看起来很长,主要log都显示在了右边,让人看着很是不舒服。查找了半天才知道这是编译造成的,由于编译目录和源码目录不同,所以在实际编译的时候使用的是源码的绝对路径,以致打印出来就是绝对路径了(这样的解释不是很准确,有待改进)。

针对这种现象,使用以下的例子作为测试。

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(int argc, char **argv)
{
  printf("%s, %d\n", __FILE__, __LINE__);

  return 0;
}

使用源码的全路径编译:

1
$ gcc -o filetest /srv/example/c/test/filetest.c

执行结果:

1
2
$ ./filetest 
/srv/example/c/test/filetest.c, 5

为了解决以上问题,当然可以改变编译的方式:

1
$ gcc -o filetest filetest.c

执行结果:

1
2
$ ./filetest 
filetest.c, 5