google reader 朋友规则简化

今天下午google reader忽然发给我好几十个邀请,是一堆buzz上fo了我的人,现在想要我给他们分配在reader上comment我的权限。由于这个权限我设定是在某个group里的人才能comment,导致权限设定很麻烦,直接点击他给我的一个allow-ignore链接,他会弹一个对话框告诉我,无法这样简单设定,需要到google contacts那里面去设定。

说起来google contacts还真是一直都做得比较混乱,各种不同类型的关系和权限级别我一直都没搞清楚。再加上很多buzz上fo我的人,他隐藏了自己的gmail地址,我还真不知道怎么弄才能把他弄进group里去,直到后来才发现点击他的名字link,会进入到他的reader share列表,那里会有一个link引导你把他加入一个group。。不过这操作流程也实在太不友好了吧。。要找这么久。。

没过多久,大概一个小时?刷新reader的时候发现google立即简化了自己的朋友规则,现在所有fo我的人都可以在我的item下面comment了。恩这样才是合理的嘛。

其实人际关系是所有关系里面最复杂的东西了。也难怪这部分google总也做不好。如果只是做通信簿还挺容易。但是涉及到人际关系,要把人分组,分类,设定权限。。这就太复杂了。尤其是又要涉及到隐私问题,又不能随便实验。用google那工程师脑子,不太可能搞得好这部分内容。他们现在开始尝试简化这部分,也是一个有益的尝试吧。

gcj又败了。。不甘心啊

呼这两天一直在玩gcj,本来还挺有信心的觉得应该能进第二轮,结果又悲剧的死在门口了orz|||

round 1A是早晨9点开始的,我8点多爬起来玩,可能是早晨确实状态不好吧,连第一题脑残题都没做对,事后发现居然是遍历数组的时候写反了i和j,绝对白痴啊。后面的动归和数论题其实也挺简单。事后想想其实1A是最容易过的,题目又不难,参赛人数又少(只有2000多人)。没把状态调整好结果挂了挖哈哈。名次都是倒数几名里面的。

round 1B是半夜0点开始搞到2点半。没想到题目出奇的简单,几乎所有人都做出了前两道题。结果我居然卡在第三题上了,第三题是类似斐波那契数列那样可以顺序求值的一个数列,只不过每求一个新的元素的时候需要一些判断条件,我就卡在那个判断条件上了。。是因为过了2点脑袋就昏了还是怎么也不知道,明明只需要加减法的一个等式,偏偏是推了半个小时也没推出来囧|||可能室友熄灯睡觉了让我也犯困了吧(喂喂找什么不搭界的借口啊。。)结果由于第二题小数据错了一次,排名排到了1013名。。离入选下一轮的1000名仅有13名之隔。。呜怨念啊。。

round 1C是最后的机会了,时间是下午5点。第一题依旧脑残之外,第二题我貌似没有看清题意。我直接用对数再算二分法的时间复杂度(又是2的对数)给的结果,小数据提交正确了。我看了一下大数据给的范围用double没问题,就没改代码直接又提交了大数据。当时名次是300多名,并且到比赛结束的时候还是480多名,虽然第三题再次悲剧的没做出来(第三题实在是简单,问题是实在是太麻烦了吧。。不是拼算法是拼编程速度啊。。我这样没有练习过的人只有悲剧啊。。)我还一度以为这次可以开心了。结果没想到第二题大数据判错,把我摔到了1100多名。呜现在暂时没心情。。过一会去下载个正确解看看。。第二题究竟是啥地方我没考虑到呢?还是完全错解了题意小数据只是碰巧对了?

呜总体看来这次失败问题还是很多的,最重要的问题就是理解题意的能力太差,很多题基本上都是提交小数据判错才知道其实根本就是题意理解错了。。囧|||至于说编码太慢,写个遍历写半天,这种问题是没办法了。。懒人平时不练习最后就只有这个下场。。不过话又说回来round 1的比赛还真没有什么算法,基本上都是枚举解决问题,或者一行公式搞定。。基本上是考察编程基本素质的。。唯一用到算法的可能就是几道动归题了(呜全都悲剧的来不及做。。)

不过经常参加参加比赛打打酱油还是蛮有好处的,这三次比赛咱的状态也是越来越好,到1C的时候前两题也差不多40多分钟就搞定了。不像1A的时候磨蹭了1个多小时一道题都没搞定。。

总归,反正我也不是专门搞这个的,强身健体参与第一啦(又来自我安慰了囧|||)

明年再努力吧!这之间有时间就加加油多练习就好啦,趁着读研的闲空~

Google pac man

google这次换的图标太有才了。。居然把游戏直接嵌上去了。。
而且原来的“手气不错”按钮变成了insert coin…可以支持两人对战!
分别是方向键和wasd。。。一男一女。。。pac man & pac woman。。。
太强大啦。。

还能相信谁

最近在网上看到太多让我绝望的事情,各种内幕大便汁灌臭豆腐,还有http://feedproxy.google.com/~r/chinagfwblog/~3/yYg_7VxoIxk/13.html。愈发让我感觉到整个社会根本就建立在一个其实早就瓦解了的基础之上,摇摇欲坠。

之前消息传出,我们即使是说赖以生存也不为过的互联网,只需几个小时就可以让他全面崩溃。那个时候我说,互联网是建立在互相信任体系上的学术模型,对当前的商用领域不能符合要求。当然互联网最初是为了军事目的建立的,但是建立之初他只是作为一个内联体系,没有考虑过要和自己的敌人,或者竞争对手存在于同一个网络之上。因此他现在的诸多不安全因素,其实也源于它本身的“公理”,他建立时所依据的最基本的一些假设。那就是大家使用这个网络都是出于好的目的,能够遵循协议并且互相信任。这是互联网的基础。

互相信任,这是互联网的基础,也是整个社会的基础。这是我那个时候没有想到的。你去理发店剃胡子,理发师随时可以将你的喉管割断。你的钱存入银行,银行随时可能破产。你买房子,从没问过地基究竟挖了多深;你去饭店吃饭,也不会(现在是也不敢)琢磨这饭菜究竟是走了怎样的流程在摆在眼前的。

因为整个社会的运转,必须是建立在最基本的互相信任的原则之上的。否则人生将成为一场永无止境的战争,你的每一个睡梦都将被冰冷清脆的后窗敲碎的声音惊醒,被永无宁日的轰鸣的铜钟扰得不得安宁,被焦急和燥热似无数蚂蚁上身而痛苦不已。

然而,信任,这社会运行的最基本的一环,正在渐渐破碎。

未来究竟会成为什么样子呢?我小的时候曾经做过这样的猜测:1)要不然有一股强大的力量足以维护每一个人的利益,使得大家都得以放下戒心和手中的武器,2)要不然所有的人都变成武林高手,有钱人顾保镖,有力的人开武馆,穷人和老弱病残只能忍受人间炼狱的痛苦和同样生而为人的手足同胞残害。

没有人希望情况变成后者,那跟无政府主义有什么区别,假如没有一种至高无上的力量足以遏制形势挽回局面,整个社会最终只有分崩离析,堕入永无天日的窘境。

但那强大的力量是什么呢?3000年前,社会动荡曾经比当今还激烈,诸子百家没少争吵这股力量究竟该是什么。没有人给出解答。是军事和行政的强权吗?秦灭足以为证。是所谓“仁义道德”吗?生活困苦的百姓连饭都没有的吃那什么去念仁义道德,蛀虫和瘴虐作威作福,用什么去推动他念仁义道德。是宗教吗?看看西方宗教历史的丑陋血泪和腐败,哪一点比不上无神论者。是财富吗?用钱能买的来文明吗?还是说只能买的来鬼推磨?

先别说集体吧,先说自己。在这么一个恐怖的世界里,一个人究竟还能相信谁,相信什么?新闻报道?我们看得到的只是不同派别不同利益集团的争权夺势。只不过是我们也恰巧属于其中的某个利益集团,因此就觉得某些人的话格外好听,而另一群人的话格外刺耳或格外可笑而已。饮食卫生?吃的喝的最好尽量出自己手。虽说自己种地是种不了了,但是少吃饭店,少用乱七八糟调味料,少用别人加工过的东西,总归是有好处的。医疗保健?现在医院已经是最不可靠的黑洞了,能不去医院尽量别去。流感是绝症,医院又治不了的,平日强身健体,经常接触病原,感点小冒,闹点小肚子,反而是好事,不干不净吃了没病,其实也不是瞎说的。 记得小时候看读者有篇文章叫“健康人不怕传染”,印象很深。所谓小病不断,大病不来,让身体的防御系统随时处在备战状态,身体自然硬朗。至于得了大病,开刀动手术免不了的,哪怕多交钱,也比被医院害了强。至于绝症,我有自己的看法,假如我得了绝症我就不治,让他该怎么着怎么着,我该咋活还咋活。又化疗又放疗的,头发掉光身体浮肿连话都说不出来,就为了多续几天命,在我看来没意思。有那闲钱多享受几天短暂而美好的炼狱人间不强多了。更别说保健了,啥补品啊美容啊减肥药啊增高鞋啊从小就没信过,今后更不会信,但愿所有人都不要信。真正该信任的就是自己的身体,他生是什么样子,就该让他按照自然的法则去运作。用人造的去掩盖甚至替换自然的,就像用破布去掩盖真金。

又回到前面关于社会的讨论,要在这样一个恐怖而黑暗的世界上活下去,要拥有的,除了勇气和正义之外,还需要的就是智慧。上天赋予人智慧,除了用于互相欺骗互相摧残互相杀戮之外,也是用来互相帮助以存活下去的唯一希望。我以前太小了,总觉得自己了不起,有一颗还算灵光的脑袋,能解习题,能听懂故事和传说。那时候幼稚的我狂妄自大,瞧不起因循守旧,固守着自己的经验不放的“老年人”。瞧不起用拼命做习题用套模式套公式的方式解题的“死脑筋”。但是现在我认识到自己的错误了。其实人的智慧,正是来源于经验。人的智慧,本来就是用来分析整理所有这些经验的一个模型。庄子有句话说的很好:“朝菌不知晦朔,蟪蛄不知春秋”。没有一整天的经验积累,就不可能知道昼夜交替,没有一整年的经验积累,就不可能知道季节变换。同理,人生苦短,经验不足,更不可能了解以世纪为单位以纪元为单位的变化。因此,除了不断积累自己的经验以外,学会利用他人的经验,利用历史的经验,是延伸自己智慧的必须手段。

上两节貌似说跑题了,其实也不算跑题,主要是说在这个黑暗的世界上个体该如何挣扎吧。至于群体呢,我想,也就是前面说的那股“强大的力量”,可能就是求生的本能吧。

每个人都希望能活下去,能活得更好,能享受这人生炼狱里的每一分每一秒。这种本能在人与人之间传递,或许最终能够拯救世界。当人与人之间再也无法信任,当运一担“生辰纲”都要雇镖头押运,正大午赶太阳路还生怕遭了劫匪,当最平常的信件都必须加几层密码,还要怕被人偷换过签名,当饭不敢吃水不敢喝夜不能寝食不甘味,人人自危,生活好像无以为继,假如人类社会到了这种程度,居然还有机会继续前进,假如文明竟然幸运到不至于就此止步,那一定是求生的本能唤醒了人心底最后一丝良知。大家终于决定停止互相欺骗的战争状态,终于决定坐下来,制定一个协议,共同遵守,互相信任,互相帮助,那这个社会才有可能在那崩溃的边缘,终于煞下车。当人们受够了苦难,最终应该能学会放弃目光短浅的小聪明吧。毕竟大自然赋予生物的两条路,正是促使生物繁荣昌盛的基础,一是求生之门,一是地狱之渊。

当然,正如庄子所说,小年不及大年,小知不及大知,以世纪为单位的人类文明的脚步,将向何方前进呢?仅以幼稚的我,当然无法判断,正如寿命仅有几个小时的短暂生命,无法判断,这恐怖的黑夜,究竟什么时候能够结束,一样。

lisp学习笔记

2013年重读这篇笔记,错误很多,对定义的理解有很多混淆;作为自己学习和成长的记录不再将其中的错误一一纠正了

刚刚开始学lisp,还只是开始熟悉他的语法。但是学lisp确实是开阔眼界的一个好办法,能从更高的角度来看程序语言。

至今为止任何类型的程序语言其实都是图灵机的一个实现。比如说经典的x86 CPU吧,他就是一个图灵机。这个问题我其实还是想了好久才想出来的。可能是我太愚钝了吧。。图灵机的一种描述是这样的,存在一个两边都无穷长的纸带,一个含有一系列状态和命令的指针。这个指针一次执行一个命令,或者向前或向后移动一格,或者在纸带上读取或写入一个符号,命令有可能改变指针的状态。而读取到的符号会根据指针的当前状态产生一个新的指令。循环往复。直至到达某个特定的状态(终态)停止下来。

一开始我觉得CPU的寄存器表示状态。可这样的话,寄存器的值是不确定的,于是似乎不能模拟确定有限自动机。静下心来想想,其实应该认为所有寄存器的一种取值组合就是一个状态,所以假如有m个寄存器,每个寄存器的取值数量是ni,则总的状态数量就是i从1取到m, 将所有的ni相乘。(不能打公式郁闷。。)然后应该认为汇编代码就是那个带子上的符号。这样比如

ADD a, a, b ;a=a+b

这样的一条指令,应该看作是一个符号(所有可能的汇编指令应该是有限的,可以认为每一个都给编了唯一确定的符号)。这个符号对应CPU的不同状态,(例如这里的a和b的所有不同状态组合),可以看作每个状态都有接受了这个符号之后指向一个新的状态的箭头。使得寄存器状态改变。比如对于a=1,b=3这组状态(1, 3),这个箭头就应该指向(4, 3),当然这里没有考虑溢出位啦。同时又存在一些其他的操作,例如处理内存或中断的操作,可以看作是向纸带上的特定位置写入字符(由于内存和中断的数量也是有限的,所以可以给他们的每一个地址对应纸带上的一个位置)。

那么lisp呢,lisp是怎样实现图灵机的呢?

根据lisp1的自解释逻辑,可以认为lisp是一个不断扫描输入纸带的一个指针。他的状态则由输入中给定的“环境”决定。可以认为lisp仅有函数定义和函数调用两种语法。对于函数定义,其实是增加了新的状态组,把它的所有形参的所有取值组合看作是一组状态加入到自动机中。而函数调用,就是将实参值带入形参,计算函数结果的过程,对应于状态接受一个输入指向另一个状态的一个箭头,即在此实参情况下,如何应该进入什么样的下一个状态(次态)。

不过很有趣的是,鉴于lisp的递归定义,可以认为他的状态机也是递归的。在运行的最初,该状态机仅有函数定义及函数调用的最基本语法。指针扫描纸带(程序源代码)一遍,生成了最外层的函数定义,这是状态机为这些新函数增加新的状态,之后指针移动到该函数调用的起始位置,第二遍扫描源码,生成新一层次的函数定义,向状态机添加新的状态,直至最终所有的函数定义全部生成结束,递归到最底层,所有的实参都被计算成为原子,再依次递回,直至最上层。

从这个角度看lisp的有趣之处在于他用自己的规则定义自己,不断充实自己。不过也因为这种灵活性,使得用c实现一个高效的lisp编译器变得有些困难。一开始我在考虑的是lisp只有递归没有循环,确实不符合c语言的常规思路。不过转念一想,尾递归优化成循环其实倒反而是一件轻松的事情,只需要将形参改成自变量,把递归调用的那一句改成goto到函数开头就可以了。然后再改成while循环即可。麻烦就麻烦在这个函数的动态声明。有没有可能一次扫描完lisp文本之后就确定全部的函数定义呢?给定两个附加条件,一是所有的函数定义必须在他的调用的同一级或外层(注意这里指的是定义这个函数的外层,而不是调用这个函数的外层),二是函数定义必须在函数调用的前面。这样就可以逐级求值而避免递归了(相当于首递归)。当然这里避免的仅仅是(相当于)编译期的递归,在(相当于)运行期的递归仍然是避免不了的(也不可能避免)。当然对于lisp而言,编译和运行是交叉进行的,也没法分得这么仔细啦。(所以才说是解释型语言嘛。。汗)当然话说回来,将lisp先编译成机器码再运行也是可能的。只是编译时间会比较长而已,而且对于变量类型可能要做一些处理。(最简单的想法是用链表,不管是树也好,字符串也好,数字也好,都可以用链式结构存,以适应lisp的list结构。)

好吧,先做这些记录,下次有了感想再写了。

呼,因为结束实习,搬家,赶毕设,一下子好久没有写博了呢。。今天终于补了一篇。。证明我这段时间也没有荒废时间啊。。以后还是要经常写博客自勉啊。。回头看了一下大半夜的逻辑有点混乱估计有写错的地方。。不过天色晚了没心情挑错了,改天再回来改吧。。