NullPointer的新无效地址

—— Where exceptions happen.

2011年7月26日星期二

豆瓣认证码

doubanclaimb6b45ca08ad6620e

2009年12月11日星期五

神奇的87.53%的背后

看见一个广为流传的贴子,宣传一个神奇数字87.53%,好吧,让我们来做点更深入的小研究

1,Results 1 - 10 of about 10,400 from gov.cn for 17.53%. (0.35 seconds)
2,Results 1 - 10 of about 55,700 from gov.cn for 27.53%. (0.94 seconds)
3,Results 1 - 10 of about 7,030 from gov.cn for 37.53%. (0.33 seconds)
4,Results 1 - 10 of about 5,390 from gov.cn for 47.53%. (0.29 seconds)
5,Results 1 - 10 of about 3,420 from gov.cn for 57.53%. (0.31 seconds)
6,Results 1 - 10 of about 17,700 from gov.cn for 67.53%. (0.32 seconds)
7,Results 1 - 10 of about 15,400 from gov.cn for 77.53%. (0.45 seconds)
8. Results 1 - 10 of about 4,790 from gov.cn for 87.53%. (0.27 seconds)
9. Results 1 - 10 of about 3,120 from gov.cn for 97.53%. (0.46 seconds)

87.53% 在*7.53%家族中出现频率仅排倒数第三,神奇程度值得商榷。

这个“神奇”的现象,唯一证明的是gov.cn各网站已经积攒了足够多的统计数字(远大于10000,而xx.xx%的数字一共一万个,这就是抽屉原理的一个简单应用。)当然,这些数以亿计的统计数字并不代表国家的数目字管理已经成功。。。

如果有人足够悠闲,可以写个小程序,遍历全部xx.xx%在gov.cn的分布情况。。看看是不是真的有特别被偏爱的数字。
至少,87.53%并不够神奇。。。



2009年12月10日星期四

一个奇怪的报错和解决IT问题三定律

在Mac上安装Office 2008,安装器走到一半,弹出一个奇怪的报错,晚上钻研了一会,解决了。此事本身没什么可说的,但第一,这个具体错误肯定不止我一个人会遇到,所以值得写怎么处理。第二,其实分析一下解决IT问题的常用思路还有点意思。所以打开生锈的blog,写篇博客。

我遇到的这个报错信息就是 : "the installer could not install the software because there was no software found to install",
解决IT问题的第一定律:You are not alone. (你不会孤独定律)。IT问题虽然千千万万层出不穷,但你成为遇到特定型号特定系统特定软件特定版本的特定问题的第一个人的概率非常非常小,第一定律的具体应用就是,遇到任何错误不用惊慌,你不会孤独,打开搜索引擎,搜索报错信息,无数搜索结果会告诉你:你有同伴了。看看他们遇到这个问题后的遭遇显然是有用的。
于是我搜了一下这个报错信息,果然先我之前,已有无数先烈在这个错误前倒下了。看了前两个页面,是论坛讨论,且没有人给解决方案。但在第一个讨论贴里发现其他人有的是在安装iWorks 时遇到(不是Office 2008的特有问题),有的甚至是在一个全新安装的OS X 10.5上安装XCode时遇到(也就不是OS X的问题),但有人说自己不知道怎么后来又好了(就是说这个问题可以解决?)
解决IT问题的第二定律:Every error has its reason. (错必有因定律)。你遇到一个奇怪的错误,百思不得其解,它不该发生,不该存在,一切本应该顺顺利利,天书一样的报错信息让你抓狂。这时候一定要理性清明,明白这个错误的原因不可能是外星人,太阳黑子,宇宙射线,小强爬过主板,等等;这个错误之所以发生一定是因为你自己之前做过的所有事中的某一件。
好吧,我冷静了一下,既然可以排除OS X 和 Office 2008 的嫌疑,事情看起来比想像中简单,那安装Office 2008时为什么装到一半会报错呢?这个问题究竟出在哪里?
解决IT问题的第三定律:Make sense of the Fxxking Error.(弄懂报错信息定律),我知道所有的报错信息都不知所云,让人讨厌,让人下意识就会关掉那个讨厌的报错窗口。但是。但是如果你弄不明白出了什么问题,就应该努力弄懂那行报错信息说了什么。要知道,程序员在写错误处理的时候,并不知道错误信息会在你的机器上出现(他们无法预知错误发生的具体上下文),所以报错信息必然语焉不详,莫名其妙。这时候就需要你努力揣摩那行话背后的具体意义了。
又读了一遍这句看起来像同义反复的话,“the installer could not install the software because there was no software found to install”,安装器无法安装软件是因为找不到要安装的软件。奇怪,Office安装包明明就在,哪里找不到了。再从头走一遍安装流程,看见还可以选“自定义安装”,而默认是全选安装。于是福至心灵,猜想是否因为安装包里缺少部分组件,所谓找不到,不是指Office,而是指安装包里的部分选项。ok,那就自定义安装,去掉了几个不必要的多国语言组件,install,pass!

也因此难怪Google上搜不到这个错误信息的具体解决方法,因为它在不同软件的Installer中(只要Installer并不包含全部组件)都可能出现,原因又各个不同(因为各种不同情况的组件缺失)。如果你也遇到这个错,记得选自定义安装,然后只选择你必需的那部分组件,试试能否通过。(尤其是单语言版尝试全部安装多国语言内容很可能就遇到这个错了)

最后,遇到该死的报错信息时请记住:
  1. You are not alone。
  2. Every error has its reason.
  3. Make sense of the Fxxking Error.
其实很多时候往往只要第一定律出手就搞定了。

2008年12月24日星期三

给GreaseMonkey脚本添加自动更新

上个月我给自己的GreaseMonkey脚本写了一段自动更新的代码,不过我实在受不了在user.js文件之间复制代码片段(一股代码腐败的不祥气息),就算为了自利利人,我把这个封装好的对象放在一个单独js文件里,上传到Google Code上了,现在如果你写GreaseMonkey脚本,添加自动更新的简洁方案如下:

1. 给你的userscript脚本注释段添加如下代码
// @require http://userscript-autoupdate-helper.googlecode.com/svn/trunk/autoupdatehelper.js
// @version <版本号>
/* @reason
<更新说明>
@end*/

(@require后面就是上传到google code里的自动更新用代码,里面定义了一个Updater对象,用法见下。<更新说明>会在客户端脚本发现版本号小于userscript.org服务器端版本号时在弹出对话框中显示)

2. 在脚本开头部分添加类似下面的代码片段
var thisScript = {
name: "Delicious自动保存", //脚本名称,请自行修改
id: "35778", //脚本在userscripts.org的id,请自行修改
version:"1.4" // 当前脚本版本号,请自行修改
}
var updater = new Updater(thisScript); // 用thisScript对象创建一个更新器对象
updater.check(); //检查是否有更新


3. 可选的功能是另行设置更新频率(默认是10小时check一次),
在updater.check() 之前调用 updater.setHoursToCheck(t) 即可,
如updater.setHoursToCheck(24) ,则至少与上次检查时间相隔24小时才再次检查。

另外,在更新器对象创建之后,用户也可以右键GreaseMonkey图标,从“用户脚本命令”中选择手动更新脚本。

ps. 这个更新器目前是纯中文版本,所以也不写英文的发布声明了。看GreaseMonkey社区已经有自动更新用的代码片段在流传,不过直接复制粘贴大段代码我总觉得哪里不对 :-P

--
2008年12月25日 补注:
有人告诉我
“@require http://userscript-autoupdate-helper.googlecode.com/svn/trunk/autoupdatehelper.js 不行啊,直接复制倒可以”

在此补充说明一下:GreaseMonkey 0.8版增加的这个特性
@require 在安装脚本时生效,GM会自动下载 url 里指定的js文件到安装目录,直接在脚本里手工修改的话就会不行。对作者而言要先写好上传,然后安装,就能确认生效。 对脚本作者是麻烦一点,不过对用户是透明的。。。而用@require的好处可以简单的总结为:不仅快是生产力,清晰也是生产力。

2008年8月4日星期一

我知道,我没想到

写文章,看文献,在正题之外,看见许多有趣的东西。按我领会的GTD精神,避免分心的方法是把想到的事都写下来,庶几心里可以不用存事,所以就写下来吧。

1,我知道二战深刻的影响了计算机的诞生,我没想到认知心理学也是被二战推动的。
看书上说二战里有许多实验心理学家被征召,要他们找办法去选出优秀的飞行员和雷达兵。当时的刺激-响应理论暴露了无法实用的问题,需要更具体的模型来刻画人的信息处理过程(准确的说,国防部需要这些模型)。学术研究再次滞后,二战结束(就是二战时候心理学还没准备好,所以出现了《22条军规》这样的血泪控诉),英国的Donald Broadbent发展了第一个注意力的详细模型(飞行员和雷达兵确实需要集中注意力),一堆检测实验方法被提出,最后还发展出了专用数学工具。

2,我知道条件反射,还包括它的两大类八小类,我没想到药物上瘾和过量致死与条件反射有关。
其实道理很简单,不但食物和电击这样的无条件刺激(US,unconditional stimulation)会和周围条件刺激(CS, conditional stimulation)相关联,产生条件反射,吸毒行为作为US,也会和出现的CS(例如地点,或一起吸毒的朋友)相关联,最终产生条件反射。食物的例子里,分泌唾液的反射行为是为了准备接受食物。同样的,当药物关联的反射行为也是有机体为了接受药物而产生的效应,当条件反射建立(成为药物上瘾者)之后,由于条件反射做了多余的补偿,原先的药物剂量不再能产生作用,于是上瘾者就会不断增加剂量。
更可怕的,当上瘾者在一个新的环境(不同的地点或和不同的人)服药,由于条件反射没有出现,身体没有准备好接受毒品,而他按照原先剂量服药,就容易产生“过量服药”的悲剧——这是采访不少幸存者的结论,许多“过量”情况并不是剂量变大而造成,而是因为在陌生化情景里吃药。此时我脑海里浮现了一个吸毒者倒在一家小旅馆的床上的孤独身影,他只是不知道在外用药,剂量需要打折。。。。呃,我不是要普及这个知识。不过这个知识可以用来治网瘾。例如经常改改上网的条件啥的,习惯无线上网的,估计不容易有网瘾。

3,我知道电击实验很变态,我没想到这么变态。
话说心理学家对狗做实验的时候喜欢用电击做惩罚手段,一惩再惩,狗就学会不要去做某事——抑制性条件反射。但有变态的发现,如果狗不幸被不可预期且不可控制(比如电击是否停止与狗的行为无关,不是你乖就不电你)的电击恶搞过,那么以后再当狗有机会逃离电击的时候,它们也无力逃离。不但如此,狗还会表现出一系列心理问题:
沮丧(情绪反应被压抑),消极(在可逃离电击的情况下也不做努力),认知缺陷(在实验后期,认识不到电击是可控的。),这些综合起来,就是所谓“习得性无助”,这套理论现在被用于解释和治疗各种抑郁和行为障碍。
给人民意料之外的电击可以制造顺民。1984的老大哥还在费心讲道理,不学习就落后了啊,其实只需要不断的电击,如人类有限历史里部分时间部分地区的实践所证明的那样……