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

        本文为许小年教授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

为什么火烧圆明园,不烧紫禁城

最近一直在看近代史,徐中约先生的《中国近代史》,唐德刚先生的《晚清七十年》,张鸣老师的《重说中国近代史》,端木赐香老师的《这一次我们又挨打了》。袁腾飞老师说过一句话:中国的历史教科书上,真实性不超过5%。以前我还不信,看过这些书后我发觉,袁老师说的这个数字有些乐观了。

就拿近代史上这件最让中国人恼火的事情来说吧:为什么圆明园会被烧?

在历史教科书上,中国的形象是一个清纯脱俗的少女,外面的英法美日都是些风骚贱货,整天欺负我们,亡我之心不死。1860年,英法联军打进了北京,烧毁了圆明园。这件事就是表明他们风骚贱货的最好例子。

这件事中国人一说起来都咬牙切齿,它被当成国耻写进了历史书里。然而,有一个问题我们好像忽略了:为什么英法联军打进北京后,烧的是圆明园,而不是紫禁城?

按理来说,紫禁城是皇宫,是大清权力的象征, 既然要放火,那应该放在这里才对。而且圆明园在今天的海淀,清朝时还是北京城的郊区,坐地铁过去都要十几个站。联军都打到紫禁城门下了,为什么不顺带烧了紫禁城,却要拐弯绕到郊区去烧一个皇帝的私人休闲娱乐场所?

在历史书上,这段历史没有细讲。十几年前张铁林、刘晓庆演了一个电影《火烧圆明园》,电影里也没有讲为什么要烧圆明园,好像圆明园莫名其妙地就被烧了。圆明园被烧的真实原因,好像被我们有意地隐藏了起来,有些不好开口的地方。那么英法联军为什么要烧圆明园而不烧紫禁城呢?

事情说起来其实也不复杂。鸦片战争后,中英签订了《南京条约》,十二年后,英国人又跑来找事了,要求修约。什么是修约呢?英国人觉得,《南京条约》都签十几年了,大清应该明白了自由贸易的好处吧?那么第一次开放的广州、厦门、福州、宁波、上海这五个通商口岸就显得不够了,英国人希望大清能把全国都开放了,实在不行的话,沿海大城市、长江沿岸城市都开放也可以。

而且《南京条约》规定,英国人只能在这五个城市活动,中国其余城市都不能去,英国人希望这回能在全中国畅行无阻。还有,两国最好能互派公使,我派个大使驻北京, 你派个大使驻伦敦,方便两国搞外交。另外,英国人还希望能向大清皇帝亲递政府公文,英国人以前想和大清最高领导人搞搞交流会晤,根本就没门,大清皇帝根本就不见, 各级官员也都踢皮球,没人理,英国人因为这事身子都掏空了。

这些就是修约的主要内容,按近代史大家蒋廷黻先生的归纳就是:“公使驻京,内地游行,长江通商,这是双方争执的中心。”站在国际角度来看,这是很正常的事,无论是今天还是在一百年的国际,这些早就成了共识。但问题是,英国人面对的大清,是一个自大自负、目中无人的政府。大清从来都认为自己是天下共主,是天下所有人的爸爸,英法美什么的都是海外藩属国,是咱儿子,儿子就要好好孝敬爹,好好低头做人,闹点事也不用当真。这就是鸦片战争后清政府根本没有吸取教训的原因。

而这几条里,大清最抵制的一条是公使驻京、亲递国书,因为英国人坚决不磕头,你要亲递国书还不磕头,做梦去吧。千万不要小看这一条,这一条可以说就是后来导致战争的起因。为什么清政府必须要洋人磕头呢,因为磕头已经不仅仅是一个动作了,它是大清皇恩浩荡的体现,是执政合法性的基础。洋人本来就是海外藩国,见到天下共主没有不跪之理。而且我天朝百姓磕头磕了几百年了,要是你们洋人不磕头,被我们老百姓看到,老百姓都觉醒了怎么办?清政府要求洋人不仅要磕头,还必须是标准的的三跪九叩,弯腰度数不够的不算。其它条款都可以商量,唯独这一条清政府坚持两百年不动摇。

所以事情会怎么发展已经很明显了。英国人跑来要求修约,清政府说,这个外务嘛,我们都是由两广总督处理,你们去广东吧。到了广东,广东大员说,哎呀,这么大的事要中央说话才行啊,你们去中央吧。在这之间,皇上和广东大吏们整天就在演戏对台词。踢皮球是中国人最拿手的事,广东踢到北京,北京踢到广东,英国人就在中间转,转来转去转了几年,快转出脑溢血了,英国人忍无可忍,决定出兵了。

用英国的头号中国通小斯当东的话说就是:“中国听不懂自由贸易的语言,只能听懂炮火的语言。”

用蒋廷黻先生的话说:“总而言之,外人简直无门可入。他们知道要修改条约,只有战争一条路了”。

于是英法联军就带兵来了,打到天津大沽口炮台,以四百人的伤亡占领了大沽口,清军阵亡两千。清军统帅叫僧格林沁,一向牛逼哄哄,认为英军火炮没什么可怕的。这下虽然输了,僧格林沁觉得没什么,不是武器装备落后的问题,是我们操作不够犀利,战术不够正确,走位不够风骚。

僧王不信邪,要死战到底。咸丰急了,跟僧格林沁说,老僧啊,别打了,“以国家依赖之身,与丑夷拼命,太不值矣”。

咸丰还说了句搞笑的话:“天下根本不在海口,实在京师”,意思是提醒僧王,天下之根本不在天津海口啊,是在京师啊,因为我在京师啊,你别搞错了,赶紧回来吧。

僧王一听,有道理,撤了。就这一场战役,就能看出大清君臣对自己和世界的知识水平。

天津守不住了,千万别让洋人打到北京啊,大清赶紧派人到通州跟洋人认怂,行行行,我们愿意谈判。于是两拨人就在通州坐下谈判。

谈判什么呢?呵呵,还是前面那几条,很明显这又是一次对牛弹琴的谈判。咸丰给前线谈判的大臣桂良说,你这一条不能同意,那一条也不能同意,别胆小,大不了再和洋人干一仗,怕个毛!

一个国家最高领导人是这样的智商,如何不悲剧?

英国人发现这完全是在对牛弹琴,果断不谈了,要求直接进京。咸丰一听,这还得了,这帮人胆子不小。于是跟前方的怡亲王说,英国人要是敢进京,你就把他们扣下来。

就是这么一个用屁股做出的决定,直接导致圆明园被烧。

1860年9月18日,也是一个九一八。这一天还在谈判,英国谈判团的团长巴夏礼跟怡亲王说,公使驻京,亲递国书,这一条我们是不会改的,你们看着办吧。说完后,跃身上马,扬尘而去,动作很潇洒。

怡亲王看着巴夏礼,卧槽,这么装逼啊,太嚣张了。于是跟僧格林沁说,皇上说了,他们要是太嚣张,谈判搞不定的话就把他们扣了。僧王姿势水平也不高,听从指挥,就把英国谈判团全都逮起来了,一共39个人。

最搞笑的大清给巴夏礼定的罪名——谋反。

说咸丰的这个决定是屁股做出来的一点也不为过。即使不说世界,说中国历朝历代,从来都是两军相争不斩来使,这在千年前就已经是国际法则了,哪怕野蛮的少数民族都是遵守的,这种例子举不胜举。而到了19世纪,人类已经大幅进步到文明社会的时候,竟然还发生这样的事,这让清政府的声誉和形象在西方国家严重下降。虽然清政府的形象本来也已经够烂了。

但是大清本来就是无视国际规则的,大清眼里也没有什么国际,所以咸丰还很开心,逮了人家的使者,觉得扬眉吐气了一回。僧格林沁抓着巴夏礼很高兴,妈的打仗你有火炮你牛,现在看你还怎么办。僧格林沁强行按着巴夏礼的头,让他磕了几个响头,满足了大清历届皇帝的梦想:终于看见洋人磕头了。

咸丰一看,擒贼先擒王,现在王已经擒了,咱们现在好好教训一下洋人那些小兵。清军出兵了,出兵的名义也很有意思——讨逆。

在通州八里桥,3万9千清朝骑兵出发,冲向2万5千英法联军。天真的大清准备趁着英法联军群龙无首,一举A平敌人。过程就不说了,说下结果:英法联军5死46伤,清方几乎全军覆没。

后来英国人在查看清军的军营时发现清军还在用弓箭和盾牌,说了一句话:“一个发明了火药的国家,竟然还在用弓箭作战。”

联军进了北京,马上就去解救那39个人。巴夏礼和秘书关在刑部大牢里,其他37人关在圆明园。联军在圆明园把这些人解救出来后,发现只剩下了19人,有20个已经被整死了。而且有些人的尸体被大卸八块,砍掉胳膊的,砍掉腿的,惨不忍睹。

后来有个幸存者回忆说:被逮的人里面有个叫的鲍尔比的《泰晤士报》记者,被抓起来后第四天就被整死了,尸体被扔到野地里喂野狗,吃光了。还有个安德森中尉,手脚被重度捆绑生了蛆,蛆一直蔓延到全身,精神错乱狂叫三天,死了。还有一个法国人,身上也生了蛆,蛆爬的他嘴巴、耳朵、鼻子里全都是,痛苦而死。这个幸存者还说,他在狱中数蛆,每天能繁殖1000只。

看到了这些场景,联军怒不可遏,对大清的野蛮忍无可忍。联军的总司令额尔金表示,必须要给清朝一个惨痛的教训。因为这些俘虏是在圆明园内被虐待而死的,所以要烧了这个园子。

当时,法国有个将军叫孟托班,他建议烧紫禁城。孟托班说,圆明园不设防,不算交战区,烧这里不好,要让清政府好好记住这个教训,那就烧皇宫,让他们更疼,才能记住。

但额尔金不同意。额尔金说:烧皇城,相当于烧北京,北京百姓又没惹咱们,为啥跟人家百姓过不去呢?圆明园是个私人园林,还是虐待我们俘虏的地方,就烧这里吧。

于是,圆明园就这么被烧了。烧之前,额尔金在北京城贴了张告示说:“任何人,无论贵贱,都要为自己的欺诈行为受到惩罚,18日将火烧圆明园,以此作为对皇帝的惩罚。与此无关人员不受此行动影响,唯清政府为其负责。”

清朝有个自媒体人叫汪康年,他写了个书叫《记英法联军焚劫圆明园事》,里面记载了一件好玩的事。英法联军在圆明园准备放火,却发现没有点火的东西,“各军并无火器,唯有水桶、水锅而已”。听说联军遇到了困难,附近海淀百姓纷纷带上火盆、秸秆赶来,助洋人一臂之力。汪康年记载,英法联军放火后,中国人跟在后面“到处引火延烧”,让火势扩大。这些清朝百姓完全不觉得圆明园跟自己有什么关系,最大的愿望是能跟老外一起多抢点宝贝出来。

这就是圆明园被烧的大致情况。皇帝为了自己不受屈辱,引来了一场战争,再因为自己的野蛮无知付出了圆明园被烧的代价,可以说这场战争是中国近代史上最无聊的一场战争。

但是,一百年多年过去,有些奇怪的事情却发生了:皇帝家的私人地盘被烧了,人家自己的老百姓跟着去打砸抢烧,一点不心痛,我们后人却恨得咬牙切齿;当年清朝皇帝本人的屈辱,突然变成了人民的屈辱,国家的屈辱,民族的屈辱。这是个不太好笑的笑话。

我们的历史书没有讲过这段历史。历史书的作用是培养我们记住圆明园被烧的仇恨,而不是让我们知道圆明园被烧的教训。这是比圆明园被烧更可怕的事情。


2016-12-10 夜深人静读历史

作者:李红豪
来源:李红小豪

-R/B2SI ,    -R/r2SJ

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

清澈鱼缸与清晰的吉娃兔GWA2

0.

污浊的空气

2016Dec04,周末的北京又是一个重度、危险的空气污染时期。 已经连续三四周是每逢周末就重度污染,而且日渐严重!我们需要做些什么?除了圈在室内,还能做些什么?

重度危险的北京空气污染

1.

清澈的鱼缸

所幸,室内除了养花草,经过小半年的努力,浑浊的鱼缸终于清澈透亮。

没想到养鱼还是那么费周折的,初期是了解鱼的知识,然后是鱼缸的知识,再然后是水泵的知识,再然后是氧气的知识,再然后是水草的知识,“清道夫”的知识。这些还都不够,要构建一个生态,少不了要了解细菌及菌群食物链等。让鱼缸这次清澈见底,自建循环生态的关键一点是,用上了“超级硝化细菌”这样的大杀器。

Anyway,经历因为水体浑浊,金鱼们前仆后继的抗争后,世界清朗起来了。

清晰的鱼缸

2.

清晰的吉娃兔GWA2

经过近半年的思考和实践探索,逐渐明晰起来的还有 -GWA2 吉娃兔 的发展线路图。

GWA2 RoadMap / 吉娃兔发展线路图

GWA2 一种软件开发的范式,是跨编程语言的,是对软件架构的一种思路概括。更具体地,是对OOP编程的具体实践,在对象封装和代码复用的同时,实现与开发效率、管理维护的某种平衡。在其核心,提供了对运行时存储和持久化存储的分类管理,让开发者更加精力集中的关心业务逻辑,从而体现出E.A.S.Y的目标,Easy Along, Swift Yield,轻松启动,快速产出。

据上图,GWA2在编程语言上有二级版本,也即GWA2 in Java, GWA2 in PHP, GWA2 in C#等。在每一种开发语言下,根据运行方式的不同,可以划分为寄宿在Web Server中运行和单独命令行方式运行,如GWA2 in PHP就有两种运行方式,可以通过Web Server中调用运行,也可以在命令行下调用运行。

在寄宿于 Web Server方式时,又会有因为不同Web Server的不同而触发的不同版本。

在每种运行方式下,又可以细分为是否有GUI(图形化用户交互,Graphic User Interface)的子类。在Web Server中运行时,其GUI有基于HTML的表现层。在命令行下,如果没有GUI可以视作为一种后台运行的某种任务、服务;如果有GUI界面,可以看做是某种需要密集交互的用户应用——当然不是很严格的区分,有些后台服务,也有前端GUI控制台。

若在命令行下有GUI运行的情况,进一步地需要针对不同的操作系统来开发不同的终端GUI。

简而言之,GWA2的发展架构是多语言、多运行方式、多操作系统、多Web Server的一种软件开发设计框架,可以大致地划分为3级或者4级。

基于这些设计,GWA2可以用来构建一个网站或者一个管理信息系统(如 -gMIS )

可以用来写一个符合RESTful的API,

可以实现一个网络爬虫服务,

可以用来构建一个移动App应用或者桌面App应用程序。

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

-gMIS 更新多库连接及工作流workflow

 收到 -facebook 提醒说 -gMIS 没更新我才示意到有阵子沒有写关于 -gMIS 的内容了。

实际上,-gMIS 一直在更新,如下是几点值得书记的特色功能。不过首先要说的就是2016nov26,北京雾霾严重污染,pm2.5点指数300多。

1. 实现 -gMIS 的多数据库连接功能

得益於此前的 -GWA2 的多數據庫連接的升級,-gMIS 直接連接和操作多個數據庫成爲現實。此前 -gMIS 連接多個數據庫,衹是某種理論上的設想,並預留了全局參數 &db 在每一個request請求裏。遲遲木有落地實現,是此前部署的項目,多數為中小型項目,沒有多到必須同時連接和操作多個數據庫的需求。

這次有機會得以在具體項目中實施, -gMIS 同時連接和操作多個數據庫,其過程還算順利,將多個數據庫的連接及訪問權限,通過 inc/config.class進行設置,然後在訪問時,指明需要連接的數據庫實名或者假名,如 ?db=second_db&tbl=a_table,則該請求會將second_db的a_table讀取出來,並與環境變量、配置信息做merge操作。

連接多個數據庫的操作,主要分清 -gMIS 運行所依賴的 master_db/primary_db和所需要操作的其他數據庫。-gMIS 運行本身需要數據庫支持,比如存儲用戶賬戶信息、訪問權限信息和生成、管理輔助信息等。這一改動提現在 comm/tblconf 和 class/gtbl.class 中。

這種跨數據庫的連接,該是很基礎的一部分,更高層面的如果多個數據庫能夠實現跨數據庫的互操作,比如從a數據庫的b表中將c這條記錄的d字段值飛綫複製到a2數據庫的b2數據表中的c2記錄的d2字段中。

2. 实现工作流Workflow的簡易原型

在管理信息系統中增加工作流的想法由來已久,這次開始一個簡單的嘗試,增加了一個用於任務管理的todo list。至於一個task如何流轉,還在考慮和設計中。

新增的這個 todo list類似辦公桌案頭的便箋,來一件無法當即處理或者不需要當即處理,也即哪些重要但不緊急的事物時,可以臨時記錄一個便箋在案頭,到todo list裏,然後賦予其各種狀態(如待做、進行中和已完成等)。

顯然,距離實際的工作流Workflow還有好遠,實際的工作流應該是一個涉及多方、多個交互環節的工作/任務的流轉的過程記錄。這個需求也在 todo list裏。

3. 改进了桌面/默认页等細節

繼續改進優化 -gMIS 的默認首頁,增加了 todo list在桌面;

在進入目錄一層時,優化提現目錄下的功能模塊;

在“添加到桌面”為空時,優化顯示隨機模塊到桌面;

改進對 pnsc 和 pnsck 的編碼,使用 -Base62x 對其進行優化;

改進資源文件的路徑修飾,默認父路徑是當前管理後臺的 upld 目錄,增加設置為 srcprefix;

改進對默認時間字段的操作,如果是add操作則更新填入諸如insertdate/inserttime,createdate/createtime等字段;如果是edit操作則更新填入updatedate/updatetime等字段;

改進對字段的 trim 操作。

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

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

Posted in -gMIS, 计算机技术 | Tagged , , , , | 1 Comment

鸡蛋黄色的Orange和外教课english dict

Hanu顺利的完成入幼儿园的各种手续和检查,第一天、第一周坚持得很好,尽管到第三天有点不耐烦点情绪,但在老师和同学间还是控制自己很好,就是早上离家点时候有些不安点心情,也多会一晃而过。

第二周开始,居然从老师那里学来了,Apple,Banana的单词,并且在我带水果去上班的时候,认真地将水果用像不清晰的中文一样的语音把所会的两个单词表达了一遍。

最近有一次早上,我带他搭地铁去幼儿园,路上就从包里摸出一个小橘子?,问Hanu,这是什么,他很认真的回答是Orange,很赞。接着问又问,Hanu,对的,这是orange,那么这是什么颜色的呢?

出乎我带所料,他回答说是“鸡蛋黄色的Orange”。

观察Hanu长大的过程,与教育Yoyo的过程不一样,一是我的年岁又长了一些,同时视野也宽阔些,更重要的是,随着计算技术的发展,人工智能逐渐成为热点的研究领域,教会一个机器做某件事,是非常非常困难的事情。

当看到Hanu不几天的功夫就能在刚学会走路时,就能费力地爬上沙发。当其时在广州的大湄公河流域移动互联网论坛上,我还在分享AI的发展,MIT的一个跳跃的“机器豹”,对比人类的学习能力,机器或者人工智能真的还不能算是入门或者起步。一定要有某种或者某个节点的”顿悟“,才有突破。

适逢前周在中国计算机学会的青年科学家论坛上,聆听几位研究脑科学的教授给计算机学背景的同学分享了脑科学、神经科学的研究成果,所以当Hanu说出,他看到的Orange说“鸡蛋黄色”的时候,还是引发了我很多思考。

他的知识是怎么组织和管理的,他的逻辑是怎么关联的?显然他的词汇库里已经有了对“颜色”对模糊认识,但还没有能够使用和认识“黄色”的能力,这种情况是怎样一个过程形成了,Orange的颜色与他几乎每天都吃的鸡蛋黄产生了关联?

他应该也看到秋天的落叶(如满院子的银杏、梧桐河槐树)和黄色的衣服、鞋子、皮肤等,那些都是黄色,为何没有与Orange关联并用它们来描述?

都是圆的? 他的大脑的某种思维可能已经做了这种判断。

如果这个逻辑过程用人工智能的方式来实现会怎样?

Yoyo最近在上外教英文语言课,不是那种face 2 face的,而是通过Skype等在线工具进行远程教学。这种伴随着技术进步而带来的便利,是我们那时候学习所不能比拟的,我修习研读英文,也只有到大学才偶尔有机会与真实的外国人沟通。

我旁听了两次之后,提出Yoyo不应该再使用英中词典。当我只是提到这一点时,她似乎一下子就明白了,如果在与外教老师进行talking的时候,如果使用英中词典,相当于自己在额外地进行着“同声传译”,不会某个单词--查出中文意思--翻译成对应的英文--组织句子,她随即开始回想,原来之前“好强大”,好别扭,下次外教课上该使用english dict,英英词典——可能很多英语学习者一直以来都没用过或见过的,比如 -dict , -wordweb , or -oxford-dict。

我本要做进一步的解释,看来不必要了,她背后是怎么推理的?如果英文词典的解释看不懂会怎样?那些外企中中文对白夹杂英文单词时,真是为了“帅气”或者fashion吗?多数情况不是,真实情况是对中文掌握的没有英文好。翻译工作做得不好。语言是为了交流,当使用某个英文单词更能让交流顺利进行时,自然会被选。

再次回到上面说的那个计算机学会的认知计算的讲座,尽管都是中国人对中国人讲,但ppt基本都是英文,言语间也中英夹杂,实在是这样更容易理解和交流。

为何Yoyo自己之前没有反思?如果是机器逻辑来实现这种推理该怎么写?

人工智能的前景光明,其突破或者顿悟可能不在于对计算体系的构建,而在于人类对自我认知过程的深入学习与了解。上千亿(hundred billion)个神经元的大脑,大部分仍是一个个的谜。

也许模拟是起点和必由之路,装着装着就成真入戏了。

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

-GWA2 更新实现Filea和Perl版本的引入

2016nov19周末北京雾霾继续严重到重度污染!这次政府开始利用各种渠道提醒市民空气污染注意防护。继续在 -GWA2 上的更新,根据研发计划,这次结合实际生产需要,完成了 -GWA2 的Filea模块。截至目前-GWA2已经形成了完善的Dba,Cachea和Filea等模块,图例如下。

-gwa2更新多数据库驱动支持

GWA2 Dba

-GWA2 更新缓存调用built-in cache方法

GWA2 Cachea

这次实现的是Filea

GWA2 Filea

在早前,读写文件操作是通过 WebApp::setBy(‘file:’, $args)的形式来调用WebApp::readObject或者WriteObject来实现的。read/writeObject进一步的调用编程语言对File的读写操作,在PHP中,较完善的设施就是 file_get_contents和file_put_contents.

这样做并没有什么不好,而且使用编程语言的文件读写实现,可能效率还更高一些。然后某%

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

-GWA2 更新缓存调用built-in cache方法

-GWA2 更新增加对缓存的默认集成方法,使用额外指定缓存 Key 的方式可以激活缓存服务。

$cacheKey = ‘my-cache-key’;
$data = $gwa2->getBy(“field1, field2, ….”, “field1 like ?”, $withCache=array(‘key’=>$cacheKey));
或者
$data = $gwa2->execBy(“select * from tbl_a”, “field1 like ?”, $withCache=array(‘key’=>$cacheKey));

如此,则读取服务会首先根据指定的 $cacheKey 去读取缓存服务,若获得数据,则直接返回缓存中的服务;若没有获得数据,则进一步地调用读取外部数据如Database或者Filesystem, 也即

$data = $gwa2->getBy(“field1, field2, ….”, “field1 like ?”);
或者
$data = $gwa2->execBy(“select * from tbl_a”, “field1 like ?”);

经此被调用的读取方法,会在成功获得外部数据后,调用缓存的写方法,将数据写入到缓存中,已备下次相同请求数据 Key 的读取能够直接从缓存中获得。如此则实现了对缓存的默认集成,built-in cache.

大致流程及图例如下。

之所以使用集成的Built-in的方式,是因为如果启用缓存,在多个地方需要重复对GWA2::getBy/GWA2::execBy的反复调用,先使用缓存调用一遍,然后判断返回结果,若失败则再使用Db/Fs的读取一遍,再判断返回结果,如果是成功的则设置写入到缓存。大致流程如下。
$cacheKey = “my-cache-key”;
$data = $gwa2->getBy(‘cache:’, $args=array(‘key’=>$cacheKey));
if($data[0]){
    # read cache succ
}
else{

    # read cache fail
$data = $gwa2->getBy(‘field1, field2, …’, “field1 like ?”);
if($data[0]){

    # read db succ
$gwa2->setBy(‘cache:’, $args=>array(‘key’=>$cacheKey, ‘value’=>$data[1]));
 
}
else{
    # read db fail
}

}
上面的集成(Built-in)本质上就是对这些重复代码进行封装的操作,如此则让开发更快捷。随着实践的增多,或许稍后调用时,$withCache 的参数由一个带有 cacheKey 的数组变为一个 boolean值, 而 cacheKey 的生成则自动完成。也即,
$data = $gwa2->getBy(‘field1, field2, …’, ‘field1 like ?’, $useCache=true);

实现上面的操作,离不开 -GWA2 之前的更新操作,如 
gwa2更新多数据库驱动支持

受益于此,基于 -GWA2 的 -gMIS 将首先使用该缓存服务。

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

逻辑图的制作,使用 -cacoo 在线完成.

Posted in -gMIS, -GWA2, 计算机技术 | Tagged , , , , | 1 Comment

-Base62x Online 提供在线编解码


Base62x在线编码示例

0. -Bass62x 新近提供了在线对信息进行编解码的服务。想看看Base62x长什么样子,怎么用,使用 -Base62x Online / 在线编解码 马上可以体验。

1. 最近在 “-Base62x新增-PHP实现和-Java实现” 之后,陆续开始在 -gMIS 等系统中开始部署使用,并取得不错的效果。使用中,还在 -Base62x 的 PHP 版本中发现并修复了一个Bug。程序将变得更加健壮。

2. 同时,PHP版本的Base62x将被区分为PHP5和PHP7两个不同的版本,其中主要区别是PHP5不能在对象中声明常量数组,而PHP7则支持如此做。在GitHub上的版本为PHP7的版本,向下兼容需要将常量数组移动到和复制Base62x::encode和Base62x::decode两个主要方法中。

3. 最近遇到两个需求加强了我们继续完善 -Base62x。一个需求上在数字广告平台上,用户的一个click需要在不同的平台上进行跳转,这跳转的依据有时候依靠指定的 id/String来翻译地址(id/string等也需要进行编码),有的则直接将地址编码作为参数,两种方法都需要进行对URL地址做编码,在使用有字符到Base64过程中,“/”, ” “, “%”问题很多。

另外在改进 -gMIS 时,我们在JavaScript中对参数进行unescape时, 发现这个方法对“+”编码后,解码出来是“ ”,映射失败。 基于此,我们会加快推出Base62x的JavaScript版本。


Base62x 在线解码示例

 

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

-gMIS 更新:渐次滤出等四项


2016sep24周末北京雾霾日益严重到重度污染!圈在室内继续完善 -gMIS,本周主要更新四项,其中两项enhancements,两项bugfixs。

1. 检索渐次滤出

在进行按条件检索时,改进之前的无显示为友好显示为“没有符合相应检索条件数据”,同时列示所有检索条件。在每个条件后面显示滤出此条件的操作选项,类似在 -jingdong 购物拣选商品时的操作。这样可以友好地帮助用户在没有结果时进一步滤出某些条件,放大检索范围,从而获取到近似检索条件下的预期结果数据。

2. gtbl中前置带入resultset

在获取被管理对象表的设置时,有时候需要当前记录的数值,用以代入并做相应的更新填入,如生成一个超链接需要代入当前的ID则替换。THIS,THIS_ID,THIS_TBL等。此前的做法是每个字段级带入当前resultset参数,改进后,记录获取后,通过WebApp::set(GTBL::RESULTSET)将记录集带入到当前实例,每个字段级设置方法继承拥有可访问,无需再已方法参数形式传递。

3. registerAct兼容javascript的unescape bug

registerAct是 -gMIS 在使用 -GTAjax 的iframe模式时,需要将子窗口的javascript注册到父窗口。这一过程中,需要将待注册的方法进行unescape编码,这个方法有bug是空格编码后解码出来是+,目前针对这个bug做了修正,下一步使用 -Base62x 替换 unescape。

4. mkUrl 兼容非标准主键ID

在前期增加对非‘id’标注主键的被管理对象支持,延续修改了打印模式下等mkUrl在生成全局$url变量时,带入GTBL对象,通过 GTBL::getMyId()来兼容非标准主键ID的使用。

-gMIS (-吉密斯,-鸡觅食)是一套通用管理信息系统软件,基于一种创新的可配置的I/O来实现对数据表的管理,快捷生成各种各样的管理信息系统。

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