显示标签为“学习”的博文。显示所有博文
显示标签为“学习”的博文。显示所有博文

星期五, 六月 08, 2007

word 排版问题

今天对word排版的时候又发现了两个问题,现在已经全部解决,和大家分享一下吧。
1.在插入脚注以后,对本页的部分内容分栏的时候,分栏以后会跳到下一页,而这一页留下一大块空白。
解决的方法:选择“工具”->“兼容性”,然后把“按Word6.x/95/97的方式排放脚注”,这样就ok了。
2.在分栏以后左右两栏不齐的问题,解决的方法有两种:
(1)分栏的时候,选中文本时,最后一个回车符不能选,就是选到最后一个符号,然后分栏就可以对称了
(2)将光标移动到文章的 -->末尾处,然后点击“插入”菜单下的“分隔符”,在对话框中选择“连续”,确定即可。
今天就说到这里了,希望能对大家有所帮助。

星期六, 六月 02, 2007

Google工程师: 对学生朋友的一点建议

自去年春天加入谷歌,我曾多次随公司校园招聘团队一起走访各地院校,帮助公司发掘人才。利用这样的出差机会到处走走看看,饱览祖国大好河山,是我一点小小的私心。但更具挑战性、更激动人心的,还是和我未来的同事们过招,不打不相识嘛。一想到马上就要和这样优秀的人才一起工作,我就兴奋不已,真恨不得现在就买一张单程机票把他/她拽回北京。
然而,在面试过程中,我也相当惋惜地看到,由于种种主客观原因的限制,很多青春韶华的学子未能充分发挥出他们应有的潜力。这里我不讲成绩,只把我遇到过的一些普遍的问题归纳一下,希望对即将踏入社会的学生朋友们能有些许帮助。
实战!实战!
纸上得来终觉浅,绝知此事要躬行。对于一个未来的软件工程师来说,实际编程经验是相当重要的。我们会要求应聘者在紧凑的时间内编写大量的代码,从中考察应聘者的分析能力,编码速度,代码可读性,对所用编程语言的掌握程度,对边界条件与异常状况的处理,数据结构与函数接口的定义,程序运行的效率和应聘者查错纠错的能力等等。一口气列出这么多要求,听上去似乎过于苛刻,其实只要积累了足够的实战经验,每一个应聘者都完全可以满足这些最低限度的要求。
我记得开复对于青年学子们有一个建议,大学四年,至少要编写 10 万行代码。不是每一个人都期望进入谷歌这样的顶级技术公司,但即使对开复的建议打个三折,也还有 3 万行呢,不努力,能行嘛。前来应聘的学生们在编写代码时暴露出这样那样的问题,大都可以归结到同一个原因:锻炼太少。比如"for (int i = 0; i < strlen(s); ++i)",没有实战经验的人,怎么可能意识到暗藏其间的效率陷阱。再比如内存泄漏,就和初恋一样,没有亲身经历过的人,不会有刻骨铭心的感受,而一旦经历,终身难忘,根本用不着你有多聪明。遗憾的是,我看到许多相当聪颖的学生写出来的代码只能用惨不忍睹来形容,真让我怀疑这是不是就是他们的第一次。大家不要怪谷歌要求高,恕我直言,如果不能持之以恒,下点儿苦功夫,不光谷歌一家,其它公司恐怕也是进不去的。
北京、上海等地的学生,往往有更多实习、兼职机会,接受锻炼之余,还能攒下一笔小钱作零用之资。其它一些地区的学生也许就没有这么幸运,这就尤其需要积极主动,寻找机会,创造机会,把握机会。世界正在变平,互联网的发展改变着地球的面貌,让不发达地区的学生也能相对容易地接触到发达地区的资源。前不久我在西安遇到一个学生,他半年来一直坚持在北京大学的 ACM 网站上参赛、做题,我看他写出来的程序就确实比他大多数同学都要好一些。我相信,只要他能够持之以恒,还会取得更大的进步。我听说浙江大学的 ACM 网站、TopCoder 网站也都是不错的教育资源,感兴趣的同学不妨一看;虽说做竞赛题距离真正的软件开发还有着显著差别,但也不失为一个不错的出发点。
在积累一定编码量的基础上,我建议大家总结经验教训,不断提高自我。如果几万行代码写下来,学 C++ 的不知道 const 怎么用,学 python 的没听说过 GIL,我看也没什么意思。到了这个阶段,我推荐大家读一些经典的进阶书籍,例如《Effective C++》、《Effective Java》等,即使地处偏远地区,也可通过网上书店买到。(我建议编码量太少的同学就先不要读了,会走火入魔的。我见过有学生连引用和指针都没搞清楚,就在那里重载操作符的。)交流也很重要,如果能够与网上网下志同道合的朋友互相帮助,共同进步,当收事半功倍之效。在这一方面,各校的 Google Camp 也许能够起到一定作用。
"我会写代码呀,为什么谷歌不要我?"
一家外包公司或许会满足于雇佣仅能从事简单的、机械性的重复劳动的软件蓝领,而让谷歌苦苦寻觅的,乃是最优秀的软件工程师兼计算机科学家——是的,在谷歌,研究与开发融为一体,软件工程师与计算机科学家当然也合二为一。计算机这几年算是比较热的,能够得偿所愿挤进计算机科学相关专业的学生都是全中国顶尖的人才,如果大学四年荒芜学业,未能取到真经,浪费了这一来之不易的学习机会,是不是太可惜了呢。
遍历一个数组或链表的时间复杂度是多少?对于这样一个不是问题的问题,竟然各地都有相当数量的学生回答说是 O(logN)!有一次我实在忍不住了,提示应聘的学生说:"你是如何理解'遍历'一词的涵义呢?"他立刻做恍然大悟状,回答说:"哦,对,应该是 O(NlogN)"。我当时失望得一句话都说不出来。类似的例子还有很多。坊间一直传说谷歌的面试题有多难,其实大多数学生都卡在最基础的问题上。少数人费尽气力要收集谷歌曾经用过的面试题,其实我们大多数题目都来自或改编自经典计算机科学教材的习题。
顺便提一句,上面提到的那个答错的学生乃是一流大学中成绩名列前茅的优秀生,门门功课(包括所有计算机专业课)均在 90 分以上。反差何其大也!
诚信为本
我曾服务于多家公司,注意到不同的公司之间,乃至同一公司内不同的面试官之间,对应聘者的要求都会有所差别,或看重潜质,或偏好经验,或强调态度。但有一点大家是共同的:如果应聘者在诚信上有疑问,谁也不敢要。
总体而言,现在的学生其诚信还是相当不错的,大大超出了我们的期望。然而,不和谐音也还是有的。我们曾在某著名高校进行笔试,就发现有学生严重作弊,他们毁掉自己的机会不说,整个学校的名声也受到拖累。面试中偶尔也能遇到诚信堪忧的学生。有一次我出了一道题,前来应聘的学生明明以前见过这道题,却告诉我说没见过,自以为得计,可他那一纵即逝的狡黠一笑哪里逃得过我洞若观火的锐利眼神。大哥,你又不是专业演员,为什么要玩这样的花招?我每年面试的求职者在百人以上,捣鬼是过不了我这一关的。两点之间直线最短,说真话最简单。
做最好的自己
不是每一个人都会加入某一家具体的公司,但每一个人都可以成功,成为最好的自己。我这里所谈,既不系统亦欠简练,但确实是我在几次校园招聘之旅中发现的一些具有共性的问题,故不避好为人师之讥,罗列于此。我当然知道,本文的首要目标读者——大一新生是不听劝的,他们更愿意把所有的错误亲自重犯一遍。话虽如此,只要能够对一个学生有所启迪,我的时间就不算白费。

星期五, 六月 01, 2007

如何去掉word中的分隔符

Word中的分隔符是个统称,包含分页符、分栏符、换行符等等,先搞清楚是哪一种,再进行如下操作:
一、在当前文档,选择菜单:编辑/替换,在替换对话框中单击“高级”按钮,再单击“特殊字符”按钮;
二、在特殊字符的右拉菜单中找到相应的分隔符,选择它,这就是查找内容;
三、在“替换为”框中什么也不要输入,全部替换。如果,有不同的几种分隔符存在需要去掉的话,可以重复进行,选择不同的分隔符,进行这种替换,就可以快速的进行去掉分隔符了。
具体问题具体分析!
退格键就能去掉
[工具]-[选项]-[视图]-格式标记-段落标记(去掉对号)

星期六, 五月 12, 2007

获得系统时间

唉,伤心呀!本来以为昨天那个gettimeofday()函数可以解决问题,但是经过测试还是和clock一样,当程序运行的时间比较长时,他的计算结果还是错误的。白白等了快3个小时。上网搜索了一下,别人也出现过这类问题,但是没有找到解决的方法,难道真是bug?
今天又找了一种方法,获得系统的时间,不过这种方法只能精确到s,现在也只能这样了,再等上他3个小时看看,呵呵。
下面是linux下获得系统时间的方法介绍:
#include //C语言的头文件
#include //C语言的I/O
void main()
{time_t now; //实例化time_t结构
struct tm *timenow; //实例化tm结构指针
time(&now);//time函数读取现在的时间(国际标准时间非北京时间),然后传值给
nowtimenow = localtime(&now);//localtime函数把从time取得的时间now换算成你电脑中的时间(就是你设置的地区)
printf("Local time is %s\n",asctime(timenow));//上句中asctime函数把时间转换成字符,通过printf()函数输出}
注释:time_t是一个在time.h中定义好的结构体。
而tm结构体的原形如下:
struct tm
{ int tm_sec;//seconds 0-61
int tm_min;//minutes 1-59
int tm_hour;//hours 0-23
int tm_mday;//day of the month 1-31
int tm_mon;//months since jan 0-11
int tm_year;//years from 1900
int tm_wday;//days since Sunday, 0-6
int tm_yday;//days since Jan 1, 0-365
int tm_isdst;//Daylight Saving time indicator
};

星期五, 五月 11, 2007

程序运行时间的函数

前几天一直用c语言下的clock()这个函数来计算串行和并行程序运行的时间,发现当运行的时间比较少的时候,串行clock计算的时间是正确的,但是当运行的时间比较长的时候(比如几个小时的时候),发现相减的结果有时候是负数,有时候即使不是负数,但是结果也是肯定不对的,Google了一下,没有找到原有,难道是溢出造成的?奇怪!
然后下午只能用其他的函数来计算程序运行的时间,突然发现用clock来计算并行程序运行的时间的时候,得倒的结果也是错误的,唉,郁闷呀,好了好几天测的结果都得重新测试了。
下面记录一下linux下这个计算程序结果的方法,经过测试发现,这个方法不仅可以用在串行算法中,用在并行算法中得倒的结果也是正确的。下面就是用这个方法测试程序结果的一个实例:
首先是这个方法的函数和数据结果
#include
int gettimeofday(struct timeval *tv,struct timezone *tz);
strut timeval
{ long tv_sec; /* 秒数 */
long tv_usec; /* 微秒数 */
};
下面就是实例:
gettimeofday将时间保存在结构tv之中.tz一般我们使用NULL来代替.
#include
#include
#include
void function()
{
unsigned int i,j;
double y;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
y=sin((double)i);
}
main()
{
struct timeval tpstart,tpend;
float timeuse;
gettimeofday(&tpstart,NULL);
function(); gettimeofday(&tpend,NULL);
timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+ tpend.tv_usec-tpstart.tv_usec;
timeuse/=1000000;
printf("Used Time:%fn",timeuse);
exit(0);
}

星期三, 五月 09, 2007

调试最终通过

今天虽然忙碌了整整一天,但是过得很充实(调试了一整天的程序)。昨天的程序虽然通过,但是还有错误,但是今天是真正的通过了。特高兴,呵呵。而且有种成就感。
以前的程序都是根据一篇英文的论文写的一个算法,但是今天突然发现完全根据那篇论文写的程序,得倒的结果非常不理想,和论文上的实验结果存在很大的差别,不知道是自己没有没有真正理解了论文的思想还是论文的数据有造假的嫌疑,呵呵(这句话夸张了点)。
今天对数据进行了仔细分析,对原有算法的思想稍微改了一下,发现结果好了很多。不知道这点改进能不能算一个创新,不知道能不能当作论文的一个创新点,那也不管了,就这样写了,呵呵。这样看来创新不是坐着想就能想出来的,是通过自己的动手去发现问题并解决问题的时候得到的。明天开始测试数据,开始准备写小论文。
祝所有正在看此文章的朋友们也能在学习、工作上有所突破,晚上睡个好觉。呵呵。

星期二, 五月 08, 2007

调试通过

调试了很久的程序,今天下午终于运行正常了,在这里留个纪念吧,不过还有点小小的问题,呵呵。
下一步应该改善一下程序了,使他的运行效率更高,而且还得想想能有什么改进的地方,也就是创新吧。 想想ing ...。
希望能有所突破吧,要努力了。

星期六, 五月 05, 2007

矩阵运算和文本处理中的分类问题

我在大学学习线性代数时,实在想不出它除了告诉我们如何解线性方程外,还能有什么别的用途。关于矩阵的许多概念,比如特征值等等,更是脱离日常生活。后来在数值分析中又学了很多矩阵的近似算法,还是看不到可以应用的地方。当时选这些课,完全是为了混学分的学位。我想,很多同学都多多少少有过类似的经历。直到后来长期做自然语言处理的研究,我才发现数学家们提出那些矩阵的概念和算法,是有实际应用的意义的。
在自然语言处理中,最常见的两类的分类问题分别是,将文本按主题归类(比如将所有介绍亚运会的新闻归到体育类)和将词汇表中的字词按意思归类(比如将各种体育运动的名称个归成一类)。这两种分类问题都可用通过矩阵运算来圆满地、同时解决。为了说明如何用矩阵这个工具类解决这两个问题的,让我们先来来回顾一下我们在余弦定理和新闻分类中介绍的方法
分类的关键是计算相关性。我们首先对两个文本计算出它们的内容词,或者说实词的向量,然后求这两个向量的夹角。当这两个向量夹角为零时,新闻就相关;当它们垂直或者说正交时,新闻则无关。当然,夹角的余弦等同于向量的内积。从理论上讲,这种算法非常好。但是计算时间特别长。通常,我们要处理的文章的数量都很大,至少在百万篇以上,二次回标有非常长,比如说有五十万个词(包括人名地名产品名称等等)。如果想通过对一百万篇文章两篇两篇地成对比较,来找出所有共同主题的文章,就要比较五千亿对文章。现在的计算机一秒钟最多可以比较一千对文章,完成这一百万篇文章相关性比较就需要十五年时间。注意,要真正完成文章的分类还要反复重复上述计算。
在文本分类中,另一种办法是利用矩阵运算中的奇异值分解(Singular Value Decomposition,简称 SVD)。现在让我们来看看奇异值分解是怎么回事。首先,我们可以用一个大矩阵A来描述这一百万篇文章和五十万词的关联性。这个矩阵中,每一行对应一篇文章,每一列对应一个词。 在上面的图中,M=1,000,000,N=500,000。第 i 行,第 j 列的元素,是字典中第 j 个词在第 i 篇文章中出现的加权词频(比如,TF/IDF)。读者可能已经注意到了,这个矩阵非常大,有一百万乘以五十万,即五千亿个元素。
奇异值分解就是把上面这样一个大矩阵,分解成三个小矩阵相乘,如下图所示。比如把上面的例子中的矩阵分解成一个一百万乘以一百的矩阵X,一个一百乘以一百的矩阵B,和一个一百乘以五十万的矩阵Y。这三个矩阵的元素总数加起来也不过1.5亿,仅仅是原来的三千分之一。相应的存储量和计算量都会小三个数量级以上。 三个矩阵有非常清楚的物理含义。第一个矩阵X中的每一行表示意思相关的一类词,其中的每个非零元素表示这类词中每个词的重要性(或者说相关性),数值越大越相关。最后一个矩阵Y中的每一列表示同一主题一类文章,其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵则表示类词和文章雷之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,w 我们就可以同时完成了近义词分类和文章的分类。(同时得到每类文章和每类词的相关性)。
现在剩下的唯一问题,就是如何用计算机进行奇异值分解。这时,线性代数中的许多概念,比如矩阵的特征值等等,以及数值分析的各种算法就统统用上了。在很长时间内,奇异值分解都无法并行处理。(虽然 Google 早就有了MapReduce 等并行计算的工具,但是由于奇异值分解很难拆成不相关子运算,即使在 Google 内部以前也无法利用并行计算的优势来分解矩阵。)最近,Google 中国的张智威博士和几个中国的工程师及实习生已经实现了奇异值分解的并行算法,我认为这是 Google 中国对世界的一个贡献。

星期六, 十一月 25, 2006

六级

马上又要考六级了,唉,愁!!现在都不想复习了,听力实在是听不懂,前几次的听力都是蒙上去的。虽然现在六级和学位不挂钩,可是好像找工作的时候比较好多的单位都要求六级。
从明天开始好好复习六级,特别是听力,争取能考过吧,也希望能坚持下去。