2007年04月存档 - 李凡希的Blog

在Google Talk中显示foobar 2000正在播放的音乐

  Goole Talk不支持显示foobar 2000正在播放的音乐的功能,而只支持Windows Media Player和WinAMP等几种播放软件。幸好foobar的插件是如此的丰富,总能找到一个可能的解决方案。

  解决方案一:

  使用AMIP插件,这是一个功能强的插件,通常foobar支持Live Messenger的"Now Playing"功能也是用这个插件。下载安装这个插件后,还需要下载安装它的一个配置工具,只有用那个配置工具才可以方便的打开它的GTalk的支持。不过这个插件的实现原理是直接去操作GTalk的界面,相当于是把曲目信息自动输入到GTalk的个人签名栏中,所以并不能完美的实现"Now Playing"的功能。这个插件适合已经使用它为Live Messager显示"Now Playing"功能的用户。

  既然主动告诉GTalk曲目信息不是那么完美的解决方案,那就只让GTalk自己来找曲目信息才完美了,可以GTalk不认识foobar啊,最简单的解决方案就是让foobar“冒充”WinAmp,这就是解决方案二。

  解决方案二:

  下载安装foo_winamp_spam插件。在注册表中添加:


Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Winamp]
@="d:\\Program Files\\Foobar2000"

  其中的路径就是你的foobar 2000的安装目录,同时在这个目录下建一个名字为winamp.m3u的空文件。

  启动foobar试一下吧,曲名是不是已经可以显示在GTalk中了?

装了一下Ubuntu 7.04

  一直听说Ubuntu是一个很好用的Linux发行版,但没有机会去体验,如今7.04新版发布,打算装一下试试。没想到Ubuntu用光盘启动很好用很好装,想用硬盘上的ISO来安装就没有这样简单了。

  对于Red Hat之类的发行版来说,把ISO文件放在硬盘上然后通过硬盘安装是非常简单的,总的来说,只要把安装光盘的镜象放在硬盘某个分区的根目录中,并把光盘中isolinux目录下的vmlinuz和initrd文件拿出来,用grub之类(DOS/Windows下可以用WinGrub)的引导程序进行引导就可以了。

  拿到了Ubuntu 7.04 LiveCD的iso,首先遇到的难题就是它的isolinux目录下根本没有我们需要的内核文件,后来找到了在capser目录下,可是拿出来以后按Red Hat的方法并不能正确的安装。幸好有搜索引擎帮忙,查到了不少的资料,总结在这里。

  1.使用Alternate镜象

  从官方下载alternate版的镜象文件,不能用我们常用的desktop版的镜象(也就是Live CD)。并从http://archive.ubuntu.com/ubuntu/dists/feisty/main/中选择合适的目录(对于大多数人来说应该是在http://archive.ubuntu.com/ubuntu/dists/feisty/main/installer-i386/current/images/hd-media/)中下载启动用的内核文件(vmlinuz和initrd.img,或者打包后的boot.img.gz),再用与Red Hat相似的办法来安装。

  这个方法显然不适合我:(,这样做的话我下载的Live CD就派不出用场了,得重新下载近700M的镜象,不划算,所以还得找其它的方法。

  2.用修改过的启动内核

  终于从Ubuntu中文论坛上找到了从Live CD镜象安装的方法,对应的贴子地址是:http://forum.ubuntu.org.cn/about26167.html。具体的作法是:

  下载Live CD硬盘引导包http://ftp.ubuntu.org.cn/gnix_oag/boot_livecd_from_hd/feisty/bhd_i386_2.6.20-15g-ntfs-aufs.tar.gz,用户名密码是ubuntu和ubuntuftp。解包后的boot/feisty中有我们需要的启动内核文件。

  然后在任意盘的根目录中建一个名为feisty的文件夹,把下载的Ubuntu的Live CD镜象文件放在里面。

  有了内核文件,也放好了iso,下面就很简单了,跟装Red Hat类似,在grub中用下面的参数来引导系统就可以了(vmlinuz和initrd.gz按你实际文件所在位置要做相应的修改):

  kernel (hd0,0)/boot/feisty/vmlinuz boot=gnix_oag ramdisk_size=1048576 root=/dev/ram rw quiet splash
         debian-installer/locale=zh_CN fd_dir=feisty
  initrd (hd0,0)/boot/feisty/initrd.gz

  经过这样的步骤,Ubuntu的Live CD就顺利启动起来,启动完了你就可以直接使用了,如果要安装,只需在Live CD的桌面上点击“安装”就可以了。如果你的机器上有Windows,安装程序会检测出来,并提供一个向导来帮助迁移数据。

  简单使用了一下,感觉确实是很好用的,可用性比FC强了不少。Live CD自带的软件不多,只能满足最基本的上网和办公的功能。但是安装软件真是太简单了,可以说是比Windows还方便,根本不用自己到处找,你只要知道所需要的软件的名字,然后打开终端,运行一下sudo apt-get install 软件名,回车后一切就等系统帮你搞定了。

  强烈推荐对Linux有兴趣但又有点望而生畏的朋友体验一下Ubuntu,不要被我上面的文字吓坏了,非要用iso文件从硬盘安装是我自讨苦吃了。你要做的只是下载Ubuntu的安装镜象,刻录成光盘,或者直接申请领取免费的安装光盘,用光盘引导电脑后就可以直接使用了。这样的直接使用是不会影响你电脑中原来的数据的,一切都只存在光盘和内存中。如果这样试用让你对它产生了兴趣,你可以把它安装到硬盘上,安装也是很简单的,只要看清了硬盘分区情况,小心不要把有用的数据删除了就行了。

What is free software?

  盖茨访华,虽然已经是第十次,但还是一件挺吸引眼球的事情。而就在今天,当微软遭遇开源抗议,事情就变得更吸引眼球了。

  中午从看到这条消息,第一反应是又是哪位开源斗士开始发奋图强了,不会是Bill Xu继《致招商银行的公开信》活动后又一重大举措吧,新闻里照片上的人物并不清晰,不过看起来不像是Bill,倒像是另外一位我才认识不久的人。

  下午的消息很快证实了我的猜想,这位勇士就是LPI中国首席代表——王开源

  认识王开源还算是个巧合,月初参加CSDN英雄会时在会议结束去微软研发集团参观的车上遇到他。给人的第一印象是相当的热情,所以一路上也跟他聊了不少有关开源的话题。他打趣的说,一会儿到了微软,他要把名片发遍每一角落,在微软宣传开源的理念。

  

我和王开源在微软中国研发中心的照片,王开源把这张照片命名为“开源人士在微软”
我和王开源在微软中国研发中心的照片,王开源把这张照片命名为“开源人士在微软”

  参观完微软,晚上与中科院自由软件协会的负责人之一于仕琪聊天,谈到王开源,他说是在协会组织的Ubuntu Edgy Eft北京发布会上见过面。说王开源在那次发布会上跳上讲台,涛涛不绝讲了N久开源的理念。

  所以,当今天的消息确认是他在盖茨演讲会现场高呼“Free Software, Open Source”,也就觉得并不是那么惊讶了。

  从去年的《致招商银行的公开信》到这次的"搅局"微软创新活动会议,在中国,我们越来越多的听到自由软件声音,这是一件好事。但是事件的背后,却也带来了很多的争议。在Web 2.0时代,两次事件无一例外的通过互联网迅速到传到每个人的耳边,同时,大众对事件的看法也很快在互连网上散播开来。

  一些人支持这样的活动,因为这样的活动有助于自由软件理念在国内的传播,在平淡的生活中,需要一些刺激的事件来吸引大众的目光;一些人支持自由软件事业,但不支持这样的过激行为,因为它们会给人们留下开源就是偏激的印象;更多的人也许并不知道自由、免费和开源这三个词语的意义和区别,用自己的体会去理解这样的事情,评价自然是负面的居多。

  开源是一种行为,指的就是把软件的源代码开放,但是开放源代码也有很多的形式,简单的说,不同的开源协议决定了开源形式的不同。协议可以有很多种,可以是GPL、LGPL、FreeBSD、Apache这类广泛使用的协议,也可以是你自己定义的协议,它们的共同点在于规定了把源代码公开这样行为,但具体的在拿到源代码之后用户可以做的事情是范围,各种协议的规定是不尽相同的。比如,如果使用GPL协议,则意味着从开源代码上产生的任何衍生产品都需要以GPL协议开源。而FreeBSD的协议则没有这样的严格。

  免费,这个词也许就是从Free Software或freeware中翻译而来。也是大部分人对自由软件的最初认识。如果说freeware可以认为是免费软件的话,把Free Software翻译成免费软件就是大错特错了。

  Free Software,正确的翻译应该是自由软件。我的Blog标题借用了GNU网站标题上的一句话:Free as in Freedom (GNU网站中文翻译成"自由自在",虽然意义已经完全变了,不过我觉得意境倒是差不多,挺欣赏这个翻译的)。Free Software中的Free应该是Freedom中的Free,也就是自由。自由软件含义不在于是免费还是收费,它的含义是在于保证使用软件的每一个都享有同等自由的权利。你可以任意的使用、修改、分发自由软件,你唯一"不自由"的地方就是你必须保证这个软件的其它用户享有与你一样的自由的权利。自由软件没有规定收费与否,但由于规定了权利的对等,所以即使你收费了,别人一样可以收费或不收费的分发你的软件,所以软件免费而服务收费已经成为现在自由软件的主要商业模式。值得注意的是自由与版权的关系,在GNU,Copyleft(中文没有标准翻译,我觉得翻译成"著左权"或"对称版权"比较好)这个词形象的表明了对版权的认识。自由不是放弃版权,而是在保留版权的前提下提供他人自由。

  FSF的GNU作为自由软件的最主要的倡导者,已经成为自由软件的标准。GPL也是使用最为广泛的开源协议之一。Richard Stallman是自由软件运动中教父级的人物。在他们的眼中自由软件的意义已经超出了软件的含义,更多的是成为了一种信仰。

  自从我去年真正接触到自由软件以来,它也已经成为我日常生活中不可却少的一部分。但是我就个人而言,自由软件更多的是一种理想,而不是信仰。我不喜欢Richard Stallman的带有宗教气息的自由软件运动,同样也不赞同以过激的方式来宣传自由软件的理念。自由软件中所折射出的黑客(注意区分这个词与"骇客"的区别,在此不赘述了)的精神和崇尚自由的理念才是吸引我的地方。对于"坚决支持自由软件,说服教育开源软件,打击报复专有软件"这种所谓"自由软件人士应有的态度"我实在不敢苟同,就像自由软件精神所倡导的那样,人人应该享有自由,自然也应该允许他人拥有选择专有软件的自由。也许自由软件需要一些领袖型的主导人物、革命家,但是过激和盲目的宣传自由的理念实在不是值得鼓励的方式。

Google Apps与撞墙

  没事打开Gmail的设置,想挖挖看有没有实用的功能没有发现,Gmail没发现什么新鲜的配置,却看到了Google Apps服务。以前就听说过Google Apps服务,不过那时自己没有域名也就没有具体去关注过它,如今有了自己域名倒是可以尝试一下。

  虽然是Gmail页面上提示我的尝试这个服务,但注册倒是并没有那么顺利。不管我怎么填写注册信息,总是提示我"你所在的地区没有开通这项服务"。还好这样的问题相信不会是我一个人遇到,搜索了一下,很快就找到了解决的方案

  Google Apps提供的主要服务就是在你自己的域名下提供简单的网页、邮件、聊天、日历、文档与表格处理的功能。其实也没有什么新奇的东西,只是Google几个常见应用的整合。既然已经注册了,也就不管什么新不新奇了,一项项的开通吧。先是验证域名,然后就是一堆设置啦。嗯,以前一直不懂什么DNS的A记录啊C记录啊MX记录什么的,这次一折腾就全都明白了,原来一点也不深奥。开开心心辛辛苦苦改了一通域名的CNAME解析设置(C记录就是把*.yourdomain.com解析到另一个域名上,而A记录就是指解析到IP上), 激活了docs.freemindworld.com/mail.freemindworld.com/calendar.freemindworld.com/start.freemindworld.com 这些服务。然后又改了DNS的MX解析(用于SMTP给你的@ yourdomain.com邮箱发邮件时查找你的接收邮件服务器),把邮件指向Google的邮件服务。Google的Wizard做的还不错,可以提供很多国外域名注册商的操作步骤,我的域名是在Yahoo!注册的,Google也提供了准确的设置方法。

  一切大功告成,就待享用了……咦?为什么一个都不能访问?嗯,大概是DNS的解析更新没有么快。nslookup一下,果然是还没有更新过来。那就等吧……

  CNAME的更新还是很快的,不多久就可以nslookup到正确的解析结果了,可是还是不能访问上面列的那些网址。无奈中tracert了一下,看看结果,心里明白了一半,再上网一搜,终于确认:我撞墙了。如果你不知道什么是"撞墙",就请点击前面的链接通过Google.com寻找答案。不要试图用Google.cn或Baidu来查找它的含义,这个词在它们身上已经被"拨毛"了。

  心中颇为遗憾,但也实在无可奈何,怏怏的把改了半天的CNAME记录一个个复原,看来是只能用Google直接提供的长长的URL来访问这些服务了。不过不幸中还是有万幸,那就是最有用的邮件功能(在免费邮箱满天飞的时代,这个功能其实也没有多少吸引力了)还是可以正常工作的。我的Google Apps帐号可以开通一百个@freemindworld.com的邮箱,每个大小2G,嗯,先给自己开一个 webmaster@freemindworld.com用用,自我感觉良好一下:-) 这个服务放在国内那些服务商里可又是要花一大笔银子才可以得到的。

  体验了Google Apps,虽然不是很顺利,不过倒又让我想起了Microsoft类似的Live Custom Domains的服务,赶紧也去体验一下。可惜居然第一步就是要求把mx记录全部指向Live Mail。虽然我是最早一批试用Live Mail的,不过对它的印象并不好,它跟Gmail相比差距实在是有点大,于是乎就Byebye了Live Custom Domains.

  作为变通,其实C记录不指向Google也一样可以用它的服务,只是地址栏显示的ugly一点,这可以通过在自己的虚拟主机网页空间中用程序对来访的域名进行解析和重定向。不过这个需要改动与虚拟主机所绑定的域名列表,我的主机的配置页面好像有点故障,明天再试着解决一下。

小函数,大问题

  对于strcpy,sprintf,strcat这些不安全的函数的讨论应该算是不少了,大家都知道可以用strncpy,snprintf和strncat来替换它们。但实际工作中似乎这些“安全版”的函数带来的疑惑还是不小,总结了一下,列在这里。

  1.sprintf(char * str, const char * format, ...) -> snprintf(char * str, size_t size, const char * format, ...)

   vsprintf(char * str, const char * format, va_list ap) -> vsnprintf(char * str, size_t size, const char * format, va_list ap)

  按照C/C++标准,snprintf和vsnprintf永远不会往str中输出多于size所指定的字节数的字符(包括结尾的'\0'),它们也保证了一定会在str中写入'\0',所以在使用这个函数后不用担心结尾的问题。

  举例:

  char buf[5];
  snprintf(buf, 5, "This is a test string."); // buf becomes "This", buf[4] is '\0'
  snprintf(buf, 6, "This is a test string."); // ERROR: buffer overflow
  snprintf(buf, 5, "abc"); // buf becomes "abc", the value of buf[3] is '\0', buf[4] is undefined.
  然而,VC中的_snprintf函数并没有按照这样的规定来做,它在输出缓冲区不够大时就不会输出结尾的'\0'(跟strncpy的行为类似)。所以要让上面的程序工作正常,必须做相应的修改。
  char buf[5];
  _snprintf(buf, 5, "This is a test string.");// buf becomes "This ", buf[4] is ' '
  buf[4] = 0;                                 // buf[4] is '\0' now.
  _snprintf(buf, 6, "This is a test string."); // ERROR: buffer overflow
  _snprintf(buf, 5, "abc"); // buf becomes "abc", the value of buf[3] is '\0', buf[4] is undefined.
  如果要保证可移植性,就得按VC的写法,做一次对于标准来说很多余的“填0”的操作,再通过定义宏来区别平台分别选用snprintf或_snprintf。

  2. strcat(char * dest, const char * src) -> strncat(char * dest, const char * src, size_t n);

  这个函数比较简单,它保证不会写入多于n+1个字符,并且保证最后一定以'\0'结束。

  举例:

  char dest[5] = "abc";
  strncat(dest, "defghijklmn", 5 - 3 - 1); // dest becomes "abcd", dest[4] is '\0',
                                           // always minus the buffer length by 1 as the value of n.
  strncat(dest, "defghijklmn", 5 - 3); // ERROR: buffer overflow

  3. strcpy(char * dest, const char * src) -> strncpy(char * dest, const char * src, size_t n);

  strncpy是一个比较容易出错的函数,它保证复制src中不多于n字节的内容,但是如果src的前n个字节中没有包含'\0',就会导致dest没有正常的以'\0'终止。另外,它还保证如果src的长度小于n,则dest剩余的部分都会以'\0'填充。在用这个函数时,有一个最佳实践就是先把dest以0填充,并传入dest的长度减1的值作为n,这样可以确保安全。

  举例:

  char buf[5] = {0}; // Always zero-fill the buffer,
                     // always use this form to initialize the stack arrays to get
                     //better performance over memset.
  char * buf2 = new char[5];
  memset(buf2, 0, 5); // Always zero-fill the buffer
  strncpy(buf, "abcde", 5); // ERROR: buf is not null-terminated.
  strncpy(buf2, "abcde", 5 - 1); // Right, always minus the buffer length by 1
                                 //as the value of n. buf becomes "abcd", buf[4]
                                 //is '\0' by initilization;
  // This is a common error in the existing code.
  char buf3[5];
  const char * str = "Test";
  strncpy(buf3, str, strlen(str));  // Wrong, buf may not null-terminated,
                                    // potential buffer-overflow
  strncpy(buf3, str, strlen(str)+1);  // Wrong, potential buffer-overflow.
                                      //No difference with using strcpy.

CSDN技术英雄会流水帐

  6号一大早到达北京,驾轻就熟的到达知春路,很快就找到了会议地点。人还不是很多,但由于邀请函事件的后遗症,为了进入会场还是花了一些周折,幸好有CSDN社区中心的葛涵涛的帮忙,才没有留下一些小小的遗憾。会场的布置相当的温馨,也不乏“英雄会”之大气,只是场地实在是不够宽畅,在差不多一半座位被英雄、专家和嘉宾占据的情况下,留给我等普通网友的参会机会确实是不多了。

  开场的表演没有什么特别的,倒是成了小公司推销自己的绝佳时刻,只见数人在座位间穿梭,不断散发着自己的名片。总裁致辞后的英雄颁奖仪式应该是这次大会的一个亮点,不过似乎也并不是那么的激动人心,跟“感动中国”比起来还是有不小的差距,呵呵。我觉得社区的英雄也是在用他们最平凡的方式帮助着技术社区的中每一个人,他们的精神也是很值得让人感动的。

  颁奖完了,英雄们也就被搁一边了,开始的是七个主题演讲。会议嘛,总是要给支持厂商一些宣传的机会,CSDN的技术大会自然也不能免俗。IBM的软件与创新思维演讲一边介绍着历史上极具创新思维的图灵奖获奖大师们一边“炫耀”着他们与IBM密不可分的关系,在心潮澎湃的听完这些大师的介绍后,微软的研发战略发展主题则比较务实的谈到了一些技术发展的趋势和值得关注的领域。点击科技的王志东给出的演讲也是让人很有收获,Web 2.0和长尾理论的结合与介绍深入浅出,对于我这种只懂技术的人来说,还是有很多启发的价值在里面。BEA和微软VSTS的讲座没有给我留下很深的印象,我不得不承认,火车坐卧铺也还是有点累的……接下来是F5的主题演讲让我第一次知道了这个如此重要的公司,但除此之外我没有听到更多有价值的东西,不知道他们的技术对于我这几天在折腾的公司的Solution Contest的题目是不是有一些参考的价值。连续三个不是那么吸引人的主题之后,空空的肚子开始有点抗议,但Google谷雪梅女士的主题马上就让人提起了精神,不长的演讲带领大家一起见识了Google在高性能和高可用性上的成就,用户每一次对Google的搜索请求,后台都会有一千台以上的电脑为他服务,这么多的电脑,组织的是如此的有条不紊又极具效率,实在很让人佩服。

  下午的两个专题论坛比想象中的效果要好。虽然很多人不喜欢他,但在创业论坛中,奇虎的周鸿祎应该给在座的很多人的留下了深刻的印象,耍耍贫嘴、明嘲暗讽,虽然不见得有多少深度,不过对活跃论坛气氛还有相当有贡献。鲍岳桥可谓这个论坛中的前辈了,话虽不多,但掷掷有声也让人很受启发,相对来说PPStream的张洪禹就显得年轻了许多,以至于周鸿祎拿PPStream涉及的版权上的问开玩笑说事时,他急不可耐的为自己的产品开脱起来。孙辉老师不亏为数学老师,思维缜密却没法让别人理解他所讲的东西,他的Tangram项目似乎有很大的野心却让人觉得没有合适的切入点。

  相对创业论坛的热闹景象,CTO论坛显得要稳重的多,这个论坛围绕作为CTO如何同时经营技术和管理这两面性展开话题,也对在管理开发团队中遇到的一些问题进行了讨论。论坛的时间不是很长,但还是“拖堂”了,以至于取消了茶歇的时间。

  最后的三个主题演讲的内容也还算充实,年轻的工程师王咏刚的Google的开源策略与Linux产品研发演讲再次调动了大家对Google技术的兴趣,也让大家更加见识到开源的力量。JavaEE without AJAX是一个有点吸引眼球的主题,主要的内容是介绍了JSF框架的一些基本情况,感觉还不错。

  会议进行过程中场外也有一些活动,主要是技术书籍作者的签名赠书和一些厂商的职位宣传。我得了一本《深入浅出Oracle DBA入门、进阶与诊断实例》,希望能从中有所收获。

  会议开完了,谈收获还是有不少的,不管是上午的主题演讲,还是下午的论坛,都有很多值得学习的经验和想法。但会议也有很多不尽如人意的地方。首先就是活动的安排不是那么的周密,且不说流金岁月征文活动偷偷下架,给网友确认参会后又反悔的做法实在是让人大跌眼镜。另外就是在整个活动中把英雄专家们与网友进行隔离,缺乏一个广泛沟通与交流的机会,其实有上半小时、一小时的大家坐在一起的自由交流时间就会很好。会议的一些小细节问题上也没有处理周到,如果说会议议程临时变动还可以让人接受的话,议程变动尤其是上台嘉宾名单发生变化而PPT不作相应的更新实在有点说不过去,幸好鲍岳桥老师不会像我这样小鸡肚肠。

  会议结束后去微软中国研发集团参观,以前都是从希格玛大厦的门前过,这次是第一次走进这个似乎有些神秘的地方,如果放在一两年前,可能还会有点激动,放在现在就更多的是平静了。先是领取了小礼物,是微软研发集团成立一周年的记念邮票,然后就是在小会议厅进行微软新技术的一些演示,一开始的几个还有点意思,后面的一些就有点凑数的嫌疑了,或者至少说是没有特别让人激动人心。参观微软的办公区域感觉环境是相当不错的,工作空间比较大,不过格子间的隔断似乎有点高,不知道是不是会影响到交流。办公区看到有两台XBox,Break Room中环境也很好,很多水果比较诱人。

  流水帐完了,不多说废话了,上两张pp结束。

  

CSDN英雄签名牌
CSDN英雄签名牌
  
微软的办公区
微软的办公区

琐事小记

  最近一点小碎事,记于此:

  1. 明天出发去北京,参加6号的CSDN的七周年技术英雄会,车票、邀请函等事颇有不顺,不过希望这次行程最终可以比较顺利。

  2. 明天参与网站裸奔CSS Naked Day '07活动,即时起去除本网站的CSS,看看纯正的XHTML做出来的网站是什么味道。这个活动的意义在于展现W3C标准网页制作的重要性。一个标准的网站,在除去CSS后应该仍然可以比较正常的表现它的内容。虽然活动只要求持续一天,不过因为周末我没时间更新,就持续到周一吧。今天又小改了一下Blog的布局,不过没有CSS也不明显啦。另外,下一步一定要把RSS加上,没有RSS的Blog还叫Blog吗?

  3. 寄人篱下感觉总不是太好,fx.jiuzhe.com这个二级域名用了三个月,感觉还是自己搞个域名玩玩比较有意思,于是就买了一个新的域名,www.freemindworld.com。在选名字这类需要创意的问题上,我总是不很在行,尤其在好名字都被挑光的情况下就更是如此。Free是我一定要选的一个词,因为现在Freedom是我的一个理念。Mind是希望我可以更多的放飞我的思维,不要局限在小空间中。加上World是无奈之举,实在是两个词域名很难找到好的了。本来想用Zone,但后来决定用World,MS可以大气一点,呵呵。记得N年前根据电脑报上文章的引导还曾经用自己的名字的拼音申请过域名,文章说了是免费申请,但没提到是要收年费的,所以在被催收了两次年费未交的情况下,那个域名早已经被注销了。用自己的名字申请域名现在来看不是很Make sense,所以自己先否决了这个选择。

  4. 今天被美国的夏时制折腾了一把,在夏时制的情况下,产品的一些功能会受到影响,夏时制这些以前看来与自己毫无关系的东西,在做产品时却遇到了,学无止境!

Emacs入门教程(4)

  Eamcs只能完成跟Notepad一样的功能吗?答案显然是否定的,今天我们一起来看看Emacs中的Buffer和Window是怎么用的。

  首先还是现来了解一下什么是Emacs中的缓冲区(Buffer)和窗口(Window)。

  Buffer:在Emacs中编辑的每个一文档,或每一个信息存放的空间都构成一个Buffer。

  Window:在一个Emacs运行时的界面(一个Frame)中,可以划分成多个隔开的区域,每一个区域称为一个Window。如果在图形界面下运行多个Emacs的实例,则每一个实例对应一个Frame。在不同的Window中,可以显示相同或者不同的Buffer的内容。

  在刚启动Emacs时,Emacs己经为您建立了一个名为*scratch*的Buffer,用于进行随意的文本输入(它其实还有ELisp演算的功能的,这个后面再说)。后面每当您用C-x C-f新建或打开一个文件时,Emacs都会新建一个Buffer,名字就是你文件的名字,并且在当前的Window中进行显示。如果是新建文件,Buffer就是空的,如果是打开文件,就会把文件的内容读入,放在Buffer中。所以如果你在编辑一个文件,在你存盘之前,其实你是在修改Buffer中数据,而并没有在修改实际的文件。

  现在您可以试一下,先打开或创建几个文件,这时当前应该显示在最后一个文件对应的Buffer中。按动键盘上的C-x C-b,这时您会发现Emacs的屏幕被分成了上下两部分,这两个部分也就是Emacs中的所谓的Window了。

  观察一下下面的那个窗口,可以看到,它的名字是*Buffer List*,窗口的内容就是列出了当前所有的Buffer。我们先不介绍这个Buffer List的使用的方法,我们先介绍窗口的基本操作:

  C-x o:把光标在屏幕上的窗口间进行切换。记忆方法:其它(Other)窗口。

  C-x 1:把当前光标所在的窗口放到最大,隐藏其它所有的窗口。记忆方法:只剩一(1)个。

  现在您可以按几次C-x o看看光标是不是可以在上下两个窗口间跳动,玩够了就再让光标停到先前的窗口中,按C-x 1,这时Buffer List窗口应该被隐藏了起来,这时如果你再试图用C-x o来切换窗口就不管用了,因为屏幕上只有这一个窗口了。

  那怎么切换显示隐藏的窗口呢?其实这个说法本身就不是很准确,在Emacs中只有显示出来了,才叫窗口,如果没有显示出来,而数据还存在,这时它只能称为是一个Buffer。

  切换Buffer的快捷键是C-x b,可不要跟列出Buffer列表的快捷键搞混了。按下C-x b后,Emacs会在Mini-buffer中提示输入要切换到的Buffer的名字,对于文件来说,这个Buffer的名字通常就是文件名了,对于没有关联到文件的Buffer,它们也有自己的名字,比如*scratch*,*Buffer List*之类这些都是。如果不输入Buffer名字直接回车,就会打开上一次访问的Buffer,所以反复按C-x b加上回车,就可以在最近工作过的两上Buffer间切换,非常方便。同理,在输入Buffer名字的时候,同样可以用Tab键进行自动补齐。

  如果只会新打开文件创建新的Buffer,而不会把它们关闭,这显然是不行的,Buffer会越来越多。要关闭一个不需要的Buffer,所要做的就是先切换到这个Buffer,然后按动C-x k,加上回车。或者直接按C-x k再输入Buffer名字后回车,效果都是一样的。在关闭Buffer的时候,如果Buffer中的内容没有保存,Emacs会提示你是否真的要关闭。

  讲了不少,还没有讲到一开始按C-x C-b看到Buffer List的用法,其实如果不是要批量处理Buffer,比如一次关闭很多Buffer的话,我觉得Buffer List用处并不是很大,所以这部分功能就留待大家自己去琢磨了,其实在后面讲到对列表型的窗口的操作的时候,这个Buffer List的操作方法也就显而易见了。

  有些朋友到现在为止可能已经开始被复杂的快捷键搞晕头了,不要怕,多用用也就熟悉了。另外,其实Emacs所有的快捷键都是可以自由定制的,随着你对Emacs的不断熟悉,你很快就可以找到一套最适合你自己使用的快捷键方案,到时我会介绍如何进行这样的定制。

Introduction

Face   李凡希,江苏吴江人。热爱计算机,勤于探索,愿意与您交流心得。

Miniblog

Subscribe RSS Feed


订阅到抓虾
Add to Google

Contact

Email: Email
Messenger: Live Messenger
GTalk: Google Talk
HAM Radio:BG4XTR

Visitors

Locations of visitors to this page

Links

Archive