工程技术思维论

可能我们都听过这样的戏言:“我代表人民现在就枪毙你!”
这句戏言如果再展开,大致雷同于下面的对话。

对话1
法官:原告你被判定有罪,处罚有期徒刑1234.5年。
原告:冤枉啊,法官先生,我犯了什么法?
法官:请查阅《中华人民共和国民法典》相关法律条文。
原告:😡🤬…

对话2
某官网:网友你的文章已被删除,你已经被禁言1234.5年。
网民:冤枉啊,管理员,我什么地方触犯了你们的什么纪律?
某官网:请参考《某官网社区管理条例》相关内容。
网民:WQNMLGB. 👎 👎 

如果你对上面两个对话感到不适甚至愤怒,恭喜说明你已经具备了工程技术思维,懂基本逻辑,试图通过讲理与这个社会对话。尽管上面的对话1可能不常见,而对话2却是活生生的现实,网友朋友们或经常这么样被粗暴对待。
比如,你的贴子或发言,莫名其妙地被删除,你被禁言,被禁止登录等,尽管这对你来说是社区形象的生死攸关的大事,而管理员一方只是轻描淡写的废话一句,让你查阅社区管理条例。
不仅仅是网友在网络社区被各种无理由的粗暴对待,在社会生活中,这种例子也时常有发生。比如我们前几天购置了一台松不上的破壁机,收货之后,就开始各种安装调试,先是底座底部的螺丝松动,死活无法将上部与下部稳固合体。发挥理工男的优势,几经分析,上下部稳固合体后,接通电源,所有的操作选项,到“启动/确认”之后,都是”滴-滴-”两声的报错声音,再无其他任何参考信息。可以设想,这款破壁机产品经理的脑路是这样的对话.

对话3
破壁机: “滴-滴-” ,发生错误,无法继续执行指令。
用户:啥错误?
破壁机:请参考操作手册。
用户:操作手册上也只说“滴-滴-”是发生错误,啥错误?
破壁机:请参考操作手册。
用户: 😡🤬…

还不死心的我们,就接通了这款破壁机的客服电话,客服人员听完我们的描述后,首次启用就“滴-滴-” 报错,居然也一脸茫然,让我们送过去检修。检修是无法接受的,我们选择退货。
后来还是在退货时联系经销商的客服之后,才了解到盖子的扣卡方向反了,尽管也是密室扣合,但方向相反,传感器无法探知是盖上盖子了。

这又是一例明显的设计缺陷或者不具备工程技术思维的案例。其一,在设计上,如果这是检测的关键链条之一,如果反向扣,应该阻止用户扣不上,这样就不会发生扣上了也无法启动机器的情况。其二,在软件编程上,如果探测到是盖子卡扣的方向反了,应该给出具体的错误代码在操作屏幕上,并且在操作手册上列出对应错误代码的解释和解决办法。

这些分析让我想起那些设计优良的产品来,比如IT产业了很多硬件设计,通常不分正反插上都可以用,比如USB Type-C或电源插板插头等,如果区分了正反,插错了不能用的话,就禁止用户将错误的一方插入,迫使用户不能“犯错”,如网线接口,内存条接口,普通USB接口等等。
在软件编程上,这方面做得更好,出错信息大多会具体到某个文件某一行第几个字符上面,让人一目了然。也许真是在这种优良设计的“养尊处优”习惯了,当理工男碰上硬件设计缺陷加上粗暴的软件编程设计时,愤怒到退货、差评是必然的。

为了更好地标记提示、异常和错误信息,在 GWA2吉娃兔 ( https://ufqi.com/dev/gwa2 ) 中我们特意创设了以可读的时间戳作为日志标记的做法。具体行为是,在需要标注的地方,我们针对各种提示、异常和错误信息,分别给予一个特定的时间戳字符串常量,用以全局唯一地记录当前位置、语境。
当运行时环境发生变化,触发了相应提示、异常和错误时,GWA2吉娃兔在抛出相应错误信息的同时,也会同时给出相应的时间戳标记,凭借着这个全局唯一的标记,程序开发人员可以快速地定位到警报位置、语境,从而轻易地排解问题。

这就是工程技术思维的设计实例。受这样的理工思维影响,在处理社会层面时,就会产生误解、冲突和愤怒。在对话1中,良善的做法通常都会给出嫌疑犯所触犯的具体法条的详情,如根据某某法某某条某某款,这样让被告认罪受罚、心服口服。
如此才是法治、善治,是王权、宪法。

相反地,如果无法给出具体的法律条款或者规则等,则是人治、恶法或者欺凌、霸权。语焉不详地处罚,通常都包藏祸心、居心不良。其一,是对被处罚者的不尊重,不履行认真告知的义务,就是觉得不告诉你,不跟你“废话”,你能咋地?
其二,真有难言之隐,无法明确地告知被处罚者。可能这个处罚的事由根本不在任何已经生效的法律法规的任何条款内,可是出于其他不可告人的原因,还是要处罚一下,于是就利用这个大帽子来夹带私货,公器私用,公报私仇。

所以,任何以用户为中心的产品设计、工程实现,都需要具备工程技术思维,不要逼迫用户“造反”。

反例之一:粗暴对待用户

无论是其一、还是其二,这些语焉不详地处罚,都是不可接受的,作为普通用户,除了用脚投票之外,似乎别无选择。
如果有了具体的依据条款,还可以发起抗辩,针对类似“我代表人民就枪毙你”的处罚,你是无法做任何抗辩的。
稍微具备工程技术思维的人都应该明白,我们预期的社会准则是公开、公平和公正。非经法定程序不可以宣布人有罪,法无禁止即可行。套用到互联网络上,内容管理是正当的,经法定程序,公开、公平和公正的执法是必须的,毕竟互联网络不是法外之地。
然则,无法无天的执法在互联网络上是行不通的。如同前些年,谷歌搜索引擎撤离某大国大陆前曾经与管理当局协商过,极力争取留下来。
根据后面披露的相关信息,谷歌搜索( google.com )是同意进行内容审查的。因为谷歌搜索在美国、在全球其他地方都有对所索引的内容进行审查,应相关地方管理当局进行不合适内容的删除。比如儿童色情、暴力恐怖、毒品等反人类的相关内容,放之四海而皆准地对其进行审查和删除。

双方后续争论的焦点是进行审查和删除的操作方式。一方认为,内容审查和删除应该依法进行,根据公开、公平和公正的法定程序对搜索引擎所索引的内容进行审查和删除,审查和删除应该依据书面文书指令进行。
另一方则认为,内容审查和删除,不需要经法定程序,也不需要依书面文书进行。其对内容审查和删除的标准是没有标准,“我不喜欢的内容就是非法的,就得删除”。我想审查和删除相关内容时,不需要任何程序和文书,叫人来面训,或者打个电话要求审查和删除,你们就得执行相关命令,而且执行完了还不准记录下来,更不准公布出来。
这大概就是谷歌搜索不吃屎的故事的由来。

谷歌搜索不吃屎

用脚投票是一件好事,允许在貌合神离的状态下逐渐瓦解那些不讲理的邪恶暗黑势力。
如果这些能够帮助我们理解更多背后的故事,下次遇到语焉不详的处罚时,能够拒绝时则直接拒绝。不能拒绝时,要选择不配合,同时考虑替代方案。

你还要知道,你不孤单,很多人已经具备了工程技术思维。
作为产品设计或者软件设计,尤其需要具备工程技术思维,一不小心就会拒用户于千里之外。人类科技的发展,生产力的极大解放,社会逐渐处于一种供给过剩、有选择的市场之中。


-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architeture, https://ufqi.com/dev/gwa2/ )”,基于 -GWA2 可以轻便构建各种网络应用程序,
包括复杂的在线购物商城、在线医疗、在线教育、 旅游交易平台、社群或者社交网站和新闻资讯网站等,
也包括各种企事业单位网上门户,在线交互及服务作业系统等.
还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部.
-GWA2 是为数不多的支持跨开发语言的应用框架,目前支持 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for Native App, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

-GWA2 is E.A.S.Y 
Easy Along, Swift Yield
轻松启动, 快速产出.

发表在 -GWA2, 社会生活, 编程技术 | 标签为 , , , | 一条评论

医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌京东制作护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏

国债与信用货币

新冠肺炎疫情逐渐趋缓,打了有效疫苗的群体逐渐恢复了社交,世界似乎距离“接着奏乐接着舞”的时间越来越近了。2019年底新冠肺炎疫情爆发,我们从去年初开始写经济学相关方面的内容,距今这篇,已经是第九篇了,此前的相关八篇请参考页面下面的链接。

这第九篇是对之前一篇的回应和深入,在 治大国若过小家——写写王朝兴衰更替背后的经济账 ( https://ufqi.com/blog/political-reform-country-vs-home/ ) 一篇中,我们总结分析认为,王朝的兴替,其背后都是经济账起作用,每一个朝代政体最后几乎跟一个个具体的小家庭一样,是被穷死的。

细品之后,我们可能会有这样的疑问:
1) 既然打仗或者干别的大事,都需要钱,作为掌握货币发行权的政府/王朝,可劲地印钱不就行了吗?
2) 实在无法自己印钱,或者有所忌惮不想自己印钱,也还有借债(国家债务)这个路子,不至于活活的人让尿被憋死了?

适逢美国股市在新冠肺炎疫情爆发以来,延续十多年的牛市继续一路高歌,而同期美国的国债也一路水涨船高似的,不断突破之前的限制,屡创新高。说股市创新高,那是经济繁荣或是好事,债台高筑,无论是搁哪儿似乎也不能说“预喜”。
最近读了 美国国债200年( https://ufqi.com/news/ulongpage.3494.html?tit=美国国债200年:有借有还,越借越多 ) 和 货币、信贷与债务的关系( https://ufqi.com/news/ulongpage.658.html?tit=从货币、信贷与债务看变化中的世界秩序-3 ), 似有所悟,尝试解读或者回答上面的疑问,王朝/政府在穷途末路之际,为何没多印钱或者通过借债的方式,继续作战直至胜利?

从货币、信贷与债务看变化中的世界秩序-3
货币类型及演化趋势

A. 先来看第一个问题,为何王朝/政府缺钱的时候,不自己可劲地印钱?

回答是,他们也想,但是不行,那么搞,只会以加速师的身份,死得更快。

原因是货币本身“财富”的符号,之所以有“印钱”或者撒钱的说法,是由于货币已经脱离了其本身原来的形象——黄金或之前其他贵金属如白银等。 当用黄金做货币时,就没法“印钱”。不但古代技术无法人造出黄金,人类进入21世纪,在技术高度发达的今天,实验室已经可以人工合成造黄金了。不过,不好的消息是,成本太高,人造1g黄金,可能需要花费2g黄金的成本。

货币由起初的黄金,转为”银票“——银号/银行的票证之后,才有了”印钱”的说法。可靠的做法是有一锭黄金,发行一张面值一锭黄金的银票;不可靠的做法可能就是偷偷多发行几张。只是这作假太危险了,一旦被戳破造假,开弓没有回头箭,几乎只有作死一条路。背后是银票持有人一旦获知这个消息,会迅速整齐一致地要求将银票换回黄金,从而形成“挤兑”。

上述还是“金本位”时代的逻辑。货币的进一步发展,尤其是二战以来,世界承平日久,货币的发行已经不需要黄金了。那靠什么发行货币?回答是现代货币发现靠的信誉,或者信用。
一国的老大说,你看我们靠谱吗? 靠谱,就用我印的纸币当黄金用,你啥时候拿我印的钱回来找我换黄金,我都会给你。
至于这国他有没有黄金,有多少黄金,能不能给你兑换,够不够给你兑换,自行判断。
这就是信用货币。

这种趋势也可能是人类历史发展的必然。黄金作为货币,好是好,只是其出产量(发行量)不一定能满足经济社会发展需求,经济学规律大都强调个货币供应量要与经济发展速度相匹配。发行过多了是通货膨胀、货币贬值,发行少了也会阻碍进一步发展,是通货紧缩、经济衰退。数百年来,黄金作为无法人造的贵金属,它的出产量的确难以与全球、一国、一地区的经济发展速度完美匹配。( 从这里看,总量恒定的去中心化数字货币比特币是不是天生地与经济社会发展不匹配? https://ufqi.com/news/ulongpage.2781.html?tit=投资比特币缺乏令人信服的理由 )

既然有这样的经济学规律制约,黄金不适合作为货币,信用货币的出现就是应运而生了。同样是受制于经济发展,强调货币发行量与经济发展水平想匹配,掌握货币发行权的政府/王朝,不能没钱了就多加印,这是金科玉律般的红线。

所以政府/王朝末年陷入战争的泥潭,本就没有了正常和平年份的经济发展,本该是紧缩银根,减少货币发行量,这时候反其道而行之,不是加速作死吗?

B. 借债的疑问,王朝/政府为何不借债打仗?

战争是最耗费金钱/财富的,况且牺牲的每一个生命都是无价的。

然而对于不幸陷入战争的政府和王朝来说,不管是主动还是被动,必须迎战,必须花钱。
先打家底,国库充盈家底厚的可以自己扛几年,但也不一定够用,再厚的家底总会很快打完,又不能印钱,靠什么扛?
有路子!可以借债,国家向人借钱,比较冠冕堂皇,叫做发行国债。

国家债券发出来之后,得有人买才行。有人买了一国的债券,打仗所需的钱粮才有可支付的银两。国家债券的发行对象可以本国的机构、国民或者外国政府、机构和个人等。
在 美国国债200年 文章里,讲述了美国从开始就是靠借钱举债进行的独立革命,国内南北战争,然后进行建国,然后进行社会发展,一次次发行国债,每次都有人买账,真金白银地支持他们拿钱去打仗、去建设、搞开发。

有的王朝/政府,却没有那么幸运,其所发行的国债可能少有人问津,无人愿意雪中送炭地为他们续命。这就会归因到一个核心问题,举债借钱的核心是什么? 凭什么有的人能借到钱,有的人借不到钱?
事情再一次地归根到信用上了。有借有还,再借不难。
诚实守信吗?别搞撒谎欺骗。
有契约精神吗?别翻脸不认账
。
通常地民间借贷,还有个抵押物,国家债券,似乎少有抵押,多是纯信用借钱,而且一般利息还不高。

很难想象,一个威权政府/王朝一向高高在上的模样,会低眉顺眼地弯腰下来跟金主商量:“大爷能不能借钱江湖救急一下?小爷我摊上事了…”
这么样的“霸王”首先想到是可能是“加税”,后面说。
也很难想象,一个国家内外全是敌人的政府/王朝能借到钱。
相反地,公开公平正义的政府/王朝,即便是很弱小,诚实守信、有锲约精神,也一定能借到钱,甚至是更多的相同价值观的支援,无论是国内民众,还是国际上的友邦。

小结一下,发行国债是战时一国政府/王朝的上好选择,可以团结和凝聚一切有生力量,一旦让对方成为债主,就算是一条线的上蚂蚱了。
同时,战时发行国债,也是一块试金石,如果发行国债成功,说明一切还有希望,如果发行国债失败,束手就擒吧。
少些国成功了,一路有借有还的举债借钱,发展壮大,比如美国。
很多国失败了,所发国债国内外鲜有人问津,从此灰飞烟灭,比如大清国。( 参考 https://ufqi.com/news/ulongpage.3497.html?tit=权力恒久远,制衡永流传-2 )

C. 加税的疑问, 王朝/政府可以靠加税来继续打仗吗?

回答是这比政府/王朝自己印钱死得更快。
打仗本来是靠人头+银两,加税相当于把人头再减少点,同时加大内讧在内部再多招惹一些被迫起义的“敌人”。


总结,基于经济发展规律,旧有的王朝/政体的更迭总是伴随着垂死挣扎与负隅顽抗,和平的权力交接与政权更替是一国的福祉所在,也是全人类文明进步孜孜以求的向往与理想。
归属到本质上,是当权者在位时不作恶,事后不怕清算,自然可以放心交出权力于他人。
相反,统治者一朝大权在握,则无所畏惧,肆意践踏对手,背信弃义,自然会担心下野后必然遭到对手的穷追猛打,如此往复循环,仇恨怨冤相报,永无宁日。这实在是一国地狱模式。
更深层次的是在人的本性上,对自然的认知,对生命的敬畏,对弱者的怜悯。
所幸,经过漫长的成长与进化,一些国家政权已经找到和平权力更替模式,如英联邦,日本国,美利坚等。我巍巍中华,江湖的开万世太平的传说不应该是绝唱。


“货币,就相当于是政府发行的信用债!
朝气勃发勇于进取的帝国精神,才是英镑真正的信用之源,而不是英国皇家国库的那点子库存黄金。”
— 许小年教授( https://ufqi.com/news/ulongpage.105.html?tit=两脚羊殇歌——2017,开不动的印钞机 )

—-

这是温习经济学著作的第九篇习作,之前的各篇附列如下。

  1. 理性经济人在边际上做选择, https://ufqi.com/blog/economic-selection-on-margin/
  2. 写写年度收益率年均收益率和年化收益率-4, https://ufqi.com/blog/income-rate-annuals-with-buffett/
  3. 写写年度收益率年均收益率和年化收益率-3, 
    https://ufqi.com/blog/income-rate-annuals-with-yale/
  4. 写写年度收益率年均收益率和年化收益率-2 , https://ufqi.com/blog/income-rate-annuals-with-cic/
  5. 写写年度收益率年均收益率和年化收益率, https://ufqi.com/blog/income-rate-annuals/
  6. 治大国若过小家——写写王朝兴衰更替背后的经济账, https://ufqi.com/blog/political-reform-country-vs-home/
  7.  写写存款利率贷款利率和负利率, https://ufqi.com/blog/captial-rate-and-minus-rate/
  8. 写写1929年美国经济大萧条与2020年美国股市大跌, https://ufqi.com/blog/us-1929-economic-crisis-2020-stock-shock/

—-

 -R/82SN, https://ufqi.com/blog/treasure-credit-money/

发表在 社会生活 | 标签为 , , , | 2条评论

得力彩色铅笔油性彩铅学生用专业手绘48色水溶性彩铅笔24色画画笔36色小学生安全无毒水溶款绘画素描儿童铅笔医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌京东制作

惊魂一夜!有福新闻UfqiNews升级到PHP8

有福新闻UfqiNews的老版本依然运行在 GWA2 PHP ( https://ufqi.com/dev/gwa2/ )上,去年底PHP编程语言本身升级到了PHP8, 获得好评,我们即打算择日升级GWA2 PHP到PHP8版本。

考虑到之前关于升级的经验教训,任何开源软件,能够在生产线部署的,一定是当前稳定版本(latest stable release)的上一个版本,也就是上一个稳定版本的最新小版本。所以我们考虑将 有福新闻UfqiNews的GWA2 PHP升级的话,也不会直接去PHP8,而是先使用 PHP8之前的一个稳定版本PHP7.4.

又由于软件开发和使用,尤其是系统软件的开发和使用,另外一个黄金法则是能够运行就尽量不要去做任何修改(包括升级、优化等)。所以如果没有一定的动力的话,我们是不会去修改(升级、优化)一个运行正常的系统。

不幸的是,时过境迁,物换星移,人们对软件系统的改进期望是无止境的。很快我们就遇到一个需要通过升级来解决的问题:当前的UfqiNews ( https://ufqi.com/news/ ) 系统里在处理图片水印时,无法在WebP格式的图片上打水印。这也不是大问题,要求图片另存为其他格式也可以绕过去,毕竟WebP格式的图片还是新事物。可是看到WebP的发展势头,似乎普及起来也只是时间问题,加上对PHP8的神乎其技的“飞速”传言,我们就依仗“艺高人胆大”的脑门一热的开启了在 UfqiNews上升级PHP8的操作了,从而遇上了惊魂一夜,PHP8有不兼容的问题,尤其是看起来像是走退路的NULL值问题和数据类型错误抛出TypeError/ValueError。

PHP Built-in function count() Changelog ¶

VersionDescription
8.0.0count() will now throw TypeError on invalid countable types passed to the value parameter.
7.2.0count() will now yield a warning on invalid countable types passed to the value parameter.

PHP Built-in function explode() Changelog ¶

VersionDescription
8.0.0explode() will now throw ValueError when separator parameter is given an empty string (""). Previously, explode() returned false instead.

另一个受影响较为严重的PHP内置函数是 implode ,
PHP 7及之前,
$str = implode(“-“, $array);
# 能吃屎, 不管 $array 是啥料,都正常返回,继续程序 …
PHP 8及之后,
$str = implode(“-“, $array);
# 开始硬怼了, $array 类型不对时,直接抛出错误,撂挑子不干了!

PHP之所以雄起的“初心”之一就是有种“能吃屎”的精神,一个变量不管啥类型,都能顺利执行跑通,即便结果是非预期的,断然不至于将程序退出来,直接硬怼调用者说,“傻货,你输入的数据有问题!”

通常只有那些强类型的、预编译的语言的才有那么硬刚硬怼的底气,PHP之前是断然不会的。真是由于这种“有事私下说,有问题日志里打小报告”的平易近人,获得了很多小白初级程序员的喜欢,遇上互联网的东风,逐渐成燎原之势。PHP7及之前的程序代码,只要没有形式上错误,基本上都能顺利运行、跑出结果(或可能非预期)。繁琐复杂的编译、类型检查、内存申请与销毁、垃圾回收、数组越界、空指针、Nnll对象等等一些列问题,语言类库及API本身都做了一系列的努力,使之尽可能不终止程序的运行。

这种平易近人其本质是语言本身的类库及API对程序开发者、对程序使用者提供了异常情况处理工具,是某种包容精神的体现。程序员会搞错类型,终端用户也会手抖,网络也不稳定,操作系统也偶尔异常,输入的数据类型有问题似乎在所难免。

语言开发者这么升级改进长脾气地硬怼程序开发者,如果程序开发者不做异常处理,则就一路硬怼到终端用户那里。这显然是不行的,让终端用户吃瘪,程序员是无法交代的,程序员可以往回找语言开发者吗? 纵有理由千千万,简单易行的PHP,不该忘了初心,将这些繁琐的、基本的检查抛出来(而不是兼容处理消除消化掉问题),把强类型语言的“缺点”学来,作为“长进”。

这些背后可能是复杂和漫长的决策、权衡与博弈,其本身是某种方法论的对比,其本身都没有对与错,而是一些取舍和边际选择。这让我想起了我们在设计 GWA2 的API接口时的一些考虑,同时也在阿里巴巴和Google的一些Java语言规范( https://ufqi.com/news/ulongpage.1507.html?tit=Java開發手冊-阿里巴巴-嵩山版-2:編程規約 )中出现过。

比如在 GWA2 的主体方法与接口中,如果方法的返回值是基本类型( primitive scalar types ),应该是有个默认返回值,以上面 PHP 的 count 函数为例,我们预期的写法:
function int count($list){
int c = 0; # default or on failure
if(!isset($list)){ } # a waring
else if($list == null){ } # another warning
else if(!is_array($list)){ } # 3rd warning
else{
# count based on some rule…
c++;
}
return c;
}

如果是非基本数据类型的,如数组、列表或者Hash表、资源描述符等返回值( non-primitive compound types ),则应该是两个返回字段,一个字段标注是否成功处理,另外一个字段则是处理的实际结果值。以上面 PHP 的 explode 函数为例,我们预期的写法:
function array explode($separator, $string){
$rtnArray = array(); $rtnList = array;
$isSucc = false;
if(!isset($string)){ } # a waring
else if($string == null){ } # another warning
else if(!is_string($string)){ } # 3rd warning
else if($string == “”){ } # 4th warning
else{
# split based on some rule…
$rtnList[$i] = function($string, $i);
$isSucc = true;
}
if($isSucc){ $rtnArray[0] = true; $rtnArray[1] = $rtnList; }
else{ $rtnArray[0] = false; $rtnArray[1] = $rtnList; }
return $rtnArray;
}

GWA2 Manual Book
GWA2 Return Values of Methods

附记1.

为了使得系统能够支持WebP格式的图片文件支持水印功能,我们打算升级PHP语言环境。

起初,我们并不打算升级到 PHP8,而是打算升级到PHP7.4这个版本,在实际编译PHP源代码时,当前系统上报错说缺少 oniguruma类库,即便通过yast/zypper 安装了 oniguruma-devel 之后,仍然报错说无法找到,而相同配置的另外其他服务器则能够顺利找到&通过编译。 Linux还有很长的路要走。
既绕无法安装PHP7.4, 那就试试PHP8, 结果还是类似错误,预计只好针对oniguruma这个类库下点功夫,经过一番折腾,终于通过手工下载 https://github.com/kkos/oniguruma 一份源代码,手工编译&安装之后才通过。

解决了 oniguruma 这个问题之后,在编译PHP8的时候,还遇到 ext/geoip 无法编译通过的情况,后来通过手工下载 https://github.com/rlerdorf/geoip 一份重新放入 ext/geoip 才算通过。

尽管解决了那么多问题,具体PHP8兼容性问题,还没有显现。由于担心会出现异常,我们选择在深夜流量较小的时候找一台服务器进行试装,结果就遇上重启之后大面积报错的情况,举凡遇到 count 和 implode /explode等地方,都需要手工增加相应类型或数据安全检查代码。

顺带的昨晚还未被 Hanjst ( https://ufqi.com/dev/hanjst/ ) 替换掉的PHP Smarty模板引擎,一样随着PHP8的升级,触发一团糟的问题,服务被迫终止了一会。庆幸我们在后续的GWA2中将逐渐解耦模板引擎,使用 Hanjst替换掉Smarty,与服务器端开发语言不再绑定。

再一次的惊魂一夜!再次印证了,不要就近升级到软件的最新的latest stable release,惊魂大于惊喜。
再次印证了,能跑的系统,尽量避免升级,各种问题会导致业务被迫中断。智者千虑,必有一失。

—-

附记2.

这是使用 WordPress 的PHP8兼容版,创作的第一篇Blog,WordPress的PHP8的版本升级比预期的快,体验好!值得学习。

WordPress的新版升级过程大致为:
1)备份原程序和资源文件,备份原数据库;
2)检查备份的可还原性;
3)新创建WordPress子目录,或者将现有目录转移为 old目录;
4)下载并解压WordPress的新版本,解压到相应子目录,通过访问 blog/wp-admin/install.php 启动程序;
5)输入原数据库的访问账号,WordPress自动检查;
6)自动选择升级数据库,此前程序文件已经升级完毕;
7)使用原账号登录到升级后的WordPress后台,一切就绪;
8)还差原WordPress下的主题文件和资源文件,通过 cp -rf blog/wp-content/themes/xxx-theme 复制过来主题文件;
9) 通过 cp -rf blog/wp-content/uploads 复制过来资源文件,上传文件;
10) WordPress 提供了在线升级原主题的服务,顺利实施。
11)升级主题及相关文件之后,原先如果对主题模板文件进行了相应修改的话,需要重新在升级后的模板文件中进行再次有针对性的修改,比如特色链接,插图或者广告链接之类的插件。


-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architeture, https://ufqi.com/dev/gwa2/ )”,基于 -GWA2 可以轻便构建各种网络应用程序,
包括复杂的在线购物商城、在线医疗、在线教育、 旅游交易平台、社群或者社交网站和新闻资讯网站等,
也包括各种企事业单位网上门户,在线交互及服务作业系统等.
还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部.
-GWA2 是为数不多的支持跨开发语言的应用框架,目前支持 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for Native App, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

-GWA2 is E.A.S.Y 
Easy Along, Swift Yield
轻松启动, 快速产出.


ufqinews logo
有福新闻 UfqiNews

这里呈现热点全局, 尺寸间一览所有令人关注的疑点焦点;
这里表达条分缕析, 视野内一睹各个脉络清晰的故事主线.
有福新闻UfqiNews 带来全新的资讯阅览体验, 不信息过载, 亦不信息茧房.

在寻求最大社会共识和满足千人千面之间谋取平衡,
在满足广泛涉猎与追求术业专攻之间谋取平衡.
媒介插上人工智能的翅膀将如虎添翼, 与资讯比翼双飞.
新闻爱好者的良心之选, 匠心之作.

UfqiNews presents the hot spots globally, with all interesting points at a glance.
Information is organized here and there is a clear storyline within every single detail.
UfqiNews brings a brand new reading experience, no information overload and no information Cocoons,

In seeking a balance of the maximum social consensus and meeting thousands of people for each interest,
In achieving a balance between satisfying a wide range of hunting and pursuing specialization in the industry.
That media is being born with wings of the artificial intelligence will be even more powerful and the information will fly swifter than ever.
Better choices of newsreaders and the art of work from them.

发表在 -GWA2, UfqiNews有福新闻, 社会生活, 编程技术, 计算机技术 | 标签为 , , , , | 一条评论

京东制作护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏捐助乌克兰Help Ukraine老板选址BossXuanzhi

Hanjst汉吉斯特🙋与龙书编译原理

时间过得时而飞快,时而缓慢。我们人类已经与新冠肺炎疫情奋战了快两年了,好消息是随着疫苗的不断改进和持续的普及防护能力在提升,随着口服特效药面世和不断优化升级人类也不再不堪一击了。

就像不断改进和增强的疫苗和特效药一样,Hanjst汉吉斯特🙋( https://ufqi.com/dev/hanjst/ )也在持续的优化改进升级。回顾上一次更新是在 2021年3月份:Hanjst汉吉斯特🙋优化升级开发者模式( https://ufqi.com/blog/hanjst-updt-with-safari-tel/ ),差不多是年头一次主要升级,年尾一次主要升级。这次针对Hanjst汉吉斯特🙋改进,也是半年多来的累积改进,其中较大的亮点之一是改进针对注释语句的替换的操作。

在Hanjst汉吉斯特🙋的模板语言中,既有HTML的表述语言,也有原生的JavaScript程序代码,相应地会有HTML的注释语句,如
<!– 这是HTML注释内容 –> ,

也会有JavaScript的注释语句,如
//- 这是一个JavaScript注释行, 
/* 注释段落 JavaScript行1
     行2
     注释段落尾部
*/

其中在 JavaScript的单行注释时,这个注释既可以是一个单独的内容行,也可能是紧紧跟随在一段代码之后,如
const aString = “a-string-sample”; //- 声明一个JavaScript字符串变量

为兼容各种情况,程序逻辑事情变得异常的糟糕,经过很多次尝试之后,我们小结所遇到的困境和可能的出路时,目光一下子聚焦到被称之为”龙书(Dragon book)”的计算机程序编译的《编译原理》这本书。这本书的全民是 Compiler: Principles, Techniques and Tools (编译器: 原理,技术和工具), 在线内容收录在 有福经典UfqiLong: https://ufqi.com/news/clscpage.1075.html?tit=编译原理 Compilers: Principles, Techniques, and Tools 。

从本质上说,从模板语言到可执行的生成终端页面呈现HTML的其他程序语言,就是一次编译过程,这个过程与龙书编译原理所描述的过程一个模样。
compiler-fig-02.PNG

侠义的编译是将人类易读通用的程序语言代码“翻译”成为机器可以执行的机器语言代码。比如,将C语言程序代码“翻译”成为机器语言代码,将Java语言程序代码“翻译”成为机器语言代码。
Hanjst汉吉斯特🙋也做了类似的工作。整个翻译逻辑过程如下:

Hanjst模板语言代码 –> (翻译过程) –> JavaScript 语言程序代码 –> (翻译过程) –> 机器语言代码

这其中的“翻译过程”,就是编译器的工作过程,负责读入原语言代码,经过一系列的转换规则过滤与约束和改头换面的操作步骤,最终输出可供执行的目标语言代码程序。
如果所生成的目标代码程序是静态的文件程序代码,称之为静态语言,如果从abc.c 程序原代码到可执行的 abc.out.exe 程序文件。
对应的,如果所生成的目标程序是临时的内存态或者其他过程性临时文件,则称之为解释型语言,或者 动态语言,如直接执行 abc.js 或者 abc.pl 等,其编译后的临时文件只在运行时存在,执行完了或缓存下来或就直接被抛弃了。
整个链条中,Hanjst汉吉斯特只是做了第一个翻译过程,第二个翻译过程通常是有浏览器自带的 JavaScript编译和执行引擎来完成,比如 在 Google Chrome等浏览器中用到的 JavaScript V8 引擎 ( https://v8.dev/ )。

What is V8?

V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++. It is used in Chrome and in Node.js, among others. It implements ECMAScript and WebAssembly, and runs on Windows 7 or later, macOS 10.12+, and Linux systems that use x64, IA-32, ARM, or MIPS processors. V8 can run standalone, or can be embedded into any C++ application.

如果事情再往复杂方向继续发展,我们将不得不面临升级 Hanjst汉吉斯特的编译引擎到通用编译器的逻辑那样:
1)词法分析 Lexical  Analysis ,
2)语法分析 Syntax Anaylsis,
3) 语义分析 Semantic Analysis
编译原理 龙书 Compiler, Dragon Book-4:第一章:引论-2

目前,Hanjst汉吉斯特对模板语言的翻译尚未从最基础的词法分析,而是跳过将程序代码进行“标签化(Tokenized)” 的过程,上来就从语法分析入手,逐行对模板语句进行扫描,使用基于关键词的正则表达式对模板语句进行语义分析。经分析是当前行包括有 Hanjst汉吉斯特定义的语法关键词及相应表达式时,做如下转换:

Hanjst模板语言代码 –> (翻译过程) –> JavaScript 语言程序代码 

如果发现,当前行的内容没有相关关键词及相应的表达式时,直接跳过,将当前行视为一个普通常量字符串数据。

更上一层的语义分析的实现,则是基于语法语句分析的基础上,对包括条件控制语句、循环、退出等情况的处理,需要进行结束条件控制、关闭循环等语义层的操作时,根据一个结构数据表来进行一一对应补全。
这样的结构设计可以应付诸如模板语言这样的简单表达,同时也避免上来就进行Tokenized 的计算开销,可能是因地制宜的平衡之道吧。

然而,如果再复杂一些的情况,比如 Hanjst汉吉斯特这次修改的一个重点就是兼容行如下面的注释行,

const aString = “a-string-sample”; //- 声明一个JavaScript字符串变量

虽然几经周折,结合关键词和正则表达式成功在一些应用场景实现了预期目标,但也是逼仄式的采用了各种“奇技淫巧”——经验上看,约束条件越多,其普适性就会越差,甚至可以遇见,还有我们无法感知到的场景未被覆盖,“黑天鹅”也许就在远方。
这也许就是归纳法范式天然的缺陷。

也许,当下一只“黑天鹅”再出现时,就触及我们当前算法背后的极限,不得不使用《编译原理》中的名门正派的功夫来应对更加复杂的场景,以演绎、推理的形式彻底解决无穷尽的应用场景。

1)词法分析 Lexical  Analysis , –> 标签流Tokens Stream
2)语法分析 Syntax Analysis, –> 语法树 Syntax Tree
3) 语义分析 Semantic Analysis –> 语法树 Syntax Tree.

附加1:
来自JavaScript V8 Engine的页面JavaScipt提速优化建议
1) Improve download time, 提高JavaScript的脚步程序下载速度,一般不要超过 50KB , 再大了就拆小点, 对移动端尤其越要再小些。

2) Improve execution time, 提升执行速度,避免在主线程中放入 Long tasks. 这样才能提升页面渲染速度,尽早呈现出来。
Long tasks 是那些执行时间超过 50ms 的任务,Hanjst汉吉斯特完成翻译一个中等复杂程度的页面执行时间通常在 30ms左右。

Long task

Any uninterrupted period where the main UI thread is busy for 50 ms or longer. Common examples include:

  • Long running event handlers.
  • Expensive reflows and other re-renders.
  • Work the browser does between different turns of the event loop that exceeds 50 ms.

3) Avoid large inline scripts, 避免页面内直接书写太长JavaScript程序代码,如果内嵌代码长度超过 1KB,就考虑将其移入某个 .js 程序文件中。

4) JSON parse is faster than Object, 这似乎超出普通认知了…

const data = { foo: 42, bar: 1337 }; // 🐌
const data = JSON.parse('{"foo":42,"bar":1337}'); // 🚀

Hanjst 汉吉斯特 2021年近一年来的主要更新摘要:

* 09:08 2021-03-17, imprvs for debug in mobile browsers, +support for if conditionExpr
* 17:09 2021-04-26, + _enSafeExprAsCondition .
* 21:32 2021-05-19, bugfix for remedyMemoLine .
* 12:31 2021-05-21, bugfix for &amp; .
* 09:04 2021-06-07, add more _enSafeExpr .
* 21:51 2021-06-29, +comment: use Firefox to figure out exact error lineNumber and columnNumber in tpl2code in new Function
* 21:55 2021-11-11, imprvs for remedyMemoLine

更多参考 Hanjst汉吉斯特官网:https://ufqi.com/dev/hanjst/

 


Hanjst
Hanjst 汉吉斯特 Logo

🙋Hanjst汉吉斯特 是一种基于JavaScript的模板语言及模版解析引擎,她运行在客户端或服务器端。

🙋Hanjst汉吉斯特 能够表述逻辑控制,能够实现与服务器端模版语言相同的强大功能。

  • Hanjst当完全在客户端解析时,节省服务器端计算资源;

  • Hanjst模板语言独立,不与服务器端资源做任何绑定;

  • 纯粹的MVC,层间数据用JSON格式传递;

  • 常见模板语言功能全支持,附带复杂而强大的JavaScript编程能力;

  • 无学习成本,直接使用JavaScript书写模板语言;

  • ….

Hanjst is a JavaScript-based templating language and parsing engine that runs on both the client-side and/or server-side.

Hanjst can express logical controls and achieve the same functionalities as the server-side templating languages.

  • Hanjst’s Run-time in client-side, reduce computing render in server-side;

  • Hanjst is Language-independent, not-bound with back-end scripts or languages;

  • Totally-isolated between MVC, data transfer with JSON;

  • Full-support template tags with built-in logic and customized JavaScript functions;

  • No more tags languages to be learned, just JavaScript;

  • ….

Hanjst汉吉斯特🙋与龙书编译原理

 

发表在 -GTAjax, -Hanjst/-汉吉斯特, 编程技术, 计算机技术 | 标签为 , , , , | 2条评论

得力彩色铅笔油性彩铅学生用专业手绘48色水溶性彩铅笔24色画画笔36色小学生安全无毒水溶款绘画素描儿童铅笔医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌京东制作

GWA2吉娃兔🐇Java中的文件上傳表單處理若干問題-2

去年(2020年)秋天写了上一篇:GWA2吉娃兔🐇Java中的文件上傳表單處理若干問題( https://ufqi.com/blog/gwa2-java-file-upload-issues/ ),随着我们持续不断的研发推进、精益求精,发现在 GWA2Java 中處理文件上傳的HTML表單被稱爲是“客貨混裝”的HTTP請求處理时,还有一些额外的问题需要再补充。兹详述于下,备忘备查。

(问题1-7请参考此前一篇Blog)

8. 数组型数据的接收与处理

在GWA2 Java中,为上传文件当HTML的表单类型被设置成 enctype 屬性為 multipart/form-data , request.getParameter 方法失效,同样地类似方法 request.getParameterValues 也失效了,如此以来,获取类似 多个 checkbox 这样的HTML form的输入,就成了问题。为此,我们需要再扩展一下之前使用 FormItems 来接管 request的相关属性的方法。

ServletFileUpload sfileupld = new ServletFileUpload((new DiskFileItemFactory()));
formItems = sfileupld.parseRequest(request); // can only be parsed once!
if (formItems != null && formItems.size() > 0){
String iname, ivalue; byte[] bytes; Object lastVal;
for (FileItem item : formItems){
// processes only fields that are common form fields
if (item.isFormField()){
bytes = item.getFieldName().getBytes(“ISO-8859-1”); // why 8859?
iname = new String(bytes, “UTF-8”);
bytes = item.getString().getBytes(“ISO-8859-1”);
ivalue = new String(bytes, “UTF-8”);
lastVal = request.getAttribute(iname);
if(lastVal != null){
// checkbox or multiple select
if(lastVal instanceof String[]){
String[] tmpArr = (String[])lastVal;
String[] tmpArr2 = new String[tmpArr.length+1];
for(int si=0; si<tmpArr.length; si++){
tmpArr2[si] = tmpArr[si];
}
tmpArr2[tmpArr.length] = ivalue;
request.setAttribute(iname, tmpArr2);
}
else{
String[] tmpArr = new String[2];
tmpArr[0] = String.valueOf(lastVal); tmpArr[1] = ivalue;
request.setAttribute(iname, tmpArr);
}
}
else{
request.setAttribute(iname, ivalue);
}
//debug(“ctrl/user: iname:”+iname+”, ivalue:”+ivalue+” lastVal:”+lastVal);
}
else{
debug(“ctrl/user: not form field: iname:”+item.getFieldName()+”, ivalue:”+item.getString().length());
}
}
} 

使用 lastVal, 来检测是否同一个key的键值被赋予多个赋值,如果时,就启用一个数列来存储。相关代码在 github/wadelau/GWA2  ( https://github.com/wadelau/GWA2 )上可以获取。
该应用的场景是一个Form中,既有多选框,也有文件上传。

对应地,我们也在相关GWA2 的基础设施组件 comm/Wht 中增加了针对Form 的数列型数据的接收处理,方法名为
Wht.getArray(request, fieldName)
以此来接收和处理类似 multi select和check box类型的输入。

9. 多文件同时上传的优化处理

针对服务器端接收处理文件上传的相关组件,已经非常成熟,拿来用即可。如前所述,我们在GWA2 Java中处理文件的模块主要来自 Apache commons-fileupload-1.4.jar , 一并的也要引入 Apache commons-io-2.7.jar。

在一些细节上,还是有可深究的地方。默认情况下,我们通过 inc/FileSystem 中的一个 upload 方法来处理这些细节。针对 upload这个方法,预期的效果是给定一个上传的 form字段名称,然后返回一个保存后的文件路径,形式如:
formFieldA -> filePathInDisk

如果是多个文件呢?之前的方法是 upload 返回一个数组,包括多个地址,相当于:
[formFieldA, formFieldB] -> [filePathInDisk, filePathInDisk]

此时处理两个以上的文件上传时,它是能够完成预期目标的,可是,如果要更新其中一个文件时,就会出错。由于Form字段名称对应的磁盘文件路径,只有顺序,而没有最终预期的key/value 形式,当修改或更新其中一个文件时,总是返回形式为:
formFieldA -> filePathInDisk

这与只上传一个文件的情形是没法区分的。需要改正、优化。预期的是返回一个key/value形式的 formField/diskFilePath 。

// parses the request’s content to extract file data
@SuppressWarnings(“unchecked”)
List<FileItem> formItems = preFormItems;
if(formItems == null || formItems.size() ==0){
formItems = upload.parseRequest(request);
}
if (formItems != null && formItems.size() > 0){
// iterates over form’s fields
String fieldName, itemName, fileName, suffix, filePath;
File storeFile = null;
String showPath = UPLOAD_DIRECTORY + File.separator + relativePath;
if(!relativePath.endsWith(File.separator)){ showPath += File.separator; }
for (FileItem item : formItems){
// processes only fields that are not common form fields
if (!item.isFormField()){
fileName = “”;
fieldName = item.getFieldName(); itemName = item.getName();
if(itemName != null && !itemName.equals(“”)){
suffix = “”;
if(itemName.lastIndexOf(“.”)>0){
suffix = itemName.substring(itemName.lastIndexOf(“.”), itemName.length());
}
fileName = UUID.randomUUID().toString().replaceAll(“-“,””) + suffix;
filePath = uploadPath + File.separator + fileName;
debug(Log_Tag+” upload: filePath:”+filePath+” itemName:”+itemName);
// saves the file on disk
storeFile = new File(filePath);
item.write(storeFile);
fileName = showPath + fileName;
}
else{
fileName = “”;
debug(Log_Tag+”upload: skip empty itemName.”+itemName);
}
hmResult.put(fieldName, fileName);
}
else{
//debug(Log_Tag+” upload: form field item:”+item);
}
}
}
else{
debug(Log_Tag+” upload: formItems:”+formItems);
}

新增了 fieldName 字段,在返回时,将 Form fieldName 与 diskFilePath 以 key/value 形式严格对应起来,由返回 String 后者 String数组,改为返回 HashMap。如此以来,则可以解决同时上传多个文件,而不依赖顺序来对应所上传的文件,同时,当修改时,也可以避免所跳过的文件产生的顺序异常。完整功能的相关代码在 github/wadelau/GWA2  ( https://github.com/wadelau/GWA2 )上可以获取。

由于方法返回值的修改,不兼容此前版本,建议老版本的用户升级时,使用方法重载后者命名新方法的形式引入新功能。比如,在最近的项目 Boss选址 ( bossxuanzhi.com ) 中,我们就面临要使用命名新方法来兼容前期使用旧方法的 upload 和后期采用新方法的 uploadMultiple 。
如果是在新项目中,建议直接使用即可,没有向前兼容的需求。

 


-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architeture, https://ufqi.com/dev/gwa2/ )”,基于 -GWA2 可以轻便构建各种网络应用程序,
包括复杂的在线购物商城、在线医疗、在线教育、 旅游交易平台、社群或者社交网站和新闻资讯网站等,
也包括各种企事业单位网上门户,在线交互及服务作业系统等.
还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部.
-GWA2 是为数不多的支持跨开发语言的应用框架,目前支持 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for Native App, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

-GWA2 is E.A.S.Y 
Easy Along, Swift Yield
轻松启动, 快速产出.

 


 

Boss选址( bossxuanzhi.com )是汇成产业服务(汇成产服)提供的在线服务,是服务政府投融资、招商、运营的平台型公司. 汇成产服公司定位:一、专业的政府招商代理服务机构,二、企业选址服务机构,三、企业咨询管理服务平台。

 

( https://ufqi.com/blog/gwa2-java-file-upload-issues-2nd/ )

 

发表在 -GWA2, 编程技术, 计算机技术 | 标签为 , , , , | 留下评论

护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏捐助乌克兰Help Ukraine老板选址BossXuanzhiUfqiFina有福金融

理性经济人在边际上做选择

奥地利经济学派的大师米塞斯(Ludwig von Mises / 路德维希·冯·米塞斯)在《人的行为Human Action》论述到:“一个人决不会在「金」与「铁」之间选择,而只是在一定量的金与一定量的铁之间选择。”。( https://ufqi.com/news/ulongpage.1975.html )

我想用新近发生在我们自身的一个案例来试图描绘这种边际选择,而不是非此即彼的是非选择。
2021年10月,我们要为 ufqi.com 举行一些活动,制作若干 ufqi.com 的不干胶贴纸。为此我们先在 某宝网上翻阅,发现不能在网页与店家沟通,需要再安装一个聊天沟通客户端( wwcmd ),隧作罢。
然后尝试在 某东商城上翻阅,找到类似服务店家,直接在网页上进行沟通定制细节,然后按约定下单,隧成交。

针对制作 ufqi.com 不干胶胸贴纸这件需求或任务,所能采取的方法有很多(选择),既可以在楼下街边找一家快印店,也可以网上下单。选择在网上下单制作,还可能面临第二层选项,是在 某宝网上选,还是在某东商城上选?
即便是最终确定了一家某东商城,我们同样还会继续面临第三层选择,是选店家A还是选择店家B、C、D…?

从这个过程看,客户抵达的路径岔口太多异常艰辛,所有商家都不应该辜负客户的每一次光临。都应该殚精竭虑地完成客户的托付,才对得起客户在抵达商家之前的一次次的“临幸”。

我们为何不是那种,打死我也不去街边店下单? 或者打死也不去网上下单?
甚至在网上下单,当我们遇到某宝网上要求我们下载一个客户端才能与店家沟通的障碍时,为何不做出“打死以后也再来某宝网上购物了”的决定呢?

因为我们是理性经济人,我们在做决策时,是从经济的角度考虑,经济的潜台词中,主要内容就是在有限成本支出的前提条件下,获得最大化的产品和服务收益。

在上面这个案例中,表面上再多安装一个沟通客户端对用户来说是负担,是额外的成本开支,深层的是还有其他因素在里面。尽管商家要求用户安装沟通客户端有千万个理由,甚至其决策和设计过程也经过复杂无比的争论,但当遇到有理性思维,懂得做边际选择,有可能替代的产品或服务出现时,其被取代是必然的,剩下的只是时间问题。

我们拒绝再额外多安装一个沟通客户端还由于其行为或者方向与 ufqi.com 所倡导的 互联互通开放包容 的理念相悖,甚至是反向加速。某宝网不提供基于网页的沟通工具,某付宝不提供基于网页版的服务,某多多不提供网页版的服务,尽管是商家的自由,值得尊重,同样地,用户也有选择用或者不用的自由。

这也是为何我们必须旗帜鲜明地反垄断,垄断既是健康经济体的毒瘤,也是社会发展、文明进步的绊脚石。垄断的团体只有一个目的,攫取更多的利益以加固其垄断地位,直到永远,102年是远远不够的。

互联互通开放包容 的先决条件是任何技术或平台必需是多家共同协商制定和维护的。这是互联网络、万维网生存的前提,也是已经发展实践的正确道路。这期间总是有各种软件或(和)硬件公司试图在全局或者某些局部上下通吃左右把控,实施垄断以谋取暴利。

我们都不会忘记,没有万维网以前,所有的软件都是今天流行的App格式(Application 独立二进制程序包,需要独立地安装、运行以满足某种需求),分发途径就是物理磁盘复制拷贝人际传播交换。我们不想回退到史前,所以我们不遗余力地倡导继续保持互联互通、开放包容,基于万维网开发,基于浏览器或者另外一种基于开放技术平台(HTML50?)开发互联网络。
画地为牢的App是旧势力,是垄断、专制的保皇派的利器。
万维网才是打造人类巴别塔的基石。

我们,作为理性经济人,应该在力所能及的情况下,保卫奄奄一息的互联互通开放包容的精神火种,放大视野放长时光,我们的世界基于自由身份平等地位的分工协作才是征程大海。
我们坚信,基于浏览器或者另外某种新的开放技术平台(HTML50?),一定能实现自由地使用搜索引擎、新闻、娱乐、购物和通信等基本互联网服务。我们在一个大公司的垄断平台上忍了很久,可能还要继续再忍一阵子,但这并不代表我们绝望了,毕竟我们是理性的经济人。当我们看到一丝曙光时,代表着未来,引领了方向,就摇旗呐喊助威,表露我们的边际选择倾向。在一个混沌系统中,当我们的选择可以影响整体的发展时,那应该算是幸事。乐观其成。

经济学家张维迎教授在《经济学的十个基本原理》一文中这样解释边际选择:

经济学所要关注的问题,通常不是极端的非此即彼,而是“多一点”还是“少一点”的比较,也就是对“边际成本”和“边际收益”的权衡。
举例来说,我们需要考虑如何在购置食品和购置衣物上分配收入。一般来说,我们不会只买衣服不吃饭,也不会只吃饭不买衣服,而会考虑是多买些食物而少买些衣服,还是多买些衣服而少买些食品,这样的选择就是边际选择。
https://ufqi.com/news/ulongpage.243.html?tit=北大张维迎:你应该知道的10个经济学原理

这里的“衣物”与“食品”的对比,恰如开篇米塞斯举例中的“金”与“铁”一样。在上述制作 ufqi.com 的不干胶胸贴纸的任务描述中,也许我们投赞同和选择票的某东商城以后会基于自身利益考虑也要用户安装一个沟通客户端,也许我们反对和不选择的某宝网也许以后发现用户流失厉害还是改回在浏览器直接允许用户和店家沟通吧。这些都有可能,所幸我们都是理性经济人,当更加经济的方向出现时,我们总是能够用脚投票即可,在经济一边的边际上多买一些,在非经济一边少买一些。

可能的难题是,当信息不能自由流动时,人们因为“无知”而不懂得如何去做边际选择。这恰是所有画地为牢的App努力达成的愿景——“除我之外,再无别的神”。多年前,我们在人民网有个研究就发现,互联网络应用的发展趋势总是服务的排他性和内容的多样性不断集成和加强( 新闻阅读的聚合趋势–传媒–人民网 (people.com.cn),http://yjy.people.com.cn/n/2015/0701/c245081-27239100.html  )。

理性的经济人,我们天生要肩负这种责任,具备一定的抗拒能力,设法保持互联网络生态服务的多样性(每种应用服务两家以上,互联互通)和内容的排他性(文字影音每类内容公推两种默认格式必需支持,其他自选),维护互联互通开放包容的格局。

 

—-这是温习经济学著作的第八篇习作,之前的各篇附列如下。

  1.  写写年度收益率年均收益率和年化收益率-4 | -UFQI-Blog, https://ufqi.com/blog/income-rate-annuals-with-buffett/ 
  2. 写写年度收益率年均收益率和年化收益率-3, 
    https://ufqi.com/blog/income-rate-annuals-with-yale/
  3. 写写年度收益率年均收益率和年化收益率-2 , https://ufqi.com/blog/income-rate-annuals-with-cic/
  4. 写写年度收益率年均收益率和年化收益率, https://ufqi.com/blog/income-rate-annuals/
  5. 治大国若过小家——写写王朝兴衰更替背后的经济账, https://ufqi.com/blog/political-reform-country-vs-home/
  6.  写写🏦存款利率贷款利率和负利率, https://ufqi.com/blog/captial-rate-and-minus-rate/
  7. 写写1929年美国经济大萧条与2020年美国股市大跌, https://ufqi.com/blog/us-1929-economic-crisis-2020-stock-shock/
发表在 社会生活, 计算机技术 | 标签为 , , , | 4条评论

医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌京东制作护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏