看到有的人在说什么「量刑适度」,真心觉得搞笑。
这种人,就是把公权和私权混为一谈分不清的那类人。
要动用公权力侵犯私权时,疑罪从无原则无疑是非常重要的。因为双方力量并不对等。
而个人之间的质疑乃至问罪,没有必要搞什么疑罪从无。双方力量都是对等的。一方可以质疑,另一方也可以回应。一方可以乱扣罪名,另一方也可以把真相公之于天下让大家看看。就算捅到媒体,舆论一边倒。你可以骂别人傻逼,可以觉得别人真的是傻逼,可以骂群众无脑盲从,可以愤世嫉俗愤然删号滚蛋。但人家就是有这个权利。发表自己的见解,没有问题,但想修改游戏规则,是很不明智的。
从另一方面看,对于公权,不仅不能疑罪从无,还应该要用最恶意的角度去揣测。这个原则,也应该可以适用于双方力量明显不对等的情况。没有人会认为保护伞公司不应该接受政府同样的待遇吧?
更何况,有的时候,超出目前状况之外的恶意揣测,往往是为了自我保护,而不是要加害于他人。黄浦江上的猪,没有检测出可感染人类的病毒,就应该为此放一百二十个心了吗?目前还没有证据显示 H7N9 可以在人类之间传染,于是友人咳嗽高烧也可以不用防护地去探病吗?没有上过 CSDN,于是就不用修改密码了吗?没有反对过永远伟大的党,于是就可以举手支持第 73 条了吗?如果只是走一步看一步,人类存活不到现在。你可以自己这样做,但要求别人也跟自己一样,要么是站着说话不腰疼,否则不是脑残就是别有用心。
善意提醒
如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。
2013-04-03
2013-03-21
如此错误检查,还不如不要
今天在查一个 Bug。表面现象很奇怪,至少让测试组觉得很奇怪。故障现象是这样的:
有一个列表框,如果里面只有两条记录,那么没事。如果有三条以上的记录,那么在删除记录时会「随机」出现程序无响应的情况。
上面这段错误描述中,「随机」二字之所以打引号,是因为其实不是随机的。只是测试组的同事没有找到规律而已。只要按从下到上的顺序进行逐个删除,就很容易遇到故障。
这种现象,有经验的程序员一看就知道跟序号、数组之类的东西有关。
果不其然,在代码中我找到了这样的一段:
这里解释一下,ListView->Selected 能拿到列表内当前选中的第一行,而 ItemArray 是一个项目组自己实现的数组对象。这两个东西都没啥毛病。
坑爹的代码就是这一句:
但是,仅仅意识到这个问题,还不够。接下来还有问题了:iWhich 会越界吗?什么情况下会?
我相信,如果写这段代码的人当时有问过自己这个问题,那么就不会有这个 Bug 了。
这个 iWhich 来自一个 pItem->Data,这是一个 ListView 行对象附带的 DWORD 类型的数据,其值是由使用者(程序员)赋值的。
也就是说:如果你给它正确赋值,那么就不会有不正确的值出现。如果它有问题,那么是你前面的程序造成的。
也许还是有程序员会担心,这个 pItem->Data 会不会什么时候被改掉。也可能赋值的地方是另一个程序员写的。而写这段代码的程序员出于防御性编码的目的,写下了这样的判断。那么 OK,没有关系,判断就判断吧。可是判断为 FALSE 的时候怎么办呢?
他什么都没有做。
其实,判断为 FALSE 之后,从 ListView 中删掉这一行,应该是安全的。从上面的代码中可以看出,删除行的时候,只用到了 pItem->Index。这是由操作系统自行维护的值,不会存在 Data 那种「可能没有正确赋值」的情况。
又或者,实在不放心,那么直接把整个函数 return 掉,甚至报个错,也是可以的。
现在的处理方式就直接导致了死循环。这是很糟糕的情况,单核机器的用户甚至可能会几乎没有机会来做什么处理。
好了,上面这些就是我这篇博文想说的:有防御性编码的意识,很好!但是处理方式也要正确有效。你不应该在避免一个错误的同时,引入另一个错误。
那么,最后还有个遗留问题:iWhich 为什么会越界呢?
我想,对于合格的程序员,这个问题不应该成为问题。所以我就不说了。
有一个列表框,如果里面只有两条记录,那么没事。如果有三条以上的记录,那么在删除记录时会「随机」出现程序无响应的情况。
上面这段错误描述中,「随机」二字之所以打引号,是因为其实不是随机的。只是测试组的同事没有找到规律而已。只要按从下到上的顺序进行逐个删除,就很容易遇到故障。
这种现象,有经验的程序员一看就知道跟序号、数组之类的东西有关。
果不其然,在代码中我找到了这样的一段:
pItem = ListView->Selected;
for (; pItem != NULL;)
{
int iWhich = (int*)pItem->data;
if (iWhich >=0 && iWhich < ItemArray.GetSize())
{
ItemArray.RemoveAt(iWhich);
ListView->Delete(pItem->Index);
}
pItem = ListView->Selected;
}
这里解释一下,ListView->Selected 能拿到列表内当前选中的第一行,而 ItemArray 是一个项目组自己实现的数组对象。这两个东西都没啥毛病。
坑爹的代码就是这一句:
if (iWhich >=0 && iWhich < ItemArray.GetSize())我能理解,写的人是想把iWhich的取值限定在某个区间。因为这个 iWhich 接下来会被用作数组下标。如果越界,后果不堪设想。有这个意识,是好的。
但是,仅仅意识到这个问题,还不够。接下来还有问题了:iWhich 会越界吗?什么情况下会?
我相信,如果写这段代码的人当时有问过自己这个问题,那么就不会有这个 Bug 了。
这个 iWhich 来自一个 pItem->Data,这是一个 ListView 行对象附带的 DWORD 类型的数据,其值是由使用者(程序员)赋值的。
也就是说:如果你给它正确赋值,那么就不会有不正确的值出现。如果它有问题,那么是你前面的程序造成的。
也许还是有程序员会担心,这个 pItem->Data 会不会什么时候被改掉。也可能赋值的地方是另一个程序员写的。而写这段代码的程序员出于防御性编码的目的,写下了这样的判断。那么 OK,没有关系,判断就判断吧。可是判断为 FALSE 的时候怎么办呢?
他什么都没有做。
其实,判断为 FALSE 之后,从 ListView 中删掉这一行,应该是安全的。从上面的代码中可以看出,删除行的时候,只用到了 pItem->Index。这是由操作系统自行维护的值,不会存在 Data 那种「可能没有正确赋值」的情况。
又或者,实在不放心,那么直接把整个函数 return 掉,甚至报个错,也是可以的。
现在的处理方式就直接导致了死循环。这是很糟糕的情况,单核机器的用户甚至可能会几乎没有机会来做什么处理。
好了,上面这些就是我这篇博文想说的:有防御性编码的意识,很好!但是处理方式也要正确有效。你不应该在避免一个错误的同时,引入另一个错误。
那么,最后还有个遗留问题:iWhich 为什么会越界呢?
我想,对于合格的程序员,这个问题不应该成为问题。所以我就不说了。
2013-03-03
用了五年的笔记本 XP 系统重装了
其实重装系统这种事情也没什么可写的。无论是重装系统还是拆机换 CPU,我都已经轻车熟路了。不过过程中还是遇到了几件值得加深记忆的事情,权且当作流水帐记一下吧。
这次换了个 CPU:把 AMD MK-36 换成了 AMD TL-66。MK-36 只是 64 位而已,但由于用的是 XP 32 位版,其实没有任何优势。TL-66 增加了主频,而且变了双核,可以说是鸟枪换炮了。这要搁在当年买笔记本的时候,不说 TL-66 根本没面世,就算有得选,也不是加几百块钱能了事的。现在淘宝上一百来块就搞定了,还送了个耳机。
换了 CPU,Chrome 卡的问题还是没能解决,于是把系统给重装了。本来准备上 Win7,结果发现装 64 位版本的话 disk.sys 不支持,也没有官方驱动能解决这个问题。如果上 32 位版 Win7,显卡驱动可能也是个问题。这款笔记本官方只提供 Vista 的驱动。最后还是装回了 XP。反正 2GB 内存也只有 XP 能舒服点。以后这台机器就不要考虑其它操作系统了。
但重装了系统,仍然没有解决 Chrome 卡的问题,而且卡得愈发厉害。最后终于发现是电池的问题,拔掉电池就一切正常了。现在依然很正常地在用,只是谷歌拼音的切换略慢,有时候刚呼叫出来的时候会丢几个键击。电池上有个垫脚,导致现在本子变成三脚猫,不得已只好找了一叠名片来垫上。
2013-02-27
360 病及其它
提到不要用 360,总会有人跳出来问:你有更好的吗?
别人说自己笨就算了,没怎么见过把自己的笨拿出来秀的。不过算了,术业有专攻,确实不能期望每个人都有及格的信息安全相关技能。那么,这个逻辑是否正确呢?是不是没有更好的替代品之前,360 尽管是个臭流氓,但仍然是个还算不错的选择呢?
要我说,这是一种典型的把自己的 XX 寄托在别人身上的毛病。这毛病极坏!不过,所有使用360 的人,或多或少都有这个毛病。
自己安全不安全?不知道。不知道要去弄明白啊!他不,他去听 360 的。360 说我安全,360 说我体检一百分,360 说你的电脑高风险,360 说你给我装的 GoAgent 是病毒。
许多年前,有一群人也是,觉得某个党挺好,于是什么都相信它。于是他们觉得找到了替代品,旧的那个可以不要了。于是旧的那个被赶到了一个小岛上,后面的事情大家都知道了。
人民是很容易偷懒的,一旦他们觉得某个英雄可以拯救他们,某个国王英明贤德,他们很容易就会把一切都交付了。国人如此,其他国家的人民同样是如此。不过区别是,不少其他国家的人民已经从历史的教训中学得比较聪明了,而我们的政府还在不停地对我们的人民洗脑、欺骗。
360 也一样。把操作傻瓜化的同时,一切都拱手交给它了。我还记得 WALLE 里面飞船上那些人类,一切都交给了机器,以至于变得肥头大耳四体不勤站都站不稳活像笼子里的哈姆太郎宠物鼠,自己却浑然不觉。不同的是,船长与方向盘搏斗的时候,所有人都在为他加油,没有傻逼跳出来说我们活得挺好的挺舒服的要吃有吃要睡有睡要玩有玩安全和谐别给劳资破坏来之不易的大好稳定局面。
好吧,我再次承认,不是所有人都有及格的信息安全相关技能(事实上是大部分人都没有)。这不丢脸,就好象我不会任何武功,来个强盗一刀就把我给灭了。只是,我也不会去做那些危险的事情,爬上火车打架就留给 007 他们吧。不具备信息安全相关技能,就自己小心谨慎一点。查杀木马你不会,预防堵漏你也不会,物理断网你总会吧?怕中木马,污七八糟的网站就少去晃荡,盗版软件就少去下载。怕网游被盗号,就别扔那么多钱和时间进去玩,更别去到处翻什么破解外挂。老在垃圾堆里刨吃的,人能健康吗?步行街上那么多漂亮妹子你不去追,宅在家里玩什么网游?妹子会传染你艾滋病吗?12 月 1 日的讲座你真该好好听听。怕网银丢钞票,就别去玩网上支付,货到付款总会吧?什么你不会数钞票……?思想有多远,你就给我滚多远。
别人说自己笨就算了,没怎么见过把自己的笨拿出来秀的。不过算了,术业有专攻,确实不能期望每个人都有及格的信息安全相关技能。那么,这个逻辑是否正确呢?是不是没有更好的替代品之前,360 尽管是个臭流氓,但仍然是个
要我说,这是一种典型的把自己的 XX 寄托在别人身上的毛病。这毛病极坏!不过,所有使用360 的人,或多或少都有这个毛病。
自己安全不安全?不知道。不知道要去弄明白啊!他不,他去听 360 的。360 说我安全,360 说我体检一百分,360 说你的电脑高风险,360 说你给我装的 GoAgent 是病毒。
许多年前,有一群人也是,觉得某个党挺好,于是什么都相信它。于是他们觉得找到了替代品,旧的那个可以不要了。于是旧的那个被赶到了一个小岛上,后面的事情大家都知道了。
人民是很容易偷懒的,一旦他们觉得某个英雄可以拯救他们,某个国王英明贤德,他们很容易就会把一切都交付了。国人如此,其他国家的人民同样是如此。不过区别是,不少其他国家的人民已经从历史的教训中学得比较聪明了,而我们的政府还在不停地对我们的人民洗脑、欺骗。
360 也一样。把操作傻瓜化的同时,一切都拱手交给它了。我还记得 WALLE 里面飞船上那些人类,一切都交给了机器,以至于变得肥头大耳四体不勤站都站不稳活像笼子里的哈姆太郎宠物鼠,自己却浑然不觉。不同的是,船长与方向盘搏斗的时候,所有人都在为他加油,没有傻逼跳出来说我们活得挺好的挺舒服的要吃有吃要睡有睡要玩有玩安全和谐别给劳资破坏来之不易的大好稳定局面。
好吧,我再次承认,不是所有人都有及格的信息安全相关技能(事实上是大部分人都没有)。这不丢脸,就好象我不会任何武功,来个强盗一刀就把我给灭了。只是,我也不会去做那些危险的事情,爬上火车打架就留给 007 他们吧。不具备信息安全相关技能,就自己小心谨慎一点。查杀木马你不会,预防堵漏你也不会,物理断网你总会吧?怕中木马,污七八糟的网站就少去晃荡,盗版软件就少去下载。怕网游被盗号,就别扔那么多钱和时间进去玩,更别去到处翻什么破解外挂。老在垃圾堆里刨吃的,人能健康吗?步行街上那么多漂亮妹子你不去追,宅在家里玩什么网游?妹子会传染你艾滋病吗?12 月 1 日的讲座你真该好好听听。怕网银丢钞票,就别去玩网上支付,货到付款总会吧?什么你不会数钞票……?思想有多远,你就给我滚多远。
2013-02-07
关于 GFW 请愿的那些事儿
白宫网站上那个关于 GFW 的请愿活动,我最开始是在周末看到的。大约在一月底的时候。
因为个人原因,周末上 G+ 的时间并不多,基本上就是瞄上一眼,发评论都不一定有时间。当时只是简单把 PO 转了一下(G+ 还没有收藏功能真遗憾)。一方面因为我之前在「死星事件」中刚知道白宫网站请愿这事儿,觉得这次活动还有那么一点儿小意思,值得去做一下。另一方面,当时那个 PO 是以一个教程的形式写出来的。也许作者的初衷是想让读者无需任何脑力即可操作,但结果就是那段文字看起来相当复杂,普通人(包括我)一眼看上去就会觉得「哎呀这么麻烦啊」。当时我的想法很简单:这大概是一个要花点时间的事情,等有空再做吧。反正截止日期我看过,2 月 24 日,还有近一个月,中间还有春节假期,时间大把的有。
后来没过两天,我发现这件事情其实很简单。起码比我上 1 号店买个牛奶要简单多了。唯一的问题就在于,即使用 Gmail 注册,确认邮件也是过了一阵子才收到,至少没有像大多数网站那样秒到。流程稍微一卡,我转过头就做别的事情去了,以至于这事儿最终分了两步才完成。不过我想说的是,过程真的很简单,除了一个邮箱无需任何其它条件,也没有什么后遗症——如果你连转发政治 PO 都不怕的话。
再后来,签名进展异常缓慢。我签的时候有三千多,现在也才刚过一万。估计信息就只在一个不大的圈子里面传播。同时,还有网评员和小秘书在信息流动过程中捣蛋。总结了一下,我大致见过以下论调:
有兴趣的话各自对号入座。至于对这些论调,我就不发表评论了。不是没有话说。要说的话很多。但是相信各位至此已有相关的心理准备,在下就不多啰嗦了。
我 Google+ 个人资料里面的个人宣言是这样写的:人在做,我在看。不是我以老天爷自居。所谓众生相,其实谁都看在眼里。至于在不在乎,那就只有各位自己心里去掂量了。不管诸位在不在乎,这破事儿,反正我,是看定了。
因为个人原因,周末上 G+ 的时间并不多,基本上就是瞄上一眼,发评论都不一定有时间。当时只是简单把 PO 转了一下(G+ 还没有收藏功能真遗憾)。一方面因为我之前在「死星事件」中刚知道白宫网站请愿这事儿,觉得这次活动还有那么一点儿小意思,值得去做一下。另一方面,当时那个 PO 是以一个教程的形式写出来的。也许作者的初衷是想让读者无需任何脑力即可操作,但结果就是那段文字看起来相当复杂,普通人(包括我)一眼看上去就会觉得「哎呀这么麻烦啊」。当时我的想法很简单:这大概是一个要花点时间的事情,等有空再做吧。反正截止日期我看过,2 月 24 日,还有近一个月,中间还有春节假期,时间大把的有。
后来没过两天,我发现这件事情其实很简单。起码比我上 1 号店买个牛奶要简单多了。唯一的问题就在于,即使用 Gmail 注册,确认邮件也是过了一阵子才收到,至少没有像大多数网站那样秒到。流程稍微一卡,我转过头就做别的事情去了,以至于这事儿最终分了两步才完成。不过我想说的是,过程真的很简单,除了一个邮箱无需任何其它条件,也没有什么后遗症——如果你连转发政治 PO 都不怕的话。
再后来,签名进展异常缓慢。我签的时候有三千多,现在也才刚过一万。估计信息就只在一个不大的圈子里面传播。同时,还有网评员和小秘书在信息流动过程中捣蛋。总结了一下,我大致见过以下论调:
- 投了也没用。
- 懒得去理这样的破事。
- 侵犯 GFW 工作人员的自由!
- 太麻烦!
- 不懂英文!
- 不是只有美国籍才能投票吗?
- 什么是 GFW?
有兴趣的话各自对号入座。至于对这些论调,我就不发表评论了。不是没有话说。要说的话很多。但是相信各位至此已有相关的心理准备,在下就不多啰嗦了。
我 Google+ 个人资料里面的个人宣言是这样写的:人在做,我在看。不是我以老天爷自居。所谓众生相,其实谁都看在眼里。至于在不在乎,那就只有各位自己心里去掂量了。不管诸位在不在乎,这破事儿,反正我,是看定了。
2013-01-25
VC6 最佳拍档,Platform SDK Feb 2003
很长一段时间内,一直用 Platform SDK Server 2003 SP1 来搭配 VC6 进行开发工作。但这个组合其实并不是很合适。这个版本的 Platform SDK 里面,有一些东西是 VC6 的 CRT 已经无法支持的,比如对 __time64_t 进行操作的那些时间函数。另外在链接到 shell32.lib 之类的库的时候,也会报错说调试信息的格式已经不匹配了。
最后一个支持 VC6 的 Platform SDK,是 Platform SDK Feb 2003,比我之前用的 SDK 版本要更旧一点。微软官网已经不提供下载了,目前给出的所有链接都是失效的。好在有网友通过 独立Blog 提供了 cab 包方式的下载。我把这些 cab 包中打包的文件提取出来后制作成了 ISO 光盘镜像,便于刻盘保存,也更方便下载。
以下下载链接来自于 Mega 网盘。下载无需注册,但国内下载速度不太好说,有快有慢,并且(从 Mega 的性质看来)随时可能被墙。可以尝试一下 ping mega.co.nz,如果 ping 值高于 600ms,建议通过 VPN 下载(GoAgent对于Mega不顶用),或者另寻它途。
Platform SDK Feb 2003.iso (346.8 MB)
值得一提的是,这个版本的 SDK 需要你的默认浏览器是 IE 才行。貌似通过 ActiveX 控件实现的安装向导,以后的版本没有继续采用,明显是一个失败的设计。
最后一个支持 VC6 的 Platform SDK,是 Platform SDK Feb 2003,比我之前用的 SDK 版本要更旧一点。微软官网已经不提供下载了,目前给出的所有链接都是失效的。好在有网友通过 独立Blog 提供了 cab 包方式的下载。我把这些 cab 包中打包的文件提取出来后制作成了 ISO 光盘镜像,便于刻盘保存,也更方便下载。
以下下载链接来自于 Mega 网盘。下载无需注册,但国内下载速度不太好说,有快有慢,并且(从 Mega 的性质看来)随时可能被墙。可以尝试一下 ping mega.co.nz,如果 ping 值高于 600ms,建议通过 VPN 下载(
Platform SDK Feb 2003.iso (346.8 MB)
值得一提的是,这个版本的 SDK 需要你的默认浏览器是 IE 才行。貌似通过 ActiveX 控件实现的安装向导,以后的版本没有继续采用,明显是一个失败的设计。
2013-01-16
关于 BCB 中 Package 的两点注意事项
BCB 通过 Package 实现了自定义控件的能力,用起来的确很方便。很容易地就可以扩展 IDE 的能力,设计出更为强大的软件。但在实际使用中也发现有两个值得注意的地方。
1. Runtime packages
如果打上了 Build with runtime packages 复选框的勾,那么 BCB 在 Link 的时候将会把 Runtime packages 中列出的 Package 以动态链接的方式 Link 到 Project 的输出文件(EXE 或 DLL 等)中。在发行的时候,必须带上这些 Package 对应的 BPL 文件,EXE(或 DLL)才能正常工作。
Runtime packages 是一个分号分隔的 Package 名列表。没有在列表中的 Package,会静态链接到 Project 输出文件。如果不选择 Build with runtime packages,则所有的 Package 都会静态链接到 Project 输出文件。这大致相当于在 VC 中选择 Use MFC in a Static Library。
2. Package 设置的归属
一直以为 BCB 的 Components->Install Packages 里面的内容是个全局的设置。后来才发现原来是属于 Project 里面的 Options 之一。准确地说,是其中的 Runtime packages 部分的设置属于 Project。
也就是说,如果在某一个 Project 中设置了一个 Runtime packages 列表。那么这个设置只会应用在这个 Project 的编译结果中。对于别的 Project,依然保有并使用各自的设置。
1. Runtime packages
如果打上了 Build with runtime packages 复选框的勾,那么 BCB 在 Link 的时候将会把 Runtime packages 中列出的 Package 以动态链接的方式 Link 到 Project 的输出文件(EXE 或 DLL 等)中。在发行的时候,必须带上这些 Package 对应的 BPL 文件,EXE(或 DLL)才能正常工作。
Runtime packages 是一个分号分隔的 Package 名列表。没有在列表中的 Package,会静态链接到 Project 输出文件。如果不选择 Build with runtime packages,则所有的 Package 都会静态链接到 Project 输出文件。这大致相当于在 VC 中选择 Use MFC in a Static Library。
2. Package 设置的归属
一直以为 BCB 的 Components->Install Packages 里面的内容是个全局的设置。后来才发现原来是属于 Project 里面的 Options 之一。准确地说,是其中的 Runtime packages 部分的设置属于 Project。
也就是说,如果在某一个 Project 中设置了一个 Runtime packages 列表。那么这个设置只会应用在这个 Project 的编译结果中。对于别的 Project,依然保有并使用各自的设置。
2013-01-07
国内域名快要到期
八年前不懂事,通过国内商注册了域名,而且后来图便宜一下子续费了好多年。于是 superliufa.com 这个域名一直要到 2013 年 01 月 10 日才到期。当时看来是很久远的事情,不过现在看来大限就快到了。
根据以前过期的域名看来,该国内商有个流氓措施,就是会在域名过期后自己掏钱续费一年,但是收回所有管理权限,让你没法马上转移。不过我不着急呀!我的网站,一不用来挣钱,二不用来炒流量。一年后咱们走着瞧,奸商您要是兜里有俩闲钱咱们就再斗个一年,爷生命线挺长,耗得起。
不过,如此一来,这个架在 Blogger 上的博客,墙内的朋友很快就要无法访问了。墙外的地址是 superliufa.blogspot.com,届时(2013 年 01 月 10 日后)我将会取消博客上的自定义域名选项,这样首页就不会再跳转到 blog.superliufa.com 了。要翻墙的赶紧啊!可以参考我的 翻墙系列文章(虽然还不多),千万别输在起跑线上哦!
2012-11-14
真与假,真的那么重要吗?
经常看到有人跳出来说,某某消息是假的,某某图片是 PS 的,这都看不出来,傻 B。
我承认,说以上的话,的确是会产生一种优越感。而且很容易用「人云亦云的家伙」、「没脑子啊你」、「缺乏独立思考能力」等等理由继续攻击下去,痛快一番,嘴嗨翻天。
不过,很多次,我都想问这些优越人一句:真或假,真的有你以为的那么重要吗?
谣言之所以成为谣言,仅仅因为它与事实不符。事实是否存在,是贴不贴「谣言」标签的关键。但是,所述内容本身并不会因此有任何的改变。
当大家还没去了解事实到底存不存在的时候,对于这个谣言的理解,就反映了直觉及经验性的判断。而这也正是某些谣言得以流传,而另一些谣言根本没人相信的原因。
为什么会有这个判断,我认为这才是重要的。换句话说,大家愿意相信什么?
基本上,大家更倾向于相信:
然后你会发现,即使是抢盐这种事情,都没有看上去那么简单。那么多人真的都吃了脑残片吗?如果有人告诉你,你正处于某种恶性重大疾病的威胁之下,得了那种病只有死路一条,死前身上插满管子,气管被切开口不能言,大小便失禁,生活不能自理,并且还会耗光你的所有家财,倒欠一大屁股债,你会妻离子散、家破人亡,DNA 面临被淘汰的厄运,而能预防这个疾病的药物却很便宜……
在最后,要提醒某些人一件更可怕(但不是没有过)的事:「狼来了」这句话,不只有放羊的小孩会讲。在我们这个科技的时代,狼,也会讲!
不过,很多次,我都想问这些优越人一句:真或假,真的有你以为的那么重要吗?
谣言之所以成为谣言,仅仅因为它与事实不符。事实是否存在,是贴不贴「谣言」标签的关键。但是,所述内容本身并不会因此有任何的改变。
当大家还没去了解事实到底存不存在的时候,对于这个谣言的理解,就反映了直觉及经验性的判断。而这也正是某些谣言得以流传,而另一些谣言根本没人相信的原因。
为什么会有这个判断,我认为这才是重要的。换句话说,大家愿意相信什么?
基本上,大家更倾向于相信:
- 符合日常生活经验的事情:比如铁球比木球掉落得快
- 符合心中期许的事情:「本该如此嘛」
- 更具有公信力的机构的宣称:政府说了……
- 三观接近的描述:各种信徒
- 可能会对自己有益和/或避免对自己有害的事情:转发中奖/买盐防辐射
- 毫不关己、无关痛痒的事情:西安有个薛姓小孩捡了颗玻璃珠……
- 具有更多论据(但真伪并不确定)的论述:图片好多!
- 自己力所不能及的事情:到底有没有上帝?
- 负负得正类的消息:所谓高级黑
- ……
然后你会发现,即使是抢盐这种事情,都没有看上去那么简单。那么多人真的都吃了脑残片吗?如果有人告诉你,你正处于某种恶性重大疾病的威胁之下,得了那种病只有死路一条,死前身上插满管子,气管被切开口不能言,大小便失禁,生活不能自理,并且还会耗光你的所有家财,倒欠一大屁股债,你会妻离子散、家破人亡,DNA 面临被淘汰的厄运,而能预防这个疾病的药物却很便宜……
在最后,要提醒某些人一件更可怕(但不是没有过)的事:「狼来了」这句话,不只有放羊的小孩会讲。在我们这个科技的时代,狼,也会讲!
2012-10-25
头一次埋彩蛋哩
在改某个 Bug 的时候,需要通过已知的 HWND 来判断该子窗口是不是一个 DateTimePicker 控件。办法很简单,只要给这个子窗口发一个 DateTimePicker 控件的特定消息,如果返回值正确,那么就认为猜对了。
但是在选择这个「特定消息」的时候,我犯了难。DateTimePicker 支持的消息本来就不多。为了避免对正在编辑的数据带来扰动,只能选择 GETXXX 之类的消息。并且这个消息还得有定义良好的返回值,用于鉴别消息是不是发对了人。
一开始我选的是 DTM_GETSYSTEMTIME,这货能返回当前编辑的时间。但我发现控件一旦响应了这个消息,键盘输入就像按过回车一样被 COMMIT 过了,导致年份之类的多位数字根本输不完整。回头看了看 DTM_GETMCCOLOR,又无法确定返回值是不是能够鉴别出来。有个 DTM_GETDATETIMEPICKERINFO 倒是看上去挺好,可惜只支持 VISTA 往上。最后我选择了 DTM_GETRANGE。
DTM_GETRANGE 可以返回设计者在 IDE 上给 DateTimePicker 控件定下的最大/最小值。所以我只要把最小值设一个特定的日子,然后看看返回值正不正确就 OK。实验下来对输入也没有扰动,是个很好的选择。那么,日子选哪一天呢?
……我敲入了 1989-06-04
但是在选择这个「特定消息」的时候,我犯了难。DateTimePicker 支持的消息本来就不多。为了避免对正在编辑的数据带来扰动,只能选择 GETXXX 之类的消息。并且这个消息还得有定义良好的返回值,用于鉴别消息是不是发对了人。
一开始我选的是 DTM_GETSYSTEMTIME,这货能返回当前编辑的时间。但我发现控件一旦响应了这个消息,键盘输入就像按过回车一样被 COMMIT 过了,导致年份之类的多位数字根本输不完整。回头看了看 DTM_GETMCCOLOR,又无法确定返回值是不是能够鉴别出来。有个 DTM_GETDATETIMEPICKERINFO 倒是看上去挺好,可惜只支持 VISTA 往上。最后我选择了 DTM_GETRANGE。
DTM_GETRANGE 可以返回设计者在 IDE 上给 DateTimePicker 控件定下的最大/最小值。所以我只要把最小值设一个特定的日子,然后看看返回值正不正确就 OK。实验下来对输入也没有扰动,是个很好的选择。那么,日子选哪一天呢?
……我敲入了 1989-06-04