2009-10-18

闭门写童话

  对于工行的网上支付,只能抱歉地说声再见.

  曾经有人说,IE6在国内的流行是因为有着各大银行的支持.
  之前并没有太多的想法.

  如今,在体验过工行的网上支付之后,我同情并理解那些痛恨IE6的人.

  技术的进步大多数时候都是将人类引向一个更美好的未来.
  因为技术进步的本质需求,是要为为人类提供更好的便利生活.

  但这里存在一个假设,便是技术会得到推广和支持,尤其是那些理应为推广新技术不遗余力的群体.
  
  可惜的是历史总是存在着烧死哥白尼的时间.
  
  不单愚昧在阻挠着人类的进步.
  更多是是特殊的专权,在阻挠着人类的脚步.

  中国有个掩耳盗铃的语言.
  从古到今,每一个中国人都在嘲笑着那种虚妄的安全感.
  但是,从古到今,都有人在努力地寻找,乃至制造这种安全感.

  清末的天朝上国正式在鸦片烟雾里,作者朝待四方的白日梦.
  甚至于再舰船礼炮破门之后,在刺刀的搁在脖子下的情形,也不忘摆大国姿态.

  如同丧家犬般,穿着破烂不堪的绅士服,演着自以为是的宫廷贵族.

  欺人并不可怕,可怕的是自欺.
  "有道之士"教育我们不要沉迷网络,因为网络里有洪水猛兽.
  于是,翻墙之后,果然发现有洪水猛兽.
  
  100年前,在闭关锁国里,相信已经有人懂得了如何翻墙.
  于是才有了思想激荡的1,20年代.
  才有了3,40年代流血革命道路.

  历史总是在不停地上演着相似的桥段.
 
  一边意淫着大国的梦,想要世界陪着一起意淫.
  一边上身摆架子,下身要尾巴地,向友邦寻求施舍,一边将讨来的东西换个包装便是自主产权大国制造.

  排斥拒绝着新的事物,得过且过地过着地主家儿子的生活.
  这便是所谓跻身世界XX强企业的生活现状.

  在没有了人事上的世袭制分封制之后.
  却形成如形形色色的变相财产分封.

  各家太子王爷们继承着家国天下的产业.
  划江而治,互不侵犯.
  一起把着国门的锁,将外来的妖魔鬼怪洪水猛兽据之门外.

  保护着一群不明真相的群众.
  于是,"从此大家一起过上了快乐的幸福生活".

  如此和谐的童话故事.

所谓设计模式和架构

  大致看了下关于bigtable和mapreduce的东西.
  
  想想,其实是google对于搜索引擎数据结构的一个解决方案吧.
  广泛一点说,是对于面向内容的分类的解决方案的.

  对于搜索引擎来说,主要有两个基础的数据:
  一是原始的抓取对象,表现为网页内容.
  二是对原始材料的分类信息,表现为关键字.

  bigtable对于这样的数据的处理,引入的是column family的概念.以传统的RDBMS理解的话,就是在url 和content列之后,有了一个不定数目的列数.

  仔细想想,换个方式理解,其实更简单.
  对于column family,更喜欢将其理解为tagging.

  因为搜索引擎本身承担着两种功能.
  抓取和分析.
  
  得到content之后,只要对其打上相应的tag便行了.

  如果要以RDBMS实现的话,便是简单地对每个关键字建立个表,然后指向相应的content内容便可以.
  而要依据诸多关键字定位page的话,也就是所谓的map reduce.

  先分类,在处理.
  也就是所谓的先map,然后再reduce.

  这其实就是分类处理的思想.

  而map很大程度上,跟集合有着天然的血缘关系.
  而搜索的目的就是在集合里找到特定的子集.
  于是,map > reduce > map > reduce...

  于是,纯粹从思想的角度考虑,bigtable和mapreduce不过是google对于搜索引擎需求的一个建模描述,或者说是基于内容个tagging技术.
  
  话说回来,有时候,所谓的架构或者模型确实是建立在需求之上的.

  软件产品脱胎于需求.
  而产品的架构,虽然某种程度上说跟需求无关.

  因为有着这么一个说法,就是说好的架构必然具有良好的扩展性.
 
  一种很理想主义的想法就是在设计出一个好的架构之后,无论需求如何变更,都能够适应.
  现在想想,这其实是本末倒置的误区.

  所谓的架构扩展性在于面对需求变更的时候,有良好的适应能力.
  其实质是,对于需求的变更,都能保证其跟原有架构设计的一些假设不会冲突.

  意思就是说,你的架构没有做过多的假设.
  比如对于一个这样的需求,偷菜写个函数.
  于是可能有这么些个实现:
   steal(vegetable)
   or
   steal(stealable)
   or
   operate(someting)
   or
   operate(onething,anotherthing)
   or
   operate( list onething , list anotherthing )
   or
   operate( list paticipate_1 , list paticipate_2 , ... )
   or
   getHandle(steal_vagetable).process()
   
   实际哪个实现取决于你做了多少假设.
   也就是说粒度细分到什么程度.
   
   而此时所谓架构是否有良好的扩展性,就在于,新需求会将粒度缩放到哪个程度.
   一旦细化的粒度小于当前架构的粒度,也就是架构不适应需求了.

   所以,最好的架构其实是没有架构.
   即不做任何假设.
   getHandle(steal_vagetable).process()

   这其实又是一个螺旋式的回归.

数字的奴隶

  看了麦兜响当当.
  印象深刻的是麦子仲肥.

  不和谐地联想到了高锟以及对诺贝尔奖的迷恋.
  还有曾经挂在嘴边的四大发明.

  网上流传着一句至理名言:
  手淫伤身,意淫强国.

  虚构的成本是很低的.
  而攀亲戚的成本更低.

  理论上,世界上所有人都互为亲戚.
  
  在一大批人鄙视韩国拿来主义的时候,却不知道对自己的拿来主意如何看待.

  还是说,抱着老子以前也富过的心态,继续在破庙里调戏小尼姑.

  看了梁文道写高锟的文章.
  其中有句很值得深思.
  大致意思是从前在香港看到国内许多"大师"著书的速度赶得上畅销书作者了,便感叹香港学术的落后.知道去了内地之后,才恍悟,原来香港其实还不错.

  想想,国人似乎对于数字式情有独钟的.
  尤其是这是能够数字化衡量大多数成效的时代,数字更是让一些人痴迷.

  在建国十几年的时间里,对于这种痴迷更是影响到了全国的实质生产里.

  不可否认,数字确实是衡量某些东西的依据之一.
  但不等于说有了数字,便能够反过来说明应有的东西.

  毕竟有些东西不是数字所能衡量的.

  但是,即便有过血的教训,但依然改不了对数字的迷恋.

  某种程度上说,这是国人自卑的表现.
  基于寻找能够证明自己的东西,来撇开诸如东亚病夫的牌子.

  或者如一夜暴富的有钱人,需要开那么一两件东西来告诉别人自己富了.

  说中华民族谦虚,也是是有点不准确.
  至少,中华民族还很婉转.
  
  想起很久以前看过的一篇文章.
  大致是谈为什么有人会愿意高价卖一个QQ号.

  这里面,也牵扯到国人对数字的一种病态迷恋.
  
  也许,这可以归结为中国曾经引以为豪的封建制度.
  以及其下的等级关系.

  之前是用服饰用具来标榜身份.
  当封建制度不在之后.
  尤其是在提倡按劳分配的社会制度里,"统一性"成了实际的社会现状.
  而且,现代贸易的发展,也将商品的流通彻底市场化.
  纯粹的买卖关系,不在能够维持固有的阶级代言方式.
  于是,需要寻找新的,独特且稀有的方式来区别各个阶级.

  而这一种方式需要满足几个条件:
  1是通用性.即能在最广泛的范围内找到这种阶级打分的凭据.
  2是稀有性,即本身必须是稀有的且不可复制的独特的.不然,如果能够随意批量存在的话,也就失去了阶级性.
 
  于是在流水线制造的社会里,编号成了这一个稀缺资源.
  不管流水线有多长,特定规则的数字数量总是有限.
  
  对于国家或者一个特定团体来说,也是如此.
  需要一些特别的数字来装饰.

  说到底,这是一种炫耀心里.
  在深层一些来说,是希望得到别人的认同.

  所不同的是,这种认同是别人对于自己进步的认同.

  也就是说,对这种认同度的争取,其实是献媚心理.

  直到别人说好了,才觉得自己好了.
  不然总是惶惶不安.
  生怕做奴隶而不可得.

2009-10-17

变节

  终于有点时间,却忽然觉得无所是事.
  游戏没玩了,书手头上也没有.于是只好找电影看.
  顺手把豆瓣加了些tag,方便以后"被推荐"一些合口味的电影.

  <<变节>>,又一港产卧底片.
  冲着黄秋生和曾志伟而去.
  看完之后,感叹黄秋生的一句话:能把烂片演好的演员才是好演员.
  而黄秋生确实做到了.

  自从无间道成功之后,港产警匪片便重新找到了写作点. 
  从前的警匪片,卧底是配角,即便不是配角,也不是故事的主线.
  无间道之后,卧底风光了.

  也确实,关于正义与邪恶的内容被写烂之后,夹杂在黑与白之间的灰,能挖掘的地方自然会多一些.
  当年的古惑仔也是如此.

  说到底,还是灰色更接近于现实的色调.
  也因此更容易让人有代入感和参与度.

  人终究不是极端的.
  过于正面的,也只能尊称为伪人了.
  而穷凶极恶的,更是从来不存在的.

  回顾整部片子.
  尽管laughing哥出现在了片子的副标题,而且确确实实地,全篇大多数镜头都给了他.
  但看完之后,总感觉一哥才应该是主角.

  也许是个人喜好使然.
  毕竟,看片也是冲着黄秋生看的.

  入警队,当卧底.
  回去之后受到歧视.
  这是一哥的无奈.
  如果不是冼sir给了他"两个选择",也许,他也只能继续过着里外不是人的生活.
  正是冼sir那句话,将一哥送出了警队大门,将一个推向了洪兴.

  做卧底的忍辱负重,非但没有获得别人的认同,反而处处受人怀疑.
  与其继续等待被人的改观,不如讲错就错,走入黑道.
  这是一哥无可奈何的选择.
  
  不是一个不能忍,不能等,是这样做让一哥看不到价值的所在.
  当laughing出事之后,面对座头的百般嘲弄挑衅,一哥都受了.
  要给他知道,总有一天,座右会死在自己手里.
  
  而冼sir的一番话,让一哥彻底地对未来失望.
  
  既然冼sir说只有两条路走.
  那么他只能往洪兴走去.

  正如他自己所说,做蛊惑仔的好处在于,不用担心应该相信谁.
  言外之意,在于讽刺卧底的生活窘况.
  除了接头人,谁都信不过,也谁都不会信.

  一哥的麻木不仁来源于他曾经的卧底现在的古惑仔身份.
  某种程度上说,一哥仍然有着警队的某些特质.
  之所以有laughing,也是一哥的某些仁慈所致.
  
  做古惑仔,其实是被逼的.
  但他没得选择.
  
  他是个不属于黑道,也不属于白道的人.
  不是一个隐于灰色地带的高人,而是一个只为自己生存而努力的人.

  于是,他开始帮laughing.
  因为他自己也曾经是个卧底,知道卧底的生活.

  但是laughing始终还是倒向了警队.
  他只能求自保.

  只能设局除laughing,除座头.

  一哥的悲剧性就在于此.
  没得选择地成了二五仔,成了没人相信的人.
  于是,他只相信自己.
  只关心自己.

  曾经,laughing的出现也许让一哥重新开始有了交朋友的感觉.
  但是,laughing的警队特质,让一哥重又回到了六亲不认的地步.

  影片最后的一段其实挺有意思.
  一个卧底倒在了自己同胞的枪下.
  尽管死前还表明了身份.
  
  某种程度上说,这其实是一哥的结局.
  
  想想,一哥是死在laughing枪下的.
  而laughing曾经是一哥最相信的人.
  甚至于在laughing用枪指着一哥的时候,一哥依然有自信laughing不会开枪.

  因为他也曾经是卧底,知道laughing现在在想什么.
  但结果是,laughing开枪了.
  一哥带着愕然的眼神倒下.

  他没想到.
  尽管此时的他早已不再相信laughing.
  但他不明白.
  
  他不明白laughing为什么能够开枪.
  为什么同为卧底,laughing会和自己不一样.

  其实,这个结局也许是受限于laughing哥,受限于这是一部前传.

  否则,死的应该是laughing.
  一哥射杀laughing,然后一哥被射杀.
  这样,两个卧底,两个不同心态的卧底都死了.
  也更能让人去思考卧底存在的意义.

  如同一哥所说,为什么正义的警队,却要教人做去欺骗去背叛.
  为什么做了卧底,却在两边都不能立足.
  
  这是一个关于"正义"的代价的命题.

2009-10-13

从开心农场谈起

  传腾讯买断开心农场.

  想想其实很符合腾讯既有的策略.

  毕竟,QQ之于腾讯已经发展到了windows之于微软的地步.
  而腾讯也很明显地,在发展的轨迹上跟微软是相似的.

  平台为王的战略.

  在陆续推出了几个好的软件和服务之后.
  或者说在抄了几个号的软件和服务之后,QQ的平台做得更大了.

  将现有的QQ用户导一部分到新的应用中,于是,这些应用从一开始就有了高的人气.
  而人的猎奇心理也会带领相当部分QQ之外的人参与到这个应用中来.
  而这个应用如果恰好又是跟QQ绑定的话,那么,腾讯的抄,其实是将其他类型的非QQ用户"抄"了过来.

  于是,只要腾讯能做出来,就能将任何类型的用户整合进来,成为腾讯如何服务的用户资源储备.

  这是一个良性的异常完美的循环.
  QQ用户为QQ新产品提供源源不断的用户群.
  
  某种程度上说,只要腾讯做一个产品,就不愁没人用,不愁没有用户.

  这便是平台的魅力.

  所以,基于这一点,腾讯买断5分钟的开心农场很正常.
  而且,有数据页显示开心农场的相当部分盈利来源于QQ农场.

  说白了QQ农场的火爆,一个方面是产品设计确实完美,一方面也是有QQ用户这个几乎取之不尽用之不竭的用户来源.
  因此,某个程度上来说,是QQ在养着农场,是QQ掀起全国的偷采风潮.
  
  这样,腾讯自然会打小算盘.
  毕竟,按照现在的趋势,只要运营农场就必然有源源不断的钱收,与其在这个由自己制造的风潮里让别人获益,不如自己独吞.
  所以,买断农场也是可以理解的.
  关键在于农场还能火多久.

  想想农场为什么能火.
  
  农场在游戏的玩法上给了人两条路走.
  要么偷采,要么做老实农民.
  从表现上看,这是似乎是个很简单的游戏,偷采种菜.
  但是仔细想想,其实这是一个"开放"的游戏世界.

  想想一些经典游戏,尤其是RPG游戏的共同之处.
  那便是开放性.自由度.

  让尽可能多的人投入到游戏所设定的情景里,这便是RPG的精髓,也是所有游戏应该追求达到的目的.
  参与性,投入感,是游戏的首要准则.

  而农场显然用了一个大巧若拙的形式,达到了这个目的.
  想想偷菜对应的是什么.
  人性里的阴暗面.
  而种菜呢.

  没错,是人性里积极的一面.
  "劳动最光荣"
  通过劳动,可以得到各种各样的东西.

  可以说,种菜和偷菜,就人性来说,已经囊括了所有类型的用户.
 
  有时候,最复杂的东西就是最简单的东西.
  
  因为其简单,所以不确定因素便多.
  也就意味着结果也随着变得多样.

  WOW之所以受人推崇便在一其高自由度.
  而这一切都是受益于wow的"松散"性.
  没有过多的限制各种各样的东西,包括肢体动作伤害环境等.
  一切都有着很好的扩张性,极力模仿着现实世界.
  在物件的粒度上,尽可能地让所有东西都能够演算出来,而不是靠诸多的条件限制它.
  不像一些游戏,到了悬崖边却发现其实是掉不下去的.

  忽然想,其实所谓软件架构的灵活性,其实来源于需求的设计.
  明确的需求是建立可扩展软件的基础.

  因为需求的改变其实是不受限制或少收限制的.
  而软件,或者说代码,毕竟是成文的.
  改起来不是说说就完了的.

  或许这也是设计模式存在的理由.
  为了尽可能应付不同的需求变更所总结出来的best practice吧.

2009-10-09

一个基于交换密钥的安全会话模型


一个关于web环境里身份验证的模型.
基于交换密钥的设计.

基于一个假设,即password是client和server才知道的.

于是,在初始的时候,client生成一个随机变量,经过单向哈希之后成为一个定长字符my_key_client.在web环境,这个产生过程在本地进行.也就是说,除非能监听到本地动作,那么my_key_client对于client之外的所有人都是不可知的.
而如果能够被监听到,那么,也无所谓安全性,因为username和password也是可被监听的,也就不需要继续将安全性谈下去了.

将password单向散列为另一个定长字符串friend_key.而此friend_key,理论上只有client和server才知道.(password只有client和server才知道)

于是,将my_key_client以friend_key作为密钥做一个对称加密,同时,将一些需要加密的信息用my_key_client加密,传送到server,server就能够逆运算出my_key_client,进而逆运算出加密内容.从而使得client的发送是只有client和server才能解密的.

有个问题,如何保证server逆运算出来的my_key_client是正确的呢?
对于对称加密算法,不同密钥可能解除不同的内容,而在以上的条件下,无法判定解出的内容即是原始的内容.
即,如何判定解出的my_key_client是原本的my_key_client.

于是,我们需要一个checksum.
checksum一个由交换内容friend_key和my_key_client拼接后,利用单向哈希生成的一个定长摘要.
这样,理论上,这个摘要依赖于my_key_client(freind_key是对方已知的),所以,某种程度上,它也是唯一的.只要解出的my_key_client和接收到的exchange_key再做一次这样的摘要运算,如果两者符合,那么可以认为my_key_client是原始的my_key_client.(无数学证明)

这样,对于client来说,可以安全地与进行身份验证.

在验证完毕之后,server是拿到了my_key_client.
也就是说,此时server拿到了除了client和server之外,无人能知的key,所以,类似client,server也可以在本地生成一个随机密钥my_key_server,同时将my_key_client作为server端的friend_key,进行如上的操作,也能达到安全的通讯.

于是,client和server可以在每一次完整的会话之后,都改变密钥,且保证了会话的次序.

因为,即便某一次,会话被劫持了,被第三方伪造了一个假的加密内容,但是,由于第三方无法找到加密用的my_key,所以,伪造的内容无法在如何一方通过checksum的认证(因为checksum必然是不匹配的),那么,除了能够保证会话的安全性之外,一旦会话被劫持,整个会话也就失效(因为任何一方都不能再正确解密内容,前面说了,正确与否在于checksum是否匹配,而checksum必然是不匹配的).
所以,基于这个模型的会话,应该是比较安全的.

至少,不会被劫持,或者在传输过程中被偷窃如何东西.

伪代码流程如下:
client:
my_key = digest(random());
friend_key = digest(password);
exchange_key = xor( my_key , friend_key );
checksum = digest(my_key + friend_key);
save_local( my_key );
send( exchange_key , checksum);

server:
receive( exchange_key , checksum );
friend_key = digest(password);
my_key_client = xor( exchange_key , friend_key );

if( digest(my_key_client + friend_key ) == checksum )
pass secure check;

my_key = digest(random());
friend_key = my_key_client;
exchange_key = xor( my_key , friend_key );
checksum = digest(my_key + friend_key);
save_local( my_key );
send( exchange_key , checksum);
else
deny acess
end-if;

client:
receive( exchange_key , checksum );
friend_key = load_loacl();
my_key_server = xor( my_key , exchange_key );

if( digest(my_key_server + friend_key ) == checksum )
pass secure check;

my_key = digest(random());
friend_key = my_key_server;
exchange_key = xor( my_key , friend_key );
checksum = digest(my_key + friend_key);
save_local( my_key );
send( exchange_key , checksum);
else
session was broken;
end-if;

server
...

聊聊卡布里尼

最近看了部片叫卡布里尼,算是可能这段时间来比较有意思的一部电影. 故事也不算复杂,就是一个意大利修女去美国传教,建立慈善性质医院的故事. 某种程度上来说,也很一般的西方普世价值主旋律. 但是如果换一套叙事手法,比如共产国际的社会主义革命建立无产阶级广厦千万间的角度来看的话,也不是...