Shell's Home

五网融合——看起来很美

Dec 1, 2011 - 1 minute read - Comments

本文是一篇牢骚文。 大学的时候,和传播学老师讨论三网五网融合问题,我说,这就是一个概念性问题。从技术上说,音频信号视频信号从以太网走已经不是什么新鲜事情(当时04年),只是尚没有产生足够影响的工业标准。手机网络情况特殊,不好说,金融网络的融合依赖于电子加密技术(当时不清楚,现在来说,应当是电子授信技术)。这些事情的技术准备已经充分完成,将来几个融合也是顺理成章的事情,没什么好专门提出来炒作的。 事情的发展证明——是我太天真了。虽然三网融合并没有技术难度,但是有炒作性,也能触动某些人的神经。时至今日,不但三网融合没有完成,反而情况越来越糟。上海的网速只有国际标准入门级网速(4M)的四分之一这个事实常年不变不说,而且几个网的入门技术难度越来越高,门槛越来越高,各大运营商都把用户当作自己手里的筹码,仗着垄断优势倒行逆施。我们数数这些年,电视网互联网接入手机网络的“发展”: 1.机顶盒改造 这是有史以来,我听到被骂的最严重的技术改造,没有之一。我老爹,原本会看电视的。在完成改造后,只会看八个台。因为他一直不能理解电视遥控器和机顶盒遥控器的区别。为什么电视开了还得开机顶盒,机顶盒遥控能关电视,但是不能开电视。电视能看八个台的时候就不能看机顶盒,机顶盒有的时候还会死机。当然,他老人家没有我这么详尽而专业的表述,在我问他情况的时候,他反复只有七个字,太麻烦了,不会用。作为一个六十岁不到的人,我觉得他应当还没有太过失去正常的学习和操作能力。这种人学不会操作电视,只能说明机顶盒太麻烦了。无独有偶,外公和大舅操作电视经常有问题,楼下阿婆也不会看电视,种种迹象表明,这不是一个个例。 机顶盒改造的原理是这样的(请技术小白跳过这段)。首先通过RF射频线(同轴缆线)将机顶盒和小区机房连接,在这个连接技术的基础上封装出一个eth网络来,然后让视频信号通过eth走,而不是PAL或者NTSC格式的RF信号走。机顶盒通过AV接口输出信号,再输入电视机内部。因此,在使用的时候须要打开电视,将信号调整到AV输入模式,将电视机作为一个纯粹的显示器用。然后再通过调整机顶盒来操纵电视跳台或者音量,更进一步的可以拥有历史播放等进阶功能。 看起来很美,但是由于要多一个机顶盒,因此必须同时使用两个遥控器。对老阿婆们来说,这就是一个让她们永远搞不懂的事情。而且,由于机顶盒的软件稳定性不高,我在一年多的使用中,碰到了两次死机。就是任何输入没有响应,不要通过开关关闭,而是直接拔掉电源,再接上,设备就恢复的故障。这是典型的内核死机。作为程序员尚且觉得麻烦,老阿婆们可想而知。 至于机顶盒最大的针对对象——年轻人呢?实话说,我老婆虽然要求家里装电视,但是我一般用不到。我大部分时间都在上网,基本不看电视。有新闻也是看微薄而不看电视,网上娱乐也比较多。就算要看节目,土豆优库的内容多,可以自由前进后退,还没有太多广告骚扰。我要电视干吗?我老婆也就偶尔看看湖南卫视用。我想湖南卫视要是关门,她就会直接退掉电视线的。 2.有线通宽带 上面说到,有线电视是使用eth来传输信号的,所以理论来说,这个也可以作为宽带接入用。在某些人看来,这也叫做三网融合。其实如果这个叫做三网融合的话,那电话拨号上网也可以叫三网融合了。 有线通是使用电视网络为基础的上网业务,我简单点评来说,网络延时长,选择性封锁ed和bt协议。打给客服,她们说,我们只承诺保证http流量速度。我说协议上没写所以我们要按照国家标准——我们有权更改协议不另行通知。 我有权不用你们的服务。 3.上海电信IPTV 电信是网络的总接入商,任何其他网络运营公司必须向电信结算网络费用。所以其他ISP的接入永远比电信延迟高一些——除了教育网。 仗着这点,电信不但耍流氓,在正常的网络http数据流中插入广告,而且准备涉足电视业务。最近电信不是被调查是否垄断么?除了移动可能在搞他们外,电视媒体界也是候选之一。上海电信的IPTV是利用我们的上网带宽,将电视信号从电信机房传输到终端的一个方法。实话说,P用没有。特性和情况和OCN的机顶盒没什么区别。年轻人嫌没用,年纪大的不会用。 而且,这玩意是吃上网带宽的,不过电信一般会给你一定补偿,将1M升级到2M或者4M,多余的带宽你不能用,但是可以为IPTV额外提供带宽。不过最近带宽还是不够用,电信就在上海推了一个新业务——FTTH。 4.光纤接入 FTTH的全称是光纤到户。具体来说要从ADSL说起。原先从小区电话机房里面部署一台边界路由器,然后在电话交换机上面搭载一台ADSL调制解调器。这个设备和家里的设备配成一对,把你的电话线模拟成一根网线。没有概念的朋友,买个电力猫回家就明白了,只要有两根以上质量不差的电线,就是可以模拟成网线的。你在家里通过这根模拟出来的网线,把自己的电脑连接上边界路由器,通过PPPoE协议拨号上网。 ADSL有个问题,带宽最高只到4M,还得信号过关。电信想想,我的小区电话机房这么密集,干脆用光纤直接从机房接到用户手里得了。接到大楼里面,部署一个核心路由器,大家共享这根光纤带宽的,叫做FTTB(光纤到楼),而接到家里的,就叫光纤到户。 光纤到户其实是一种非常好的技术,光纤技术经过多年发展,成熟而稳定。通过单模光纤替代ADSL,能够提供5倍以上的带宽,真正让上海进入宽带世界。但是电信居然就能把这么好的想法给硬生生做成体验差到没边的业务。 上面说了,光纤是ADSL的替代品。从实现上说,原本是ADSL猫来完成的eth模拟行为,现在由光纤转换器来完成。用户其实只要在边界路由器上直接拨号就应当可以上网。可是电信为了在上面捆绑IPTV,或者为了将来的其他业务扩充,或者我们更不惮怀着最大的恶意揣测的其他行为,居然在这个光纤转换器上绑定一个路由器。于是,原本我们是拿外网IP的,现在就变成内网了。什么区别?如果你开ed/bt,速度自然下去。有很多游戏机不支持。只能支持几台设备,不能多支持(好像加交换机也不行)。 太恶心了,我弄个10M光纤,往往就是一家人上网的,一个人用那么大带宽干吗?(我是例外)现在?想一家人上网可以,订他们的一个什么业务,我不知道要不要加钱。把我们自己能做的事情硬生生做成只有电信授权才可以,你干吗不说你不授权我就不能上床算了。而且即便如此,还是缺这个缺那个功能的。好比套子必须选用指定牌子,否则无法保证你们满足计划生育。。。 5.3G接入 这TMD也是一个相当值得吐槽的地方。3G接入在其他国家都相当标准了,中国非出一个自己的TDSCMDA,速度慢不说,还发热大辐射大信号不稳定。不仅如此,我用了多年的移动号码,还不能用WCDMA,因为移动没有这个业务。我买的每一台android手机都是个悲剧,因为android基本只支持wcdma的3g接入。有人建议我干脆买两台手机,一台专门打电话,一台专门上网。问题是,那联系人呢?总之,这是一个悲剧。 6.电子支付 我了个去,我就没见过电子支付这么不靠谱的东西,居然全中国都在掩耳盗铃。 基本每一家,都是用IE的插件来做安全的。实话说,不但不支持大多数系统,而且这本身就不怎么安全。更值得吐槽的是,很多银行的网银看似密不透风,但是往往转头一看——他们还提供更加便捷的服务——换句话说就是更加不安全——这不和本身就不安全一致? 实话说,中国的支付现在还是大幅依赖于支付宝,而且支付也只限于小额。五网合一的正式形态,应当是使用硬件加生体密码,加上3g网络和签名技术,做成标准的认证授权服务来使用的。说直白点,网银使用起来和普通网页没有任何区别,就在付钱的瞬间,需要一个小小的独立设备,通过3g网络进行请求确认。设备上显示付款的目标金额等等信息,你可以同意,然后用你的指纹加上密码确认。或者否认这个请求。这样不但安全性相当惊人,而且兼容各种系统,甚至可以包括手机。目前的手机看似能够完成这一系列工作,但是手机上毕竟是可以安装各种软件的,包括针对这个系统编写的病毒也并非不可能。 综上所述,一个相当大的问题就是,本来接入商应当干干净净的提供接入业务。可是中国的接入商不是,非要在接入上捆绑别的。偏偏这捆绑的东西非常差劲,我们得费尽心机给去了。例如电信捆绑的iptv,3g手机。其实三网融合的核心在于,我们没有电视接入供应商,没有电话接入供应商,只有网络供应商。在网络供应商提供的带宽基础上,我们的电话和电视都通过网络实现。这样我们可以在上面变换各种花样,使用先进的业务。例如十年前就出现的ip电话业务,其实在三网合并后的形态,就是人人家里一个qq而已。例如我们现在一毛钱一条的短信业务,其基于网络的目标形态就是gtalk或者任何一款IM。由于手机随时在线,你给好友发消息他可以即时收取(真的是即时)。这和短信有什么区别?而且功能更强大。又例如iptv业务,其真正的目标形态,应该是土豆优库之类的进阶业务,更接近youtube和Netflix的混合体。说的更直白点,netflix是web1.0类型的传统网络电视经销商,而youtube是web2.0形态的网络电视经销商。中国的所有iptv都做的是一个四不像的怪物,核心目地是骗钱。说明白点,如果中国真的玩多网融合,短信不要钱,电话不要钱,电视不要钱,银行服务不要钱,那这堆单位怎么活?只有一个网络供应商活的很滋润。 其实说白了,中国的电信/移动/电视,都是垄断行业。本来各司其职相安无事。现在世界大潮非逼着他们变成一样的供应商,他们就都希望变成那个最后中选者。偏偏他们都基于自己的经验去做三网融合,结果就不伦不类四不像。又偏偏,我们没什么替代选择,再恶心也非用不可,所以开始我就说了,这只是一篇牢骚。 希望?早点把中国电信的总结算商身份给去了,让其他isp可以交叉结算。通常来说,战国时代才有的玩头。可惜,这个更加触及某些人的利益了。

python中dict的插入复杂度估算和排重复杂度估算

Nov 28, 2011 - 1 minute read - Comments

在做分词核心词典数据结构分析的时候需要,就先写一篇吧。 具体可以参考python源码解析读书笔记(一)——内置对象,这里面有说: 7.dict对象的索引方案 dict对象的索引方案使用的是哈希表,而且是开放地址法的哈希表。当装载率达到一定规模后,会新申请一块内存,将有效数据复制过去。最小的表空间为8个对象,当装载率超过2/3时,会扩大规模到当前active的4倍(超过50000个对象为2倍)。目前为止,在对象被删除后,其表空间并不释放。因此曾经增长的非常大的dict对象,可以定期复制以回收空间。 最初的表项空间为6个以内,满了之后,会自动扩张到24个,有效16个。从大致来说,如果要放下N个表项,大概就要扩张T次,他们满足以下关系。 A0*(8/3)^(T-1)<N<A0*(8/3)^T 而每次扩张,就要进行全表项复制,因此复杂度大约是O(N)量级。当扩张到放下N个表项时,就需要进行的复制的总数是: sum(i, 0, T-1){A0*(8/3)^i} 这是一个典型的等比数列求和问题,我们知道问题的答案应当是: A0*3*((8/3)^T-1)/5=A0*(3/5)*(8/3)^T-(3/5)*A0 因此,(3/5)(N-A0)<O<(3/5)\*((8/3)\*N-A0)。如果只考虑数量级的话,插入的复杂度量级为O(n),即哈希表的平均插入复杂度为n级。 也许有人奇怪,哈希表的插入复杂度为1级阿,怎么得到n级的结论的?看上面,都说是放下N个表项时的总复杂度了。 我们可以和红黑树对比一下,红黑树的平均插入复杂度为logn级,平均查找复杂度为logn级。哈希表的平均插入复杂度为1级,查找复杂度为1级。但是红黑树在一点上比hash优秀——他的插入时间基本稳定,hash table的插入时间有可能会暴长。 于是,当我们有N个元素,需要进行排重的时候,我们可以set化。假定set和dict基于一样原理运作,我们的时间复杂度为O(n+m)级,m为排重后元素个数。其实按照最差情况来说,也可以认为是O(n)级。

正好聊到django——论他的模板问题

Nov 24, 2011 - 1 minute read - Comments

首先先广播一个纠错,我那篇《几个模板的性能对比》,对cheetah模板没有做渲染处理,只生成了对象。因此性能出现严重误差,在此向所有被误导的朋友致歉。 ——不过这并不影响django慢到渣的结果。 Shell: 他们用了django的orm,映射到了mysql 我一点办法都没有 mysql唯一能做的,就是一写多读 或者可以加入handlesocket Bill: 为什么facebook以前好像用mysql能处理那么NB. Shell: 多久以前的事情啊? 而且你得想,他们以前还用php呢 他们自己开发了hiphop,把php编译为了C 同样,我估计mysql他们也做了手脚 那玩意我学不来 而且,即使学的来,也不可能在django固定了范式的前提下 ——起码得给我修改范式的机会吧 Bill: 你可以改django嘛. Shell: 太麻烦了 django已经积重难返了 这个问题,并不来自于django本身,而是来自于所有学django的人 Bill: 为什么这么说? Shell: 由于他们的努力,django变成了一个固定的商业标准 试图对django进行修改的行为,哪怕是正面的努力,都会受到已经存在于上面的系统的抵制 例如,我开发一个django的分支,允许使用其他模板,你觉得会如何? 压根不会有人理我 因为大家都使用现有的模板系统,并且在上面做了无数的代码 很多人甚至无法升级django的版本 很多app也已经使用了现有的模板 如果我对django整合cheetah,那只能限于自用的范畴 Bill: 这么说还真是一条不归路了.. Shell: 除非他们的维护者作出很大的努力 说白了,就是官方强推 Bill: 不过到时候遇到瓶颈了,怎么办.. Shell: 但是,这样一来,很多人就根本不会升级了 怎么办? 要是有办法,他们还会找我么? Bill: 靠硬件.. Shell: 他的页面就是3-5秒的打开时间 硬件上再增加,一个花钱,另一方面,也不可能增速啊 只能增加并发访问量 Bill: 也有点增速效果吧..处理速度快乐 快了 Shell: 怎么会呢? 你想,靠硬件是怎么靠的? 换更高频率的机器,还是加同样的机器?

新手?新手!

Nov 23, 2011 - 1 minute read - Comments

《新手?为什么需要关怀》在42区上挺热,看到很多人留言说新手,诚惶诚恐。我说你们也别太那啥了,一般只要不是求作业求妹子的,基本都还是能忍的。就算你问问题前言不搭后语,问题叙述的乱七八糟,老是求解释。通常我最多告诉你看某文档就不再回话——意思是事情到此为止。你不用担心我恼怒或者生气,我的时间很宝贵,没空浪费在这么无聊的事情上。如果下次你问出个有内涵的问题,咱们不妨讨论讨论。 写这篇的主要目地,是给新手一个指导。我不知道现在所谓新手的水准,以我在42区上看到的而言,是高的吓人。但是我实际接触到的,可能如一位朋友所说的垃圾,水准是差的吓人。其中有很多是不高兴学,或者打算做了再说的。您走好,这篇文章不是给您的。这篇文章是告诉一些真的是新手的程序员,如何稍微的提高一点水平。我假定你们会用vc写一些简单的程序,拖拖拉拉控件能做一个简单的计算器。在计算机上,我相对偏向实用。您和我说在算法课上能拿多少分,对我今天所说的内容意义不大。所以无论您课业上不及格也好,满分也好,本文告诉你如何成为一位牛逼或者可以装逼的程序员——如果你做了整个过程,学到了东西,那就是前者。如果没学到,没关系,至少你可以拿着本文的经历去装逼。 首先,请保存好你们的照片什么的,然后,把你们面前的电脑格式化掉。对,所有windows的内容一点不要留,已经是linux的朋友,请确保你“没有”windows了。作为程序员,你无论如何都需要自己做很多事情,直接使用linux是一个良好的开端。但是学linux是痛苦的,只要有退回windows的可能,你就没法真的学会linux。学着用linux工作和学习(对于某些人来说,娱乐更重要,在这方面,linux确实不怎么样,幸好,如果您是这样的人,本文也没看的必要了),并且熟悉整个系统,最快需要2-3个月的时间,慢的话需要半年到一年的努力。你需要不断磨合,学习新的程序使用方法,请教前辈,实验,最终能够掌握这一系统。掌握的标准是什么?你知道哪些事情是不能用linux做的。之所以这么说,是因为新手根本不知道哪些事情是不能用linux做的,他们所有事情都没法用linux做。而老手会使用最合适的方法来用这个系统。 当你已经能够熟练使用linux,甚至比windows还熟的时候,你的桌面装什么东西就随便你了。我的桌面是win7,因为老婆需要。我知道不少程序员的桌面是mac,这也很好。不过一旦你熟悉了linux,你最少会装个虚拟机来做开发,并且觉得试图在windows下做这些事情很蠢。windows的console是cp936编码的,网页很多都是gb2312编码的,但是用gb2312去读他们却未必能行(这是因为windows下的gb2312/gbk说的都是gbk,抽风啊)。linux下面大多数term都是utf-8,世界清静很多。windows下开个小网页服务器要跟着一个图形管理界面,linux下服务就是服务。总之,如果你真的打算开发,你会发现windows其实非常不友好。所谓友好是指已经被微软封装过的部分,还有他们的文档——那个真的非常不错。 第二步,你得打造一个自己的工作环境。我知道你习惯了微软的IDE,进入linux后还试图用一些WYSIWYG的系统。不是每个WYSIWYG都是错误的,然而作为最适合你的程序而言,他未必就是WYSIWYG的。你在windows下一般用什么开发工具?vs?盗版吧?好吧,你是学生。但是你能用vs编译一个linux kernel么?在没有SDK扩展包的情况下,vs也不能用来做android开发吧?这就是vs的真相,将一些特定的开发,做相当程度的简化,以换取大量的初级开发者。当然,你会反驳说vs可以开发WDM,或者做DDK级调试都可以。然而,这也是特定领域——凡是微软给你能做的领域,你都可以做。但是微软不允许你做的领域呢?虽然微软允许的范围很大,但是作为初学者,了解开发是如何工作的更加重要。 你可能需要一个编辑器,通常这只有三个选项,vim/emacs/其他。而后你需要一个编译器,如果使用C,多半就是gcc。调试工具一般会选用gdb,编译项目管理工具一般是make。这四者的用法都可以google到,并且通过合适的配置配合到一起,达到和vs类似的结果——你写一些代码,然后按开始调试,程序就开始一步一步运行。到你需要的地方,输出一些数据看看?然后再继续运行。和vs没有什么太大差异。不过作为自行配置环境努力的回报,你有两项比较大的优势。一个是你的各种工具都是千锤百炼的,最优化的工具,他们一定真的能工作,而且可以信赖。另一方面,当你需要改变工具的时候,你可以保持其他工具不变。例如,你现在需要通过go语言快速的开发一些web程序,你需要将gcc换成gogcc,gdb也需要换掉。然而make只需要新增一些规则,vim/emacs也无需变化。回想一下你在vs里面如何编写go代码?——这个——好像——似乎——需要第三方插件吧。找找看?运气好的话有收费插件可以达到这个目地,找一个破解版来——如果开发者都对破解无动于衷,你还如何指望别人来尊重你的知识产权?也许你想,我可以不使用go语言来编写。好吧,go的效率是编译型语言中比较高的,你要和go比效率,可选的只有C语言。那么你准备在vs上用C开发一套web?——我尊重你的选择,并为你逝去的人生默哀。 第三步,找一个合适的项目。这点我在《如何参与一个开源项目》一文中有说,不过那篇文章建议你尽量做一些代码之外的工作。为了磨练你的水平,你可能需要做一些和代码有关的事情。不过无所谓,大概来说事情是不变的。找一个合适的项目,和他的领导者谈谈,看看有什么可以干的,并且努力干完。 第四步?没有了,继续这么干吧,应该没多久,你就是N个项目的参与者,有一定的代码贡献,并且和一些大牛们交流一些业界最新的东西。如果这样都不算入门,我真不知道你入门的标准是什么了。 听起来很简单,那么事情的难点在哪里? 关键在于,无论事情看起来多么困难,多么不可能,你觉得多么辛苦,你都立刻,马上的去做。而不是看完文章后点一下“mark”,“like”,“+1”,然后让他躺在你庞大的文库里面生灰。

python-segment使用示例

Nov 22, 2011 - 1 minute read - Comments

项目的主页是http://code.google.com/p/python-segment/,如果有问题,可以在上面提交issue,我会收到邮件(google code会么?应该会吧)。如果你希望协助开发,可以加入项目。一些简单问题可以直接看项目的WIKI,Wiki中有的一些内容我不会进一步解释,只会告诉你在那里可以看到。 1.如何获得源码 你可以使用以下代码,直接从版本库中复制一个可用版本出来。 hg clone https://shell909090@code.google.com/p/python-segment/ 或者可以从这里下载一个最新版本的包。 2.如何准备环境 你可以看INSTALL,里面讲解的比较详细了。如果你不准备进行安装部署,可以跳过安装和打包这两步。但是如果你打算使用cutter工具,请安装chardet。如果你打算使用spider工具,请安装html2text。 首先按照如下方式生成词典。 gunzip dict.tar.gz ./ps_dbmgr create dict.txt 然后,你可以看到生成了frq.db,这是词典的默认文件名。注意,词典文件的格式和具体的版本有关,换用版本后最好重新生成词典。 3.试验分词 假定有一个文本文件,test.txt,里面内容是中文平文本,编码任意。 ./ps_cutter cutshow test.txt cutter会自动推测编码。 4.代码使用 假如当前有一个frq.db词库。 import segment cut = segment.get_cutter('frq.db') print list(cut.parse(u'工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作')) 注意,仅仅使用parse是不会进行分词的,因为parse返回的是一个生成器。

新手?为什么需要关怀?

Nov 21, 2011 - 1 minute read - Comments

最近老是收到“新手,求帮助”的邮件,很多人很有礼貌,但是实话说,我总觉得这些新手邮件的想法有问题。今天不妨开诚布公的说一下我对新手的态度。 很多人总是很客气的发邮件“新手,求帮助”,里面提出一些很傻的问题——这不奇怪,无论多强的人都有傻傻的时候。这些邮件写的也很客气,一切没有什么不对。除了一点——其中某些邮件中总是充斥着一股说不出的“不劳而获”或者“傲娇”的情绪。说的更直白点,就是“我们是新手,所以说的简单点,但是又要说明白”,”XXX的最好途径是什么?适用于新手哦“,或者更过分的“我的作业马上要截稿了”,“我女朋友要我做题”。 实话说,我对一个人是不是新手并没有太多兴趣。新手对我的区别只有——你没有关于XXX的相关背景知识,所以,也许你要先看OOO书,有一个大致概念,然后再看XXX文档,详细了解一下,然后你看XX书,就能够解答你的疑惑了。这是知识依赖的关系,你没有相关知识,自然看不明白。作为声明新手的结论,我会帮你指出你所需要的知识在哪里能够找到,免除你自己去google,还有可能找不到的困扰。差不多这就是我能为新手做的所有事情了。 至于那些说,为什么不把相关知识截取下来发出来,为什么不详细解答疑惑的人,我没什么好多说的。如果新手的行为就一定是可原谅的,我们每个人都会在路上横冲直撞。我们总会在某个领域成为新手——哪怕有10年经验的程序员,也会是一个新手驾驶员,或者新手厨师。作为新手驾驶员,我们有责任通知别人——躲我们远点。并不是因为我们是可原谅的,而是因为我们不能自制的作出不可原谅的事情。作为厨师,尤其是程序员厨师,这点更加明显。程序界有句行话叫做——吃自己的狗粮(eat your dog food),意思是自己做的程序一定要自己用一下才有体会。同样,厨师自己做的菜一定要自己先吃,自己都不敢吃的东西是不好意思端出来的——哪怕我们都知道你是新手。 没人应当对你的无知负责,你自己无需负责,你父母无需负责,我也无需负责。人总是新手,但这不代表老手要无偿的呕心沥血教会你——哪怕他是个教师。新手没什么了不起,或者值得无限原谅的地方。你到底是我的老板呢?还是我的衣食父母呢?我需要为你把所有的材料看一遍,摘出合适的部分,讲给你听,并且还保证你能够学会。我想即使是老师,也不会帮你做这些事情的。不要和我说论文马上就要截稿,或者你们老板多黑心,你女朋友和人跑了,或者你这课挂了,就白花了四年的时间和无数的钱——这些钱和时间都是你自己浪费出去的,我帮你解决问题并不能节约下来这些时间和钱,这样只会浪费我的时间。何况如果我用最快的方法教会你,你出来后不是就直接和我竞争了。你看,我不但包教包会,而且成功后还要降低自己的工资——我要多么的脑子进水,才会干这种损己损到家的傻事呢? 而且,作为一个要辛辛苦苦从学校招一些靠谱的学生的程序员。我无比的痛恨出题太简单的老师——虽然我在学生的时候痛恨的是出题太难的。题目可以抄,出题太简单,找人代写,改头换面,和老师搞好关系。这一切我们在学生时期耍的小聪明,到了工作中都会结结实实的还给我们自己,除非你不从事技术相关行业。如果你从事的是销售行业,这些小聪明,手腕和技巧,也许是有帮助的。但是作为技术行业,这一切是我们深恶痛绝的根源。新毕业出来的学生中,大概只有不到一成的人理解为什么java不能使用双重检查成例——哪怕你详细的给他们讲解原理,他们仍旧一头雾水。因为从一开始,最基础的,理解关于锁定和单例的相关技巧,就没被认真的学起来过。大多数的人都可以熟练的作出B+树的实现,或者排序算法——因为这是考试时需要的东西。但是你在和他们谈论实践技巧的时候,会非常伤心的发现,他们所谓的实践技巧,就是在某个特定的框架上,如何用教科书上的方法搭建出一个网站,或者是应用程序。如此我大概就知道,为什么我们全国一年有将近200W的计算机系毕业生,但是全国程序员总数才150W上下——这是07年的数据吧。 其中有一些比较靠谱的人,是真心想学好计算机的——我姑且不论理由是爱好,还是因为程序员工资比较高。但是这些人的信件里面,也有说不清的傲娇情绪。我为什么要对你负责,把具体过程实现给你?因为你说的比较好听?抱歉,就算是MM,我也已经结婚了,所以对你没兴趣。如我上文所说,我最多告诉你,从理论上这样可行。至于我是不是有能力实现,或者为什么不实现给你,这个和你没有关系。如果你自己不高兴去翻那厚厚的一叠文档,那就保持不会好了,我在招人的时候会轻松很多,而且你也会少很多伤心往事。我知道不少公司招人的时候,往往会出一道题。然后有那么几个学生,题目解答的异常完美。这个故事的结局往往两级分化,一种是这个公司把所有的优秀解答凑一凑,直接取消了这个职位。另一是这几个学生进公司后,一塌糊涂一头雾水,结果连试用期的三分之一时间都没过去就被一脚踢出大门——仔细看看你们的合同,试用期辞退是不是不用赔偿? 工作不是考试,只要技巧过关,一次通过,没人能找你麻烦。工作,尤其是技术工作,是一个长达数周乃至数年的过程。没有足够功底的人会在几天内被戳穿,然后扔出去。我知道你们会怎么做,你们会在简历中添加这家公司,然后向下家编造一个公司不靠谱的理由——阶级斗争啦,项目做完啦,或者如我上文所说的,凑凑答案取消职位啦——看看他们会不会买你的帐。如果他们做了背景调查,你没有机会。如果他们没做,你的简历上就会又添加一笔资历。三五次后,你就成为在多个公司供职的高手,月薪一次比一次写的高。大多数的HR不是傻瓜,如果真有这种高手,他们绝对不会投出简历然后乖乖的前来面试。通常这种人的手机上有N个猎头的未接来电,想要跳槽的消息传出去后,简历还没开始动笔已经有人开出了天价的薪水。如果有那么个冤大头愿意相信你,我得说,你的传销技巧做的很好。不过大部分这样做的学生,最后都去了销售职位。至于他们的结局,我就没有关心过了。 所以,干脆让我们省掉这些无聊的功夫吧。您不如直接去销售职位,我就去安安心心的挑一些不是那么无药可救的学生。看看他们能不能安下心来看这些文档,在一个个不能成眠的夜晚悔不当初,为什么不在别人指出这些资料后就去老老实实的看一遍。那些看了的学生?他们在被猎头围追堵截中,我就不凑热闹了。

openwrt特性——2.4g和5g频段的冲突

Nov 18, 2011 - 1 minute read - Comments

贝壳昨天想起,自己的平板是支持11n的,路由器也支持,为啥不做呢?于是把路由器的第二AP打开。结果——报错了。 具体过程就不废话了,老妈和外婆在唠叨各种废话,没那个心情。 DIR-825用户,把你的第二AP设定成和第一AP不同的频率。如果两者使用同一频率段,系统就会报错。估计是两个频率各自给了一根天线,混用没那么多天线。

mongo无法利用多核?

Nov 16, 2011 - 1 minute read - Comments

太伤心了,本来以为mongo的速度很快呢。测试插入数据,结果当场被泼了冷水。 conn = pymongo.Connection('localhost', 27017) db = conn['perform'] coll = db['test'] testdata = [] def init_testdata(): for i in xrange(1000): s1 = ''.join([random.choice(string.hexdigits) for j in xrange(16)]) s2 = ''.join([random.choice(string.letters) for j in xrange(200)]) testdata.append((s1, s2)) init_testdata() def insert_mongo(): for s1, s2 in testdata: coll.insert({'_id': s1, 'content': s2}) def find_mongo(): for s1, s2 in testdata: s = coll.find_one({'_id': s1}) def testfunc(funcname, times=1000): from timeit import Timer t = Timer("%s()" %

语言的易读性

Nov 15, 2011 - 2 minute read - Comments

何谓语言的易读性,简单来说,就是看到一段代码的时候,能够了解其意思。易读性最差的典型代表作是汇编语言和机器语言,因为在读这两种语言的时候,其实是你的大脑在替代模拟CPU的功效。说起来,自从汇编以后,每种语言多多少少都注重了人类阅读的习惯,像brainfuck这种特例是万难一见的。例如下面的例子。 printf("hello, worldn"); 即使没有任何C基础的人,也能够看懂这是在做一个字符串打印。 语言的易读性其实是语言非常重要的特征,比其他特征都重要。因为人类的大脑不可能记得所有的代码细节,并且能够直观的反应出如何修改。往往我们需要阅读一下代码,搞明白每段的意思,然后才能动手——哪怕这段代码出自自己手笔,只要过得一两个月,还是要重读一下的。正是因为读这个技能的使用频率非常高,所以语言的易读性非常直观的影响到语言的易用性。而易读性差的语言和习惯,目前来看有以下几个典型例子。 1.罗嗦 典型代表是Java。下面是一个Java解压Zip的代码,引用自参考1。 public class Zip{ static final int BUFFER=2048; public static void main(String argv[]){ try{ BufferedInputStream origin=null; FileOutputStream dest=new FileOutputStream("E:testmyfiles.zip"); ZipOutputStream out=new ZipOutputStream( new BufferedOutputStream(dest)); byte data[]=new byte[BUFFER]; Filef=new File("e:\test\a"); File files[]=f.listFiles(); for(int i=0;i<files.length;i++){ FileInputStream fi=new FileInputStream(files[i]); origin=new BufferedInputStream(fi, BUFFER); ZipEntryentry=new ZipEntry(files[i].getName()); out.putNextEntry(entry); int count; while((count=origin.read(data,0,BUFFER))!=-1){ out.write(data,0,count); } origin.close(); } out.close(); }catch(Exceptione){ e.printStackTrace(); } } } 我下面给出python版本。 import os, zipfile with zipfile.ZipFile(‘filename.zip’, ‘w’ ,zipfile.ZIP_DEFLATED) as

NSIS在64位下安装时无法写入注册表的问题

Nov 14, 2011 - 1 minute read - Comments

最近公司碰到一个问题,NSIS在64位下安装时无法写入注册表。 首先,这个问题不是UAC没有权限的问题,因为我使用administrator安装依然有问题。其次,问题和win2008没关系,只出现在64位上。 问题在哪里呢?在写入注册表前,SetRegView 64,写入后换回32,问题解决。 真TMD的。