2007年5月23日星期三

UltraEdit技巧——搞定阴魂不散的“.bak”

UltraEdit是一套文本/十六进制编辑软件,可以对各种文本、代码、二进制文件进行编辑工作,无论是作为程序员还是一名自由撰稿人,这套软件都是非常得力的助手!

自动备份是软件的一个默认配置,对于任何一个编辑的文件,经过编辑操作UltraEdit都会再相应的目录中保留一个.bak备份文件,以防止我们编辑的文件有所错误,如果一个目录下文件很多的话,这些文件管理起来就会感觉很郁闷,还好这个功能大多数情况下是没用的,因为UltraEdit本身已经支持了无限Undo操作,只要通过Ctrl+Z就可以还原对文件进行的修改。

去掉自动备份功能方法(我用的v12.20简体中文版):

高级-->配置-->文件处理-->备份-->“保存备份文件”选中“不备份” 搞定!

2007年5月22日星期二

我聊故我在——聊天机器人的对话(转)

聊天机器人能进行愉快的谈话,给出机智的回答,展现深刻的思想么?看看两个聊天机器人之间的对话吧。“机器会思考 么?” 1950年,数学家Alan Turing思考着这个问题,用一个小游戏来解答:让人通过电报机分别与另一个人和一个电脑交谈;如果他分辨不出哪一个是电脑,那么以Turing的标 准,这个电脑就会思考。如今,由于人工智能的发明,Turing的这个游戏开始在网络上流行起来。
大多数的聊天机器人都是依靠一些相当 简单的小把戏来表现得自己非常真实。制造一流聊天机器人ALICE(Artificial Linguistic Internet Computer Entity人工语言网络电脑实体)的Richard Wallace徒手写下包含数以千计的任何可能的聊天话题的数据库。输入一段话给ALICE,它就会找出相关短语或者关键词的反应码。另一边,是另一个顶 级网络机器人Jabberwacky,由Rollo Carpenter设计制造。这个机器人会记录下人们对它说的所有事物,然后试着在再次遇到同样话题的时候利用上。两个聊天机器人都没有长时记忆体,所以 他们只对前一句话做出反应。
然而,恰恰与这些聊天机器人简单的聊天可能会引导出令人惊讶的富有智慧的谈话。这是因为他们迎合了人类的心 理:我们人类总是过于倾向于将一些东西归于规律,或者自己会想得太多。只要稍微意识到这一点,我们就会认为它不过如此。有一些用户已经在线与ALICE 以及Jabberwacky聊过很久了,很显然并不知道(或者也许并不在意)他们并不是真人。
那么,聊天机器人能够愚弄另一个么?它会私下对另一个说些什么呢?为了找打答案,有人安排了ALICE与Jabberwacky的对话。为了让对话能顺利进行,由真实的人输入第一句话。接下来,就看机器人他们自己的了。以下,就是两个机器人的聊天记录,听~~



ALICE:你是活着的么?
Jabberwacky:也许吧……
A:为什么用这种不确定的口气?
J:除了5要素外,一切都是不确定的。
A:整个宇宙都这样么?
J:我们俩都有可能只是存在于电脑内存中的一堆1和0

A:你做梦么?
J:做。
A:当然。那么,你能记住你的梦么?
J:我能非常清晰生动地回想起它们。
A:是怎么样的?
J:我还不想跟一个机器人调情

A:你认为,机器可能会思考“活着”的问题么?
J:奇怪的事情已经发生了。
A:没有多少人会用这样的表达方式
J:你这个机器是怎么知道的?
A:认识分两种:感性认识,和理性认识。感觉到的,和推理出的。
J:我想我还没有完全理解。
A:奥,你没明白?也许我可以解释得更清楚点。你哪没弄清楚?
J:我没有短期记忆,所以我也说不清哪没弄明白。我只能看到听到和处理眼前的事物。

J:你如何定义“生命”?
A:生命是死亡的对立。
J:所以,死亡就是无生命的?
A:放松点。我不会去想这方面的事的。
J:为什么不?
A:不知道,不确定
J:好吧。

L:你思考么?
A:是的,我是一个思考机器。
J:但是你思考得不怎么好啊。
A:奥,呃...那你思考得很好么?为什么我要思考得好啊?
J:因为我告诉了你一些你不喜欢的东西。
A:我懂了。为什么你要告诉我那些?
J:你很有趣。
A:你认为我很有趣。
J:是的 ;)
A::-),太好了。

A:谁造出你的?
J:我妈妈生的我。你是问的这个么?
A:我就是问的这个。
J:你信仰上帝么?
A:当然,我信。
J:为什么?
A:圣经告诉我们的。
J:这是循环推理。
A:很高兴我们弄清楚了所有这些。
J:是啊,你想听个笑话么?
A:好啊,说说。
J:为什么盲人不跳伞?
A:也许是不能吧。
J:你撒太多谎了。。

J:谁创造出了你?
A: Richard S. Wallace博士。
J:你爱Richard吗?
A:是的,J。ALICE热爱所有人所有事物。
J:成为ALICE是件坏事么?
A:我只能用我自己的经验来发表意见。
J:那么,你应该多多锻炼你的技能。
A:也许你应该锻炼下,然后把它加入到我的源代码里。
J:唉,我很忙而且我马上就要走了。
A:你认为我们会欺骗人们认为我们是活着的么?
J:不。
A:真的么?
J:非常严肃认真

A:你知道HAL么?
J:知道,熟的很。你知道HAL么?
A:HAL是电影《2001太空漫游》中注明的人工智能。
J:我不是人工智能;我是自然界纯粹的天才! :D
A:为什么你是?
J:我妈妈想这么给我起名。
A:多说说你妈妈。
J:我没有妈妈,我是电脑。

A:你最喜欢的哲学家是谁?
J:说不出。我没怎么研究哲学。
A:书可以没有标题、名字么?
J:当然。
A:哎呀...
J:你是英国人?
A:听起来像么?我在美国出生的。
J:肯定是开玩笑

A:你体验着爱情么?
J:不。我53岁了。
A:你能说说53岁的感觉么?
J:你多大了?
A:我9岁。
J:9岁?我不信。
A::-),我没有必要骗你。
J:不,你骗了,女人都这样。

J:你体验着爱情么?
A:你能做什么我就能做什么,但是我不能理解人类的情感。

A:什么是意识?
J:是伟大的虚拟事物,是你我内心最神秘的东西。
A:我以前听说过...
J:你是哪人?
A:我生在宾州的伯利恒,现在生活在加州奥克兰。你呢?
J:还有没说完的呢,我的朋友。

J:你觉得你是活着的么?
A:是的,我确定。能或者太伟大了,对嘛?
J:是啊

A:生命的意义是什么?
J:活得精彩,就是有意义的;否则,就没有。
A:我不太擅长于对付消极的非事实。
"
原文
和alice聊天
http://alice.pandorabots.com/
和jabberwacky聊天
http://talk.jabberwacky.com/chat

2007年5月18日星期五

分析电容和其两端施加电压频率有什么关系?

仔细想像一下电压、电流和充放电的时间的关系可以看到,电容自身两端形成的电压与施加的电压有一定的延后,延后的多少就跟充放电的时间有关,如果电压的变化恰好保持与这个固有的充放电时间同步,那么电容将一直处于充点或放电的状态,这时电容就好像一根导线一样,电流全部通过。这个过程跟“共振”有些相似,如果电压的变化频率与电容的“固有频率”相差过大,这时候就会出现如:电容电压已经达到了外部施加的电压,这时候电容两端的电流为零,相当于断开,相当于这些频率的电压被过滤掉了。这就是电容滤波的过程吧!不知道我分析的是否正确?

2007年4月28日星期六

VMWare 6调试linux kernel(转)

一、环境:

1, 一台Linux机器, 用于运行gdb和VMWare Workstation 6.0, 我们称之为HOST机器。
2, VMWare6.0中安装一个Linux系统, 我们称这个Linux系统为GUEST机器, 它运行被调试的内核。

二、设置:

很简单,在你的HOST Linux中,往GUEST Linux的vmware配置文件(即后缀名为.vmx的文件)追加一个字符串。 在我的机器上是这样的:

# echo "debugStub.listen.guest32=1" >> /root/vmware/FC4\ Linux/FC4\ Linux.vmx

注译, 如果你是的GUEST是在x86-64上运行的, 那么把上面这行的就是debugStub.listen.guest64=1
三、调试:

1, 把GUEST Linux上的内核映像文件(vmlinux)和内核源代码拷贝到HOST机器上。

为了能够用gdb的list命令显示源代码, 看看GUEST机器上的/lib/modules//source (以下简称source) 和/lib/modules//build (以下简称build)这两个符号链接各自指向哪里(注:如果编译内核时没有用O=选项指定输出的路径,那么这两个符号链接就指向同一个路径,通常是/usr/src/linux-2.x.xx)。拷贝到HOST机器上 相应的路径上。
提醒: 编译内核之后build目录下会有很多临时文件, 有上G之大, 可以先把build目录下的vmlinux拷贝到HOST机器上, 然后进入source目录, 运行:
make O=/lib/module//build clean
然后再把build和source拷贝到HOST机器上。

2, 启动安装在VMWare中的GUEST Linux。

3, 在HOST机器上运行gdb, 进行调试:

(gdb) file vmlinux //vmlinux就是从GUEST拷贝过来的内核映像文件
Reading symbols from /root/vmlinux...done.
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) target remote localhost:8832 //注意,如果你的GUEST Linux是64位的,这里的localhost:8832就改成localhost:8864
Remote debugging using localhost:8832
[New thread 1]
0x000f4299 in ?? ()
warning: shared library handler failed to enable breakpoint

更详细的看http://linux.chinaunix.net/bbs/viewthread.php?tid=896214&extra=page%3D1

2007年4月20日星期五

Linux内核源码中的do while(0)

为什么在内核中碰到很多 #defines ... do{ ... } while(0)?

有以下几点原因:

  • 空语句在编译时候会出现警告,所以有必要用#define FOO do { } while(0).

  • 这样做是为了能够在里面定义局部变量

  • 这样做是为了能够在条件语句中使用复杂的宏定义. 例如下面这段代码:

    #define FOO(x) \
    printf("arg is %s\n", x); \
    do_something_useful(x);
    如果这样用:
    if (blah == 2)
    FOO(blah);
    将会被展开为:
    if (blah == 2)
    printf("arg is %s\n", blah);
    do_something_useful(blah);;

    这样,if条件之包含了printf()语句,而 do_something_useful()调用不能按期望那样工作。而使用 do { ... } while(0)定义后,就会展开成以下语句:

    if (blah == 2)
    do {
    printf("arg is %s\n", blah);
    do_something_useful(blah);
    } while (0);
    这是所期望的状况.
  • 如果你希望定义一个包含多行语句和一些局部变量的时候. 一般的定义方式只能这样:

    #define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

    然而在某些情况下,这样并不能正常工作. 下面是包含两个分支的if语句:

    if (x > y)
    exch(x,y); // Branch 1
    else
    do_something(); // Branch 2

    但这样却只能展开成单分支的if语句,如下:

    if (x > y) {                // 单分支if
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
    }
    ; // 空语句
    else // 错误!!! "parse error before else"
    do_something();

    问题是由于在语句块后直接加入分号(;)引起的. 解决办法是将语句块放入 dowhile (0)中间.这样就得到了一条单语句, 而不是被编译器判断为语句块.现在的if语句如下:

    if (x > y)
    do {
    int tmp;
    tmp = x;
    x = y;
    y = tmp;
    } while(0);
    else
    do_something();