2013-02-24

反向代沟

看新版笑傲江湖的某些弹幕,忽然觉得代沟这个问题其实是双向的.

前人固然可以去了解和接触后人的人生观世界观,并维持某种程度的同步.
但是前人本身的生活背景对于后人来说,却未必有大的价值,从而引发反向的同步.

这个造成的问题就是,你所认为应该是常识的东西,后者可能会觉得新鲜.
而尤其如果前人试图借助这些所谓常识去宣传一些东西的时候,可能就不会有相应的效果.
因为对于后者来说,缺少了对应的上下文.

就像一个人也许觉得仙剑是神作.
但是,对于新生的人来说,可能是很难接受的东西.

而且,这种感觉也往往是记忆所修正美化后的感受.
即使本来不如何,但是经过模糊化处理之后,可以产生时代性的共鸣.
但是,这种共鸣对于新人来说,是不可能存在的.
因为没有相应的背景经历.

也就是说,即使一个人能够完全地同步后代人的所有背景知识,但是在交流和沟通的时候,依然会存在代沟.
而且这种知识背景的差距基本上是不可俞越的.
因为沟通及理解是双向的.

尽管有些东西可能会再次流行从而在新老之间完成继承同步.
但是多数情况下,是不会有此幸运延续的.
能够所谓流芳百世的也只是一小部分.

而问题在于,一个人似乎并不能很确切地知道,到底哪一部分是对方所没有的.
因为对于前者而言,这些都是常识.

所谓常识,就是毫无怀疑的理所当然的前提条件.

这就有点有趣了.

也就是隐喻着,沟通始终是存在障碍的.

换个角度看的话,就是各代的文化总是会有其奇特性和差异的.
而有些微妙的是,这种差异可能并不是因为新生了什么东西.
反而是缺失了部分所造成的.

当然,事实上的差异更可能是同时由这新生和缺失构成的.
但是,这种缺失所造成的差异,似乎更为有趣.

因为缺失的部分并无所谓的优劣,而只是纯粹的空白所造成的.
也就是说,无论多好或者多坏的东西,都有可能成为这一部分.

换句话说,从整体上来说,无论多么优秀的东西,都可能会消失.
而且这种消失,并不见得是后代不接受.
而是前辈不"给予".

所谓反向代沟

2013-02-19

Chrome扩展的碎碎念

假期长的一个好处就是,说不定很快就会闲的略感无趣想找些事情来做.
即使之前可能还想着终于可以休息了.

在家今天,心血来潮就想着写个chrome的代理扩展.

之前一直在用Proxy SwitchySharp.
想重新造轮子的原因也并不是不好用.
只是实在找不到什么事做.

另外一个原因是每次换个设备就要重新添加代理规则.
虽然也有现场的GFW list,但到底有多数其实是不用的.

于是,基于这个动机,开始便打算改改switchysharp,加个同步功能好了.

但是在看了相应代码之后,考虑到license是太喜欢GPL,于是只好放弃.
向上游的switchy plus看也是一样,GPL license.

只有原始的switchy是除GPL和MIT dual license的.
只是不知道具体什么情况是GPL,什么情况是MIT而已.

发邮件问作者,也没回复.
看来英文表达实在是太不堪入目了吧.

所以,只能重新开始.

不过要真是从switchy开始的话,改动还是挺大的.
毕竟历史原因,switchy时代chrome还没有原生的proxy只是,所以只能生成pac script然后通过对于OS的native 调用去修改系统代理设置.

看了下chrome的proxy api,其实也就三两行而已.

原则上来说,这几行就足够了.
手写一些pac然后save的local和storage里的话,就行了.

但浏览API的时候发觉似乎能够拦截浏览器请求,于是想,检测下RESET之类的,自动添加生成也省一些功夫.

于是,拦截了一些比较大几率是GFWed的失败请求,然后生成pac自动apply了.

到这里,本来也没什么事了.
但是忍不住想把能合并的规则,比如a.wordpress.com,b.wordpress.com之类的合并为*.wordpress.com.
于是这几天的事情就是调试这个.

结合自己几天的使用下来遇到的一些edge case,只尝试合并了二级域名以上的.
不然,像a.org,b.org之类的很容易合并为*.org,最后就变*了.

另外一点就是最初其实考虑到storage的大小限制,所以在记录失败网站的时候加入了计数器.
原始思路是想如果超出storage限制的话,自动抛弃计数小的.
毕竟,数值小代表访问频率低.

但最后还是没把这个限制检测加进去.
因为实际看了下自己的使用情况,实际条数也不多.
而且真到有必要的时候,大概也比较容易吧.

遇到的一些问题,比如偶尔浏览器会卡住一段时间的现象.
如果不是最近chrome版本自身问题的话,那就应该是并发访问一些数据结构造成的race问题吧.

也懒得去验证了.
简单地用alarms做延时修改和合并.

因为文档上指alarms的触发时间只是大约的限制,并不严格.
而且开发时候也没遇到特别严重的延时,大致能接受.

但是放到chrome store上之后,似乎就延时比较严重了.
推测是开发时候的调度优先级高一些吧.
于是只好最终去掉.

反正调度有延时,那竞争情况也顺应地会少些吧.

于是最终产品就是类似这样的.
http://goo.gl/HMZ5H
然后简单地写了个配置页面方便添加代理服务器.

至于实际使用起来,还是有些不太友好的地方.
如果网页是被RESET,那自然很好,刷新一下就可以了.
但是如果是一些干扰性的,比如DNS污染或者干脆连接干扰,造成页面长时间加载不出来的话,只能等最终timeout再刷新了.

有想过想switchy系一样支持手工加入规则.
后来想想还是算了.
毕竟涉及用户交互,要容错的地方比较多.
行数应该少不了.

另外一点就是,看API的时候看到似乎能够直接修改请求结果.
这样的话,理论上,加个background page,然后把goagent之类的用javascript实现一遍也是可以的.
或者直接透明修改请求应该也可.

最后一点是关于这个窥探请求带来的一些风险问题.
毕竟所有请求内容都是可见的.
如果用来做些其他什么事情,加上用户可能不太关注的话,很容易出问题.

所谓技术的中立性嘛,协议或者API什么的本身并没有好坏之分.
关键在于用的人.

尽管,设计的开始就应该考虑到这类API可能被滥用带来的问题.
但是,凡是考虑也都会有疏忽的地方,免不了一些看似常规的手段滥用.

就像TCP至于GFW.
技术角度看,完全是合理而且优雅的.

Don`t be evil.

2013-01-27

纯粹商业逻辑

断断续续看完 美国宪法评注.

一个感想就是,经济基础决定上层建筑 这句话也不是没有道理.

独立战争前,美国各个州不过是各殖民公司的属地.
相互是独立平等的.

而这点也是为什么后来为什么会以联邦形式存在的理由.
因为本来就只是为了共同抵御帝国的反扑而建立的贸易联盟性质的团体,因此也就没有超越各州存在的一个中央权力.

独立战争在某种程度上是一种贸易权利/商业利益的抗争.

尽管各殖民公司在殖民地的运作和裁决几乎是独立于帝国的,但是由于帝国要求各公司必须注册在本土.
因此,实际上是受制于与英帝国管辖的.

而从根本的点上来说,殖民公司本来就是帝国贸易的一种方式.
只不过通过税收的方式换取实际的贸易利益.

所以,从殖民公司的角度来说,是以税收换取自治权.

在收入还足以抵抗税收的时候,这种帝国殖民方式并没有什么大的问题.
但是,一旦税收造成的经济负担到达某种临界点的时候,就有可能引起殖民公司的不满.
这也就是独立战争的契机.

所以,从这个程度来说,联邦的建立不过是因为各个殖民公司有着需要共同解决的问题,同时因为属于不同的殖民公司,又不存在一个足以兼并其他公司的巨型存在,才有不得已而为之的一个折中结果.

这也就注定联邦政府只能作为一个协调人的角色存在,而不能直接干涉各州自己的内务.
只有在涉及州间事务,或者由独立州执行将带来贸易问题的时候,才会交由联邦解决管理.

这使得联邦很难成为由一个中央权力代表的集团.

当然,也不能说它就是完全平等的或者说完美的.
就像饱受争议的选举人票制度.
它还是存在一些不"公平"的地方,使得一些州"优于"另一些州.

但总体上来说,由于存在的实力差不多的"州",所以,大致上还是受到均衡约束的.
也就是说,还存在着需要"多数原则"的地方.

而正因为没有"兼并"的可能,才是的各个联邦级别的"部门"只能充当经理人的角色,而不是全权的管理者.

所以,某种程度上来说,是贸易的对等性早就的联邦的体制公平性.

换个角度,如果存在一个能够兼并其他殖民公司并最终对抗英帝国的实体的话,那么也就大概不会有联邦政府了吧.
比如中国历史上的各种割据时期.
最后还是成王败寇的大统一局面.

稍有相似的就是对日抗战的国共合作时期,算是均衡势力的互相妥协与共同利益的折中.
只是后来力量对比产生差异,失去了类似的谈判条件.

而且,某种程度上来说,国民政府是受累于自己的正式国际地位.
毕竟就当时来说,红军并不算是一个得到承认的实体政权.

所以,攘外必先安内 算是一个合理的思考.
只是,实在是内忧外患,不得不妥协吧.

回过头来,初期的美国宪法其实挺多是源自英国法的.
或者说,其实世界上有不少地方的法律是源自英国法.

毕竟,殖民时代算是第一次把世界文明相互联系起来了.
殖民地自然不可避免地会受到母国的影响.

另外一点比较有趣的是,英国管理殖民公司的方式.
似乎算是某种程度上的骑士役的变种.
给予占有土地的权利,作为交换需要为帝国服务.

作为一个兵力有限无法直接占领庞大领土的国家来说,权利交换算是一个很巧妙的方法.

不过这么看的话,其实多数问题都可以归结为利益置换的问题.

以物换物.
纯粹商业逻辑.

2012-12-03

一个App的消失

从前有一家公司,在一个开放平台上做了款官方应用的替代品,没有花大力气做广告,只是尽量地做好.
慢慢地攒出了些口碑,在market 上也渐渐提高了排名,于是越来越多的人开始知道并使用它.

然后有一天,它和它的用户发现访问不了平台API了.
访问不了API也就拿不到数据,拿不到数据,这个App就没有存在的意义了.

于是开发者向平台询问情况,被告知API访问频率受到限制了,要获得更大服务许可需要向平台申请.

作为一个技术人员,可能心想着,毕竟是个新平台,基础设施还不问题,有限制也是可以理解的.
于是就提交了申请.

过了几天之后,终于又能访问了.
同时用户数也有了一定了,于是开始考虑是不是应该摸索下盈利模式.

就这样,日子在其他人看来不平不淡地过了一段时间.

直到有天忽然又有人反馈App用不了了.
于是工作人员开始排查,同时向平台询问情况.
然后被告知应用违反了开放平台的一些新规定,提供了向其他平台同步内容的功能,所以被取消了API写权限,只能读取部分数据.

而此时,其他一款类似的同步App可能采取了规避策略,没有受到明显影响.

后来一段时间里,App都不能再通过审核开启写权限.
于是开发人员只好用伪装官方app的访问请求以维持正常功能.

而在那段不能工作的时间里,有相当一部分用户不得不转向了其他选择.

在经历过这次事件之后,大概作者累了,于是App也停止了更新,原本在运营的小公司和一些盈利探索也不得不中止.

而剩下来的用户可能不多,但也继续使用着.

后来,这个伪装的app也终于又不能用了.

这天是2012年12月3日.
这个App叫YiBo客户端.
那个开放平台叫做新浪微博.

上面只是一个有偏见的旁观者写的一个带有演义成分的描述.

事实上,YiBo确实算是违反了某些规定,也可能没有足够”积极“地向平台协商可能的解决方案.
但作为一个局外人,具体情况如何其实也是不得而知的.

只是多多少少地会有些遗憾.
毕竟在官方客户端如此”不尽如人意“的情况下失去一个即符合个人审美,又合乎使用的第三方,实在是不怎么令人愉快的事情.
尤其是刚刚在官方网站上被强制更新web新界面之后,更让人有致郁的感觉.

更令自己不齿的是,自己还摆脱不了依赖.
穷不能独善其身.

只会矫情于一个国内失败的开发平台第三方上.

所谓现状.

2012-11-09

关于Go内存的一点事

下午花了点时间研究Golang如何手工释放内存.

起因是玩Go的时候习惯性地会看下生存的plan9代码是怎样的,借此了解一些实现代码上不太一目了然的东西,但时不时地会看到若干memory allocation的动作.
作为一个写Java出身,长期纠结于内存不可触摸的人,到了这个时候,总归会有些心痒.
而且,确实,Golang本身的GC机制也不算特别好.

Golang的GC也是经典的mark-and-sweep,跟Java实现不太一样的是,Golang还是有stack的分别的.
所以多数时候的GC其实是爬栈上数据,然后一路延伸下去.

剩下的"suspended" Goroutine里的数据了也大致是这个思路.

毕竟,goroutine本身就算是一个带着context的stack.
跟传统意义不同点在于,它的内存区域是go自己管理的而已.

而Go的GC更微妙的地方在于,它是一个基本上是定时的GC.
在main起来之前会有一个所谓的MHeap_Scavenger的goroutine.
原则上来说,是2分钟出发一次GC.
而且这个值在目前来说并非可配置的.

更重要的是,它本身是一个goroutine.
也即是说,要有机会被调度到.
而目前貌似默认是只有一个M,也即内部go线程在跑的.
所以,假如是有比较频繁的内存申请操作的话,大概内存占用会涨地比较快.

当然,如果内存使用频率基本不变的话,内存也够大话,理论上到一定程度就会停止增长了.
但同样地,占用也会保持现状.

于是考虑下Go会申请内存的场景.

最简单的slice操作,这个就是必然的.
而对于一般对象,如果escape来的话,也必然会触发.

这么考虑的话,其实还算挺频繁的.

于是,很自然地会想如何去人工介入.

在这一点上来说,Go应该说是相当优秀的.
如果只是单纯的想使用脱离go管理的内存,那么直接cgo,然后malloc/free即可.

这里不得不说的就是Golang和C交互的便利性.

从go1开始引入的go commands基本上把go变得很便利了.
之前的诸如cgo之类的,可能还有一些繁琐的步骤要做.
而现在,直接在go代码里嵌C代码即可了.
更为主要的是,没有makefile和异与go toolchain的东西.

换句话说,就是和写纯go是没什么区别了的.

所以,手工管理内存或者跟现有生态链融合的话,基本上不算什么难事.
只要对方有C接口即可.
而这个世界上,没有C接口的东西,还真不太多.

但对于go自己的数据结构,能否也可以手动释放呢,比如逃逸了的slice?

这个其实也是可以的.
而且也很简单,不需要hack什么东西.
诸如算偏移量和改相应对象的header mask之类的.

能够想办法调用runtime·malloc系和runtime·free即可了.

普通的cgo可能无法调用这一类函数,原因在于"·"这个符号.

但是参考下go自己的bootstrap和build过程,会发觉,"·"本身是个比较有趣的东西.

在目前Go的实现里,有些Go func虽然有定义,但是却没有对于的Go实现.
因为本体是C实现的.
而go就是用前缀"·"来关联Go定义和C实现的.

而更重要的是,这些C实现的编译是走的比较独立的流程,而不是cgo生成的.
也就是说,只要在Go里定义一个wrap,然后C,再一起简单地go build就完成了.

这里需要注意的另外一点就是Go的C conversion.

因为原则上来说,Go是支持多返回值的,而这个在C里是没有的.

Go是如何实现的呢?
稍微犯下代码就明显了.
返回值不过是额外的传入参数而已.

这样原则上来说就不存在多返回值这个伪命题了.

而要如何把结果返回呢?
当然就是指针操作了.

这些,参考相应的makeslice之类的实现就明白了.

简单说就是,众所周知地,在调用前,参数会push到stack里.
换句话说,在函数内部,只要对对应区域操作即可返回值了.
类似于C#的out关键字的意思吧.

所以,实际上也就是4,5行代码的事情.

2012-09-01

关于The Dark Knight Rises

看完the dark knight rises.

简单地说,有不少泪点,猫女也很养眼,但相较于前作来说,多少有些不及的地方.
至少不是那么"主旋律",或者说消极意义较多.

本来用哈维换来一个良好运作的制度/系统,但是最终还是不得不寄托于蝙蝠侠拯救世界.
换个角度想,就是制度无用,不如一个超级英雄.

而韦恩一直强调的,对的东西应该在对的人手中,以及害怕落入坏人之手.
这一点,从某种意义上来说,就是相信需要一种超出常规的权力,并一个足够完美的人来运用并维护,这个世界才能正常运作下去.
通俗点说,就是需要一个完美的独裁者.
这不能不说是让人舒服的一个观点.

相反地,在这一点上,管家阿尔弗雷德倒是更倾向于建立一个自洽的社会.
如它所说的,造出武器,提供资金,让政府去维护高谭市的治安.
而不是让自己去超人/伟人般地承受一切,"像个英雄般".

事实上,这一部蝙蝠侠给我的感觉更多的像是在强调,正义来自于一个高度自制的超级权力的维持.
跟前作的"给制度一个机会"相比,似乎是在彻底否定"良好制度"能够有序工作的合理性.

总之,抛开影片的其他描述点,就这个理解出来的表达意图来说的话,比前作要黑暗和悲观地多.
尽管,影片是在一片"一路高歌"的必胜基调下演绎完成的.

但这样更让人觉得有些不寒而栗.
热血之后,得出一个更加残酷的事实.

回到影片本身.

虽然节奏紧凑,情节跌宕,猫女也很养眼,但是能够被吐槽的地方也不少.

比如韦恩爬出黑井的"信仰之跃",就仿佛在电影荧幕上满屏的"摔死就是神作"的弹幕.
以影片比较现实的设定来说,这里就显得有些过于地戏剧化/神化了.
尤其对于一个一开始连站立都不能的人来说.
以及,"对于如果万一真地失败该怎么办",这点影片也完全没有补充说明.
就个人感情上来说,与其神话般的"信仰之跃",不如实际点的让阿尔弗雷德来救更能接受.

还有一点就是最后的核爆.
不说明明有自动驾驶还要骗猫女的一吻,也不说还在海上的蝙蝠侠在什么时候下的飞机.
在海上核爆就不会引发海啸么?

当然,可圈可点的地方也还是有的.
比如橄榄球场那个一段时间的纯粹的小孩歌声,用这种"充满希望"的背景乐来描写早已剧透给观众的"绝望结局",这一点算是相当不错的.
已经知道结局,时间拖地越久,绝望和恐惧就多一份.

蝙蝠侠和贝恩的第一次交手的动作场景也确实不错.
而高潮的蝙蝠侠试图利用黑暗,但是贝恩回敬道那句"the shadows betray you"更是多种意义上的讽刺,随着拳头直击韦恩的身体和精神.

在黑井里,"信仰之跃"前的两次失败,也让蝙蝠侠更具有实感,而不是完美的开挂英雄.

总地来说,这部片还算是不错.
虽然对于其带来的想法不是很赞同.

如果用比较讽刺的口吻结束的话,就是TDKR想表达的是.
"这个世界需要高帅富,只有高帅富才能拯救人类."

2012-07-25

晓之以利

北京一场雨,倒也冲刷出些有意思的现象.

暴雨当夜,微博上除了惯例的就人扩散之类的话,当然也少不了各类有依据没依据的评论批评.
虽说一个现代社会,允许人发表自己的言论是种权力,尤其在批评政府和谴责不道德现象上.
但这并不构成谴责即是正义或合理的理由.

无端的指责其实并一定能起到积极的作用,尤其是规模化之后,更显人群的无理取闹和不冷静.

比如雨后贴违章罚单这件事.
尽管从道义上来说,众所周知的都是由于天气原因导致车子开不走.
但是从规章制度上来说,无论是执行的人员或者机构都没有义务一定要免去罚单.
在政府没有明确指导的情况下照章办事也不无合理.

况且,即便要指责政府的不作为,但在法律流程走完之前,该付出的照样付出.
这才是一个应该有的所谓法制/契约社会.

尽管,实际上几乎没什么可操作性.
但无论怎么说,现在的法案至少都还是在经过合法流程的.
会是今天这个样子,个人也难辞其咎.

然后是关于所谓遇难37人的说法.
对于稍有统计基础或者熟悉使用搜索引擎的人来说,很容易理解不过是种大样本下的“巧合”而已.

只不过由于自觉不自觉的心里和所谓公信力的丧失,人们只会接受自己希望的“事实”.
也就是某些人所谓的当代的“分裂社会”.

各个阶层都只相信自己觉得是真相的事实,而对之外的都抱有或多或少的敌意.

尤其在一些各种目的的刻意造谣的情况下,更是契合某某党惯用以形容的“不明真相”和“煽动”.
比如某社科院研究员对北京民政局的刻意造谣.

而像谴责出租车雨天涨价之类的事情,从动机上来说,这是完全的市场驱使,而且出租公司自然有相关的规章可供投诉和操作.
对于司机而已也很自然地是有收益才会这么做的.
尤其非正规渠道的所谓黑车.

总之,这整件事情就像中国当前社会意识的一个缩影.

人们渐渐地有了权力意识,开始追求自己的所谓正义,尽管还是属于原始的”自私“的状态.
但至少有了这个意识,懂得去谴责.

剩下的就是的真正的公共意识的觉醒.
毕竟,懂得自私之后,就知道什么是自己应得的.
那么到懂得并做到什么是自己不应得的也为时不远.

或者说,当人懂得了用利益决策行为的时候,那么这个社会就简单多了.

晓之以利.
如此而已.

牛来餐馆

看了欢迎来龙餐馆. 总的来说,作为一个院线电影,成品多少是有点不太匹配的. 看起来更多像是一部网络大电影. 尤其涉及到一些大场面特效的时候,可以看得出服化道的降本增效. 剧本层面有一些比较有意思或者说闪光点. 就是试图用一个餐馆或者厨师来串起一个比较宏大的叙事题材. 这个可以说是...