2010年12月31日星期五

2010年这一年

2010年是自己参加工作的第一年,经历了半年的实习,半年的正式工作,7月份从学校毕业,正式踏入社会。思考这一年,有收获,有不足。但感觉不足大于收获,这可能也是我内在的性格上的缺陷造成的,这一年我干的并不是特别开心。我要慢慢的克服自己这些内心性格上的缺陷,但并不一定是改变自己的性格。

2010年大学毕业,与自己相处了4年的同学分分离,从此天南海北,不知道以后还是否有缘再见一面。

2010年就这么过去了,我还清晰的记得2010年1月1日我坐在13线地铁上,望着“2010年1月1日已消毒”字样,感慨自己为什么会在这里,在这里干什么。那时,还住在霍营,上下班都需要乘坐一个多小时的地铁,人多如麻,就常常想人干嘛要这样折磨自己。现在回想起那段时间,每天要在地铁上吃早饭,感觉很累。一年的时间不经意间就过去了,真的这一年真是过的太快了。

2011年希望自己能够完成的事情:
1、多读书,每周读一本书,写总结;自己不太可能著作等身,但希望自己能读等身的书。
2、最为一个程序员,希望在这一年自己能够做一款能让自己有点小小自豪的软件产品。
3、我本性内向,希望自己在新的一年认识一些新朋友。多和老朋友新朋友沟通。多输入多输出。
4、父母希望我回家工作,自己能考察一下,能做点什么。
5、存钱:自费进行一次年度旅行,一次年度培训。

2011年新的一年,新的开始!

2010年12月19日星期日

平凡的世界

昨天将这本1251页的巨著读完了,感慨颇多。所有人对于这个世界来说都是很平凡的,最后的最后都是死亡。但是对于每个人来说,在自己内心的深处都可以有自己的一个不平凡的生活的方法。用自己的天枰衡量自己,衡量这个世界。不卑不亢。

2010年12月17日星期五

删掉不再使用的USB网卡设备

曾经使用USB网卡,后来直接使用了一块PCI网卡,给网卡设IP的时候,IP老被旧的USB网卡占用,就想着删除它。

步骤如下:

进入cmd命令行
set devmgr_show_nonpresent_devices=1
start devmgmt.msc(设备管理器)

点击设备管理器的查看->显示隐藏的设备,这样我们USB网卡内容会显示出来,有时我们直接删除是删不掉的,这是我们要把相关的浅色的设备删掉,再来删除这些设备就可以了。

2010年12月7日星期二

log4c库使用和配置文件的写法

1、log4c_category_get函数
     get特征,可从xml中获得多个category,如:
     (1)搜six13log.log.app.application1会包含xml中有的six13log.log.app.application1、six13log.log.app、six13log.log等category,以.为分隔符号,向上包含。
     (2)搜six13log.log.app,并不会包含six13log.log.app.application1,也就是不向下包含。

2、log4c有自己的文件输出方式,可指定目录、文件个数、文件大小、文件名前缀、输出方式等。如果大小完了,log4c会删除全部,然后重新开始写。

3、用户可以写自己的append和format。官网的程序包中有两个例子,这样我们可以将日志输出到syslog和socket中。

4、const log4c_location_info_t locinfo = LOG4C_LOCATION_INFO_INITIALIZER(NULL); 来定义日志中的函数名、行数信息。

log4c配置文件:

2010年12月6日星期一

linux动态链接库使用方法

linux环境下动态库的默认搜索路径是/lib和/usr/lib。动态库创建后一般被放到这两个目录中,当然也可以放到我们自己建立的目录中,这时我们就需要做一些其它操作,有三种方法可实现:

1、修改/etc/ld.so.conf文件,将你自己放动态库的路径加入这个文件,运行命令ldconfig然系统从新读取配置。

2、修改LD_LIBRARY_PATH环境变量,将你自己放动态库的路径加入这个环境变量。
export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/root/test/env/lib

3、编译程序时指定程序动态库搜索路径,gcc -Wl,-rpath,./

linux系统动态库搜索顺序:编译指定路径-->LD_LIBRARY_PATH路径-->/etc/ld.so.conf路径-->/lib目录-->/usr/lib目录

2010年11月26日星期五

工作-离职

        今天又有一个同事离职了,今天离职的是在联想网御呆了十年的一位老员工,我一直以为她会一直在这家公司干下去,毕竟已经十年了。在这个年轻的公司,工作三年的员工已经算是老员工了。最近我们网络安全部已经接连有三位同事离职了,有高级研发、有产品主管、有经理。
        或许人走人留是一个很正常的事情。
        OVER!

2010年11月25日星期四

平凡的世界

        这几天开始读《平凡的世界》,中午、下午吃晚饭后都会读一小会,又往MP3中拷了一部有声的读物,第一次觉得小说这么有吸引力,起码对我本人来说。这样双管齐下,读的很快,平均一天能够读四个章节。书中孙少平、孙少安的未来一直让我牵挂着,少安和润叶的感情的结局我也很期待。中午去买饭的时候,听一个上学时代读过很多书的人说,最终少安自卑没有娶润叶,少平最后做了一个煤矿工人,去挖煤,还破了相。我很惊讶,怎么会这样,少平不是去读高中了吗,不是读书也不错啊。当时还安慰自己说,毕竟是小说,悲情的结局才会更吸引人。后来想了想,觉得这是一个很合理的结局,放到今天也一样,也是一样。今天那些那么多的XX二代什么的,不用费多大力气就可以过上优越的生活,而那些老百姓的子女们,需要多大的努力,奋斗多久才能出头呢。《平凡的世界》告诉我们,无论什么时候,为官,仕途总是一个好的选择。
        但是不论怎样,就像晚饭的时候同事调侃的那样,你丫的已经在这了,你还能怎么办呢!
      
        上学的时候,看同学在读小说的时候,总觉得很浪费时间。现在我不这么认为了,甚至有点后悔自己在读书的时候,在有大量时间的时候,没有好好的读几本书,读几本小说。现在自己有好多的书想读,恨不得一下子全部都给读了。当前我要把《平凡的世界》读完了,我想知道事情的结局,我想知道路遥想通过本书传递给我们什么。
      

2010年11月15日星期一

Quoted-printable邮件编码及编码实现

    Quoted-printable是众多邮件编码协议中的一种,与BASE64作用相同。为了表示传统的NVT ASCII不能表示的字符(128-254)。对于大多可读的ASCII不进行编码,所以QP编码有很多的部分是可读的。
    编码规则如下:

  1. ASCII中,[33,126]之间除了'=',在QP中都可以直接显示无需编码。0-32 + '=' + 127-254这些字符是需要进行QP编码的。
  2. 编码方法:如空格在ASCII中用0x20十六进制表示,QP编码将其十六进制用字符表示,在其前加'='号,为=20。QP编码中,'='符号后必须为大写。
  3. 普通文本中有'\r\n'换行符号,在QP中,编码为=0D=0A,但不换行。
  4. QP编码每行的长度限制为最多76个字符,到达后需要添加QP中的软换行(=\r\n),直接将软换行加入QP编码中,其中'='算在76字符内,而'\r\n'不算。
  5. QP编码的所有行不能以空格或TAB结尾,必须为软换行(=\r\n)或可打印的字符。
  6. 代码中最好加入异常处理:QP编码不为大写,结尾为空格等。

2010年11月14日星期日

2010年11月14日

    自己的域名(www.chinazst.cn)因为没有进行备案(提交身份证复印件)被国家停止解析了,加上之前的虚拟主机的速度也不是特别的理想,所以我也不太想在原来的博客上写了,打算选择一个免费的博客提供商来写博客,比较多个之后,选择了google提供的博客服务。把原来博客中自己觉得价值比较大的几篇文章留了下来,其它的全部都给删除了。一个新的开始。

    最近一些时间感觉时间过的特别的快,一不留意一周就过去了,感觉自己没有干多少的活。可能是自己没有做太多让自己印象深刻的事情的缘故的吧,每天重复同样的事情,没有学习新的东西和知识,就会觉得时间过得很快。

    这个月CPI涨了了4.4%,生活中也明显体验到了物价的上涨。整个国家都在讨论货币通胀、人民币升值、热钱涌入等问题。学一些经济知识还是很有必要的。可以帮助自己达到财务自由。

    最近一直在看书,给自己规定每天读30页书,不同的三本书,总是不能读完。或许对自己的要求还是太高了,三本书都是那种需要花很大力气读的精度的书,或许应该混合搭配一下。

    前天是自己的23岁生日,没有请同学吃饭,没有吃蛋糕,简简单单的吃了一碗面。接下来就是自己23岁的人生路了,真快。等到我32岁时,我又会是什么样的境遇呢!真期待。

    就是这样,生活、经济、心情都需要自己来调节,不要把换心情带给身边的人。

2010年11月12日星期五

中秋三天

这次的中秋过的挺充实的。第一天逛街、看电影、买了十一回家的票。早上在西直门嘉茂购物中心和西单商城逛了会,平时没有怎么注意,一出去逛街、购物就会感觉到现在的物价水平,太高了。在西直门北京北站买了回家的火车票。下午在在UME华星店看了《盗梦空间》。情节很紧凑,构思很好玩,人的多重梦境。
第二天和女友公司的几个驴友去爬京区最高的山,北京灵山,在北京和河北张家口交接的地方,海拔2303米。我们全部人是从后山的小路上山,道路很险,不过成正比的是风景很美。我们越过2座山头最后才到达灵山主峰。我们还在越过的第一座山峰山野餐,煮面,很不错。第二座山的山顶上有一片很美的白桦林。山上的空气特别的好,成功的换气洗肺。爬山加上午休吃饭总共花了6个小时。爬山来回的车程需要4个小时,在车上几个人聊了很多,大家都算是底层的小白领,都感觉生活很艰难。在北京生活,买不起房子,生不起孩子,最后死的时候墓地都买不起,呵呵。不过生活还得继续,国家解决不了的事情,只能独善其身,自己搞定。


POP3中文翻译译文-RFC1939

网上找不到完整的中文版,于是就自己把RFC文档翻译了一遍,有错误欢迎指正,转载请注明出处!下面正文。
Post Office Protocol - Version 3
1、 简介
对于互联网上较小的节点,维护一个信息传送系统(MTS)是不大现实的。例如,一个工作站没有足够的资源(时间,磁盘空间)使一个SMTP服务器[RFC821]和关联的本地邮件投递系统驻留和连续运行。类似地,把一台个人电脑长时间连接在IP网络上是昂贵的说着不现实的(资源受限的节点称为”连通性”)。
尽管如此,在小节点上收发邮件是非常有用的,所以经常架设一个用户代理(UA)来帮助处理邮件任务。为了解决这个问题,我们在MTS实体上为资源受限的节点提供了邮筒功能。邮局协议-版本3(POP3)允许工作站以一种比较实用的方式来访问服务器邮筒。通常,这意味着POP3协议支持工作站去服务器检索服务器上为本工作站存储的邮件。
POP3未打算提供大量服务器上的邮件操作;一般,邮件被下载后即被删除。一个更为先进和复杂的协议,IMAP4,正在设计中[RFC1730]。
在下文中,客户主机指使用POP3服务的主机,服务器主机指提供POP3服务的主机。

Linux启动过程之inittab脚本流程分析

系统从我们按下计算机的电源键到机器可以使用,执行流程如下:
power on–>BIOS–>Grub–>Kernerl boot–>init(rc.sysinit, rc)–>mingetty(login)–>Shell—->
Init进程进程号为1,是linux内核引导完之后运行的第一个进程,init进程运行初会去读取配置文件/etc/inittab。Inittab是一个不可执行的文本文件,由若干指令组成。这里总结一下init进程开始的系统脚本执行顺序,以及各个脚本的含义。
脚本/etc/inittab中所有的记录都以以下的格式呈现:
id:runlevel:action:process
id是入口标示符号,为一个字符串,对于getty或mingetty等login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。
runlevel是级别标志,init进程启动时会有一个运行级别,/etc/inittab脚本中和init运行级别匹配的记录会被执行。
Action表述后面的process的运行方式。action的取值包括initdefault、sysinit、boot 、bootwait。
Initdefalut是一个特殊的action值,用于标示缺省的启动级别。当init进程启动后会去读取initdefault的值,如果没有此值,则会在控制台请求用户输入runlevel值。
Process为具体的执行程序,程序可以带参数。
脚本中记录的含义:
id:5:initdefault:
用于指定当前的runlevel,5标示运行于界面模式。
si::sysinit:/etc/rc.d/rc.sysinit
此脚本主要用于完成系统初始化工作,它是每一个级别都要首先运行的重要脚本。rc.sysinit程序执行完后,将返回init继续执行。
l2:2:wait:/etc/rc.d/rc2
各守护进程的启动,rc2为一个shell脚本,在rc2中回去循环执行/etc/rc.d/rc2.d目录下的所有脚本,这些脚本一般都是符号链接,链接到别的位置文件,这些脚本一般都会接受start、stop、restart、status等参数。
1:2345:respawn:/sbin/getty 38400 tty1
用于启动终端

linux系统下栈大小的计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
static int i = 0;
static int c = 0;
int r1 = 0, r2 = 0;
 
static void
func_stack()
{
 
    int ret;
    /* 输出函数的%ebp的地址
     */
    if (c < 2) {
 asm("movl %%ebp, %%eax; movl %%eax, %0;"
     :"=r" (ret)
     :
     :"%eax");
 
 if (c == 0) {
     r1 = ret;
 } else if (c == 1) {
     r2 = ret;
 }
 c++;
    }
 
 
    while (1) {
 printf("i=%d stack:%d all:%ld\n", i, r1 - r2, (long )(r1-r2)*i);
 i++;
 func_stack();
    }
}
 
int
main(void)
{
    func_stack();
    return 0;
}
代码计算出的数字和ulimit -a得出的结果相同。8M

素数的求解

大一刚开始学习程序设计的时候,自己就遇到过素数求解的问题,今天又遇到在这里总结一下。
素数又称质数,为大于1的自然数中,除了1和整数自身外,没法被其他自然数整除的数。
因为素数没有特定的规律,最简单的方法就是使用穷举法了,我们判断一个数字是否为素数,就一个个的判断他是否能被其他的数整除,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
/* 判断一个正整数是否素数 */
static int
prime_number(const int n)
{
    int i;
 
    if (n == 2)
 return 0;
 
    for (i = 2; i < n; i++) {
 if (n % i == 0) {
     return -1;
 }
    }
 
    return 0;
}
 
int
main(void)
{
    int i;
 
    for (i =2; i < 100; i++) {
 if (prime_number(i) == 0) {
     printf("%3d ", i);
 }
    }
 
    return 0;
}
这里我们稍微深入思考一下,我就就很容易想到如下的信息:
1 偶数是不可能是素数的
2 判断奇数是否为素数是不需要那偶数去除它的
3 素数循环不必循环到n,到根号n就可(理论上为什么不清楚)
按以上的方法修改下程序,效率会提高很多,程序如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
/* 判断一个正整数是否素数 */
static int
prime_number(const int n)
{
    int i;
 
    if (n == 2)
 return 0;
 
    for (i = 3; i*i < n; i += 2) {
 if (n % i == 0) {
     return -1;
 }
    }
 
    return 0;
}
 
int
main(void)
{
    int i;
 
    printf("%3d ", 2);
    for (i = 3; i < 100; i += 2) {
 if (prime_number(i) == 0) {
     printf("%3d ", i);
 }
    }
 
    return 0;
}

两个练习题

冒泡排序和二分查找的练习。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>  /* srand rand */
#include <time.h>
#include <unistd.h>
 
static int
binary(int arr[], const int size, const int n)
{
    int high, low, mid;
 
    assert(arr != NULL);
    assert(size > 0);
 
    high = size - 1;
    low = 0;
 
    while (low <= high) {
 mid = (high + low) / 2;
 
 if (arr[mid] == n) {
     return mid;
 } else if (arr[mid] > n) {
     high = mid - 1;
 } else if (arr[mid] < n) {
     low = mid + 1;
 }
    }
 
    return -1;
}
 
static void
maopao(int arr[], const int n)
{
    int i, j, temp;
 
    assert(arr != NULL);
    assert(n > 0);
 
    for (i = 0; i < n; i++) {
 for (j = n - 1; j > i; j--) {
     if (arr[j] < arr[j-1]) {
  temp = arr[j];
  arr[j] = arr[j-1];
  arr[j-1] = temp;
     }
 }
    }
}
 
static void
print(const int arr[], const int n)
{
    int i;
 
    for (i = 0; i < n; i++) {
 printf("%d,", arr[i]);
    }
 
    printf("\n");
}
 
int
main(void)
{
    int arr[20];
    int i;
    int b_ret, len;
 
    srand(time(NULL));
    for (i = 0; i < 20; i++) {
 arr[i] = rand() % 100;
    }
 
    len = sizeof(arr)/sizeof(int);
 
 
    print(arr, len);
    maopao(arr, len);
    print(arr, len);
 
    b_ret = binary(arr, len, 47);
 
    if (b_ret != -1) {
 printf("47 is in %d\n", b_ret);
    } else {
 printf("don not exist!\n");
    }
 
    return 0;
}