2017,开不动的印钞机–中国经济发展态势分析

转按:2017年5月份,经济学者许小年发表“许小年:转折点上的中国经济/中等收入陷阱”,文中说资金/资本驱动的模式已经无法凑效,取而代之的将是创新驱动等。所言前半部分资金/资本无法驱动经济的观点与本文有所接近,附贴如下。

注:本文的数据已更新到2017年8月份。

 我们从这样一组数据开始本文:2013年初,我大中国央行“对其它存款性公司债权”(央行借给商业银行的债)规模为1.45万亿。当年6月,钱荒发作,各商业银行的现金流濒临断裂,全社会陷入恐慌。央行紧急启动“SLF”、“MLF”等方式,直接借钱给商业银行,补充商业银行的现金流。至2014年底,央行对其它存款性公司债权的规模为2.50万亿,2015年底为2.66万亿。这两年央行在借钱给商业银行的问题上,算得上极尽克制,两年时间加起来也就是借了1.21万亿出去。然而到2016年底,该数据暴增到8.47万亿,较2015年底暴增了5.81万亿,增幅高达218%。

到2017年,这种令人震惊的增幅突然就停止了。6月底的数据为8.59万亿,较2016年底仅仅微弱上升了1200亿,增幅只剩下可怜的1.4%。看起来,商业银行已经不再需要找央行借钱了似的。 

我们必须知道的是,央行借钱给商业银行,乃是2013年以后,我大中国最重要的金融现象,没有之一。2014和2015年央行借钱给商业银行的规模偏小的结果,是全中国的房地产市场都陷入萎缩,于是我大中国政府被迫在2015年底启动“地产去库存”运动,并敞开央行的大门,让各商业银行想借多少就借多少。这就是2016年央行对各商业银行的债权规模剧增的原因。然而,2017年,这一切都戛然而止,商业银行竟然突然停止向央行借钱了。在这种现象的背后,一定有着非常深刻的经济学上的原因。而将这个原因挖掘出来,一定能让我们更加清晰的理解未来之路。这,就是本文的核心目的。

——是以为序

 

【一】以债为锚

一直到1971年,人类才正式放弃以贵金属作为纸币发行之锚的做法,从这个时候开始,人类进行了以债为锚发行纸币的新时代。要理解这一点,我们必须回头,重新认识货币的历史。

首先我们要重新认识一位伟大的历史人物:伊萨克·牛顿,人类历史上神一样的科学家,鲜为人知的是,牛顿同时也是一位神一样的经济学家。他担任英国铸币厂长长达30年,并建立起一套完善的货币发行体系。牛顿之后,人类才真正理解了货币,解决了国际贸易中不同种类的货币如何相互兑换的问题,英国也因此获得了巨大的国际竞争优势,成长为真正的“日不落帝国”。...

1696年,时年53岁的牛顿接受其当时的英国财政大臣,也是他学生的推荐,担任英国铸币厂的皇家监理,3年后正式接任厂长,此后牛顿长期担任铸币厂长一职,直至1727年去世。在牛顿接任铸币厂长的时候,大航海时代已经到了尾声,海洋的神秘面纱已经被揭开,通往各大陆的航道都已成熟。大英帝国内部已经正式建立起君主立宪制,外部则刚刚结束与法国之间的大同盟战争,举国上下正是朝气蓬发,试图向全世界扩张,拓展殖民地。而这个时候,制约英国脚步的最大问题,就是货币。

在那个时代,人类依然处于贵金属货币时代,以贵金属打造的金银币是最为流行的货币。英国当时面临的问题,其实是当时欧洲各主要国家普遍遇到的问题:金银币的铸造标准问题。最基本的问题有两个:第一,一个标准贵金属币上标注的数值,是货币单位还是重量单位?比如标注为10便士,还是10克?第二,如果标注为货币单位,那么该贵金属币是否应该足值,也就是标注为10便士的金币,其中必须含有相当于10便士的金子?当然了,这两个问题其实是一个问题:贵金属币是否必须足值?

牛顿以其科学界崇高的威望压制住了争议,坚持以货币单位为贵金属币的标注单位,这算是解决了第一个问题。到1717年,在牛顿的建议下,英国议会通过决议,确定了黄金与贵金属币的兑换比例:每盎司(纯度0.9)黄金=面值为3英镑17先令10便士的贵金属币,英国政府官方承诺兑换。这是人类历史上第一次,由政府出面,对货币币值与黄金重量之间的兑换关系作出正式承诺。事实上,这就意味着自此之后,英国的贵金属币可以不足值,一个面值10便士的贵金属币中,可以只含有价值7便士的金子,然而英国政府的官方兑换承诺,给予了这枚不足值的金币以足够的信用,让它可以作为完完整整的10便士使用。大家对英国政府有信心,当然就对英国政府发行的金币有信心。反过来,所有使用英国金币的人,无论他在世界的哪个角落,为了确保自己手上的金币的购买力,他都会主动维护英国政府的利益。就这样,英国逐步获得了全世界的支持,四十年后,原本在欧洲一直处于边缘地位的英国终于崛起,彻底击败了西班牙和法国,成为独一无二的海上霸主。此后日不落英国在各殖民地效仿金币的发行机制,发行纸币,承诺可以凭借纸币兑换等面值的金币。这些纸币在殖民地流通,促进了国际贸易的蓬勃开展。

到了这个时候,英国的货币发行体系分成了两个圈层。在英国内部,政府以足额兑换的承诺,依靠7成的黄金储备就能发行10成的金币;在外部殖民地,则以承诺兑换金币为基础大量发行纸币。英国政府的信用,成为了货币发行的根基。将政府信用与货币发行相捆绑,这恰恰是牛顿爵士在经济学领域做出的突破性贡献。在我看来,这种贡献对人类社会的意义,不比发现万有引力定律来得小。

有了英国政府进行信用背书,英国本土的金币加上殖民地的纸币英镑,乃是人类历史上最早的国际货币,它的使用一直持续到1930年代的全球经济大萧条时期,英国政府财政濒临崩溃,已经无力再承担国际货币的责任,对于世界各地拿着纸币英镑过来兑换金子的要求,英国政府已经无法承受,于是只能在1931年取消兑换承诺。全世界突然就丧失了能够支持国际贸易并能为所有人接受的国际货币,全球经济雪上加霜,并终于带来了第二次世界大战。

二战之后,美国成长为新的全球霸主,对于当时缺乏国际货币因此难以开展国际贸易的问题,除了美国,其它国家根本就解决不了。好在这个时候美国也出了一位真正的经济学大神,哈里·怀特,近代史上充满了争议的传奇人物,此人乃是当代国际经济秩序的制定者,布雷顿森林体系之父,在人类经济制度史上,唯一可以与牛顿相媲美的神。

1944年,在美国新罕布什尔州布雷顿森林召开联合国国际金融会议,讨论如何解决缺乏国际货币的问题以及如何建立新的国际秩序的问题,时任美国财政部助理部长的哈里怀特说服了其他与会代表,以美元作为国际货币,组建国际货币基金组织和国际复兴开发银行(即世界银行)。同时,在怀特的推动下,美国政府向全世界承诺,1盎司黄金=35美元,美国政府以国家信用担保兑换..

(布雷顿森林会议上的美国代表团,后排左一为怀特)

1946年,国际货币基金组织和国际复兴开发银行在华盛顿正式开始营业,这在事实上宣告了“布雷顿森林体系”的正式确立。它们的章程规定,每个国家的货币币值都必须使用黄金或与黄金等价的美元来表示,并且未经批准不得修改。这就在事实上确立了美元=黄金的信用关系。1947年,在布雷顿森林体系的基础上,美欧各主要国家达成《关税总协定》,确定成员国之间放弃贸易壁垒,以美元为媒介进行交易。1948年,美国启动“马歇尔计划”,直接向欧洲各国投资,复建其被打成废墟的工业体系,振兴欧洲各国经济。如此三管齐下的结果,就是美元自此成长为国际货币,具有了黄金般的信用,为世人所普遍接受。这一系列的举措,统统都是在落实哈里怀特的经济计划。 

然而哈里怀特本人在1946年国际货币基金组织正式开始营业后,就陷入了一堆莫名其妙的苏联间谍指控。他很快就退出政坛,为了应付责难心力交瘁,在1948年就黯然辞世。人类自此失去了最后的经济学大神,对于美元作为国际货币而可能引发的各种问题,再也没有人能进行系统的思考和总结。

在这里顺便说一句,当时的中华民国曾经是国际货币基金组织、世界银行和关税总协定的创始国,可惜的是,新中国建国之后向苏联靠拢,并立刻就退出了这三大组织。此后,到1980年中国才重新加入国际货币基金组织和世界银行,到2001年才重新加入关税总协定。为了恢复这三个组织的席位,加入到新的经济秩序之中,新中国经受了重重考验和磨难,不过这都是后话。

布雷顿森林体系的本质,是以美国的国家信用为美元的购买力进行担保,美国官方承诺美元可以按固定利率兑换黄金,这种做法与当年英国的牛顿爵士如出一辙。甚至,只要美国的国家信用还在,有没有黄金可以兑换,都不是问题。英国在1931年取消英镑兑换黄金的承诺,英镑立刻就丧失国际货币资格的原因,在于当时的英国内忧外患,各殖民地纷纷在闹独立,英国的经济本身遭受重创,国家信用岌岌可危,英国无法再为其货币的购买力进行信用背书。然而美国不一样。1971年美国尼克松总统迫于兑换压力,同样取消了美元兑换黄金的官方承诺,但是当时的美国依然是世界第一大国,具有不可挑战的经济和军事领导地位,其国家信用坚不可摧,因此美元作为世界货币的地位完全没有受到影响,建立在布雷顿森林体系之下的国际货币组织、世界银行和关贸总协定依然在平稳运行。经济学界鬼哭狼嚎的所谓布雷顿森林体系在1971年后就陷入崩溃的说法,基本上就是瞎扯淡。从这一点上看,全世界的主流经济学家,在大神怀特去世之后,就只剩下一帮白痴。 

 

我们今天回头来看,无论是大英帝国的“金本位”制度,还是布雷顿森林体系早期的“美元锚定黄金”制度,它们真正能够生效的机制,都是国家信用。货币,就相当于是政府发行的信用债!朝气勃发勇于进取的帝国精神,才是英镑真正的信用之源,而不是英国皇家国库的那点子库存黄金。一旦1930 年代英国丧失进取心,变成整天追忆往昔荣耀的破落户,英镑立刻就随之丧失了国际货币的地位。英国本身让人丧失了信心,英镑才随之被世人抛弃。而美国之所以能在1971年取消美元锚定黄金的制度之后,依然维持着美元的国际货币地位,唯一的原因,就在于美国依然强大,依然富有强烈的进取精神。它依然是全世界尖端科技的带领者,流行文化的传播者,它的士兵训练有素身经百战,在最短的时间内能出现在世界的每一个角落。在这样的情况下,黄金这种不知所谓并且几乎没有工业价值的玩意儿,终于退出了人类的货币价值体系。直接将纸币的币值锚定在国家信用之上,国家信用的强弱,直接决定纸币的购买力大小,这才是人类的正途,也是纸币的终极归宿。

在确立了以美国的国家信用作为美元之锚后,美元成为了真正的世界货币,并最终成为全世界的发展基石,全球经济因此得到了持续发展,人类进入了经济发展的黄金岁月。1950年全球GDP规模只有1万亿美元,到1970年超过了3万亿。1950年全球跨国商品贸易规模只有600亿美元,到1970年已经超过5000亿美元。1971年美元与黄金脱钩,对世界经济的发展毫无阻碍。到1980年,全球GDP总规模就超过11万亿美元,跨国商品贸易总额达到3.6万亿美元。在这种背景下,1981年上任的美国总统里根顺理成章的走出了下一步:以债为锚。里根政府大规模发行国债,并由美联储直接认购,政府手里有了钱,就可以进行各种直接投资和采购。这当然就是以发债的形式,将美国的国家信用直接变现为美元了。1981年里根刚刚上任时美国的国债规模是9979亿美元,到1989年里根离任,美国的国债规模上升到了28574亿美元,增加了近两倍。财大气粗的美国政府因此可以大规模的加强军备,搞星球大战计划,拖着苏联进行军备竞赛,将苏联政府拖得苦不堪言。同时,刚刚启动改革开放的中国脱离社会主义阵营,投向美国,积极争取美国投资。苏联内外交困,到1991年就黯然解体。美国一家独大的世界格局就此形成。全世界都被捆绑在了“美元”的战车之上,捆绑在了美国的国家信用,也就是美国国债之上。 

然而,接下来我们必须进一步追问的是:以国家信用为锚,以信用债的形式发行货币的制度,始于1717年牛顿爵士的建议,并先后催生了大英日不落帝国和美利坚共和国这两个超级大国。以债为锚的货币信用设定,乃是人类社会至今为止,最基础的金融设定。我们今天所有的财富,所有的产业经济,所有的科技文化成果,都建立在这个基础设定之上。然而,这个设定是无限的吗?它可以永恒的持续下去吗?到今时今日,人类跨入2017年,这种以债为锚的设定,已经持续了整整300年,它到达终点了吗?如果这种基础设定轰然崩塌,整个人类社会,将要遭遇什么样的噩梦?

 

【二】 卅年风雨

一般而言,各国央行主要是通过三种形式发行基础货币:第一,向商业银行提供借款,第二,以人民币兑换各经济主体挣回来的外汇,第三,向政府或各国字号单位提供借款。这三种方式发行的基础货币之和,再加上其它一点零零碎碎的资产,就是央行的总资产。从这个意义上来说,央行总资产,与基础货币发行量,是基本等同的。对美国这样的国际货币发行国来说,正如我们在第一章所讲述的,第三种方式是最主要的货币发行方式,比如2011年,美联储29300亿美元的总资产中,持有美国政府各类债券26224亿,占总资产的比值达到89.5%。到2017年7月,美联储总资产45120亿,其中持有美国政府各类债券42423亿,占比94.0%。这其实就是美国以政府债形式发行基础货币,美国政府的信用,就等于美元的信用,两者之间是相互绑定的。

而我大中国这样的国家,则主要是通过前两种方式发行基础货币,第三种方式事实上使用得很少。以2016年为例,我大中国央行总资产343712亿,其中外汇占款(也就是历年兑换外汇而印出来的人民币总额)219425亿,占比63.8%;对商业银行借款84739亿,占比24.7%。两者合计达到了88.5%。至于向中央政府的借款,总额只有15274亿,占央行总资产的比值只有4.4%。我大中国政府事实上无法提供足够的信用,用于货币发行。基于这样的判断,我们来认真的梳理一下,从1986年至今,央行总资产中的外汇占款以及对商业银行债权的数据演变,看看在这三十年里,我大中国在货币发行领域到底经历了什么的惊心动魄的故事。..

1986年,改革开放初期,我大中国的央行总资产3345亿,其中外汇占款38亿,占比仅1.1%;而对商业银行的借款规模高达2682亿,占比高达80.2%。可见,在这个时候,我大中国的印钞方式,主要就是央行向各大商业银行提供借款。

但是,请注意这个但是:我大中国的商业银行与欧美国家不同。我大中国的商业银行基本上都是国有银行,央行向商业银行的借款,基本上都提供给了中农工建交这五大行。事实上,这五大行的信用,都是政府信用、国家信用,也就是说,1986年我大中国央行向商业银行提供的2682亿的名义上的借款背后,是由政府进行最终的信用背书。也就是说,整个1980年代,我大中国都是依靠自己的政府信用在发行货币。按某些经济学家津津乐道的说法,这就是所谓的主权货币,不依赖美元加持就能独立获得信用的货币。然而事实是:这个所谓的主权货币是虚假的,根本经不起任何考验。

1986年美元兑人民币的中国官方汇率是3.45,但是黑市汇率一直都在8到10之间浮动。我大中国政府试图以低廉的官方汇率吸纳外资,自己来占便宜,算盘确实打得很好。但是外国人都不傻,除了一些爱国港资企业,以及少数几家基于政治目的欧美日企业,比如可口可乐和丰田之外,基本上就没有外资企业上这个当,根本就不愿意在中国大规模投资,也不愿意敞开了跟中国做生意。1980年代的改革开放之路,其实走得极为艰难。我大中国要坚持主权货币的道路,守住3.45的汇率,代价就是经济根本发展不起来。在外贸数据上,整个1980年代,有8年都是逆差状态,单1986年的贸易逆差就有120亿美元。这种持续的外贸逆差情况,当然无法守住外汇储备,由爱国港商投资带来的外汇储备很快就见了底。1983年的外汇储备数据为89亿美元,算是80年代的峰值,到1986年已经下降到21亿美元的谷底,1989年也就是勉强恢复到56亿美元。就这么磕磕碰碰的发展到1990年代初,不光是美元有黑市,在价格双轨制之下,全国范围内,几乎所有商品都有黑市, 这已经是经济失控的征象了。人民币信用根本得不到老百姓的信任,官方无法再为任何商品制定价格,老百姓也习惯了不使用官方价格去购买商品。这种局面如果持续下去的话,那真是万劫不复。

想要平抑物价,恢复人民币的购买力,唯一的办法,就是人民币持续的贬值,以吸引外商投资,促进商品出口,增加外汇储备,以美元的信用,来为自身信用已经崩塌的人民币进行加持。指望我大中国政府打着商业银行借款的旗号为货币发行提供终极信用,这已经是不现实的事。在数据上,1990年的官方汇率是3.78,到1993贬到5.76,然而这种贬值幅度跟黑市上的汇率相比依然不够看,到1993年,中国经济终于走到了崩塌边缘,当年度消费物价涨幅高达15%,1994年物价涨幅24%,1995年依然高达17%。经历过这三年物价疯涨的国人至今回忆起这三年来都心有余悸。在这样的生死关头下,再羞答答的试图守住汇率没有任何意义。1994年人民币汇率因此跳贬到了8.62

在这种持续并且剧烈的货币贬值的刺激之下,我大中国终于迎来了真正的大规模的外商投资,外贸终于恢复顺差,外汇储备量开始上升。1990年我大中国实际利用外资额为103亿美元,到97年,利用外资达到90年代的峰值,644亿美元。在外贸收据方面,1990年代只有1年是逆差状态,其它9年都是顺差,1990年的外贸顺差只有87亿美元,到了1998年,顺差规模达到90年代峰值,435亿美元。在外资持续加大流入的背景下,我大中国的外汇储备迅速提升,1990年的外汇储备规模仅111亿美元,到1999年已经上升到1547亿美元,上涨了足足13倍!

汹涌而至的外资拯救了中国经济。1990年外汇占款占央行总资产的比值仅8.2%,到1999年已经上升到了39.8%。而对商业银行借款占央行总资产的比值,则从1990年的70.1%下降到1999年的43.5%。这意味着到90年代末期的时候,人民币信用,已经是由美元和中国的国家信用共同支撑的了,两边基本上平分秋色。 

然而这个时候中国经济遭遇到一次真正的债务危机。在放开人民币汇率,真正打开国门迎进外资,并随之真正扩大外贸规模之后,国人惊讶的发现,原来除了国企生产的傻大黑粗的产品之外,世界上竟然还有那么多精美耐用的商品,于是纷纷弃国货不用。国企长期积累的技术落后效率低下的问题在90年代中后期逐步爆发了出来,并因此丢失了市场。麻烦在于,国企身上统统背负着沉重的银行债务,现在国企的产品卖不出去,现金流纷纷断裂,当然就是还不起债。这算是中国历史上第一次真正的债务危机。中国政府迫于无奈,只能通过央行不停的直接向各国有企业输血,也就是直接凭空印钱。体现在数据上,就是从1998年到2002年,外汇占款占央行总资产的比值在40%左右浮动,而对商业银行的借款,倒是从40%一直下降到了不足20%。如此下降的结果,外汇占款与对商业银行借款合计占比,在2002年竟然跌到了62.8%!这意味着有近4成的钱,乃是央行印出来凭空借给了各国企去吊命。我这里给几个这样性质的央行资产分项数据,首先是“央行对其它金融机构债权”项数据。这笔钱事实上就是央行借给各种信托机构,让它们再拿给国企花的。1999年央行对其它金融机构的债权规模为3833亿,到2002年上升到7240亿。再比如,2002年央行的资产负债表里突然冒出来一个“其它资产”,规模不小,年底的数据为5266亿。这笔钱当然也是拿去给国企救命的。5266+7240=12506,占当年度央行总资产的比值达到24.5%。总而言之,2002年是中国经济在改革开放之后经济最危险的年份,一个不小心,债务链条就彻底崩断了。

所幸天佑中华。2001年底我大中国加入世贸,算是彻底打开国门,并完全放弃了主权货币地位。我们也不再坚持国企的领导地位,除了金融、矿产、通讯和运输领域外,其它竞争性领域的国企基本上都被卖掉了。国企员工统统下岗,让他们去外企和民企寻找生路。甚至我们也不再坚持商业银行必须100%国有的政策,五大行纷纷选择在国外上市,我大中国政府逐步放弃了与商业银行直接捆绑的固有理念。在这种背景下,外资更加汹涌的进入中国,投资到基础制造业领域,中国在新世纪的前十年就成长为真正的世界工厂,生产了全世界超过20%的基础消费品。外资的涌入解救了中国,资金链濒临崩塌的央行获得了庞大的外汇输入,就此变得财大气粗。在数据上,外汇占款占央行总资产的比值迅速提升,到2013年达到峰值的83.3%。而央行对商业银行的借款则迅速下降,2009年下降到谷底的3.1%,2013年也只不过是4.1%而已。至于外汇储备数据,2013年为38213亿美元。这个时候,人民币获得了美元的完全信用加持,牛气冲天,汇率不断升值,到2013年达到6.19。中国经济看起来形势一片大好。这个时候,如果我们再提起90年代初期的通货膨胀和2000年代初期的债务危机,简直没人会相信。

中国人到这个时候,也才过了不到十年的好日子,就把之前遭遇到的磨难忘了个一干二净。全国人民雄心勃勃,要在10年之内实现人民币的国际化,把美元打倒在地再踏上一万只脚。在这个时候,我们完全忘记了,这个国家在经济上所取得的所有成就,都建立在逐步放弃我们的主权货币体系之上,建立在彻底并入美元体系之上,建立在美国的国家信用之上!直接说吧:美元,已经成为人民币的信用根基。一旦整个趋势逆转,中国经济被排挤出美元体系,那么,我们现在的整个货币体系,都将要遭遇直接的冲击。三十年风风雨雨,历尽艰辛,中华民族的苦难岁月,算是熬到头了吗?现在时间到了2013年,在前方等到我们的,到底是什么呢?

 

【三】 极限杠杆

 在讲述2013年后的故事之前,我们先来学习一个简单的概念:货币乘数。各经济主体将外汇兑换为人民币之后,总是会存在商业银行。商业银行本身也能得到央行的借款。这两笔钱,就构成了商业银行的原始存款,也就是基础货币。商业银行会将这些钱拿出去放贷。每10块钱的存款,商业银行会留下至少2块5作为准备金,贷出去7块5毛钱。获得贷款的经营者,事实上又会将这笔贷款存回银行,于是商业银行又拿着这7块5中的5块钱出去放贷。如此反复循环的结果,就是存款规模被放大了。以这个被放大之后的资金总规模,除以央行总资产(即基础货币量),得到的结果,就是货币乘数。

在这里,我们很有必要梳理一下,从1990年代至今,我大中国的货币乘数演变史。..

1990年到2001年,我大中国经历了一次货币乘数逐渐提升的过程,到2001年达到当时的峰值3.72。这个时候我们必须重新回忆起第二章的内容,在当时的中国,发生了第一次债务危机。银行借给国有企业太多的贷款,根本收不回来,债务炸弹接近爆灭。人民币差点就失去信用支撑,掉入万劫不复的深渊。幸亏到了年底我国加入了世贸组织,汹涌而至的外资解救了中国经济,给了濒临崩塌的人民币以信用加持,中国经济开始好转。

2001年之后伴随着经济逐步复苏,我国的货币乘数逐渐下降,到2008年下降到了最低值2.29。这个时刻我大中国其实并没有什么太大的金融负担,日子也好过得很,算是中国经济发展中最黄金的岁月。然而一场席卷全球的金融海啸改变了一切。当时美国的金融机构大肆借钱给穷人买房,甚至连首付的概念都没有,全部购房款都是借的。到2008年的时候,穷人终于普遍还不起钱了,于是债务炸弹爆发,整条借贷链上的金融机构一个接一个的倒闭。美国整个金融系统都在回收资金,以确保生存。美联储推出了大规模的QE计划,也就是大规模印钱,向金融系统补充流动性,但依然不够应付灾难。在这个时刻,我大中国面临着终极拷问:如果美元就此大规模回流怎么办?人民币岂不是就丧失信用支撑了吗?我国对此作出的回答是:自己印。四万亿借款投资计划横空出世,央行开始提高向商业银行借款的规模。体现在数据上,2009年央行向商业银行借款占央行总资产的比值达到最低值3.1%之后,就开始进入上升通道。与此同时,从2009年开始,我国的货币乘数开始重新上升,到2013年上升到3.49,这个数据事实与2001年第一次债务危机时3.72的货币乘数已经算是非常接近了。然而此后我国并没有收敛,货币乘数持续上升,2015年达到4.38,2016年已经达到了4.51。进入2017年之后,货币乘数就进入了纠结状态。3月份微弱上升到4.74,此后开始反复的纠结下行,到8月份又勉强恢复到4.74。

在进一步阐述我国货币乘数演变背后所隐藏的经济规律之前,我先给出一组参考数据。美国2011年的M2为9.6万亿美元,对比其当年度2.93万亿的美联储总资产,货币乘数为3.29。到2017年7月,美国M2总量为13.7万亿美元,对比4.5万亿的美联储总资产,货币乘数3.04。整体而言,伴随着近年来美国进入加息通道,收缩资金,美元开始回流,美国的货币乘数正在缓慢而坚定的下降。美国不再愿意向全世界提供货币信用,这事已经算是板上钉钉,不会再有什么变数。不管怎么样,像美国这样可以向全世界发行纸币,并以其货币信用支撑起全球外贸的国家,货币乘数也不过是长年保持在3左右,而我大中国,自2013年之后,货币乘数就坚定的超过了3,目前在4.6左右浮动。我国这种超高的货币乘数,这种已经达到极限的货币杠杆,就是我们现在面临的一切问题的根源。

现在我们再回头去看2008年之后我大中国央行的资产演变。2009年央行对商业银行的借款占央行总资产的比值下降到3.1%的最低值,此后,伴随着我国开始启动大借款模式,这一比值恢复上升,到2012年上升到5.7%。这个时候我国开始感觉到紧张。央行向商业银行提供了太多的资金,供商业银行借给地方政府,让他们去兴建各种毫无现金回报的基础设施,按照当时普遍的说法,地方债在那一年就超过了20万亿人民币。好吧,关于地方债总额,事实上我国从来都没有真正全面的统计。总之当时这个20万亿地方债的说法一出来,我大中国从上到下开始紧张,开始了对四万亿借债投资计划的全面反思。于是从2013年初开始,我国开始紧缩银根,央行开始减少向商业银行的借款,并通过一系列窗口指导,尝试打压银行的贷款冲动,并多次以行政命令的方式压制地方债务扩张的冲动。到2013年底,央行对商业银行的借款占总资产的比值下降到了4.1%。然而,这一次根本谈不上严厉的金融调整,却引发了非常严重的后果:2013年中,钱荒爆发了。

..

 要知道当时银行主要的借款对象,其实就是政府的各种平台公司,主要的资金去向,都是一些市政道路啊园林广场啊之类的基建工程,根本无法产生现金回报。商业银行要维持现金流,就必须依赖央行不停的借钱输血。现在央行突然停止输血,于是“DUANG”的一声,商业银行的现金流断裂了。银行之间的资金拆借利率在一夜之间暴涨,直奔50%而去,这可是名副其实的高利贷,却依然借不到钱。在当时地方政府搞基建,当然首先是从城商行手里借钱,所以当时城商行的资金情况最为紧张。规模小点的城商行在当时已经沦落到完全还不起拆借资金的地步,只能眼睁睁的违约,恨不得直接变成老赖。到这个时候,我大中国上上下下,才赫然发现,原来我们已经深深的踏入了债务陷阱,根本就跳不出来了。

2013年的整个六月份,中国金融市场一片风声鹤唳,股市暴跌,债市暴跌,所有人都在追问,钱到底到哪里去了?很简单,被各类政府债和国企债借去了,沉淀到了不能创造现金回报的市政工程、基础建设里去了。资金紧张的局面一直持续到6月底,央行终于撑不住了,放弃了紧缩银根的做法,继续向商业银行提供大规模借款,以吊住银行的命。在数据上,2012年底央行对商业银行的借款规模为16701亿人民币,到2013年5月,钱荒发作前夕,下降到11844亿,减少了4857亿,降幅达到29%。这显示了当时央行停止防水和降杠杆的决心。然而到6月底,面对持续了整个一个月的钱荒,央行迫于无奈,终于重新启动杠杆。6月底央行对商业银行的借款规模就恢复到了16182亿。此后央行依然不死心,依然试图关上供钱的水龙头。到12月份的时候,央行又尝试了一把,当月央行对商业银行的借款规模下降到13148亿,结果立竿见影:钱荒第二次发作,资金拆借利率当场暴涨到6月份的水平,全国人民都被这连续两次钱荒吓尿了裤子。央行自此再也不敢尝试紧缩政策,到2014年1月,央行对商业银行借款规模暴增到21281亿,较2013年12月份的借款规模增加了8133亿,增幅高达62%从这一刻开始,中国的商业银行就再也离不开央行的持续放水吊命,就像深度毒瘾患者一样。只要央行放水的速度稍微减缓一点,金融市场立刻就会爆出一堆银行拆借违约案例。这种事一开始还是新闻,连续三年下来,到今时今日,对拆借市场上的违约,所有人都已经习以为常,视之为经济新常态的有机组成部分。

2014年,央行对商业银行借款占央行总资产的比值已经上升到7.4%,到2015年继续上升到8.4%。就商业银行这种一停止供水就会随时暴毙的状态,当然是非常危险的,简直令人无法直视。我大中国当然不会坐以待毙。要把银行从债务陷阱里解脱出来,就必须让企业找到新的融资渠道。传统的银行贷款路径,乃至于债券市场都不是好办法,冷眼看过去,最合适的还是股市。如果把股市给拉起来,一口气让它涨个几千点,以后企业们都能通过股票发行融资,甚至说不定还能靠卖股票还清银行的债务。于是从2014年底开始,一场股市的国家牛市被强行吹了起来。银行不计成本的借钱给券商,让券商拿去借给股民,让他们融资炒股。无数资金跟风而至,拼命的在股市加杠杆。事后我们根本无从统计在这个疯狂的国家牛市过程中,到底吞噬了多少资金。上证指数从2000点开始,每个月能涨个一千点。到了6月12日,上证指数涨到历史最高点5178点的时候,整个国家都已陷入疯狂,根本没人相信短短一个星期之后,股市就会坍塌。到6月18日,噩梦开始,千股跌停盛大开演。从那一天开始,几乎每天都是千股跌停,一直持续到8月底,整整跌足两个半月,上证指数跌到3000点左右,才算是跌到了底。从此之后,上证指数就在3000点附近徘徊,一直到今时今日。在股灾期间,我大中国尝试了无数种救市的手段,根本无济于事。近两万亿的救市资金砸进市场,直接就被汹涌的浪潮席卷而去,连水花都听不到。所谓人定胜天的豪言壮语,在经济规律面前,被证明只不过是一个笑话。

股灾之后,中国整体陷入债务陷阱的现状已经无从掩饰。所谓君子不立危墙之下,我们当然不能指望外资跟我们共患难,于是外资开始撤离,汇率失守。2014年外汇占款27.07万亿就是历史峰值,到2015年底下降到了24.85万亿。这当然是由于外资将手里的人民币兑换为美元,然后汇出中国。我大央行面对股灾时措手无策,现在面前外资撤离,同样毫无办法。2015年,由于外汇占款的减少,我大央行的总资产减少到31.78万亿,相对于2014年的33.82万亿,缩减了6%,这就是一次被动缩表了。通过本文的阅读,大家已经知道了,央行总资产事实上就是基础货币,基础货币竟然缩减了6%,这一定会传导到整个经济领域,让所有人都感觉到资金紧张。好吧,我大中国本来就由于债务陷阱的事,银行资金都被绑定在各种毫无现金回报的政府基建项目上,想要回款不知道要等到哪年哪月,现在雪上加霜,股灾之后,外资撤离令资金紧张的情况加剧,甚至都引发了央行缩表的后果,这种情况如果持续下去,我大中国估计要重回2001年了。这种后果想一想,都令人不寒而栗。

到2015年底,我大中国终于决定,要赌一把国运了。我们终于拿出了大杀器:房地产。原本整个2014年和2015年,伴随着银行资金紧张,停止向房地产市场输血,无论是地产商的开发贷还是客户的按揭贷,想申请下来都不容易,以致中国整个房地产市场陷入了普遍萎缩,政府拿出来一块地,有事没事就陷入流拍的窘迫境地,与2016年之后地王频出的现象,就好像位于不同的次元似得。体现在数据上,2013年全国土地出让金总收入4.13万亿,到2014年下降到4.04万亿,到2015年继续下降到3.25万亿。这算是债务危机的连锁反应,冲击房地产市场的同时,也会造成地方政府收入的锐减,以致于地方政府无法偿还地方债务。这要是继续发作下去,基本上就是恶性循环,我大中国就没有反抗的余地了。于是到2015年底,反正已经无法可想,再拖下去,基本上就一无所有,连赌桌都要被掀翻了。现在趁着赌局还在,干脆把房地产泡沫再吹起来。在泡沫的掩盖之下,所谓的债务陷阱,看起来也会五彩斑斓,就好像根本不存在一样了。

2015年底,央行对商业银行的借款总额2.66万亿。此后,为了让商业银行有足够的资金投入到房地产领域,央行彻底打开了人民币的水龙头。到2016年底,央行对商业银行的借款规模暴涨到8.47万亿,增幅高达318%。面对这种增幅数据,这种豪赌国运的雄心,我直接就被震惊到目瞪口呆,已经无法给出一个形容词了。

获得了充足的资金支持后,商业银行在房地产领域大展拳脚。开发商可以轻易获得极便宜的贷款,覆盖从买地到建楼的全链条资金需求。炒楼客户也可以随意申请到各种美好的金融产品,满足从首付到按揭的全部需要。2016年真是一个美好的年份,短短一年时间,就足以改变国人的信仰,让他们忘记了2014和2015年房地产市场的普遍不景气,让他们忘记了1990年代初期和2000年初期这个国家经历过什么样的艰辛,让他们忘记了这个国家正在面临的债务危机,让他们忘记了近在眼前的钱荒和股灾。他们一边兴奋的叫喊着楼市永远涨,一边拿出终身积蓄,拿出养老金,拿出棺材本,兴奋的冲进了房地产市场。

然而,依靠居民最后的棺材本,真的可以支撑起这个国家的经济吗?真的可以解决这个国家从2013年起就暴露出来的债务危机吗?从2017年开始,这个国家的货币乘数达到4.7之后,就不再上升,这到底意味着什么?外汇占款占我大央行总资产的比值,2015年还有78%,到2016年已经下降到64%,到今年8月份,已经下降到62%。这些数据,对中国经济来说,到底意味着什么?

 

【四】  死亡之债

在上一章里我们已经讲过,商业银行在获得存款(最典型的存款其实就是央行以人民币兑换各经济主体手中的外汇而来的外汇占款),或者直接获得央行的借款之后,它一定会拿出去借贷,并通过反复的借贷行为而推高表面上的货币总量。从这一点上来看,商业银行的借贷行为越频密,货币总量当然就越大,货币乘数当然也就越高。

然而对这一系列的过程而言,问题的关键在于:银行的钱要能借得出去才行,也就是说,银行必须找到适格的借款人。实在是找不到人借钱的时候,所谓的“适格”要求就会降低,甚至被无视。就好像美国引发金融海啸的次贷危机似的,美国当时已经找不到有钱人买房了,于是就把钱借给穷人,让根本就不可能还得起钱的穷人买房,号称“次级贷款”。最后整条借贷链断裂,次贷危机爆发。但是,请注意这个但是,在某些时刻,可能连不适格的借款人都找不到,银行拿着钱,根本就贷不出去,到这种时候,整个金融体系会因此停滞,货币乘数会因此丧失成长性,而整个债务体系,就会因此陷入死亡境地。

..

 在第三章里给出了中国1990年至今的货币乘数数据,大家都已经知道,我国货币乘数的增长,是从2008年开始,自此之后,中国就走上了以债务膨胀推动经济发展的不归路。而在上表里,给出了2007年至今的居民贷款和企业贷款的演化数据。从2008年开始,居民贷款占总贷款的比值就不断上升,从2008年的17.8%,一直上升到今年8月份的31.5%,增加了13.7个百分点;而企业贷款占总贷款的比值则不断下降,从2008年的82.2%一直下降到今年8月份的65.2%,下降了17个百分点。由此可见,08年之后,我大中国最主要的借款人,就是居民!就是我大中国所谓质朴节俭的国民! 

在这里必须解释一下的是,居民贷款和企业贷款的合计占比,从2010年之后就不再是100%了,这是由于央行的信贷收支表里此后出现了一个新的统计项目:境外贷款。这指的是中资企业为了向国外投资,向中资银行申请的贷款,主要是外币贷款。从2010年到2016年,境外贷款的规模一直维持着小幅度增长,占总贷款的比值从1.6%稳步增加到3.8%。2017年之后,伴随着外汇储备的减少,我国开始实施严格的外汇用途管制,限制企业在国外投资行为,因此境外贷款的占比又进入了缓慢下降的通道,到2017年8月下降到3.3%。

好吧,这么一总结的话,08年之后,中国的企业逐渐就丧失了借贷能力,而填补空白的,主要就是居民贷款,其次是对外投资贷款。对外投资这一块这里不去说它,基本上都打了水漂,没有给国内带来任何正面收益。这里着重讲述的是:企业贷款能力下降,以及居民贷款的暴增,这两件事合在一起,对我大中国而言,到底意味着什么。

..

上表给出了中国自2007年至今,规模以上工业企业的资产负债率及利润率演变。从2007年到2011年,负债率就在57-58%之间反复纠结,这显示在此期间,工业企业的借债能力已经达到了极限,已经无从增长了。2011年之后,工业企业的资产负债率开始缓慢而坚定的下降,到2017年7月份已经下降到了55.8%,较2011年峰值期的58.1%下降了2.3个百分点。而企业盈利能力方面,工业企业的资产回报率,从2011年峰值的9.1%一直下降到2016年的谷值6.4%,减少了2.5个百分点。盈利能力持续下降,反过来当然也会压制企业的借债能力。工业,是一切社会财富的源头。工业企业逐步丧失了盈利和借债能力,开始了装逼派经济学家经常说的“修复资产负债表”的过程(我跟你们讲,这种故意把简单的道理用一个装逼的名词来讲的经济学家,全是蠢货,无例外。他们的文章也全是垃圾,无例外),降低资产负债率成为不得不为的选择,那么,全社会的所有企业,当然也会逐渐丧失借债能力

今年以来,由于供给侧改革的影响,原材料价格暴涨,带动了一大批工业链上游的矿产开采及加工企业恢复了利润,所以截至7月份整体的工业企业资产回报率达到了3.9%,如果这种趋势可以维持,简单的计算,全年的工业企业资产回报率能达到7%左右,也算是跟2016年比起来有了一些回升。但是,请注意这个但是,问题的关键在于:到今年下半年之后,原材料价格的暴涨总归会传导到下游企业生产的最终消费品身上,并将由我大中国的全体国民来共同承担消费物价上涨的后果。而就是本文必须正面回答的问题:我大中国国民,从2008年至今,以借债买房的形式撑起了我大中国脆弱的金融体系,已经撑了足足9年半了。到今时今日,我大中国的老百姓,还能不能承受消费物价的剧烈上涨?老百姓的棺材本,还能支撑多久?

下表是我大中国城镇居民自1990年至今的收支结余数据。本文是年度长文,当然要投入更多的精力,将居民的棺材本挖掘得更加精细,所以我不辞辛劳的将数据一直整理到了1990年。对于这个数据里的数据概念我先做个解释:可支配收入是税后净收入,它是抽样调查结果,不仅包括居民的工资收入,也包括财产性收入(比如炒股投资挣到的钱)或者其他偶得收入。当然,有些喜欢抬杠的哥们声称还有一部分地下收入,比如贿款没计算在内。好吧,确实如此,不过有资格享受这种收入的精英,占我大国民的人口比例连千分之一都没有,对本文的计算过程不会造成任何影响,各位屌丝就不要再为老赵家操心了。而居民的消费性支出,指的是居民为了维持生存必须的衣食住行方面的支出,其中的“住”,指的是水电物业费或者房屋租金类的开支,不包含购房按揭类开支,我再强调一次,不包含购房按揭类开支。可支配收入减消费性支出,剩下的结余部分,就是各路高端商家紧盯着的钱。城镇居民可以拿来进行奢侈型消费,用于投资,用于购买保险,以及最重要的,用于购房

..

(说明一下,今年上半年的城镇常住人口数为估算值,按此前的人口增幅,半年增加一千万,不算少了。)

1990年代初期城镇居民收支结余有过一段快速上涨时期,不过阅读过前几章的朋友已经知道了,这只不过是因为当年酷烈的通胀带来的数字上的上涨,并没有什么实际上的意义,到95年之后,收支结余增幅就逐步降低,2000年跌到3.6%。2001年之后中国加入世贸,中国经济高速发展,一直到2013年,居民收支结余增幅始终维持在高位。2013年,我国的债务危机再次爆发,钱荒发作,当年度的居民收支结余增幅跌到了1.1%,几乎丧失了增幅。此后的收支结余增幅就在10%左右挣扎,今年上半年的同比增幅也就是10.7%。

接下来我要给出的计算过程,是城镇居民历年的购房支出。我国大致是从1998年开始逐步放弃此前的福利分房制度,启动商品房改革,步入商品房时代,因此一直到1998年,我大中国国民的收支结余的大部分都可以作为棺材本存起来。98年之后,一切都变了,购房逐渐成为我大中国国民最大的支出项目,没有之一。

..

 上表我设了一个简单的数学模型。当年度的购房首付统一设置为3成,并统一设置为20年的等额还本法;98年至今我国的按揭利率有过很大的起伏,在此统一平滑设置为6%;且当年度的购房款只考虑首付,不考虑当年度的还本付息支出。当然这种算法会造成总支出的低估,不过以20年的周期来计,差别也不大。在进行下一步的数据推演之前,我必须对上表的计算结果进行一次验算:从1998年至今年6月份的商品房总销售额77.39万亿,而居民的本金支出合计35.24万亿,两相抵扣,剩余应偿还的本金为42.15万亿。截至今年6月底银行的居民贷款余额规模为37.16万亿,再加上4.86万亿的全国公积金贷款余额,合计42.02万亿。两者几乎严丝合缝,形成了完整的逻辑闭环。这意味着这种算法完全没有逻辑上的错误,经得起现实检验。

接下来,我会以上表数据为基础,与城镇居民的收支结余数据进行对比,我们重点需要观察的是:购房开支,占居民收支结余之间的比值演变情况。

..

1998年,中国刚刚开始恢复商品房供应的时候,当年度城镇居民收支结余的18.9%被拿去买了房,而计算累计口径的话,从1990年累计存下来的棺材本,只有4.1%拿去买了房。到2008年,居民部门的贷款即将支撑起整个脆弱的金融体系的时候,当年度的购房负担率达到了56.7%,而累计购房负担率达到了45.8%。这意味着城镇居民已经有近一半的棺材本进入了房地产市场。好吧,这个时候也还好,也不算特别惊恐。此后居民的购房水平持续上升,2010年的当年度购房负担水平就达到了80%。高达8成的居民收支结余流入房地产领域,这个时候的房地产业如果称不上支柱性产业,那其他产业简直连站出来说话的资格都没有。地产对居民财富的大幅度吞噬终于引起我大中国政府的重视,此后中国的房地产调控开始常态化,居民的购房负担率进入了起伏波动状态。2013年达到88.7%的高位之后,遭遇中国第二次债务危机引发的钱荒冲击,到2015年算是下降到了84.5%,然而这一年的年底,面对股灾之后的一地鸡毛,我大中国已经无法可想,只能继续依靠居民借债买房来维持经济,于是在国家层面提出了“地产去库存”的口号,所有针对房地产的调控政策都被废弃,整个金融系统的资金大量涌入地产领域,到2016年底,城镇居民的当年度购房负担率剧烈上升到惊人的95.4%,这意味着居民除了维持生存的必须开支之外,几乎全部的剩余资金都拿去买房了。这真是一个非常可怕的数据,简直是让人不寒而栗。与此同时,2016年居民的累计购房负担已经上升到74.5%。毫无疑问,到这个时候,购房开支已经到了居民的极限值,几乎没有上升的余地了。

再来看今年上半年的数据,居民的本年度购房负担率似乎出现了较大幅度的下降,只有83.6%(我为什么要说只有?超过8成事实上已经很恐怖了),然而这其实是由于居民收支数据的季度性差异特征造成的:收入方面,一季度的居民收入由于年终奖的集中发放会带来一波上涨,而居民的重大支出则主要发生在下半年。以2016年为例,全年的收支结余10537元,而上半年的数据为5772元,占全年的比值为55%。今年上半年城镇居民的人均收支结余数据6391元,按55%的比例来推算,则今年全年的收支结余为11620元。接下来,我们假设今年下半年的房地产市场销售规模不再暴增,与上半年保持一致,则全年的商品房销售额118304亿。据此我们可以据此推算出今年的购房负担率数据:

全体城镇居民的购房的合计本金支出60508亿,利息支出27026亿,合计支出87534亿。虽然今年相当多的城市都出现了逆城市化的特征,都在驱离低端产业人口,但我们依然假设城镇居民的总量会持续上升,全年增加2千万城镇常住人口,到达8.13亿,8.13亿人口×11620人均收支结余=94471亿。如此我们可以得出关键的数据:即便是我们在城市化的问题上保持如此乐观的态度,并对下半年的房地产市场销售持相对平淡的态度,则今年的购房负担率依然会达到92.7%(87534/94471),而居民的累计购房负担率,将会在年底达到81.9%。而如果下半年的房地产市场维持从去年至今的暴涨之势,且城市化的速度放缓的话,那么,今年的当年度居民购房负担率,是可以直接破百的。

无论如何,这也已经是极限了。依靠居民借款买房,支撑起整个脆弱的金融体系的路,到今时今日,不管你们怎么不服气,总归已经走到了尽头。但问题到这里并没有结束。我们不要忘记本章重点关注的问题:到今时今日,我大中国的老百姓,还能不能承受消费物价的剧烈上涨?老百姓的棺材本,还能支撑多久?

很遗憾,已经不行了。在被房地产吞噬了超过9成的当年度居民收支结余,超过8成的累计结余之后,我国的老百姓,已经没有任何余力承受高物价的冲击了。一旦原材料价格的暴涨浪潮传导到下游消费品市场,那么,整个国民经济体系将会遭遇无法言喻的酷烈冲击。整个债务链条将会瞬间崩断,这个后果根本无法承受。你们熟悉的这个静谧的世界将会在一夜之间消失;而一个全新的世界,一个你们难以想象的新世界,将会以你们无法抗拒的速度展现在你们面前。

 -R/a2SN 

Posted in 社会生活 | Tagged , , , , | Leave a comment

GWA2-Perl的面向对象方法中数组或哈希列表参数传递问题

最近基于 GWA2-Perl 生造了一个机器学习中的线性回归的轮子,纯手工地模拟了一个预测模型的各个模块和步骤。

GWA2的Perl版本继承和实现了GWA2的设计规范和风格,在充分利用Perl的面向对象设计思想及实现时,有些颇为吊诡的地方,应该引起注意,其中方法的参数传值问题就容易引起误解,我们在此前一篇的Blog中曾经谈到按引用传参和按值传参:

GWA2-Perl Warning: Reference found where even-sized list expected, -R/32SJ 。

 

如下是一个具体使用GWA2的Perl版本进行软件编程时,使用Array 或者 Hash进行传值时的正确写法的实例,供后续编程者参考。

正确的做法示例如下。
(A) ctrl/myctrl.pl:
….
my $obj = mod::MyModule->new();
my @arr = (1..5); # array original
my $i = 2;
my $rtn = $obj->getNumberByIndex(\@arr, $i); # pass by reference
….

(B) mod/MyModule.pm:
….
sub getNumberByIndex {
    my $self = $_[0];
    my @arr = @{$_[1]}; # de reference, restore array
    my $i = $_[2];
    ….

}

另外值得注意的是,按引用传递参数,其本身的设计与OOP思想是不相兼容的,在GWA2架构设计中并未充分考虑到,某一变量经由方法传递参数时,其默认行为是参数为局部变量,是按传值进行,也即,所传入的参数在当前方法体内可能产生变化。此时,如果是当做局部的按值传递的,不会影响到方法体外部,而理论上也不应该影响到方法体外部;然而,如果是按引用传递参数,在方法体内修改了引用所指向的参数,则该参数就会发生变化,如果在方法体外的某处有同时引用行为,则系统就可能出现异常、非预期情况。

这一问题,有望在Perl的后续版本中得到解决。目前,在OOP的架构设计中,如果不按引用进行参数传递,而是按照数值进行传递,如上面的代码修改为如下:

my $rtn = $obj->getNumberByIndex(@arr, $i); # pass by value, ERROR!

则可能导致,在 mod/MyModule.pm 中收到参数是一个将 @arr 的元素和 $i 混装的 list 列表,从而导致无法确切区分出第一个参数是一个 @arr , 而第二个参数是一个 $i . 后续也可能出现异常、非预期的情况。其他对Perl的OOP封装的框架是否很好解决这个问题,有待继续探索。

 

gwa2-logo-201606.v2.png (300×300)

gwa2-roadmap-201611.jpg (1224×703)

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

 

Posted in -GWA2, 编程技术, 计算机技术 | Tagged , , , , , | Leave a comment

[转]一种基于消息摘要的人机验证应用研究

一种基于消息摘要的人机验证应用研究

An approach to captcha based on message digests

刘振兴/ Liu Zhenxing

摘要:自动识别机器或真人的服务(CAPTCHA)被广泛应用在网络空间的很多场景。传统的人机验证机制为系统随机地生成一段消息保存在服务器端,然后发送给用户终端以扭曲的形式展示给用户,以此区分用户终端是来自机器或真人。本文详细分析了常用人机验证机制的优劣,然后提出一种基于消息摘要(单向哈希)的方式进行人机验证。与传统方法相比,不需要额外的存储随机消息,在部署方式和成本方面有更好的表现。[1]

关键词:消息摘要,人机验证,验证码,CAPTHCHA

Abstract: Applications of telling computers and humans apart (CAPTCHA) have been widely-implemented and deployed in several scenarios on cyberspace. Traditional man-machine verification is to generate a random message stored in server-side, and then send a distorted representation of the message to client-side in order to distinguish the client from the machine or human being. This paper explains the widely-used method in great detail and shows some of its merits and demerits. This paper analyzes the merits and demerits of this commonly-used man-machine verification mechanism, and then presents a new approach to man-machine verification based on message digest (one-way hash). Compared with the traditional method, no additional storage of random messages, in terms of deployment and cost, it has a better performance.

Keywords: Message Digest, Man-machine Verification, Verification Code, CAPTCHA

 

  1. 背景及问题
    • 背景

人机验证被广泛应用于各种在线网络服务中,如预防垃圾内容、保护用户注册和登录、保护在线投票、预防词典攻击等各种需要阻止机器自动进行的各种暴力破坏性行为。

人机验证(识别)也即全自动区分计算机和人类的公开图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart,CAPTCHA) [1] [2]。在实际应用中也被通俗地称之为“验证码”,它是一种区分终端用户(客户端)是计算机或人类的公共全自动程序。在CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

一种常用的CAPTCHA测试是让用户输入在一个扭曲变形的图片上所显示的字符,扭曲变形是为了避免被光学字元识别(Optical Character Recognition,OCR)之类的终端机器自动辨识图片上的字符而失效。由于这个测试是由计算机来考人类,而不是标准图灵测试中那样由人类来考计算机,人们有时称CAPTCHA是一种反向“图灵测试”。为了满足无法看到图像的身心障碍者,替代的方式使用语音读出字符,进一步地为了防止终端机器进行语音辨识分析出声音所代表的字符,声音的内容会伴有干扰音以加大机器识别的难度。

人机验证过程涉及到问题生成、传输、呈现和校验。人机验证的安全性在各个实现环节进行深入分析并各有针对性的解决方法,其中多数的攻防思路集中对扭曲展现形式的生成与破解上。实际上,供应链上的每一个环节都值得注意并赋予同等重要性地位。目前对图形图像识别的机器辨识讨论较多,但对人机验证过程及环节较少,本文尝试分析和研究的是后者这一领域的问题。

  • 问题

根据CAPTCHA测试的定义,产生用于验证的图片或其他扭曲展示的算法必须公开,比如常见的随机(或伪随机)生成。这样做是为了证明想破解就需要解决一个不同的人工智能难题,而不是依靠发现原来的算法。即便这种随机过程是伪随机 [3],由于其与终端(客户端)Id不存在任何映射(算法)关系,其被认为是符合CPATCHA定义,要破解这样的验证码的任务就等同于解决类似计算机识图、计算机辨音等人工智能任务。这一应用领域的研究大多集中在如何破解及反破解这一类似人工智能问题上 [4] [5] [6]。

实际应用中,服务器端生成随机码并与客户端Session Id做配对并保持这一状态,多数情况下是在HTTP(S)等无状态的应用协议下实现和维护一种“对话”状态,需要额外的部署一种服务,也即Session会话管理服务。这种服务能够进行完成上述目标——对新终端用户生成Session Id并保持相应的状态信息,如果该终端用户没有通过人机验证,则还需要为用户生成一对问题、答案配对,并维持其与Session Id的对应关系。这需要一种额外的存储开支需求,同时存在应用服务器与Session会话管理服务的通信成本。

另外,这种维护在服务器端的关系对,可能会被截获并重复利用 [7] [8],Session列表可能被Flooding攻击。

针对人机验证在服务器端的部署和应用问题,我们开展了相关研究,通过一系列对比分析和综合实验,我们找到一种基于消息摘要的人机验证新方法。

本文提出一种无需在服务器端维持“对话”状态人机验证服务的实现方法,通过基于消息摘要(单向哈希)的算法来保证其达到通用验证码服务的功能要求。

余下全文分为四章。第二章列举和分析了多数现行人机验证实现的方式方法,第三章提出本文主题,一种基于消息摘要的人机验证应用设计,第四章进行安全性、实用性等分析与讨论,第五章进行简要小结。

  1. 相关研究及应用
    • 人机验证机制

现行的人机验证服务通常由三部分组成:用户终端(客户端)、服务器端(应用服务)和Session服务端(会话服务)。用户终端(客户端)发起人机验证请求;服务器端收到验证请求,进一步联系Session服务器端;Session服务器端根据用户请求生成对应的Session ID、问题Q和答案A,并以队列的形式将Session ID等信息保存在Session服务器端,并将Session ID和问题Q的配对返回给应用服务器端;服务器收到Session ID和问题Q后,进一步地前转返回给用户终端。

用户终端收到Session ID和问题Q后,进行作答,完成作答后客户端将Session ID和答案A’发送给应用服务器端进行检验请求;服务器端收到Session ID和答案A’后,以Session ID向Session服务器端查询对应的问题Q和答案A,在获得答案A后,对比终端用户的答案A’和Session服务器端的答案A。

如果用户答案A’与Session服务器端答案A相一致,则验证通过,成功完成进行下一步;反之,则验证不通过,失败返回重试。

传统的人机验证机制的服务架构如下图(Figure 1)所示。

用户终端   应用服务器端   Session服务器端
         
发起验证请求        
    从Session服务器端获得Session ID、问题Q,

返回给客户端

   
        生成Session ID,问题Q、答案A,以队列形式保存在服务器端
根据问题Q作答

发送答案A’、Session ID进行检验

       
    根据Session ID获取问题Q和答案A,

检验答案A’与答案A

   
   

 

    根据Session ID从保存队列返回问题Q和答案A
收到检验结果

对 或 错

       
         

Figure 1 传统人机验证流程

在一些小微的网络应用或解决方案中个,也有将服务器端和Session服务器端合二为一,集成到一起,但在稍微复杂或者大中型网络应用中,都需要依靠单独的Session服务端来完成人机验证服务。无论是集成到一起还是单独部署,Session服务的功能和角色成为必选项。

  • 复合图形图像验证码

在前述人机验证的机制下,网络上出现各种各样的具体实现和应用部署方式,其中影响较为广泛的应用有Google reCAPTCHA [3]和中国铁路总公司12306网站人机验证服务的验证码 [10] [11]。

reCAPTCHA借助于人类对计算机难以识别的字符的辨别能力,进行对古旧书籍中难以被OCR识别的字符进行辨别的技术。也就是说,reCAPTCHA不仅可以反垃圾邮件、预防机器人注册登录等,而且同时还可以帮助进行书籍的数字化工作。

每次reCAPTCHA会显示两个单词让人来识别,其中一个是需要用户识别的难认词,另外一个是答案已知的真正的CAPTCHA 词。软件将能够正确识别CAPTCHA词的用户看作是人类,当CAPTCHA 词被正确识别出来后,程序会纪录用户对无法阅读的词的回答并将其添加到它的数据库中。这样就完成了一次人工的光学字符识别(OCR)过程。这一过程的核心人类对图形图像的识别,其部署方式仍需要独立的第三方的Session会话管理。由于人工智能领域的进步,计算机识图能力大幅提升,其改进版的“No CAPTCHA reCAPTCHA”已经推出。

也是基于计算机识图能力的提升,改进的中国铁路总公司将问题也进行了图示化,同时加大了对识图能力和逻辑推理能力的考察。这些是在对人工智能的深层次的验证,其背后的服务器端的部署,仍沿用较传统的应用服务器和Session服务器配合使用的方式。只不过验证从考察识别字符到识别图像并能够“理解”图像再进行作答。

  1. 一种基于消息摘要的人机验证
    • 消息摘要、单向哈希

消息摘要是一段消息的“指纹”,通常使用单向哈希函数完成一种固定的映射y=f(x) [6] [7],其主要特征是根据摘要信息不可逆推出消息原文。这些单向哈希函数方法MD(Message Digest),可能是MD5,MD6,SHA1,SHA128等其中的一个,设若m为消息原文,d为消息摘要,对于任意给定消息m,有且只有唯一对应的d生成;对于任意给定的d无法逆向还原消息原文m,也即,

d = MD(m),

可以根据m生成对应的消息摘要d,而不能根据d反向推导出消息原文m来。消息摘要的另外一个特征是,任意发生在原文m中的改动必将引起在消息摘要d上的变化。因此也被广泛应用在安全领域,做私密性、完整性和鉴权(CIA)的多种实现技术手段之一。

下图(Figure 2)展示一种消息摘要在安全通信中的应用情况 [14]。在左侧消息发送方(Originator)在消息原文使用私钥加密后,再使用消息摘要方式对加密后的消息生成相应的“摘要”。摘要信息连同密文一起发送给右侧接收方(Recipient),接收方使用发送方的公钥对消息进行解密,揭秘后的原文只能说明是来自于发送方的私钥加密后的内容(私密性),而不能保证在这一过程中没有被改动。满足这一“一致性”需求的实现方式是附带在密文后面的“摘要”,在成功解密原文后,按约定的单向哈希函数生成新的消息摘要,如果新生成的消息摘要也与所附摘要相一致,则说明原文在传输过程中没有被修改。

message.digest.201708
Figure 2 消息摘要在安全通信中的应用 [7]

根据其这一特征,我们可以将这种一致性保证应用在我们所设计的一种新的人机验证方法中。

  • 一种人机验证的新方法

在应用服务器端常量K作为预设私有密钥保存在服务器端,变量U为终端用户动态信息,如IP地址、浏览器(User-Agent)名称和访问时间等信息,也即,

U ≈ (IP, User-Agent, Time) ,

变量R为伪随机函数RD所生成的伪随机字符串,也即,

R = RD () ,

问题Q通过消息摘要方式使用上述内容生成,也即,

Q = MD(R, U|K) ,

在终端用户发起验证的请求中,服务器端将问题Q扭曲、封装为图形图像验证码或图像推理题等展现形式返回给终端用户,同时附带返回随机消息R给客户端。

终端用户根据问题Q完成作答,将答案A连同随机消息R一同发回至服务器端,服务器根据终端用户进行检验的请求,做如下判断:

获取用户动态信息,使用与上述相同的算法,也即,

U’ ≈ (IP, User-Agent, Time) ,

根据已生成的U’、检验请求中附带的随机消息R和服务器端私有常量K,使用与发起验证请求处理过程中相同的算法生成新的问题Q’,也即,

Q’ = MD(R, U’|K) ,

由于终端用户在发起验证和进行验证中是同一个客观对象,U’应完全等同于U,根据上述公式分析可知,新问题Q’ 应该完全等同于原问题Q,此时对比答案A与问题Q’,如果答案A与问题Q’相一致,答案正确,人机验证成功完成;如果答案A与问题Q’不相一致,答案不正确,人机验证失败,非真人或者真人答错情况。

上述基于消息摘要的人机验证的机制描述如下图(Figure 3)所示。

用户终端   应用服务器端
     
发起验证请求    
    根据K、U生成R、Q,

返回给终端用户

根据问题Q作答

发送答案A、R进行检验

   
    根据K、U’、R生成Q’,

检验答案A与问题Q’

收到检验结果

对 或 错

   
     

Figure 3 基于消息摘要的人机验证流程

新式的这种人机验证方式中,对话和通信发生在用户终端和应用服务器之间,与此前方案相比,减少了与Session会话管理服务的角色。在这样的人机验证过程中,不需要Session会话管理服务的介入。

应用服务器在这一过程中承担获取用户动态信息,构建人机验证问题,校验用户答案等任务,当通过人机验证后的请求再进一步继续后面的服务流程。

这一过程中,应用服务器的私钥保密,生成问题的算法可以公开,符合前述CAPTCHA测试不依赖算法的要求。将求解问题答案的过程等价于根据消息摘要逆推导消息原文的过程。

  • 人机验证实验

在通用管理信息系统应用软件(-gMIS, -吉密斯) [15]中,我们进行了一项基于消息摘要的人机验证服务的实验。gMIS的用户登录模块行使在用户进行身份验证之前,此时我们并不知道终端用户是否是合法、被授权的用户,因此需要进行基于账号的登录验证。

在进行登录验证之前,为预防机器人登录或者暴力攻击账号等行为,我们首先需要知道终端用户是真人而非机器人。自然这里要用上CAPTCHA测试,以探明终端用户首先是人类,然后再进行账号校验。

在设计中,我们在服务器端预设了密钥常量K,并在登录界面使用隐式HTML表单字段的形式,将问题的“消息摘要”以明文的方式列在登录表单项中。

在生成的伪随机数R时,我们使用了如下含有65个字符的字符集

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz._,

所生成的伪随机字符串长度为100字节,则其探测和计算空间为

S = 65100 = 1.9558505399828548460859657546779e+181

也即,1后面181个零这么一个天文数字。

基于这一随机消息R,我们通过一定的算法使用其中一部分,以图形验证码的方式将问题Q发给终端用户。

在终端用户填写用户名、用户密码信息后,对所展示的人机验证问题进行作答;完成作答后,用户点击“递交”,此时HTML登录表达将用户信息(用户名、密码)、问题信息(答案和问题摘要)一并递交给应用服务器端。

应用服务器端接收到登录请求后,按前述方法进行人机验证。显而易见,随机数R所使用部分越长,也即验证码越长,暴力攻击的可能性就越小。

这一实现的源代码公布在源码托管网站GitHub上(-R/12SP)。

  1. 分析与讨论
    • 安全性分析

对比传统人机验证流程(Figure 1)与新式基于消息摘要的人机验证流程(Figure 3),其中一个主要变化是Session服务器端不再参与验证流程。在传统方式下,需要Session服务器端生成用户Session ID,问题Q、答案A并将这些数据以列表的形式存储在Session服务器端。新式人机验证的流程中,通过预设常量K、随机数R动态生成的问题Q可以通过用户验证请求中的随机数R进行重现,从而节省了在Session服务器端保存列表数据的步骤,这是新式人机验证主要特征之一。

单向不可逆的哈希函数为这一流程提供了安全保证。客户端无法根据已经曝露的公开消息摘要逆变还原出消息原文,从而也无法获得用于人机验证的验证码。只有具备较高识图、读题能力的“人类”依靠真人的能力对验证码、验证问题进行识别,人机验证功能得以实现。消息摘要无法逆向的前提是搜索空间巨大,无法在现有计算能力的基础上在可接受时间范围内实现逆向搜索,进而无法根据消息摘要d找到消息原文m。

这种验证方式的主要应用思想是基于明文连接实现安全通信,相应地做法已经得到证明 [8]。其理论依据是消息摘要的不可逆性,而不是私有的替换、交换或置换、加长或截断等变通技巧,也不是加上时间因子、随机数因子等,尽管这些技巧也能够起到增大了破解、逆向难度的作用。

随着计算能力的提升尽管偶尔有针对哈希碰撞的安全性突破,多数是以海量计算条件为前提条件。 [16]叙述了针对MD5的碰撞, [17]报告了第一例成功的针对SHA1的碰撞攻击。

当求解较大数配对所耗费资源较大(较长时间或(与)较宽广的计算空间),就可能将之视同于求解一个人工智能任务,从而在应用层面满足CAPTCHA的规范性要求,也即,无法找到从问题到答案的映射函数y=f(x)。解决这个问题Q,寻求映射函数算法的计算空间近视于解决一个人工只能问题的计算空间,则CAPTCHA约束继续成立。

此外值得注意的是短时间内的二次应用的防范。一次成功的人机验证之后,客户端以“人类”的能力获得公开消息摘要和验证码的配对,可能将这一成功配对进行二次应用。一个可能的场景是,人类识别出某个伪随机数R与某个验证码相匹配成功时,可以做二次应用,针对这样的情况,可以在时间、空间等维度进行做限定,比如给每个R赋予一个有效期,然后维护一个有效R的“池”,以使得每个R与验证码的成功配对能用且只用一次。

  • 部署便捷性与成本

人机验证过程中无需Session会话服务的接入,可以在一定成都上预防基于Session的拦截攻击 [12],同时,也避免Session服务的单点故障,任一应用服务器可以独立地进行人机验证的部署,在终端用户被验证之前,无需联系Session进行ID及问题和答案的生成。

这种应用服务器单独承担人机验证功能的部署适合在多点负载均衡系统中应用,每个负载均衡的前端节点可以依靠自有的资源完成人机验证全过程。

另外,新式人机验证服务还能够节省Session服务,在终端用户未被识别为人类之前,不占用Session服务资源,无需在服务器端维护终端用户Id与问题对应列表。从而避开了基于应用层的Session Flooding攻击 [18]。

然而,计算机识图能力(或其他“智力”)的提升将加剧人机验证矛盾升级。目前的人机验证,基于人类识图能力这一基本特征展开,随着人工智能的发展机器识图能力逐年提升,在可见的未来,机器可能具备和人类一样的识图能力,甚至在某些专门领域机器的识图能力将超过人类的水平。届时,单纯基于识图能力的人机验证将面临新的挑战,这是本文所讨论议题的延续,人机验证必将基于另外一些人类所特有的特征开展新的人机验证的方式方法,而其中的实现原理是不变的,随机生成一条消息,以一种扭曲、不易或不被机器识别的形式展现给客户端,从而实现人机验证。当其理论所依据的“图灵测试”被机器所攻破时,人类还会继续寻找其他可行的人机识别的新思路。

  1. 小结

本文先后梳理和回顾了图灵测试、人机验证相关历史背景及其应用发展问题,分析了现存人机验证在服务器端请求处理方面的优劣。我们发现多数人机验证领域研究集中在对问题编排和破解,研究重点越来越多涉及到人工智能领域。然而在人机验证应用的部署和使用上,大多数依赖Session会话管理服务这一必需的角色,循此我们对人机验证的服务器部署及使用流程进行深入分析。

在此基础上提出了一种基于消息摘要的人机验证新设计,并对该机制安全性、实用性等方面进行了充分讨论。相比较此前传统人机验证设计,新的基于消息摘要的人机验证方法不需要额外的消息对存储,无需Session会话管理服务器端维护“对话”信息,与HTTP无状态匹配较好,在部署成本、易用性和便捷性方面有一定的优势。

 

References

[1] A. e. a. Turing, “Can automatic calculating machines be said to think?(1952),” B. Jack Copeland, 2004, p. 487.
[2] M. B. N. H. L. Luis von Ahn, “The Offical CAPTCHA,” Carnegie Mellon University, 2000. [联机]. Available: http://www.captcha.net/. [访问日期: 03 2017].
[3] P. C. v. O. S. A. V. Alfred J. Menezes, “Pseudorandom Bits and Sequences,” 出处 Handbook of Applied Cryptography, CRC Press, 1996, p. 173.
[4] M. M. J. M. Elie Bursztein, “Text-based CAPTCHA strengths and weaknesses,” 出处 CCS ’11 Proceedings of the 18th ACM conference on Computer and communications security, Illinois, 2011.
[5] L. v. A. B. J. H. Langford, “CAPTCHA: Using Hard AI Problems for Security,” 出处 Advances in Cryptology — EUROCRYPT 2003, Berlin, 2003.
[6] P. Golle, “Machine learning attacks against the Asirra CAPTCHA,” 出处 CCS ’08 Proceedings of the 15th ACM conference on Computer and communications security, Virginia, 2008.
[7] 李爽, “Session安全性研究及应用,” 电子世界, 卷 2013, 编号 23, 2013.
[8] M. W. Y. Y. J. M. J. W. Nikiforakis N., “SessionShield: Lightweight Protection against Session Hijacking,” 出处 Engineering Secure Software and Systems, Berlin, 2011.
[9] G. Developers, “What is reCAPTCHA?,” Google, [联机]. Available: https://developers.google.com/recaptcha/. [访问日期: 03 2017].
[10] 中国铁路客服服务中心, “12306登录,” 中国铁路客服服务中心, [联机]. Available: https://kyfw.12306.cn/otn/login/init. [访问日期: 03 2017].
[11] J. L. a. J. Z. W. Ritendra Datta, “IMAGINATION: A Robust Image-based CAPTCHA Generation System,” 出处 Proceedings of the ACM Multimedia Conference, Singapore, 2005.
[12] H. S. L. L. L. Y. Z. K. W. Zhenxing Liu, “A hash-based secure interface on plain connection,” 出处 Communications and Networking in China (CHINACOM), 2011 6th International ICST Conference on, Shanghai, 2011.
[13] A. Kahate, “Digital Signatures,” 出处 Cryptography and Network Security, New Delhi, Tata McGraw-Hill Education, 2013, p. 165.
[14] TechNet, “Message Digest Functions,” Microsoft, [联机]. Available: https://technet.microsoft.com/en-us/library/cc962033.aspx. [访问日期: 03 2017].
[15] Z. Liu, “gMIS, general Management Information System,” 10 2011. [联机]. Available: https://ufqi.com/dev/gmis/. [访问日期: 03 2017].
[16] X. W. a. D. F. a. X. L. a. H. Yu, “Collisions for Hash Functions MD4, MD5, HAVAL-128 and RIPEMD,” Cryptology ePrint Archive, p. 199, 2004.
[17] E. B. P. K. A. A. Y. M. Marc Stevens, “The first collision for full SHA-1,” 02 2017. [联机]. Available: https://shattered.it/static/shattered.pdf. [访问日期: 03 2017].
[18] Z. L. H. C. X. C. Jie Yu, “A Detection and Offense Mechanism to Defend Against Application Layer DDoS Attacks,” 出处 Networking and Services, 2007. ICNS. Third International Conference, Athens, Greece, 2007.

 

[1] 作者简介:刘振兴,原人民网研究院网络技术研究员,主要研究领域包括计算机网络通信协议、互联网后台支撑技术和网络架构与安全等,先后在Journal of Cloud Computing、IEEE Conferences、《计算机应用与软件》、《中国计算机学会通讯》、《互联网天地》等刊物发表多篇中英文论文,是Base62x、NatureDNS、GWA2、gMIS和GTAjax的主要创建者。


原文刊登于<<网络安全技术与应用>>, 2017年7月号.

Posted in -gMIS, 编程技术, 计算机技术 | Tagged , , , , | Leave a comment

gMIS吉密斯更新:Pivot透视+图示,List+观察模式

gMIS 吉密斯 持续更新升级,本次更新主要如下數據透視增加圖示\List視圖增加觀察模式等几点,备忘如下。

  1. Pivot透视增加图示,直方图,统计数据
    按 “-gMIS更新:数据透视和hasId等” 的描述,本次继续完善,增加针对透视数据的图示化显示,默认的图示为横向的直方图。
    功能入口, 在List視圖下, 點擊”透視”.

    然後進入下面的操控頁面:

    (gMIS 數據透視圖1)

    數據分析依然是先檢索數據結果集然後對結果集進行數據分析透視.
    如上圖所示,(1)在分組項列,選擇 國家”, 在求值相列選擇對收入進行求和”, 在排序項中種選擇按收入降序排列
    點擊遞交之後,生成下面的橫向的直方圖(3), 其中,
    (2)処對應的是分組列項;
    (4)処對應的是求值列項;
    (5)処對應的是該行數值在整體數據中的占比, 12.6% 表示 ID的收入, 在該月份佔全部收入的比例其中紅色字體表示第一名灰色表示最後一名;
    整體上, 條形圖表示相應的比值其中最大的比值將沾滿窗口其餘的依比例遞減.

    這一圖示化數據功能將更加直觀和生動的展示數據變化趨勢, 鮮明地呈現數據對比效果, 為決策支持提供多一種感官體驗.
    此外, 這一功能是普適性的, 將同時在所有被 -gMIS 管理的模塊中適用. 因此其可以為所有數據提供與 Microsoft Office Excel 的透視相同的功能, 甚至比 Microsoft Excel 更强大, 能夠處理更大的數據集\更加複雜的數據檢索等.
    如下是針對多個統計維度同時生成可視化圖形進行對比的運行效果圖.

    (gMIS 數據透視圖2)

    此外2, 普通意义上的统计数据,此前已经有了总计(合计, 並針對不同數值類型提供了計數和求和),这次增加了
    +平均值
    +最大值
    +最小值

    (gMIS 數據匯總統計)
    在技術實現上, gMIS 的透視圖使用JavaScript方式, 依據已經從服務器端獲取到的Table Grid數據, 在客戶端進行圖示化操作. 也即, 此功能的增加並沒有相應地增加服務器端的計算, 而是依靠客戶端瀏覽器運行的JavaScript來完成相應直方圖的繪製.

  2. List视图增加观察模式
    在默认的List模式下已经提供了 “刷新” 和 “初始页” 等功能,有时候会面临某种监视的需求,也即对一些需要实时更新的数据,如果每次都通过点击刷新等页面来实现,就显得繁琐,将这种手工刷新变为自动刷新就是这次增加的 “观察模式”.
    使用者打开某个页面数据List视图,点击 “观察” 之后,

    (gMIS 觀察模式)
    頁面刷新, 按鈕隨之變化為”觀察中…“, 頁面在重新生成后, 使用JavaScript通過registerAct方式, 在客戶端生成下次自動刷新的時間, 從而實現數據自動更新的功能. 其時間間隔靠 inc/config中的 “watch_interval” 配置項來控制.
    相應地, 為滿足這一需求, 我們在配置文件inc/config中增加如下設置項 watch_interval, 其默認值為 5 分鐘.
    inc/config.class 中, 增加配置項:
    $conf[‘watch_interval’] = 5 * 60; # seconds
    目前至少有兩處自動更新依靠此配置項, 其分別是, 登錄后的默認首頁 和 List 視圖下的觀察模式.
    同樣地, 這一觀察模式具有普適性, 可以應用于所有被 -gMIS 管理的數據表.

    (gMIS 觀察模式–觀察中)
    儅使用者擬結束觀察模式時, 可以通過點擊 “觀察中...” 按鈕來終止後續的自動更新任務.
  3. 其他Bugfix和Improvements
    在使用檢索功能的“并搜”、 “或搜” 时,修正了前置搜索条件无法被搜索条件重置都问题;
    修正了Wht::getIp中局域网识别逻辑, 增加了對 10.0.0.0 IP段的内網識別;
    修正了Firefox下getElementByEvent兼容性问题, 在Firefox下調用時, 帶入被調用對象作爲參數;

    gmis-logo-201606

    -gMIS 是一种基于 -GWA2 的通用管理信息系统软件,具有可配置的输入和输出接口。
    可以在其上构建各种管理应用软件系统,如
    内容管理系统(CMS),客户资源管理(CRM), 企业资源计划管理(ERP),
    办公自动化系统(OA)等, 以及各种行业应用管理系统软件,如
    人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
    商品管理及业务运营支撑系统等等。
    实现零代码开发、搭建各种管理信息系统(MIS).

    Lower Costs, Better Productivity.
    降低成本, 提高效率.

Posted in -gMIS, 服务器运维, 编程技术, 计算机技术 | Tagged , , , | Leave a comment

驾电动汽车行北戴河


2017年8月初带上家人第一次开北汽EU260电动汽车走高速出远门旅行,期间经历一些,记如下。

1. 充电

相比燃油汽车,电动汽车最大的问题是续航,北京距离北戴河大约300km,中间需要充电,抵达后还要充电。出发前做功课,国家电网的“e充电”网点已覆盖全程。

去程满电北京出发,走京哈高速天津宝坻新安服务区充电,抵达后北戴河国林宾馆充电,返程走沿海高速秦滨高速唐山唐海服务区充电。

其中新安服务区充电需要排队等;唐海服务区走到就充很顺利。

最困难的是北戴河国林宾馆充电,遇到油车占位问题。起初打充电公司电话请求协助挪车腾位,接电话的忙了半天未果。有困难找警察,拨打122,请求帮助,后接转到当地的另外一个电话,报违章停车车号后,不一会来人挪出一个车位供充电用,为北戴河交警点赞!

呼吁所有好司机不要占用充电桩,那真是电车的命根子!

2. 电动汽车

这台北汽Eu260是第一次上高速走远程,能撒丫子跑起来。在d档油门踩到底,车速在90-100km,没法超车,也没法走快车道。

切换到s档以后,它有点脱缰野马一般,車身變輕盈, 一瞬間速度可以提升到 120KM 左右, 這個速度已經開始觸發超速警告, 對於超車的任務也變得很容易.

全程開空調, 聼音樂, 電車的里程表的增速等同于導航軟件的降速, 也即里程表裏增加1KM, 導航軟件裏距離目的地減少1KM, 很準確, 由此可以推斷, 如果有良好的駕駛習慣, 關閉空調和音樂, 或者降低負載, 續航里程應該會超過 260KM, 接近 300KM.

來往之間, 車上都是滿載滿員, 還拉了一些行李. 整體感覺里程標稱準確, D檔行車不用擔心超速问题, 也別想超車, S檔上, 動力充沛, 一不小心就超速了.

由于Eu260带了刹车能量回收功能,基本上我不喜欢总踩刹车,所以会与前车保持一个较大的距离,这样前车刹车时,我放开油门(备着刹车),触发能量回收(减速)功能,这个挺贴心的。

3. 高速路

不得不說, 由於車多, 京哈高速等很好的高速路開成了一般城市道路的感觉, 主要是由於輕微交通事故\一般剮蹭所引起的交通拥堵. 与城市区的交通拥堵一样,如果只是车多,只是走得慢,但并不会堵,而一旦发生交通事故,轻则堵上一个车道、二 个车道甚至是全部堵死,情况非常严重。

开车以来,所见堵各种情况,基本都是交通规则遵守的不够好,或者交通不文明,所有的参与者都不喜欢加塞儿的对方,而所有的加塞人都不喜欢对方不让加塞儿。一个简单的排队引起都是几十人几百人上千人都长达几十分钟、几个小时都拥堵,其社会成本是巨大的。

去程的京哈高速大约有4-5起交通事故,一路上走走停停;回程时根据表弟的建议,绕远走沿海高速、京津高速回京,一路上顺畅上顺畅了一些,只是沿海高速两车道,路上全是大货车,期间的一段拥堵,也是由于交通事故所致。

相比之下,京津高速走起来还不错,除了进入北京的安检之外,一路几乎没有停顿。此次拉高速,也就是在这里才全速前进,一马平川。

关于加塞儿与被加塞儿,这个问题估计将来应该能解决,随着物联网的普及,v2v的通讯称为标配之后,一辆车半道插入某个队列后,就被记为违规。每个加塞儿扣1分,罚100元,估计能减少一些总是耍横秀车技的,同时减少交通事故,降低社会交通成本。

4. 北戴河

一路欢欣,一直happy,看着那么多人喜欢大海,中国那么长的海岸线,为何不多开发一些海滩?即便是北戴河中海滩(金台度假酒店附近),为何就对公众开发一小段,两边大片的海滩圈起来封闭?

Posted in 社会生活 | Tagged , , , , | Leave a comment

-gMIS扩展功能模块开发参考/ext modules

-gMIS 主要面向数据表的管理与操作,提供一种数据表即管理信息系统的便捷路径。

随着应用场景的增多和所承担功能的丰富,在信息信息系统中增加一些特有的功能成为必需,在 -gMIS 中通过扩展模块功能来开发实现。

在 -gMIS 的建构中, extra 子目录用来存储一些特殊功能 的实现,如下以一个名为 helloworld的扩增模块功能来描述 -gMIS 扩展开发的过程。此前 -gMIS 内建的extra包括 可视化编辑器(集成 -baidu-editor),树形目录Xdirectory ,邮件发送sendMail,关联表挂接linkTbl等扩展功能。

由于 gMIS 是通过 -GWA2 来进行开发的,所以 gMIS 的扩展控件开发仍然沿用 -GWA2 中常见的 MVC 的设计思路。

0. 设置入口
在 系统管理 — 菜单管理 中设置扩增功能模块的访问入口。
其中模块名称字段留白,在动态参数中从 ext/子目录开始写起,如,
extra/helloworld.php

1. 程序结构
入口程序放入项目子目录 ext/ 下,为 extra/helloworld.php
视图程序放入项目子目录 view/ 下, 为 view/helloworld.html
由于 -gMIS 是基于 -GWA2 进行开发,所以在控制器 ext/helloworld.php 中,可以引入运行时全局变量,共享基础设施,其中 $gtbl 为GTbl.class 的实例化.

extra/helloword.php  的大致结构如下:

require(“../comm/header.inc.php”);
include_once($appdir.”/comm/tblconf.php”);
# Objects
include($appdir.”/class/class.helloworld.php”);
# Variables
$helloObj = new HelloWorld();
$act = Wht::get($_REQUEST, “act”);
# Actions
if($act == “step1”){
    # somthing to do
}
else if($act == “step2”){
    # something to do
}
# Outputs
$smttpl = “helloworld.html”;
$smt->assign(“output”, $out);
$smt->assign(“sid”, $sid);
$smt->assign(“rtvdir”, $rtvdir);
require(“../comm/footer.inc.php”);

在 extra子目录下默认给了一个 extra_example.php 的示例程序。

视图文件是基于 -Smarty 模板系统实现,模板环境变量由 $smt 对象提供,其中 $smttpl 为指定要呈现的视图文件,这些在 -GWA2 的开发文档中有相应的说明。

view/helloworld.html 的大致结构如下:

{include file=”header.html”}
<!– main content bgn –>
{$output}
<!– main content end –>
{include file=”footer.html”}

-Smarty 相关的语法标识,可以参考 -GWA2 开发文档或者 -Smarty 开发手册.

3. 程序间的耦合
当 comm/navimenu 模块通过 系统设置 — 菜单调整 读取到 modulename 为空而动态参数不为空的设置项时,按约定生成指向动态参数的目标地址,同时向该地址附带用于用户身份鉴权的全局 $sid 参数。

依靠 $sid 参数的透传,运行时环境变量可以由数据表管理空间共享给扩展模块,同样可以通过扩展模块读写数据表空间数据,以此程序间的耦合实现对功能的集成。

为实现对访问路径的统一化视图,modulepath 生成模块单独进行封装,新增 comm/modulepath.inc.php, 默认在 ido.php 中进行调用,在其他 extra模块中,也可以引用该功能,快捷生成模块的访问路径。

4. 其他更新
这期间,还对 gMIS 的首页进行了优化,增加显示了当前一段时间内登录活跃用户情况;
修正Memcached缓存bug;
优化显示了相关模块的功能,默认显示当前页面同级别的功能列表。

gMIS 源代码同时托管在 -OSChina 上,并获得“推荐 -gMIS”。

-gMIS 是一种基于 -GWA2 的通用管理信息系统软件,具有可配置的输入和输出接口。
可以在其上构建各种管理应用软件系统,如
内容管理系统(CMS),客户资源管理(CRM),  企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,如
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统等等。
实现零代码开发、搭建各种管理信息系统(MIS).

Lower Costs, 较低成本; Better Productivity, 较高效率.

Posted in -gMIS, -GWA2, 编程技术, 计算机技术 | Tagged , , , | Leave a comment

自由是一种责任

本文为7月1日上午,张维迎教授在2017年北京大学国家发展研究院毕业典礼上的演讲。

同学们好!首先祝贺大家毕业!

“北大人”是一种光环,也是意味着责任,特别是对我们这个苦难深重、饱受蹂躏的民族的责任。

中华文明是世界最古老的文明之一,并且是唯一延续至今的古老文明。古代中国有过辉煌的发明创造,为人类进步做出了重要贡献。但在过去500年,中国在发明创造方面乏善可陈。让我用数字说明这一点。

根据英国科学博物馆的学者Jack Challoner的统计,从旧石器时代(250万年前)到公元2008年之间产生了1001项改变世界的重大发明,其中中国有30项,占3%。这30项全部出现在1500年之前,占1500年前全球163项重大发明的18.4%,其中最后一项是1498年发明的牙刷,这也是明代唯一的一项重大发明。在1500年之后500多年全世界838项重大发明中,没有一项来自中国。

经济增长源自新产品、新技术、新产业的不断出现。传统的社会只有农业、冶金、陶瓷、手工艺等几个行业,其中农业占据绝对主导地位。现在我们有多少个行业?按照国际多层分类标准,仅出口产品,两位数编码的行业有97个,4位数编码的行业有1222个,6位数编码的行业有5053个,而且还在不断增加。这些新的行业全是过去300年里创造的,每一件新产品都可以追溯到它的起源。在这些众多的新产业和新产品中,没有一个新行业或重要产品是中国人发明的!

以汽车产业为例。汽车产业是1880年代中期由德国人卡尔·本茨、戴姆勒和迈巴赫等人创造的,之后经历一系列的技术进步,仅从1900到1981年间,就有600多项重要创新(Albernathy, Clark and kantrow (1984))。中国现在是第一汽车生产大国,但如果你写一部汽车产业的技术进步史,榜上有名有姓的发明家数以千计,里边有德国人、法国人、英国人、意大利人、美国人、比利时人,瑞典人、瑞士人、日本人,但不会有中国人!

即使像冶金、陶瓷、纺织等这些在17世纪之前中国曾经领先的传统行业,过去三百年里的重大发明创造,没有一项是我们中国人做出的。

我要特别强调一下公元1500年之前和1500年之后的不同。1500年之前,全球分割成不同的区域,各区域之间基本处于封闭状态,一项新技术在一个地方出现,对其他地方的影响微乎其微,对人类整体的贡献非常有限。比如说,东汉的蔡伦于公元105年发明了造纸,但中国的造纸技术到公元751年后才传到伊斯兰世界,又过了三四百年才传到西欧。我上小学的时候,练字还得用“土盘”,用不起纸。

但1500年之后,全球开始一体化,不仅技术发明的速度加快,技术扩散的速度变得更快,一项新技术一旦在一个地方出现,很快就会被其他地方引进,对人类整体的进步发生重大影响。比如,德国人于1886年发明了汽车,15年之后,法国成为世界第一汽车生产国,又过了15年,美国取代法国成为第一汽车生产大国,到1930年,美国汽车普及率已达到60%。

因此,1500年之后,创新才真正有了国家间的可比性,谁优谁劣一目了然!中国在过去500年没有做出一项可以载入史册的发明创造,意味着我们对人类进步的贡献几乎为零!比我们的祖先差远了!

我还要强调一下人口规模问题,国家规模有大有小,国家之间简单比较谁的发明创造多,容易产生误导。

理论上讲,给定其他条件,一个国家的人口规模越大,创新越多,技术进步越快。并且,创新之比与人口之比是指数关系,不是简单的等比例关系。原因有二:第一,知识在生产上具有重要规模经济和外溢效应;第二,知识在使用方面不具有排他性。

10多年前,美国物理学家Geoffrey West等人发现,在城市生活中,人类的发明创造与人口的关系遵循正5/4指数缩放规则: 如果一个城市的人口是另一个城市的10倍,那么,发明创造总量是后者的10的四分之五次方,即17.8倍。

以此来看,中国对世界发明创新的贡献与中国的人口规模太不成比例。中国人口是美国人口的4倍,日本的10倍,英国的20倍,瑞士的165倍。按照知识创造的指数缩放法则,中国的发明创造应该是美国的5.6倍,日本的17.8倍,英国的42.3倍,瑞士的591倍。

但实际情况是,近代500年里,中国在发明创新方面对世界的贡献几乎为零,不要说与美国、英国比,我们甚至连瑞士的一个零头也达不到。瑞士人发明了手术钳,电子助听器,安全带,整形技术,液晶显示器,等等。中国人民银行印刷人民币使用的防伪油墨是瑞士的技术,中国生产的面粉有60%-70%是由瑞士布勒公司的机器加工的。

问题出在哪里?难道是中国人基因有问题吗?显然不是!否则,我们就没有办法解释古代中国的辉煌。

问题显然出在我们的体制和制度。创造力依赖于自由!思想的自由和行动的自由。中国体制的基本特点是限制人的自由,扼杀人的创造性,扼杀企业家精神。中国人最具创造力的时代是春秋战国时期和宋代,这不是偶然的。这两个时代也是中国人最自由的时代。

公元1500年之前,西方不亮,东方昏暗。公元1500年之后,西方一些国家经过宗教改革和启蒙运动,逐步走向自由和法治,我们却原地踏步,甚至反其道而行之。

我必须强调,自由是一个不可分割的整体,当心灵不自由的时候,行动不可能自由;当言论不自由的时候,思想不可能自由。只有自由,才有创造。让我用一个例子来说明这一点。

今天,饭前便后洗手已成习惯。但是,1847年,匈牙利内科医生伊格纳兹·塞麦尔维斯(Ignaz Semmelweis)提出医生和护士在接触产妇前需要洗手的时候,他冒犯了同行,并因此丢掉了工作,在一个精神病院死去,终年47岁。伊格纳兹·塞麦尔维斯的观点基于他对产褥热的观察,当时他所在的医院有两个产房,一个服务于富人,由专业医生和护士精心照料,这些医生不断在接生和解剖尸体之间转换工作;另一个服务于穷人,由接生婆负责。他发现,富人得产褥热的比例是穷人的三倍。他认为,原因是医生不洗手。但他的看法与当时流行的医学理论相矛盾,他也不能对自己的发现给出科学证明。

人类的卫生习惯是怎么改变的?这与印刷机的发明有关。

1440年代,德国企业家约翰内斯·古腾堡发明了活字印刷机。印刷机使得书籍和阅读普及开来,许多人突然发现,他们原来是“远视眼”,由此对眼镜的需求出现了爆发式的增长。在印刷机发明一百年后,欧洲出现了数千家眼镜制造商,并由此掀起一场光学技术的革命。

1590年,荷兰眼镜制造商JANSSEN父子把几个镜片累在一起放一个圆筒里,发现透过玻璃所观察的物件被放大,由此发明了显微镜。英国科学家Robert Hook用显微镜发现了细胞,引起了科学和医学一场革命。

但最初的显微镜分辨率并不高,直到1870年代,德国镜片制造商Carl Zeiss生产出了新的显微镜,它是基于精确的数学公式构造的。正是借助这种显微镜,德国医生罗伯特·科赫等人发现了肉眼看不见的微生物细菌,证明当年匈牙利医生塞麦尔维斯的观点是正确的,由此创立了微生物理论和细菌学。正是微生物学和细菌学的创立,逐步改变人类的卫生习惯,并由此导致人类预期寿命的大幅度延长。

我们可以设想一下:如果当初古腾堡的印刷机被禁止使用,或者只被允许印刷教会和行政当局审查过的读物,那么,阅读就不会普及开来,对眼镜的需求就不会那么大,显微镜和望远镜就不会被发明出来,微生物学就不会创立,我们不可能喝上消毒牛奶,人类的预期寿命也不会从30多岁增加到70多岁,更不要幻想探索宇宙空间了。

过去三十多年,中国经济取得了举世瞩目的成就。这一成就是建立在西方世界过去300年发明创造所积累的技术的基础上,支撑中国经济高速增长的每一项重要技术和产品,都是别人发明的,不是我们自己发明的。我们只是套利者,不是创新者,我们只是在别人建造的大厦上搭建了一个小阁楼,我们没有狂妄自大的理由!

牛顿花了30年的时间发现了万有引力,我花了三个月的时间搞明白了万有引力定律,如果我宣称自己用三个月的时间走过了牛顿30年的道路,你们一定觉得可笑。如果我再反过来嘲笑牛顿,那只能说明我太无知!

我们常说中国用世界7%的可耕地养活了世界20%的人口,但我们需要问一问:中国何以做到这一点?简单地说,就是大量使用化肥。中国人食物中大约一半的氮来自无机化肥。如果不使用化肥,一半的中国人会饿死。

氮肥的生产技术是那来的呢?是100多年前,德国科学家弗里茨·哈伯和BASF公司的工程师卡尔·博什发明的,不是我们自己发明的。1972年尼克松访问中国后,中国与美国做的第一单生意,就是订购13套当时世界上规模最大、最现代化的合成氨尿素生产设备,其中8套来自美国的 KELLOGG公司。

再过五十年、一百年重写世界发明创新史,中国能否改变过去500年史上的空白?答案很大程度上依赖于我们能否持续提升中国人享有的自由。因为,只有自由,才能使中国人的企业家精神和创造力得到充分发挥,使中国变成一个创新型国家。

因此,推动和捍卫自由,是每一个关心中国命运的人的责任,更是每个北大人的使命!不捍卫自由,就配不上“北大人”的称号!

谢谢!

-R/i2SL 

Posted in 社会生活 | Tagged , | Leave a comment

四款充电桩app应用横向截屏比较

现在流行制作&使用App/客户端/应用程序,与之对应的是网站/网页——寄托于第三方浏览器的应用程序。比如新能源汽车/电动汽车,需要充电,跟之前车主需要找停车场一样,也需要一个充电桩App,如下对比了三个找充电桩的App(e充网,e充电,星星充电)和一个地图应用(高德地图)的查找周边的充电桩的截图信息,优劣高下,一目了然。

上图星星充电App在作者所在位置的打开情况,有4个信息,且都较远。

上图来自国家电网的e充电的App,在同一位置,只有2个信息,且都较远。

不同的是这个信息与之前的信息不重复,显然如果上面两个信息叠加起来,应该会更好,于是就有下面这个 e充网App.

上图e充网App的信息明显丰富很多很多了,值得赞一个,信息多,也可以看到将各类型的充电桩信息集合到一起,除了国电和星星的,还有普天等其他充电运营商。

这样比较起来,选择充电App,在北京这里的话,e充网的优势很明显。然而,对于找什么位置来说,导航App应该也可以一显身手,如下是在高德地图里搜索充电桩的情况显示。

上图在浏览器应用中打开 -ditu 或者 http://ditu.amap.com 然后搜索充电站,就能够看到上面的信息,也一目了然,情况比e充网的还有好。

充电桩App在核心功能为用户寻找充电位置方面不如导航或地图软件。如果不是更丰富或专业的功能或服务,充电桩App在提供位置信息方面,如何超越导航或地图软件,是要面临的大问题。

以上测试属个例。个例感受 e充网 > 高德地图 > 星星充电 > e充电 。

题外,这些App的命名真随意,“e充网”和“e充电”是截然不同的两个实体。市面上还有很多其他各样的充电桩App,未一一实测。

Posted in 社会生活 | Tagged , , , , , , | Leave a comment

[转]许小年:转折点上的中国经济/中等收入陷阱

        本文为许小年教授2017年5月5日在深圳创新发展研究院的演讲:转折点上的中国经济

  中国的经济发展经过三十多年的改革开放,到现在处于一个很关键的转型期。这个转型期能否顺利过渡,决定了中国未来十年、二十年经济发展的态势。这几年可以说是非常关键的时间段。转折是从资本积累到创新驱动的经济增长,这是它一个很大的特点。为什么经济要转型?如何去转型?为什么企业的经营模式要转型?如何去转型?这是今天我演讲的主要内容。

  数量型增长无法持续
  在讲这些内容之前,我介绍一个理论分析框架(生产函数),有助于我们理清转型的来龙去脉。这个数学公式的左边Y是GDP或者是企业的产出,右边有几个字母,A代表技术,K代表资本投入,L代表劳动投入。这个公式就是一个投入产出的关系。国家的经济、GDP也就是左边的Y由什么决定?由三个因素决定:劳动投入、资本投入和技术水平。企业的产出同样可以用这个公式来表达,左边是企业的产出或者产值,右边是企业的技术装备水平和资本与劳动的投入。

  用这样一个公式想要表达什么观点?这个公式是一个经验公式,用世界各国的数据进行验证,这个公式大体都是成立的。企业层面上我们没有做太多的分析,从概念上大家都可以接受,一个企业它的资本投入或者产能越高,劳动力雇佣得越多,它的技术水平越高,它的产出就越高。

  这个经验公式用来区分两类性质不同的增长,来区分两类性质不同的企业经营模式。一类经营模式或者是增长模式是“数量型增长”,就是单纯依靠资源的投入,依靠资本和劳动的投入来驱动增长,K和L增加,左边的Y增加,这叫数量型增长。第二类增长是“效率型增长”,不是靠K和L而是靠提高A,A代表技术水平。这个A不是我们狭义理解的技术,他是广义的技术,包括了制度的因素。效率型增长的特点是,如果A的数值更大,你不用增加资本的投入和劳动的投入,左边Y也会更高,所以他是依靠提高K和L的效率来驱动增长,而并不是靠增加资本和劳动的数量来增长。

  同等数量的资本和劳动,如果效率更高,不必再增加人、不必再增加产能,也可以获得产出的提高。举一个例子,比如一个手机生产厂,它的生产能力是给定的,如果生产苹果手机,这是什么样的产值?如果生产小米手机,那又是什么样的产值?两种不同的产品反映在公式的A上,苹果所代表的技术水平不是小米手机能够相比的。所以技术水平的提高,你不必增加产能,不必增加人力的投入,可以获得更高的产出。这是两类不同性质的增长模式。一类是数量型增长,一类是效率型增长。

  这两类增长模式本质的不同就是数量型增长无法持续,它依靠不断地增加投资、增加资本,这个增长虽然在一个时期内能够实现预期目标,但是无法持续。为什么无法持续?这是我们今天要讲的一个核心的经济规律,这个经济规律叫做“资本的边际收益递减”,这个词听起来好象有一些太学术化,我解释一下实际上大家都可以理解,这是常识。在其他所有条件不变的情况下,追加资本投入虽然可以带来GDP的增加,但是每一单位投资所产生的收益越来越低。

  我们设想一下农民种一块地,假设在刚开始的时候,农民完全是用劳动种这个地,他没有什么资本的投入,没有拖拉机、化肥、灌溉设备,完全就是靠简单的劳动工具来种这块地。大家设想一下,在纯体力劳动的情况下,亩产能够达到多少?我们去陕北下乡的时候,当时亩产只有300斤,所以“大跃进”时期有人说亩产万斤,但凡有一点农业生产知识的人就知道怎么可能是万斤呢?我怎么也想象不来陕北的土地上能够产出万斤粮来,我们当时只有300斤亩产。

  现在我们再想象一下,给农民配一台拖拉机亩产能够增加多少?大概能够增加100斤左右。如果能够提高100斤现在是亩产400斤。我再给他增加第二台拖拉机,各位想一下第二台拖拉机带来的增产效果是多少?要比第一台要少,因为土地已经深翻过了,第二台拖拉机再来深翻一遍,他的效果就比第一台要差。我们设想第二台拖拉机带来的亩产是50斤。配第三台拖拉机的时候呢?增产效果是0,也许是5、6斤。继续增加资本投入总会到达一个点,在那个点上追加的资本没有任何影响。这就叫做“资本的边际收益递减”。当资本的边际收益递减到0的时候,你再追加资本,没用了,亩产不增加了。

  数量型增长无法持续原因:资本边际收益递减

  亩产不增加了,这个时候出现了一系列的现象:
  第一个现象,不管你再投入什么,GDP增长不动了。这个时候我们就说这个国家陷入了中等收入陷阱。中等收入陷阱的背后是什么?所谓的中等收入大概是人均收入1万美元左右,中等收入陷阱并不是说1万美元的人均收入是一个魔障谁也过不去,好像是一个神奇的数字,在这个数字面前世界上发展中国家纷纷败下阵来,而是说一个国家通过工业化可以实现经济增长,但是到了一定程度以后,工业化所带来的增长动力消失了,经济增长缺乏新的动力,于是就停在1万美元左右。

  78年开始的时候,中国经济是一个资本、装备严重不足的经济,那个时候你进行投资,用先进的生产设备、工业设备,可以很快地增加GDP。但是现在用大机器装备各行各业的过程基本上已经完成了。在这个时候再增加资本投入没有用了,因为它的收益等于0了。

  我们看到过去几年间,中国的GDP增长在不断地下降,尽管每年政府增加的投入并没有减少。09年的时候4万亿,4万亿那只是一个符号,真正的投入是十几万亿,现在我们谈40万亿,又加了一个0。可是GDP增长为什么还在下滑呢?因为资本的边际收益递减。

  所以我们现在在宏观现象上看到一系列的数字下滑,它只是表明经济规律正在发生作用。不断下降的GDP增长率印证了中国经济增长的模式是两种模式当中的数量型增长,而不是效率型增长。当资本的边际收益等于0或者是接近0的时候,农民还要提高亩产怎么办?农民说“三农”政策执行得很好,我现在已经有三台拖拉机不要再给我拖拉机了,因为没用。现在还要增产怎么办?这要去找袁隆平院士,跟他讨一些良种,跟袁隆平院士讲,现在靠资本积累拖拉机无法提高亩产了,喷灌机、拖拉机都有了,化肥也用了,亩产已经到头了。如果要继续增产,我向您讨教,能不能用优良的品种给我,我可以继续增加亩产。

  袁隆平院士的优良品种代表的就是A,就是技术含量的增加。袁隆平院士的种子不是老天给的,是他多少年辛辛苦苦经过科学实验、经过筛选得到的种子。这个种子比农民一般的种子技术含量要高得多。如果我们找袁隆平院士,那就是把农业生产的动力从资本积累转向了技术创新。这是今天我们要讲的核心内容,这就是我们今天要讲的经济规律。

  通过资本积累来驱动经济的增长无法持续的原因是什么?就是资本的边际收益递减。当资本边际收益等于0的时候再增加资本没用了,增长停止了。所以靠资源数量投入的增加来驱动经济的增长是无法持续的,而通过A的增加来驱动经济的增长是可以持续的,为什么?因为人类认识自然、认识经济的能力是无限的,因为技术进步是无止境的。

  从工业革命开始我们就在提高A,比如蒸汽机,蒸汽机的效率比人力、比畜力、风力、水力有效得多。蒸汽机之后又有电力、铁路,工业革命以来200年现代世界经济的增长,依靠的不是政府的刺激性政策,主要依靠的是技术进步。从蒸汽机一直到今天的互联网,不断地技术进步推动了A,保持了工业革命以来现代世界经济的增长,也保证了中国经济从改革开放以来到现在的增长。

  当然你不能够把这两种增长动力截然分开,我们只能在概念上把它分开,来理解中国经济当前所面临的困境以及摆脱困境的方法。

  中国已经掉入了中等收入陷阱了

  中国目前的资本边际收益是不是等于0了?我们是不是已经掉入了中等收入陷阱了?我的判断是:是的。从数据上来讲,大概在1990年代晚期,1块钱人民币的投资可以带来大约4毛钱到5毛钱的新增GDP;今天或者说去年,1块钱的投资能够带来多少新增GDP?今天是不是投资边际收益等于0了?我们看到的统计数字是,在过去的大概十几年间,1块钱投资收益从4-5毛钱一路下降到了今天的7分钱,1块钱人民币的投资能够带来新增GDP只有7分,不等于0也差不多了。所以这个时候投资怎么都拉不起来,边际收益接近0了。

  另外一组数据——企业的产品出厂价格指数(PPI)——可以看得非常清楚。从2012年开始一直到去年的下半年全是负增长,企业的产品出厂绝对价格在不断地下降。为什么会产生这个现象?产能过剩。在过剩产能的压力下,企业竞相降价,试图保住自己的市场份额,试图保住自己的销售。产能过剩是什么意思?产能过剩就是中国的各行各业已经不再需要新的投资了。

  在出厂价格不断下降的时候,你如果有新的投资进行,这个投资收益是多少?投资收益是负的。所以我们不仅已经过了投资收益等于0这一点了,而且已经掉到0点以下了。各行各业的过剩产能很清晰地告诉我们,过剩产能一定会导致PPI的负增长,而PPI的负增长意味着资本积累现在已经过度了,资本的收益等于0甚至等于负的,也就是说投资根本无法回收。

  这个时候我们看到的一些经济现象很容易理解了,现在有一个词叫“脱实向虚”。中国政府很着急,给你们一点钱你们不投入实体经济拿去干什么了?炒股票。2015年经历了一次大股灾现在谁也不敢炒了,去年就炒房子,深圳房价去年涨了2倍,深圳的房价还会涨。没买房的不要过度悲伤,你咬咬牙就买了吧,因为以后还会涨。有了房子的也不要太高兴,涨得越高跌得越狠,将来跌得越狠。

  中央银行印钞票,这些钱就是不往实体经济去,你抱怨有什么用,政府老是说“引导资金进入实体经济”,你怎么引导他也不去,因为实体经济的收益等于0了,所以他不去实体经济了。要想让资金进实体经济要想别的办法,在资本普遍过剩的情况下,在产能各行各业都普遍过剩的情况下,资金不会进实体经济。所以在这个时候印钞票,除了制造通货膨胀没有其他任何的效果。

  一旦到资本收益等于0的时候,就是中等收入陷阱。中等收入陷阱意味着宏观政策失灵,“脱实向虚”只不过是宏观政策另外的一个反映,宏观政策这个时候没有用了。政府去印钞票,钞票不进实体经济,去炒资产价格;财政政策也失灵了,财政政策不能增加GDP,我们知道中国大部分的财政投资进入实体经济,民间的投资大幅度地下滑,是因为收益等于0,政府冲进来投资,结果就是更多的过剩产能。

  所以这个时候谈扩张性的财政政策和货币政策那是非常荒谬的。因为扩张性的财政政策、货币政策,实际上都是为了拉动投资。可是我们的经济已经不需要资本了,你投资干什么?这个时候政策不应该是刺激需求。

  PPI上来是因为2016年上半年的货币放水

  这个时候经济增长怎么办?更多的投资意味着更多的产能,更多的产能意味着PPI还会继续下降。PPI去年的下半年为什么上来了,有人说中国经济企稳反弹在即,去年下半年PPI小尾巴为什么翘起来了,这是不是经济企稳的标志?为什么起来了呢?

  分析一下几个原因。第一个原因也是最重要的原因,是货币供应(狭义货币M1)。两者什么关系?两者正相关关系,谁是原因谁是结果?货币是原因,价格是结果。我们发现货币供应和价格指数高度相关,去年下半年的PPI小尾巴翘起来,原因是去年上半年的货币放水。去年上半年M1增长率从5%左右突然增加到25%,货币增长速度在很短的时间里提高了这么多,当然会反映在价格上,所以这个小尾巴翘起来了。

  有人说这个小尾巴翘起来表明中国经济已经企稳了,我认为没有。这个翘起来最主要的原因是中央银行又放水了。说好的供给侧改革呢?怎么又跑到需求侧去货币放水了呢?怎么回事?不清楚。现在我们的政策层面上到底是怎么样操作的?目的是什么?要实现什么目标?现在学者一头雾水。我们搞不清楚宏观政策是怎么制定的。现在我自己越来越多的时间用在微观层面的研究,宏观层面没法研究了,越研究越糊涂。

  有人就说中国经济反弹了,尾巴翘起来是不是U形的右边?去年(2016)5月份权威人士讲中国经济不是U形更不是V形而是L形,这个我是同意的。有人说U形已经走出来了,并没有走出来,主要是因为中央银行的放水。市场上关于当前的经济形势有不同的观点,有人认为已经企稳反弹,但是在学界我所听到的基本上是共识,中国经济仍然处于L形,而不是U形。学界争论的L形到底是这一竖还是一横,没有对L形有争论。我个人认为,我们现在在这一横上,这一横还要横很长的时间,并没有走出来。

  除了货币放水以外,反弹还有其他的原因。一个是去产能,去产能确实有一定的影响,但是它的影响远远低于货币放水。还有是库存周期,因为去年各行各业的库存是历史最低水平,为了补充库存,需求起来了一点,造成了一个反弹。

  再增发货币,目前的房价、汇率都保不住

  今年怎么样不用说大家都知道。今年以来这条红线(货币供应——狭义货币M1)一直在下,预示着今年下半年经济跟着这条红线下去。你会说,这红线效果挺明显的,为什么不继续把它拉上去呢?再把它拉上去深圳老百姓怎么活啊?深圳的房价还要涨到什么地方去啊?现在政府运用手中所有的行政手段在打房价,在限购、限价、限贷,现在还敢再增加货币供应吗?再增加货币供应行政手段都控制不住房价了。

  所以这个红线从今年年初开始就往下滑了。资产价格的暴涨是政府收缩货币的一个原因,政府收缩货币的第二个原因是人民币汇率。人民币汇率面临巨大的压力,要再增加人民币的供应,人民币汇率会进一步地贬值。现在在汇率的控制上也是几乎动用了所有的行政手段,资本账户相当于关闭掉了。大家都能够感受到,现在到香港去买保险,卡在那里刷不出来,换一点外汇把你当犯人审。你到银行换一点外汇,问你N多个问题,恨不得就假定你是一个在逃犯人一样。用所有的手段控制了资本账户,维持了目前人民币的汇率。如果再增发货币,连目前的汇率都保不住。

  现在我们是“捉襟见肘”,拆了东墙补西墙,管了这头管不了那头,是一种非常窘迫的状态,这就是中国经济的现状。

  所以企业界的朋友对于未来宏观经济严峻的形势要做好充分的准备,随着货币的再次收缩,今年下半年经济的数字会继续往下走,这个L形还很长。关于L形要走几年,取决于政府接下来要做什么,如果做得对,这个L的小尾巴会很快结束,如果政府在改革中无所作为,我们在L形中继续往前走。

  中国经济处在一个转折点上:要转向效率性增长

  在这样的情况下,在这种数量型增长已经是没有多大空间的情况下,中央政府在过去的几年中提出了一个很重要的政策方向的改变,这个政策方向的改变由于后续的解释不甚清晰,引起了市场和民间思想上的混乱,以至于现在我们对政策方向的改变没有给予充分的重视。这个政策方向的改变就是在投资拉动已经失效的情况下,我们在政策上提出的基调是什么?

  第一是“新常态”,新常态就是各位不要再预期10%的增长了,不会再有更高的增长了,那个时代已经过去了,甚至不要再预期8%的增长了。6.5%仅仅是一个数字,真实的增长率谁知道啊?反正很低就是了。6.5%就是统计局的一句话,高速增长的阶段过去了。第二,提出来“供给侧”,等下我会讲什么叫供给侧。

  这两个政策的转向,实际上反应了我们今天要讲的主题,就是中国经济处在一个转折点上,我们现在已经从需求侧转向了供给侧,转向供给侧实际上就是我们多年呼吁的效率型增长,转向供给侧就是从K和L转向A。为什么说转向A?因为A是技术水平,谁决定了技术水平?不是工信部、不是科技部,工信部和科技部只决定科技项目的补贴,不决定技术水平。技术水平是企业决定的。企业在供给侧还是在需求侧?企业在供给侧。所以供给侧一提出来以后,本人表示支持供给侧的转向。

  我的学生取笑我,他说“教授,你很少跟中央保持一致啊。”我说“你说的还不对。不是我跟政府保持一致,是政府跟我保持一致。OK?”我们呼吁了这么多年要效率型增长,政府终于同意了,当然他的说法是供给侧,我们的说法是依靠效率的提高来驱动中国经济的增长,而不是依靠政府发钞票、花钱,搞地方平台、投资,不是依靠这套东西,是依靠企业效益的提高。

  所谓的供给侧政策,一切围绕着企业效率的提高。这在目前我们看到的官方文稿中也罢,媒体的文章中也罢,都没有给予充分的重视。供给侧就是要提高企业的效率,在提高企业效率的方面我们不需要什么政策,但是我们需要制度保障。企业的效率怎么提高?要靠技术创新。我们关于供给侧的讨论应该围绕着企业效率,也就是围绕着如何促进企业的技术创新。

  效率性增长要靠创新
  说到创新我们在这里要给一个定义,什么叫创新?创新有很多的内容,我们一般理解的创新是,新技术、新产品、新服务。智能手机算一个创新,但这只是狭义的创新,广义的创新的内容要比狭义的创新丰富得多。广义的创新除了这种狭义的技术创新之外,还包括了商业模式的创新,比如京东的电商,这就是一个零售业模式的创新,当然他用了一些互联网。还有一些我们看到的,没有用任何的新技术进行的创新,那就是商业模式的创新。

  创新还包括了组织的创新,同样是深圳的企业比如万科,万科的楼盘很多,如何能够激励万科的每一个员工去最大化股东的利益,万科做了一个很有意义的组织上的创新,就是“事业合伙人制”,不涉及任何技术,事业合伙人的创新起了什么作用?每一个项目都有一群合伙人,这个合伙人有管理人员、有员工,大家都相当于尽管不是万科的股东,相当于都是这个项目的股东,都可以从这个项目的收益中获得收益。用这样的方法来激励每一位员工去努力工作。这也被我们包含在A里面,万科的事业合伙人的创新,有点类似78年小岗村农民的创新。

  现在依靠K和L这种增长已经没戏了,只好去做A,A又要靠创新。创新而言我认为深圳是全国创新城市的第一位,这个城市可以称为“创新城市”。我每次到深圳来心情都比较愉快,每次回到北京都感到很压抑。

  深圳真的是一个创新城市,要珍惜这个创新环境。我在深圳看到了最多的创新企业,我在深圳看到了最多的创新技术,我的很多学生都在深圳。这里的商业环境、创新环境,跟全国其他城市相比那简直就是天渊之别。

  深圳这个地方为什么能够成为创新城市很多原因,其中一个原因就是政府管事少。后面我们会讲到供给侧到底要采取什么样的措施能够促进创新,供给侧根本不需要产业政策。去年林毅夫和张维迎教授的产业政策之争中我坚定站在张维迎教授这边,坚定地认为供给侧根本不需要产业政策,产业需要一个良好的公平的竞争环境。我就没有看过中国哪一家创新公司是由政府的政策扶持出来的。

  中国的创新企业数一数,华为,民营的,在深圳;腾讯,民营的,在深圳。这些创新企业全都是民营企业,哪有什么政策扶持。现在做大了,政策送上门去了,在他刚初起的时候谁扶持他了?马云惨到找不到投资人,马化腾到处求爷爷告奶奶,最后南非的一个投资家投了他一把。南非的投资家为什么投了他一把?我估计南非远在万里之外根本不了解中国的情况,稀里糊涂给他融了一把资,就做成了一个腾讯。哪个是政府扶持起来的?我简直找不到。

  供给侧四大措施
  所以你要做A,要做经济转型转向A,在政策层面上我们不需要产业政策。我们需要的是什么?我提出了供给侧四大措施:

  第一大措施,保护私有产权。保护私有产权和创新有什么关系?关系太大了,因为创新研发都需要进行长期的积累,并不是灵机一动就能够产生的,需要进行长期的研发投资、长期的技术积累,才能产生突破。而你要让企业在研发上做长期地投资,你必须保护他的产权。保护产权的意义在于,给企业家建立起对于未来收益的稳定预期,只有稳定预期的支配下,他才能够做长期投资。

  中国的企业家都喜欢短平快项目,中国的企业家都不愿意投研发,原因是什么?原因是未来的不确定性太高了。我投资研发,我十几年的积累,十几年以后怎么回事我还不清楚呢。所以现在你看我们的企业家不是把这个资金投入到研发项目上去,而是把资金转移到国外去。

  春节期间我参加了中欧澳大利亚和新西兰校友会的成立,在悉尼的成立大会上有70多位澳洲和新西兰地区的中欧校友来参加,我对他们讲,我说大家跑到这里来,参加校友会的成立我很感动,我感动的是各位对学校的这一份情还在,但是另外一个方面我也很伤心,我伤心的是这么多的校友跑到澳大利亚、跑到新西兰来,本来你们应该留在中国的这片土地上,你们应该在这片土地上投资,来发展你们的事业,现在你们全跑了,我感到伤心。当然我不责怪你们,你们的行为、你们的选择全是理性的。

  为什么跑了?财产的安全,孩子的教育,空气,环境,所以跑了。

  所以保护私人产权是进行长期研发投资的前提条件,你没有有效的产权保护,没有人愿意做长期地投资。所以我说搞供给侧我们赞成,推动技术创新我们也认为是解决中国今天面临着诸多经济问题的一个有效的方法,但是需要加强对产权的保护。

  去年11月中共中央和国务院联合发了一个通知,这是值得一看的,说明这个问题已经反映到中央了,中央已经在关注这个问题了。这个通知是《关于尊重和保护企业家精神的意见》,今年3月份的政治局上又通过了一个意见,内容大致相同。说明现在这个问题已经比较严重了,已经引起了高层的注意。你要保护私有产权,要尊重企业家精神,否则我们创新没法做。

  你出文件、出意见这当然是好事了,但是为什么没有起到预想的作用呢?就是你的文件和意见不能够有效地实现你的目标。保护产权最有效的方法是什么?法治,不是人治。因为你今天发这个意见,明天又发一个相反的意见怎么办?我们看到政府经常发一些自相矛盾的意见,我就晕了,不知道哪个管用。而法治是非常清晰的,他不会随着政府的变动而随意地更改,这样他对产权的保护是比政府的承诺更加有效。

  供给侧我很赞成,一定要做,但是第一要保护私有产权。

  第二,缩小国有经济范围。国有企业从来不做A,他做K、做L,他投资冲动非常强烈,他雇了一大帮人。国有企业冗员充斥,人浮于事,他就是不做那A。为什么国有企业不做A?没有企业家精神,没有生存压力,都对。国有企业做不了A的原因是什么?他既没有创新的动力,他也没有创新的压力。没有创新的压力大家都知道。民营企业在市场上,如果他在创新上落后会有什么结果?市场会惩罚他,市场会淘汰他,他创新是迫于市场的压力。

  手机为例,曾经手机的NO.1是诺基亚,诺基亚现在在哪里?谁知道呢?为什么?从老大沦落为不知所终。为什么?在创新上也就落后了一步。落后了智能触屏手机,诺基亚已经掌握了这个技术,但是他没有推出产品。苹果手机出来的时候诺基亚还在按键盘,那个小键盘我看不清楚,那么小的手机,指头得多细啊才能用诺基亚手机。一个创新落后,曾经的第一名老大就被淘汰出局。创新在市场竞争的环境中并不是企业锦上添花的事,创新是企业生死攸关的头等大事。

  在数量型增长已经结束进入到技术创新时代,创新是企业的头等大事。企业的CEO一定要抓创新,企业的董事长一定要关注创新,创新失败企业就失败了。可以说,企业存在的目的就是为了创新,不是生产、不是销售,而是创新。因为市场压力太大了,你一步慢了,就淘汰出局。

  国有企业别说一步慢了,国有企业十步慢了都不在乎,因为他不会倒,因为他不会被淘汰出局,因为他是吃皇粮的,因为他出现问题政府会救他。他有什么创新压力?没有压力。他也没有创新的动力。

  创新的动力来自于哪里?来自于企业家的激励。企业家进行创新的激励有哪些?乔布斯为什么要创新?比尔盖茨为什么要创新?人都一样,作为人我觉得人和人之间相同之处远远大于我们的差异。乔布斯创新最强的动力是要把苹果做成一个百年老店,能够长存的优秀的公司,他有改变世界的情怀。盖茨创新要发财,两个人都是很了不起的创新者,但是两个人动机不一样。比尔盖茨要把他的企业做大他要发财,你不用责备他境界太低,我们也不用一定都要学乔布斯假装高大上,用不着,人是很复杂的动物,他的行为由多重的激励来驱动的。有的人要改变这个世界,有的人要发大财。有的人要用他积累的财富去做慈善,各种各样的动机来进行创新。

  但是,各种各样的动机进行创新,在国有企业那儿我们一个都看不到。国有企业的高管创新成功了他也发不了大财。为什么?因为央企老总每年60万,他们管着数以千计甚至上万亿的资产管着,你每年发他60万,开什么玩笑?要我做央企的老总管着数千亿的资产,每年拿到所有的工资60万,我干什么?我肯定要偷啊,人性使然啊。我肯定要琢磨,这几千万的资产我怎么样把他运作一下,我个人能够获得一点好处。

  比如说外购,我采购的价格就比市场价格高好多,我从谁那儿购的?从我哥们儿那儿购的。外包同样,从我的哥们那个企业购的高于市场价格,高的那一部分分吧。他们没有创新的激励,他的工资封顶,他不能够分享创新的收益,既没有创新的动力,又没有创新的压力。国有企业不可能是创新的主体,创新的主体必然是谁?民营企业。所以为了建设中国的创新经济,一定要缩小国有经济的范围,国有经济越大,这个国家的创新越没希望。

  第三,放松和解除管制。管制是创新的大敌。按照市值计算中国为什么出现了世界级的互联网公司?原因之一就是互联网刚刚进入中国的时候政府还没有反应过来呢,没管他,他一下子就起来了。自由的环境、资源的自由流动,是创新的必要条件,你少管我,你看你政府产业政策扶持的那一些新兴行业,我们发现政府扶哪个,哪个就垮。政府弄光伏,光伏什么后果?产能过剩一塌糊涂。光伏的领头企业全倒了。所以创新他不需要政府扶持,他需要政府创造一个良好的竞争环境。你不要管。

  现在又说电动汽车是新科技方向,国家政策支持。结果是什么?结果是企业和官员勾结骗取国家补贴,都在骗。说“我是电动汽车”,其实他根本不清楚什么是电动汽车,企业不清楚,官员也不清楚,搞两辆样车就把补贴骗过来了。电动汽车技术我们现在照样落后。所以创新不需要政府的扶持,但是需要一个自由的、良好的环境。

  第四,全面减税。不仅仅是帮助企业渡过经济下行的难关。全面减税的意义在于落实十八届三中全会提出来的“要让市场在资源配置中发挥决定性作用”,把资源更多地从行政性配置下解放出来,也就是从政府的手里解放出来,在市场上由企业来进行配置。这是减税最重要的意义,不仅仅是减轻一些企业的负担,当然减轻企业的负担现在也是很必要的,更重要的意义是把资源从行政性配置转向以市场为基础的企业进行配置。

  以上是我提的四条供给侧的政策。各位估计一下,被采纳的可能性有多大?几乎等于零。跟我们的资本边际收益一样,几乎等于0。我也知道几乎等于0,那我还在这里鼓吹什么呀?我在这里鼓吹因为这是我的工作,我的工作就是研究,我的任务就是根据我的研究结果提出政策建议,至于这个政策建议政府接受与否跟我没关系。我不会因为他接受而喜,我也不会因为他拒绝而悲,这只是我的工作而已。

  创新的认识误区

  如果政府不接受企业怎么办?宏观政策我们无力影响,企业只有在严峻的经济环境中做好自己的工作,特别是要做好创新。当前我看到了不少企业对于创新存在着一些模糊的认识,大家都意识到创新转型的迫切性,但是又感到似乎是落入了一个转型的悖论。

  我的学生跟我说“教授,我现在发现如果不转型的话是等死,转型是找死。你看这两种死法哪种更好一点?”我说“之所以有这种悖论,是因为你对转型存在着错误的理解。”我们有一些企业家把“转型”错误地理解成“转行”,转型不等于转行,转行确实找死。转型能够闯出一条生路。为什么转行是找死?因为你转行到了一个全新的行业,你没有行业的经验,你没有客户的基础,你没有团队,你不熟悉监管团队,不是找死吗?

  中国有一个故事叫做“赛马的故事”,这个故事的精神是什么?当人家出上马的时候你出下马,当对手出中马的时候你出上马,当对手出下马的时候你出中马。这个故事告诉我们什么?要扬长避短,要以人之长击人之短。你转行是以己人短击人之长,那不是找死吗?就像冷兵器时代的僧格林沁骑兵马队冲击洋人的长枪大炮一样,那不是找死吗?要用你的长处在市场上竞争,不是用你的短处。转行恰恰用你的短处在跟行业中已经建立起优势地位的企业进行竞争,所以我一再强调,转型不是转行。转型往往要求在你最熟悉的企业中来思考,来改变现状,来求得生路。

  这里给大家介绍一本书,彼得德鲁克写的《创新与企业家精神》,这本书是1984年出版的,今天我们读起来没有任何时之感。德鲁克在这本书里提了几个观念我非常赞同,一个观念就是“创新需要专注”,第二个观念就是“创新未必需要高科技,创新在传统行业中照样可以进行。”德鲁克用1980年代美国的数字说明,创新型企业3/4来自传统行业,只有1/4是来自科技行业。所以我们不要以为我不是互联网、我不是大数据,我不懂人工智能就不能创新。错了,你是卖葱的卖蒜的,你是炸油条的、开饭馆的,你是做鞋的、做衣服的都可以创新,创新有高科技当然好,但是并不以高科技为前提条件。德鲁克在这本书里面举了很多传统行业的创新,这些创新都收到了巨大的经济效益,但是没有什么高科技。

  创新案例

  我们只介绍一个麦当劳,他是一项伟大的创新,由于这项创新一个新的行业诞生了,就是快餐业。快餐业是由麦当劳创新的,在麦当劳之前没有快餐业。麦当劳的创新始于纽约的一个奶昔机的供应商,这个奶昔机的供应商发现,他每年奶昔机卖得最多的是加州一家汉堡店,每年都是加州这家汉堡店向特订购最多的奶昔机,他自己好奇,为什么每年都是他呢?于是他就飞到加州去看这家汉堡店。这一看发现果然与众不同,在麦当劳之前汉堡是怎么生产的?汉堡是一个萝卜一个坑,一个员工在一个工位上负责汉堡包的所有制作工序。从切面包,到切菜片,到炸肉饼、抹酱、打包、卖给客户都是一个员工来做。

  这种生产方式有什么问题?效率低。产品质量不够标准,这是两大痛点。不同的工人炸肉饼,有的人炸的时间长短不一样出来的味道不一样,客户感受一个店里买的汉堡味道不一样,他的产品的品质一致性无法得到保障,更不要说印度的汉堡包和中国的汉堡包了,那更不一样。这是一个统点,产品品质的一致性无法保障。第二个痛点是效率低,效率低体现在哪里?一个人要依次完成所有的工序,制作时间长,制作时间长意味着客户的等待时间长。我要等着你一块一块做,这个汉堡包的制作就跟家里家庭主妇做饭一样,他是一道一道工序做的。

  这家汉堡包的商店不一样,他是把在同一空间点上不同时点上完成的工序分布在不同的空间点上,在同一时点完成。用空间换时间。切面包的专做切面包,切生菜和番茄的关门管切生菜和番茄,炸肉饼的专门管炸肉饼、抹酱的专门抹酱……把汉堡包的单工位制作变成了流水线的生产,解决了问题是每一道供需都标准化了,因为他是由一个工人完成的。更重要的是他把不同的工序在不同的空间上同时完成,缩短了制作时间,也就是减少了客户的等候时间,所以这家汉堡店顾客盈门,每年都向纽约的奶昔机供应商订购最多的奶昔机。

  这个纽约商人叫做克拉克,他大受启发,马上跟加州的汉堡店的老板讲,说你想退休吗?老板说我还年轻,我还想干。他说你别干了,你要多少钱?我把你这个店买了。出了一个很高的价钱,汉堡店的老板拿着钱高高兴兴环游世界了,他把这个店买下来以后,把这种生产方式推广到全美国,一家一家地接着开店。这就创造了快餐业,这就是麦当劳的由来。

  你看一下麦当劳的创新,用了高科技了吗?没有任何的高科技。就这样造了一个大市值的公司,而且创造了一个全新的快餐行业。今天我们看到的快餐业肯德基、汉堡王等等,全都是学的麦当劳。麦当劳是第一家。所以传统行业照样可以创新,没有高科技同样可以创新。

  这是我们企业在创新的道路上需要澄清的一些误解。当然还有刚开始的第一个误解,那就是“转型就是转行”,错的,转型不是转行,只有在一个行业专注地去经营,长期地去耕耘和积累,才能发现你那个行业中的痛点问题是什么,才能够针对这些痛点的问题找到有效的解决方法。德鲁克在这本书里面举了很多的例子,他都说明:创新需要专注。创新不一定需要高科技。

  最近我在下面看了很多的企业,中国的企业还是有希望的,我之所以到深圳来心情比较愉快,也是看到了一些企业在积极地思考如何进行创新。从这些企业身上我看到了中国经济的未来,一回到北京,全都是雾霾,未来是什么都看不清。

  我看到的中国传统行业的创新,有的用了新技术,有的没有用新技术,照样做得不错。比如说有一家火锅店叫海底捞,我在深圳也去过海底捞,发现他确实有创新。去过海底捞的发现海底捞的发现在哪里?服务非常好。他的服务和其他的企业、和其他的这一些餐饮业的服务不一样在什么地方,我个人感觉,作为客户的体验跟大家分享一下。

  我个人感觉他的服务恰到好处,并没有高高在上,也没有低声下气,我们的中国服务业就是这两个极端,比如你一进门他点头哈腰说“先生您来了”,弄得你很不舒服。海底捞的服务让你感到很亲切,恰到好处。海底捞最难得的是,你到全国各地哪一个地方的海底捞去,他的服务一致性很高,基本都是这个服务,并不是说深圳这个地方的海底捞的服务让你感到舒服,济南那个地方又让你感到难受,不是的,他全国都是一样的。

  这要求公司的人力资源管理一定是有他独特的地方,我没有做具体的深入调查,也就是说海底捞在人力资源管理上做了创新,这也是我们讲的创新的一个内容。我还观察发现,海底捞有一些小的创新积累起来,就使得他成为一个区别于竞争对手的品牌。吃火锅有一个客户痛点,油烟。于是有一些火锅店就在涮锅上面架了一个吸烟机,但是噪音太大。本来几个朋友周末约了到餐馆里去聊聊天,把抽烟机一开声音很响,彼此聊天气氛都没有了,因为你要喊着说对方才听见。海底捞没有那个罩子,他的油烟怎么解决?他的油烟解决是在涮锅的周边全开了槽,油烟一出来就从涮锅周边的槽吸走了。你用大罩子我不用大罩子,我在涮锅的边上开槽,开风口,把油烟抽走,这就是创新。微小的创新可以积少成多,最终客户能够体会到,你这里跟别人不一样。所以我出差但凡想吃涮锅的时候一定会先找海底捞,然后再考虑其他家。这个就是创新,他没有什么高科技。

  在互联网的时代大家都说你要不上网你就得死,大家都要触网。谁说的?为什么要上网啊?说互联网是一个强大的销售工具,是吗?互联网是强大的销售工具,但是我们为什么看到用传统销售方法手机公司照样可以做得很好?小米是网上销售的,中国去年手机出货量是怎么排名的?第一名Oppo,第二名Vivo、第三名是华为,接下来才是互联网销售的小米。华为、Oppo、Vivo全都是传统的销售渠道。我并不是排斥互联网,而是说互联网他仅仅是一个工具、是一个手段。在商业、在市场上到底用什么样的手段、运用什么样的技术,取决于我的综合成本和综合效应的分析。没有必要一窝蜂地去上网,有的时候传统的方法反而比互联网更加有效。

  我可以举出很多的例子来,当然你要是能用互联网我还是建议大家尽量地用,可是在我这里是不存在互联网思维的,我和互联网界的朋友们经常交流,我们也经常争论。我和马云争论过,我和周鸿祎争论过,我坚决否认互联网思维的存在,我认为互联网没有什么思维,互联网是有思维的人手中的一个工具,它本身没有思维,就像蒸汽机没有思维一样,看你怎么样去用它。

  下面我介绍一个传统行业,运用互联网和数据技术对资深进行改造,取得了非常好的效益。给在传统行业工作的朋友们增加一点信心,当然我这并不是说否认互联网行业、移动技术以及人工智能,今后他们会是非常活跃的创新领域,我不否认这一点。但是在这个领域之外的企业照样可以进行创新,只是想说明这样一个观点。

  这是一家服装企业,多传统啊,做衣服的。但是他做的衣服和一般的服装企业有点不一样,他是做定制西服。我们知道过去做定制西服都要去裁缝铺做,给你量完尺寸裁缝自己到布上把你的尺寸画成版形,然后拿剪刀裁下来再缝制。这样的商业模式痛点在哪里?交货期长因为要手工师傅一件一件去做,时间有时候是一到两个月。第二个统点是什么?贵,价格高,不方便,我要到裁缝铺去,而且贵。一套好一点面料的西服现在国内要多少钱?接近一万吧。交货期快的一个月,慢的两个月,我在香港定的西服要一个半月才能寄到我这里。

  这家企业解决了痛点的问题,这个行业之所以慢、之所以成本高,是因为有经验的裁缝师傅很有限,他做不过来,而且有经验的裁缝师傅成本是高的,他要解决这个问题。用什么方法解决?用大数据。其实数据也不算太大,跟自动驾驶汽车的数据相比简直不是一个量级的。

  人进去以后先三维扫描,当然现在精度还不够,还是需要人皮尺去量,如果他将来的技术过关的话三维扫描可以了,往那儿一站两秒钟扫描,扫描完了就把你身上的尺寸都输进计算机。输进计算机以后,他不是靠有经验的师傅根据你的肩宽、臂长去打版,去裁布,不是的。而是从数据库里调出和你的身材最接近的版形,然后用一种算法来缩小那个库里的版形和你尺寸之间的差。也就是用计算机设计。

  这张PPT上可以看到,上面那两片是一个裤腿,下面那两片是另外一个裤腿,不需要有经验的裁缝师傅,这些小姑娘进来了训练一下就可以做。前提是什么?数据库。前提是你的数据库要足够大,要能够存了足够多的样板,使得在库里我可以提出一个版形和你的身材是最接近的。数据库越大,适合我身材的版形就越多,然后再用算法做一些调整。

  这个设计就完成了,不用有经验的老师傅再琢磨,因为你的身材是三维的,他要把你三维的身材放在平面上,变成两维的尺寸和形状,这个是需要一点经验的,而且两维的布裁出来之后锋起来还特别适合你三维的体型,他有一个三维到两维的转换,再从两维到三维的转换,这个转换不是靠师傅的经验完成的,而是靠机器完成的,这就是他创新的地方。

  这个尺寸一设计完了,加工指令自动地送到了数控裁床,下面铺上布,上面盖一个塑料薄膜,底下一抽真空,就把布放在裁床的面上,由中央控制的切割头一片一片地把布给裁出来。裁好了布以后,最右边的这个工人把每一片布上钉上一个IC卡挂到了流水线上,开始在车间中游走,物联网的概念。每一片布走到什么地方,它目前的状态是什么,系统里面全都有数据。

  这个布片就在挂架上走,走到了这个工位上,这个工人把这片布拿下来,IC卡在机器上一扫,屏幕上显示的就是他应该在这里做什么样的加工。开扣眼的、锁边的、缝制的,清清楚楚。加工完以后再把卡一扫挂回到流水线继续往下走。

  最后的成品从颜色上、款式上、尺寸上,没有两件是一样的,全是个性化的,根据你的需求定制的。他把手工操作的定制的服装变成了工业化的流水生产,结果是降低了一半以上的价格,1万块钱的西服现在卖不超过5千。交货期从1个月缩短到7天,保证7天交货了,如果晚到甘愿受罚,他承诺了一定做到。这就是用了一点数据技术来改造传统行业,取得了这样的效果。

  我们讲创新需要专注执着的“笨人”,专注在你自己的行业,像华为这样的企业专注,几十年来如一日做通信设备,不炒股、不卖楼、不做金融、不上市,大家说华为太高大上了我们学不了。老干妈行吗?人家就做辣酱,也是不炒股、不卖楼、不做金融、不上市,人家把这瓶辣酱卖到了全世界,无论中国人走到哪里,都可以买到老干妈辣酱。我在悉尼、纽约、巴黎都可以买到老干妈的辣酱,他的全球销售体系一定有独到之处,他是怎么做到的?所以我们不要妄自菲薄,觉得自己所在这个行业没有什么好做的,一定要跨界转移到高科技行业中去,不是这样的。就在自己最实际的行业中我们照样可以创新。

  我们看到一些国外的企业在跨界,我们自己也想学,其实这些国外的企业根本就没有在跨界,我们没有仔细地去观察和分析。

  比如说谷歌,谷歌做搜索引擎的为什么做自动驾驶汽车,引得我们好多的中国企业根本就没有汽车行业的经验,现在都纷纷做起了电动汽车和无人驾驶汽车。我说你有什么技术积累可以做无人驾驶机车?谷歌为什么可以做?谷歌之所以做无人驾驶汽车,因为无人驾驶技术正是谷歌的畅想,谷歌没有跨界,而是把他的核心技术延伸到了自动驾驶上。自动驾驶用的是谷歌的图象处理技术,图像和数据处理的技术这正是谷歌搜索多年来积累的优势所在,所以他没有跨界。你不能把谷歌的汽车看成是一辆汽车,你应该把谷歌的汽车看成是一部强大的数据处理器,因为他通过声光电各种各样的传感器在识别周围的环境,有的是图像,有的是声音,有的甚至是热能,他把这一系列传感器获得的信号输入到他的中央处理器当中去,判断我这个车周围都有几辆车在开,这几辆车的速度是多少,发生碰撞的概率是多少,进行快速地运转。当两辆车非常接近的时候,他做出判断驾驶盘拐弯。我们看谷歌的自动驾驶汽车视频可以看到,当一辆车离得特别近的时候它自动就拐走了。实际上他是根据传感得来的信号,对这些信号进行处理分析,然后做出操作的指令。因此谷歌的自动驾驶汽车实际上不是传统意义的汽车,他的核心是强大的数据和图像的处理器,而这正是谷歌的技术。

  我们的企业很多既没有做过车,也搞不清楚图象处理是怎么回事,他就贸然地冲进去了,那不找死吗?他有什么技术能力能够做这些东西?你不要看国外的企业,其实国外的企业他的跨界比国内的企业要少多了,他是以专注而著称的。

  小结

  总体来说中国的宏观经济现在没什么好看的,大家都说未来宏观经济有很多不确定性,在我看来未来宏观经济没有什么不确定性,非常确定的,就是L形的长尾巴,大家不必对宏观感到焦虑,焦虑的原因是我们难以把握,其实现在宏观我觉得很好把握。

  你就准备好L形的尾巴还有个三五年就好了,不必再为这些事情再花时间费脑筋去思考,要思考的是在长L形中企业怎么办,从过去的制造转向研发,从过去的市场份额转向思考创新,转向产品,专注产品、专注技术。以中国企业家的才能,以中国市场的巨大,我相信只要我们下决心转型,这个任务是可以完成的。而只有中国的企业能够创新,不断地保持活力,中国的宏观经济未来就有希望。

  我就讲到这里,谢谢大家!

-R/g2SI

-R/R2SL

Posted in 社会生活 | Tagged , , , , | 2 Comments

20:1, PHP性能评测Base62x:内置模块 vs. 脚本模块

上篇( -R/P2SN )我们概括地解释了使用服务器端、客户端各种缓存、压缩优化提速-gMIS等手段. 这次更具体到编程语言层面讨论优化。行文此前背景:
1.  -gwa2 vs -thinkphp, -R/92SJ
2. php的所谓优化, -R/22SK
3. 关于Log4j和Sysytem.out.println的性能比较测试, -R/I2SL

关于Java/PHP的性能评测和优化,大致结论是面向对象编程(OOP)等是拿性能换便利(Convenience)、强壮(Robustness)等,除了描绘客观复杂世界所需外,深层的另因可能是硬件性能越来便宜,而人工越来昂贵。本文可以看作是其中 2. 的接续,尝试探索的是,在PHP编程中,使用C语言等实现的Module/模块(内置模块)比PHP脚本写的Module/模块(脚本模块)快吗? 如果快,同样的功能,能快多少?

距离上次进行类似的测试,已经十多年过去了,PHP和Java都发展了很多版本,日益成熟和稳定,而C语言却保持了相对的稳定,现在重新做一些这样的性能对比,颇有时空感。

要做这样的实验而且有一定实际意义的话,机会要等或者碰的,此前进行的将 -Base62x 进行多版本语言开发工作,刚好能满足这一实验的目的。我们成功将地C语言的 -Base62x 编译成PHP 7 的一个ext模块 ext/base62x ,同时也使用PHP脚本语言实现了 -Base62x 的版本,名为 base62x.class.php, 相应地代码都可以从 -github-wadelau 下载获得。

有了这些准备工作,我们要进行的实验是使用同样的算法,对一段文本进行 -Base62x 编码,C语言实现的PHP ext/base62x 模块会比使用PHP脚本编写的 base62x.class.php 运行得快吗? 能快多少?

基于此,我们编写了测试程序,进行一万次随机字符串的 base62x 编码,将其运行耗费时间进行记录对比。

测试程序主体, basetest.php
使用base62x.class.php的编码方法, 
      $b62x = new Base62x();
      $s_encoded = $b62x->encode($s);
使用PHP内置C语言实现的同样算法模块base62x.c的编码方法,
      $s_encoded = base62x_encode($s);

使用C语言的模块需要重新编译PHP的安装目录对应的程序,关于编制PHP扩展模块的详细操作参考,-R/d2SH , -R/M2SJ .

分别使用上述方法进行10,000次编码,使用PHP的内置函数microtime进行计时,记录每进行10,000次编码操作时,两者所花费的时间,重复进行10次,记录列如下。

base62x.class vs. base62x.c for 10K strings encoded operations

  Time cost for Time cost for  
  base62x.class.php base62x.c  
1 0.15378499 0.006615877  
2 0.154273987 0.006779909  
3 0.161313057 0.00666213  
4 0.178726912 0.00667119  
5 0.193426132 0.007475138  
6 0.162053108 0.00752902  
7 0.169737101 0.00692296  
8 0.155719995 0.006750107  
9 0.164766073 0.007402897  
10 0.196639061 0.006860018  
      Faster x
avg 0.169044042 0.006966925 24.2637964
max 0.196639061 0.00752902 26.11748314
min 0.15378499 0.006615877 23.24483765

测试主机环境为普通台式机PC上运行的VMWare Station中运行的OpenSuSE Linux Leap 64bit,PHP 7.0.

运行数据显示,使用PHP脚本语言实现的base62x.class进行一万次编码平均需要花费0.1690秒,也即需要169.0ms;而使用C语言实现的同样的算法的base62x算法的一万次编码平均需要花费的时间为0.0070秒,也即7.0ms;两相比较,前者是后者的24倍,也即base62x.class比base62x.c多用了20多倍的时间,后者比前者快了20多倍。

进一步地拉长与之前的对比,PHP的优化思路,优化逻辑,减少不必要的操作步骤,减少自定义的方法、类库,尽量使用内置方法、类库,当这些还不足够快时,终极提速或者能有较大提速的就是使用类似C语言以PHP扩展模块的方式进行尝试。

针对这个终极优化思路,之前只是定性的分析,这次有了定量的分析,印证了之前的分析和推测。

结合之前提到的针对 Java 的 Log4j 和 System.out.println 对比,似乎这种终极优化也可以应用到 Java 的编程中,通过使用JNI调用Java对外部C/C++等实现的扩展,也能否取得20:1点提速效果,这还有待进一步地实验。

经次实验可以大致地得出,同样算法,使用C语言实现的PHP扩展的内置模块比使用PHP脚本编写的OOP模块要快很多,其比值大约在 20:1 左右。

Base62x: An Alternative Approach to Base64 for non-Alphanumeric Characters.
Base62x 是无符号的Base64编码方案。在文件系统、网络系统中可以安全地使用,同时是各种变种Base64编码方案的理想替代品。

Posted in Base62x, 编程技术, 计算机技术 | Tagged , , , | Leave a comment

-gMIS 吉密斯 升级:增加缓存,按时间快捷检索和全局SessionId等

这是 -gMIS 吉密斯 发布以来比较大范围的更新的一次,这篇文章也前后写了三周,一是忙,二是要记录的内容多,分别有如下几点:增加客户端、服务器端的缓存,增加压缩输出进行页面加载的提速,增加全局Session进行独立会话管理,增加新式的图形验证码方式,增加按照时间字段进行快速检索的功能等。备忘如下并分述之。

0. 提速:增加缓存支持,默认开启
0.1. 前端/客户端缓存
通过HTTP的Cache字段将页面中不经常修改的资源文件缓存在客户端,从而实现更快速的页面加载,这些资源文件包括JavaScript、CSS和图片Icon文件等。例如,在 HTTP Response 中增加这样的设置。
        Cache-Control: max-age=604800
0.2. 网络层缓存(CDN)
通过将服务器端端页面内容缓存在距离终端用户较劲端ISP端的网络层,从而实现较快的访问,这超出编程的范围,将在另外的篇章讨论。
03. 后端/服务器端缓存
服务器端缓存是将从第三方资源提供方获得端资源缓存在本地,以内存热备的方式使得第二次同样资源可以较快方式获得。第三方资源包括读取文件系统、数据库系统、其他在线资源等。
-gMIS 的服务器端缓存,主要依靠 -GWA2 的缓存接口实现,其中的实现细节描述在 “-GWA2 更新缓存调用built-in cache方法”( -R/r2SH )。
-gMIS 服务器端端缓存主要缓存一些辅助设置端查询,如动态菜单、路径导航、对象表结构描述、select选项等不会即时改变,也不需要实时显示修改状态等数据,对于当前对象表的数据则不能进行缓存,这由于 -gMIS 管理信息系统的性质所决定的,增删改的动作需要即时反应出来。
页面缓存及提速的思维导图可以描述为下图所示。

(页面缓存及提速方式方法)
上述设置分别在 inc/config.class 中进行开关设置,默认开启,可以进行在线开启或关闭。

1. 优化:按时间检索快捷方式
增加按日期滚动的快捷检索方式。对于具有时间属性的对象表,此前提供了按月滚动管理的功能,也即总是按一定规则显示当前月份的数据表,而且在功能区增加对过去三个月的链接。
本次修改,进一步地对具有时间属性的对象表,提供针对时间属性的快捷检索方式,如按天的“今天”,“昨天”,“本周”和“上周”。
区分处理日期/时间戳。对于时间属性是按天或者按小时,按分钟的情况分别进行特别处理。
‘rotatespan’=>’rotatespan’, # table names contains variable datetime, e.g. _201412, _201501, Mon Jan  5 15:31:29 CST 2015
‘searchbytimefield’ => ‘searchbytimefield’ # provide timebased search buttons

2. 优化:增加自我独立Session的实现
减掉对外部/第三方session管理的依赖。经过多方实验,最终选择使用自身提供了一种使用全局携带sessionId(sid)的访问鉴权方式来实现安全认证及会话管理。由于目前需要动态管理的用户信息并不多,主要是当前用户端User Id,可以不依赖第三方会话Session进行管理。
在此之前,-gMIS 一直是临时使用PHP的内置Session进行会话管理,也即在页面的Header部分启用
       session_start();
这种方式在单机实验阶段会运行良好,但在实际生产环境中或者在多个应用服务器组成的负载均衡中却无法使用,需要真实的第三方Session服务会话进行管理。
这次使用一种全局携带Session Id的方式实现Session 会话管理,这种方式在此前的应用中进行过部署,可以穿越各种网络环境,甚至是那种不能透传Cookie的网络环境,其健壮性较好。同时,也提供了基于Cookie的复用。
这样的改动,几乎需要在所有的页面所有的链接中修改增加Session Id,因此改动较大,同时修改后还需要逐个功能点点实际测试,涉及到的工作量挺多的。

3. 优化:探索使用基于单向Hash的图形验证码方式
不再依赖第三方存储信息的方式提供图形验证码服务。这个思路与上一点类似,想彻底摆脱对外部第三方Session会话的管理。传统地对人机验证作为会话管理的一部分,需要先生成问题/答案,存储在Session会话服务器上,然后进一步地等待用户回答,然后进行比对判断。
本次尝试实现一种全新的,基于消息摘要的人机验证方式,后续会继续整理完善成一种可以复制的应用,形成一篇安全类研究文章。
基于消息摘要的人机验证方法不需要第三方Session会话服务器进行问题/答案的存储,减少对第三方的依赖,供应链越短,质量越容易保证。

4. 提速:增加内容压缩后传输
在内容输出前进行压缩,然后再前转交给HTTP Server进行发送,实现传输内容最小化,从而达到页面加载提速的目标。根据在0节的图示描述,页面提速一方面是进行缓存,另一方面是减少页面尺寸(压缩),还有就是将要更新的内容进行局部分割,只更新需要修改的地方,后者已经通过Ajax实现。
这次的主要改动是根据Request中的压缩支持信息进行相应的对内容进行压缩后传输。
如 HTTP Request,
        Accept-Encoding: gzip, deflate, sdch
则HTTP Response
        Content-Encoding: gzip
        Vary: Accept-Encoding

5. Bugfixings and Imprvs
javscript –> javascript
首页底部信息更加丰富
首页定时自动更新
pagenavi, getCondition兼容含有%的oppnsk

经过上述优化和提速,在普通网络环境下,-gMIS 的普通页面请求在服务器端可以做到0.0xx秒完成请求处理,服务器端的每次数据库查询次数减少约80%;页面传送到客户端并展现出来可以做到1秒以内,网络层传输内容压缩比约60%左右。

-gMIS 是一种基于 -GWA2 的通用管理信息系统软件,具有可配置的输入和输出接口。
可以在其上构建各种管理应用软件系统,如
内容管理系统(CMS),客户资源管理(CRM),  企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,如
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统等等。
实现零代码开发、搭建各种管理信息系统(MIS).

Lower Costs, 降低成本;  Better Productivity, 提高效率.

Posted in -gMIS, -GWA2, 编程技术, 计算机技术 | Tagged , , | 2 Comments

GWA2-Perl Warning: Reference found where even-sized list expected

“Reference found where even-sized list expected” 这是个恼人的 -Perl 编程中的Warnings信息。在实现 -GWA2 的Perl版本时遇到这个问题,而且走了弯路,兹分析及备忘如下。

这个字面意思翻译为在期望为偶数元素列表的地方,发现了引用类型数据。

之所以恼人可能是由于debug时,需要弄清楚函数/方法调用时的pass by value 和pass by reference的异同,而这个细节在越来越“高级”的编程环境中变得不常见,所以真正遇到了,就可能一时糊涂走弯路。
这个 pass by value /call by value 和 pass by reference / call by reference 可以单独开一篇讲,兹简记如下:

“When a parameter is passed by reference, the caller and the callee use the same variable for the parameter. If the callee modifies the parameter variable, the effect is visible to the caller’s variable.

When a parameter is passed by value, the caller and callee have two independent variables with the same value. If the callee modifies the parameter variable, the effect is not visible to the caller.”
pass-by-reference-vs-pass-by-value-animation.gif (500×270)
-R/j2SL

0. 背景知识,Perl中的Hash及Reference
%hash
Instantiating it: %list = (“steve”=>23, “fred”=>38);
Instantiating a reference to it: $ref = {“steve”=>23, “fred”=>38};
Referencing it: $ref = \%list
Dereferencing it: %{$ref}
Accessing an element: ${$ref}{“steve”} or $ref->{“steve”}
–> -R/n2SI

1. 问题
在 GWA2 的设计中,数据及资源的流转需要经过对象object –> 父类webapp –> filea/ dba –> filedriver/dbdriver –> 实际行为及数据。
gwa2-perl-drafting-dba.20170101.jpg (1142×1073)

这个流转过程中,一个较好地承载数据结构是Hash,Key/Value组对,而在Perl的对象和方法等参数传递过程中,是不支持Hash等,如果将一个Hash作为参数进行传递,则该Hash等key/value会被顺序铺列到一个默认的@_数组中,也即如果期望是这样的:
mysub(my %myhash=(‘k1’=>’v1’, ‘k2’=>’v2’));
而实际运行的结果会等同于这样的:
mysub(my @myarray=(‘k1’, ‘v1’, ‘k2’, ‘v2’));
于是,理想的参数传递就不能使用常规的pass by value, 而要使用pass by reference, 也即,
my %myhash = (‘k1’=>’v1’, ‘k2’=>’v2’);
mysub(\%myhash);
魔鬼般的细节就在这里,产生了类似
Reference found where even-sized list expected
这样的错误,其只是一个warning,但在追求完美的coding style中,warnings是不可接受的。

2. 解决方法
问题的本质是在赋值等号的两边,出现了value和对应的reference时,就会报这样的warning,这是输入方面出现不一致,还是输出方面产生的不一致,排解起来容易走弯路。
warn on ($s,%h) = (1,{}) as on %h = {}
–> -R/v2SJ
问题重现:
my %hash = ();
my $hashref = {};
%hash = $hashref;  #  Reference found where even-sized list expected

由于Perl遵循 no unnecessary constraints, 所以在对方法和函数的传值时,既可以pass by value 也可以pass by reference, 两者都是允许的,用起来也很随意,因此一不留神可能就会将reference赋值给hash,进而产生警告。在稍微复杂点系统中,debug变得有些恼人。正确的使用方式示例:

sub mysub($){
    my %result = ();
    ….
    return \%result;
}

my %hash = (‘k1’=>’v1’, ‘k2’=>’v2’);
my $hashref = {};

$hashref = mysub(\%hash);
%hash = %{$hashref};

3. 扩展
Evaluation Stratragy/求值策略: -R/x12SK 

-R/92SI

gwa2-logo-201606.v2.png (300×300)

gwa2-roadmap-201611.jpg (1224×703)

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

Posted in -GWA2, 编程技术, 计算机技术 | Tagged , , | Leave a comment

-Base62x 新增JavaScript版本及C/Java/PHP版本的完善

b62x-icon-201306.png (50×50)

Base62x-design-201702.v2.jpg (1025×557)
-Base62x 設計圖

-Base62x 在過去的2016年得到更多的部署和應用,也日漸穩定和成熟。在完成C/Java/PHP開發語言版本的基礎上,日前完成了JavaScript版本的移植,實現了在這四種開發語言中直接引用相關類庫即可應用。
C/C++:   base62x.c
Java:   Base62x.class.jsp
PHP:   base62x.class.php
JavaScript:   Base62x.class.js
相應的源碼已經開源發佈在 -github 上,地址為: -R/a2SM . 
同時也提供了針對各個語言版本的測試程序。

base62x.java_.php_.javascript.manual.201702.jpg (721×377)
OOP編程方式的調用Base62x方法

base62x.c.manual.201702.jpg (771×449)
函數式編程調用Base62x方法

簡而言之,Base62x, 作爲無符號版本的Base64, 可以用在數字進制轉換,字符串編碼兩個方面,其中字符串編碼又進一步地細分為ASCII字符串和非ASCII字符串編碼

這次升級更新主要有如下幾點,備忘于此。

1. Base62x.class.js
增加JavaScript版本的Base62x的實現方法,在JavaScript的編程中可以直接調用該類庫進行編碼,更安全地傳輸非打印字符,如替換内置函數escape/uescape.

2. Base62x.class.jsp
完善對數字進制轉換的相關功能。
Base62x.encode(input, ibase);
Base62x.decode(input, obase);

3. base62x.class.php
完善和修正不等長數組處理函數的一處bug.
_decodeByLength

4. base62x.c
完善和修正了輸出數組聲明時的長度估算策略:
目標進制的字符串長度 = 源字符串長度 * log[源進制] / log[目標進制]

一些個Base62x的部署場景和應用實例。
a. URL4P:   -R/52SJ
b. MobXPc:   -R/92SH
c. gMIS:   -gMIS, FileName Encoding && Login Redirect

d. GWA2:   GWA2, Zea.class, encoding after Zip
e. iAD:    -R/72SH  , Url Redirect
f. ToolBar:   -R/u2SI , Url Encoding

g. Dot-Base62x:   -R/X2SH  
h. URLEncode:   -R/U2SI

上面各種短地址中的ID部分就是使用的Base62x進行編碼的數字.

Posted in Base62x, 编程技术, 计算机技术 | Tagged , , | Leave a comment

新春愉快!GWA2 in Perl 初版发布

新春愉快!2017年农历新年第一天,GWA2的Perl版本完成首个版本。

距离我们开始在2016年11月份开始筹划GWA2的Perl版本,大约2个月的时间过去了,这期间,我们对GWA2的软件编程框架设计进行再梳理,在继续完善GWA2 in PHP 和 GWA2 in Java的同时,开发了GWA2的Perl版本。逐渐形成了GWA2的发展路线图。


(GWA2的发展路线图)

GWA2 in Perl 的首个版本支持使用Perl在CLI模式下对数据库的操作,这是一种常见的应用场景。其驱动力仍是像此前描述的那样:

“此前在开发人民网的一套新闻转载发现系统时就多次有念头要对perl的代码进行封装和重用。最近又遇到新的使用perl的开发,居然还要从dbi写起,这太低效率了。PHP版本的gwa2的命令行模式的成功部署和运行很诱人,于是就有了perl的gwa2的实现。显然,这只是个开始。….”

在进行Perl版本的GWA2的实现时,也有很多挑战。-Perl 是一门古老而有年轻的编程语言,距今已有29年的历史,发展历程可谓漫长,而且Perl是松散的,提倡多态和丰富,推崇一个问题总有多个解决办法的文化(TMTOMTD)。Perl对面向对象(Object-Orienatied)支持并不是很好,首先对一个问题是是否引用第三方OO的类库,比如MOOSE,开始之后还有更多的支持与选择,近30年的Perl的发展,使其一方面有大量的成熟的类库,另一方面也有一些历史的遗留问题。

对于这些,GWA2的Perl版本只好保守地从基本功能做起,面向需求驱动,预留和开放相应接口,点滴积累,以其有所成,为Perl社区添砖加瓦,为Perl开发提供一个全心的视角。

Perl6正雄心勃勃地走来,对比太老的Perl5系列,Perl6又显得太年轻。在这个节骨眼上推进GWA2的Perl版本,忐忑和纠结是常有的,不过我们还是提供了一个Tutorial供开发者参考。

Programs Written in GWA2 with Perl

0. data
create table prefix_dummytbl(
    id int(12) not null auto_increment,
    iname char(255) not null default ”,
primary key (id),
unique index uk1(iname));

1. object
mod/DummyModule.pm
use parent ‘inc::WebApp’;

2. controller
ctrl/dummy.pl
use mod::DummyModule;
    $act=listen
    $act=speak
    $act=remember
….

3. view
view/default/dummy.html

4. routing
/path/to/perl /path/to/project/index.pl “?mod=dummy&act=listen&fmt=json”

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

Posted in -GWA2, 计算机技术 | Tagged , , | Leave a comment

-gMIS更新:数据透视和hasId等

 

接續上月對 -gMIS 的更新,繼續完善和豐富 -gMIS 的相關功能與特色。這次主要更新包括實現一種聯機分析處理(OLAP)的數據分析透視功能,另外還有實現了對hasId的擴展,以及其他一些細節完善。

按慣例先關心環保,北京的天氣依然是霧霾重重,而且漸次嚴重,2016Dec17,北京霧霾紅色預警,汽車單雙號限行,中小學停課,預計此次空氣污染將持續5天左右。

1. 數據透視及統計分析,pivot table

聯機分析處理(OLAP, Online Analaytical )是與OLTP對應的一種術語。它與數據分析、數據統計密切相關的應用程序或系統。通常情況下,管理信息系統(MIS)關注的更多的是OLTP(聯機處理程序)如作業的流轉、目標系統的管控等。OLAP本身有專業的數據分析及處理程序來做,比如SPSS,Tableau等,也能夠在通用軟件入 Microsoft Office Excel中看到透視表的功能(Pivot table)。

此前,我們在操作中曾經遇到過需要處理100萬條數據的複雜統計分析,這種數量級,在Excel中就比較吃力,甚至在Windows的作業環境下,文本文件處理程序如 NotePad, Notepad++等,打開這樣的文件也有困難。-Ufqi-dev 曾經列過類似軟件開發計劃。

 

本次更新中,我們在 -gMIS 中增加了依托書庫查詢的數據分組查詢與透視功能。可以實現簡易的分組聚合,排序等數據分析的基本功能。能夠替代多數數據統計系統,實現部分OLAP的功能,與業務支撐系統相集合,可以提供更加簡便的決策支持。

gMIS的透視統計分析設計原型參考了Microsoft Office Excel中的 Pivot table,實現效果類似如下圖。

 

在 gMIS 部署實例中的透視功能截圖。

 

遵循 Microsoft Office Excel中關於透視表的相關設置,減少用戶學習成本,同時進一步的減少了列項設置,變寬表為長表,降低了調用的複雜度,用戶使用時更容易入手。

對比Excel的四個步驟,gMIS透視減縮為兩步三塊的設計:1)在pagenavi中根據高級檢索功能,篩選出結果集,然後在結果集頁面上,點擊“透視”;2)在透視界面上,選擇分組項,求值項和排序項,然後遞交可形成長表。兩步是先篩選,后分組。

2. hasId擴展

hasId 是 -gMIS中 的一個全局變量,用於標識某個被管理的數據表/數據對象是否有全局唯一字段/鍵值。 按良好的設計規範,數據表應該有全局唯一的字段或鍵值。然而世界不總是“良好”的,有些時候gMIS接管的項目,不是從一開始,所以需要面臨沒有良好設計的數據對象。

比如一個常見的流水表,如果有唯一Id號,可以輕易地獲取某條就的詳細信息,或者修改、打印、刪除等操作,而如果沒有唯一Id號,事情就變得有些災難,如果設置了唯一鍵值,比如多個字段的組合,可以依照這些組合條件檢索到目標記錄;而如果沒有唯一鍵值,要找到目標記錄,幾乎需要用到所有字段作爲約束條件,即便是這樣,也很難保證就是目標要命中的記錄(考慮到有重複的情況)。

hasId模塊儅檢測到目標數據表沒有Id時,此前無法進行針對單條記錄進行操作的清空,取而代之的是報告一項錯誤,請管理員、開發人員增加一個id字段,或者通過xml配置文件,指定某一個字段履行唯一id字段的職責,通過myId來傳遞。

今次改進,即是兼容和擴展了這種可能,儅沒有id,也沒有通過xml指定myId,hasId模塊試圖去探測primary key和unique key,儅獲得相應的字段或者字段列表時,轉為hasId的情況。最糟糕的情況是檢測 primary key/unique key失敗,這樣, hasId模塊仍將繼續,取xml配置文件listcount指定的前n個字段作爲 unique key的字段,如果沒有xml配置文件指定,則使用默認的 listcount 值,也即前n=7.

簡而言之,目標數據表是否有良好設計(有無id),是否通過xml配置文件指定id,是否有primary key/unique key等情況,均被cover上,hasId擴展模塊獎對這些情況進行智能處理,系統robust更多一些。

one more thing, 智能再多一些,如果hasId知道了目標數據對象的unique key,那麽再檢索的時候,如果同時使用了unique key的字段,還有其他補充字段的條件,則其他補充字段條件就可以省略不計。 比如使用id查詢,如果再給定狀態,形成 id+istate的查詢,則istate應該自動被丟棄,如果id是unique key,就不同時存在兩狀態的同一個unique key的記錄。

3. 其他調整與完善

繼續完善和調整了首頁面顯示導航;

繼續完善了工作流相關模塊;

默認inserttime/updatetime為UI錄入時為只讀狀態,也即這些字段顯示后有系統自動生成。
也可以通過xml配置文件的readonly做控制。

增加filterReplace功能,與輸入validator不同的是,filterReplace是將輸入的内容使用給定的匹配模式(主要是正則表達式)進行替換,比如一個id期望值是數字1234,如果輸入了a1234,則validator會警告說不合法,中止流程並請用戶修正,而filterReplace則會“粗魯地”匹配出1234進行繼續,丟棄a,不提示,不中斷流程。這個有些類似與搜索引擎的智能修正。

 

gmis-logo-201606

-gMIS 是一种基于 -GWA2 的通用管理信息系统软件,具有可配置的输入和输出接口。
可以在其上构建各种管理应用软件系统,如
内容管理系统(CMS),客户资源管理(CRM), 企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,如
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统等等。
实现零代码开发、搭建各种管理信息系统(MIS).

Lower Costs, 降低成本; Better Productivity, 提高效率.

Posted in -gMIS, 计算机技术 | Tagged , , , , , | 4 Comments