Shell's Home

Apr 12, 2012 - 1 minute read - Comments

segment的核心数据结构空间和时间效率估量

首先我们简述核心词典的目标。词典最主要的目标是,给定一句句子S,匹配出所有和句子开始拥有完整匹配的词语。所谓完整匹配,就是句子开始的一定长度的连续序列和词语相等。例如,中华,中华人民,中华人民共和国,都是句子:中华人民共和国今天成立了,的完整匹配。 要解决这个问题,直观方式是使用tied tree。但是中文的tied tree非常不好实现。英文的tied tree在一个节点上最多拥有不超过26个子节点,而中文的在根上面会拥有6000个以上的子节点,使用同样的结构在子节点上会浪费大量内存。 我们先跳过tied树本身的细节,来讨论如何使用python内置数据结构高效简洁的完成这一工作。作为一个读比写高频很多的结构,无疑hash table是一个非常适合的结构。我在hash table的性能分析中说过,hash table的查询性能是O(1)量级的。无疑,可以使用hash tree来高速完成查找。同时注意一点,词语的最小长度是2,因此不存在只有一级的结构。所以,hash tree的第一级结构可以从2开始,而不是1。 实现效果如何?我们正式给出的词典拥有127K的词汇量,平均第二级宽度为6.8,因此大致可以推算出,第一级的词典含有元素19K个左右。python源码解析中说过,当表项小于50000个时,扩张大小为当前活跃表项的4倍,最高填充率不超过2/3,即填充率最低25%,最高66%。平均来说,填充率应当在45%上下波动,我们以0.5计算,实际上一级词典的Entry个数应当是40K个上下。在源码Include/dictobject.h:50有给出Entry的结构,这应当是三个平台相关的数据结构,以贝壳的64位系统而言,长度应当是24字节。忽略掉辅助结构,一级词典的大小应当是960K,即约1M。而词典指向的数据,即2字长的str对象本身头部长度24字节,辅助数据长度12字节,数据长度4字节(utf-16编码的两个unicode),null term1字节,共计41字节。由于python对象是8字节对齐,因此实际占用48字节。19K个数据总计占用912K。 二级表项平均长度6.8,这个长度很难估量。因为5的话总表项刚好是8,而6就会增长到24,我们取中间数20做一个估量值(因为6.8毕竟大大偏离了5),一个词典的大小应当是480字节,加上头部大约是512字节(算的粗糙点吧),19K个词典就是8.5M左右。指向的对象长度更加难估量,我们粗糙点按照96字节一个对象(别忘记了,unicode对象不但成员多,而且超出了BOM,一个字占4字节),127K个对象大约是12M内存。而float内部使用C的double类型,一个对象占据32字节,127K个对象占据4M内存。 以上总计,初级词典本身占用1M,关键字占1M。二级索引占据10M,关键字占12M,频率数据占4M。总计28M内存,基本上一个12.7W词的词典,大小2.5M,占据30M内存,这就是dict核心词典的空间效率估量。 时间复杂度估量更加复杂,不过我们可以简化来说。初级索引需要多少时间?O(1)量级,毋庸置疑。问题是二级词典的复杂度,异常难算。凑合一下,按照比较6.8次计算(因为必须通过遍历才能知道全部的匹配)索引出一个句子所有的完整匹配的时间复杂度O应当为O(n),其中n是平均二级索引宽度。目前而言,实际测量结果,平均6.8。当词汇量大于一定值后,随着词典的加大,这个值基本是线性增加的,我们粗略的可以认为O(n)即是正比于词典大小。 而后我们顺便给出分词核心算法在处理一句话时的效率估量吧,证明太长,这里写不下。假定句子长度S,词典大小N,匹配数目M,分词算法的时间复杂度量级为O(N*M*S),有兴趣的可以帮我复核一下,这个证明颇为困难,不知道有没有证错。在实际运行的时候,匹配数目会跟着词典的增长而增长,而句子长度则相对固定。当然,明眼人一眼就可以看出,所谓匹配数据随着词典增长而增长,其中并不是正比的。而是O(1)<O<O(n)。因此我们可以看作时间复杂度为O(N)<O<O(N\^2),具体是什么,做不出来。 然后是纯粹的tied tree的性能估量。讲到tied tree,我们就必须要提到如何实现一个有效的tied tree。实际上纯粹用区域哈希映射太浪费内存了,而顺序查找太浪费时间。比较折衷的办法还是只有——dynamic hash table。 不过这次我们就可以控制一下哈希表的大小了。对于大小不超过6W的哈希,我建议采用crc32,虽然离散度并不高,但是作为一个近似填满的hash table的hash key足矣(这点需要实际考察一下)。如果是自己实现,表项直接存字符串,连指针都不需要,采用开链法。总计大小1M即可以保存所有的一级数据。 二级数据就无法这么偷懒了,因为二级结构中字符串长度不定。但是以数据展开大小只有2.4M来看,无论这一级别如何扩张,字符串本身大小不应当超过3M。开链法一个节点24字节,平均填充率0.5计算,14个表项一个词典(这个也可以自行控制了),336个字节一个词典,乘以19K个dict。大约6.23M。127K个频率数据1M,这是常规占用。 以上总计,初级词典本身占用1M,二级结构本身占用10M,不超过20M应当就可以构建起一个高效的核心数据结构。由于实现类似,时间复杂度也类似,就不详细推论了。 以上还有一点可改进之处,dict作为二级存储的绝对劣势在于,必须要对比全部词典才能确定完全匹配数量,于是时间复杂度正比于词典大小。严格的tied树只需要沿着顺序进行几次索引即可,复杂度取决于词语长度——基本来说和词典大小无关。按照这个推论,实现一个紧凑的,高效的二级小结构,可能比较有利于减小总体大小,增加工作速度。

Apr 11, 2012 - 1 minute read - Comments

赞一下京东

昨天觉得背不舒服,买了个按摩器,200。 10点下单,下午两点就送到了,效率不错。 但是用了20分钟,不动了。照说明冷却了一阵,还是不动,遂报换货。 下午四点打电话,10分钟后就来电确认了,五点来了个人,把东西拿走了。 我要求换货,目前页面写的是退货,不知道会不会把新品送来。 不过效率很不错呢。

Apr 10, 2012 - 1 minute read - Comments

如何用tabbar插件做emacs的tab定位切换

说明一下,定位切换的意思,是像chromium那样,用Atl-1-9直接切换tab。而不是用上一个下一个慢慢换。另外,是切换buffer,不是切换frame。 以下是实现部分: ;; 全部的buffer都分一组,否则这个修改是没任何意思的 (setq tabbar-buffer-groups-function (lambda () (list "All Buffers"))) ;; 去掉emacs自带的几个buffer (setq tabbar-buffer-list-function (lambda () (remove-if (lambda(buffer) (find (aref (buffer-name buffer) 0) " *")) (buffer-list)))) ;; 切换到第N个buffer,1为第一个,负数表示从后数,注意0会出错,这里就不处理了 (defun switch-tabbar (num) (let* ((tabs (tabbar-tabs (tabbar-get-tabset "All Buffers"))) (tab (nth (if (> num 0) (- num 1) (+ (length tabs) num)) tabs))) (if tab (switch-to-buffer (car tab))))) ;; 不说废话,绑热键 (global-set-key [(meta 1)] (lambda () (interactive) (switch-tabbar 1))) (global-set-key [(meta 2)] (lambda () (interactive) (switch-tabbar 2))) (global-set-key [(meta 3)] (lambda () (interactive) (switch-tabbar 3))) (global-set-key [(meta 4)] (lambda () (interactive) (switch-tabbar 4))) (global-set-key [(meta 5)] (lambda () (interactive) (switch-tabbar 5))) (global-set-key [(meta 6)] (lambda () (interactive) (switch-tabbar 6))) (global-set-key [(meta 7)] (lambda () (interactive) (switch-tabbar 7))) (global-set-key [(meta 8)] (lambda () (interactive) (switch-tabbar 8))) (global-set-key [(meta 9)] (lambda () (interactive) (switch-tabbar 9))) (global-set-key [(meta )] (lambda () (interactive) (switch-tabbar -1)))

Apr 9, 2012 - 1 minute read - Comments

empathy的无聊问题——记一次排错

废话不说,debian testing,装了empathy后没法用account,等于废物。 先看bug report,开reportbug,看empathy的bug,有一个“Accounts window does not open”,估计就是我要的。 在浏览器中打开,http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594945&archived=False&mbox=no,里面说了大致情况,和我这里非常类似。 第一个意见,killall -9 empathy-account,无效。 第二个意见,需要装CM。 跑去看看,一个都没装。跟着看说明,应该在recommand里面的。OK,我这里有这个配置。 shell-deb:\~\# cat /etc/apt/apt.conf.d/20norecommanded APT { Install-Recommends 0; }; 这是对付很多无聊包把recommand当作suggest用的,结果这次中标。其实这次的recommand应当放入dep里面的。 OK,完事。 PS.虽说如此,记得把telepathy重启一下,否则jabber协议看的到但是无效。

Apr 1, 2012 - 1 minute read - Comments

无线网络问题的诊断

今天看到ZQ在坛子里面说无线网络卡,想想这对很多人是个问题。现在越来越多设备采用无线网络,本来看似够用的无线网络应该也会逐渐变的不怎么够用。这篇文章的大部分内容在blog中都有说,但是没有集结成文。今天集结一下,为大家提供便利。 关于无线网络卡这个问题,有多种可能,我们逐个分析原因/诊断方法/解决方案。 有终端连不上,即使这个终端就在路由器附近 这个主要是因为无线网络负载的设备达到极限所致的。这个极限,我见过最差的路由器是8个,普通路由器(包括dir-825刷openwrt)大概是50上下,苹果的要超过100。一个/24子网的最大负荷是253个IP地址,如果不另行设定,大多数的默认配置都无法超过这个极限。 解决方案很简单,加路由器,或者换一个更好的路由器。加路由器具体参考这篇。换路由器的意见是,不要用fastnet,推荐tplink或者dlink的设备,buffalo的也不错。如果你已经用了这些路由器,但是终端超过50个(好像通常只有公司会碰到吧),可以考虑苹果的,或者多扔两个路由器,辐射小信号好。 有终端离开一点距离后就连不上,或者离开一定距离后速度变慢 这是典型的信号衰减。作为不严谨的测试,你可以在android上安装wifi测试仪,然后走到各个角落。如果你的信号质量不足80dbm,那么就属于比较差的情况。大概能连接,但是经常断线,或者速度很慢。如果不足90dbm,基本就不可用了。 解决方案也很简单,同上一个。总之优化到家里的每个点信号质量都可以就好了。 明明信号很好,速度就是上不去 有可能是因为周围的channel干扰,也可能是因为你的路由器CPU不足。你可以用wifi测试仪,看看你周围当时有多少人在用你路由器的channel。两个channel相隔5以上才不互相干扰。所以,如果你使用channel6,那么channel2-channel10都会对你的信道造成一定干扰,相隔越远干扰越小。而如果你隔壁有一堆和你同channel的AP,实际带宽是均分给你们所有channel的。如果对方用的比较多,也会对你造成干扰。 这是非常难解决的问题,你总不能跑到隔壁说,你们改个信道吧。一方面,如果有条件,你可以对墙壁,门缝做信号屏蔽。这样能减小一点隔壁的信号干扰。另一方面,建议你采用5G频段。这个频段的信道更多,更不容易串扰。但是目前支持5G频段的设备少,而且5G的穿透能力比2.4G更差。 CPU不足呢 CPU不足最典型的确诊就是关掉加密,你的无线网速就会突然暴增。或者你保持无线空载,用有线狂用网络,无线的ping值从10变化到上千。 碰到这种情况,扔掉垃圾路由器重新买一个。 明明有些设备一点问题都没有,有些设备就是连AP都找不到 看看你的channel是否设定到了11以上,例如12/13/14之类的。各个国家对channel的许可范围不一,欧洲日本美国的许可比中国宽一些,因此有12等信道,中国最高到11。因此你用水货手机连外贸版本的路由器的时候,channel12没问题,而用中国许可的设备的时候就连AP都找不到。 解决方法很简单,换个中国许可的channel。 无线速度跟不上外网速度 自从20M以上光纤出现以来,这个问题就逐渐变成主要问题。11g的标准速度号称54Mbps,但是实际上通常只有18Mbps。而外网速度从常见的1/2/4Mbps骤然升到了10/20/30Mbps,就出现了严重的外网速度反超内网速度。 这个一点办法都没有,只能把11g的设备都淘汰光。只要有11g的设备在,11n就无法发挥极限速度,导致你的无线只能在18Mbps上晃。而换用11n的设备后,速度一般可以达到30-40Mbps以上,基本够用。 路由器被打爆 由于速度加快,导致现在有更多的小包可能被传输。虽然传输速率要求不高,但是由于路由器对每个包都需要做同样处理,所以大量小包的资源消耗和同样数量的大包是同一个量级的。我们做一个简单的计算。如果一个包是1500字节,128KB/s的网络可以每秒传输90个包。而如果每个包是64字节,就可以传输2000个包。而当速度升级到2.5MB/s(20Mbps光纤),如果是1500字节,每秒1700个,而64字节的就是40000个。如果路由器的处理能力是每秒10000个包,升级到光纤一跑小包就挂了。很多人在ADSL的时代没问题,升级到光纤反而频繁出问题就是这个原因。 现象比较多,如果是交换机挂掉,往往是一个机器链路OK但是就是有TX没有RX。怎么整也没用,但是过一会,这台机器突然就OK了,换下一台出同样问题。而如果是整个路由器挂掉,可能是路由器突然重启,或者ppp0断线重新拨号。还有的机器是死在那里没任何反应,必须拔掉电源线重新插才有效。

Mar 30, 2012 - 1 minute read - Comments

redis的rdb和aof模式性能对比

由于是同一台机器,进行相对对比,我就不列配置了。系统是debian testing,kernel 3.2 686。redis 2.4.8。 测试方法是用python写的脚本对redis数据库进行写入,看写入速度。 100000/300000/1000000是数据量,插入的都是string。第一个数据是最小时间,第二个是平均,第三个是数据大小。 100000: dbmode: 4.8, 5.1, 1477792 aofmode: 9.1, 9.3, 3677803 300000: dbmode: 16.5, 17.6, 4877792 aofmode: 21.1, 21.4, 11477803 1000000: dbmode: 61, 65, 16777792 aofmode: 77, 85, 38777849 从简单分析来看,aof比rdb慢25-80%,但是大规模数据都比较支持慢25%这端。估计在低数据量下,rdb模式更加占优势。数据规模增长时,速率比接近于4:5。aof的数据比rdb数据大150%(2.5倍上下),这点随着数据增长基本不变。 从读性能分析来看,两者差异不大。同样,数据分别是最小时间和平均时间。 dbmode: 55, 60 aofmode: 62, 63 差异在10%以内,甚至比最小-平均差异还弱。基本可以视为一致。

Mar 27, 2012 - 1 minute read - Comments

假如生命可以重来——致80后的家长

假如我们的生命可以重来——好吧,这个听起来像七老八十的老头说的话,不过,确实,人过到而立之年,会发现很多遗憾,很多很多的已经太晚。假如人生可以重来,我们也许就能弥补其中一些。 假如生命可以重来,我首先要干的第一件事情是在中学和大学多去旅行几次。这不是说我中学没有旅行过,而是都太“安全”了。苏州?杭州?拜托,这些地方在工作后都有的是机会去。如果回到初中,也许我会跟父母申请,在中学的时候就跑去黑龙江,看看松花江上的雾凇,索菲亚大教堂。高中跑去敦煌看看莫高窟,看看大漠风光。跑去云南看玉龙雪山,看西双版纳。大学跑去喀那斯,纳木错。 现在?我现在哪里都能去了,都可以去了,都有钱去了,可惜没时间去。我毕竟有一个家要养活,不能任性的丢下工作,突然和老板说,我要去西藏一个月,您看着办。 也许初中去听起来不是很安全。可是想想,现在去,比初中生安全到了哪里去?旅行中的安全,来自出门的阅历。我们都是在不断的出门中学习到,什么是安全,怎么样才安全。也许,在初中学到这些东西,会比毕业后学到更加有用。 假如生命可以重来,我要做的第二件事情是学个乐器,当然,也可能是画画。这也不是说我没学过乐器,小学的时候我学过电子琴,大学学过吉他。从哪个角度看,都和“没学过乐器”沾不上边。不过我要说的是,并不是说“会使用一种乐器”就算“学过一种乐器”的。 小学的时候,当时好像流行让小孩学各种班。当时我对音乐挺感兴趣的,所以就老妈做主,买了个很贵的电子琴。那时候才刚刚脱离36块工资,一户人家一个月也没多少钱,一把YAMAHA的电子琴要价1600。既然买了这么贵的电子琴,总不能让孩子瞎玩对吧?于是老爹老妈就给我报了一个班,每周接送去学两个小时,家长就在门口等着,到时间了再接回来。 于是,音乐对我的意义就从好听的歌曲变成了跳跃的五线谱,琶音,休止符,三拍子,每天一个小时的练习。我顿时就觉得不好玩了,每天哭闹不止。三个月不到,父母的音乐家梦想破灭了,电子琴现在还在家里不知道哪个角落扔着。 高中的时候,有个同学吉他弹的不错,经常跑出去一起练琴什么的。我就跑去听他们玩各种各样的声音,唱歌。高考结束,我有点自己的时间,才开始又学起了吉他。如果让我重新选择,也许我那个时候不会去弄那么贵的电子琴,而是弄一个小孩子玩的乐器,找朋友玩玩看。那是一种乐趣,一段人生,哪怕其实我们的歌不忍猝听。 假如人生可以重来,我要做的第三件事情是多谈几个女朋友。首先要发表的一点声明是,这不代表我对老婆有任何不满,也不代表我很花,打算——咳咳,你们懂。 我曾经有一条推,被广为转发,大概意思是。父母在初中高中甚至大学的时候,以学业为名,尽力不让我们恋爱。等大学一毕业,又逼着我们赶快找一个好的老公/老婆出来。怎么可能做的到,你当恋爱不需要学习么? 也许我们在初中时候谈的女友,十个中有九个走不到最后。我翻阅开心上高中同学的结婚记录时发现,基本所有的高中恋人,哪怕当时看起来多么金童玉女,基本都很少有走到最后的。唯一的一对例外可以说是相当的有决心和坚持,据我所知,男女双方一起报同一所学校的不罕见,可是男方没考上就硬是复读重考,女方还肯等的,就非常罕见了。这里恭喜一下杨亮刘莹,很遗憾没参加你们的婚礼。 但是,无论如何,在小时候谈的恋爱,会成为长大后的青涩回忆。当你越长越大,论及婚嫁,恋爱也就越来越不单纯。你不会简单的评判你是否喜欢拉着他的手,带你在街上走。而且还会考虑当你需要用车的时候,他是否买的起。你希望你的青春回忆中,充满了酸甜的爱恋,还是父母和老师的斥骂?或者更糟糕的,根本就是彻底的一片空白? 更何况恋爱中的失败,会成为你下一次不会轻易犯下的错误。在中学,我们很可能不会上床,也没有孩子。如果有什么错误,我们还来得及修正。而如果到了需要结婚的时候再开始积累经验,一个不留神就会碰上一个看似合适的陷阱。结果必然是悲剧。不是在痛苦中挣扎一生,就是带着伤心,争斗财产/孩子之类的问题。 好吧,上面一堆,和80后的家长有什么关系? 我们的人生有很多遗憾,有不少遗憾,是因为我们承载了家长的梦想,受到家长的管束。家长认为他们没有接受过正规的音乐教育,所以他尽力让我们接受正规的音乐教育。家长认为初中生旅行是不安全的,却没有想过他们十几岁就离开家乡去了大城市闯荡。他们没有接受过高等教育,所以认为我们需要高等教育,所以不能谈恋爱。但是这一切的一切,却并没有使得我们的人生完美。 所以,当你决定你孩子的人生的时候,不妨想想。假如我的人生可以重来,我想要的是什么?

Mar 26, 2012 - 1 minute read - Comments

设计的艺术

1.标准,简洁但不简单 有一天,你买了一个机箱。很不幸的,这个机箱的后座螺丝少了一颗。当然,这是卖家的错。不过你不会让卖家从遥远的远方给你邮递一颗螺丝钉,而是去附近的电脑市场/五金店,或者各种可以搞到螺丝的地方弄一颗,替代上去。看起来很简单,实际上你知道螺丝有多少标准么? 贝壳在大学学机械的时候,曾经有幸拿到过一本手册。标准A4大小,一厘米多厚。里面全是各种常用机械部件的标准参数,螺丝大概占了半厘米。这还是常规齿形,非常规的大概和天上的星星一样多吧。 螺丝可以设计出这么多变形来,然而机箱上的螺丝,只是最常用的齿型,最常用的螺距,差别基本只在孔径大小而已。 于是,当你买机箱的时候,你不用考虑备件储备问题。 2.拆分和完整 你有点闲功夫,想喝咖啡,或者喝茶。然而不幸的是,这两种饮料喝起来都不怎么方便。茶比咖啡简单点,用飘逸杯的话,上面一个杯子,下面一个杯子。上面杯子放茶,下面杯子接水。水倒入上面杯子,泡好一按,到下面杯子,茶就算泡好了。 如果不幸,你想泡茶的时候,照做如仪,茶水没到你的嘴里,你怎么办呢? 如果不是脑子有问题,估计都会看看上面的杯子是不是水流出来了。如果流出来了,看看下面杯子是不是漏了。如果没流出来,看看上面的杯子是不是堵塞了,是不是漏了。差不多就这些问题而已。 一个复杂系统被拆成多个简单组件,我们就可以看组件是不是正常工作,从而便于诊断问题。洗衣机算比较复杂的系统,但是我们可以看,如果无法洗衣,是水没进去,电机不转,还是什么别的问题。当然,即使知道,具体部件也不是我们修复的了的。 同样,多个重复组件便于批量生产,也便于在不修改整体的情况下,更换部分组件。 当然,也有另一种思路。将系统设计成一个完整的系统,你不需要关心哪里出错。例如苹果。 如果这种系统发生问题呢?你要么完整的返厂修理,要么扔了算了。

Mar 22, 2012 - 1 minute read - Comments

从对称性说男女平等

一切号称男女平等的朋友们,作为一个死硬理性派,我认为真正男女平等应当满足对称性。简单来说,你们话中的“男”和“女”对换后,说法仍旧成立,那么这个论调就是满足对称性的,也是真正男女平等的。 我们举个例子。我和猫咪去云南旅游的时候,我们听过摩梭人“走婚”的习俗。具体不介绍了,大家自己查。简单来说是这样的,男孩子和女孩子互相看中后,男孩每天去女孩的房间里过夜,白天回自己家。孩子不用爸爸养,由女方的兄弟养。所以舅舅是一个孩子最值得尊敬的男性长辈,而不是父亲。一个朋友说,这不是很爽?男的和女孩子发生关系,还不用负责,小孩不用自己养。我说,你要记得,摩梭人是母系社会,男和女的关系都要对调的。我们把它们习俗中的男和女对掉过来听听? 女孩子晚上都要去男孩家里,过夜后回自己家中,不能带自己的小孩,还要帮自己的哥哥带小孩。 听起来——对女孩子好像很悲惨的样子——我们再把这个“女”还原回原始的“男”,你还觉得那里的男人真幸福么? 我们在讨论一切事情的时候,口头说“男女平等”。其实潜移默化中,还是受到中国传统男女思想的影响。从数学上说,利用对称性消除这种影响是最好不过的了。例如这个论调,是否男女平等呢?(女孩子把人生中最好的岁月给了你)。我们对掉过来看看?(男孩子把人生中最好的岁月给了你)OK,相信大家都笑了。 先不要笑,尤其是觉得得意的男同胞。男女平等在消除了女性的特权同时(包括撒娇,房子应当男方买),也消除了男性的特权。你看看是否能接受以下情况?(为了妻子的事业丈夫应当作出牺牲)我想很多男同胞已经在拍桌子跳起来了。那这个呢?(孩子要跟母亲的姓)OK,现在笑不出来了吧? 上面讨论了一堆怪论,很多人也许会说贝壳是断章取义,或者别的什么的。实际上,有问题的不是贝壳,而是“男女平等”这个词。真正的平等,为什么不能满足对称性呢? 实际上,多数人在说男女平等的时候,包含的意思并不是,男女双方对称。而是,男女各自为了不同的事情让步,互相达成交易。女孩子要生育,男孩子就要负担家庭。实际上,双方的关系并不是对等关系,而是交易双方关系。两者既要达成合作共赢,又要争取自己的利益。对这点,一个很明显的事实是,男女的婚姻条件改变依赖于适婚男女比例。在战争年代,一堆寡妇找一个男人,男人娶媳妇容易,三妻四妾也不难。但是近代,尤其是计划生育造成男女比例失衡后,女方明显就压在了男方上面。 因此?一个明显的悖论是,如果要改变社会的男女关系,让优势向某个方向发展,应当做的实际上是尽量设法减少该性别的人口。想让男方占优势?让男人去打仗就对了。

Mar 20, 2012 - 1 minute read - Comments

被警告了

OK,所有用贝壳vps的童鞋,你们今天应该都不能用了。因为我自己也不能用了。 早上到公司,发现翻墙失效,去vps供应商那里看了看管理,貌似是因为vps被停用了。我翻了一下billing,确定没忘记付钱。然后看到有一个ticket,上面写着abuse,大概就知道怎么回事了。问题是gmail里面没有——回来翻翻,shit,他们用不同的邮箱发,导致被定到了spam里。 ticket的原文我就不摘抄了,大概意思是他们公司是某个电影的版权所有人,发现这个IP有这个电影的源,因此发函警告。我看了看要求,也不算太过分。停止上下传,删除文件。 生气么? 实话说,收到这封邮件的时候我一点都不意外,而且挺高兴。因为他们做了正确的事情。如同我在某篇blog里面写的,不仅是程序,电影,电视,图书,文字,也都是有版权的。为某件事情努力的人应当得到报酬,除非他们自愿贡献。而免费观看和传播这些内容本身就是偷窃,这是一定的。不能因为所有人都在做,就理直气壮的认为这是天经地义。公平的想一想吧,如果没有版权会如何?程序员为了能够赚钱,大概会产生流氓软件,或者转行。而在其他行业,例如电影,大概就没有新的影片了。 既然知道不好,为什么还做? 人类是矛盾的。除掉版权没问题的资料外(至少我觉得没问题)。我有不少片子是无法付钱的,国内根本没有引入,这里面以动漫类为最。有不少片子是我仅仅想扫两眼的,如果你告诉我这玩意真的要付钱,那还是谁爱看谁看吧。 怎么发现的?合法么? 首先,对方是如何发现我的文件的?我估计是内容扫描。在服务器上找到这个文件的下载,然后扫描所有的源。如果这个源位于一个可诉讼的位置,就发函。如果不行,就试图阻截。 这个过程在法理上是行的通的,而如果要在每个ISP上扫描传入传出的数据本身,在法理上(我说的是美国的法律,不是天朝的)是行不通的,因为违宪。 那么,edonkey/kad/bittorrent有没有什么办法来规避这个问题呢? 首先,必须提供虚假源。以一定比例向客户端传送虚假的源数据,这会导致单纯的从edonkey上下载源列表不可行。因为即使只有百分之一,你也没办法证明你得到的源列表是有效的。警告也许可以,拿这个当证据去诉讼就要出篓子了。 其次,可能要发展数据混合传输方式。将一段内容正交拆分,得到两个比1/2的块,或者N块1/N。单独的块必须保证无法还原出数据,一个字节都还原不出,而且不能保证必须有原始数据才能生成这个块。为了满足以上条件,直接将内容条带化是不可行的,可能需要某种编码转换算法。 当你需要下载某一块真实数据的时候,你必须向不同的人请求将这一块内容1/N之一后的某一个编号块。从理论上说,这样能确认数据来源者拥有原始文件么?不能。虽然这么说很奇怪,但是你并不能确认来源者拥有这个文件的任何一个部分,也不能确认来源者自愿上传这个内容。因为你去获得数据,仅仅是因为源拥有这个数据。这个数据完全可能是某个合法资源的一部分。 最后,我觉得最合适的可能是大DHT,不过这会违背人性。DHT的全称是分布式哈希表,而从hashtable结构上说,完全可以将影片的所有数据全部保存到这个hashtable里面,虽然代价是相当大的。每当有人共享数据,这个数据会先传输到key附近的支持节点上,消耗这些节点的存储空间——而这个存储空间的消耗对他们完全没用。整个过程,还会额外的消耗网络带宽。 其实我也不想先付钱。 但是我也并不是很愿意先为了我下载的电影付钱,这和我上面说的不相矛盾。这个大概就是吃饭前付钱和吃饭后付钱的区别。其实我更喜欢吃饭后付钱的——尤其是对于内容质量差异很大的图书和电影。很多垃圾电影还是不看的好——也许这就是评分系统的优势。但是对于营销者来说,真的会甘心被打上一个很低的分数,然后血本无归么?所以你可以在任何地方看到通过营销方式干扰评价。 我对一个朋友说,盛大的书我一般喜欢看完再付钱。道理很简单,我追了无数本书,被太监,腰斩,烂尾,质量下降,换人。我觉得,还是让我们吃完全餐再付钱比较有道理。 版权有没有不合理的地方? 其实挺多——我说的是美国版权法。 首先,软件产品只有20年,但是电影音乐有70年——难道程序员特别贱,或者特别短命? 其次,阻碍学习。版权应当排除所有以学习为目的的使用,人类学习新知识的权利不言自明,不应受到阻碍。 最后,版权剥削。苹果销售的提成是多少?总数的30%。而普通媒体集团购入版权的费用是多少?不会超过最后收益的三成。这就是为什么我更喜欢在苹果上买app的原因——起码这对作者好,而且我也不用堆一堆纸或者没用的光盘在家里。