SQYBI.com

Change is a part of life, and takes part in finding us who we are.

2011年10月16日
by sqybi
9 Comments

Help! My Archlinux (my Gnome 3) crashed!

今天Gnome 3崩了。。。不得已上来求救一下。。。 写一下崩的过程,希望写得还算清楚,不会乱七八糟。。。 崩的过程是,我用gnome-tweak-tool修改主题(是有某个选项卡,上面基本上所有的选项都是修改主题相关的,比如修改icon等等,那一页上的第一个选项)。 刚开始的主题是默认主题Adwaita,后来改成了某个主题(忘了是哪个了),Alt+F2,r,回车,一切正常。 再后来又改了,似乎是Atlanta,然后Alt+F2,r,回车,然后弹出提示告诉我gnome崩溃了,然后有一个选项(没有仔细看,记不清选项是什么了)和一个重启的按钮。 我没动那个选项,直接点了按钮重启。结果重启之后,gdm登陆的部分没有问题,但是进了gnome shell,显示出桌面壁纸就卡住了。状态栏什么的都没有显示,快捷键也都没有作用(至少我试过的都没有作用,比如Alt+F2,Win,以及自己设置的Alt+F3等),不过Ctrl+Alt+Fn切换控制台有效果。 然后尝试解决。最开始想通过修改配置文件把主题改回来,不过找了好久也没找到配置文件。Arch的wiki上有一段关于怎么修改配置文件换主题的介绍,但是可惜的是,我压根就找不到那个文件。 又找了找改主题的方法,所有介绍中基本都是图形界面的程序。有个gnomesettings神马的(名字肯定不是这个,记不清楚了),但是里面找不到theme相关的内容。 之后在/usr/share/themes/文件夹下看到了许多以主题名字命名的文件夹,尝试把Atlanta主题下的文件用Adwaita下的替换,还是不起作用。 再之后卸载gnome(pacman -Rc gnome),重启,重新安装gnome和gdm,问题依旧。 现在的问题就是这样,虽然我觉得最开始的时候大概只要把主题换回来就没有问题了,不过现在这个方法不一定还可行(毕竟已经重新装过gnome了)。这里需要求助的是: 1.如果有人经历过这个问题,求解决方案。 2.如果有人知道怎么在命令行下面改主题 ,求方法。 3.如果有人知道这个问题是解决不了的,也请告诉我,我直接重装。。。 多谢各位! update: 问题已经解决,方法是备份后删除所有配置文件,然后再将有用的配置文件移回。感谢lx各位以及人人上各位的帮助!

2011年09月27日
by sqybi
5 Comments

你的网站价值几何?让PageRank告诉你答案

本文同时发表在果壳网死理性派栏目,传送门:http://www.guokr.com/article/65304/。因为字数原因,所以编辑对死理性派上发表的文章进行了一定的删减和修正。这里发出的是未删减的版本,表示“太理性了,看不懂”的童鞋们可以来围观此文。 如果你安装过Google工具栏,如果你建立过独立博客或个人网站,那么你肯定和PageRank打过照面。而即使是从未考虑建站的读者,也有很大一部分听说过PageRank,毕竟作为Google搜索结果排序的重要依据[1],这个算法已经被广泛应用于网络的每一个角落。而PageRank值的大小,也早已与网站的SEO[2]成功与否紧密相连。 那么PageRank的名称从何而来?PageRank究竟如何准确表示网页重要度,它的算法又是如何高效准确运行的呢?在PageRank的背后,有什么数学理论的支持?且听笔者为您一一道来。 三个孩子和豌豆游戏 从前有一个死理性派老爸,他有三个孩子。老爸是个懒人,他在家里把三个孩子叫做老大、老二和老三。 一天,三个孩子正在玩游戏,老爸把他们叫到身边。“我这里有三十颗豌豆,”老爸说,“我们来用它们玩一个游戏,游戏结束之后按照游戏结果把豌豆分给你们,好不好啊?” “好!”三个孩子异口同声地答应了。 “你们先在这张纸上写下你们喜欢的人,如果你认为另外两个兄弟你都很喜欢,那就把两个人的名字都写下来。比如我知道老二很喜欢老大,那么老二就在纸上写老大的名字。” 三个孩子很快写好了,然后老爸把纸收了上来。老大的纸上写了老二和老三的名字,而老二写了老大,老三写了老二。三个人互相喜欢的结果如图: 老爸清了一下嗓子,继续向孩子们解释规则:“接下来,我会给你们每个人分十颗豌豆。桌上有三个盘子,分别代表你们三个人,豌豆都放在盘子里。在我喊‘预备’的时候,你们要把盘子里的豌豆全都拿到手里。在我喊‘开始’的时候,你们要把手里的豌豆全部平均分给自己喜欢的人。” 老二举手:“那就是说,我每次都要把自己盘子里的豌豆全部拿起来,然后放到老大的盘子里吗?” “没错,”老爸说,“老三和老大也类似。大家都明白规则了吗?” 三个孩子点头。“好,那游戏开始!” 一开始三个孩子盘子里豌豆的情况如图: “预备!”妈妈喊到,“开始!” 三个孩子开始分配自己手中的豌豆。老二把十颗豌豆都给了老大;老三把十颗豌豆都给了老二;老大则是给老二和老三一人分配了五颗豌豆,如图: 三个孩子很快就麻利地分配好了自己手中的豌豆。这时三个人的盘子变成了这种情况: 老大有点不高兴了:“为什么我的豌豆比老二的还少啊?这个游戏不公平!” 老爸说:“这个游戏还没有结束。接下来我还会继续吹哨,你们也还要继续这个游戏,直到你们盘子里的豌豆数不再变化为止。公平不公平,到时候就能看出来了。” 老大虽然有点疑惑,不过还是点头同意了。 就这样,游戏一直进行下去。在下一轮的交换豌豆后,老大的盘子里有了15颗豌豆,老二有10颗,而老三只有五颗。当然故事在这里还没有结束,不过我们的描述要结束了。因为这个游戏将会持续很长很长时间——这点大概是死理性派老爸没有想到的。当然如果继续分下去,豌豆的数量将不再是整数,这一点我们也不深究了,游戏怎么能进行下去,就留给老爸想办法吧。 那么这个游戏最终的结果是什么样的呢?我们可以用电脑模拟这个过程,得出的结果是:老大和老二的盘子里各有12颗豌豆,而老三的盘子里有6颗豌豆。这时候无论游戏怎么进行下去,盘子里的豌豆数量都不会再变化。 网页排名和PageRank 在互联网刚刚发展的时代,人们曾经为网页的排名问题伤透脑筋。网页排名,顾名思义,就是为互联网上成千上万(当然,现在互联网上的网页数量已经不只是成千上万的程度了)的网页按照重要度进行排序。能够得知哪个网页更重要,对搜索引擎的发展十分有帮助——很显然,搜索引擎应该把重要的网页放到搜索结果中比较靠前的地方。 这个问题看起来很容易,但是解决的方法却没有想象的那么简单。 最初,一些比较流行的网页排名算法都很类似,它们都使用了一个非常简单的思想:越是重要的网页,访问量就会越大。于是,许多大公司就通过统计网页的访问量来进行网页排名。但是这种排名算法有两个很显著的问题:一是因为只能够抽样统计,所以统计数据不一定准确,而且访问量的波动会比较大,想要得到准确的统计需要大量的时间和人力,还只能维持很短的有效时间;二是访问量并不一定能体现网页的“重要程度”——可能一些比较早接触互联网的网民还记得,那时有很多人推出了专门“刷访问量”的服务。 有没有更好的方法,不统计访问量就能够为网页的重要度排序呢?在1999年,一篇以拉里•佩奇(Larry Page)为第一作者的论文[3]发表了。论文中介绍了一种叫做PageRank的算法,这种算法的主要思想是:越“重要”的网页,页面上的链接质量也越高,同时越容易被其它“重要”的网页链接。于是,算法完全利用网页之间互相链接的关系来计算网页的重要程度,终于摆脱了访问量统计的框框。 不过,不知道我们的死理性派老爸是不是了解,实际上刚刚他和孩子玩的游戏,就是PageRank算法的运行过程。 PageRank会给每个网页一个数值,这个数值越高,就说明这个网页越“重要”。而刚刚的游戏中,如果把豌豆的数量看作这个数值(可以不是整数),把孩子们看作网页,那么游戏的过程就是PageRank的算法,而游戏结束时豌豆的分配,就是网页的PageRank值。[4] 随机行走模型和马尔可夫过程 PageRank算法的思想基于“随机行走模型”(Random Walk Model)[5]。实际上,PageRank求解了这样一个问题:一个人在网络上浏览网页,每看过一个网页之后就会随机点击网页上的链接访问新的网页。如果当前这个人浏览的网页x已经确定,那么网页x上每个链接被点击的概率也是确定的,可以用向量Nx表示。在这种条件下,这个人点击了无限多次链接后,恰好停留在每个网页上的概率分别是多少? 在这个模型中,我们用向量Ri来表示点击了i次链接之后可能停留在每个网页上的概率(R0则为一开始就打开了每个网页的概率,后面可以看到R0的取值对最终结果没有影响)。很显然Ri的L1范式[4]为1,这也是PageRank算法本身的要求。 于是,整个浏览过程的一开始,我们有: 其中,A是一个表示每一次点击链接概率的矩阵。A的第i列第j行Ai, j的含义是,如果当前访问的网页是网页i,那么下一次点击链接跳转到网页j的概率为Ai, j。 这样设计矩阵A的好处是,通过矩阵A和向量Rn-1相乘,即可得出点击一次链接后每个网页可能的停留概率向量Rn。例如,令R1=AR0,可以得到点击一次链接后停留在每个网页的概率: … Continue reading

2011年05月08日
by sqybi
3 Comments

编译器和它的故事——自展与交叉编译

其实好久以前就想开始动手写这么一篇文章了,不过一直没有时间。现在正好刚考完最后一门期中考试,还是编译原理,就把这篇文章写出来。 要阅读本文,不需要太高深的编译原理知识,甚至不需要编译相关的知识。但是本文也不是面向对电脑一无所知的读者的,你至少要知道: 1. 不管是exe可执行文件还是Linux下的程序,都是一些二进制代码,我们称之为机器语言。这些代码的执行和系统以及CPU都有关。 2. 大部分情况下,编译器是一种将高级语言翻译成机器语言的程序。而任何程序本身也是一些机器语言的代码。 3. 无论是高级语言、汇编语言还是机器语言,实际上都是等价的,唯一有区别的是,越高级的语言写起来越容易(所以我们倾向于尽量多书写高级语言代码);同时,机器语言是可以直接运行的。 如果你觉得上面三条可以理解或者可以理解一部分,那么请继续阅读。 另外,本文中提到的无论是编译的过程还是语言的分类甚至是一些例子,都可以看做是一个简化的模型。实际上,很少有一个exe程序就可以运行的编译器,现代的编译器都是十分复杂的。不过,考虑这些简化模型对我们没有任何坏处,它们和实际情况相差并不很大。 首先我来详细解释一下高级语言和机器语言。 语言的所谓“高级”,实际上界定不是那么明确。不过我们可以确定的是:C++、Java、Python之流比汇编语言更高级,而汇编语言比机器语言更高级。 这里提到一个汇编语言和机器语言的区分。可能有些读者不明白这两个概念的区别,实际上很简单,汇编语言是我们会看到的那些MOV、JMP等命令组成的语言,而机器语言则纯粹是是各种01串。我想没有人会愿意写一个机器语言的程序——实际上,我们学校的计算机组成实验都是用Verilog HDL这种高级语言来完成的,而嵌入式原理实验也是用一种汇编语言完成的;即使是做处理器和单片机,也不会有人愿意去写机器语言,毕竟一大堆01串太坑爹了。 试想,让你用C++写一个从1输出到100的程序,几行代码就可以搞定;而汇编语言则可能需要几十行;机器语言呢,Oh my god,一大堆01000101110110101011111001……,看都看不懂,还写啥啊。 但是上面也提到了,机器语言和高级语言的区别是,它可以直接运行。比如exe程序,实际上它内部存储的就是一些机器语言的代码,机器可以直接阅读这些代码并在处理器中运行它们(这里说的不是完全准确,比如.NET编译出的exe程序实际上是一段中间代码,由CLR解释成机器代码才能运行——不过这可以暂且忽略,就当作我说的是一个简化的模型)。当然程序的运行是依赖机器架构和系统的,不然Wine什么的也就没有用了(什么是Wine?WINE = WINE Is Not an Emulator!有趣的名称递归定义还有很多,不过与本文无关,请自行Google)。 而实际上,是机器架构不同还是系统不同,并不是我们考虑的问题。我们考虑的问题只是,一段代码在A机器和X系统下能否运行,换到B机器和Y系统下又能否运行。就算在A机器和X系统下能运行,如果换成了A机器和Y系统之后不能运行了,那对于我们这也可以看做两台不同的机器(也就是说,A机器和Y系统实际上就可以看做一个新的机器B)。所以之后的描述中,我们不考虑操作系统的情况,而是只考虑机器,我们编号为a、b等,而它们上面可以运行的机器语言我们编号为A、B等。 以上几段的关键点是: 无论是机器语言还是高级语言,实际上都是代码。在之后的讨论中,我们不应该将它们区别对待。 虽然机器语言代码和高级语言略有不同,它可以直接在机器上运行,但是对于编译过程,它们没有任何区别。 上面的问题了解了之后,我再来简单说一下编译器。那编译器是什么?这要从两个方面来解释。 首先,编译器本身的功能是,将一种语言S的代码转化为一种语言T的代码。这里稍微了解编译器的读者可能有疑问了:我用的gcc之类的编译器,明明是把C语言代码编译成了一个exe程序,并不是把S语言的代码编译成了T语言的代码啊?如果你也有这个疑问,请重新阅读以上几段——我在前面已经提过了,“任何程序本身也是一些机器语言的代码”。也就是说,我们这里把机器语言也看作一种语言,只不过是很低级的语言;而编译器就可以将C语言这种高级语言S转化为机器语言这种低级语言T,恰好这种低级语言还是可以在机器t上直接运行的。 其次,大部分情况下,编译器自己也是一段程序,那么它也可以看做是一段代码。而编译器也会有它的源代码,这个源代码就是一种高级语言的代码,我们这时仍然叫它编译器。随便举个例子,对于gcc.exe,这个程序是一种机器语言A的代码,它可以直接在a机器上运行。而它的功能则是,将C语言的代码转化为机器语言A的代码(一个C语言的编译器),使得本身无法直接运行的C语言程序变得可以在a机器上运行。而在得到gcc.exe之前,我们一定也有一段代码,它是用来生成gcc.exe这个程序的,这段代码可能是一个高级语言的代码,比如汇编语言。那这时候,这段汇编语言的代码即使不能直接在电脑上运行,我们依然说这是一个C语言的编译器。 有了这两点,我们就可以总结出一个编译器的特征: 1. 本身是一段代码,假设是A语言的代码,A可以是机器语言,也可以不是; 2. 可以接收一段代码,假设是S语言的代码,S一般来说是高级语言,但理论上也可以不是; 3. 可以将接收到的S语言代码在内部转换后输出一段代码,假设是T语言的代码,T有可能是机器语言,但也有可能是一种高级语言。 这样,一个编译器就可以被表示为A(S –> … Continue reading

2011年04月14日
by sqybi
6 Comments

Gmail的哪些功能吸引了我?[updated]

昨天在人人上发了个关于Gmail的状态,引发了热烈讨论。某同学表示不知道为什么有那么多人在用Gmail,然后瞬间蹦出N个回复提出了Gmail的种种优点。 仔细想想,为什么Gmail这么吸引我呢? 很早以前,我的第一个邮箱是sohu邮箱,用户名我还记得,是jk041。真的是很早以前的事情了。之后几乎尝试过国内每一个著名邮箱(正如当初几乎尝试过国内每一个著名BSP),然后换到了新浪。再后来,126邮箱似乎率先推出了什么功能(好像是无限容量,我也记不太清了),于是转到了126邮箱,而且那个邮箱也持续用到今天。 但是,实际上,现在的126邮箱对于我只是一个收垃圾邮件用的邮箱——所有网站的注册都用126的邮箱,然后私人的邮件都用Gmail。我已经忘了自己是什么时候开始用Gmail的,不过的确最开始的时候我也不觉得Gmail有什么好的功能,甚至觉得很难“上手”。不过某一次连续用了一个礼拜Gmail之后,我才发现原来这个邮箱真的这么优秀,国内没有任何一个邮箱能够与其比肩,甚至赶不上它的十分之一(国外估计也不会有吧?)。 这时我才发现,所谓很难“上手”,实际上只是迁移成本罢了,当初国内邮箱“上手”的时候,没有一个比Gmail更容易多少。Gmail已经在易用性和用户体验中间找到了一个十分良好的平衡点,国内邮箱互相的迁移成本低,是因为中国的网络产品“抄”的现象太严重,结果每个邮箱界面都一样,用起来感觉都一样,不一样的只剩下了域名。 扯淡扯太多了。那么回归正题,Gmail到底有哪些功能吸引了我呢? ---------- 以下是Gmail默认开启的功能 ---------- 界面布局 之所以把这个放在第一个,是因为国内邮箱千篇一律的页面布局实在让人头疼。Gmail将Mail、Contacts和Tasks整合在了一起,对功能进行了分块。上面的搜索框也很有Google特色,用起来相当方便。通过Labs的功能,还可以对界面进行进一步改造(比如把Inbox分成多个,把Gtalk放到右边之类)。其实这个也不算太亮的亮点,但是用起来的确很舒服。 标签管理 这个是Gmail一个很核心的功能,可以说,如果不用这个功能,Gmail就浪费了一半。 虽然标签管理本身并不能带给我们什么体验上质的飞跃,但是它可以和很多功能相互配合使用,比如代收取邮件、过滤器和Archive等。可以发现,这时标签功能才真正展现出它的实力,把一切都统一成标签,简洁明了,完全不是国内邮箱那样,一个文件夹列表,一个代收取的邮箱列表,大大限制了灵活性。 Archive 这个功能可以说完全依赖标签才得以实现。有的邮件可能已经没有什么用处了,或许是谈论某个project然后project已经完成,或许是向教授套磁然后失败了……不管怎样,这种邮件会有一种删也不是不删也不是的感觉。这时怎么办?Archive功能告诉你,你可以把它从inbox中完全隐藏掉,但是这个邮件不会被删除,想要读的时候,搜索功能可以帮你忙。 这个功能的实现是,Inbox里的邮件都会被自动加上“Inbox”这样一个标签,只要把这个标签去掉,邮件就不会再在Inbox中出现了——这就是Archive功能。 代收取邮件 这个功能很多国内邮箱也已经开发了,不过至少我用126邮箱的时候,从来没收取成功过。Gmail的收取功能是十分稳定的,从来没有出错(除了126十分傻X地把POP端口只开放给本地客户端导致收取失败)。 配合Label,可以给每个邮箱收取的邮件标上不同的标签不同的颜色,一目了然。Labs里的Multiple Inbox功能,还可以在Inbox页同时显示多个Inbox,完全让Gmail替代、超越本地客户端。 可以说,这个功能是邮箱迁移的利器,也是多邮箱用户必用的功能。 Prioirty Inbox 这个功能也是Google最近才推出的,效果相当不错。 它可以通过邮件的内容,自动判断这封邮件是不是“重要”邮件。如果是“重要”邮件,就会在Priority Inbox的最前面集中显示出来。 上学期当助教的时候,我的邮箱受到了各种邮件轰炸,这个功能帮了我大忙。准确率令人发指啊,和垃圾邮件过滤的准确率有的一拼。 垃圾邮件过滤 既然提到了,就来说说垃圾邮件过滤。 我这个Gmail邮箱也和其它邮箱一样,每天收到十来封甚至几十封垃圾邮件。但是,Gmail的垃圾邮件过滤系统真的强大到了一定程度。至今为止,我似乎还没有任何有用邮件被识别为垃圾邮件的记忆;而垃圾邮件的漏网率,大概也不到百分之一——其实一个月也没有一封漏网的。 这么强大的垃圾邮件过滤器,大概是我选用Gmail的根本原因吧。 联系人管理 这个没什么亮点,不过给人感觉不差就是了。和国内的邮箱比起来,这个联系人管理可谓简单得多,怎么看上手也不会比国内那些乱七八糟的联系人管理难吧。 内嵌Google Talk和Google Tasks Google服务之间的整合做的相当不错。这个不多说了,内嵌的Gtalk估计每个Gmail邮箱用户都用过吧。Tasks虽然我没有用,但是放在邮箱里绝对没有错,想想那么多人热衷的Outlook就知道。 和Android手机的同步 安卓手机会和Google服务有紧密结合度是理所当然的事情。我现在的Milestone,通讯录是和Google … Continue reading

2010年11月21日
by sqybi
0 comments

[zz from Nxun.com] Windows7中的扫雷

以下内容转载自Nxun的blog:http://blog.nxun.com/archives/35#comment-215。 ------------------------------------人肉分隔线------------------------------------ 扫雷游戏(Minesweeper),自从1981年 Windows 3.1 出现以来,此款游戏的流行程度从未减退。在此不对游戏的规则及策略作介绍,如果您真的不清楚这是什么,请自行询问身边的朋友。 本人最近就迷上了 Windows 7 中自带的扫雷游戏,很OUT是吧,冒着被喷的危险,与大家分享点有趣的见闻。 Windows 7 / Vista 中的扫雷游戏,与 Windows XP / 2000 / 98- 中的比起来,游戏体验终于有了质的提升,从清新醒目的配色到简洁明快的动画效果,可见微软在此还是倾注了一定的心血。 新版本的改动并不仅限于画面效果,一个重要的变化是地雷的布局算法。有经验的扫雷玩家可能都知道,在一局扫雷游戏中,第一个点开的方块一定不是地雷。这一点不用怀疑,因为这不是概率问题,一个设计良好的扫雷游戏不会让你直接点到雷上,它们或者在点开第一个方块后再布局地雷,或者把第一下点到的地雷换到其他地方去。在Win7新版本扫雷中,做出了更加人性化的改动,第一个点开的方块连同周围8个方块(如果有的话)保证都不是地雷,使用9*9雷数最多的自定义游戏也可以证实这一点。 在XP扫雷(高级)中点开的第一个方块 在Win7扫雷(高级)中点开的第一个方块 9*9雷数67的自定义游戏 这样做给玩家带来的好处是显而易见的,因为开局点开一个孤立的方块几乎没有任何价值。事实上微软考虑的可能更多,我随便在高级游戏中测试了几次,几乎每次第一下都会点开一大片区域(超过20块),稍微计算一下便可知道这种概率并不高,唯一合适的解释就是游戏“智能”的为玩家提供了一个舒适的开局。 这里还有一个有趣的小程序,如果您对本文第一张截图感觉好奇,可以试一下。在这里下载。 实现原理见作者的这篇文章。 ------------------------------------人肉分隔线------------------------------------ 上面提供的程序下载经我测试在我这里无法运行,inject后找不到某个模块,所以懒得再传到我blog上了。可能和我是64位有关,想要自己试一下的请去原文照下载链接。 其实这几天在和Nxun玩扫雷,既然他开始研究扫雷的布局算法了,那我看来要多看看解扫雷的算法了……总感觉可以转化为一个完整的数学模型来解……