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还是非常方便的。