2012年2月15日星期三

mysql的一些基本命令

1. 登录: mysql -u root -p
输入password.
2. 清屏: system clear
3.sudo mysql_install_db  //之后 Table "fcbbs.user" doesn't exit.的错误消失。
4. mysql查看建立连接的所有用户:show processlist;
5. mysql查看当前连接的用户:select user();
6. mysql查看当前使用的数据库: select database();

LOAD DATA INFILE '/tmp/data' INTO TABLE `thread` 
出现file not found的错误,
用LOAD DATA LOCAL INFILE解决 

autoconf automake 相关问题

在执行aclocal时,出现如下错误:
configure.ac:31: error: Autoconf version 2.62 or higher is required
/usr/share/aclocal-1.11/init.m4:26: AM_INIT_AUTOMAKE is expanded from...
configure.ac:31: the top level
autom4te: /usr/bin/m4 failed with exit status: 63
aclocal: autom4te failed with exit status: 63
autoreconf: aclocal failed with exit status: 63
系统里安装版本为autoconf-2.61,而且是手动安装的,于是在终端输入
sudo apt-get install autoconf
在从源里安装autoconf-2.68
输入aclocal,报相同错误,
原因:此时系统里装了两套autoconf, 即autoconf-2.61 autoconf-2.68
每次在执行aclocal时,都call autoconf-2.61的工具,即/usr/local/bin/autoconf
解决:进入autoconf-2.61的源码目录,
cd software/autoconf-2.61
执行 sudo make uninstall 
就将安装文件都卸载掉了
重启终端, autoconf -V 
其版本为autoconf-2.68
执行aclocal 
正常

2012年2月3日星期五

搭建web时遇到的问题

安装php时,下载的代码是php-5.3.9
在进行
~/文档/software/php-5.3.9$ ./buildconf --force时报错:

Forcing buildconf
buildconf: checking installation...
buildconf: You need autoconf 2.59 or lower to build this version of PHP.
You are currently trying to use 2.68
Most distros have separate autoconf 2.13 or 2.59 packages.
On Debian/Ubuntu both autoconf2.13 and autoconf2.59 packages exist.
Install autoconf2.13 and set the PHP_AUTOCONF env var to
autoconf2.13 and try again.
make: *** [buildmk.stamp] 错误 1
解决:
下载autoconf-2.13
tar zxvf autoconf-2.13.tar.gz
cd ~/autoconf-2.13
autoreconf -i
autoreconf
./configure
make
sudo make install
cp /usr/local/bin/autoreconf  /usr/bin/autoreconf   //此步很重要,将autoconf 2.68替换为2.13

 

2012年2月1日星期三

建测试站遇到的一些问题

在make时,报错:
undefined reference to `libiconv_open’
undefined reference to `libiconv’
undefined reference to `libiconv_close’
google后,在./configure 时,加入 CFLAGS=-liconv
即 ./configure CFLAGS=-liconv --prefix=/home/bbs --disable-register-code --disable-ip-binding
make
解决。

总结建站过程:
sudo su -
adduser bbsuser  //创建bbsuser用户
exit
cd /bbssrc //源代码目录
aclocal
autoreconf -fi
./configure CFLAGS=-liconv --prefix=/home/bbs --disable-register-code --disable-ip-binding
make
sudo make init //必须在root下
sudo su bbsuser //切换到bbsuser用户
cd /home/bbs/bin
./bbsd 2323
telnet 127.0.0.1 2323
终于成功了。。。。mark下。

2012年1月31日星期二

kubuntu11.10下安装gcc-3.4

最近答应帮忙实现88的一些功能,放假前把系统重装了一下,以前用的是ubuntu10.04,现在尝试用一用kubuntu11.10,界面感觉舒服多了,不过问题又出现了。
之前的系统,测试站已经搭好了,现在要重新搭建。安装说明中推荐用gcc-3.4,否则可能遇到不可知的错误。现在的系统默认安装的是gcc-4.6,先试着编译了一下,确实出现不明情况的错误。于是将gcc-3.4的源加入源列表,
sudo apt-get install gcc-3.4
sudo apt-get install g++-3.4
sudo ln -s gcc-3.4 gcc
sudo ln -s g++-3.4 g++
但编译运行helloworld.c时,报错
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
于是将其卸载,手动安装如下.deb包
gcc-3.4-base_3.4.6-6ubuntu3_amd64.deb
gcc-3.4_3.4.6-6ubuntu3_amd64.deb
cpp-3.4_3.4.6-6ubuntu3_amd64.deb
g++-3.4_3.4.6-6ubuntu3_amd64.deb
libstdc++6-dev-3.4.6-6ubuntu3_amd64.deb
仍然是相同的错误,反复折腾了近两天,对于菜鸟的我来说,近乎放弃,决定换回10.04,因为之前安装的时候是没有问题的。但是已经用了这么长时间来解决这个问题,就这样放弃实在是憋屈,而且遇到问题是要找出原因,解决它,而不是绕开。还好,最终安装成功。
1.  报错: /usr/bin/ld: cannot find -lgcc_s
 是指系统找不到需要链接的库文件,该库文件为libgcc_s.so。libgcc_s.so是一个链接文件,链接到对应目录的libgcc_s.so.1文件。打开libgcc_s.so弹出提示链接已损坏。于是一切豁然开朗:文件未能链接到正常的库文件。接下来在终端下输入:
 locate libgcc_s.so.1
 于是重定向3.4版编译的的libgcc_s.so链接
ln -sf /lib/x86_64-linux-gnu/libgcc_s.so.1 /usr/lib/gcc/x86_64-linux-gnu/3.4.6/libgcc_s.so
2. 报错: /usr/bin/ld: cannot find crt1.o: No such file or directory
                /usr/bin/ld: cannot find crti.o: No such file or directory
系统里现已安装的gcc有3.4和4.6两个版本,
ln -s gcc-4.6 gcc
ln -s g++-4.6 g++
利用 -print-file-name选项来确定gcc能否找到文件crt1.o, crti.o
当gcc的版本是4.6时,输入
gcc -print-file-name=crt1.o
输出
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o
当gcc版本为3.4时,
输出为
crt1.o
也就是说,gcc-3.4找不到文件crt1.o
locate crt1.o
发现文件crt1.o在目录/usr/lib下,于是
cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .  
再编译helloworld.c
编译成功。终于解决了,赶紧接下来的工作。

2012年1月21日星期六

写在25周岁

转眼间,已年过25。有些话,想要讲给25岁的自己。
不再孩子气。看着镜子里的你,总觉得稚气未脱。走在大街上,也经常会有人说你像高中或者本科生。内心深处的那个小女孩,始终没有长大,依然会时不时的跑出来,渴望关怀。但是,社会并不会因此而放低对你要求,即将走出校园去迎接来自社会各个方面挑战的你,请收起孩子气,不要再将可爱作为对你的称赞,学着沉着稳重、知性豁达,注重沉淀出你独特的气质。
做到言而有信。一直认为,诚信是一个人最重要的品质之一。在与人合作或交往的过程中讲诚信,就相当于在给你自己树立品牌并通过诚信不断的提升你的品牌价值。做到诚信并不易,要在充分衡量自己的能力后,根据实际情况,适当的接受或拒绝别人的请求或要求。答应别人的事情,请你一定做到;遇到自己能力范围之外的事情,请一定学会拒绝。请不要因为一点儿物质诱惑损害你的信誉度。
冲动是魔鬼。在以后的日子里,你将遇到更多未曾面对也不知该如何面对的人和事,在受到委屈或感到挫败时,你需要对自己的情绪有一个良好的掌控。也许倾诉是一个很好的调节方法,但还有更多更健康的方法,你可以去跑步,去打球,出一身臭汗再冲一个热水澡,再安安静静的看本书。在高兴的时候,也一样要注意控制情绪,学着宠辱不惊。对每一个决定,不是因一时兴起而为,隔天再想想你是否依然想做这个决定,如果答案是肯定的,那就去做。
牢记自己的梦想。虽然在现实面前,梦想一文不值。但你仍然在坚定的追寻着自己的梦想,这是我最欣赏你的地方。我知道,偶尔你也会动摇,会怀疑,会迷茫,会被世俗的很多东西所牵绊,会对自己没有信心,会犹豫。但还好,你已经上路,虽然未知的恐惧会让你想要逃避,但幸好你在辗转反复中依然努力前进着。希望你继续坚持自己的梦想,我想在坚持追寻自己梦想的过程中,你会走出一条属于你自己的独一无二的道路,无关乎荣耀,也摒除外界的眼光,只因那是你想要的。
学会专注。现在的你所面临的问题,不是缺乏选择,而是选择太多。既然你已经明晰自己喜欢什么,那么就请专注起来,将其学精学透,成为这个领域的专家。一直都认为你是要走技术路线的,在技术上有所造诣。一直以来的性格,都不适合管理,且对管理并不感兴趣,或许是在技术上更能找到成就感吧。技术的累积,需要持续的专注,面对难题,有攻克的勇气和决心,并给予很好的执行力。
学会感恩。发现以前的你,看问题总是非黑即白,忘了原来中间有那么一个灰色地带。越长大,发现很多事务并不是预想的那样,总是存在很多误解,很多不解,心中总有些愤恨,看事情总是关注消极方面多一些。希望以后的你,学会感恩,承认消极的方面,但更要看到积极的方面,以一颗感恩的心,去面对,化解内心的情绪,回归平静。
学会对自己投资,沉淀出你的气质。让自己不是一张书签,而是一本书,有思想,有内涵。每周抽半天,静静的读一本书;每年给自己10天,去体味另一番风土人情。你喜欢徒步、爬山、骑车,你希望以后能开一间有特色的书吧,想法虽然小资,但很好。所以你可以去学习摄影、茶道、品鉴咖啡,让你的生活充满多个支点,而不是像陀螺一样,因为只有一个支点,在停下的时候,就倒掉了。
最后,很想说的就是执行力。不确定,你的三个梦想在什么时候能实现,但是,请你一定要在路上,action speaks louder than words, 因此,行动吧,继续你的行走,身后坚定的脚印,是最好的见证!

2012年1月18日星期三

kubuntu11.10下配置LAMP(linux+Apache+Mysql+Php)

1.安装ssh
sudo apt-get install ssh

2.安装mysql
sudo apt-get install mysql-server-5.0
在安装过程中按提示设置密码

3.安装apache
sudo apt-get install apache2

4.安装php
sudo apt-get install php5 libapache2-mod-php5 //配置apache+php
sudo apt-get install libapache2-mod-auth-mysql //让apache支持mysql
sudo apt-get install php5-mysql //支持mysql连接
sudo apt-get install php5-gd //GD库

5.安装phpMyAdmin
sudo apt-get install phpmyadmin

7.设置文件读写权限
LAMP组安装好后,php网络服务器根目录默认设置是在:/var/www。
由于linux 系统的安全性原则,该目录下的文件读写权限是只允许root用户操作的,普通用户不能再www文件夹中新建php文件,也不能修改和删除。故需要先修改/var/www目录的读写权限。执行如下命令:
sudo chmod 777 /var/www   将www文件夹属性改为所有用户可读写。

8.测试apache
在浏览器中打开:http://localhost/或者http://127.0.0.1,如果出现it works则说明apache配置成功。

9.测试php
sudo /etc/init.d/apache2 restart  //重启apache

vim /var/www/info.php
输入如下内容:
<?php
phpinfo();
?>
保存,然后在浏览器中输入http://127.0.0.1/info.php或者http://localhost/indfo.php
出现php版本信息就说明成功了。

10.phpmyadmin设置:
在安装过程中会要求选择web server:apache2或lighttpd,选择apache2,按tab键确定。按提示输入设置mysql数据库密码连接密码password of the database's adminstrative user。
然后将phpmyadmin与apache2建立连接,www目录在/var/www,phpmyadmin在/usr/share/phpmyadmin目录,用如下命令建立连接:
sudo ln -s /usr/share/phpmyadmin /var/www

在浏览器地址栏中打开http://localhost/phpmyadmin对phpmyadmin进行测试

11.启用mod_rewrite模块
sudo a2enmod rewrite
sudo /etc/init.d/apache2 restart
对其进行测试,在/var/www目录下新建文件test.php,写入代码:<?php phpinfo(); ?>保存,在地址栏中输入http://127.0.0.1/test.php或http://localhost/test.php,如果正确出现php配置信息,则表明LAMP Apache已经正常工作。

12.设置Apache支持.htm .html .php
sudo vim /etc/apache2/apache2.conf
或者
sudo vim /etc/apache2/mods-enabled/php5.conf
在打开的文件中加上
AddType application/x-httpd-php .php .htm .html即可。

13.mysql测试
在/var/www目录下新建mysql_test.php:
<?php $link = mysql_connect("localhost","root","darlwen");if(!$link) {die('Could not connect: ' .mysql_error());}else echo "Mysql已经正确配置"; mysql_close($link);?>
保存,在地址栏输入http://127.0.0.1/mysql_test.php,显示"Mysql已经正确配置"则表示配置成功。

14.解决Firefox显示中文乱码问题
打开apache配置文件
sudo vim /etc/apache2/apache2.conf
在最后面加上: AddDefaultCharset UTF-8
若还是乱码,则将UTF-8改为gb2312

15. 手动启动mysql: mysql -u root -p, 根据提示输入密码

16. 启动apache2,即sudo /etc/init.d/apache2 restart 时出现
* Restarting web server apache2
apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
则需要修改apache配置文件
sudo vim /etc/apache2/apache2.conf
此文件默认为空文件,则向此文件中加入:
ServerName 127.0.0.1
保存

17 LAMP组件常用的几个终端命令:
重启apache: sudo /etc/init.d/apache2 restart
重启mysql: sudo /etc/init.d/mysql restart
配置php.ini: sudo vim /etc/php5/apache2/php.ini
配置apache2.conf: sudo vim /etc/appache2/apache2.conf
PHP CGI: sudo /var/www/cgi-bin/

2012年1月13日星期五

寒假正式开始

临近毕业的日子,很放松,放松的有些心慌。在悠哉了近两个月后,决定回到以往陀螺的生活。
奉老妈之命,提早回家,把驾照搞定。于是在提交了预审论文后,就坐上了回家的列车。没想到家里竟比杭州冷很多,对学车本来就没什么热情的我,决定退缩了。
今天终于把网络弄好,寒假学习计划就此开始。
上午:DM + 数据库
下午:Linux
晚上:topcoder
多余的话不多说了,每日一记,执行力!

2011年10月22日星期六

找工作应该接近尾声了

从七月份,当NI提前来学校招人时,受到了很大的打击,在第一轮面试的时候,就被刷了。这给我敲响了警钟,对于找工作,我要开始认真对待了。于是,放下手中的paper,捧起算法、C++等相关的书,复习着面试可能遇到的问题。
感觉这个过程,是对研究生阶段所学知识的一个检验,也同时是对自己的一个整体水平的提升。回顾自己整个笔试面试的过程,自己是在一点儿一点儿不断进步的。在九月份的时候,通过一些同学的内部推荐以及自己的投递,先后收到豆瓣、腾讯、百度及阿里的远程面试或电面。豆瓣其实是很可惜的,第一次面试,没有任何经验,开始觉得跟面试官聊的还不错,但是可能是自己的态度也不是很端正,错过了这次机会。不过面试官所问的问题和自己这两年来所研究的东西还是很相关的,而且问的很有深度,感觉我们是能沟通的。平时,像我这样比较偏理论的,很少能遇到如此聊的来的面试官。接下来的电面,感觉都不太好,问的操作系统、计算机组成等基础性的知识,都没有太回答上来,同时也发现了,原来这些方面也需要补一补。
正式的面试,应该是从华为开始的,去面也只是想增长点儿面试经验。酱油打完,接着是淘宝,我所有投的职位都是算法工程师,淘宝也是。一面的面试官在一起聊起来很舒服,对我简历里所列的算法也都比较了解,通过跟她的交谈,自己也找到了一些在理解上面的疏漏。二面有些压力面的意味,面试官感觉比较强势,问了推荐系统中大规模数据处理的情况,基本上把我说的都驳倒了,最终也止步于这一面。接着是搜狗,搜狗很幸运,没有通知笔试,直接面试。可惜没能把握住这次机会,当天不知道为什么,心情低落到极点,在骑车去面试地点的路上,整个乌云密布,开始面试的时候,基本上都不想说话,可想而知,悲剧收场。搜狗之后,很意外的收到盛大的面试通知,原来是内推的同学提前批面试,面试之前,对以往所有的面试小小的总结了一下,调整心情,这个面试感觉还可以,最终顺利的拿到口头offer。国庆节前,能拿到offer是很开心的一件事情。但我知道,国庆后,才是我的主战场。
国庆之后的第一场战役,就是google的笔试,多年的努力,皆起源于它,但深知自己之菜,离它的要求相差之远,所以自己的目标只是通过笔试,进入面试。后来,很可惜,我在笔试就被BS了,回想起来,没有自信,也许也是其中的一个原因。在被google鄙视的同时,还好没有时间去郁闷,因为这时候腾讯、百度、yahoo的笔试面试正如火如荼的进行着。很幸运的通过了三者的笔试。腾讯面试当天同百度、yahoo的笔试时间冲突,弄的hr很不高兴,最后被安排到最后一个,面试结束,走出纳德酒店已是晚上十点,最后也没逃脱被淘汰的结局。不过,也没有觉得太可惜,职位偏工程,和我目前的情况也不太契合。百度、yahoo很顺利的通过了三面,这也是我找工作以来面的最顺利的两家公司了,坦白的说,我自己是没有想到的。可能是所投的职位刚好能发挥我的所长,面试官问的问题都偏理论一些,对实际的项目经验要求不高。加上之前的面试也积攒下一些经验并及时将出现的漏洞和不太扎实的知识点稳固,使得在面对这两家公司的时候,还算是准备的比较充分。百度的offer如期而至,而yahoo却悬而未定,至今仍没有消息,开始对它的希望变成有些失望,最后趋于平淡,顺其自然吧。
今天去面了微策略,很不幸的被bs,不过能通过它的笔试,我也很开心。工作近于尾声,我想如果不出意外,我会去百度。开始最想的是在今年去一家外企,不过现在看来希望不大了。投递的最后一家公司是SAP,不知道会不会给我笔试的资格,如果有就去试一试。最后,总体感觉比较遗憾的是微软,在简历就筛掉了,投的是assistant researcher, 据说基本上不招研究生,只能说我撞到枪口上了。
整个找工作的过程,让我发现了很多以往在学习过程中疏忽但又非常重要的地方,基础知识也又重新复习了一遍。也很感谢一直以来给我鼓励,支持我的朋友们,offer虽不是我最想要的,但也已经很满足了。

2011年7月20日星期三

字符串匹配问题

为了准备面试,开始啃《编程之美》这本书,卡在“最短摘要生成“这一题已经很多天了,决心自己把代码实现,今天终于初步调试通过,在这里做一个小结。
思路书上写的很清楚,可以概括为:
1.先将页面分词,得到分词后的数组W,假设关键词数组为K。
2.对数组W进行扫描,第一次得到包含所有关键词的数组段,其起点和终点分别为beg和end,记下此时数组段的长度length。将beg指向数组段中下一个关键词,end向后移,继续扫描数组W,直到包含所有的关键词,将此时数组段的长度与length进行比较,若比其短,则记录下数组段的起始和终止位置,继续重复上述过程,直到数组W的末尾。
设数组W长为N,关键词数组长为M,此方法的时间复杂度为O( N*M )。
代码:
#include <iostream>
#include <string>
#include <map>
using namespace std;

void shortest_abstract(const string arrW[], const string arrK[], int * aBeg, int * aEnd, int lenW, int lenK);

int main()
{
    int lenW, lenK;
    int aBeg = -1;
    int aEnd = -1;
    cout << "Please enter the length of words and keys: " << endl;
    cin >> lenW >> lenK;

    string * arrW = new string[lenW];
    string * arrK = new string[lenK];

    cout << "Please enter words: " << endl;
    for(int i = 0; i < lenW; i++)
        cin >> arrW[i];

    cout << "Plearse enter keys: " << endl;
    for(int i = 0; i < lenK; i++)
        cin >> arrK[i];


    shortest_abstract(arrW, arrK, &aBeg, &aEnd, lenW, lenK);

    if(aBeg == aEnd)
    {
        cout << "Can't contain all words." << endl;
    }
    else
    {
        cout << "The shortest abstract is: " << endl;
        for(int i = aBeg; i <= aEnd; i++)
        {
            cout << arrW[i] << " ";
        }
        cout << endl;
    }

    return 0;
}

void shortest_abstract(const string arrW[], const string arrK[], int * aBeg, int * aEnd, int lenW, int lenK)
{
    int i,j;
    map<int, int> pos_key;//store the key's index and its corresponding poistion
    int * pos = new int[lenK];
    int count = 0; // the number of keys have been found
    int beg = 0;
    int end = 0;
    int length;   // the length contains all key words
    int aLength = lenW; // the length of abstract

    cout << "lenW = " << lenW << " lenK = " << lenK << endl;
    //initial position
    for(i = 0; i < lenK; i++)
        pos[i] = -1;

    // begin finding the shortest abstract
    for(i = 0; i < lenW; i++)
    {
        for(j = 0; j < lenK; j++)
        {
            if(arrW[i] == arrK[j])
            {
                if(pos[j] == -1)
                {
                    if(count == 0)
                        beg = i;
                    count++;
                    cout << "count = " << count << endl;
                    // This is the first time that find this key
                    pos[j] = i; // record key's position in words array
                    pos_key.insert( pair<int,int>(i,j) );
                    if(count == lenK)
                    {
                        end = i;
                        length = end - beg;
                        if(aLength > length)
                        {
                            cout << "------" << endl;
                            *aBeg = beg;
                            *aEnd = end;
                            aLength = length;
                        }
                        map<int, int>::iterator it;
                        it = pos_key.begin();
                        beg = (*it).first;
                        pos[(*it).second] = -1;
                        it++; // move beg to next word
                        beg = (*it).first;
                        it--;
                        pos_key.erase(it);
                        count--;
                    }
                }
                else
                {
                    map<int, int>::iterator it;
                    it = pos_key.find(pos[j]);
                    // if this key word is the same as the begin word of abstract, then move beg to next word
                    if(beg == (*it).first)
                    {
                        it++;
                        beg = (*it).first;
                        it--;
                    }
                    pos_key.erase(it);
                    pos_key.insert( pair<int, int>(i,j) );
                    pos[j] = i; //update position to make it as the newest position   
                }
                break;
            }
        }
    }
    cout << "aBeg = " << *aBeg << " aEnd = " << *aEnd << endl;
}

2011年7月19日星期二

numpy及scipy安装

最近在看online lda的文章,同时也将文章里的算法的实现代码下载了下来一并学习。这次看的文章的算法是用python实现的,同时还用到python的两个数值计算库numpy和scipy。那么,要让代码跑起来,先要安装这两个库。期间几费周折,忘了ubuntu下可以直接apt-get,因为源里的资源都很全了。最后,直接用apt-get从源里安装,才算搞定。
sudo apt-get install build-dev python-numpy
sudo apt-get install python-numpy
sudo apt-get install build-dev python-scipy
sudo apt-get install python-scipy

要测试numpy是否安装成功,还要安装nose
sudo apt-get install python-nose

好吧,不能不说,ubuntu还是非常方便的。

2011年7月6日星期三

处女面

今天,进行了我进入预备找工作阶段的第一次面试。之前如火如荼的实习生招聘,我都强忍住了好奇,安份的奔波于实验室和图书馆之间,老实的看着论文、读着天书,感叹着自己的未来。
NI 是第一个来学校进行正式招聘的,这次主要是计算机专场招聘会。本以为是下午开宣讲,于是悠哉的跑去上自习,结果被真真的短信叫了回来,匆忙打印了简历,到了宣讲会会场,听了半头的宣讲。NI 主要是做嵌入式的,和我这两年来研究的内容关系不大,本来也是抱着去体验一下的心态,犹豫了要不要投简历,最终还是投了一份。
很幸运,在中午的时候收到了面试通知。下午将简历上所有的内容都复习了一篇,以备面试官问到相关的内容。在晚上面试前,给好友打了个电话,询问了一下,她下午去面试的,具体就是按照简历上的内容,问了一下相关的项目。心里稍微有了一些底,比较平静的开始了面试。
我的经历比较特殊,本科学的不是CS,面试官按照简历,从这个方面开始了交流。我一五一十的交代了跨专业考研的前因后果,面试馆这才罢休,开始了简历中技术性内容的提问。我的研究生阶段偏重于研究,所以简历的很大篇幅都在讲我的研究经历,面试官对此倒没有什么异议,我也给他讲了其中的一个模型,应该感觉还不错。但是,他对的我实践能力表示怀疑,因为我大多数时间都是在看论文,可能很少写程序,而且我本科还不是学计算机的。事实确实如此,时间和精力有限,大部分用来看论文了,花在写代码上的时间必然会减少。不过我确实写过一些程序,论文里的算法是需要实现的。“你在写程序的时候,遇到过怎样的不可预见的错误?”,“段错误“,”能具体举个例子吗?“”如数组越界、文件读取的时候遇到过“,”能更具体一些吗?”“我试试。。。。”于是,一段沉默,我已经忘了那次文件读取的错误在哪里了。很窘。“我给你出一个简单的算法题吧,就是链表反转,写个小函数“,”。。。。。“, 勉强写出来了,拿给面试官,面试官说可能还有问题,又细心的指出。好吧,此时我的已没有了仔细听的心情,被鄙视了。最后一个问题,是我向他提问,这个问题我在面试的时候已经问过了,就是关于机器人方面的研发,可惜他不是那个组的,具体情况不了解。这个面试过程就这样结束了。
经过了这次面试,有如下感悟:
1.自己的理论知识在外行人面前可以忽悠一下,但是内行人面前还远远不够,所以理论还要继续补充,不能懈怠。
2.自己对实践的重视不够,平时还是应该多写代码,多编程,将看新闻、发呆的时间都拿来写代码,抓紧最后的两个月。
3.要对自己有信心,尤其是在面试遇到编程问题的时候,要自信满满的,以肯定的语气回答。
4.自己对编程的基础,如数据结构的重视还是不够,需要再次的复习巩固。
最后,尽力去做,不要让自己后悔就好的。

2011年3月21日星期一

ubuntu 开机不显示登录框

前天开机,结果ubuntu没有像以往一样显示登录框,进入tty重启了几次,还是一样的状况。于是google之,查看了一些贴子后,基本断定是前几天安装的zlib与ubuntu的系统冲突了,只要卸载zlib就可以解决。
卸载zlib的步骤很简单,进入安装zlib的目录,执行sudo make uninstall 即可。
我一直将下载的软件放在/home/athena/文档/software文件夹下,可以在tty下,中文乱码,而且目前我的系统还不能在tty下输入中文。这样,我就不能进入zlib的安装目录。好吧,接下来要做的就是搞定tty下的中文显示及输入。还好,也不难,搜索了一下,按照如下步骤完成了安装。
sudo apt-get install zhcon
sudo apt-get install fbterm
安装成功后就可以显示中文和输入中文了。
输入 zhcon --utf8
可以进行输入法切换。
最后,顺利进入zlib的安装目录,卸载之,重启。可爱的登录框出现~

2011年3月10日星期四

文件读取

     今天,尝试着从txt文件中读取数据,数据里有字符串和数字,要将其分离。第一次处理这样的文件,在网页上查了很多相关的函数,最后初步完成了数据的读取。
     文件中数据格式如下:
     nUser = 1000990
     这里采用fgets()函数进行按行读取,sscanf 进行字符串分割,将其分割成"nUser"和"1000990",再用atoi()将字符串“1000990”转换成整数。


#include<stdio.h>
#include<stdlib.h>
using namespace std;
int userN, itemN, rateN;
main()
{
    FILE *fr = fopen("stats1.txt", "r");
    char str[40];
    char sn[40];
    char  sv[40];
    int num;
    while(fgets(str,40,fr))
    {
        sscanf(str, "%[^=]=%s",sn, sv);
        num = atoi(sv);
        printf("%s %s %d\n",sn, sv, num);
    }

}   

   

2011年2月21日星期一

转:C语言中static的用法

一、c程序存储空间布局
C程序一直由下列部分组成:
      1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
      2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
      3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。
      4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
      5)堆——动态存储分。
二、 面向过程程序设计中的static
1. 全局静态变量
   在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量
   1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
   2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
   3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。
定义全局静态变量的好处:
<1>不会被其他文件所访问,修改
<2>其他文件中可以使用相同名字的变量,不会发生冲突。
2. 局部静态变量
  在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量
  1)内存中的位置:静态存储区
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
  3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
  注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
      当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。
3. 静态函数
  在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
  函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。

存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。

auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
由于static变量的以上特性,可实现一些特定功能。
1. 统计次数功能
声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。

2011年2月13日星期日

转:X,X11,XFREE,WM,KDE,GNOME等之间的关系

关于linux图形界面的基本知识
很多LINUX初学者分不清楚linux和X之间,X和Xfree86之间,X和KDE,GNOME等之间是什么关系.常常混淆概念,我想以比较易于理解 的方式说明一下X,X11,XFREE,WM,KDE,GNOME等之间的关系.由于本人水平有限可能存在错误,请高手指正.    

一,linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程序实现的.    
图形界面并不是linux的一部分,linux只是一个基于命令行的操作系统,linux和Xfree的关系就相当于当年的DOS和WINDOWS3.0 一样,windows3.0不是独立的操作系统,它只是DOS的扩充,是DOS下的应用程序级别的系统,不是独立的操作系统,同样XFree只是 linux   下的一个应用程序而已.不是系统的一部分,但是X的存在可以方便用户使用电脑.WINDOWS95及以后的版本就不一样了,他们的图形界面是操作系统的一 部分,图形界面在系统内核中就实现了,没有了图形界面windows就不成为windows了,但linux却不一样,没有图形界面linux还是   linux,很多装linux的WEB服务器就根本不装X服务器.这也WINDOWS和linux的重要区别之一.    

二,X是协议,不是具体的某个软件:    
X   是协议,就像HTTP协议,IP协议一样.这个概念很多初学者甚至学习LINUX有一定时间的人都混淆,一个基于X的应用程序需要运行并显示内容时他就联 接到X服务器,开始用X协议和服务器交谈.比如一个X应用程序要在屏幕上输出一个圆那么他就用X协议对X服务器说:喂!我需要在屏幕上画一个圆.X应用程 序只负责告诉X服务器在屏幕的什么地方用什么颜色画一个多大的圆,而具体的 "画 "的动作,比如这个圆如何生成,用什么显卡的驱动程序去指挥显卡完成等等工作是由X服务器来完成的.X服务器还负责捕捉键盘和鼠标的动作,假设X服务器捕 捉到鼠标的左键被按下了,他就告诉X应用程序:亲爱的应用程序先生,我发现鼠标被按下了,您有什么指示吗?如果X应用程序被设计成当按下鼠标左健后再在屏 幕上画一个正方形的话,X应用程序就对X服务器说:请再画一个正方形,当然他会告诉服务器在什么地方用什么颜色画多大的正方形,但不关心具体怎么画--那 是服务器的事情.    
那么协议是需要具体的软件来实现的,这就是下面我要讲的:    

三,X和XFree86的关系.    
有了协议就需要具体的软件来实现这个协议.就好比我们有了交通法规就需要交警去根据法规维护交通秩序一样.Xfree86就是这样一个去根据法规实现协议 的   "交警 ".他按照X协议的规定来完成X应用程序提交的在屏幕上显示的任务.当然不仅仅是某个特定的交警才可以去维护和实现这个法规,比如还可以由交通协管员来实 现交通法规,必要的时候警察也可以介入,当然前提是他们都要懂得交通法规,也就是要懂得协议.所以实现X协议的软件也并不只有XFree86,   XFree86只是实现X协议的一个免费X服务器软件.商业上常用MOTIF,现在还有XORG,还有很多很小的由爱好者写的小的X服务器软件.甚至可以 在WINDOWS上有X服务器运行,这样你可以在linux系统上运行一个X应用程序然后在另一台windows系统上显示.多么神奇.你可以用   google找到这样的X服务器软件.只不过在LINUX上最常用的是XFree86.(现在的linux发行版都用Xorg了)顺便说一句,苹果电脑的 图形界面用的也是X协议,而且被认为是做的最好的X协议图形界面,并且他对X协议的实施是做在系统内核里的,所以性能明显好很多,这就是为什么很多大型三 维图形设计软件都是在苹果平台上的原因.    
为了便于理解拿HTTP协议来比较:    
协议是HTTP   (hyper   text   transmission   protocol)    
实现这个协议的常用服务器有:apache   IIS   等    
请求这些服务器传输文件的客户有:IE   ,MOZILLA   ,NETSCAPE等.    
协议是X    
实现这个协议的常用服务器有Xfree86   ,Xorg   ,Xnest等    
请求这些服务器来完成显示任务的客户:所有的X应用程序.    
只不过HTTP协议的服务器和客户端通常都在两台不同的电脑(服务器和客户机)之间来实现,所以一般人对这个比较容易理解.而X协议的服务器和客户端程序 通常在同一台电脑上,因此很多用户都感到对此很难理解.既然是协议,那么肯定和平台无关的,因此可以让X应用程序显示在任何装有X服务器的远程计算机上. 甚至显示在装有Xnest服务器的windows系统上.只不过在大多数情况下,X应用程序都用本机的X服务器,然后X服务器将显示结果输出到本机的显示 器.这也是很多人不理解X是一种协议的原因.    

四,X和X11R6又是什么关系?    
不知道初学者有没有注意到/usr/X11R6这个目录,这是XFree的默认安装目录    
X11R6   实际上是   X   Protocol   version   11   Release   6    
(X协议第11版第六次发行)的意思,就是说目前用的X协议是第11版的,然后经过了6次小的修正.不同版本的X协议是不能通信的.就象我们现在IPV4和IPV6不能通信一样,不过不用担心,现在的X服务器软件和X应用程序都遵循X11R6.    
另外XFree86   3.3.6   XFree86   4.3.6   等这些版本是实现X协议的软件XFree86的版本号.这是初学者经常高混淆的概念.    
协议版本和实现协议的软件的版本--这两个概念的区别你分清楚了吗?    

五,X服务器和WM(window   manager   窗口管理器)之间是什么关系.    
平时大家起动图形界面是怎么启动的呢?    
如果你是一开己就进入图形界面那就太遗憾了.应为你错过了了解X服务器起动过程的好时机.不过没关系.你打开一个XTERM输入:    
init   3    
就可以安全的回到字符界面.    
好了,等做完以下实验你就完全明白X和WM(window   manager   窗口管理器)之间是什么关系了.    
先输入以下命令:    
#startx    
起动图形界面,你看到的是一个和平时使用一样的完整的图形界面操作环境.    
你可以最大化,最小化,移动,关闭窗口等.    
按ctrl+alt+backspace反回字符界面.    
输入:    
#xinit    
再次启动图形界面,你看到了什么,你看到一个XTERM.而且不能移动.但是你可以在这个XTERM中输入命令打开X应用程序,如果我输入:    
#mozilla    
打开浏览器,你看到的浏览器和平时有什么不同吗?他在屏幕中间,不能移动,不能最小化,不能最大化,没有边框.    
为什么同样一个X应用程序会有这样的不同呢?因为我们用startx起动图形界面的时候同时也启动了一个WM(即窗口管理器),如果你用KDE就起动了KDE,如果你用GNOME就起动了GNOME.但是你用xinit起动图形界面的时候却没有起动WM.    
现在你明白窗口管理器的作用了吗?他的作用就是最大化,最小化,移动,关闭窗口等.而这些不是X服务器来负责完成的.    
如果你用xinit起动图形界面并在xterm中输入twm,看看会有什么?    
xterm被加上了一个边框,你可以通过这个边框移动,最大化,最小化这个xterm,twm就是XFree86中自带的窗口管理器,是一个比较简陋的最简单的窗口管理器,但是他具有窗口管理器的全部特征.    
如果你不输入twm而输入gnome-session就可以起动GNOME    
或者输入startkde起动KDE.    
通过以上的实验你就可以清楚的明白他们之间的关系.    
 
六,关于KDE和GNOME    
KDE   和GNOME是LINUX里最常用的图形界面操作环境,他们不仅仅是一个窗口管理器那么简单,   KDE是K   Desktop   Environment   的缩写.他不仅是一个窗口管理器,还有很多配套的应用软件和方便使用的桌面环境,比如任务栏,开始菜单,桌面图标等等.    
GNOME是GNU   Network   Object   Model   Environment   的缩写.和KDE一样,也是一个功能强大的综合环境.    
另外在其它UNIX系统中,常常使用CDE作为这样一个环境.    
其它的小型窗口管理器有:    
window   maker,after   step,blackbox,fvwm,fvwm2,等等都是常用的优秀窗口管理器.REDHAT9中有   window   maker   但是默认不安装,大家可以装来试试.只要xinit再wmaker&就可以用windowmaker了.    
七,linux图形界面层次关系总结    
linux本身--> X服务器 <-[通过X协议交谈]-> 窗口管理器(综合桌面环境)--> X应用程序.

由毅行帶来的思考

   新的一年开始了,新的学期也开始了。今天,去参加了新学期的第一次毅行。在雪中,四个年轻人一起,边走边聊。整体感觉很轻松,收获也很多。
   其中,有两位同学的专业和计算机相关。聊到专业,我变的很不自信。因为我对专业懂的很少,我在过去所做的就是读了一些统计学的书和相关的论文。我没有实践经验,没有做过项目,对项目流程甚至一些专业术语都不懂。而我还有6个月,就要找工作了,这样的我,如何才能找到工作呢?
     导师目前交给我的工作,我本意很不想做。但是,工作布置下来了,我有责任保质保量的完成。我想,我要调整状态,不要心急。优先完成现在要做的工作,然后开始着手为找工作做一些准备。我相信自己!接下来的时间,自己可能要苦一些了,我要更勤奋,更努力!

2011年1月26日星期三

转:makefile编写

MakeFile的编写
1.最原始的编写方法:
  例如 file1.c:
        #include <stdio.h>
              #include "file2.h"
              int main()
              {
                     printf("print file\n");
                     File2Print();
                     return 0;
              }
    file2.h //省略
    file2.c //省略
=== makefile 开始 ===
A: B
(tab)<command>
(tab)<command>
              helloworld:file1.o file2.o //helloworld依赖file1.o file2.o两个目标文件。
                     gcc file1.o file2.o -o helloworld
              file1.o:file1.c file2.h   //file1.o依赖file1.c和file2.h两个文件
                     gcc -c file1.c -o file1.o
               file2.o:file2.c file2.h
                     gcc -c file2.c -o file2.o
              clean:
                     rm -rf *.o helloworld
       === makefile 结束 ===
2.原始方法的改进
       === makefile 开始 ===
              OBJS = file1.o file2.o
              CC = gcc
              CFLAGS = -Wall -O -g //警告,编译优化,编译debug版
              helloworld : $(OBJS)
                     $(CC) $(OBJS) -o helloworld
              file1.o : file1.c file2.h
                     $(CC) $(CFLAGS) -c file1.c -o file1.o
              file2.o : file2.c file2.h
                     $(CC) $(CFLAGS) -c file2.c -o file2.o
              clean:
                     rm -rf *.o helloworld
=== makefile 结束 ===
3.使用默认变量写
       === makefile 开始 ===
              CC = gcc
              XX = g++
              CFLAGS = -Wall -O –g
              TARGET = ./helloworld
              %.o: %.c
                     $(CC) $(CFLAGS) -c $< -o $@
              %.o:%.cpp
                     $(XX) $(CFLAGS) -c $< -o $@
              SOURCES = $(wildcard *.c *.cpp)
              OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
              $(TARGET) : $(OBJS)
                     $(XX) $(OBJS) -o $(TARGET)
                     chmod a+x $(TARGET)
clean:
       rm -rf *.o helloworld
=== makefile 结束 ===
函数1:wildcard
       产生一个所有以 '.c' 结尾的文件的列表。
       SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以 .c,.cpp结尾的文件的列表,然后存入变量 SOURCES 里。
函数2:patsubst
       匹配替换,有三个参数。第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。
OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。
%.o: %.c
       $(CC) $(CFLAGS) -c $< -o $@
%.o:%.cpp
       $(XX) $(CFLAGS) -c $< -o $@
       这几句命令表示把所有的.c,.cpp编译成.o文件。
       这里有三个比较有用的内部变量。$@ 扩展成当前规则的目的文件名, $< 扩展成依靠       列表中的第一个依靠文件,而 $^ 扩展成整个依靠的列表(除掉了里面所有重 复的文件名)。
       chmod a+x $(TARGET)表示把helloworld强制变成可执行文件。
       到这里,我想你已经能够编写一个比较简单也比较通用的Makefile文件了,上面所有的例子都假定所有的文件都在同一个目录下,不包括子目录。
       那么文件不在一个目录可以吗?
       怎么编写Makefile生成静态库?
       你还想更上一层楼吗?

2011年1月1日星期六

2011

  2010刚刚翻过去,很多人对过去的这一年做了总结,我也写一个吧。
  回顾这一年,很多原本打算做的事情都没有完成,不过总体来说是成长的一年。
  很幸运的在这一年发表了一篇文章,让自己在接下来的时间相对于其他同学,压力要小很多,搞笑点儿说,如果学分修够,我就可以提前毕业了。独自一人跨洋去巴塞罗那参加了EMCL PKDD的会议,做了文章的报告。一路上遇到很多热心的人,让我本来忐忑的心感到了些许温暖。
  对自己的未来做了一个小的规划,放弃了出国读博的想法,觉得自己还是喜欢在实践中提高,不希望自己以后只做纯理论研究。于是,不再将重心放在读论文,也开始着手进行编程的练习。进步的很慢,确实需要一个过程,我需要坚持。
  对家人,对朋友,对实验室,都有了一些新的认识和理解,一点点的内化和成长。
  2011年,是有一些展望的。希望自己能稳重些,不要再孩子气了。希望自己能大气些,难得糊涂。希望自己更努力些,为了梦想去努力奋斗。以前总是给自己定很多量化的任务,而且很多。这一次,依然量化,但不多。推荐系统+算法,是接下来9个月的主旋律。

2010年12月26日星期日

vim关闭缓冲区

在下载了好多插件把个vim搞地乱七八糟的时候,终于安装了一个纯净版的vim,没有任何插件,用他来编辑文件,但是用vim的时候,打开多个文件,使用:close命令关闭的时候,总是提示我E444错误,说这是最后个窗口不能关闭,

而我这时明明是打开多个文件的,怎么能是最后一个窗口哪,郁闷了,使用:ls命令看了一个明明有好几个文件正在编辑嘛,怎么能说我是最后一个窗口哪,

没办法找到vim手册,看到了如下这一段话,实际上我打开的是缓冲区,哈哈,我想要关闭的也是缓冲区,而close命令关闭的是窗口,所以才会出现e444错误,哈哈,放在这里纪念一下.

*22.4* 缓冲区列表


Vim 编辑器使用术语 "缓冲区" 来描述编辑当中的文件。实际上,缓冲区是你编辑的文件
的副本。你修改完缓冲区,就把缓冲区的内容写进文件。缓冲区不仅存放文件内容,而且
还存放着全部标记,设定,以及其它跟被编辑文件相关的东西。


隐 藏 的 缓 冲 区

假设你在编辑文件 one.txt,同时又要编辑文件 two.txt。你本来可以简单地用 ":edit
two.txt" 来办到,但由于你已经修改了 one.txt,那样做就没用了。而你又不想在此时
就把 one.txt 存盘。Vim 可以为你解决这个问题:

        :hide edit two.txt

缓冲区 "one.txt" 从屏幕消失,但 Vim 仍然知道你在编辑这个缓冲区,因而保留着它修
改过的文本。这样的缓冲区称为隐藏的缓冲区: 缓冲区存放着文本,但你看不见它。
   命令 ":hide" 的参数是另一个命令。它使得那个命令表现得就像 'hidden' 选项已被
设定。你也可以不用 ":hide" 命令而设定 'hidden' 选项。其作用是当离开任何缓冲区
时,该缓冲区变成隐藏。
   小心!当你的隐藏的缓冲区已经改动,千万不要在所有缓冲区存盘之前就退出 Vim。


非 激 活 缓 冲 区

   一个缓冲区一经使用,Vim 就记住了一些有关该缓冲区的信息。即使它既不显示在窗
口内,又非隐藏缓冲区,它也仍然在缓冲区列表上。这样的缓冲区称为非激活缓冲区。一
般而言,

   激活         显示在窗口内,并加载文本
   隐藏         不显示在窗口内,但加载文本
   非激活       不显示在窗口内,不加载文本

非激活缓冲区不会被遗忘,因为 Vim 保存着关于它们的信息,如标记等。而且记住文件
名有个好处,你可以调阅你编辑过的文件名,再次编辑它们。


缓 冲 区 列 表

你可以用这个命令查看缓冲区列表:

        :buffers

另一个作用相当的命令,虽然意思不那么明白,但键入时省事多了:

        :ls

其输出可能像这样:

1 #h "help.txt"                      line 62
2 %a+ "usr_21.txt"                    line 1
3     "usr_toc.txt"                   line 1

第一栏存放缓冲区号。你可以利用它来编辑文件,而不用键入文件名,参见下文。
   紧随缓冲区号的是些标志位。然后是文件名,以及光标最后一次停留的行号。
   可能出现的标志位有以下这些 (自左至右):

        u       列表外缓冲区 |unlisted-buffer|。
         %      当前缓冲区。
         #      轮换缓冲区。
          a     激活缓冲区,缓冲区被加载且显示。
          h     隐藏缓冲区,缓冲区被加载但不显示。
           =    只读缓冲区。
           -    不可改缓冲区, 'modifiable' 选项不置位。
            +   已修改缓冲区。


编 辑 缓 冲 区

你可以通过指定其缓冲区号来编辑一个缓冲区,而不必键入文件名:

        :buffer 2

但获知缓冲区号的唯一途径是查阅缓冲区列表。如果不用缓冲区号,你可以用文件名,或
其部分:

        :buffer help

Vim 将为你键入的文件名找到最佳匹配。如果只有一个缓冲区与之匹配,该缓冲区就被选
用。在这个例子中,被选中的就是 "help.txt"。
   要在新窗口中打开一个缓冲区:

        :sbuffer 3

这方法也适用于文件名。


使 用 缓 冲 区 列 表

你可以用这些命令在缓冲区列表间移动:

        :bnext          编辑下一个缓冲区
        :bprevious      编辑前一个缓冲区
        :bfirst         编辑第一个缓冲区
        :blast          编辑最后一个缓冲区

要从缓冲区列表上删除一个缓冲区,用这个命令:

        :bdelete 3

同样,这命令也适用文件名。
   如果你删除了一个激活的缓冲区 (显示在窗口中的缓冲区),你也就关闭了该窗口。如
果你删除了当前缓冲区,你也就关闭了当前窗口。如果它是最后一个窗口,Vim 将找一个
缓冲区来编辑。你无法什么也不编辑!

        备注:
        即使用 ":bdelete" 命令删除了缓冲区以后,Vim 依然记得它。这个缓冲区实际
        上成了 "列表外" 缓冲区,它不再出现在 ":buffers" 命令所报告的列表中。不
        过 ":buffers!" 命令仍会列出 "列表外" 缓冲区 (没错,Vim 无所不能)。要让
        Vim 彻底忘记一个缓冲区,用 ":bwipe" 命令。另见 'buflisted' 选项。