Tag Archives: 程序

使用Matrix67的数据挖掘方法为博客作用词分析

今天早上看到Matrix67的《互联网时代的社会语言学:基于SNS的文本数据挖掘》一文,如获至宝。我很久以前也做过人人网流行的日志中喜欢用哪些词的 实验,不过仅仅使用程序抓取网页和获取二字组合,然后还要依靠人工来筛选正确的词语,这种方法效果并不好,而且最后也没能得出什么非常有趣的结论;而 Matrix67这篇文章非常通俗地讲解了作者使用的中文抽词方法和热度分析方法,这些方法巧妙却不复杂,得到的效果还相当不错,使我不可救药地踏上了亲 自把它实现一遍的征程上。

首先我用Python实现了Matrix67的中文抽词方法,并把这种方法应用在自己博客的rss上,然后把抽取得到的词语按照出现频率排序,得到的结果如下:

什么,我们,自己,大学,东西,可以,没有,作业,我的大学,所以,如果,时间,因为,文章,那么,现在,其实,大作业,比如,知道,障碍,代码……

看起来效果非常不错,于是我又尝试了另外几位朋友的博客。首先是橘子的,结果如下:

面试,公司,然后,什么,最后,没有,开始,应该,时间,测试,题目,这样,项目,怎么,大家,我们,自己,香港,由于,可以,实习,其实……

以及sqybi童鞋的:

算法,没有,诚哥,言叶,世界,置换,页面,可以,网页,自己,内存,如果,已经,所以,列表,我们,之后,因为,什么,开始,那么,过程,页面置换……

(一开始看到“诚哥”这个词语我还以为是哪里抽词出错了,后来仔细看了下sqybi童鞋的博客发现原来这个真的是个词语……)

这段程序的源代码被我放在了gist的上面,有兴趣的同学可以猛击这里。 抽词的结果非常好,但是这个结果还是有些问题:一是直接访问博客的rss只能获取最近10篇左右的文章,样本太小,不能充分反映这个博客的特点;二是各个 博客得到的抽词结果中出现频率较高的一般都是像“可以”、“没有”、“什么”这类非常常用的词语,不同的博客之间的差异不能够鲜明地反应出来。解决前一个 问题的方法是使用Google Reader,在浏览器中输入”http://www.google.com/reader/atom/feed/http://www.liyaos.com/blog/feed?n=100″这种链接便可以获取一个博客最近的100篇文章(需要先登录Google Reader,这使得直接用程序访问变得有点麻烦,不过我直接采用了在浏览器打开这个页面然后保存到本地,再用程序读取),格式为Atom,和rss很 像,也都可以使用Python的feedparser来轻松解析。解决后一个问题,则是Matrix67的文章后半部分提到的贝叶斯方法。

于是我使用前面的程序分析了以下数个博客(排名不分先后,嗯 = =):

把以上博客分析的所有结果作为总的词语库,然后再对每个博客使用Matrix67的文章中给出的概率公式进行计算,然后把得到的词语按照其概率值从大到小排序。以上博客的词语前10名分别为:

优哉·幽斋

我的大学,寻欢,词语,诗音,一段,梦里醉逍遥,大哥,中国人,学期,障碍

(“我的大学”来自《我的大学》系列,“寻欢”、“诗音”和“大哥”来自《多情码农无情码》)

SQYBI.COM

赫萝,诚哥,言叶,你们,罗伦斯,方茴,安竹,季安竹,李暮霭,远子学姐

(……这些都是什么啊……)

伸手即到梦想

期末,接着,成都,排队,假期,实习,福州,香港,世博,一趟

(显然高富帅的生活很丰富啊 = =)

静观己心,厚积薄发

太太,奶奶,三奶奶,姑娘,丫头,未央,老太太,三太太,笑道,素馨

(……………………我快笑惨了)

非人磨墨墨磨人

一个,成为,冯至,拉里,袁枚,里尔克,毛姆,那样,文学,十四

(虽然不知道博主在说什么,但是看起来好厉害的样子)

学而时嘻之

学家,根本,能力,原子,经济学,际上,最好,我认为,科研,辐射

(这篇博客的文章里讲什么学家的都有……所以“学家”就被当作词了,看来是信息熵的阈值还不够大,不过我的实验样本也不够大所以把阈值调大效果不一定会更好……)

宇宙的心弦

原理,怪物,动量,定义,几何,力学,角动量,收益,量子,液氮

(一看就知道学什么的……)

考据癖

考据,起床,笑声,星期五,胡克,培根,说法,蚊子,发音,星座

(考据癖什么都考啊……)

嗯,这个结果相当有趣的吧。

PS:本来还想拿来韩寒、蒋方舟的博客分析一下,但是这两个家伙的新浪博客都不提供全文阅读,只好作罢。

Common Lisp学习笔记(1):语法和语义

按:本文是我在阅读Peter Seibel所著的Common Lisp教程Practical Common Lisp(免费在线阅读地址:http://gigamonkeys.com/book/)的学习笔记。本篇主要依据于原书的第四章Syntax and Semantics,主要的内容也如其题目所描述,是Common Lisp的语法和语义。

之前已经在这个博客上发表过《Common Lisp学习笔记(0):从SLIME开始》,不过后来由于课业比较忙,虽然还是能抽出些时间继续阅读这本书,但是一直没来得及写一些后续的笔记。而在这期间,我发现竟然有一位名叫田春的程序员翻译了这本书,并且在今年10月出版,于是我也购买了这本书。既然前面阅读英文原版得到的东西在现在已经记得不太牢靠,我打算凭借这本中译本来帮助我回忆这些内容,形成这些笔记,同时我依然会拿英文原版做对照。

注意虽然Common Lisp是Lisp的一种方言,二者并不相等,不过为了方便起见下文中我不会对Common Lisp和Lisp做太多刻意区分,大多数情况下以Lisp代指Common Lisp。

目录

Continue reading

我的大学(27):写在末日的边上

我们都好引用孔子在川上曰的一句话:“逝者如斯夫,不舍昼夜。”这不,前面我们刚考完编译原理,一转眼这就2012了。话说此时距离孔子发出他 那句著名感叹不知道已经有二千几百年了,那位当年说“未知生,焉知死”的那个“丧家犬”现在早已成了死透了的至圣先师,估计如果教他现在说些什么,如果他 还能说话的话,说的该是“既知死,犹不知生”吧?所以面对这种情境似乎有两种态度,一是既然终究要知道“死”,不如趁现在好好研究“生”;另一种是既然怎 么着都研究不出来“生”,那还不如研究毛线好了。

列位看官!不好意思,前面我扯偏了。这篇日志的本来目的是在这个特殊的时节,谈一谈已然一头扎死到历史的尘埃中去的2011,以及那个久负盛名、如 今终于“犹抱琵琶半遮面”地登场的2012。所以前面的开头的本来目的是从用第二句话同时“花开”这前面所提到的“两朵”,然后用串行的方式“各表一 枝”。可惜一不小心我的键盘就滑了一下,我的膝盖好像也顺便中了一箭。其实我似乎一直不太擅长写一篇条理清晰、逻辑顺利的文章的,这个是我从我这学期n次 做答辩和presentation的经历,以及写某些稍显严肃的文章的时候的体会中得出的。不过写文章做不到“浑然天成”似乎也不是太大的问题,也许我还 有一个努力的方向是“离题万里”,“浑然天成”。

嗯,上面那么一段话看起来似乎有废话和再度偏题的嫌疑,不过仔细掂量下可以发现,这也是我在逝去的2011年所得的诸多体会之一,所以目前还可以说 是按计划进行。昨天(仍是2011年的时候)和前天就看到有不少人在写2011年的总结,当时我就在想,这2011可是还没断气呢!所以我忍到了这个时候 才开始写2011年的总结(真的不是因为当时在预习编译原理吗?)。

前一段校内上流传这么一段话:“一花一世界,一叶一菩提。一天一本书,一周一学期。”我读到这句话的时候真想拍案叫绝,不过桌子实在是太乱了,如果 真的拍了我电脑旁边堆的那一摞才翻过和正要翻的书估计就要塌掉了。这句话真的挺形象的,不过和我们学院的真实情况还是有蛮大的差距,因为我们除了期末考试 还有各种照着你的膝盖上射箭的大作业。我猜想,如果教我现在谈起当初调MINIX调度器,写DSDV算法,还有写编译大作业的三地址代码生成部分和面向对 象大作业的某个usecase的代码时候的情景,会不会有种谈起“哥当年军训的时候”的感觉?

我觉得2011年这一年的软院生涯还是让我学到了不少东西的。但是每当我思考到底是什么让我学会了什么的时候,我却会有点茫然。比如说我似乎是从大 二下学期的软件工程课程大作业中学会了点Struts,还有些JavaScript,但是这些好像都不是那门课所教授的内容。再比如说我在这一年刚刚开始 使用Linux,而我使用的第一个Linux似乎是MeeGo,使用后者是为了参加Intel的一个比赛,可是可以说参加那次比赛的经历教会了我使用 Linux吗?好像不是的,似乎是因为后来我给自己的电脑安装了Fedora然后这么一路折腾出来的。那么从参加那次比赛的经历中我到底学到了什么?我还 真不知道怎么回答。再比如说我通过大三上学期的编译原理课程大作业里学到了什么?词法分析和语法分析部分似乎只学会了怎么使用JavaCC这个工具,而后 来的第二次大作业类型检查和三地址代码的内容我手工实现了三地址代码的生成,不过这部分我似乎没用到什么课本中的知识,就那么自己写着来实现,实现得并不 美观,而实现之后我也不知道美观的写法应该是什么样子,我依然不清楚我从其中学到了什么。

其实我根本没有想明白的还有一个问题,那就是怎样才叫学到了什么。比如我学会了使用JavaCC这种工具,但这又算学到了什么?又比如说,大二下学 期的软件测试课程,可以说我学会了(至少当时学会了)使用WinRunner这个软件对Win7自带的计算器进行一些测试,so what?雷哥常用句式里有一种“不就是XXX吗”,比如说你和他讨论“解析HTML”这么一个话题,他会说:“不就是给你一句话让你生成一些图形吗?” 或者给他看一些很炫的GUI程序,他会说:“不就是一些调用现成库的逻辑吗?”(不是原话,意思应该相差不大)每次碰到这种情况我会发现我还真不知道怎么 回答,而且说实话我还真觉得他说的是那么回事,所以我每次的回答都是“是”。当然雷哥好像并不是达到了那种视红颜如尘土、视算法以外的一切如民工活的境 界,因为我记得当初问他老人家实现shell是不是就是调用各种系统调用的时候他告诉我怎么设计这个程序的逻辑什么的也是挺难的。不过这是题外话了。

我还记得大二下学期的时候,虽然我在软件工程概论课程上做课堂演示的时候是很自信的样子(当然当时我也确实很自信,虽然现在越来越能感觉到当初那次 大作业我们的作品里有很多糟糕的东西,但是我对那个时候我们做出那样的作品依然感觉很自豪),但是其实那一段我一直有种沮丧感的。我记得当时我是这么想 的,一个人比另一个人强分为两种:一种是我比你多看了一些东西;一种是我就是比你厉害。当时的我相信我自己是比某些人(泛指)强的,但这种“强”似乎仅仅 是因为我比他们多看了一些东西罢了。换言之,如果他们也看了这些东西那么我们就没有任何差距了(毕竟在这个现实世界里阿基里斯还是可以追得上乌龟的)。我 现在会使用WinRunner对Win7自带的计算器进行测试,你现在不会,但这又如何?我现在会使用Struts,你现在不会,但这又如何?

我们前面讨论的我没想明白的问题又是一个让我非常沮丧的事情,虽然貌似在过去的2011一年里我学了很多东西,至少我可以列出来一大堆新学了的东 西,但我却很少能说出来我学到了什么东西。戴着这些轻飘飘的名词,就好象表面上看来你坐在帝王的位子上,但你旁边却站着伊尹、霍光或者曹操。不过也许我之 前对一个人比另一个人强的情形划分还是太过简单,毕竟“我比你多看了一些东西”还包含别的情形,比如说“我比你多看了几十年的东西”——换言之,至少你还 是可以比别人多学一些东西,而这些东西他可能要很久才能赶上。这似乎又是一个“术业有专攻”的范畴的问题了,只是在做过对于一个大三学生来说貌似也不算少 的项目以后,我却还没有想清楚我将来到底想在这茫茫代码地,钻到哪个坑里去。

Continue reading

多情码农无情码注(1)

一个喜欢读小说的人很容易萌生写小说的想法。自小学拿着钢笔在笔记本上胡写,到大学拍打键盘在另一种笔记本上乱侃,期间我曾萌生过写小说冲动的 次数早已难以计数,然而真正动笔下的并不多,写完的几乎没有,而写完了如今自己觉得还能看的则是完全没有。那些故纸堆里的故事大约全是历史或者武侠,而最 近写小说的冲动再度出现以后,却忽然想写一点新鲜的东西。我构思过一个发生在交大的武侠故事,想到过一个关于程序员和2012的科幻故事,但是毕竟少经历 练,下笔总觉得生涩,结果也远无法使自己满意;直到后来忽然想到一个新方法,即借助古龙的小说《多情剑客无情剑》(即“小李飞刀”的故事)。

《多情码农无情码》借用了古龙的小说《多情剑客无情剑》里的人物,在一定程度上参考了他们的性格,但却把他们安插在了一个完全不同的时代——“飞刀 与快剑”变成了“鼠标与键盘”。然而,《多情码农无情码》的故事发生在《多情剑客无情剑》以前——这么说可能会让人困扰,因为明显古龙的故事里计算机还没 有被发明,不过我指的是关于李寻欢、林诗音、龙啸云三个人的情感纠葛发生在古龙的故事以前。选择这个故事是因为一方面它既是古龙讲述过的一个故事,同时又 没有讲得太细,这就意味着它给了我一个故事的框架,同时还留给我许多自由发挥的余地。

写这部小说显然无意出书之类的事情,可能更多的是个人兴趣,也希望能对自己还很拙劣的写作水平(虽然得过不少夸奖,但幸好我有时候很能找回一些自知之明)进行一些探索和锻炼。而这篇注,不妨说是让自娱自乐的high更high一点。

第一章注

这一章的第一段我试图给整个小说奠定一个世界观的基调——用理工科的思维来讲述一个故事。所以采用了维度这样一种世界观来起头。李寻欢、林诗音和林啸云都是程序员——或多或少,我希望在我在描写不同的人物视角时能写出不同的感觉。

第三段花了那么长的句子描述李家庄园里的各种高科技设备也是为了交待时代背景。

虞世南的介绍可以参看这里。我之所以在这篇注里也不怎么介绍他是因为其实我也不了解他,他是我写这一段的时候从书法家中胡乱揪出来的一个。

男性在看到美女后智商会下降的研究不是我编出来的,我原本阅读的那篇文章一时找不到了,但是这里有一篇似乎差不多文章可供参考。

对林诗音的描写花费了很大的篇幅,因为我想要营造出一种龙啸云在见到林诗音以后时间几乎停滞的感觉,就好像电影中在看到一个美女后镜头忽然放慢了一 样。因为如他所说他似乎所有的脑细胞都用来捕捉她的每一个动作每一个细节了。描写林诗音的几个简单动作的篇幅大约相当于前文的篇幅,这一安排其实照应了文 章最开头的龙啸云自己人生的轨迹(前二十多年可以一笔带过,此时此刻忽然具有其意义)。当然这些是我试图取得的效果,如果读者是通过阅读这一段产生的这种 体会(或者阅读完这一段还没产生这种体会),那么显然我并没有成功。另外对于林诗音的描写其实大量抄袭了曹植的《洛神赋》和曹雪芹的《警幻仙子赋》。

JavaScript不止可以用于写网页的一个典型例子便是GNOME3,这款自由软件的很多代码都是使用JavaScript写就的。你可以在这里查看详情。

Continue reading

Common Lisp学习笔记(0):从SLIME开始

按:本文是我在阅读Peter Seibel所著的Common Lisp教程Practical Common Lisp(免费在线阅读地址:http://gigamonkeys.com/book/)的学习笔记。这篇文章的主要内容包括Common Lisp的介绍以及如何搭建Common Lisp编程环境(SBCL + Emacs + SLIME)两部分。因为本文并不怎么涉及Common Lisp的具体知识,所以编号为0。

目录

Continue reading

多情码农无情码(2)

(本故事纯属虚构,如有雷同纯属巧合)

第三章 龙啸云

寒冷是个可疑的朋友。刚刚和寻欢一起踏出他的庄园,走在夕阳下的一片草丛上时,我还暗自庆幸寒冷为我带来了些清醒。但是很快,冷风如刀,一刀又一刀 划在我迎风的脸上,一刀又一刀地夺回了它曾为我带来的那些理智。我不得不把全身一半的精力放在走路上,然后拿另一半来忘却刀锋划过面颊的痛苦。

“今天这样的温度,恐怕空气都要凝固了吧。”当我提出要上山拜谒寻欢的父亲与大哥的坟墓的时候,寻欢这样评论。他还开玩笑地说:“这样的天气上山, 我想我可以想象我的老爸和大哥在奈何桥头看见我们俩的情形。‘寻欢,你怎么也死了?还是冻死的?难道是2012吗?’‘哦,不,老爸,大哥,我只是来看望 下你们。来,我给你们介绍下,旁边这位是我的结拜大哥。’”

但无论他怎么说,我还是坚持要在这一天前去拜谒。在我看来,寒冷的朔风与颠簸的山路更能帮助我表达心中的敬意。当然,坐在沙发上、端着热咖啡、听着 古典音乐谈受苦是一回事,屁股离开沙发走向寒冷的国度却是另一回事。此时的我正一边走着一边在内心里咒骂着当初的我为什么要这样自讨苦吃,但无论如何我可 不愿意现在告诉李寻欢:“天气真的好冷啊,我们还是改天吧。”

幸好寻欢终于停了下来,而我也不禁感激上帝,至少他给这条道路都安排了一个终点。我还以为他会火上浇油地送给我一个栈溢出或者死循环。不过话说回来这时候的我还真希望能有人冲我来个真的“火上浇油”。

“我们到了。”寻欢的宣判把我从迷乱的意识里拉回。“一门七进士,父子三探花”,这样一副对联贴在墓园的门口,似乎在向世界宣告,也许上帝可以夺走 他们的生命,却别想夺走他们的骄傲。每个坟墓的样式还能怎样,一抔土,一方碑,大致无二,但站在这片墓园中,你不可能不从心里生出一种敬意来,尽管那些人 只能躺着,而你却可以站着。

但是显然我这位兄弟对这一景观的理解大不相同。“我早就想把门口的对联给换掉了。什么‘一门七进士,父子三探花’,贴在这里就好像我们李家已经灭绝了似的。可惜我老爸是从来听不进别人的意见的。”寻欢这样评价。

“我大哥死后,老爸总是半夜跑到这座山上来喝酒。”李寻欢带着我走到他父亲的坟墓旁。我在墓前深深地鞠了几躬,趁机活动了下几乎冻僵的身子骨。而李 寻欢则一边直直地看着与墓碑毫不着边的远方,一边这样对我说,“这件事是诗音发现的,她告诉我,然后我就到山上去找他。他不肯走,也不肯说话,我就陪他喝 闷酒。我还记得那天喝的是先帝御赐的特贡茅台,老爸他珍藏了多年的,却在那一晚上被我们两人喝了个精光。喝到最后一杯,他终于对我说:‘你知道吗?人生最 痛苦的事情便是,即使你做出了每一个可能做出的正确选择,你也无法留住他的生命。’”

“‘他’就是你的哥哥,‘大李探花’,是吗?”我直起身子,有些艰难地转头看向李寻欢。

“没错。他也是我们家的第一位黑客。是他从如何打开电脑开始教我,教我C++,教我Python,教给了我几乎一切如今我引以为傲的东西。在十岁以前,我就已经拿到了三个国家级的程序设计大赛的一等奖。”说到这里,寻欢忽然低下头来,“而他却拿到了三张病危通知书。”

寻欢的哥哥“大李探花”自小体弱多病,后来英年早逝,这是让江湖中无数黑客都为之扼腕叹息的事情;更悲伤的是,没过多久,他和寻欢的父亲‘老李探 花’也因为伤心过度而去世。如今这一曾在江湖中如神话般存在的家族,只剩下一人,便是我身边的这位结义兄弟李寻欢——他也是黑客界中公认的李家最牛的一 人,在百晓生搜索引擎制作的黑客谱里排行第三名。谁会不把拥有这样一个兄弟当作一件荣幸的事情呢?于是我拍了拍他的肩膀,他也对我一笑,然后我们又一起乘 着寒风原路返回。

幸运的是返回的时候风向没有恶作剧般地发生变化,所以我终于可以轻松地看着李家的庄园在我的视网膜上渐渐变大。由于不再需要把一半的精力花在脸上, 我终于恢复了一些意识。我开始意识到早些时候我在李家的失态。哦,不,李家那些让geek们感到无比兴奋的近乎科幻世界的场景虽然让我有些恍入隔世的感 觉,却还不至于让我变得像进了大观园的刘姥姥;而是在看到她的时候——对了,寻欢叫她“诗音”,她的名字一定就是门上镌刻的那三个楷体小字“林诗音”—— 我竟变得像宋玉笔下的登徒子。

不,不能这样,我是李寻欢的大哥,也是在江湖中颇有名望的黑客,我可不是没见过女人的工科猥琐男。就这么看上一眼我竟然就呆掉了,我竟然就相信自己 爱上她了,天哪,我是有多么的愚蠢呢!而这个女人——林诗音,多么优雅的名字——一直住在李家的庄园里,更毋庸说她和寻欢有什么样的关系了,我又怎么可以 去有什么非分之想呢?想到这里,我觉得我已经清醒了过来。我觉得我应该为自己的理智感到骄傲。

但这些都是我们回到李家庄园,那个轻盈的身影再度闯入我的视野以前的事情。不到一秒钟的时间内,我忘记了我之前所持有的一切推理,它们在她的美丽面前根本不堪一击。不到一秒钟的时间内,我所有的理智再度臣服于她的石榴裙下。

Continue reading

多情码农无情码(1)

(本故事纯属虚构,如有雷同纯属巧合)

第一章 龙啸云

有人说,时间是这个世界的第四维。如果按照这个说法来看,时间只是一样永恒不变的事物,而我们在其中一个个流逝。我知道我前半生的二十多年岁月,就像是一场无目的的驾驶旅程;直到那一天。

因为在那一天,我看到了她。

那天是在李寻欢的庄园里,我和他一起踏过用电子墨水显示着欢迎和指引信息的珍珠屏幕铺成的地面,穿过一面又一面闪烁着或奇幻、或写实、或抽象、或黑 客风格的壁纸的玻璃墙壁,走过一个使用全息投影技术把全球各地的卫星发来的实时信息拼接在一起显示出来的地球仪。我以一个码农的身份感叹着这一切的美妙, 直到寻欢带我走进一扇门。

那扇门与其他的用玻璃屏幕做成的门都不大相同,因为上面用手工雕刻着“林诗音”三个楷体小字,字体清秀,婉雅,隐约间似乎能看到一些虞世南的风格。那扇门后面的世界,超越了我以前所经历的所有世界。

但是请原谅我在这里无法描写这个房间内的景色布局。这并不是因为那其中太美或者太丑,让我无法找到言语,而是因为事实上在我第一次进入这间房间的时 候,那些景色我全都没有看到——因为我看到了她。在我看到她的那一刻,似乎我的所有的脑细胞都用来处理、生成,并试图捕捉她的一姿一容了;除此以外的世界 的一切,都被忽略了,或者,即使没被忽略,也只是被用来装点的她的美丽而已。据说有科学研究表明,男性在看到美女后智商会下降,我相信就是这个道理。

所以在进入这个房间的那一刻,我看到的只是她,用一种让人词穷的优雅坐在一台电脑前面。她的手指轻轻地敲打着键盘,翩若惊鸿;她的长发慢慢随风抚过 她的肩膀,宛若游龙。我仿佛从来没有看见过女人一般贪婪地看着她。忽然间她停了下来,世界也仿佛在那一刹那静止了。然后,她的头轻轻划过一个美妙的弧线, 于是一双若月射寒江般清澈的眼睛,和两颊如春梅绽雪般素洁的脸庞出现在了我的眼前,她丹唇微启,霞映澄塘,一段如诗般朦胧的声音激活了我的双耳:“你回来 了。”

似乎李寻欢也回答了什么,但我没有听到,也许我听到了,但它在还没有被记忆的一刻就已经被遗忘了。然后我看见那个曼妙的身影忽然站了起来,她身上穿 着的白色长裙也随之飘舞,和背后的显示着一种月景的玻璃屏幕一起印在我的视网膜上,看来似流风回雪,转瞬间轻云蔽月。望之在侧,皎若太阳升朝霞;忽焉在 前,灼若芙蕖出渌波。我傻傻地站在那里,遗忘了一切表情,她却忽然巧笑倩兮:“我给你前几天写的验证码识别程序做了一个GUI,是用JavaScript 写的哦!”

虽然当时我的智商似乎已经下降为0,但我确信在那一瞬间我至少知道了两件事情:一,原来JavaScript不止可以用来做网页;二,我爱上了面前的这位少女。

Continue reading

Fedora 15搭建LAMP环境中可能遇到的问题

LAMP是Linux + Apache + MySQL + PHP这组黄金组合的简称,在网站开发中极为流行。在Fedora这个红帽系的Linux发行版下面搭建LAMP环境是非常简单的,只需要使用yum就可以轻松安装Apache、MySQL以及PHP。但是实际上仅仅使用yum安装这些东西往往是不够的,譬如你可能会发现你所安装的PHP缺少很多扩展,或者MySQL数据库里的表名存在大小写敏感不符合你的习惯,或者在Apache对文件的读写权限上遇到一些非所期的结果,等等。这篇文章记录了一些我在自己的Fedora 15系统上搭建LAMP环境时所遇到的问题和最后的解决方法,因为我这人比较懒散,所以这些方法都是我自己看来最简单的解决方法。其他Linux发行版也可以以此为参考(只是参考!)。

索引:

Continue reading

寻找只出现了2次的数字

在一个存放着数字的数组里,有一个数字出现了2次,其余的都出现了3次,如何找到那个出现了2次的数字?

这是在知乎上看到的一个很有趣的问题。 看到这题我立刻就想到了另一个经典的问题,即在一堆数据里,有一个数字出现了奇数次,其他数据都出现了偶数次,如何找到那个出现了奇数次的数据?一个正常 人的第一反应九成九是哈希,但是事实上这个问题存在一个非常简单、而且时间复杂度非常低的方法,即把所有的数据异或起来,最后的结果就是我们要找的数据。

这个方法乍看也许很玄妙,但其实原理很简单,即两个相同的数异或的结果是0。把所有的数据异或起来,出现了偶数次的数据都在自己和自己异或的过程中湮灭了,于是最后只剩下那个出现了奇数次的数据站在那儿茕茕孑立。

但是如果某个数组里只有一个数出现了为偶数的2次,其余的都出现了为奇数的3次应该怎么办?我一开始囿于成见想了很久怎么用异或来做这件事情,最终 结果是恍然悟出我在做一件多么愚蠢的事情——异或的结果只能让我们想要找的那个数变得如羚羊挂角,无迹可求。想要不借助于哈希这种无聊的办法而得到这题的 答案,必须要使用一种运算让一个数一但出现了3次,就会自我抵消掉。

下面的这个办法不是我想出来的,而是知乎上的一位牛人所给出的。即把所有的数据当作一个3进制数,然后在每一位上,把所有的数据这一位的3进制数加起来,乘以2再对3取模,最后得到的3进制数的值(也就是对应的10进制数)就是我们需要的答案。

这个巧妙算法的原理同样也很简单。一个数字如果出现了3次,那么把3个它加起来一定是3的倍数,即对3取模为0。但是如果一股脑把所有数据加起来再 对3取模,我们只能得到0,1,2三种值,明显离我们的答案存在的可能性相差甚远。所以这个方法又采取了另一个巧妙的思想即把所有数据看作3进制数,然后 在每一位上利用这个原理来处理。这和之前我们提到的那个题目用二进制运算异或有异曲同工之妙。

下面是我用ruby写的一种该算法的实现,具体的实现细节可能和原算法所描述的稍有不同,但主要思想是一致的。

事实上在这个问题上我们还能更进一步地思考,如果一陀数据里只有一个数出现了偶数次,其余的数都出现了奇数次,如何找到那个出现了偶数次的数据?欢迎各位在这里给出你思考的答案。

人人网最流行的那些日志都用什么词

今天读书的时候被启发,想要写一个程序校内网蛋疼文章过滤器,写了一部分发现工作量有点大。恰恰想起过去曾经读到过一篇叫《东风何处是人间》的很有意思的文章,于是转念一想,正好拿起前面写了一部分的程序统计了下校内上那些分享量最高的日志的用词频率。

我用python写了一个程序抓取校内分享栏目里给出的分享量最高的120篇文章,然后对其中所有两字词的出现频率进行统计,最后排序并进行人工筛选。于是这篇《人人网最流行的那些日志都用什么词》出炉了!下面给出统计结果,本人不作任何评论;源代码则附在文章的最后,各位可以在此基础上进一步发掘(以及,我不保证我写的代码没bug……)。

实意名词TOP15:

1,帅哥,295次

2,男人,184次

3,中国,178次

4,孩子,174次

5,蟑螂,171次

6,女人,140次

7,韩国,136次

8,朋友,135次

9,世界,118次

10,时间,113次

11,咖啡,108次

11,妈妈,108次

13,生活,97次

14,永远,96次

15,幸福,95次

注:虽然这里把这些词语算作实意名词,但实际上在文中出现的时候它们未必是以名词形式出现的,譬如“永远”一词,想必大多数出现都不是名词;又如“生活”一词,既可以是名词又可以是动词,所以它在此榜单和下面一张榜单上都有名字。

Continue reading