2011年1月29日星期六

日子没法过了,这TMD不是扯淡么

    这TMD不是扯淡么?你当大陆父母高兴多花钱多受罪跑去香港买奶粉?还不是因为根本买不到合适的奶粉。现在父母都拿孩子当个宝,死命也要往大学里塞。更不用说肾这种关系孩子(尤其是男孩子)一辈子的事情了,更是慎之又慎。照我说,离境税收了也没用的,搞离境税?一帮父母转头就办自由行,天天跑到香港去喝奶粉,再转头回深圳睡觉。莫非准备再禁止夫妻带孩子旅游?
    其实这件事情的后面很清楚,三鹿没赔,而且还把某闹事家长给判了。再说管理市场都没用,下面的人知道上面不敢管,喝奶粉的人知道喝死没人管。咋办?就一个办法,找个肯管的。
    不改判南京徐老太案,老人摔倒就是没人扶,再呼吁也没用。不改判和赔偿三鹿,奶粉管理10年内无望。
    下一个是什么?蜂蜜?大米?房子?

2011年1月24日星期一

从快递说非对称密码学

    这两年快递评价很差,听说有基层员工冒充客户签名偷货物的。今天我们不说快递的问题,只是简单的讨论一下,如果快递公司管理层有心改变这种局面,他们有什么办法。
    首先采用的方案是要求基层员工送货到门,必须本人签名,核对签名等。不过这对冒充客户签名没有任何帮助。因为基层员工一旦参与此事,什么送货到门的规矩,本人签名的规定,都是一句废话。核对签名是个废话中的废话,因为在仲裁的时候,基层员工得到的签名不对,并不能作为他故意将货物交给别人的证据。还不明白?如果客户不提前留下签名,最后的送货员可以辩解说,我又不知道收货人签名张啥样,给签就给收呗。如果客户提前留下签名,那么送货员可以仿冒一个。
    同样,密码也有一样的困境。如果给送货员密码,等于没有防护。如果不给,等于没设定。
    对于这种现象,可行的解决方案有二。
    一种是让每个送货人携带一个终端,当客户取货的时候,必须输入预先设定的密码。如果密码持续试错,则该件锁定,交由收货人重新设定密码。这种做法的好处是原理简单明了,又能达成目标。送货人如果想要冒充收获,就必须反复尝试密码。多数情况下都是无法试出的,于是收件人收到一个警告,要求重设。这样的密码试出机率几乎是0。而收件人自己设定一个密码就可以收件,如果忘记可以重设。
    但这种方法弊端也很明显,送货人要多携带一个终端,并且收件时必须保证终端通畅。不说终端部署的费用,在很多地方,指望通讯通畅是一件非常奢侈的事情。
    第二种方法,就是让收货人提供一个问题,自行保留一个答案。这个问题和答案必须有几个特征。1.知道问题,是无法推出答案的。2.可以很简单的验证答案是否解答了问题。3.评判标准简单,不存在模棱两可的答案。4.问题和答案都便于生成和操作。
    我们来看一下,为什么这样可以阻止送货人冒充客户收货。如果送货人要冒充收件人收货,就必须知道问题的答案。但是根据1,他是推不出答案的。而当收件人收货的时候,他给出的答案是很容易验证的。当然,其实这样就满足了要求。但是如果没有4条件,这个过程只能做一次,对于大量重复的快递工作是没有任何帮助的。
    如果忽略去第四点,我们可以提供这么个问题和答案。一个1000位的质数和1000位的质数相乘,大概能得到一个1999-2001位的合数。这个合数能唯一的分解因数,求两个因数。问题很简单,但是根据目前的水平,要解出这个问题需要大量的计算资源。至少一个计算中心跑个几年是跑不出结果的。很明显一个送货的不可能随随便便解出这个问题的答案。但是如果收件人提供了两个质数,我们不说输入难度,要验证两个数相乘是否得到合数只需要一台手机一两秒的时间。至于一个数是不是质数,有一个概率算法叫做Robin-Miller算法能够解决(当然,实际用的都是略有变形的),验证起来也不过是几秒的时间。
    这个方案无疑是很不错的,但是有一个致命的问题。要进行答案验证,就必须输入两个质数和合数。加起来大概有4000位的数据,输入起来会让人绝望的。在实际的快递中,这种方法没有任何应用价值。
    但是对于类似快递的电子邮件系统,电子商务交易,在实际操作的时候数据交换和计算设备都绝对不是问题。因此,这类方法在电子商务上有非常重大的用途,说是电子商务的基石也毫不为过。
    这类算法就叫做非对称密码算法,所谓非对称,指的是加密和解密过程使用的两个密钥不相等,又互相关联。其原理是当今世界最顶尖数学问题之一的“P和NP问题”,位列希尔伯特23问题和千禧年八大数学问题之中。能同时列入的都是对世界产生深远影响的重要数学问题,例如黎曼猜想。其实从理论物理角度,有一样东西更容易满足非对称验证的特性,就是两个处于纠缠态的基础粒子。如果我们忽略两个纠缠态量子怎么传递的问题,理论的想象,其中一个基础粒子跟随箱子,而另一个基础粒子在收件人手里。验证就是非常简单的问题了。干涉一个基础粒子到某个特定偏振态,使用一束光同时通过两个粒子。如果两个粒子处于纠缠态,那么光子在通过两个粒子的时候,粒子一定处于同一偏振状态。如果是非纠缠态的两个粒子,则光子输出的时候会比纠缠态量子有更大的吸收幅度。这个系统最完美的一点是,纠缠态的量子是绝对无法复制的东西,除非违背量子力学。不过从实际角度考虑,不说我们尚未成功在实验室里做到这一系列事情。单是让箱子携带一个基础粒子就是一个扯淡到不能再扯淡的事情。
    当然,在快递中没有采用非对称算法的主要原因并不是因为实现困难,而是管理层根本无心改变这种局面。关于这个问题,我们在另一篇“快递战争”中讨论。

2011年1月19日星期三

下雪了

    又下了漫天大学。
    同情一下春节回家的人。
    是为之纪。

2011年1月18日星期二

freenas和解决方案

    freenas是一个基于freebsd构建的免费网络存储系统(network storage system),关于他的简介可以看这里(http://beacon.blog.51cto.com/442731/109961),主页在这里(http://freenas.org/FreeNAS)。
    freenas的一个特点是结构简单,易于安装和管理,可以在非常低的硬件环境下工作。例如低端的2.5''硬盘或者U盘,基于mini-ITX板子的EPIA等。512M内存的低端EPIA不带硬盘大约在250元上下,加上机箱不超过400。加上几块硬盘就可以组建可用的大型存储系统,稳定工作。安装freenas所需的知识基本不超过英语,当然,要组建微型服务器和RAID还是要正确理解服务器结构和配置的。支持smb/ftp/iscsi/http访问内容,通常在小型公司中可以处理掉大多数的文件共享需求。
    freenas最强大的一点,就是使用“解决方案”级别提供。freenas的载体是一张安装光盘,而非一个freebsd下的软件包。这张光盘在服务器上的安装是通过特定的功能来完成,而不是复杂的安装向导,因此要安装使用非常简单。如果是基于freebsd的软件包,那么为了安装这个软件,首先必须freebsd的系统管理员来安装一个系统,并配置到合适状态。再在这个系统上安装软件包,再配置,整个过程就艰难无比了。
    同样适合类似的解决方案提供的,还有邮件服务器。虽然很多空间商提供了邮箱服务,但是部分公司对邮件系统的需求远远超出空间商能提供的服务。对于企业邮箱系统,不仅仅是邮件发送和接收服务(esmtp/pop3/imap),而且包括一定的用户数据库(ldap)和在线交互系统(im)。严格来说,这已经不是普通的企业级邮箱系统,而是整合办公环境。对于这种整合环境,要完整配置出来还是有一定难度的。对此采用简化的方法,将一套系统作成整合解决方案,不失为一个简单好用低成本的方案。

2011年1月17日星期一

万税万税万万税

    一年一度,我们又迎来了发年终奖的时候。不知道有多少人要准备跳槽,又有多少公司会迎来新人。无论如何,年终奖还是要发的。
    今年年终奖,老板还算挺给力。高兴了不到两天,老板来跟我谈扣税的问题了。按照税务规定,一年有一次年终奖可以分摊到一年12个月上的机会。其余的就只有合并入当月工资,交高的离谱的个所。贝壳挺走运,去年还没碰到过需要分摊的机会。然后执行分摊,贝壳的收入不算太低,反正高于7000,肯定小于22000,属于20%的征收比例。按照规定,假定贝壳有10000年终奖,首先要——交四金?
    是这样的,如果你要分摊到12个月上执行,就必须补缴公积金,因此,10000的年终奖先扣除18%的公积金,然后再扣除20%的税,剩下6200。
    我靠,这不是奥迪进去奥拓出来么?
    再说这个公积金基点问题吧。贝壳查了公积金规定,基本就是“享受只和年限有关,和交多少无关”。本来上海有“公积金最高按照三倍当地平均工资计算”的规定,贝壳刚工作的时候,上海平均工资的三倍是4400,贝壳交的就是最高额度的公积金。到了去年,根据统计局的数据,上海平均工资3800,三倍一执行,无疑问的超过了贝壳的工资。所以——贝壳的工资被全额征收了18%的公积金。
    ——除了7%+7%的住房公积金,其余公积金你们还能再有用点么?
    再说老板吧,月初阿姨来,和我聊到企业缴税情况,也是吓死人。首先交4%的建设税。道路建设基础教育,反正国家的发展离不开企业的大力支持。然后,假定是一般纳税人吧,对增值部分征收17%的增值税——这个所谓增值部分,仅仅算企业的原料,人是不算的。当然,各个行业不同,有些高科技公司仅仅执行12-15的税点。然后,公司要给员工开工资之前,先要缴44%的公积金企业部分。贝壳的6200的奖金,其实老板大概要拿出14400,到手43%,不到一半。企业的剩余盈利部分,最终要申报企业所得税。得,这么算下来,老板去年总销售额度所剩下的扩大生产基本差不多。
    这不扯淡么?

2011年1月13日星期四

全能全知的逻辑学悖论

    很多人在讨论“神是否全能”的时候,会举出一个命题“神是否能创造出他自己也举不起的石头”来证明神不全能。如果能创造出,那么神不能举起石头。如果创造不出,那神创造不出特定条件的石头。
    然后就有人提出,逻辑学上一个命题必须证明其存在性,即“自己举不起的石头”存在。又有人来反驳,这个是需要神创造的。blahblah
    其实整个讨论都没抓到实质,我换个问法。全能,是否包括能够做到逻辑学上不存在或者悖论的事情?
    从字面上理解,应该是可以的。例如一个命题,逻辑学上说,总是非真即假的。那么神应当可以找到一个同时为真和假的命题,这才能显示其全能。问题是——这样逻辑学就没用了。
    同样的问题出现在全知上,全知,是否应当知道逻辑学上不可能成立或者悖论的事情?
    同样从字面理解,应当是可以的。
    如果对上述两个问题,还要给出存在证明。那只能说明,全能和全知并没有被字面意义上的理解,而是被作为大能和大知去理解。虽然能够做到一般人做不到的事情,然而并不是什么都能做。虽然能知道一般人不知道的事情,但是不是什么事情都知道。这样才和逻辑学不相矛盾。
    更细节的讨论,可以看中文维基上的“全能悖论”,其中对全能的细节分类很说明问题。

2011年1月12日星期三

linux下使用windows共享打印机打印

    废话不说,上干货,六牙四皂小姐,猫咪退散。
    http://www.openprinting.org/printer/HP/HP-LaserJet_1010 这是我的机器型号和驱动
aptitude install cups foomatic-filters smbclient hpijs hplip
    添加你的设备,并测试。

2011年1月10日星期一

春运的两重抉择

    春运了,大家又开始排队买票了哈。
    现在有很多“破解”春运难题的意见,破你妹阿。短缺问题就这么几种解法,涨价,增加供给,减少需求。什么搞实名制,春运专列,通通不靠谱。
    为什么实名制不靠谱?实名制不是解决短缺的方法,实名制是解决不公正的方法,而且根据张五常的理论,是一点用都没有的。实名制并不改善短缺问题,他只是让“感觉排队买票不公正”的人感觉到比较公正而已。破解方法已经出来了,提前把你的个人身份资料给黄牛,他们照样能弄出黄牛票来。
    为什么春运专列不靠谱?春运的时候,铁路运力已经达到极限,这时候再给任何人开一列专列,都会减少其他人的车。这属于剥夺其他人的权利来增加某些人的权利的行为,我们也叫特权。
    涨价,这个方法倒是有效,票不够就再涨价么,涨到一定程度总会有人不去的。但是这个理论上正确的方法却是大家最没法接受的,大过年的,一年就回家一次,还要忍受贵死的票价,你妹的还让不让人活阿。
    增加供给,这是大家所喜闻乐见的方法。不过带来另一个问题,那么一大堆铁路,平时你养着阿。
    那看来,只有在减少需求上下功夫了。尽量把需要人力的工厂搬迁到西部去,资源就地开采,人当地招聘,再通过方法往出运。这个所造成的峰值压力无论如何都小于春运吧。
    春运,是中国畸形的城市化过程中的必然之痛。

吃糖的艺术

    张家有两个小孩,张三和张四(想到李四的自己面壁去)。有一天,他们的妈妈给出了他们一个交换条件,乖乖在饭前坐着不溜出去玩,饭后就有一根棒棒糖。张三比较乖,坐着没动。张四跑出去玩,饭后就没糖吃。张四就不开心了。
    为什么张三有糖吃我没有?
    我出去玩也给张三带东西了阿。
    我不管,这不公平。
    以上看起来只是小孩吃糖的闹剧,实际上却有着非常复杂而深刻的哲学。其核心问题是,家长是否应当满足孩子的吵闹,给张四吃糖呢?
    作为行为理论的基础,“大人”的言行会被视为一种允诺。这种允诺不但允诺自己会做什么,也同时允诺不会做什么。溜出去玩的孩子没糖吃——交换条件是这样说的。如果从大人一方单方面的破坏自己的允诺,那么小孩很容易的就得出“大人的承诺是没有效力的”这样的结论。于是,两个孩子就都不会呆在家里了。作为这种理论的结果,给张四吃糖是一个非常差的选择。如果张四有糖吃,那么下次张三就不会听从自己的命令不跑出去玩。
    然而作为一个经典的中国家长,往往会冒出一个“聪明”的想法。他们会和张四讲条件,“来,我偷偷的给你,不能和张三说哦”。这个方案在短期内是异常完美的,张三不会不开心,还是很听话,张四也不闹了。
    然而在长期来说,有两种结果。张三终于知道了这个交易,和张三始终不知道这个事情。其实这两个选择的差别只是张三是否有反应而已,对于张四,情况是一样的。他们懂得如何“出去玩也有糖吃”,奥秘在于会吵和对别人保密。于是在张四长大后,他们必然的,有两个特点。在碰到对自己不利的事情的时候,格外会宣扬。这种宣扬,可能是苦天跄地,可能是找记者,可能是找领导。无论原因是因别人,还是因他们自己而起,他们都特别的会吵。在吵得不到自己想要的东西的时候,他们会使用闹的手段。而且如果有人和他们说,“我可以给你们好处哦,但是你们不能公开”。他们也不会考虑为他们奔走呼叫的人,只是说一些“我们也没有办法”而已。
    我不知道有多少人将这种明显的功利主义视为一种正常现象——这也许可以给我们当下的很多现象给一个完美的注脚。
    更进一步,如果张三也知道了这个交易——这么长的时间内也不可能不知道吧。那么张三采取的对策只能是——保护眼前利益,有的玩赶快玩。如果为了长远利益放弃眼前利益,长远利益是否能得到未尝可知。即使有,对于不放弃眼前利益的人,也同样可以获得——这对放弃眼前利益而言没有任何优势可言。于是两个孩子的行动都只能是——跑出去玩。于是,大人的策略失败了,再调整策略也不会得到小孩的信任。两个小孩也开始互相猜忌,他们的童年结束了。
    童年的结束是一件谁也没有办法的事情——彼得潘只存在于神话之中。但是以如此的方式结束童年不能说不是一件悲剧。
    大人的行动策略的关键是,让小孩认识到,吵闹是不会获得糖果的。结果只和你的行为有关,和你的理由没有任何关系。要获得什么,就必须付出什么,不失去什么,就不能得到什么。为了饭后能吃到棒棒糖,就必须放弃饭前溜出去玩。为了晚年能够悠闲的在世界各地旅游,在青年时代就必须放弃休息努力工作。对于一边流着泪一边诉说“当时我这样做是多么无奈,我现在甘心接受结果”的人来说,受到和说之前一样的结果——并非我们不宣扬同情,同情是给付出了足够代价的人的。
    这个例子是《经济学家写给女儿的一封信》(具体的书名我已经忘了)中的例子,讲的是级差所得税——一种穷人可以“抢劫”富人的税种。如果一个人的富有是因为他年轻时期的勤劳工作,我们有什么理由去对他的勤劳工作征收更高的税呢?这只会鼓励人们不事劳作——作者说如是。

2011年1月5日星期三

linux虚拟化简介

    又是科普文,行家免入。
    关于虚拟机的一些比较充分的讲解,可以看这里(http://zh.wikipedia.org/zh-cn/虚拟机比较)。下文是对linux下希望实现虚拟化和被虚拟化的情况提出一些简洁的说明。
    1.windows下虚拟出linux。
    不在意版权的人可以装个vmware 6.0以上,在意版权的装virtualbox开源版。字符界面通常分配128M内存,512M交换分区。图形界面512M内存,1024M交换分区。硬盘大小视各个发行会有所不同。对于多数工作用的系统,建议使用debian stable安装后升级到testing,稳定好用,最主要是简洁。128M内存512M交换8G的磁盘,足够系统安装和大部分的开发/运行。
    2.linux下虚拟windows。
    啥都别说,装virtualbox吧。破解vmware是很蛋疼的一件事情,装ESX就更蛋疼了。建议,XP512M内存以上,要稳定使用至少1G。倒是页面文件,只要512M就差不多了。硬盘至少准备16G以上,否则安装程序加运行数据,十有八九会空间不足。
    3.linux下虚拟linux。
    主要可用方案分为四类,系统虚拟化,半虚拟化,全虚拟化,硬件虚拟化,分别介绍。
    4.linux下虚拟一些比较怪的东西。
    这是职业玩家了,例如minix,或者freenas。改天写写后者,挺不错的一个创意。
    1.全虚拟化
    vmware是这种技术的代表。全虚拟化的特征是可以运行完全不同的系统,例如linux下运行windows。virtualbox是开源中做全虚拟化做的比较好的一款软件。当然,即使是全虚拟化,也必须是同一类CPU,例如32位虚拟64位CPU就不给力了。要虚拟不同的CPU,是CPU虚拟化,例如bochs和pearpc。速度大约是真机器的几十分之一,除了调试程序外没别的用途。
    全虚拟化比较适合玩玩其他系统,其他可以选用的方案有,vmware,virtualbox,virtual pc,qemu。
    2.半虚拟化
    Xen是这种技术的代表。通过修改的真机内核和客户机内核来支持虚拟化。优点是效率比全虚拟化高,缺点是客户机必须是可以修改内核的,这将windows排除在外。但是从理论上,可以在linux的xen上运行freebsd系统,两者都是开放内核源码的系统。
    半虚拟化技术一般被拿来做VPS比较多,基本没有其他可选用的方案。
    3.系统虚拟化
    OpenVZ是这种技术的代表。这种技术通过系统内核级别的代码修改来支持虚拟化。优点是效率比半虚拟化更高,缺点是客户机和服务器必须是同一个内核。因此真机和客户机都必须是linux(或者其他相同系统,例如freebsd),但是可以是不同发行(例如真机debian客户机centos),而且客户机不能自由加载内核模块。
    系统虚拟化也被用来做VPS,但是这种VPS有强烈的超卖可能,因此不推荐使用。反倒是在同一个公司内,因为某些原因需要将多个程序部署在多台设备上,每台设备所需的资源又不多的时候,比较适合用。其他可选用的方案有jails,vserver,virtuozzo。
    4.硬件虚拟化
    kvm是这种技术的代表。当然,vmware workstation,virtualbox等也可以支持这种技术。这种技术是未来虚拟化的大趋势。
    硬件虚拟化,是使用CPU和其他硬件的特殊设计,辅助虚拟化的进行。通过硬件虚拟化,虚拟机的执行效率往往可以达到和半虚拟化相似甚至超过的地步,而不需要客户系统的特殊配合。从设计理论上说,完整的硬件虚拟化应当可以在客户机上再执行全套的硬件虚拟化,如VM/370。但是目前Intel和AMD的家用CPU系列只支持在真机上创建一系列虚拟机实例,这些虚拟机的内部是不支持硬件虚拟化的。
    硬件虚拟化可以用在VPS/机器切分/新系统尝试等各种环境中,其他备选的方案有,vmware workstation,virtualbox,virtual pc,qemu。

2011年1月3日星期一

python试题

前两年在公司用过的试题,不知道发过没有。在我的blog上搜了搜,没找着。大家可以看看玩。

1.py文件在运行时会产生pyc文件,用于缓存编译后代码(3分):
a.正确
b.错误
c.不完全正确
----------------------------
c

2.python支持多线程,能够单进程无缝发挥多路CPU的优势(4分):
a.支持,能够
b.支持,不能够
c.不支持,能够
d.不支持,不能够
----------------------------
b

3.在python中,使用for从列表中删除元素是错误的做法,会导致___________。
正确的做法是使用python内置的____________函数(4分)。
----------------------------
漏删元素,filter。(一空2分)

4.请改正以下程序中的错误,并写出结果(12分,本题禁止使用python运行):
a=10
def test (*b):
    print (a,type(b));
    a = 20;
    print a;
    print b[0](b[0])

if __name__ == "__main__":
   print test (*[test]);
----------------------------
答对一处错误给3分,答对结果给6分,结果其他部分对但type(b)错误给4分。
答其他错误倒扣2分,扣完为止。
a = 10;

def test (*b):
    global a;
    print (a, type(b));
    a = 20;
    print a;

if __name__ == "__main__":
   print test (*[test]);
以下是结果。
(10, <type 'tuple'>)
20
None

5.下面代码是否有错,如果有,请修改错误。
如果没有,写出以下代码的运行结果(15分,本题禁止使用python运行):
def wrap_info (f):
    b = {"b":10};
    def inner_func (*p, **k):
        print b['b'], p, k;
        b['b'] += 1;
        f(*p, **k);
    return inner_func;

def info (s):
    print "func info: %s" % s;

if __name__ == "__main__":
    f1 = wrap_info (info);
    f1 ("a");
    f2 = wrap_info (info);
    f1 ("b");
    f2 ("c");
----------------------------
代码没有错误(回答有错全题不得分)。
10 ('a',) {}
func info: a
11 ('b',) {}
func info: b
10 ('c',) {}
func info: c
三个数,全部答对得15分,错一个扣5分,扣完为止。

以下题目可以使用python上机测试
----------------------------

6.请写出一个python程序,能够打印自身(15分,允许使用python上机)。
----------------------------
本题没有标准答案,将结果在python中运行即可,以下为一个可行答案。
a="a=%s%s%s;print a%%(chr(34),a,chr(34));";print a%(chr(34),a,chr(34));
全题15分,答对给分,答错无分。

7.补完以下函数,使得继承此类的对象具有单例特性(10分,允许使用python上机):
class singleton (object):
    """ 单例模式的实现 """
    def __new__ (cls, **kargs):
        """ """
以下填空。
----------------------------
以下为一种实现,其中_instance可以改为其他名称。
        if '_instance' not in cls.__dict__:
            cls._instance = object.__new__ (cls, **kargs);
        return cls._instance;
全题答对给10分,以其他方式实现单例给4分。

8.yield通常在python中被用做生成器,但实际上,这一实现是一种被称为协程的多线程交互模式。
请补全下面的代码,使得两个虚拟的线程能够互相交互运行(12分,允许python上机)。
def thread_1 ():
    for i in range (0, 10):
        print i;
        yield i;

def thread_2 ():
    for i in range (20, 30):
        print i;
        yield i;

def run (thread_pool):

if __name__ == "__main__":
    thread_pool = [];
    thread_pool.append (thread_1 ());
    thread_pool.append (thread_2 ());
    run (thread_pool);

结果为0-9和20-29交替出现,不用考虑多函数的生成器停止不同步问题。
----------------------------
该题也为多种答案,运行通过即可。
def run (thread_pool):
    try:
        while True:
            for i in thread_pool:
                i.next ();
    except StopIteration:
        pass
其他答案亦可,但结果不能交替出现不算分。未能捕获StopIteration扣6分。

9.指定加载问题(21分)
假定目前有一个正在工作的业务系统,其中一个抽象类大致如下:
class IfaceWorkspace:
      ....
系统的总体框架为django,系统内有该抽象类的一个实现,可能有客户在使用该实现工作。
此时,管理员需要动态的更换一个新的实现到服务器上,但不能重启django服务。
而且由于权限问题,因此系统仅仅对~/.temp具备写权限。代码不在此处,因此替换文件的思路是不可行的。
另外,由于新老实现对资源的操作方式不一致,因此同时运行的时候可能会出错。
因此,程序员编写了一个函数,接受输入的文件提交,将其载入系统并替换当前实现。
该实现不触发系统的重启,不会引发死机。请简述这个函数的实现机理,并用伪代码描述关键步骤。
----------------------------
本题为主观题,任何理论上可以通过的步骤和方法都得分。下面是本题一种最简单的思路。
首先将上传文件内容保存到~/.temp下的某个文件中,而后使用imp.load_module加载到当前实例空间中。
使用全局静态工厂方法产生实例,因此在加载后可以向全局静态工厂方法注册替换。
当新的类注册时,阻塞工厂方法的调用。当工厂清理方法调用时,判断使用中列表是否为空。
空则完成实现的替换,并且向工厂方法发送信号,释放所有阻塞的线程。
使用动态载入,全局静态工厂,替换阻塞,三个点各7分,未用伪代码描述清楚得4分,总分21分。

10.柯西计数问题(24分):
#理论上,可以将自然数使用函数序列来表达,例如:
def zero ():
    return lambda f:lambda x:x;

def one ():
    return lambda f: lambda x:f (x);

def two ():
    return lambda f:lambda x:f (f (x));

#请补完代码,判断一个函数对应自然数中的多少。
def show_num (n):
    以下为补完。

#请补完以下函数,使得最终的输出结果如后文所描述。
def add_1 (n):
    以下为补完。

def add (m, n):
    以下为补完。

def mul (m, n):
    以下为补完。

three = add_1 (two);
five = add (two, three);
fifteen = mul (three, five);

if __name__ == "__main__":
    print show_num (zero);
    print show_num (one);
    print show_num (two);
    print show_num (three);
    print show_num (five);
    print show_num (fifteen);

输出为:
1
2
3
5
15

----------------------------
该问题有多种解答。可以将答案输入系统,运行后正确即可。
答对一个函数得6分,下附上可行答案。
def show_num (n):
    return n () (lambda x:x+1) (0);

def add_1 (n):
    return lambda :lambda f:lambda x:f (n () (f) (x));

def add (m, n):
    return lambda :lambda f:lambda x:m () (f) (n () (f) (x));

def mul (m, n):
    return lambda :lambda f:m () (n () (f));

2011年1月2日星期日

为什么C语言并不适合语言入门教学

    国内学校基本都用C语言作为入门语言教学,某本C语言教材大卖,这TMD是我看到的最蛋疼外加胡扯的事情了。你们打算把全校学生包括传媒系都培养成职业程序员么?感谢上帝,中国已经有部分学校用了java乃至python,让我不至于太绝望。
    C语言作为语言之王,有着与生俱来的优势和原罪。你可以不用,但你不能无视。python的os模块基本都是底层封装,封装的是什么呢?linux下是libstdc或者是linux c api,windows下是SDK API,都是C接口而不是C++接口。因为C是一层对底层数据结构的高层抽象,主要解决兼容性问题。例如ARM/x86平台不兼容之类的问题。用C写代码的时候,就是在直观的操作底层的数据,包括内存结构,指针。正是因为这个特点,因此几乎所有平台都用C作为底层语言,并且提供C的API接口。然而也是因为同一个理由,C中缺乏高级对象支持,写一个稍稍复杂点的结构就必须动用数据结构的知识。例如你需要模拟一个园区的物流运作,因此需要写个程序。很明显,运作是以时间为顺序触发的,因此需要一个时间队列。熟悉数据结构的同学应该想到,最适合的结构应当是堆排序中的堆结构。如果没有,那么链表结构也能凑合。但是在C语言里面呢?抱歉,你需要自己实现一个链表。
    纳尼?我它喵的为了做一个园区运作的模拟,它喵的先要啃数据结构书,然后写链表代码。你当我是计算机系的学生阿,老子是管院的。
    C++比C更适合这个问题,C++中可以使用STL,而STL中的list算是凑合的解决了这个问题。哪怕用vector,也算一种可以接受的方案了。C下面为了绕过这个问题,我用了65536长度的数组,于是程序一开就是10+M的内存。这还是我能找到的最优雅的解决方案——总比自己去写一个或者用第三方链表好。java就很明显更加适合解决这个问题,它内置了list数据结构。python虽然没有list结构,但是可以用array模拟,也可以用堆结构。
    无论如何,总好过去找第三方库吧,真当老子是IT民工啦。
    C++比C好点,但是使用C++的原罪是C++复杂的语法结构。光是类的问题上,就有静态,成员,虚三种。每种配合上public protected private,再继承一下public protected private。大约有27种情况需要记忆,它喵的这是写程序还是玩大家来找碴阿。而且还有重载,算符重载,隐性类别转换,强制类别识别这些绕死程序员的问题,我怎么看都不觉得适合给啥都不懂的非计算机系学生解决问题用。
    非计算机系的学生,需要的是这样一门语言。好用,强大,建模和解决数学问题的能力要强,速度和安全性可以无视。很明显,C根本不合格,连边都够不上。因此在国内高校中,实际是matlab和java承担起了这个任务——然而这两门都是非必修选修课,或者压根没地方教。
    有用的知识不算分,甚至没地方学,没用的垃圾要考试——这个,我真——无语了。。。