新年快乐

明天就是元旦了,今年早早的考完了试,在学校闲待两三天再回家。
想很多很多的人,很快就能见到他们。
很多很多同志还奋战在考研第一线,不想打搅他们,默默的祝福他们金榜题名吧。

2009对于我也是很重要的一年,相信自己,奋斗到底!

指针+1的问题测试

测试程序:

#include
#include

struct t {
	char p[10];
	char p2[10];
}t1,t2;
int main(void)
{
	struct t * q=&t1;
	struct t * p=&t2;
	printf("栈顶	n...n高地址 q-------ntABCDntEFGHn低地址 p-------ntabcdntefghnn");

	strcpy(q->p,"ABCD");
	strcpy(p->p,"abcd");
	strcpy(q->p2,"EFGH");
	strcpy(p->p2,"efgh");

	printf("(char *)p:t%sn(char *)(p+1):t%sn", (char *)p,(char *)(p+1));
	//这里第二个参数打印ABCD,正好跳过一个结构体
	printf("(char *)(q-1):t%sn",(char *)(q-1));
	printf("(char *)q:t%sn(char *)q+1:t%sn", (char *)q,(char *)q+1);
	//这里第二个参数打印BCD,说明跳过了一字节

	printf("sizeof(struct t):%dn",sizeof(struct t));
	printf("q:t%pnq+1:t%pn",q,q+1);
	//这两个结果为0x14,正好是十进制的20,即结构体的大小

	return 0;
}
kongove@ubuntu:~$ ./a.out
栈顶
...
高地址 q-------
	ABCD	//(p+1)指向A所在地址 (char*)q+1指向B所在地址
	EFGH
低地址 p-------
	abcd	//(q-1)指向a所在地址
	efgh

(char *)p:		abcd
(char *)(p+1):	ABCD
(char *)(q-1):	abcd
(char *)q:		ABCD
(char *)q+1:	BCD
sizeof(struct t):20
q:	0x804a038
q+1:	0x804a04c

p,q都为(struct task_struct *)类型的
p+1指向的地址为p+sizeof(struct task_struct)
(char *)p+1指向的地址为p+sizeof(char)即p的下一字节

在(char *)(p+1)中,(char *)只是告诉编译器从这个地址起,读取数据直到遇到’′,并不影响取址。

总结:p为指针,则p+1指向的地址为p+sizeof(p原来的类型/p被转化成的类型)。

学习飞信(fetion)

fetion

飞信算是中国移动推出的一款新业务吧,我昨天才注册了帐号 🙂

Linux下使用飞信有很多方式,可以安装pidgin的插件,也可以安装其他客户端。

pidgin的飞信插件最新是v0.98,可以从sourceforge.net上下载到源代码

($ cvs -d:pserver:anonymous@fetion.cvs.sourceforge.net:/cvsroot/fetion co fetion)。

不过作者从10.6好后好像再没有更新过,也没有发布新的版本,作者好像也要开发python的飞信客户端。

pidgin插件安装:

下载libfetion.so,把它放置到 $HOME/.purple/plugins/ 或者/usr/lib/purple-2/或者/usr/local/lib/purple-2/,然后打开pidgin(版本不能低于2.4),配置帐号即可。这里只需要配置手机号码和密码即可。

下载地址:http://forum.ubuntu.org.cn/download/file.php?id=49104

libfetion

还有一个由邓东东主持开发的飞信应用程序开发库LibFetion,其大部分代码使用C编写,支持所有POSIX兼容的操作系统,现在貌似移植到了很多平台。基于这个库,开发了一个linux的客户端,还有其他平台的客户端,最新版本v0.9.1。

下载地址:http://www.libfetion.cn/demoapp_download.html

(包括Mac OS X,Windows,IPhone,Window Mobile等平台)

编译安装所需要的软件包:qt4 automake libc-dev g++ libcurl3-dev libqt4-dev qt4-dev-tools

解压:$ tar -zxvf linux_fetion-v0.9.1.tar.gz

编译命令:

$ cd linux_fetion

$ qmake

$ make

运行:$ ./linux-fetion

还有,我们可爱的cocobear也正在开发一个纯Python的飞信库。期待看到源码…

了解更多:http://cocobear.info/blog/?s=fetion

邓东东的LibFetion里的一些接口:

lib: 目录

libfetion_32.a  libfetion_64.a

libfetion: 目录

common.h  datastruct.h  event.h  fxconfig.h  libfetion.h

在编写程序是只需要(#include “libfetion/libfetion.h”)即可调用相关接口。

初始化: fx_init();

设置代理: fx_set_proxy(&proxy);

设置登录状态: fx_set_login_status(FX_STATUS_OFFLINE);

登录: fs_login(args.from, args.passwd);

给自己发送消息: fs_send_sms_to_self(args.message);

给指定手机号发送消息: fs_send_sms_by_mobile_no(p, args.message);

给指定飞信号发送消息: fs_send_sms(uid, args.message);

登出: fx_loginout();

关闭网络连接: fx_close_network();

这里只是列出了常用的几个接口,参数类型也没有具体介绍,了解更多可以查看:

http://www.libfetion.cn/libfxAPI/index.html

这里(http://blog.solrex.cn/articles/diy-free-weather-forecast-sms.html)有一篇关于,使用LibFetion库实现,定制自己的免费天气预报短信的文章。

《此窗恐惧汹涌》的解说词

很久以前,我就是一个有理想的人,我的理想是当一名警察,可后来我知道不行,我还没有那么勇敢,又过了几年,我又想当一名哲学家,再后来我知道不行,我还没那么深刻。

再后来我成熟了,渐渐变现实了,我知道我的理想就是拍一部真正的纪录片,它一定包含着我的爱憎,一定要开出现实的处方,一定要刺入民族的皮下!

我能吗?我对自己千万次的问,躺在床上的时候,我问自己,走在路上的时候,我问自己,直到有一天,我站在窗口,放眼望去,我才知道,我能!

我不断地拍摄,拍摄,你们看到的画面之所以不稳定,那是我的双手在愤怒地颤抖!工作里,凝聚着我的痛苦主义思索,我只能用长焦去接近这个女人,把我的关怀推过去!

来自电视剧《不要和陌生人说话》,主人公叶斗的纪录片《此窗恐惧汹涌》的解说词。

python操作数据库

下面是一个用Python写的电话簿,用来演示用Python连接、操作数据库。这里只是简单的添加、删除、显示、修改功能。

运行效果和代码如下:

kongove@ubuntu:~$ ./b.py
mytel> help
show : list all the items.
delete $id : delete the item which id=$id.
insert $id $name $tel : insert this item.
update $id $tel : update the telephone number of $id.
exit : quit this program.
help : get help.
mytel> show
id	name	tel
0	kong	02988176065
1	bob	13256457845
mytel> insert 2 peter 110
mytel> show
id	name	tel
0	kong	02988176065
1	bob	13256457845
2	peter	110
mytel> update 2 112
mytel> show
id	name	tel
0	kong	02988176065
1	bob	13256457845
2	peter	112
mytel> delete 2
mytel> show
id	name	tel
0	kong	02988176065
1	bob	13256457845
mytel> exit
kongove@ubuntu:~$

代码如下:

#!/usr/bin/env python
#encoding=utf-8
#Copyright @ 2008 Jianjun Kong
import string
import MySQLdb as mydb

def exec_cmd(cur, sql):
    cur.execute(sql)
    ret = cur.fetchall()
    return ret

def printf(ret):
    if len(ret)<=0: return
    print 'idtnamettel'
    for i in ret:
    	for j in i:
    		print '%st' %(j),
    	print

def print_html(ret):
    if len(ret)<=0: return
    print ''
    for i in ret:
    	print ''
    	for j in i:
    		print '' %(j),
    	print ''
    print '
%s
' def select_all(): sql = unicode("select * from %s" % (tab),"utf-8") return sql def del_id(i): sql = unicode("delete from %s where id=%s" % (tab,i),"utf-8") return sql def insert(i): sql = unicode("insert into %s(id,name,tel) values(%s,'%s','%s')" % (tab,i[1],i[2],i[3]),"utf-8") return sql def update_tel(i): sql = unicode("update %s set tel='%s' where id=%s" % (tab,i[2],i[1]),"utf-8") return sql def help(): print 'show : list all the items.n' 'delete $id : delete the item which id=$id.n' 'insert $id $name $tel : insert this item.n' 'update $id $tel : update the telephone number of $id.n' 'exit : quit this program.n' 'help : get help.' #main db = mydb.connect(host='hostname',user='username',passwd='password',db='database') cur = db.cursor() tab='tab2' while 1: input=inputt=raw_input('mytel> ') input=string.split(input,' ') if input[0]=='exit': break if input[0]=='help': help() continue if input[0]=='show': sql=select_all() if input[0]=='delete': sql=del_id(input[-1]) if input[0]=='insert': sql=insert(input) if input[0]=='update': sql=update_tel(input) try: ret = exec_cmd(cur, sql) printf(ret) except: pass ret = '' cur.close() db.close()

MP3容光焕发

https://i1.wp.com/img2.zol.com.cn/product/3/194/ceX3A6umVA16.jpg

大一买的mp3(newman影音王m818),没用几天,从官网下载升级程序,进行固件升级,结果挂了。界面显示调到最亮还是黯淡无光,白天在外边操作有点困难。后面又升了几次都没起作用,不过其他功能都没问题,于是就没管。

今天科研训练答辩,估计是被n多人插完的电脑染毒,直接分区挂了,最后用mkfs格式化才搞定。于是想着再升级玩玩,反正用这么久了,坏了也无所谓。

根据提示说明,把下载的几个升级程序挨个试了一边,第三次成功解决了问题,居然又一次容光焕发。喜悦 🙂 貌似操作界面也换了,更漂亮了,不错~

红楼梦音乐欣赏

前不久又把八七版《红楼梦》电视剧看了一遍,又有新的感触和收获。
其中的音乐依旧吸引这我。其中包括枉凝梅、葬花吟、晴雯歌、秋窗风雨夕、聪明累、叹香菱、分骨肉等。这些曲子都是由王立平老师精心创作,听说他在创作过程中,常常自己被感动的扒在钢琴上哭。许多歌词在落笔的时候,眼睛几乎是模糊的。演唱这些歌曲的陈力,更是在丧夫后,用音乐表达着自己的真实感情。他们是被红楼梦里的故事情节打动了,我们听众能真正体味到吗?

这些歌词多数来源于《红楼梦》原著中的诗词,许多都有深刻的内涵,包括对结局的暗示和对人物的刻画等,细细品更是意味深长。听歌曲,更是在听故事;被歌曲感动,更是被小说中的故事情节感动。

主题曲《枉凝梅》表现了宝黛钗的爱情主线,它预示了悲剧的结局,就像摄像师傅的感觉,开头是模糊的,慢慢慢慢当我们走近它的时候,聚焦再聚焦。心里那种感觉,真的是满腔惆怅、无限感慨。
《晴雯歌》这首歌曲描述了贵族家庭中年轻漂亮的丫鬟们,追求爱情、追求幸福的心声,正如歌词描写的那样--“心比天高、身微下贱”。惆怅的旋律也暗示了身处封建社会,身不由己的悲惨命运。其中最最典型的就是晴雯这个人物,聪明伶俐,美丽动人,撕扇子的行为就是把个性表现的实例。但却因此遭到其他人的嫉妒陷害而死,真是红颜多薄命。让人怜惜呀!
《分骨肉》描述的是探春为了国家安宁奉命远嫁,骨肉分离的悲痛真的让人感动,即使身为贵族千金小姐的探春,也摆脱不了封建制度的残害,失去了青春自由、失去了幸福快乐,真的让人很无奈,同情之。
《聪明累》这首歌曲是里边相对比较欢快的一首,这也与描述对象的人物性格相似,描述的是王熙凤“机关算尽太聪明”,最后却不得不“知天命”的故事情节。听曲子的人,并不会太欢快,而是更多的深思。
《秋窗风雨夕》这首歌曲是我听的最多的,太悲凉了,不得不让人联想到黛玉的悲剧命运,“牵愁照恨动离情”,更是表现了黛玉对宝玉的钟情。让人联想起黛玉爱哭的景象,及他们之间的琐事。表现了他们爱情的悲壮。

虽然这些歌曲听起来太过儿女情长,但却能聆听到青春男女对美好爱情的追求及向往,能体会到他们的爱恨情仇,能感受到人性的一面。

后记:
我可不是无病呻吟,这是选修课音乐欣赏的考试题目,顺手就贴出来了 🙂

time_list结构体学习

在用户态程序编程时,延时常常使用sleep(),我在windows下面写Bat脚本还用过”ping localhost”来延时1秒。再写驱动程序时,sleep就不能直接调用了。这里介绍的time_list结构体可以用户延时处理,不过它的功能远比sleep系统调用强大。

time_list结构体位于内核文件include/linux/timer.h

struct timer_list {
        struct list_head entry; //timer_list结构体链表的头部
        unsigned long expires; //用于存放延时结束时间

        void (*function)(unsigned long); //延时结束时执行的回调函数,注意这里传递一个无符号长整型数字
        unsigned long data;  //常用于存储数据的指针

        struct tvec_base *base;
#ifdef CONFIG_TIMER_STATS
        void *start_site;
        char start_comm[16];
        int start_pid;
#endif
};

这里常用到三个函数init_timer()、add_timer()、del_timer()

/**
* init_timer – 初始化结构体timer.
* @timer: 要被初始化的结构体指针
*
* init_timer() 必须在其他timer相关函数执行前调用,对结构体初始化
*/
void init_timer(struct timer_list *timer)

/**
* add_timer – 添加一个timer结构体
* @timer: 要被添加的结构体的指针
*
* The kernel will do a ->function(->data) callback from the
* timer interrupt at the ->expires point in the future. The
* current time is ‘jiffies’.
*
* The timer’s ->expires, ->function (and if the handler uses it, ->data)
* fields must be set prior calling this function.
*
* Timers with an ->expires field in the past will be executed in the next
* timer tick.
*/
static inline void add_timer(struct timer_list *timer)

/**
* del_timer – 清除一个timer结构体
* @timer: 要被清除的结构体的指针
*
* del_timer() 清除一个活跃/不活跃的timer结构体
*
* 清除一个不活跃的timer结构时返回0,清除一个活跃(延时结束)的timer结构体时返回1。
*/
int del_timer(struct timer_list *timer)

下面是一个简单的测试模块程序,输出递增数字,时间间隔为一秒。

/* include/linux/timer.c:struct timer_list */
/*
 * 建议将模块插入后,使用xconsole查看程序结果
 * print:
 * 		1
 * 		2
 * 		3
 * 		4
 * 		...
 */
#include

#define T HZ/1 //T is 1s

struct timer_list my_timer;

static void my_timer_func(unsigned long p){
	int i=my_timer.data;
	printk("%dn", i);
	my_timer.data = i+1;
	my_timer.expires = jiffies + T; // 延时1s
	add_timer(&my_timer);
}

static int __init my_timer_init(void)
{
	init_timer(&my_timer); //初始化结构体
	my_timer.function = my_timer_func; //初始化回调函数
	my_timer.data = 0; //初始化data字段,这里也可以是一个结构体的指针,从而传递更多的数据
	my_timer.expires = jiffies + T; //延时1s
	add_timer(&my_timer);
	printk("Welcome!n");
	return 0;
}

static void __exit my_timer_cleanup(void)
{
	del_timer(&my_timer); //清除结构体
	printk("Bye!n");
}

module_init(my_timer_init);
module_exit(my_timer_cleanup);

MODULE_LICENSE("GPLv3");
MODULE_AUTHOR("Jianjun Kong ");
MODULE_DESCRIPTION("This is a test program of struct timer_list.n");

随时、随地、随便、随缘

山里有个庙,庙里有俩和尚.
小和尚化缘一大包种子,问老和尚:师傅,什么时候种啊?
老和尚闭眼答到:随时.
小和尚转一圈又回来:师傅,种哪里啊?
老和尚不动声色:随地.
小和尚一会儿慌慌张张跑过来:师傅,鸟乱吃.轰不走.
老和尚微微笑道:随便好了.
过不几天,下场大雨,
小和尚坐不住,看看外面焦急地说:师傅,水把种子都冲跑了.
老和尚继续打坐:随缘.

来年春天,漫山遍野都是鲜花.

「随遇而安」、「顺其自然」。并非「坐以待毙」或「听天由命」,平心静气地接受它的「结果」-不论成功或失败,都以平常心坦然加以接受。做一件事,最有意义的部分在奋斗、努力的过程,求其问心无愧,所以成功和失败都能平心静气接受。
因此「只问耕耘,不问收获」
并不是随波逐流的消极,也不是随随便便的无奈感叹,而是随顺因缘完成本份事的积极态度。

只有不变的人,才可随缘。
以不变之身,随天下之缘。
即所谓:随缘不变,不变随缘。

如果能做到这点,则大自然的回报将是无比丰厚的。

VirtualBox文件共享设置

刚在虚拟机里装了Fedora10,以前使用NAT进行网络设置,虚拟机里只需要dhcp就行了。网络设置成功,就可以使用scp在主机和虚拟主机之间传送文件,以前是做了n多的alias,使用起来还算方便,不过文件较大时就麻烦了。

于是考虑使用VirtualBox自带的文件共享。记得梅研涛以前虚拟了一个Windows,用鼠标直接把文件夹拖动到Windows桌面就共享了,这次我安装的Fedora,只使用命令行。

1.为虚拟主机安装VBoxGuestAdditions,这样才能支持文件夹共享。
1) 安装完Fedora后,启动虚拟主机,在主机窗口菜单,Device -> install guest additions,点击弹出一个窗口,上面显示VBoxGuestAdditions的镜像URL,并下载。当然也可以自己从网上下载安装镜像。
2) Devices -> mount cdrom –>cdrom image 然后选择下载到外边主机的 VBoxGuestAddition.iso
3) 在虚拟主机里面mount  /dev/cdrom /mnt/cdrom
4) 进入/mnt/cdrom目录,输入# sh VBoxLinuxAdditions.run,安装程序。
5)关机,执行完下面的共享文件夹设置。等下次启动vboxsf模块会自动加载加载到虚拟主机。

2.设置共享文件夹
1) 点击Settings-> Shared Folders
2) 点击旁边按钮添加Host中的共享文件夹(例如 /home/kongove/code/kernel ),可以在这里设置访问权限。
3) 启动虚拟主机,在下建立共享文件夹(例如 /root/kernel)
4) # mount -t vboxsf kernel /root/kernel 挂在共享文件夹

以后使用只需执行最后的mount语句即可。这样用起来很方便,就跟在一个系统一样。