勞動的振興一家親

許久沒有寫家長里短的生活片段,說工作太忙,或者因爲新冠肺炎疫情都是不準確的。根本原因是在某種壓力之下,缺乏了對生活的感悟和思考,觀察和體會。真如同現在忽而要寫寫我們的生活剪影一樣,是有感而發,有所觸動,希望能言之有物,說説我們勤勞而辛勤工作的片段。

家住兩室兩廳,初裝修時,被改成三室一廳,兩個臥房,一個留作書房+鋼琴。四口人,如果岳父母來的話,是6口人,難免有些擁擠,通常每個房價要睡三口人。所以我們想把次臥的兩張板床換做一套上下床,不至於擁擠不堪。起初打算買新的,考慮到木料的,新的有味道,加上我們都一貫勤儉節約,就想著尋覓一個二手的上下鋪木床。妻子就在阿里鹹魚上尋找。這算是背景。

經過一陣子觀察,終於訂了一套附近小區的上下鋪木床,需要我們自己去拆卸了,搬運回來,再組裝起來。這個故事就是要記錄我們一家幾口在這個活動中的積極配合、辛勤勞作的過程。

2020年6月17日,是農曆閏四月的一個大熱天,大概有36度左右。我們在上午工作、學習之後,下午15:30按約定去賣方家裏拆卸床鋪。拆卸難度比預期的大,拆卸過程也比預期的長。Yoyo和我一道前往,個頭像個成年人一樣的大孩子,在與我配合的時候,一點不差。從擰卸螺絲、往外樓下搬運木板、床架,幹得很認真,很勤快,也很辛苦。大家都大汗淋淋的。只是暫時還沒有水喝,我們需要忙了大約一小時之後,待拆卸、搬運、裝車,然後運到家裏樓下、卸貨下車之後才能回去喝水。

這期間有個細節頗為意外。Yoyo搬運床板時,手指被床板的木刺兒刺破。在行動前,我預料會有這樣的事情發生,所以出門前我備了手套,並叮囑Yoyo也帶手套。顯然,YOyo沒儅個事,也沒戴手套就上手幹活了。木刺兒很鋒利,穿刺了Yoyo食指的表皮,從另一側穿出。我看著都覺得疼得厲害,她居然還開玩笑說,木刺兒刺穿了表皮、真皮和小部分組織細胞等等,然後將餘留在皮膚裏的木刺拔出。我趕緊制止了她的任務,讓她趕緊清洗,並將我的手套給她,囑咐她保護好手指,回去后再消毒、包紥處理等。

這些發生時,我忽然覺得Yoyo這孩子長大了,有能力處理一些突發情況,她對疼痛的耐受,超乎我的想象,即便受傷了,仍然繼續上上下下地幫我搬運完所有的木料,然後我隨著出發,她再自行騎電動車返回。

作爲父親,我既爲Yoyo的勇敢而欣慰,也有點擔憂,她這種超乎異常的鎮靜與堅强,會不會太狠了點?

貨到之後,Yoyo也前後脚回來,還好!我隨即囑咐她回去喝水、消毒包紥手指。另外讓她叫Hanu下來幫我搬運東西到樓上去。我連忙從車上卸貨,在單元門口堆放了一地。

不久,Hanu就樓裏冲出來,擼起袖子就開始搬運木料。我讓他擔心木刺兒,回去穿長袖衣服,撿自己能搬得動的木料往回搬。Hanu幹起活來,也很積極主動,一趟一趟,樓上樓下,和Yoyo,我,三人穿插著不停地往返,不一會,就搬木料從單元門口悉數運到了家裏來。僅僅多了Hanu一雙手,我忽然覺得比從賣方樓上運到樓下快了很多!

說易行難,待到我們將木料運到家裏之後,三日幾乎都累的不想動了,我們決定稍事休息,然後再進行組裝。

由於拆卸的時候進行的匆忙,沒有拍照留存樣子,我只好凴印象,一點一點地回想某個部件該在什麽部位,組裝的時候先組裝什麽再組裝什麽的先後順序等。而且在組裝之前,我們需要把原來室内的物件再歸置一下,在Hanu和Yoyo的幫助下,事情一一有序進行。

組裝最難的部分是將床鋪的骨架裏起來,在一個有限的空間裏,我們三個人覺得有點困難。主要是Hanu不能單獨扶住樹立一根床腿,太粗壯、太厚重了,如果兩根、三根甚至四根柱子不同時立起來的話,就沒法往一起使用橫梁連接、固定起來。辦法總比困難多,我們一起還是想了很多辦法,剋服了這些問題,最終樹立起骨架,後面就相對容易,逐漸上架更多的部件。

這期間,門口居然接連有兩次快遞送到門口,不得已我們沒法接,之後大聲地對門口喊,知道了把快遞放門口吧,而快遞員也有回應說,好的,只是運來的東西是冷鏈食品,需要馬上放冰箱裏…., 一片忙碌中.

Minina下班歸來,也加入我們的隊伍之中,協助清洗、消毒木料等,同時還為我們準備晚餐,對了,已經忙了一下午了,1拆卸—2搬運下樓—3裝車—4運送—5卸車—6搬運上樓—7組裝–8清洗消毒…., 這個漫長的流程,我們已經幾乎快完成了。

中間多次休息喝水,然後還有一次吃完飯,晚飯后繼續歸置,清理,大約忙到晚上21:30左右,終於結束當天的工作。從15:30出發啓動任務,差不多進行了連續6個小時的辛勞忙碌。

稍後休息。我回想之前有過 的一些搬家、運床的經歷。最早我從學校的宿舍搬出到平房居住,後來搬家到樓房,再後來搬家到我和Minina購置的新房,然後從這個小房搬家到現在住大房子。期間經歷可謂曲折、艱辛。這些搬家中,每一次幾乎都是親朋好友有力出力,有車出車,都來搭把手,雖然辛苦,卻也順利。

好像這是第一次,我帶兩個孩子,完成了將一個碩大的木製上下床從一個地方搬運到另外一個地方。孩子們大了? 我有幫手了?真相可能是孩子們真大了,而我還未老,也許現在就是創建功業的大好時機。 在不遠的將來,孩子們將重新走我和Minina年輕時走過的路,如果我們能將孩子們的起點墊起得更高些,或許他們能走得更遠些。

正如我們的父輩不辭辛苦地支持我們向更高、更好地生活邁進,我們也要沿著這樣的路綫,將孩子們遞送到更高、更好的生活方向和軌道上去,扶上馬,再送一程。這,或許就是人類生生不息、代際傳承的文化内涵和精神圭臬

一而再,再而三,家族之勢可成也。


姐姐Yoyo苦練一陣子的菊花字體“期末”,出現在學校班級的板報上,她言自己有兩科目以上都是榜眼,所以未能留言“狀元語錄”。我聞,亦爲之嘆息不已。


弟弟Hanu隔三岔五地會臨描一些圖畫書的插圖,如小鹿斑比(上圖),丁丁歷險記等,惟妙惟肖,煞是逼真。我意甚喜,而她母親則說,畫什麽像什麽並不是想象力的發揮。

時光就是這麽一晃就過去好幾年,上次寫 Yoyo的帖子是2015年,《化干戈为玉帛:平息争执的四个方法》:https://ufqi.com/blog/four-ways-to-get-out-of-disputes/ , 上次寫Hanu的帖子是2016年,《鸡蛋黄色的Orange和外教课english dict》:https://ufqi.com/blog/hanu-egg-yolk-orange-yoyo-eng-dict/ 。

—-

https://ufqi.com/blog/xenxin-family-hardwork-202006/

-R/S2SP

发表在 社会生活 | 标签为 , , , , , , | 留下评论

書中自有顔如玉愛自己悅己容2nd愛自己悅己容汽車老司機車載

🙋Hanjst汉吉斯特优化+JsonDataFromScript等

近日继续对 🙋Hanjst汉吉斯特优化改进。这次的改进思考是从服务器端返回的 HanjstJsonData的容器设计问题。目前的做法是服务器端的HanjstJsonData放入终端页面的一个Div元素中。这个Div的id默认被设置为Hanjstjsondata。

<div id=”Hanjstjsondata” style=”display:none;height:0px;width:0px;”>

HANJST_JSON_DATA
</div>

这么设计并实施有显而易见的好处,简单易行,而且部署实施复杂度和实际运行效率,都在可以接受的范围。然而在一些极端情况下,网速较慢时这个DIV会曝露给终端用户,而且需要在浏览器中读取到这个DIV的内容,并进行JSON.parse操作。有没有可能将服务器返回的HanjstJsonData 直接以JavaScript的JSON变量形式放入浏览器中,使得JavaScript和Hanjst可以直接调用?这样改进后,运行速度是否会更快?

同时,还要考虑的问题是,如果做这样的改动,比如可以接收来自JavaScript脚本的JSON数据,与此同时同时,还要前向兼容目前已经使用的方式方法,也即,需要继续支持能够使用DIV形式来传递JSON数据。

另外,还要考虑到,如果新的功能,来自JavaScript的JSON数据被引用,那么是否就丢弃来来自DIV的JSON数据?两者是否需有一个优先级?

从理论上分析,如果从服务端返回的JSON数据直接放入JavaScript的JSON对象中,会减少现有的JavaScript中读取DIV内容,并进行JSON.parse的过程,与之对应地,需要考察的过程就是JavaScript中处理较大的JSON对象的效率,这个过程是否高于从DIV中读取contents并对读取到对contents进行JSON.parse?

实践出真知。我们最终决定改造Hanjst的解析引擎,使之支持来自JavaScript的JSON数据对象,在Hanjst运行环境初始化完成后,开始对JSON数据对象的探测。Hanjst 使用window.hasOwnProperty(Hanjstjsondata) 的方法来探测是否在当前JavaScript运行时环境中已经定义了Hanjst Json data的数据对象。 如果探测到已经定义了有来自JavaScript的Hanjst JSON data数据对象被定义,则使用这个作为后续的数据源。

如果没有探测到相应的数据对象被定义,则程序进行之前的过程——根据HanjstJsonDataId寻求相应的DIV,然后读取DIV的contents,然后再对contents进行JSON.parse 的操作。

如此以来,将来自JavaScript的JSON数据对象置为第一优先级,如果有则终止对DIV对探寻,如果没有再继续之前的DIV中的JSON数据的读取。既实现了对之前对兼容,也扩展了对来自JavaScript的JSON数据的支持。

改进之后增加使用JavaScript声明变量来引入JSON数据对象的写法:

<script async>

//- first order, detect

//- HANJST_JSON_DATA

var Hanjstjsondata = {“pagetitle”: “-Hanjst, Hanjst汉吉斯特”};

</script>

 

Hanjst demo ( https://ufqi.com/dev/hanjst/Hanjst.demo.html) 的页面实测中,使用来自DIV的JSON数据和使用来自JavaScript的JSON数据对象,两者在运行时间上并没有明显的区别。Hanjst demo的解析运行时间 (普通PC桌面浏览器),在两种情况下均在 20~40ms之间,也即 0.02~0.04s之间完成页面的样式和内容的merging操作并更新整个页面的body。

可能是Hanjst demo页面尺寸和复杂度较低,JSON data数据对象也不大,所以在运行时间上无法明显区分开来。待有正式商用的较大尺寸的页面和较复杂的页面逻辑、较大尺寸的JSON data时,再做详细的对比。目前只能从理论上证明:使用来自JavaScript的JSON对象可能会快些。

这是最近接二连三地对 Hanjst汉吉斯特进行更新的第三篇,前两篇分别是:
https://ufqi.com/blog/hanjst-ensafeexpr-updt/ , 🙋Hanjst汉吉斯特改进+enSafeExpression安全表达式等; https://ufqi.com/blog/hanjst-showimage-dotpos/ , 🙋Hanjst汉吉斯特升级:+showImageAsync及性能改进等;

其他一些改进:

1)修改了一处 正则表达式中的 matchStr 被引用时,将双引号“进行转义操作。
2)改进了一处 关于注释代码清理的正则匹配问题,在检查 // 注释之前,先行去除 /* */

/\/\*([^]+?)\*\//gm

3)增加了一處顯示功能, {=$i+2} , 先對 $i 進行賦值操作,然後再在當前位置顯示出來
此前要顯示一個變量需要經過兩步驟:

a. 賦值操作: {$i=$i+2} , 空語句,只執行語句,不做顯示;
b. 顯示操作: {$i} ;

目前a, b兩步驟可以合并為一步: {=$i+2} , 先賦值操作,后顯示操作。
相當於截至目前,有兩種顯示操作方式:
3.1) {$i} : 在當前位置顯示 $i 的值;
3.2) {=$i+2} : 先進行賦值計算操作,然後再在當前位置顯示出 $i 的值. 

{$i} 等價於 {=$i+0} .

 

….


Hanjst

🙋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;

  • ….

 

 https://ufqi.com/blog/hanjst-updt-jsondata-from-script/
-R/N2SL

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

好奇婴幼儿中国国民党革委会中国国民党Apache Softwares

🙋Hanjst汉吉斯特改进+enSafeExpression安全表达式等

Hanjst汉吉斯特模版语言及模版引擎,近期持续改进升级。
这次改进主要是增加了对安全输出表达式兼容,由于涉及到对软件开发过程中的效率和软件运行效率的平衡和取舍,所以多写了几句,以描述这个权衡利弊对思考过程。距离上次更新:🙋Hanjst汉吉斯特升级:+showImageAsync及性能改进等 ( https://ufqi.com/blog/hanjst-showimage-dotpos/ ),时间过得并不算长,希望Hanjst早日成熟而稳定下来。

1. 问题及背景

Hanjst 模版语言解析引擎在编写时,启用了JavaScript的 strict mode ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode ),对程序语句执行严格对语法检查,因此如果书写不严格会偶尔抛出异常错误警告来。之所以这么要求,使用JavaScript对strict mode,是希望Hanjst汉吉斯特能够用在一些关键领域和苛刻岗位,将异常错误消灭在程序编写阶段。

让异常在“编译时”发生,进而得到解决,属于编程语言方面的准编译型。这本是好事,因为Hanjst 除了用在普通的资讯网站,也会用在电商、金融等领域,对其进行苛刻的语法检查,是必需的步骤。

然而,这也有弊端,就是开发时比较耗费时间,需要考虑各种情况,反复测试各种情景下的软件行为,无意会加大开发成本。比如常见的 strict mode下的报错:未定义变量和访问对象为undefined。报错信息在 Hanjst里有较人性化的显示输出,参考:汉吉斯特Hanjst+更新升级:error reporting, innerLoop和loadingLayer ,https://ufqi.com/blog/hanjst-error-reporting-innerloop-and-loadinglayer/  。

如果因为对接的系统处于非关键领域和苛刻岗位,对于往复出现的这种变量未定义或者访问undefined对象,能不能进行一些主动兼容?这次就是考察这个问题。

2. 解决思路及方法

对这个问题的考察,大致两种方法:
1)在模版编译时,去掉 JavaScript对strict mode,使之不再做严格对检查,从而避免类似未定义变量和访问undefined对象;
2)第二种思路是在保持 strict mode对前提下,做一些局部的微调,使之能够兼容这些低级错误,也保留对其他语法对严格检查。

在大的方向上去掉Strict mode显然是不行的,这会从本质上动摇Hanjst用在关键领域和苛刻岗位的定位。这一点不应拿来讨论。启用strict mode,进行编译时语法检查,对严肃软件是必需的。

在JavaScript中,探测一个变量是否被定义,是一件容易的事,使用类似 typeof 对指令,可以判断某个变量是否被定义。如果对每一个变量在输出前都做这样的检查,显然陷入了“一个人有病,全国人吃药💊”的非理智状态,这也是之前的尝试被阻止的原因之一。
因此如果要启用针对变量的探测,需要有某种机制来感知已经被定义了的变量。

另外,如果不使用 JavaScript eval等危险性较高对函数,如何去感知某个字符串所代表对变量是否被定义了?使用内置对象 Function构建匿名函数吗?如果匿名函数的话,其单独的变量作用域与变量实际运行环境又有显著的不同,该如何操作?

第三,在模版语言中,我们允许对象的属性访问,这类对象,可能是运行时环境的全局变量,也可能是局部变量;这类对象既可能是一维的Hash数据list,还可能还多位的Hash嵌套,可能存在第一维的数据对象是已经被定义的,而第二维、第三维是未定义的,而此时如果是未定义的,就有可能抛出异常来。

待问题进一步地发散为:
1)继续启用Strict mode,
2)在1)的情况下,实现对未定义变量和未定义对象对访问兼容;
3)尽量不要使用高危函数,如 eval;
4)保证2)都情况下,不能不分情况的对所有变量进行兼容操作;
5)需要区分是全局变量,还是局部变量,各种情况最好都能兼容;
6)需要区分一维对象和多维对象,各种情况最好都能兼容。

经过一番艰难地探索,在尝试寻求鱼和熊掌兼得的情况下,采取如下措施:
1)使用 typeof 生成待执行的变量是否被定义的JavaScript语句;
2)新增环境变量赋值语句的list,用以检测某个变量是否显式地被定义;
3)使用 window.hasOwnProperty 探测某个全局变量是否被定义;
4)使用递归方式拆解多维数据对象,如, $aList[$ak1][$ak2][$ak3] .

基于以上分析在 Hanjst.js 中新增 _enSafeExpression 函数用于对待输出对变量及对象进行安全性检查。

3. 样例演示

{$a=1}  –> 类似的语句被登记为该变量已经被显式地声明;

{$a}  –>  ((typeof $a == ‘undefined’) ? ” : $a) , 输出 $a 对语句如果探测到没有被定义,将被改写为三目运算符的表达式;

$aList[$ak1][$ak2][$ak3] –> $aList[$ak1], $aList[$ak1][$ak2] , 将待输出对三维数据分别逐级拆解,形成待探测的两个变量/对象,再分别予以构建使用三目运算符的表达式,形成由顶部到底部的逐层检测,大致为:
((typeof $aList[$ak1] == ‘undefined’) ? ” : ((typeof $aList[$ak1][$ak2] == ‘undefined’) ? ” :$aList[$ak1][$ak2][$ak3]))

更多维的数据对象,也依此类推。 

4. 其他

版本号升至 v1.7, +其他一些细微的优化调整,

一个简单地问题细究起来,居然一点都不简单,纸上得来终觉浅,绝知此事要躬行。一个小任务,变量输出前进行主动安全性检查,居然唠唠叨叨地写了差不多2000字。

毕竟,Hanjst汉吉斯特在追求平衡的艺术,追求极致而完美。

….


🙋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;

  • ….

    两天来,连续创作两篇,在写blog的历史上,也是少有的行为。同期写就的另一篇: 写写🏦存款利率贷款利率和负利率 , https://ufqi.com/blog/captial-rate-and-minus-rate/  。

https://ufqi.com/blog/hanjst-ensafeexpr-updt/
-R/x12SX
https://ufqi.com/news/list.932.html

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

中国国民党革委会中国国民党Apache Softwares亮月亮科技

写写🏦存款利率贷款利率和负利率

2020年以来,经济发展受新冠肺炎疫情影响,进行大幅深度回调,宏观层面金融政策和财政政策接踵而至,为了保经济、保不下挫、保下挫的不太厉害操碎了心。利率调整是宏观经济干预工具箱中较为亮眼的那种,有点像像是瑞士军刀Swiss Knife或者互联网络中netcat命令. 这篇打算写写利率及负利率,算是经济学学习笔记第二篇。(这里是第一篇:写写1929年美国经济大萧条与2020年美国股市大跌https://ufqi.com/blog/us-1929-economic-crisis-2020-stock-shock/ )欢迎批评指正。

几个月前,网上有篇美团副总裁谈“为什么中国To B企业都活得这么惨?-4( https://ufqi.com/news/ulongpage.250.html )”的文章也提到负利率,说法是负利率就是你去向小A借钱做生意不但不用支付利息,等期末小A再多给付你一笔钱;或者说,你向小A借了100元,等期末你只需向小A还款90元就行。
这是一种错误的说法,天上掉馅饼的事不会发生(发生了也不会砸你头上),负利率不是这么解释和应用的。本文首先要澄清这一点。

1. 利率的一些定义及名词

利率,教科书上的定义是资金的价格,使用资金的成本。经济学上,正常情况下,价格是不能小于零(等于零是白送),当某种商品或服务的价格为负时,一定是异常的、极端的情况。
可能这也是美联储2020年这次一撸到底将美元的利率降低到 0–0.25% 附近,而没有一下子极端地将美元利率弄成负的。
还要注意的是,这个利率,潜台词或者默认是指“存款利率”,不是贷款利率。


(1900-2013 美国存款利率)

需要进一步地厘清可能的名词:
1) 存款利率,小A将钱存入银行时,银行按“存款利率”给付利息,这是最大众,最普遍,也是默认的“利率”的指代;
2)贷款利率,小A申请一笔住房贷款,银行发放一笔贷款给小A,小A按期按“贷款利率”支付利息给银行,当然本金也要按计划慢慢还;
3)名义利率,就是名义上的利率,官方(中央银行)公布的利率,与实际利率相对于,与通货膨胀率相关;
4)实际利率,就是名义利率扣减掉通货膨胀率之后的真实所得的利率,这部分在投资上也成为无风险收益,是计算和比较其他投资收益的基准,也称为“躺赢”的钱;
5)通货膨胀率,大致可以理解单位资金/货币的实际购买力的变化率,通俗地说是货币的贬值速度,贬值率。为何货币会贬值?( 从硬货币到代币到信用货币: https://ufqi.com/news/ulongpage.658.html

通过一番对名词的解读,我们发现,实际上,能够实现赚取躺赢的钱,很少很少,以美元利率为例,假如存款利率为 0.2%(名义利率),实际利率会是多少呢? 美联储的使命之一就是极力地维持美元的通货膨胀率在年2%以下,设若这一目标达成(很多时候只高不低),美元的实际利率是 -1.8%。 又成为负的了!
也就是目前的美元存款,没法实现躺赢,要想拿到美元躺赢的钱,只能在名义利率大于通货膨胀率时,才可能发生,也即名义利率在 2% 以上时。从美元存款利率1900-2013间100多年的历史来看,多数年份的利率都远高于 2%, 均值是 8%,这个是相当高的无风险收益了。
其他货币依此类推。

2.有存款负利率,没有贷款负利率

回头说 贷款利率,这个利率的普及远不如存款利率,因为相比存款的人,贷款的人仍然显得很少。所以也很少讨论。实际上,贷款利率与存款利率是挂钩的,这个挂钩的依据是银行的开销。


(央行一年期存款利率1.5%,贷款4.35%)

银行这种经济基础设施是需要花钱的,有各种开销。这些开销来源,一块大头就是利率差,也即贷款利率减去存款利率的差值。由于银行还有其他方面的收益,以及作为贷款方有资格在多个银行间询价,贷款利率往往不是整齐划一的,反而参差不齐,甚至相去甚远。

然而,有一点明确的是,贷款利率不会为负。即便是在存款利率为负的情况下,贷款利率还仍然高挺着不动。当存款利率为负时,你存钱到银行,需要每月给银行费用(管理费等),而还不曾发生,你从银行贷款了,银行每月还发钱给你,这就有点不符合常识,也是违背经济学基本规律的。总之,贷款利率不会为负的,负利率是一个混淆视听的说法。正确地说是,存款负利率。

等一下,储户存款负利率时,从银行的视角来看,就是银行借小A的钱用,然后每月小A还得付款给银行,对银行来说,就是妥妥地贷款负利率啊!为何会发生这种情况,为何不是逆转过来的样子?
发生了什么事? 为何资产、资金一夜之间从正资产(产生现金流)变成负资产(损耗现金流)?投资行为一夜之间变成消费活动?
为何只有银行能够享受这种贷款负利率的优惠?

3. 能坦然面对存款负利率吗?

在文章“新冠肺炎疫情之后,中国何去何从? ( https://ufqi.com/news/ulongpage.631.html )” 中,作者在谈论GDP和经济时这样感慨如下。

这很好地验证了我读博时导师对我的训诫:
你在问最好的商业模式?
很好。要么你去打天下然后收税,要么去拿一张银行牌照。

我们能够很容易地的推导出来,当存款利率为正的时候,银行是吃贷款用户的钱;当存款利率为负的时候,银行是两头吃,继续吃着贷款客户的利息,也同时吃着存款用户的钱。

问世间真有这么好的商业模式吗?这么梦幻的事情正在发生,在那些存款负利率的国家。庆幸美联储、中国央行等还没官宣存款负利率,虽然通货膨胀率已经完全抹去存款名义利率的收益,好在这还起着遮羞布的作用。

如果掀开了存款正利率这块遮羞布,将存款利率弄成负的,银行狰狞的面貌就露出来了,站在它背后的大Boss也若隐若现了。
也许有经济学家或者银行辩驳说,吃储户的钱,就可以降低贷款户的利率了,然后支持经济发展,bulabulaaaa…… 

存款负利率是对公民财产赤裸裸地剥夺,是明火执掌地征收“货币税”。持有某种货币,所以要纳税(收费),只是这个税未经法定,收取机关也不是税务局,而是银行。
将富裕阶层分化升格为大富豪或降格到中产,将中产阶层直接降格为无产,无产阶层免受其害,因为不持有“货币”。

这将加速社会两级分化,财富进一步地向少数人集中,中产无可避免地下坠到无产,到后来,绝大多数人除了可以出卖的劳动力,其他一无所有。

4. 危言耸听的风险错配

存款负利率的实施会加速摧毁中产阶层,使之降格到无产阶层,而不是升格到富裕阶层。可以想象的是,面对为数不多的一笔存在银行里的钱,每个月要还“利息”,怎么想都觉得不爽,要么花掉这笔钱,吃喝玩乐算了。

理性的人,会将钱取出,去买理财等进行有风险投资活动。注意我们上面提到存款利率是无风险收益。现在没有无风险收益,而且还要倒贴钱拿着这笔钱,又不能吃光花净,只好冒险去进行有风险的投资活动。

在一个危机四伏的投资环境里,对于不懂、不擅长进行风险管理的投资者来说,亏完这些血汗钱,可能只是时间问题。
这本来是专业风险管理、专业投资进行的活动,因为存款负利率完全转移到毫无理论知识和实践经验的平民百姓头上,作为不同专业、不同职业的人,可能完全没有投资理财的技能,也不会学习投资理财的知识。

中产就这么慢慢地被消解为无产,而一些富裕阶层,由于需要更多地面对有风险的投资活动,在一次次有风险的投资活动中,或输或赢,保持富裕阶层,或消解为新中产,进一步地大概率地滑落到无产。

当我们还在讨伐“食利阶层”时,一不小心地,我们都成了,日光族、月光族和年光族,从此再无需为存款负利率担忧,稍有风吹草动,生活也可能万劫不复,因为没有可以代替肉身抵挡风险的“资产、资金”。

或许只是危言耸听,普通民众只是多了一项“货币税”而已,我们从摇篮到坟墓,我们所交的税多得多了。只是相比较而言,这个“税”有些特殊,令人锥心。

如果有那么一天,存款负利率时,我们也能同时申领到贷款负利率的贷款,或许会好些。

https://ufqi.com/blog/captial-rate-and-minus-rate/

-R/c2SO

https://ufqi.com/news/ulonglist.405.html

https://ufqi.com/news/list.2397.html

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

汽車老司機車載汽車老司機好奇婴幼儿中国国民党革委会

GWA2吉娃兔🐇升级模板引擎子系统

近期,全球范围内的新冠肺炎疫情有所缓解,抗击疫情有发展成为常态化的趋势,复工复学正有序展开。GWA2 吉娃兔🐇 在此期间升级改进了模板引擎系统。

这是一件令人开心的事,夙愿已久,终得实现。
大约7-8年前,当我们完成GWA2 PHP版本所有主要功能架构后,开始审视代码进行加强和优化时,就设想在模板文件的加载部分需要优化改进。 这一设想,拖来拖去,竟然有7-8年过去了。

通常情况下,GWA2专注于架构设计,遵循 MVC的设计理念,将 V(视图)的工作交给了当时选定的 Smarty模板引擎来处理。像我们在此前讨论的一样,Smarty模板引擎被选中,是有一些考虑在里面(参考:㊗️ GWA2/吉娃兔🐇八周年啦!GWA2内置模板引擎成功由Smarty替换为Hanjst , https://ufqi.com/blog/gwa2-8-years-with-smarty-to-hanjst/ );同样地,当我们使用 Hanjst汉吉斯特替换 Smarty时,也是对这些考虑的再次审视。

重启这一问题,是因为 GWA2在准备数据和模板文件之后,在模板引擎工作之前,还有一些工作需要处理,这就是 GWA2的模板引擎子系统的预处理部分。这部分主要包括大致两方面的工作。

  1. GWA2 模板引擎子系统的两件工作
    1. 模板子系统之前预处理
      GWA2 在结束一次请求的业务处理之后,会根据输出变量 fmt 的具体情况来决定将要输出内容的格式,是纯文本,还是普通的HTML,还是JSON 或者 XML。
      在这一步完成后,如果需要输出HTML,在指定了待输出的模板文件之后,余下的工作将由模板引擎来跟进处理。
       .
    2. 设计层的静态内容替换:资源路径、关键词等
      通常的软件项目开发中,设计师和工程师,前端工程师和后台工程师,是不同的角色,由不同的人来担任。这主要是由于他们各自的工作不同。
      在网络应用中,特别是网页应用中,视图通常是普通的HTML,当前端工程师将HTML准备好之后,相应的HTML文件被添加到项目代码库中。

      只是这样的HTML原文件还不能直接使用。主要原因包括,需要需要改一些页面的头部和尾部共用的部分,这些共用的部分,需要提取出来,单独存放,以便于共用,或者实现模板的嵌套等高级功能。

      另外一项必不可少的工作是对资源路径、关键词进行替换等。原始的HTML代码可能是如下这样的情况:
      ….
      <img src=”images/abc.png” alt=”an image”/>

      这里的一个图片元素,其路径是相对路径,而到服务器端真实环境时,可能相对路径就不能用了,它与用户实际访问的路径可能不在一个地方。这时候,就需要对 “images/” 进行替换操作。
      这次替换操作,是每次模板加载时都是动态替换的。
      如果没有模板缓存,则每次都需要动态替换,除非程序开发人员在拿到HTML文件时手工给修改一次。
      这是理智的,却不是实际可操作的,因为设计师和前端工程师通常需要修改HTML,每次递交到系统都来一次这样的手工替换修改,是恼人的,也是不可靠的。

      所以,多次实践之后,我们考虑还是将这部分工作交给程序和系统去做比较可靠。与之对应的,模板应该有缓存机制,这也是我们最早就注意到要优化的地方之一。
      .

    3. 模板文件的读取加载
      模板文件在完成动态替换后,还需要实际的实现从磁盘文件读取然后输出给客户端的过程。

      这一过程的缓存也尤为重要。如果缓存了相关页面,则每次读取时,不需要磁盘操作,直接从相应的内存缓存中进行读取,速度会大幅提升。
      额外地,有些模板引擎还能够对模板进行预编译,进而更快地提升模板引擎的处理速度。
      .

  2. GWA2兼容 Smarty模板引擎 和 Hanjst汉吉斯特模板引擎
    1. Hanjst汉吉斯特模板引擎
      Hanjst汉吉斯特是目前 GWA2 默认的和推荐的模板引擎。(参考: https://ufqi.com/blog/category/hanjst/ )
      Hanjst 在接管模板加载工作后,也需要需要完成上述两项工作。通过磁盘文件系统读取模板文件,进行替换资源路径操作,然后再将替换后的模板内容与要输出的环境变量内容一并输出到前端。

      在前端页面通过 JavaScript完成数据内容与模板形式的融合。
      加入模板引擎子系统的缓存后,上面的预操作(读取模板文件,替换静态内容)就可以省略,其仅在缓存失效的情况下再重新做一遍预操作的工作。当预操作完成后,进行缓存写操作,以便接下来的第二次请求使用缓存内的模板形式,从而避免了读取磁盘文件内容然后进行静态内容替换等操作。
      提升了模板加载效率,也提升了系统处理速度。
      .

    2. Smarty模板引擎
      Smarty模板引擎即将被替换掉。在 GWA2 中,我们将在未来的版本逐渐使用 Hanjst 替换掉 Smarty . 目前 GWA2 Java的模板引擎已经升级为 Hanjst. GWA2 PHP的模板引擎还是 Smarty,预计会在未来1-2年内完成从 Smarty 到 Hanjst 的升级.

      在现有的版本中,我们也对 Smarty模板进行了一定的缓存支持升级改进。早前Smarty 本身已经具有一定的预编译与缓存操作。
      GWA2 的预操作在其之前,也即读取文件并做静态路径替换等。
      增加了这些预操作的缓存之后,GWA2的 Smarty 模板引擎子系统有望跑得更快。
      .

  3. GWA2 模板子系统缓存开关 
    缓存对正式运行环境有帮助,较明显地性能提升,但对开发环境有干扰。
    也即修改不能及时提现出来,有缓存周期。有鉴于此,我们在 GWA2 中对模板缓存开启设置了两个变量开关: is_debug 和 enable_cache .

    只有 is_debug == false 并且 enable_cache == true 时,才会开启 GWA2 的模板引擎的缓存。 前者的变量是针对是否开发环境的约束,如果是开发环境,则不会开启缓存,任何在模板文件上的修改即可生效。
    只有 enable_cache == true 才能够支持模板引擎的缓存,否则无处缓存。

    因此,如果不想启用模板引擎缓存,可以任意修改这两个控制变量其中一个即可。当然,也可以在输出控制的程序里 comm/footer.inc 中直接操作 enableTplCache 变量,使之始终开或者关。

    此外,我们还单独提供了模板缓存的单独有效期变量, tplCacheExpire, 其默认取自于 GWA2 的缓存有效时长。

 

五月是美好的季节,在姹紫嫣红、麦浪滚滚的时光里,从更深层面近乎完美地实现了多年来的一个心愿,所谓幸福,大抵如此。对个人如此,对 GWA2 社群,应该也是福音。

已经启用模板引擎缓存系统的产品包括 有福新闻( https://ufqi.com/news/ ) | 有福常在( https://ufqi.com/news/mod.ulong.html ) | 木子商城( http://www.muzimed.com ) 等。

 


-GWA2 是”通用网络应用架构( General Web Application Architeture )”,基于 -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 NativeApp, 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
轻松启动, 快速产出.

https://ufqi.com/dev/gwa2/

-R/E2SS

https://ufqi.com/blog/gwa2-updt-template-engine/

发表在 -GWA2, -Hanjst/-汉吉斯特, 服务器运维, 编程技术, 计算机技术 | 标签为 , , , , | 4条评论

汽車老司機車載汽車老司機好奇婴幼儿中国国民党革委会

☘ gMIS吉密斯升级:点选Pickup2.0和安全及权限系统等

落霞与孤鹜齐飞,秋水共长天一色

2020年以来,新冠肺炎疫情持续肆虐中华大地,继而蔓延至全球,成为世纪大流行瘟疫。我们持续支持全球众志成城、携手并肩,共克时艰,攻克病毒。

gMIS吉米斯部署的实例日益增多,二次开发者也不断跟进研制新功能或完善现有模块。在使用过程中,gMIS吉米斯不断迎接新的需求,也发现一些亟需改进的功能模块,如下是一些最近的更新记录,备忘于此。3月份开春以来,gMIS吉米斯也迎来更新的密集期,如下是继3月的 “gMIS吉米斯升级支持IPv4/IPv6双栈网络模式( https://ufqi.com/blog/gmis-with-ipv4-ipv6-dual-stack/ )” 之后又一次一定范围升级。

1.  gMIS Bugfix:getUrlByTime + Pickup

点选Pickup 是 gMIS吉米斯标志性功能之一,这一模块详情在 “超越前端Beyond Frontend — 吉密斯/gMIS 增加点选/PickUp概览功能( https://ufqi.com/blog/beyond-frontend-gmis-updt-with-pickup/ )” 中有详细的记载与描述。

点选Pickup 实现的原理是,在页面加载完成后,对目标数据表相应字段的值进行范围划分,并根据设置将这些值划分到10个或者更多个区间,然后每个区间作为一个点选的选项,陈列出来。随后,用户根据自己的意图,进行某个或者某几个区间的点选,进而自动形成筛选条件,呈现出筛选结果集来。

这是理想的点选应用的场景,有时候事情往往不一直是这样。比如 gMIS还有另外的功能,可以自动生成按时间区间的超级链接,今天/昨天/本周/上周/本月/上月 等,如果这个本周的时间范围,与点选的区间不重合,就会出现问题。

这次的升级就是要解决这个问题,解决问题的办法是,当用户/系统的请求的区间范围不在点选的候选列表的区间时,就自动将这个不在任意区间的选择条件作为一个新的区间,附列在点选条件对应的列表后面。我们称之为 点选Pickup 2.0.

2. gMIS系统安全加固
2.1. 登录会话:闲时自动退出后的返回按钮阻止处理

当无交互动作(键盘,鼠标)处于闲时状态时,过一个给定时间自动退出,此时按浏览器返回按钮,通常会回到退出前的一个页面。

gMIS的权限设计中,鉴权的依据是SID,如果这个SID没有失效,则刷新一下还可以用。所以,超时自动退出这样的事情,就有了两个思路:

A. 在签发SID的时候,将其有效时长约定为希望用户无交互时的最大等待时长;
B. 在浏览器的网页里通过JavaScript实现对回退按钮的阻止;
C. 当然了,也可以A和B同时使用。

本次安全加固的修改之一即是实现上述目标,阻止用户在约定的时候内弹出后再回退到系统中来。

2.2. 权限系统改造:闭合系统close-end向开放open-end转变

基于防火墙理念设计的权限系统能够满足几乎所有能够想象得到的用户访问控制。

开放系统,默认所有模块向所有人可用,如果需要进行权限约束的地方,再逐项约束条件加进来,以实现对访问的限制。
闭合系统,默认所有模块向所有人不可用,如果需要某些模块向某些人开放,再逐项增加许可条件进行开放,以实现对资源的可用。这是此前 gMIS吉米斯采用的权限设置策略。

明显地,闭合系统适合对安全要求苛刻的场景和案例,遵守“无授权不许可”的原则,实行的是“白名单WhiteList”制度;而开放系统则适合一般常见的场景和应用案例,遵循“法无禁止即可行”的原则,实行的是“黑名单BlackList”制度。
此前gMIS吉米斯选择闭合系统,是基于安全的考虑,现在转为开放系统也考虑到应用gMIS吉米斯的更多的中小企业、中小型管理信息系统的场景。

有鉴于此,我们针对 gMIS的权限系统做了改进,使之默认的权限实施由闭合系统转为开放系统。

当然,所谓的闭合系统(close-end)和开放系统(open-end)都是相对的,比如在闭合系统里,如果加上一条访问规则,允许所有组的用户访问所有组的模块,则其实际上就成为一个开放的系统;同样地,如果在一个开放的系统里,如果加上一条访问规则,不允许任何组的用户访问任何组的模块,则该系统又瞬间由开放系统转为闭合系统。

如此以来,则实现了,开合自由,最大限度的将选择权交给系统管理员。

2.3. gMIS权限系统升级:对人为错误尝试兼容

基于防火墙理念的权限系统设置,对系统管理员有一定的要求,要求熟悉用户访问规则的书写,当发生非预期情况时,能够根据警告信息或者日志记录进一步地的分析原因,定位限制实施涉及到的条款,然后排解故障。

系统管理员终归是人,难免有偏差和遗漏,为此我们在gMIS吉米斯系统权限审查程序中增加了对可能出错的条款的兼容,一个隐式的规则是:当单元模块与单元模块组发生错配时,通常会丢弃这一错误配置,现在进一步地修改为,仍旧使用单元模块进行权限规则的适配,进一步地降低错误带来的伤害,进行一定程度上的容错。

也正是因为此,gMIS吉米斯 使用了迄今位置最为复杂的一条SQL查询语句,这也从另外一个侧面反映是SQL语言复杂表达能力和MySQL数据库强大的解析能力。

select id,accesstype,objectfield,userid,usergroup
from useraccesstbl
where istate=1 
    and (
       (
            (userid='”.$thisId.”‘ or userid=0) 
            and (usergroup='”.$thisGrp.”‘ or usergroup=0)   
            and (objectid='”.$objId.”‘ or objectid=0)
            and (objectgroup='”.$objGrp.”‘ or objectgroup=0)
       )
       or (userid='”.$thisId.”‘ and objectid='”.$objId.”‘)
      )
order by id desc, accesstype desc limit 100

每当构造这些复杂而强大的SQL表达式时都会感慨SQL语言的设计者的精巧与智慧,也同时对强扭作态的基于反射与映射的开发框架执行创制的各种检索命令表示遗憾与可惜。如果不设计成SQL这样就无法完成类似表达,而如果设计成同样的,几乎等于是重复相同的工作。

3. 增强对页面 UTF-8和页面语言的声明

此前:
<meta http-equiv=”Content-Type” content=”text/html;charset=utf-8″ />

改进后:
<meta http-equiv=”Content-Type” content=”text/html;charset=utf-8″ />
<meta charset=”utf-8″/>

相应地,根据gMIS 对 i18n 多国语言的升级,gMIS吉密斯i18n多语言国际化更新( https://ufqi.com/blog/gmis-i18n-updt/ ),我们也增加了针对 html lang的属性指定。

此前:
<!DOCTYPE html><html>

改进后:
<!DOCTYPE html><html lang=”{$lang[‘ilang’]}”>

4. 改进表单验证:增加对必填项的星标提示和高亮显示提醒

对于必填项,在录入表单中给与星标提醒;在递交表单内容时,对需要进行录入数据验证的,按指定的规则进行验证,对于不符合要求的数据项,给与高亮显示,并终端表单递交,等待用户的进一步操作。

表单数据项的验证,只要依靠 -GTAjax 来进行,详情参考: https://ufqi.com/dev/gtajax/ 。

5. gMIS软件使用授权增加开源许可协议Apache License.

gMIS吉密斯开发者和用户可以任意修改、使用,保留相应版权信息, 遵循 Apache开源软件许可协议。

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

    需要给代码的用户一份Apache Licence
    如果你修改了代码,需要在被修改的文件中说明。
    在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
    如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

.

6. gMIS 内核 inc/Dba升级

伴随gMIS 的底层架构 GWA2 吉娃兔 ( https://ufqi.com/dev/gwa2/ ) 的内核Bug修复升级,gMIS吉米斯也对其 inc/Dba.class 进行升级改进。主要改进是在 SQL语句进行安全检查前,需要匹配字段名和赋值的对应关系,这已经是 GWA2 在这方面的第三次较大范围的算法改进。

涉及到的类和方法: inc/dba.class: hm2idxArray .

7. gMIS 顶部菜单布局调整

改进了顶部菜单栏的布局,修正了其中 通知区域的CSS错误,改变了各个列的显示比例。

其他细节修饰的调整。

涉及到的页面: view/index_main, view/ido_main .

 


-gMIS (general Management Information System,吉密斯) 是一种基于 -GWA2 (General Web Application Architecture,吉娃兔) 的通用管理信息系统应用软件,具有可配置的输入和输出接口、开箱即用等特征。

可以在 gMIS吉米斯 上构建各种管理信息应用系统软件,例如:
内容管理系统(CMS), 客户资源管理(CRM), 企业资源计划管理(ERP),
办公自动化系统(OA)等,
也可以是各种行业应用管理系统软件,例如:
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统(BOSS)等等。
gMIS吉米斯 能够实现零代码开发、数分钟内快速搭建各种管理信息系统(MIS, Management Information System).

-gMIS is a -GWA2 based Management Information System (MIS) software with characteristics like configurable input and output interfaces, open-box-to-use.
Various management application software systems can be built on it, such as
Content Management System (CMS), Customer Resource Management (CRM), Enterprise Resource Planning Management (ERP),
Office automation systems (OA), as well as different industry application management system softwares, such as
Human Resource Management System (HR), Student Management, Archive Management, Tourism Management, Book Management,
Commodity management and business operations support systems (BOSS), etc.
With zero code development, -gMIS can build a set of management information systems (MIS) software in a few minutes.

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

发表在 -gMIS, -GTAjax, -GWA2, 服务器运维, 编程技术, 计算机技术 | 标签为 , , , , , , | 2条评论

中国国民党革委会中国国民党Apache Softwares亮月亮科技