Archive for the ‘ Uncategorized ’ Category

python quine

s="s={quote}{content}{quote};print s.format(quote=chr(34), content=s)";print s.format(quote=chr(34), content=s)

我们做了一个操蛋的网站

昨天公司内部发了一个邮件让做一个调查。考虑到这个调查系统是我们自己开发
的,而且我还没有使用过,便兴致勃勃地开始一段特别苦恼的旅程。

我不断地问自己问题:一个在线调查系统的目的是什么。在我备受煎熬,不得不
依靠自己强大的内心才完成了这次调查之后。我极其郁闷地将开发同学和产品同
学召集起来,将问题抛给了他们:“请用一句话回答:在一个被调查者眼中怎样才
算是一个好的调查网站呢?”

“需要有其他选项,不想被限定在某几个选项中。”

“易于学习,便于掌握,好操作。”

“引导用户说出自己真实的想法。”

“⋯⋯”

我深深地叹了口气,摇了摇头。我对这些一点儿都不着边际的话并不感到意外,
但我依然抑制不住自己失望。我提示大家:“你们猜我在做调查的时候是一种什么
样心情和想法?”所有人都有点愣住了,似乎从来没考虑过这个问题。

“做这个调查时,我唯一的想法就是:怎么TMD还没做完?!”

很多人笑了,看来这种经历并不是专属于我个人的。还有的人提示我说:“哦,这
个还算简单的呢!”

我继续问道:

“谁会来我们的网站接受调查?他们的目的是什么?我们的产品给他

们带来了怎样的价值?”

所有的人都静下来了。我一点一点的展开:

要知道我们其实做了一个非常操蛋的网站。因为所有来我们这里的用户都非常讨
厌我们的产品,没有,绝对没有任何一个被调查者会喜欢我们网站。因为他们不
是调查公司施以利诱骗来的,就是受人所托,或者是被要求(被逼也说不定)必
须完成调查。没有人是自愿的。他们从我们的产品不能获得一丁点儿价值。他们
想要的是什么?无非是尽早结束,这样调查公司骗来的用户就能获得那些虚无缥
缈的积分,受人所托的就能对别人有个交代,强迫完成的也总算能交差了事。

“一个用户无法获得价值,一分钟也不想多呆的网站肯定是个非常操蛋的网站了吧。
我们唯一能做的就是让其少操蛋一点,配合用户最快速地完成调查。好吧,这就
是用户眼中好得调查网站的标准:最快速地配合用户完成调查。”

所以,交互上要实行最简原则:

一个狗屁单选题绝对不要让用户再确认一次,对于单选题来说“下一题”的这个按
钮也完全没有必要。少一次点击对于程序员来说似乎是一个“死不了人”的问题,
但对于单选效率则会提高100%,这是别的优化望尘莫及的。有反对意见的同学可
以参考google首页,这是一个跳出率极高,粘滞时间超短的页面,难道我们的页
面不应该这样么。

扩大点击范围,整个选项都应该是可以点击的,而不仅仅只是有个选项框可以点
击,极力减少用户在操作过程中的鼠标滑动。邀请选择的暗示要足够强烈。

根本不需要后退(或者“上一题”)按钮,用户一心想往下进行,根本没有心思后退。
如果需要后退的话,那一定是某处逻辑设计失误(比如互斥条件)。如果是这样的
话,一定要立即解决逻辑设计的问题。后退这个按钮掩盖的都是肮脏的浪费。

支持键盘操作。要知道,虽然答题的人不想答题,但经常答题的人群确是非常稳
定的,一旦他发现键盘可用,则会兴奋起来,对于职业答题者非常必要的。

尽量避免让用户录入文字。“其他”就足够了。

尽量将问卷一次加载到前台,由相应的javascript来完成前台逻辑校验
(backbone.js就是不错的技术方案)。
后记

我听说了很多关于调查问卷的奇闻轶事。

有的客户要求做的调查有100多道题目。我不知道制作题目的人是不是仅仅是为了
完成任务。100多道题目太多了。人类的注意力集中时间大概只有20分钟左右,所
以必须在这之前完成所有调查。否则用户会倾向于敷衍,或者欺骗调查系统。

有的客户要求题目的逻辑异常复杂。你做到最后几个题目时不让你继续,除非你
把之前的20道题目都改成他们认为合理的取值范围内。我也是玩过有偿点差的人,
后来放弃了。全因为这些调查不仅是对你智商的侮辱,也是对你耐心和体力的双
重考验。这就是特别典型的逻辑互斥设计缺陷。

有的客户要求当用户对某个题目分数比较异常时给出理由。理个屁啊?会有人看
么??既然然人家选,就不要问人家为什么。所有选项间的继续进行难度应该是
一样的。人为造成的交互难度不一致会使得用户倾向于选择交互容易的选项。所
以客户看到了他们想要看到的结果,问题是那TMD还做什么市场调查啊?

有的客户设计了特别变态的逻辑题目,让用户完成一张我们都认为连阿汤哥都无
法完成的表格。拜托,用户要是都能做完,阿汤哥不就失业了。调查表格的设计
前提就是填写者没有义务填写。一个直接推论就是填写调查表格时,用户不需要
借助辅助思考或者计算h。我真的不知道,调查表的设计者学没学过《市场调查》
之类的课程。有没有老师认真地告诉他们,其实填表的都是大爷。

好了,就权当娱乐了。

MongoDB 2.0的亮点

亮点一 数据压缩

跑过MongoDB一段时间的管理员都会奇怪,这个家伙怎么这么吃硬盘。大家在各自 的实践中总结了各种最佳实践来应对这种永无止境的硬盘吞噬。比如手工的导入 导出,或者利用复制组的自动恢复特性,定期人为制造故障,来强迫系统进行故 障恢复,来达到导入导出的目的。MongoDB对于硬盘的利用率的确不高,这也是广 泛遭到诟病的一点。新的MongoDB 2.0有了campact命令,用来解决这一问题。看 上去有点像做磁盘碎片整理的程序。会不会也很慢呢?很不幸,还是会很慢,不过 好在不需要导入导出所要求的那么多的空间。所以还是要在备份节点执行,还得 选择负载不高的时刻执行。不过后来想想,叫做压缩不如叫做碎片整理更加准确。

 

亮点二 索引

索引原来就有,而且数据量少的话,根本感觉不到这东西需要提高性能。呵呵, 开玩笑了,线上的业务哪个数据量能少呢。新版的索引据称效率提高25%,体积减 少25%。这是个相当不错的消息,管理员尽管用就是了,没什么好犹豫的。只是从 原有的系统升级到2.0并不能自动利用新版索引。需要强制重建索引才行。不过, 管理员要是执行了上面的campact命令的话,会附带重建指定的索引。

 

亮点三 复制组节点的优先级

原来很多人都问我,复制组中的某台机器恢复过来了,怎么继续让它成为活跃节 点(primary)。很不幸,以前没啥好办法。优先级的设定非常重要,尤其是对大型 集群,能够避免负载传递这种连锁反应。优先级高的节点一旦与最新的数据同步, 则会触发选举,并在选举中胜出。很实用吧。

 

其他

增加了对多边形区域的支持,以及多个地点的支持。LBS相关的应用会觉得这个功 能非常贴心。

MapReduce性能有大幅提升,去掉了一些不必要中间转换过程。

思维定势

思维定势
2010-10-26 23:36:44

QQ上下了几天连珠,暂时未遇败绩,每天中午胜十局。

不过积分还是负多胜少,输的分可能是年少无知的时候喂给高手的。

发现一个小规律:大多数人的棋路都一成不变。

我想对于一名不知道禁手规则的选手来说,记住棋谱是一件小概率事件。
可是在实际的对局中,在开局不变的条件下,如果我重复上一局的走法,大多数对手通常也会延着棋路重走一次上局中走过的落点。
这说明大多数人对于某个特定的局势,会形成一个定型的策略。
哪怕这个策略是无效甚至致命的。

前些天给大家讲敏捷大会收获的时候,说到了很多在领域中共通的迭代循环,比如空军战术中的OODA循环和SLG中的4E循环以及RTS中的微操作循环,还有敏捷中的迭代……
这些循环的共通之处就是在行动之后尽快的检测其有效性,并且即时进行修正。

对比4E和微操作就知道,大多数RTS高手实际上是一个很好的人肉迭代器。
而大多数普通人对于自己的行为缺乏及时的检测和修正,所以就导致了我发现的小规律:没有受过训练的选手会沿着一个既有的思维定势不加修正地一路狂奔直到输掉比赛。

是不是所有的”定势”策略都是有害的呢?

这涉及到对策略的评估方法和频率。
比如“敏捷”这条策略本身也是一种定势,对于瀑布模型来说有优势,但也需要针对实际情况进行取舍调整。

更明显的,棋类游戏中某些定势是必须记住的。
比如连珠中执黑必胜的花月局和浦月局,以及执黑必输的游星局和彗星局。
再比如用于攻击的“梅花”和用于防守的“八卦”。

对于这类经过推演证明有效的定势,自然要多学多用。

棋谱中归纳的定势和思维中习惯形成的定势,其差别在于是否经过了系统的反省,归纳和总结。

我看人妖—《人妖之间》读后感

我看人妖—
《人妖之间》读后感

这部三万多字的报告文学是在GOOGLE没有退出中国之前,偶然得到的,整整一个春节,它都在我新买的8手IBM X41T里,我背着它从哈尔滨的冰天雪地一路来到三亚的温暖沙滩,期间到处听到的都是东北炒房团炒高三亚房价的消息,同行的叔叔也以激动的热情希望投入到这个看似只涨不跌的游戏中来。而我却显得格外的冷静,因为我知道,一个爷们,一旦降生,就会承受着某种责任,而现实社会赋予所有爷们的两把枪,除了用来征服右手和女人以外,还有世界本身,以及他从哪里来,他要到哪里去的古老命题。

三十年前,在我还没有降生在这个世界之前,有人以宾县曾经发生过的事情为蓝本,写了这部叫做《人妖之间》的报告文学,看文章的结尾上标注着(原载《人民文学》1980 年第一期),大抵可以猜测,这的确是应该是部曾经印刷成铅字的文章,但后来在网上几经查找,虽然那时GOOGLE还没有退出中国,虽然有问题也可以问百度,但却始终没有找到这部作品的下载版,后来某位与某位同学聊天谈起,他以牺牲自我的神经,将这部作品“传播”给我,或许这个过程已经被某些看不见的手所记录了。

文章开头所描述的县委大院虽然是六十年代的事情,但与今天已然没有什么变化,身为纳税人的我们,如果想去身为我们公仆的他们那里办事,忍受的不仅仅是工作人员的冷若冰霜,还有“看门狗”的白眼,仿佛我们是妖怪一般。而六十年代初的那场全国饥荒饿死的人不计其数,当农民吃着从柞树叶、苞米叶和苞米棒子的碎渣里筛出的“淀粉”制成的代食品时,县委书记的孩子却在大街上拿白面肉包子打狗玩。——原文

朱门酒肉臭、路有冻死骨,几年百年来,这样的轮回在一次又一次的人妖大战之间周而复始,几年前看过一个以雷锋为主题的记录片,看过之后满心感慨:还有多少历史可以用来欺骗?原来我们小时候所学的一切,无非是统治阶级的宣传工具罢了。还记得小学时候《政治》课本上写着:美国资本主义资本家之恶毒,是无法想象的,他们为了利润,宁可把牛奶倒入田地,也不给穷人喝!当时的爱国主义情绪油然而生!心中默念:打到美帝国主义!短短15年时间之后,我们不但往田里倒牛奶,我们连奶牛也一并杀了,再后来,我们就用牛奶开始杀人了。

前几日与一长者一起闲谈这部作品,长者言:那个年代,人与妖还是可以比较容易分别出来的,人就是人,妖就是妖,而今,人虽然进化了,但妖却进化的更快,现在不但人有爹妈,妖也有了爹妈,所以就出来了人妖。人混在妖中分不清楚自己是人亦或是妖,妖混在人里,伺机榨干人类的最后一点净血。

光标停留了好久,不知道怎么继续将这篇东西写下去,前些天跟我父亲也探讨了这篇文章,我当时说想写篇读后感,被父亲制止,后来又征求了一位长者,长者叮嘱,写了千万不要放在网上,因为作者已经被开除党籍,就不要再对他的文章有所评论了。
如果不能放在网上,我为什么还要写它呢?

想起一个笑话,西游记里,没有背景的妖怪,都被孙悟空打死了,有背景的妖怪,都被领导收复回去了,至少是可以活命了,难道这就是我们人与妖的最后出路吗?和平共处?相安无事?再又看了一遍此文以后,不仅要问:人向哪边去?妖从哪里来?

Euler-{18,67}

http://projecteuler.net/index.php?section=problems&id=67
典型的动态规划。
原先在手机里写的,
跟机器一起丢了……
补上一个 T^T

?View Code PYTHON
#Python的解
dat_lines =  [ map(int, l.split(' ')) for l in open('triangle.txt').readlines() ]
dat_lines.reverse()
 
for i, l in enumerate(dat_lines):
    if not i:
        continue
    else:
        for ei, ev in enumerate(dat_lines[i]):
            dat_lines[i][ei] += max(dat_lines[i-1][ei], dat_lines[i-1][ei+1])
 
print dat_lines[i][0]
?View Code HASKELL
module Main where
 
acc_l [] (o1:[]) = []
acc_l (c1:cs) (o1:o2:os) = ((max o1 o2) + c1) : acc_l cs (o2:os)
 
main = do 
    lns <- readFile "triangle.txt"
 
    let real_lns = map (\l -> [ read x::Int | x <- words l ]) (lines lns)
 
    --Haskell里头列表项的值是不可变的,用foldr做累加。
    print $ head $ foldr (\nl ol-> acc_l nl ol) (last real_lns) (init real_lns)
 
    return ()

定义 0 的阶乘

如果 projecteuler 的 problem 34 的官方答案是正确的,那么 0 的阶乘就是 1。否则,官方的答案就是错误的。

0 的阶乘为什么是 1 呢?
……为了将就 阶乘的 “递推定义“

“n!=n*(n-1)!,那么必然有一个初值需要人为规定。我们知道1!=1,根据1!=1*0!,所以0!=1而不是0。 “

一点流水帐

1. emacs 23 与 ibus 冲突,ubuntu 910切换到中文问题解决。 感谢crazycode的指点。
2. 标签云 acts-as-taggable-on 插件,canvas explorercanvas感谢blade提供的信息
3. 读Rework,但是没有找到完全版。

新玩具

1.Try Haskell
http://tryhaskell.org
想用Haskell验证一下想法,可惜手头的机器上面没有装解释器?
现在有了这个在线Haskell解释器可以随时随地享受FP的乐趣了~

2.Try Ruby
http://tryruby.org
在线的Ruby解释器,看了TryHaskell的介绍就知道它的思路来自于这个。

3.NodeJs
http://nodejs.org/
好心人为Javascript的V8引擎编写的IO接口,包括文件和网络。
作者的例子中包括了一个小型的聊天室的服务器。

不多说了吧,祝大家玩得开心,用着舒心~~

Ruby的编码真愁人

我说这么好的语言在国内流行不起来呢。编码是个大问题。不管怎么说Java在这一点上做的还是很有先见之明的。而且做得也算最好了。编码的问题直接影响了我举的例子,本来是想拿blade的豆瓣开涮的,无奈编码问题没有解决。

不过今天还是比较有成绩的,第一,我的RadRails终于能加载nokogiri,究其原因多半是从前先装了RadRails后装的ruby1.8。反复重装几次也不能解决问题,后来把用户数据全部删除,重新关联解释器就好了。真是折腾死我了。

另外大家一定要用nokogiri,暂时不要去想别的解析器了,如果你看到别的教程说Hpricot好,多半儿这个文章是一年以前写的没啥价值了。不要走回头路。

补充一个非常好的学习地址

Railscasts

看演示,学ruby,让ruby在你眼前闪亮!

当然还有相应的文字版本,供那些喜欢安静,或者带宽较小的朋友。

home