🙋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/  。

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

Posted in -Hanjst/-汉吉斯特, 编程技术, 计算机技术 | Tagged , , , | Leave a comment

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

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

Posted in 社会生活 | Tagged , , , | 1 Comment

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/

Posted in -GWA2, -Hanjst/-汉吉斯特, 服务器运维, 编程技术, 计算机技术 | Tagged , , , , | 1 Comment

☘ 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.
降低成本,
提高效率.

Posted in -gMIS, -GTAjax, -GWA2, 服务器运维, 编程技术, 计算机技术 | Tagged , , , , , , | 1 Comment

🙋Hanjst汉吉斯特升级:+showImageAsync及性能改进等

自2019年元旦🙋Hanjst汉吉斯特 模板语言及其编译引擎发布,已经过去一年多了。

这期间随着 🙋Hanjst汉吉斯特 的推广应用,我们也陆续发布了如下一些更新内容:
🛠️Hanjst/汉吉斯特更新加JavaScript运行时优化等
汉吉斯特Hanjst+更新升级:error reporting, innerLoop和loadingLayer
汉吉斯特Hanjst模板语言及引擎在线文档Doc&API首发

最近又对Hanjst汉吉斯特进行了一些更新,分别叙述如下,以备查备忘。

1. 升级: 增加API接口函数 Hanjst.showImageAsync, 用于显示HTML的图片元素

1.1. 背景及问题

<img src=”{$imgPath}” alt=”” />
该语句在 Hanjst 调用之前会造成一次对服务器端不存在的图片文件 “{$imgPath}” 的无效请求。
若非服务器端做了一些基于 .htaccess 的指向,这个请求多数情况下会返回 404 错误。实际是无意义的操作,应该设法避免。

1.2. 解决思路方法
解析HTML的页面元素 <img 是由浏览器的页面解析引擎触发,因此在流程上无法阻止对 <img 的解析。可行的思路是可以在 <img 的属性src上做文章,也即给 src 一个确定的,没有 Hanjst汉吉斯特变量的值,这样在加载时,就不会有异常抛出,然后在通过某种机制,让真正的 src值重载到这个 <img 元素上去。

给HTML中的 img 元素找一个合法合理的 src值并不容易,在网上已经讨论了很多,src值如果是“” 空值(src=“”)的话,往往会导致重新加载一次当前页面作为当前img的数据源,这显然不是预期的效果,同样的,src=“#”, src=“javascript:”, src=”about:blank”,  src=”//:0″ 等等都不是很理想。

经过一番探索,我们觉得给src能够获取预期的效果的有两种思路:
A. 给予 src=”img/default.png” , 给一个默认缺省图片路径;
B. 给与 src=”data:image/png;base64,MA==” , 给与一个内容为 0 的base64图片值。

有了图片的src替代值,然后再使用 data-src 引入图片的真实的src值,通过JavaScript在页面元素加载完成后,将data-src值正式写入到当前的 <img 元素中去。

下一个待考虑的问题就是,如何调用这样一个方法或者对象,比如在 Hanjst里增加了 showImageAsync, 引用时,是写作: Hanjst.showImageAsync , 还是将这个方法输出到全局变量 window上去,写作  window.showImageAsync 或者 showImageAsync ?

经过一番思考,我们审慎地将 showImageAsync 输出到全局变量 window 上。这样在使用时,可以直接调用, 写作: showImageAync(imgId) 。

1.3. 样例

修改前:
….
<img src=”{$imgPath}” alt=””/>

修改后:

<img src=”data:image/png;base64,MA==” alt=”” id=”{$imgId}” data-src=”{$imgPath}”/>
{$showImageAsync($imgId)}

1.4. 扩展支持更多图片异步加载
图片异步加载,对改善页面在低速网络下的表现有极大的帮助。我们在 写写5G网速及页面提速中的延迟加载Lazyloadinghttps://ufqi.com/blog/5g-network-speed-webpage-lazyloading/) 中进行了描述,如果在 Hanjst汉吉斯特中默认就集成了这样的功能,或者整个 Hanjst或者整个页面的表现具有较大的帮助。

在非上述情况下的一些场景中,也可以主动引入 showImageAsync 来使得图片能够异步加载。这一点可算是额外收获,买一赠一。

2. 改进:引入局部 bracketPos 和 dotPos ,用于判断模板语言的表述

2.1. 背景及问题

1)  {$aFunc(0.2)}  –> 解析有误。

在Hanjst的语法定义中,要在当前位置显示一个变量,直接使用如下写法即可:
2) {$var}

同时这个字符和后面的表达式还可以表示更多的意义:
3) {$aFunc()} –> 执行 aFunc函数并将结果显示在当前位置;
4) {$aFunc($var)} –> 携带参数执行 aFunc函数并将结果显示在当前位置;
5) {$aFunc($var1, $var2)}  –> 携带两个以上参数执行 aFunc函数并将结果显示在当前位置;
6) {$var.substring(0, 10)}  —> 针对变量 $var 执行JavaScript原生的字符串截取函数substring,并将结果显示在当前位置;
7) {$var=1} –> 正常的 JavaScript 赋值语句,不会在当前位置显示任何内容;
8) {$var++} –> 正常的 JavaScript 字符串运算操作,不会在当前位置显示任何内容;
  
然而,针对表达式 {$aFunc(0.2)} 的解析过程中,发送了错误,主要问题是在区分 . dot 和 , comma 时发生了异常,需要修复。

2.2. 解决思路方法

定位到问题的原因是由于  . dot 和 , comma 的位置问题,在程序中针对该场景下增加兼容即可,涉及到的改动也不算大,主要是在局部增加了变量 bracketPos 和 dotPos。判断的情况包括,当 dotPos 小于 bracketPos 时,是通常情况下的 6) 的表达式, 当 dotPos 大于 bracketPos 时,就是要表达的 1) 式。

2.3. 样例

修改前:

{$aFunc(0.5)} –> 解析错误,程序抛出异常

修改后:

{$aFunc($abc)} –> aFunc($abc)
{$aFunc(0.5)} –> aFunc(0.5)  ,携带参数 0.5 执行函数 aFunc 并将结果显示在当前位置
{$a.substring(0, 5)} –> $a.substring(0,5)

3. 其他一些改进优化

3.1.  重新启用 Hanjst.asyncScriptArr。
3.2. 改进 appendScript。
3.3. 改进了异步调用导入脚本程序的时序。
3.4. 同步更新了 Hanjst的在线文档手册( https://wadelau.github.io/hanjst/index ),+showImageAsync 自定义函数章节.

….


🙋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 control and achieve the same functionality 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;

  • ….

 

Posted in -Hanjst/-汉吉斯特, 编程技术, 计算机技术 | Tagged , , , | 3 Comments

写写1929年美国经济大萧条与2020年美国股市大跌

2020年初就注定了这是不平凡的庚子年。跨年的新冠肺炎疫情在全球蔓延,叠加沙滩与俄罗斯的石油协议谈崩,美国股市经历了史上最严重的大跌——就是最严重的,没有之一。
美国股市截至目前(2020Mar22)只有发生五次因为下跌引起的熔断,而2020年3月的这两周内,就占了其中四次。活了80多岁的投资大师巴菲特在第二次发生时说,活了那么久此前只见过一次,话音未落,第三次、第四次和第五次接踵而至,祸不单行!
所以其灾难程度,似乎远超过2008年的次贷危机,直接与1929年的大萧条相提并论。

关注和学习经济学以来,逐渐形成对经济危机的史前认知:… — 经济扩张 — 生产过剩  — 不合格信贷 — 信贷危机 — …., 以2008年次贷危机为蓝本,我大致绘制了经济危机发生的周期性机制。

最近几天接连读到 萨缪尔森:经济学文昭谈古论今:1929年大萧条 , 傅志彬洗脑的历史 和 招商证券的美股下跌的逻辑与A股见底的信号 等相关资料,这些竟然都是相通的,于是尝试在吸收和消化的基础上做些整理与回顾的工作。
这也是近几年来研读经济学读物的心得体会的试水之作。

1. 1929年经济大萧条的成因

经济危机或者经济大萧条是令人恐怖的事情,其危害程度不亚于一场战争。资料记录显示1929年的大萧条直接或间接导致美国约700万人丧生,约占其总人口的7%(?)。 2008年的次贷危机,据记录,约有 730万工作机会消失,由此导致的灾难及死亡目前还没查到相关数据。

传统意义上,或者“正统”的经济学历史上,对1929年的经济大萧条,普遍认为是资本主义本质缺陷问题,自由市场发展到一定阶段的必然产物。对其开出的药方就是政府大幅度干预经济,进行投资扩张,以图恢复和提振经济,使其脱离泥潭,重新走上正常轨道。

根据 文昭谈古论今:1929年大萧条的原因分析 和 傅志彬: 洗脑的历史——后洗脑时代 的内容解析来看,1929年的经济大萧条的触发诱因可能存在经济基本面的问题,但当时的货币政策和财政政策未能正确处置问题,化解风险,才是导致后来经济大萧条的根本和直接原因。

“佛理德曼1941-1943年为罗斯福政府财政部顾问,是新政的制定者,参与者。当然,后来佛理德曼转变了态度,变成了彻底的自由经济倡导者。

佛理德曼认为,1929年的大萧条并不是什么资本主义经济本质缺陷造成的,而是当时具有发行货币权力的几家美联储银行错误的货币政策造成的,大萧条的罪魁祸首不是自由经济造成的,而是政府干预过多造成的。

最后美国走出经济危机也不是什么罗斯福新政的功劳。(《自由选择》《《资本主义与自由》)”

复盘1929年当时的情况,如果央行或者财政部提供了及时的流动性,阻止银行倒闭,从而避免银行储户的挤兑风潮,也许历史或应该改写。关于经济上的凯恩斯主义和自由主义的论述,在  “聊聊中国社会现状–潜规则-2 ” 中也有相关类似的讨论。

所以,从本质上看,当经济危机发生时,基本面有异常,初期是对经济发展预期的管理,中期是对流动性的支持,而后期应该是降息减税使得企业融资成本降到最低。至于强势政府干预,进行以政府为主导的投资活动和经济扩展,则不是非必要的。

政府的角色,始终是对市场的监管,对垄断的警惕,对金融机构的苛刻,从而为市场经济的主体营造公开、公平、自由竞争的营商环境。其他的则会水到渠成,纷至沓来。

如上图周期性分析所得,垄断的形成会加剧贫富两级分化,这本身就是社会稳定的定时炸弹;而放松对金融机构的依规合法地苛刻监管,则可能导致流动性问题,进而将金融问题传导转化为经济危机。

2. 2008年经济危机回顾

根据 “招商策略:美股下跌的逻辑与A股见底的信号” 中对 2008年经济危机的分析,大致可以简单概况为,贝尔斯登和雷曼兄弟的倒下,并没有引发储户的挤兑,也没有进一步地传到到商业(储蓄)银行。
原因可能是由于这两家银行都是投资银行,其客户小众且受众群体单一,而后续的美联储和财政部等联手为后续的银行提供无限流动性支持,则从根本上阻断了危机进一步传到商业(储蓄)银行,也就不会发生像1929年储户挤兑银行的事情。

从这一点上来看,2008年金融危机期间的政府(央行)救市的行为是正确的,成功的。与之对应地,我们可以粗略地评价说,1929年经济危机期间,政府(央行)的救市行为是错误的,失败的。

这种在经济基本面发生偏差时,初期的经济发展预期干预失败(恐慌蔓延),中期的流动性支持失败,后期的解救并刺激(降息减税)经济失败,在任何时候任何政治、经济体制下都可能发生,且一定会导致严重的经济大萧条。这种情况的发生,与是否资本主义,还是社会主义关系不大。

如果简单地说,1929年的经济大萧条是经济的基本面发生问题(虚假的繁荣),初期的经济发展预期干预失败,中期的流动性支持失败;2008年的金融危机可以归结为,经济活动中的金融监管失败(不合格的贷款发放),发展预期干预失败,所幸的是中期流动性支持获得成功,从而阻止了2008年的金融危机转化为更严重的经济大萧条。

3. 2020年美国股市大跌观望

2020年庚子之初,新冠肺炎疫情始发于中国武汉,一时突然爆发,全国封城封国,禁止一些人际交往和经济活动,除了保障民生的基本物资流通,其余的皆处于封停状态。

中国武汉的新冠非典疫情持续1个多月后,病毒进一步扩散蔓延到全球各个国家和地区,从而引起本轮的美国股市大跌。

2020年2月19日开始,新冠疫情在全球加速蔓延,情绪冲击下美股开启第一轮下跌,到2月末跌幅12.3%。
3月5日~3月9日,油价暴跌引发投资者对经济衰退的担忧,美股超跌12%,避险资产黄金和美债涨。

3月11日~3月18日,市场的暴跌引发流动性问题,杠杆资金被动平仓、机构恐慌、回购市场流动性匮乏,FRA-OIS利差类似2008年一样快速飙升。
美股或有最后一跌:欧美疫情尚未得到控制,疫情造成的经济冲击才刚开始,未来两个季度经济数据将出现明显下滑,失业率飙升。

概况地说,经济基本面由于疫情的封城封国必然导致下滑大跌,股市作为经济的晴雨表进行大跌,是必然的正常表现;此时就需要对预期的干预,然而,显然地病毒的传播,不以人的意志为转移,在有效疫苗发明之前,其他都是暂缓权宜之计,预期干预失败。

经济危机发展到需要政府为全社会经济活动提供充足流动性支持。
对银行的资金支持,使其免受储户挤兑;
对企业的资金支持,为其提供低息甚至0利率贷款,为其降税免税,为其承诺/营造良好预期,使其免于因倒闭而造成更大范围的失业人群;
对民众的资金支持,为其提供直接现金补助,贷款展期等等,使其免于由铤而走险而造成社会动荡。

紧随其后地,随着对病毒的深入研究,尽快找到疫苗,平复恐慌心理,政府进一步地降息减税,促使市场主体——企业复工复产,经济逐渐恢复,市场得以休养生息。甚至是撸起袖子政府直接下场投资公共事业项目以快速提振经济。

然后一切如旧,天下太平,歌舞升平。

只是黎明到来之前,有人将看不到日出。不幸被病毒感染致死诚可怜悯,因经济危机次生灾害导致的家破人亡亦令人惋惜。
过冬时,那些储粮的能熬过,那些没有储备的或者储备不足的,显然要全靠政府的救济,救济不足或未被及时救济的,就成了经济危机的牺牲品。

这时候比任何情况下都需要全社会发挥人道主义精神,共克时艰,共度难关。
一个高度全球化的社会,高度信息化的时代,彼此唇齿相依,休戚与共,山川异域,风月同天。

Posted in 社会生活 | Tagged , , , , , , , | 1 Comment

写写5G网速及页面提速中的延迟加载Lazyloading

最近关注网络速度多一些,无论是财经人士口中的新基建的5G,还是家庭路由器中的5G Wifi,也包括即将购买新的5G手机… 写完上一篇:gMIS吉米斯 升级支持IPv4/IPv6双栈网络模式  之后,觉得还有必要再写写热点5G及其带宽速度。

尽管互联网络已经突飞猛进地发展建设这么多年,如果留意某些情况下,打开一个图文页面仍觉得很吃力。尽管终端手机和运营商都提供了百兆、几百兆的连接速度,基本的图文页面打开,仍难用流畅来形容。

冷静地观察一下,眼下的网络浏览有点像开车去城里的大医院看医生的过程;
1) 飞速地冲出小区上了城市主干道(宽带入户:快),
2) 主干道拥堵,龟速(社区到电信局共享带宽:卡),
3) 跨区快速路、城市环路拥堵,龟速(城市间、运营商之间、跨国:堵),
4) 进医院区难、停车漫长,挂号排队漫长(服务端带宽及队列:慢),
5) 见医生,快速面谈几分钟(服务器处理单个请求:快)。

概略地看,现在的堵点在中间网络层,不在终端层(最后一公里),无论是快速的5G手机、5G基站,还是光纤入户几百兆、千兆的路由,出了小区之后开始就卡、堵、慢。拥堵点在社区到电信局、跨城市跨运营商跨国家以及服务器端带宽及队列,也即骨干网和数据中心

1. 5G Wifi 和 5G Cellular

两者的共同点是,这两个5G都是无线通信技术。
这两者的区别是前者的5G是指Wifi通信标准802.11x中的 5Ghtz的频率段,而后者5G是指第五代通信标准,具体用到多少频率段,各国各运营商自己选定。下图是中国三大运营商的5G Cellular用到的频率段。

5G Wifi 和 5G Cellular非要翻译一下是: 5G Wifi: 5G赫兹频率的高保真无线连接技术;5G Cellular: 第五代蜂窝式组网技术 。5G手机,就是支持第五代蜂窝式组网技术的手机。5G家用路由器就是支持5G赫兹频率高保真无线连接技术的路由器。

近期网络新闻中扑面而来的5G应该是指 5G Cellular,可想而知,扩展再多的5G基站,使用再快的5G手机,也无法解决上述过程中的卡、堵、慢。5G Cellular下的点对点的局部连接,或有积极意义,对推动局部组网的物联网或有帮助。

这么拥堵而艰难的骨干网和数据中心,为何一些成规模的互联网服务还是看起来很流畅,图文浏览不说,甚至是视频点播、直播也还可以?大致有三点:1) 资源下沉&前置到用户最近的地方(医生到小区门口开诊);2) 压缩及传输技术的进步使得高清图像数据流可以在低速网络上运行(骑车或者开飞机去看VIP医生);3) 热点数据.

这些都需要巨大的开支(更多的硬广告时间/更构陷的软内容设计)来支撑。

2. 网络页面加载中的延迟加载Lazy loading

无论是终端提速,还是骨干网和数据中心的提速,都是系统工程、社会工程。作为其中的个体,一个网站和一个网页如何能在既有的网络速度条件下,为用户提供更好的浏览体验,是技术和设计人员需要共同考虑的问题。这其中延迟加载Lazy Loading技术是颇受欢迎的技术之一。

 通常情况下,浏览器加载一个图文页面,通常是按自然顺序,由前到后,自上而下的进行。当某些资源尺寸较大时,可以通过一些技巧跳过这些大块头,将页面全貌布局显示完成后再分出时间和精力来处理这大块头的对象,这就是延迟加载。

比如网页中的图片,或者较大的数据List。我们曾经在 gMIS吉米斯 的部署中遇到要将上万条记录加载到一个 Select 中的需求,通过异步延迟加载可以很好的改善浏览体验,避免页面卡死。

gMIS/吉米斯 GitHub源代码:
comm/ido.js: function imageLoadAsync(imgId, imgRealPath);

细究起来,延迟加载Lazy Loading可以区分为两个层次:
1) 将图片等从主体文本中区分开来,通过网页中的 JavaScript 的 window.setTimeout 可以将某些图片延迟加载;
2) 更进一步地,可以将一组图片的每一张都使用网页中的 JavaScript 的 window.setTimeout 分别予以延迟一定的时间。

尤其是后一种做法,只要延迟的速度跟得上用户的浏览和阅读的速度即可,这样可以避免同时并发多个HTTP请求拖慢浏览器,也避免了瞬间地对服务器的并发请求的冲击。

-Ufqi-News 有福新闻 和 一些基于 -GWA2 吉娃兔 的应用中,我们设计了如下这样的图片异步延迟加载的策略。

<img class=”iconList” src=”loading.gif” data-src=”real-image-1.jpg” alt=”-x-“/>
<img class=”iconList” src=”loading.gif” data-src=”real-image-2.jpg” alt=”-x-“/>

….

<script>
var delayImgLoadi = window.setTimeout(function(){
//-
var myImgs = document.getElementsByClassName(“iconList”);
var imgListSize = myImgs.length;
var mysrc = ”;
for(var ii=0; ii<imgListSize; ii++){
mysrc = myImgs[ii].getAttribute(‘data-src’);
if(mysrc == ”){
myImgs[ii].src = ‘data:image/jpeg;base64,0’;
}
else{
var loadAsyncImg = window.setTimeout(function(myObj, mySrc){
myObj.src = mySrc;
}, 1000*1.5*ii, myImgs[ii], mysrc);
}
}
//-
}, 1500*1);
</script>

这种策略的具体实现是,
首先将一组图片的默认 src资源指向一个默认的图片(如 loading.gif ), 页面加载时会快速完成这个图片列表;
其次在页面下面安排了一段 JavaScript 代码,安排了一个异步执行的代码段A,其中将要读取上面一组图片;
再次,代码段A根据读取到的图片,判断其真实src( data-src )是否合法,如果合法,就额外地安排另外一个异步执行的代码段B;
最后,代码段B将这个真实的src从服务器端读取过来,并呈现在页面中,执行速度是每1.5秒读取一个。

当代码段A被安排完成后,页面已经呈现完成,用户可以阅读其中的文字内容;当代码段B被执行时,用户已经开始阅读内容;随着代码段B被顺序执行时,图片也一一呈现,用户也就顺序阅读到图片;只要代码段B的执行速度大于用户的阅读速度,用户体验应该是能够保证的。

其中 src=“data:image/jpeg;base64,0” 表示加载一个空图片,内容为 Base64的形式文本,无需再做额外地HTTP请求。

幸运地是,针对这种设想,HTML国际标准组织正在设法将其变成标准的一部分。

Loading Attribute
The loading attribute allows the browser to defer loading of images/iframes that are off-screen until the user scrolls near them. Indicates if the element should be loaded lazily (loading="lazy") or loaded immediately (loading="eager").  WIP: WHATWG PR #3752

<img src="image.jpg" loading="lazy" alt="..." />
<iframe src="video-player.html" loading="lazy"></iframe>

也许未来,想要 img 和 iframe这些资源异步加载,只要一个 loading属性来设置一下即可。

Posted in -gMIS, -GWA2, 服务器运维, 编程技术, 计算机技术 | Tagged , , , , | 1 Comment

gMIS吉米斯升级支持IPv4/IPv6双栈网络模式

今天是三八国际妇女节, 恭祝女同胞节日快乐!新冠肺炎疫情尚未解除,各自安好!

1. IPv6地址及与IPv4并存过渡的双栈网络模式

距离论文 IPv6 Address in Dot-Base62x 的发表差不多十年过去了,IPv6的应用也逐渐从学术论文到实验网,从实验网到工业部署和商业应用,终于IPv6的逐渐启用,开始由底至上的由网络层影响到应用层。

比如在 gMIS吉米斯 中,安全检查依赖对用户请求的IP的监测。当IP地址由IPv4向IPv6过渡时,应用层看到的地址,可能是IPv4,也可能是IPv6,尤其是在IPv6/IPv4双栈网络中(下图2),这种情况尤其明显。

例如,当我们在启用了IPv6的网络下,查看终端用户的IP时( -myip ),情况可能是这样:

Internet Protocol version 4 (IPv4)
120.244.128.xxx

Internet Protocol version 6 (IPv6)
2409:8a00:6055:b650:b5df:f4f3:36cd:xxxx

也即同一个用户,可能有两个IP地址,一个IPv4地址,一个IPv6地址,两者可能交替出现,在此前的部署应用中,如果侦测到用户IP地址发生改变,可能会有潜在的中间人攻击发生。面对新情况,需要更新升级程序处置这样由于网络层发生改变而引起的安全检测的 false positive alert.

2. gMIS吉米斯支持 IPv4/IPv6双栈模式的思路及实施

从纯技术上说,改进对一种新网络模式的支持,由原来的单用户单IP变成单用户多IP的支持,要改动的地方很多,难度也较大,甚至容易滋生新的安全漏洞等。

经反复比对各种实施方案,兹选取如下一种实施对gMIS吉米斯支持IPv4/IPv6双栈模式的改进。其主要思路时,当侦测到同一用户的IP地址发生改变时,将用户弹出系统,使用新IP再次验证一次,使得用户在新IP, IPv4 或 IPv6 下也获得同样的授权,如此以来,用户在两个IP下都进行了授权验证。在用户层,经过两次登录后,在接下来的操作中,网络层IP地址的切换,已经可以无缝衔接,自动漫游。

在系统中,分别将两次验证的授权Token以不同的名称记录到客户端,通常是 Cookie或请求地址的参数里,这样,当用户的IP再次漂移改变时,从Cookie中读取到读取到对应IP下的Token即可。

改动涉及到的程序文件:
A. comm/header.inc
根据已经读取到的IP地址,判断是IPv4或者IPv6,并将判断结果标记记录到运行时环境变量中去。也即 $_CONFIG 中。
B. extra/signinup
在通过用户授权验证,进行Cookie或请求参数写操作时,如果当前网络为 IPv6,则在原Token名称后附带形如 “v6” 的标记。
C. inc/session.class
在进行用户请求的鉴权时,通过Cookie或请求参数等读取Token,如果当前网络为 IPv6,则在原Token的名称后附带形如 “v6” 的标记。

 


扩展开来,推而广之地看,IPv6/IPv4的共存过渡阶段,双栈模式下,所有上层应用基于用户单一IP考虑的地方,都需要进行这方面的调整。这是IT/互联网届的又一个类似 “千年虫/2000年/千禧蟲” 的问题。

基于IP地址的安全核验,需要修改考虑这种新情况,类似上述分析与升级改进。
基于IP地址的用户识别,需要改进;基于IP地址的统计,基于IP地址的位置识别,基于IP地址的资源调度….

所有的IT及互联网应用软件系统,都需要重新审视由单用户多IP产生的新问题,而且越早越好,越快越好,因为IPv4/IPv6的共存和过渡阶段,目前来看会是一个相当长的过程,也许是10,20年,甚至是50年。

 


额外地,关于 IPv6 Address in Dot-Base62x 的应用,

例如在启用了IPv6的家用网关路由器(Home Gateway)或者光猫一体机(Fibre Modem + Router)中,默认的Web管理控制台的IPv4地址的访问路径通常为:
http://192.168.1.1/ 或者 http://192.168.0.1/

其对应的IPv6地址的访问路径通常为:
http://[fe80::1]/ 或者 http://[fe80:0:0:0:0:0:0:1]/

显然地,后者IPv6地址的访问路径看起来不友好,也有些费解,增加了中括号[]用于括起来IPv6地址,同时冒号:不单独特指网络服务的端口号,也可能是IPv6地址的一部分。

相应地,如果上述IPv6地址( fe80::1 或者 fe80:0:0:0:0:0:0:1 ) 用Dot-Base62x 来表示的话,则其形式如下:
http://x3e00.0.0.0.0.1/ 

只此一种,明确无误,没有简写变项,也兼容目前所有网络协议规范,不需要引入中括号[], 也不会影响冒号:用来特指网络服务的端口号的定义。
在形式上,与IPv4一样,使用点号.来区分地址段,不同的只是长度上多了两个地址段. 这也是实际意义上的增长,IPv4由四段组成,IPv6地址由6段组成.

同样地,上述终端用户IPv6地址,
Internet Protocol version 6 (IPv6)
2409:8a00:6055:b650:b5df:f4f3:36cd:xxxx
也可以表述成 Dot-Base62x 的地址形式为:
xxxx.xxxx.xxx.yyyy.yyyy.yyy

这是推荐使用 IPv6 Address in Dot-Base62x 的主要原因之一.

 


3. gMIS吉米斯相关的更新改进

A. 改进连接数据库时进行长连接的操作;

B. 改进对数据表记录状态默认值的描述,增加了”其他”选项等;

C. 改进了写用户终端Cookie的操作,增加了失效时间和有效路径范围.

D. Next @todo, 使用模板引擎 -Hanjst 替换掉 Smarty . 

 


-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.
降低成本,
提高效率.

Posted in -gMIS, Base62x, 服务器运维, 编程技术, 计算机技术 | Tagged , , , , , , | 4 Comments

Base62x编解码开源类库增加C++版本

2020年以来近两个月来,新冠肺炎 疫情肆虐中华大地,九洲同悲,四海恐慌,唯望炎黄子孙同仇敌忾,将传染性病毒早日隔离并捕获进牢笼,打入十八层地狱,永世不得翻身!

自我囚禁之余,安排时间对 -Base62x 编解码程序进行翻阅,同时考虑并增加了 Base62x 编解码程序的 C++版本。

这是继2016年增加 Base62x in Java, 2017年增加 Base62x in JavaScript, 2018年增加 Base62x in Perl, 2019年增加 Base62x in Python之后的又一个新语言版本,此后,C++的应用项目,可以直接下载使用即可。Base62x 编解码的实现,首先是C语言版本。

距离上次新增并完善 Base62x in Python 已经有差不多一年的时间,在这期间, Base62x 得到更广泛的应用和部署,也在 -Github 上获得更多的点赞。这是令人欣慰的。

Base62x in C++ 的程序代码包括两部分:

  1. Base62x.class.hpp
    这是 Base62x 的C++版本的主体程序,用于构建 Base62x 对象及其两个主要方法: encode/decode .
    另外还有一些辅助工具方法.

  2. Base62x_test.cpp
    是为测试 Base62x in C++ 而编写的辅助程序,主要给出调用 Base62x in C++的样例。

    Base62x in C++的使用样例

    # include “Base62x.class.hpp”

    using namespace std;
    //- init.
    Base62x myb62x;
    char *input = “Hello Base62x!\n”;
    char *output;
    int ibase = 0; // zero for string
    //- encode
    output = myb62x.encode(input, ibase);
    //- decode
    int obase = ibase
    input = myb62x.decode(output, obase);

借助 C++ (C with class)的面向对象支持,Base62x in C++几乎可以借用 Base62x in Java的逻辑和 Base62x in C的代码,融合而成即可。

截止目前(2020年2月),Base62x 已经可以提供的编程语言版本包括 C, Java, PHP, JavaScript, Perl, Python, C++.
其中Base62x in JavaScript 还有两个实现, Base62x.class.js 和 npm base62x.

2019年,Base62x 的相关说明内容还没写入网上各个主要知识Wiki站点,由此也传播给更多的人。此外,Base62x 论文相关的辅助材料也发布在 -ResearchGate 上,可供免费翻阅。与此同时,还完善了 -Base62x 的官方网页,让在线编解码体验、浏览和翻阅更简便快捷。

籍此,感谢为 Base62x 的源代码和说明文档做出贡献的朋友们,他们的名字都记载在 -Github的代码库里或者知识Wiki站点里,谢谢你们!

最好的版本永远是下一个版本,继续期待 Base62x 能为技术同行们带来帮助,也期待一起修改订正,使其日益完善。



Base62x: An alternative approach to Base64 for only-alphanumeric characters in output.
Base62x is an non-symbolic Base64 encoding scheme. It can be used safely in computer file systems, programming languages for data exchange, internet communication systems, and is an ideal substitute and successor of many variants of Base64 encoding scheme.

Base62x 是一种无符号的Base64编码方案。
在计算机文件系统、编程语言数据交换、互联网络通信系统中可以安全地使用,同时是各种变种Base64编码方案的理想替代品、继任者。

base62x-algorithm

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

gMIS吉密斯十年执念:Lower Costs较低成本Better Productivity较高效率

Hello 2020! 元旦快乐!今起揭开21世纪20年代的篇章.

1. gMIS吉密斯十周年

2010-2020,十年转眼已成历史,gMIS吉密斯——通用管理信息系统(general Management Information System)已经持续迭代升级、优化完善了十年之久。

从 ChinaM.com 时的 General Table到Sina weibo.com 时的Config Table,再到 People.cn 时的完整雏形,gMIS吉密斯应运而生,伴着IT需求猛增的大趋势,一路茁壮成长,从实践出发到理论提升,重新回到实践中去,再次深化和升华…

gMIS吉密斯致力于为企事业单位一线操作管控人员提供较低成本、较高效率的操控平台系统工具。一直以来,企事业单位极力逢迎讨好客户/终端用户,而对自己的员工通常要退而次之,等到安排预算改进作业系统管控操作平台时,额度又少之又少。员工不能利其器,焉能善其事?

gMIS吉密斯努力尝试使用这少得可怜的预算经费(较低成本),通过创新软件方式方法,融合前沿技术,实现便利高效的作业系统操控,提高整体管理水平和能效(较高效率),提升员工满意度、盈利水平和整体社会效益。

2. gMIS吉密斯软件架构与功能特色

小结gMIS吉密斯十余年来的发展,她与其他多数单一任务类型的管理操作后台相比,有着鲜明的特征,也正是这些特征使其发展路径看起来崎岖艰难。本质上说,管理操作后台的基本任务是将软件的基本任务——输出/输入的更具体化,大致操作动作就是“增删改查”。

gMIS吉密斯面临的挑战是,尽可能多地满足各种管理操作后台的场景,同时尽可能少地写编程代码,一直以来的努力,也是极力地在这两方面寻找某种平衡。既要功能强大,还要无需二次开发,进而达成秉持着十年的执念:Lower Costs较低成本,Better Productivity较高效率。


2.1. gMIS吉密斯软件架构

1). 基于MVC成熟的网络应用系统设计
2). 超越MVC 可对接和读写不同驱动类型的资源,如数据库、文件、远程网络资源等;
3). 支持插件式开发,易于扩展和升级
gwa2-dba-arch-201605-v2

4). 强大的多层级缓存与优化,支持服务器端、网络层和客户端三层缓存加速;
5). 页面异步通信、块状刷新让操作更流畅、高效;
6). 先进的跨区设计,以一抵十,百变应用扩展。

2.2. gMIS吉密斯功能特色

1). 先进的无Session/Cookie用户鉴权体系,轻松穿越各种网络环境;
2). 创新设计的集成站内搜索,全站数据一搜即得;
3). 媲美主流网络电商系统前端页面的点选系统,所有数据即点即得;

4). 比肩微软Office Excel的数据透视功能,让数据决策更科学、高效;
5). 创新性的数据表字段级可配置输出输入接口;
6). 层级式目录设计,无限扩展;

7). 在线网络文件轻松管理;
8). 自动跟踪日志、记账系统;
9). 字段级安全设置与管理设计;

gmis-xdirectory-201604

10). 贴心提示,输入即搜索,随时提供备选列表;
11). 高效地数据批量导出与导入功能;
12). 跨国多语言支持;

13). 便捷地数据表记录级复制;
14). 集成深度复合搜索,让检索在最小颗粒度上进行。

3. gMIS吉密斯近期更新

1) 修订了部分遗留i18n的语言包词汇;
2) 增强了针对文件上传与下载时的安全措施,进一步加固了系统安全;
3) 升级替换了 jQuery 第三方类库,1.12 –> 3.4.

4. gMIS吉密斯在线资源
 优化升级更新博客

https://ufqi.com/blog/category/computer-tech/通用信息管理系统/

 操作手册
https://wadelau.github.io/gmis/index

 


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

可以在其上构建各种信息管理应用软件系统,例如:
内容管理系统(CMS), 客户资源管理(CRM), 企业资源计划管理(ERP),
办公自动化系统(OA)等,
也可以是各种行业应用管理系统软件,例如:
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统(BOSS)等等。
实现零代码开发、快速搭建各种管理信息系统(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.
降低成本,
提高效率.

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

WebAssembly前瞻及用C/C++写HTML和Hanjst汉吉斯特

2019年12月16日,北京下了今冬第二场雪❄️,不大不小。

年终岁尾,国际上几大软件及互联网公司(Google、Microsoft、Apple和Mozilla)拉上互联网标准化机构W3C发布了 Web Assembly的推荐标准( -R/t2SS )。此举意味着,WebAssembly技术从遮遮掩掩的实验室后台走向前台,开始面向大众,尤其是开发者进行推广应用。

  1. Web Assembly推出背景猜测

Assembly 字面上的解释是,  “a group of people gathered together in one place for a common purpose”,一群人为一个共同的目标聚集到一个地方。Web Assembly的目标简略地说,就是将 C/C++/Rust 这些编程语言写的程序能够运行在上面那几大公司到网页浏览器中(Google Chrome,Microsoft Edge,Apple Safari 和 Mozilla Firefox)。目前在网页上流行的编程语言 JavaScript 将迎来或是帮手,抑或是对手的Web Assembly。

时光倒回到约10年前, HTML5 标准刚推出来时,其首要的任务是丰富 HTML 或者说 网页应用,使之能够承载其由“内容展示平台”向“应用承载平台”转变的重任(此前 -人民网 内部研究报告)。在这之前,一直是 Adoble Flash努力地奋斗着。 HTML5 贡献了一大批新颖的功能,网页告别第一代只能做内容展示的功能受限版。

HTML5 带来了浏览器/网页作为“应用承载平台”的大发展。不想中途出现了“应用商店”App的怪胎,一下子将互联网前进的步伐打回到PC单机时代,要用个什么软件都需要下载、安装,这明显与互联互通都发展趋势是相背离的。信息孤岛逐渐形成,互联网的继续发展不是加速信息的流动,相反是加剧了信息的不对称,不流通。

这既有商业层面的利益考虑,也有技术层面的制肘,网页应用计算力弱,体验不好,安全有问题等等,一时局面甚是尴尬,有几个应用商店,一个应用就需要开发几个不同的版本。信息在各个APp之间逐渐扎起篱笆,这些与互联网先驱们的让信息更加流畅地流动的理念渐行渐远。

直到  WeAssembly的推出,或许是扭转时局的契机之一。HTML5将网页由“内容展示平台”升级到“应用承载平台”,WebAssembly或将进一步升级优化”应用承载平台”,从根本上消除网页应用与本地应用之间到性能差异。从而实现“Open and Run”, 而不是 “Open 、Download、Install and Run”,实现“Write once, run anyway”, 而不是“Write once more,run once more”。

在 WebAssembly之前,也有类似的探索, 如 asm.js , 甚至上 Java的 Applet 都是希望将编译后的程序能够在浏览器中安全高效地运行,现在看之前的努力并不算成功,希望这次能有所不同而获得预期效果。 

2. WebAssembly的直觉体验

对 WebAssembly 的直觉体验:由 hello.c 到 hello.html 

$ mkdir hello
$ cd hello
$ cat << EOF > hello.c #include <stdio.h> int main(int argc, char ** argv) { printf("Hello, world!\n"); } EOF
$ emcc hello.c -o hello.html

可以预见,大量必需由 C/C++/Rust 写的程序将有可能轻松移植到浏览器以网页应用的形式交付,极大地改变了软件研发及交付的方式方法。

3. Web Assembly的发展前瞻

3.1. WebAssembly 可能不会取代 JavaScript
而只是对其的互补,在 JavaScript 短板之处寻找其发展空间,展现其优势。

3.2. 客户端软件App
单独为特定平台写App的需求将降低,网页应用将逐渐实现跨平台,并与本地应用相一致的体验和性能。有望实现网页应用一版通天下。单独写iOS客户端,Windows客户端,或者Andorid客户端的开发人员,可能需要着手学习使用 WebAssembly。

前景是美好的,预计Native App还将存在相当长时间,并存与网页应用,并逐渐转为小众领域的特定开发。

3.3. C/C++/Rust 走向前端
古老的C/C++等编程语言将应用范围扩展到前端,从而实现真正意义上到跨平台。用 C/C++等写HTML网页,将不再是互联网上的笑话。
如此以来,为解决 C/C++ 写不了网页HTML而诞生等解决方案或者编程语言等,是否也就过时了? 或者意义不大了?

如果 C/C++ 能写网页,还需要用 ASP.NET/PHP/Perl/Python或者Java 来写 HTML应用吗?或许需要,因为有大量类库已经开发,或许需要,还有其他更多完整的生态考虑。但有一点确认的是, WebAssembly的推出,引发我们对这样对问题的重新审视和思考。

3.4. 网页应用
网页应用开发人员需要熟悉新情况,有了新增的屠龙刀,也要善加利用才能将其设计功效发挥出来。

JavaScript 有了 Web Assembly的加持和增强,其性能或有进一步的提升,可供用来设计的应用软件将进一步的扩增,体验或将更好。

得益于 JavaScript进步,也得益于Web Assembly的推出,依赖于其上 Hanjst 汉吉斯特模版语言及引擎将运行更快,体验更好。我们将着手针对这些新特性进行优化。

Hanjst.js 已经投入不少使用。

Hanjst.was / Hanjst.wasm 也将开始研发,为追求更极致的性能和体验,Hanjst 或将以 C/C++/Rust 编写,然后经编译后,引入到浏览器中进行运行。

3.5. 网络应用开发框架 Web Framework

如前所述,既然Web Assembly的原生代码可以工作在服务器端,而编译后的.wasm 可以运行在客户端浏览器中,那么开发网络应用的方式方法势必要受此影响而有所改变。

因此,可以预见,通用网络应用架构GWA2,或将以此为契机进行改造升级,推出 GWA2 in Assembly 或者 GWA2 in C / GWA2 in C++, 又或者是 GWA2 in Rust. 

至于最终实现的是  GWA2 的哪个新版本,可能要结合 Web Assembly推广应用普及到一定阶段之后才能有某种趋势判断或定论。


 


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 control and achieve the same functionality 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;

  • ….

 

Posted in -Hanjst/-汉吉斯特, 编程技术, 计算机技术 | Tagged , , , | Leave a comment

gMIS吉密斯i18n多语言国际化更新

gMIS吉密斯部署和使用范围日益扩大,跨国多语言版本成为迫切需要的功能,早在2018年年中就考虑要增加这一功能——在gMIS吉密斯中实现多语言版本的支持。以期实现gMIS吉密斯的跨行业、跨地区和国际化多语言的广谱应用目标。

经过一段时间的密集开发、测试,目前gMIS吉密斯i18n多语言国际化更新已经完成。其中过程比预料的长,修改完善难度比预想的大,涉及到的修改模块也较多,兹记录备忘于此。

1. 基于GWA2的多国语言包设计

gMIS的开发框架是 GWA2吉娃兔,GWA2本身有跨语言的版本实现,如GWA2 Java, GWA2PHP,GWA2Perl等编程语言版本。gMIS所依赖的GWA2的编程语言版本为GWA2PHP,所以gMIS的多语言实现也是继承和扩展了 GWA2PHP(吉娃兔的PHP版本)的多语言开发模式。

在GWA2PHP的多国语言版本多实现中,主要依靠如下设施。

语言模块对象:
mod/language.class.php
其主要方法是实例化 Language.class 并加载语言包文件;同时提供按 lang_key 进行相应翻译的操作方法;

语言包文件:
lang/language.pkg.zh_CN.json,
lang/language.pkg.en_US.json,
lang/language.pkg.ja_JP.json,

全局变量:
全局实例化 $lang 语言包对象,并在全局范围内可以访问。
同时对当前语言环境进行探测,对语言版本环境对探测又进一步地区分为有显式的语言版本参数如 “&lang=zh” 等,或者使用隐式的语言环境参数来判断当前应该加载哪种语言包。

输出 $lang 到模板引擎:
$data[‘$lang’][‘lang_key’] = $lang->get(‘lang_key’);
如此以来,便可在 模版文件中以 {$lang[‘lang_key’]} 多方式进行访问。
后面会进一步地详细描述。

2. Module类或Controler类PHP程序中调用语言包对象

在gMIS中,普通PHP文件中对多语言对象多访问形式如下:

print $lang->get(‘lang_key’);

该语句将输出按当前语言配置所加载语言包对应多 lang_key 所指向的语言版本相应的内容,其中语言对象 $lang 是全局变量,可以在任意 controller文件中进行调用。类似地,在Module模块类中,需要更多的修改,在Module模块类的声明创建和实例化时,引入全局变量语言包对象。

如在 mod/abc.class.php 的文件中,传递 $lang 对象:

public function __construct($args, $lang=null);

为后向兼容,也可以不安全或不推荐地直接使用全局变量 $ lang :

public function _myFunc(){
    return if($lang){ $lang->get(‘lang_key’); }
}

 

3. HTML模板文件中调用

gMIS 在设计和实现 GWA2 PHP 时,完整地继承了 GWA2 的 MVC,因此,作为兼容和后续扩展,gMIS的大部分视图文件,都以模版文件都方式呈现。

在国际化多语言的扩展中,我们需要在模版引擎中增加对语言对象的输出,形如:
$data[‘lang’][‘lang_key’] = ‘lang_value’;

然后在模版文件中使用如下方式增加对 lang_key 的调用:
{$lang[‘lang_key’]}

 

4. JavaScript脚本中调用

由于 gMIS 在设计上采用了高效的 Ajax 技术,页面进行了局部或部分的更新。这在多语言环境中,可能涉及到需要将相应的标签字符进行多语言翻译。
基于这种考虑,我们在 ido.php 进行加载时,输出 userinfo.$lang 全局变量,在其中以 JSON 方式将待翻译的语言标签输出到 JavaScript中,从而使得当我们需要在 JavaScript 调用相应的语言标签时,能够进行顺利的调用,进而显示合适的语言版本给终端用户。

userinfo.$lang = {“lang_key”:”lang_value”, “”:””};

在 JavaScript 实际调用中:

let buttonValue = userinfo.$lang[‘lang_key’];

 

5.  XML/JSON数据表配置文件中调用

gMIS强大对可扩展性和伸缩性依赖于我们所涉及对元数据与用户数据对隔离,而实现元数据与用户数据对融合操作对就是我们对gMIS表数据处理引擎。

在gMIS,我们针对每一张被管理的数据表创建了一个表格属性描述文件,该属性描述文件以配置文件xml格式存储在 xml子目录下。当目标数据表被加载时,数据处理引擎将读取配置文件,以属性描述文件定义的各种格式将用户数据呈现出来。

在这一过程中,显然,如果我们在属性描述文件中有关于国际化多语言的内容标签,就需要一并也要创建对应的语言版本的属性描述文件。基于这些考虑,我们将xml文件的国际化多语言修改形如下:

xml/abctbl.xml –> xml/abctbl.en_US.xml 
xml/abctbl.xml –> xml/abctbl.zh_CN.xml
xml/abctbl.xml –> xml/abctbl.ja_JP.xml
….

默认情况下,如果某个数据表efgtbl没有 xml/efgtbl.xml 属性描述文件,则使用系统默认的形式将用户数据显示出来;也是默认的,如果某个数据表 efgtbl 的某个国际化语言版本 xml/efgtbl.zh_CN.xml 没有被创建出来,系统依然鲁棒地使用默认配置将用户数据用默认语言版本呈现出来。

6. lang_key /value 的设计与规划

gMIS 国际化多语言的语言包文件的设计采用通用数据交换文件格式 JSON。在多语言标签设计时,将标签按如下分类进行设置:每个标签键名称以下划线分割的多段英文字符隔空。每段表示不同的层级。
样例如下:
navi_xxxx,
func_xxxx,
form_xxxx,
user_xxxx,
func_importxlsx,
func_importxlsx_hint,
navi_help_company,
navi_help_company_faq,
….

7. 国际化多语言使用者/开发者社区

gMIS吉密斯源码早几年前已开源在 -github 上,然而由于没有进行国际化多语言操作,开发和使用仅限于中文环境,随着这次国际化多语言的完善,gMIS的开发将迎来更多非中文开发者和使用者。

这将为gMIS吉密斯的发展壮大注入更加强大而持续的动力,为gMIS吉密斯由管理后台进化为管控操作系统做进一步地准备。

对非中文母语的开发者而言,源代码中没有了写死的常量“中文”字符, 修改代码不再有障碍;gMIS吉密斯的代码将得到全球范围内的开发者的审阅、修订和完善。

对于非中文母语的使用者而言,可以通过在首页的使用语言切换功能,快速切换为自己熟悉的语言界面. 从而为gMIS带来全世界的用户。使用范围将进一步地扩大到全球范围。

从而实现了gMIS的跨行业、跨地区和跨语言的全新时代。


2019-11-04,山东威海国际机场。


-gMIS (general Management Information System,吉密斯) 是一种基于 -GWA2 (General Web Application Architecture,吉娃兔) 的通用管理信息系统应用软件,具有可配置的输入和输出接口、开箱即用等特征。
可以在其上构建各种信息管理应用软件系统,例如:
内容管理系统(CMS), 客户资源管理(CRM), 企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,例如:
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统(BOSS)等等。
实现零代码开发、快速搭建各种管理信息系统(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.
降低成本,
提高效率.

 

 

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

UfqiNews有福新闻的第N+1批次更新:清晰,流畅,省电

UfqiNews有福新闻自推出以来,一直持续更新、优化升级,作为一款带来全新新闻阅读体验的资讯应用,已经日益成熟,浏览量也日渐攀升。

近日针对 UfqiNews有福新闻的升级改进包括如下方面。

1. UI调整优化,清晰易读的页面导航

改进页面导航,调整优化明晰的跳转指示:

UfqiNews利用各种方向的箭头,类似物理世界的导航一样,简单明了。
而且在不同的操作系统平台上,如 iOS, Android后者WIndows中,不同的箭头又以各自平台的UI特色显示出来,
与本地风格融合更好。
.
 

2. +分享功能,简单易用的新闻分享

为便于用户将页面分享出去,尤其是分享到各个社交网站,UfqiNews增加 ShareThis 分享按钮。

用户可以很方便地通过页面底部使用 ShareThis 将当前页面分享出去。

+  点击 AddToFav 或 Ctrl+D  52次转发  

通过 ShareThis 按钮可以直接链接到 数十种社交网站。

3. 调整缓存策略,页面加载更快,link prefetch/preload

UfqiNews在有限的计算资源和带宽资源下,尽快地加载并呈现页面,一直是我们的技术团队努力的方向。 在这方面UfqiNews近期的主要努力包括:
1) 改进资源文件:图片、样式表CSS和脚本程序Scripts的缓存机制,使得这些资源在一个会话时间段内,只需首次从服务器下载并缓存到本地后,在该时段内,后面的页面加载时,这些资源文件都将从浏览器的本地缓存中自动加载,而无需每次从服务器端下载。
这将极大地改进页面加载速度。在资源类文件的 HTTP返回中,增加如下 HTTP headers.

HTTP/1.1 200 OK
Date: Sat, 14 Sep 2019 01:36:17 GMT
Last-Modified: Mon, 30 Jul 2018 08:59:19 GMT
ETag: “e2a-57233ad3e67c0”
Cache-Control: max-age=604800
Expires: Sat, 21 Sep 2019 01:36:17 GMT

2) 使用 link preload/prefetch 指令进行预加载
在支持预加载指令的浏览器中,UfqiNews使用 link preload / prefetch 指令,对接下来即将浏览的页面或资源进行自动加载。如在 list页面,自动加载 下一个 page; 在新闻详情页面,自动加载下一个 item,如此以来,当用户进行翻阅下一页时,页面将会实现秒开。

4. 重构爬虫引擎,抓取采集更节能

UfqiNews在生产端,有一个设计复杂的新闻爬虫系统,主要负责从各大新闻站点,将当地、当天最热门的新闻条目抓取回来。抓取回来的新闻页面内容进一步地使用自然语言处理技术对这些新闻条目进行分析,然后分门别类地列如到相应的类目下,供进一步地读取调用和使用。

这一页面抓取及分析系统,是分布式的计算系统,最早的设计其内容的流转是依靠NFS系统作为页面文件的承载服务。

(UfqiNews页面抓取系统/爬虫系统)

UfqiNews的分布式系统支持将这一爬虫系统部署成为一主多从的结构,可以同时启动N多个Node,而每个Node里又可以启动M多个进程。从而形成强大的页面抓取能力,及时并行处理N*M个新闻页面。

像所有的分布式系统一样,UfqiNews需要有一种机制或者队列能保证数据的一致性,UfqiNews依赖NFS的网络文件分享机制,将内容和页面队列写入到一个NFS文件中,并且顺序读取,从而保证了页面读取的一致性。

在单个NOde上并行运行M个进程时,NFS及内容读写磁盘系统,都需要以来文件IO来实现,一个偶尔的机会,当我们观测到跑在VmWare虚拟机中的耗电量在Windows的 Task Manager 中的“Power Usage” 和 “Power usage trend” 都为“Very high”, 进一步地分析发现,导致耗电量非常高,是由于 UfqiNews的生产爬虫系统的缘故。

(UfqiNews生产系统耗电量分析)

这种耗电量的现象,我们觉得是不可接受的,既不绿色,也不环保。而且其背后更深层次的原因也好理解,频繁地文件IO读写访问,一定是要高频度地调用设备驱动,进行实际磁盘操作。

在此之前,我们在review 目前的设计时,也觉得,依赖NFS并非长久之计,也非上上之选,只是觉得应该改进优化,这次发现UfqiNews如此高耗能,成为压垮骆驼的最后一根稻草,必须对UfqiNews的文件IO及其队列做进一步的优化改进了。

最早的设计中,我们希望构建一套网络服务,用于存储在 UfqiNews运转过程中的数据,类似 AED Server这种的设计与操作。这次在对UfqiNews进行重构设计时,我们发现问题的焦点在某种服务对文件IO的接管,也即无论是页面队列,还是新闻页面内容,将写入文件的内容,存储到内存或者某个中间服务时,用完即可删除。

这种场景用 AED Server 是合适的,将页面内容或者页面队列存储到 AED Server 中去,可以满足需求,同时,也可以看到,类似的需求,与常规的”缓存“服务也很相似。

沿着这一思路,我们考虑使用 Memcached 或者 Redis 来接管真实的文件IO,或可解决目前的问题。于是我们就使用该方法对 UfqiNews的爬虫系统进行优化完善。

在凡是需要读写操作文件IO时,均改为读写 Memcached 的服务,对于页面内容,直接存取即可。 对于页面队列,则需要使用数组的形式,对其中的内容做动态更新,放入新生成的条目,同时丢弃已经处理完了的条目。

经过几周的断续修改和调整,我们逐渐将 UfqiNews 的爬虫系统中的过程内容的文件IO全部替换为读写 Memcached ,Ufqinews的运行时耗电量也从 “Very high” 逐步降低下来。

Very high — High — Moderate — Low — Very low

尽管目前没有定量的数据,但Windows系统中的这个耗电量5级划分应该是有一定的依据的,而是次优化调整,也真切地显示出来。

作为软件编程技术人员,我们一直在谈论算法改进,程序优化,但改进前后效果对比如此立竿见影天壤之别的情况,还很少见,体会也没有如此强烈。

5. +内容链接静态化,优化SEO,对搜索引擎索引更加友好

针对页面链接地址做进一步的调整,增加如下两个快捷链接到主要页面:

1)列表页面, list.123,456.html , 指向原来的 ./?pnskwordid=123,456

2) 内容详情页面, page.1234.html  , 指向原来的 ./?mod=rdr&pgid=1234

改进后,伪静态页面将根据有利于搜索引擎的抓取和页面分析。

 


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.

 

Posted in 服务器运维, 社会生活, 编程技术, 计算机技术 | Tagged , , , , , | Leave a comment

汉吉斯特Hanjst模板语言及引擎在线文档Doc&API首发

经过一段时间的梳理总结、精心编制,汉吉斯特Hanjst在线文档和API已经完成初版,并发布在 //wadelau.github.io 上,为方便检索和使用,兹列目录如下,供查询、使用。


 

汉吉斯特Hanjst概述

Hanjst标志

Hanjst是一个Han J ava S cript T emplate,它是HTML和Web的模板语言和引擎。

“ 汉吉斯特 ”是 Hanjst 的中文名称。

入门

Hanjst是什么?为什么?

安装

配置

调试

快速开始

杂项

Hanjst为模板设计人员

基本语法

变量和修饰符

功能函数指令

内置功能

自定义功能

Hanjst在服务器端运行

Node.js

Hanjst为后端开发人员

Hanjst 对象类

服务器端替换

JSON中的数据

资源

路径

脚本

第三方类库

图片

高速缓存

随时可用样例

搜索引擎优化

标题,描述和关键字

链接

文本内容

 


在线文档目前没有中文版,只有English Version,以下是 English Version 的目录列表。


. . .


Contents in English Version


 

Hanjst Overview

Hanjst Logo

Hanjst is an Han JavaScript Template, and its language and engine for HTML and Web.

汉吉斯特” is its Chinese name.

Get Started

What is Hanjst and Why?

Installation

Configurations

Debugging

Quick Start

Misc.

Hanjst for Templates Designers

Basic Syntax

Variables and Modifiers

Functions

Built-in Functions

Custom Functions

Hanjst Run in Server-side

Node.js

Hanjst for Back-end Developers

Hanjst Class

Server-side Replacements

Data in JSON

Resources

Paths

Scripts

Third-party Libraries

Images

Caching

A Ready-to-go

Search Engine Optimization

Title, Description and Keyword

Links

Plain Contents

 




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 control and achieve the same functionality 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;

  • ….

 


河北-张家口,千米高原,天高云淡,西北风烈,酒肉香混.

 

Posted in -Hanjst/-汉吉斯特, 编程技术, 计算机技术 | Tagged , , , , , | 2 Comments

☘ gMIS吉密斯优化升级:+工作区,可读性异常信息,异步删除等

“年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!” 

—- 诸葛亮《诫子书》

gMIS吉密斯近期进行了较大幅度的优化升级,功能增强改进,感谢大家对 gMIS吉密斯开源社区的捐赠,这些支持使得 gMIS吉密斯 能够日益成熟而稳定、健壮而强大。诸葛先生的训诫之词,言犹在耳,未敢懈怠。

这批次 gMIS吉密斯的更新主要包括如下内容,记录备忘如下,以期后续结集成书时参考备查。

  • 1)增加工作区概念(workspace), 多个物理上、逻辑上相互隔离的区域,一套系统管理N多个信息管理系统;

gMIS吉密斯 自今起,开始支持工作区 workspace的功能。

工作区 Workspace 往往与项目、地区、主题等密切相关,gMIS 增加工作区的主要考虑是为了满足如下设想的工作场景。

我们认为在一个大型的企事业单位的组织中,随着数字化、信息化的不断投入与持续升级改进,其数字资产会深入地细化、细分,从一个10人团队的一个数据库开始,会逐渐升级改进扩展为2个数据库,4个数据库,10个,20个,甚至是200个数据库。

这些数据库及其数据都需要管理,管理数据信息,就需要安装 gMIS,有多少数据库要管理就安装多少套 gMIS吗?

答案显然不是。首先, gMIS 支持一套系统管理N多数据库,参考:“-gMIS 中操作同时并发操作和管理多个数据库multiple databases” (-R/x12SV )。通过这种方式, gMIS 可以轻易地管理其这些数据库。其次,平行地复制或并行多套一样的系统,对IT运维团队来说是灾难,如果有这样的需求,首选的方案应该是负载均衡等。

之所有要考虑引入WorkSpace工作区,是要管理两个以上并行的 gMIS 实例数据库,比如,在一个单位中,人事系统、财务系统、购销存系统,系统分别独立运行,而不是揉和在一个系统内。这样情况下,平行复制 gMIS 是方案,而引入工作区workspace 则是更好的方案。

gMIS 工作区(workspace)

在用户登录系统时,给出待登录的工作区选择,当用户选择给定工作区(如上图HR工作区、ERP工作区或者CRM工作区)时, gMIS按设置加载给定工作区的数据库,进行认证;用户通过权限认证后,将本次会话的工作区信息写入用户身份数据,按指定工作区加载指定的数据,进行后续数据操作工作。

  • 2)增加对只读模式下对功能菜单调整,去掉“新增”,”导入Xls”等;

gMIS吉密斯在设计时会考虑两种情况无法对一个数据表对象进行“写入”操作:1)访问权限设置系统里,如果针对当前用户或者用户组是受限的,则无法进行写入;2)数据表对象本身具有“只读”属性,比如针对所有用户,“操作日志”记录表就设置了无法删除。

针对不具有写入权限的数据表对象,程序增加了判断,去掉了那些针对当前用户和场景无法使用的菜单选项,比如“新增”,“编辑” 或者“导入Xls”等操作。这样既避免用户误操作,也让界面现得清爽。

  • 3)在 comm/tblconf 里修正对Unique index的探测;

gMIS 在装载当前数据表对象的数据之前,通常需要对该数据表的元数据进行解析。这项解析工作包括目标数据表,有哪些字段,每个字段的数据类型等,同时也检查字段之间的关系等,如哪些字段是唯一键,哪些是组合约束键等。

本次改动主要是优化改进了 MySQL 数据库作为后端数据时,检查以 MUL 为标记的组合约束键。

  • 4)列表行删除数据时,不再刷新页面进行UI更新,改进为通过JavaScript前端删除;

关于删除的改进优化,gMIS吉密斯一直未停止。

早前在2015年,我们受 Microsoft Windows 延迟删除的改进启发,增加了针对数据删除,由必需点击“确认”改进到“延迟”数秒进行无确认删除:“删除确认、删除异步及删除延时,delete confirm,aysnc and delay” (-R/62SS )。

在2015的这次改进中,被删除的数据会被打上标记,比如变灰色,等下次刷新时,整个页面再做刷新,这样做的目的是节省因为删除数据而进行一次数据请求和与服务器的通信,将数据交互的量级降到最低。

持续地改进,在多数数据操作人员眼里,删除就应该立即移除掉,而不是打上删除标记等下次页面刷新。这次改进,当数据通信与服务器通信正常时,会使用JavaScript动态的将所删除的数据行从当前UI视图中移除掉,而不进行整个页面刷新。

这样既实现了立即移除掉的目的,也再次地坚持了“降低成本、提升效率”的设计和实践原则。

  • 5)列表页选择框下拉选择即时递交,不再等复合条件查询,改一步复合查询为多步叠加条件;

gMIS 内置的增强数据表头,提供了功能强大的搜索及排序功能。

在条件设置上,列出所有可能经常用到的列表字段供筛选时使用; 同时,在每一个具体的筛选字段上,又提供数种可供操作的操作符供选择,如数值型的字段提供了等于、大于、小于和值域区间等,而字符型字段则提供了等于、包括、以其开头、以其结尾和不包括等选择项,可谓十分丰富和强大。

在组合条件设置三上,同时提供了“并且”和“或者”两种模式,前者是满足所有条件的数据,后者是满足其中一项的数据记录。

这些足以满足通常情况下数据操作人员对待检索数据的所有筛选设想。这次改进的地方是当用户选择了“选择性”的字段的某个“选择项”时,即时递交数据筛选请求,不再等待点击“并搜”或“或搜”再进行筛选条件的组合。

  • 6)输入数据异常时, 给出具体而详细的出错信息;

作为管理信息系统应用软件,录入数据是很常规的操作,对常规数据的校验,主要依赖 gMIS内置的 GTAjax在前端进行。 GTAjax 在前端页面通过 JavaScript在递交前,检查当前数据录入表单的各项是否符合预期。

这在一般情况下是够用的,但有时一些异常是在后台数据库写入时才能发现的,比如常见的写入时异常就包括,唯一键冲突;再者,在做二次定制开发时,开发人员可能没有主动意识或者要求针对某些字段需要增加基于 GTAjax的数据校验。针对这样的异常,此前 gMIS 会报错成写入失败,并请用户重试。但可供管理用户深入核对的信息不够详细。

Hanjst 更新优化报错信息定位到行数 (-R/52SQ ) 的升级优化启发,我们觉得可以在 gMIS 里也能够实现在数据保存异常时,给出详细而具体的信息定位。

于是我们改写了 act/doaddmodi 的返回输出内容,当数据报错异常发生时,通过解析数据库的返回错误代码或者程序错误代码,进一步地解读成普通数据操作人员能够理解并定位到的语句内容,通过 JSON方式返回给前端,进一步地展示给数据操作人员。

如此详细而具体的异常描述信息将有助于数据操作人员快速找到问题并解决,正是生动地实践了 gMIS吉密斯的 “降低成本、提高效率” 的初衷。

  • 7)增加 “导入Excel” 数据表功能,与此前已有的 “导出Excel” 形成闭环.

gMIS 一直希望能“降低成本、提升效率”,并将这个作为设计与研发的原则。批量操作也是这一体现,“导出Xls“ 和 “复制” 操作就是具体的实现。

在 gMIS 所管理的数据表中,可以轻易地使用“导出Xls” 将当前记录结果集下载到本地使用。 “复制” 则是在录入数据过程中,对于两条差异不大的数据,可以快速地复制一份,再稍作修改即可作为新数据进行录入。

这次改进,增加了“导入Xls”功能,与“导出Xls”,相对,形成闭环操作:即可导出,亦可导入。然而,对比“导出Xls”, “导入Xls“的操作要复杂的多,主要原因是:1)不相信用户的任何输入,2)用户输入的数据需要各种复杂的解读与格式化,没有“以一贯之”的良药。

即便如此,我们也要进行一些尝试。这些改进包括:在 导入Xls 的分步骤操作中,先给出预览,预期当前数据表可接受的数据表格式,给出表头。

如果用户按照所给出的表头进行数据准备并递交后,分步骤导入Xls中进一步地检查,并给出已解析、待录入的数据预览。

当用户确认其准备的数据经有程序校验符合预期时,再点击下一步,执行分步骤导入Xls的真正写入操作。如果在这一步中发现不符合预期,用户可以选择修改本地数据,并重新上传,循环此数据校验步骤,直到获得满意预期,再进行实际导入操作。

gMIS Import Excel Flowchart /导入 Excel 数据 流程图

为何是 Microsoft Office Excel?

  • 8)其他一些更新

gMIS 2019 发行版本是 gMIS有史以来更新幅度较大的一次,根据 -github 的版本差异统计分析,这次更新设计到数百个文件的更新。

commit 92736964b3ea3279639988cca7f172d670663d15

Showing 432 changed files with 111,925 additions and 21,134 deletions.

 


林林总总,gMIS 吉密斯在不断满足不同需求的同时,持续地丰富和改进其功能,日益成熟而稳定,健壮而强大。

这既得益于信息化发展创造的巨大需求,也得益于开源社区群体共同努力。

唯有感谢,并不忘初心,砥砺前行!


-gMIS (general Management Information System,吉密斯) 是一种基于 -GWA2 (General Web Application Architecture,吉娃兔) 的通用管理信息系统应用软件,具有可配置的输入和输出接口、开箱即用等特征。
可以在其上构建各种信息管理应用软件系统,例如:
内容管理系统(CMS), 客户资源管理(CRM), 企业资源计划管理(ERP),
办公自动化系统(OA)等, 以及各种行业应用管理系统软件,例如:
人力资源管理系统(HR),学生管理,档案管理,旅游管理,图书管理,
商品管理及业务运营支撑系统(BOSS)等等。
实现零代码开发、快速搭建各种管理信息系统(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.
降低成本,
提高效率.

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