GWA2吉娃兔🐇引入PNOO关于排序字段的顺序

距离2022年06月上一篇Blog差不多过去一个月了( UfqiFina有福金融更新:JavaScript的数据类型强制等, https://ufqi.com/blog/ufqifina-javascript-tofixed/ )。

GWA2吉娃兔在研发与部署中,持续改进升级优化,日益健壮强大。近期的一个主要改进升级是在Page Navigator分页导航模块引入了PNOO关键词。
PNOO, Page Navigator Order of multiple Order-by fields, 分页导航中的排序字段的顺序。

之前的组合配对关键词 PNOB,
PNOB, Page Navigator Order By , 分页导航中的某个排序字段,
之前的组合配对关键词PNSK,
PNSK, Page Navigator Search Key, 分页导航中的搜索字段,
之前的组合配对关键词OPPNSK,
OPPNSK, Operator of PNSK, 分页导航中的某各搜索字段的操作符.

问题的背景是,当我们使用 GWA2中的Page Navigator模块通过地址栏的请求参数进行数据库SQL查询语句的组装时,除了使用构造条件的 PNSKxxx=yyy 这样的关键词, OPPNSKxxx=yyy 这样的操作符,还会使用到 PNOBxxx=0|1 这样的条件来设置查询结果的排序。相关参考: GWA2吉娃兔🐇升级增加搜索模糊语法支持, https://ufqi.com/blog/gwa2-fuzzy-search/ 。

PNOBxxx=0|1 会最终映射到数据库SQL查询语句中的 order by xxx 。 由于地址栏请求的参数是以Hash列表方式从客户端传递到服务器端,所以当有两个以上的排序条件时,Hash列表的数据并不能区分出先后关系来。相反地,在数据库SQL语句中, order by xxx, yyy 和 order by yyy, xxx 是有明显先后顺序区别的。前者是针对结果集先按xxx进行某种排序,然后在这个基础上再按yyy进行排序,后者则刚好相反。

如此以来,GWA2吉娃兔的Page Navigator需要某种机制,在处理多个排序条件时,确需知道这些排序字段的先后顺序。鉴于Hash列表数据无法确保先后顺序,我们考虑引入一个新的关键词 PNOO 来完成这一任务。
在前端地址栏发起请求时,如果指定了多个排序条件,需要额外地通过 PNOO来指明这些排序条件的先后顺序,也即,
pnobfielda=1&pnobfieldb=0&pnobfieldc=1&pnoo=fielda,fieldb,fieldc

这各请求将构造一个如下的SQL排序语句,
order by fielda desc, fieldb, fieldc desc

如果不启用 pnoo 参数进行指定顺序,则Page Navigator按Hash列表默认的顺序执行,向前兼容所有版本。
目前,这一优化改进已经在 GWA2 Java 和 GWA2 PHP 中实施,在随后的版本中,开发者可以调用PNOO来设置在多个排序字段条件下的各个字段的先后顺序。
在代码层面的实现逻辑是,在mod/PageNavi.class 中的 getOrder 里,增加先检查当前请求是否包含、预设了 PNOO, 如果没有预设,说明是之前的老旧版本,不支持新功能 PNOO,排序按默认顺序执行。
如果检测到包含、预设了PNOO,则说明是新版本,有对PNOO的支持,进一步地拆解出带顺序的排序字段,然后顺序执行、安排排序字段的升降设置。

题外1.
实际应用开发中,多个排序条件同时使用的场景并不多,而且其效果也并不明显。比如按价格排序之后再按重量排序,或者反过来,按重量排序之后再按价格排序,这样的结果集与只使用其中一个排序条件来看,差别并不特别明显。细微之处只在于价格相同时,再看重量的大小。多数情况下,价格与重量是正相关或者负相关很强的两个字段。大概只有在两个不相关的排序字段组合下,效果才会明显一些。

题外2.
数据库SQL查询语句 order by 有时候需要按条件地组合排序字段,比如根据数据的状态字段决定排序是按Id、状态本身、创建时间或者更新时间等。例如,

… ORDER BY
CASE
WHEN ali.LIVE_STATUS IN ( 0, 1 ) THEN
ali.LIVE_STATUS
END DESC,
CASE
WHEN ali.LIVE_STATUS = 3 THEN
ali.LIVE_START_TIME
END ASC,
CASE
WHEN ali.LIVE_STATUS = 2 THEN
ali.CREATE_TIME
END DESC

题外3.
始于2022年02月24日俄罗斯侵略乌克兰的战争还在持续,好消息是英勇的乌克兰人还在顽强地抵抗入侵者,国际支援与志愿军还在源源不断地涌入抗战一线,坏消息是乌克兰实际上丢失了一小部分边境领土。叠加上英国首相约翰鲍里斯因幕僚诚信问题被迫宣布即将下野,日本前首相安倍晋三因不明原因在竞选演说中遇袭身亡,民主自由世界蒙受了极大的损失,遭遇到巨大的挑战。
道长且阻,行则将至。

除了键盘侠打嘴炮,我们还可以真金白银地支持发生在乌克兰的自由与奴役相对决的反侵略战争。捐助乌克兰网站: https://u24.gov.ua/ .

题外4.
如果一切顺利,yoyo将完成初中学业,从东北师大附中朝阳学校以优异成绩毕业,荣获北京市三好学生称号,即将在2022年秋天入读清华大学附中朝阳学校(高中校)。
Hanu将毫无悬念的从二年级结业,在2022年秋季开始小学三年级的打怪升级之路。

全文首发地址: https://ufqi.com/blog/gwa2-pagenavi-pnoo/ , -R/x12Sc


GWA2吉娃兔

-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architecture, 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
轻松启动, 快速产出.

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

書中自有黃金屋書中自有顔如玉愛自己悅己容2nd愛自己悅己容

UfqiFina有福金融更新:JavaScript的数据类型强制等

UfqiFina有福金融基金板块提供了一种查询证券投资基金的模拟K线图的方法。

在证券数据的K线图(蜡烛图)的绘制时,我们选用了第三方JavaScript类库HighCharts中的HighStock组件。在应用HighStock时,我们遇到一个值得讨论的关于JavaScript数据类型的问题,记录如下。

1. JavaScript的数据类型强制问题

问题的描述如下。我们尝试在UfqiFina有福金融的K线图中增加一个未来的预测值,以此来帮助调用者判断和分析未来的走势,按当前的变动幅度,如果是看涨会是什么情况,如果是看跌会是什么情况。

https://ufqi.com/index.jsp?mod=financefund&act=fundChart&icode=164906&dataTimeType=weekly&predictType=1&tit=理财服务所

fig1. 基金K线图:交银中证海外中国互联网指数-164906价格行情-UfqiFina-20220615UTC+08-看多涨

依靠过往近期数据计算未来时间节点预测值是一件简单的事情,相当于计算过往数据点构成的一条斜线的斜率。使用JavaScript来做计算,默认是Float数值,遇有小数点时,可能带来非常多的小数点,如同在 MDN的描述一样,
The JavaScript Number type is a double-precision 64-bit binary format IEEE 754 value, like double in Java or C#. 

比如一个普通的计算可以生成, 0.1234567890123 这样的数据。为了便于减少小数点,我们尝试使用 toFixed / toPrecision 函数来进行约束,经过实践,我们发现 toFixed / toPrecision 的返回值不是 Number ,而是String.
The toFixed returns A string representing the given number using fixed-point notation.
The toPrecision() method returns a string representing the Number object to the specified precision.

例如,在UfqiFina有福金融的某个基金某一未来时点的预测值 predictItem是 [123456, 1.0123456789] , 经过 toFixed(4) 之后,predictItem数据变成了 [ 123456, “1.0123”] , 当这个数据进一步地被前转到 HighStock 时, [123456, 1.0123456789] 可以被正确地绘制出来,符合预期,而数据 [ 123456, “1.0123”] 则被视为非法的,被 HightStock丢弃,不符合预期。

相对折中的做法是,在采取了 toFixed 截断了小数位数之后,再次地调用 parseFloat 使之将 String-type 的数据重新变回 Number-type 的数据。
The Number.parseFloat() method parses an argument and returns a floating point number. If a number cannot be parsed from the argument, it returns NaN.

predictItem[1] = parseFloat( predictItem[1].toFixed(4) );

在软件研发中,通常使用弱类型脚本编程语言,我们不考虑数据类型,比如PHP, Perl, JavaScript, VBScript, Python等,没有严格意义上的所谓字符型数值还是数据型数值。经过上面的案例分析,我们自此也许要认真考虑,在JavaScript这样的弱类型脚本编程语言中,如果启用类似 use strict 严肃模式时,也需要认真考虑数值的数据类型(data-type)。 程序脚本任务执行时,从数值类型不敏感变成了数值类型敏感(data-type sensitive)了。

在 fig1. 中,我们将预测值显示在K线图的最右侧,图中,周线图2022Jun15调用时,我们预测出了 2022Jun20的数据,预测模式为“看多涨”(高亮红色表示选中项)。 预测模式除了“看多涨”之外,我们还提供了“看空跌”,从而更方便地展示某个被观测的基金数据如果涨,能涨到多高,如果跌大概要跌成啥样。

2. 日期及节假日的计算

证券市场的行情是高度时间敏感的。这种敏感性既表现在更新频次是秒级,也表现在对过往海量数据的处理。在时间轴上,比如K线图描绘时,就面临着是用自然日、自然周、自然月,还是使用交易日、交易周、交易月的选择。

使用自然日、自然周作为计算单位是相对容易的,但却面临大量节假日及临时停止交易的时间段;如果以交易日、交易周为计算单位在绘图时容易,但却距离人们的感受和经济社会发展相对较远。例如,即便是节假日,其他经济社会主体还是会有交易发生、有发展推进的。

折中的做法就是以自然日、自然周为计算单位,同时兼顾交易日和交易周。这就面临着要计算某一自然日、自然周是否有交易,或者某个交易日归属于某个交易周。
如此以来,情况就变得稍微复杂一些,涉及到历法的各种推算。

在UfqiLong有福金融中,日期的计算既有在客户端绘图时的JavaScript算法,也有在服务器端计算分时段收益率的Java算法。根据分析,我们发现如果锚定日期中的周五Friday这个时间点,并分别计算当前交易日、交易周与前一个周五的时间差,如果时间差在七天之内,说明是在一周之内,如果时间差在七天之外,说明已经出离了一周。

这样在遇到节假日等非交易日的情况时,就可以根据前一个周五的时间戳和当前的时间戳,分析出前一周或者本周有0个,1个,2个,3个,4个,还是5个交易日,从而得出本周的涨跌幅。

原文首发: https://ufqi.com/blog/ufqifina-javascript-tofixed/ , -R/n2SQ


有福金融UfqiFina : https://ufqi.com/finance

有福金融 是一个旨在促进财富稳步增长的工具平台。
UfqiFina is a platform of tools designed to promote wealth growth steadily.

发表在 服务器运维, 编程技术 | 标签为 , , , | 2条评论

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

Hanjst🙋汉吉斯特:更新升级+asyncScripti等改进

Hanjst🙋汉吉斯特 上一次更新已经是半年多前的事了,这期间随着研发工作的推进和在新项目新场景中的更多部署,她也随着进行小步骤地改进和升级,兹一一记录如下,备查。
始于2022年2月24日的俄罗斯侵略乌克兰的战争,也差不多持续了四个月了。英勇的乌克兰公民仍在顽强而奋勇地抵抗,尽管在我们写这篇日志的一天中,他们又有差不多100多位战士牺牲在卫国战争的前线!向乌克兰的坚守、勇敢与正义致敬!

Hanjst🙋汉吉斯特 历经五年来的发展与迭代,已经逐渐成熟稳定,并在多个关键应用及场景中表现优良。近期的主要Bug修复和改进主要内容如下。

1. 改进对注释行的处理函数 _remedyMemoLine

如前文所述对JavaScript代码中的注释行和HTML中的注释行的处理是我们关注的重点之一( Hanjst汉吉斯特与龙书编译原理 , https://ufqi.com/blog/hanjst-imprv-202111-with-memoline/ ),也是容易导致Bug的地方,这次改进之一也是关于注释行的处理。
比如针对JavaScript代码中的注释行处理,其中的注释标志是 // 而在程序代码中,常量字符网址的写法中就有类似 http:// , 所以需要额外的代码来进行这样的异常处理。

true && (segStr.match(/[a-zA-Z0-9-]+?.[a-zA-Z0-9-]+?[:]*/gm)
&& (segStr.indexOf(‘ ‘) < 0 || segStr.indexOf(‘/’) > -1)
and true) …

2. 改进条件表达式的行内式处理

Hanjst🙋汉吉斯特 支持行内表达式(内联)方式书写模板表达式。一些特殊字符需要做转义,以区分 Hanjst 表达式和原生的 HTML表达式,如 HTML的语句起始字符< 和终结字符 > , 当使用行内表达式(内联)方式时,需要将大于号和小于号转义为 &gt; 和 &lt; .
这次改进是针对行内表达式的更复杂语句的支持。

3. 新增 asynchronous Scripts 处理的计数器 asyncScripti

Hanjst 支持模板之间的嵌套,同时也支持在被嵌套的子模版中进一步地引入JavaScript或者CSS等文件,这些文件的引入方式,其中CSS依靠浏览器本身,Hanjst处理相对简单。而JavaScript的在子模版的引入方式,处理相对复杂。子模版中引入JavaScript主要依靠 appendScript 来实现。其中又进一步地的区分,引入的JavaScript是同步还是异步,如果是异步引入JavaScript,可以优先尽快地完成当前页面的绘制。

异步地引入JavaScript主要依靠在调用 appendScript 时,使用 window.setTimeout 方法来推迟对 appendScript 的调用时机,延迟一个时间窗之后再执行相应的对待引入方法的执行。以此来实现异步地引入更多的JavaScript,而同时又能够相对快的加载当前模板页所需第一屏展示的内容。

子模版(内嵌模板)中被异步引入的JavaScript文件,理论上来说应该是没有先后顺序关系的,因此在同样是异步加载时,我们之前的做法就是给每一个这样的脚本程序分别分配一个等量范围内的随机数等候时间,比如默认的 100~200毫秒. 这种处理方式,在绝大多数情况下,都是行得通的,通常也以脚本在模板文件中的先后顺序,顺延相应的时间后,一一地被执行、被引入。

但在另外一个苛刻的情况下,比如需要严格限制或者要求被引入脚本需要明确而精准的先后顺序时,就可能由于脚本没有按预期顺序地进行加载而出错。实际的案例如第三方图表JavaScript类库 HighCharts 中的 HighStock ( https://www.highcharts.com/demo/stock ),当更进一步地引入 indicators.js rsi.js 或者 wma.js时,如果按目前的 Hanjst 写法,可能由于后三者的加载顺序问题导致页面程序报错。

Hanjst的改进措施是引入 asyncScripti 参数,将每一个异步加载的JavaScript脚本文件都赋予一个顺序号码,相应地,在执行window.setTimeout时,依据asyncScripti 的序号大小,给与不同长短时间的等候时间,以此来映射在原生模板文件中的被引入文件的顺序。
由此,依据asyncScripti的控制,可以确保前一行引入的JavvaScript文件一定会在后一个被引入的JavaScript之前被执行,被引入。

改进前:
‘parseInt(Math.random()*1000+500));’);

改进后:
‘parseInt(Math.random()*100+’+((asyncScripti++)*100)+’));’);

使用改进后的处理程序,使得每一个被引入的JavaScript以每个间隔100毫秒的步骤顺序加入到待处理队列,同时通过Math.random进一步增大0~100毫秒的延迟,从而每个被引入的JavaScript的实际间隔在 100~200毫秒之间。

改进后的 Hanjst 经过实测可以兼容此前版本的应用环境,也可以很好地解决HighCharts stock相关JavaScript类库的带有时序要求的程序文件的引入。
Hanjst 再一次地成功进化。


除了键盘侠打嘴炮,我们还可以真金白银地支持发生在乌克兰的自由与奴役相对决的反侵略战争。

捐助乌克兰网站: https://u24.gov.ua/

银行捐款账号信息:
(USD) US Dollar
BENEFICIARY
National Bank of Ukraine
BENEFICIARY BIC
NBUAUAUX
BENEFICIARY ADDRESS
9 Instytutska St, Kyiv, 01601, Ukraine
ACCOUNT NUMBER
804790258
BENEFICIARY BANK NAME
JP MORGAN CHASE BANK, New York
BENEFICIARY BANK BIC
CHASUS33
ABA 0210 0002 1
BENEFICIARY BANK ADDRESS
383 Madison Avenue, New York, NY 10017, USA
PURPOSE OF PAYMENT
for ac 47330992708


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;
  • ….

全文首发: https://ufqi.com/blog/hanjst-asyncscripti/ , -R/P2SV

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

中国国民党Apache Softwares亮月亮科技OpenAI ChatGPT

电影最长的一天The Longest Day观后感

《最长的一天》(The Longest Day)是一部黑白胶片老电影,又名诺曼底登陆。她描述了第二次世界大战中后期同盟国军队集结主要精锐力量从西线英格兰东渡英吉利海峡,登陆到被轴心国德国占领的法国西海岸。这场战役主要发生在诺曼底海岸,所以电影名字也叫做诺曼底登陆(Normandy Landing),在盟军中行动代码叫做 霸王行动(Operation Overlord),也有称之为 D-Day, 登陆日。本片已收录到 有福经典UfqiClsc: https://ufqi.com/news/clscpage.1098.html?tit=最长的一天 The Longest Day 。

这一战役是整个第二次世界大战的重要转折点之一,盟军从此由战略防御转为全面进攻,同时轴心国也由盛转衰,开始节节败退,直至第二次世界大战结束,同盟国取得全面胜利。以此可见,此次战役的重要意义,电影以相对写实的手法描述、记录、纪念和致敬这场扭转战局的战争。

最长的一天(The Longest Day) 抛开了宏大的二战历史背景,从一个个普通而朴实的士兵或将士的角度来展现、解读和描绘这一复杂而又庞大的精彩绝伦的对决——盟军投入300万人,德军150万人。其中一个个并不算出色的士兵或者将士,组成了一个复杂而又强大的盟军主力部队。艾森豪威尔将军作为盟军总指挥在战情分析时,并没有显现出英明果敢或者高超神勇,相反,在有限的可供选择的范围内,他做出了一个自己都不情愿的冒险——在稍纵即逝的时间窗内发起跨海峡登陆作战!
恰恰是这个违背他本人意愿或者行事风格的决定,也让轴心国敌方分析其行为模式的情报人员及指挥官都不相信在那样的条件下盟军会贸然发动攻击。世事无常,艾森豪威尔将军不情愿地妥协,也把敌方打击个出其不意,也许这就是天意吗?

最长的一天(The Longest Day) 尝试刻画的,似乎就是这样一个由普通人完成的不普通的甚至是伟大的壮举。战前准备阶段,在候场的士兵中,有一位大兵的夫人怀孕了,孩子的父亲却不是这个大兵,但他却还是很担心夫人的安危。另一位大兵,与人唠叨了半天,彼此并不熟稔,只知道他的妻子跟了别人跑掉了。尽管根据军婚保护法律,他可以发起追诉,但他还是选择了原谅她。
至于在影片开头的场景中,火头军分餐时机械地喊叫 下一位 、下一位,当一名大兵抱怨说饭餐难吃时,火头军也只是简单地怼回去说,他只是领一份薪水,做简单的饭菜而已。
再往下,吃饭完毕,候场的大兵们聚集在狭窄逼仄的空间里,唠嗑的,写信的,甚至是打牌赌博的,从某种意义上来说,完全是有组织无纪律。盟军三军将士,怎么能在军营打牌赌博,还是赢钱输钱的呢?或许这才是真实的,符合人性的。

电影没有旁白,但我们似乎能听到这些质朴的声音:只是一份职业而已,但又要做好它。宏大的叙事背景——世界和平,解放全人类——都被这些低俗恶俗的段子故事消解地无影无踪。为何导演要刻意地抹去了那些理想、信念和价值观? 是因为它们太空洞了吗?

不独这些士兵看起来平凡而朴实,甚至是低俗,作为一线将士,在前线作战指挥的指挥官,在影片中显露出的品行也差强人意。前线指挥官中,空降师的上校落地后自己摔折了腿;登陆上海滩,枪林弹雨中血肉横飞,指挥官不沾枪炮反而叼着雪茄在发号施令;其他的带着宠物遛狗的上校,拄拐杖的上校,吹喇叭的上校,这一幕幕,或是艺术化的处理,或者是为了化解血雨腥风的残酷。
有了这些元素,电影所要讲述的一切都行云流水,不管是吹喇叭的,抽雪茄的,遛狗的,拄拐杖的,这些千奇百怪的指挥官尽管秉性各异,但专业素养和职业精神都是无可挑剔的。与专制独裁的千人一面、整齐划一不同,民主自由的世界里,连最需要等级森严、纪律严明的军营中,都如此的花样繁多、参差不齐。这或许是二战取得胜利的秘诀之一吗?

类似的滑稽的场面和人物还有很多,这些猜测或许是牵强的,盟军的三军将士或是艺术化加工的。但近三个小时的黑白电影中,并不让人感到枯燥,也可疑之处,反而给人的感觉是行云流水、一气呵成。
简而言之,最长的一天(The Longest Day)是一部可以与史实并举传颂的经典电影。

原文首发: https://ufqi.com/blog/movie-the-longest-day/ , -R/k2SY

最长的一天,电影海报,诺曼底登陆,D-Day,登陆日
发表在 社会生活 | 标签为 , , , , , , , , , , | 一条评论

愛自己悅己容2nd愛自己悅己容汽車老司機車載汽車老司機

GWA2吉娃兔🐇升级增加搜索模糊语法支持

一些事情一旦开始往往无法以自己预期的方式结束。
比如始于2022年2月24日的俄罗斯侵略乌克兰的战争,入侵者原计划三天之内打垮被侵略的乌克兰现政权,没想到快三个月过去了,战争仍然没有结束。反而战争的强弱双方开始逆转。顽强的乌克兰人民英勇抵抗精神正在逐渐获得更多国家的正义支持( https://ufqi.com/news/ulongpage.3839.html?tit=一个新的小强国正在挣扎中崛起 )。显然入侵者无法以自己的预期的方式来结束这场战争。

与破坏作恶者相反,一些建设者的积极项目也是一旦开始了,就持续不断的改进、升级,消灭一个又一个bug,增加一层又一层防护,原来世界可以变得更加美好,比如GWA2 吉娃兔项目。最好的版本永远是下一个发行版本。

GWA2吉娃兔自从2022年2月份进行了多进程多线程改进升级以来( GWA2 Java 增加多线程数据共享通道 globalData, https://ufqi.com/blog/gwa2-java-multiple-threads-globaldata/ ),又陆续进行了一些优化,兹记录如下,以备查访。

  1. Page Navigator 页面浏览增加对模糊搜索的支持
    Page Navigator 页面浏览模块是所有网络应用开发中最高频使用的功能之一。我们也对此进行了进行设计和代码实现。随着多年来大量的软件工程项目实践,我们陆续开发了独有的 PNSK 和 OPPKNSK 功能设计,实现了从浏览器参数设置到数据库SQL查询语句组装的全流程支持。

PNSK , Page Navigator Search Key, 页面浏览搜索关键词,
OPPNSK, Operator of Page Navigator Search Key. 页面浏览搜索关键词的操作符.

给定页面请求参数如,&pnskfielda=abc&oppnskfielda=contains ,
将通过 PageNavi 组装成如下数据库SQL查询语句:
…. and fielda like ‘%abc%’ …

这次改进升级的包括,如果给定页面请求参数中包括了空格或者问号?/?等模糊查询的搜索语法时,PageNavi 能够识别这种语法并做进一步的处理,使之能够转化为相应的数据库SQL查询语句。

给定页面请求参数如,&pnskfielda=abc%20efg&oppnskfielda=contains ,
将通过 PageNavi ,增加对模糊查询的支持,组装成如下数据库SQL查询语句:
…. and fielda like ‘%abc%efg%’ …

对模糊查询语法的支持,最早的想法和实现是在 gMIS吉密斯的改进升级中,当初的写法为:
$gtbl->set($field, “%”.str_replace(‘ ‘,’%’,$v).”%”);

改进后的写法将使用 _parseBlank 来统一替代:
$v = $this->_parseBlank($fieldopv, $v);

在新增加的 _parseBlank 中约束了目前只针对 contains 和 notcontains 这连个 oppnsk 进行如上操作,同时也通过全局配置开关 GWA2_Is_Parse_Blank 进行控制,可以对该功能进行停用。

除了 gMIS吉密斯之外,这项升级改进,将陆续应用在 UfqiWork有福工坊 和 UfqiFina有福金融 的搜索功能模块中。

  1. 增加对传统 Base64 编解码的封装

作为编解码的辅助设施,在 GWA2吉娃兔的设计中,默认的工具是 Base62x, 她比原生的 Base64 有更好的适应性( https://ufqi.com/dev/base62x )。由于 Base62x 推出时间较新,在GWA2吉娃兔开发的网络应用中,出于对接其他老旧系统的需要,仍需要兼容传统 Base64 的编解码处理。为此,我们改进了 inc/Zeea.class, 增加了相应的方法:

inc/Zeea.base64Encode 和 inc/Zeea.base64Decode

比如,我们在新近的一个项目中需要对接 Aliyun阿里云的一个在线服务,其中的API接口中,需要封装参数,为安全起见,在API接口请求参数时,使用 URLEncode对参数进行编解码,其中的不安全字符需要做替换处理:

private String specialUrlEncode(Object value) throws Exception {
return java.net.URLEncoder.encode((String)value, “UTF-8”)
.replace(“+”, “%20”)
.replace(“*”, “%2A”)
.replace(“%7E”, “~”);
}

如果使用较新的 Base62x 来进行 URLEncode的话,则不必如此繁琐地进行多个不安全字符的替换 ( https://www.researchgate.net/publication/307786166_Uniform_Resource_Identifier_Encoded_by_Base62x )。 因此,倡议更多的开发者在面向未来的网络应用开发中,全面使用 Base62x 取代传统的 Base64 .

  1. 增加对JSON/CSV格式数据的转换处理

GWA2吉娃兔 在最近升级改进中,在 Hanjst 模板处理的服务器端,增加了两个处理格式数据的方法,分别是处理JSON数据的 json2Map 和处理CSV数据的 csv2Map . 这两个方法可以方便对外处理数据交换。

数据转换处理背后的支持类库是 Google Gson . 相应的类库包已经随着 GWA2吉娃兔打包在一起。

本文首发地址:-R/q2Sa , https://ufqi.com/blog/gwa2-fuzzy-search/ 。



GWA2吉娃兔

-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architecture, 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
轻松启动, 快速产出.

发表在 -gMIS, -GWA2, -Hanjst/-汉吉斯特, 编程技术 | 标签为 , , , , , | 一条评论

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

金融证券市场保护性止损的重要性

2022年3月15日这一周在以后的中国证券市场发展史上可能会被记录为具有重要见证的一周。原本要记录些这一周的跌宕起伏和惊心动魄,记录那些一个个的“活久见”——美股中概股暴跌后暴涨,港股大盘暴跌后暴涨。恰此时,知名自媒体“兽楼处”发表了一篇类似的文章,甚为共鸣,转贴于 有福常在UfqiLong: https://ufqi.com/news/ulongpage.3720.html?tit=中国证券市场见证历史的一周:2022年3月 .

这一篇大致要回顾一下证券市场中谨慎设置并严格执行止损策略的重要性。这是温习经济学的第十一篇,其余之前的十篇,请参考文末的链接。

科班出身的金融专家都知道金融是经验风险的行业,是一门对天资要求颇高的“手艺活”。金融的本质就是把握好风险和收益的平衡。在价值交易者中或许可以靠无限量的资金优势和无限长的区间拉平和抹平损失,而趋势交易者就需要务必认识到证券市场阶段性,并在下跌趋势中及时止损。
这是金融证券市场的金科玉律般的教条,如果需要案例,凡是经历过2022年3月这场类似股灾的从业者都应该有刻骨铭心的记忆或教训。被誉为华尔街神童的证券股票交易大师 Stan Weinstein 在其代表作:https://ufqi.com/news/ulongpage.3605.html?tit=股票称傲牛市熊市的秘密 中就专门章节论述了,绝不能持有任何没有止损性保护的头寸。
这些止损性保护或者此前的支撑位或者周线平均线等指标。

止损,是一个听起来让人不舒服的词语,尤其是保护性止损或者割肉止损。实际上,正如词语所暗含的意义一样,的确是在断臂求生,去疮止脓。比如根据支撑位或者经验值,我们通常说可以接受10%以内,20%以内下跌,再止不住,就要认输认赔,止损离场。

这是绝大多数结构投资者都必需也是必须要做的,恰恰相反,更多个人投资者却不屑于设置止损保护,或者设置而不严格执行,最终陷入巨大的窟窿之中无法自拔。这可能是在金融证券市场个人投资者七亏二平一赢的背后原因之一。

金融证券市场投资绝不等同于赌博,不是靠猜测,而是靠概率,靠数据、数学来决策,尤其是计算技术发展迅速的今天,量化交易(机器人)的占比在逐步提升。既然靠概率,不是赌博,所以在任何情况下,都不会采取越输越加倍下注的下等策略,也不会将所有筹码都一次性地孤注一掷。

不管是投资交易高手强调的10%,20%必须且必需割肉认输止损离场,还是传统意义上的,当某一市场指数下跌20%后就被认为是技术性熊市,这其中背后可能存在某种数学上的关系。我们尝试列举了一些情况下上涨和下跌幅度的变化数值,比如某一证券标的物,从100元下跌到1元,然后再从1元上涨到100元的情形。

Fig1. 证券市场价格上涨与下跌幅度对比

从 Fig1. 证券市场价格上涨与下跌幅度对比 图中 , 我们可以看到如果回撤幅度在10%,则反弹幅度只要到 11.11% 就可以回本,基本上等比例幅度的反弹就能够找回损失。如果回撤下跌幅度达到20%时,需要至少 25% 的反弹上涨才能抹平下跌导致的损失。这几乎是同一个数据段的极限了。当回撤进一步下跌到 30%左右时,无法通过 30% 左右的反弹来弥补损失,而且越是往后,回本所需反弹上涨的幅度越大,50%的下跌,需要100%的反弹上涨才能找回之前的损失。这几乎是风险与收益完全不对称了。

当回撤下跌达到 70%时,几乎没有希望在可以预见的将来能有 3-4倍的反弹上涨,200% ~ 300% 的上涨?
如果继续抄底,更可怕的还在后面,当下跌回撤到 90%的损失时,需要十倍 900%的反弹上涨幅度才能回本,这几乎是余生是否能见到的场景,都值得怀疑。
而这真是当前(2022年3月)美国股市中国概念股所经历的情况(下毒Fig2.)。

Fig2. 美国股市中国概念股整体下跌超过90%

证券市场新手死于追高,老手死于抄底,是这么来的吗?上图Fig2.中下跌90%左右的股票,什么时候能回本?
为何下跌起来会越来越快,而上涨通常会越来越慢?

数学上看,prime越下跌越小,其后的价格变动绝对值,对prime本身的占比就越大,100元的跌9元,幅度是9%, 而10元的跌9元,幅度就是 90%了。
上涨慢的原因刚好反过来,prime越上涨越大,其后的价格的变动绝对值,对prime本身的占比就越小,10元的上涨了9元,幅度是90%, 而100元的上涨了9元,幅度是 9%。

上涨幅度慢的另外一个不容忽视的力量时,总是有对手盘在不断地分批次地“止盈”, 设想10元的价格上涨到20元, 幅度100%, 可能中间过程,反弹上涨幅度在 20%, 50%, 80%时,已经有大量的获利盘进行止盈操作。这些对手盘的抛盘操作,对持续上涨形成了巨大的压力,甚至改变上涨趋势,重新转为新的熊市,继续下跌。
于是,之前没有回本的继续被埋下去,同时又引入新的陪葬品。

当个体投资人有限的本金被深度套牢后,再无新资金进去按新的方法实施解救,余生之年是否能回本都是让人怀疑的,于是自然而然地形成了 七亏两平一赚 的悲情市场。
相反地,机构投资者,由于有止损操作,叠加当一笔失误导致20%的损失后及时止损,同时还有其他资金持续增援,还可以在其他场次找回这 20%的损失,循坏不已,生生不息。

未学会躺赢,先学会认输,这大概值得每一个准备入市,或者在金融市场跃跃欲试的投资人深思,甚至警钟长鸣。既然美股中概股可以“九年涨幅,一夜归零”( https://ufqi.com/news/ulongpage.3721.html?tit=时代的一粒沙美元证券投资基金的一座山 ), 作为个体投资者十年盈利,也可能在一次无底洞的失败中彻底失去所有翻盘的本金。

被美国股神沃伦巴菲特尊称为老师的格雷姆在《聪明的投资者》( https://ufqi.com/news/ulongpage.3423.html?tit=聪明的投资者 The intelligent investor:安全边际:投资的核心概念 )末尾总结说:

我大胆地将成功投资的秘密精练成四个字的座右铭:   “安全边际。”

照猫画虎地,我们在 UfqiFina 有福金融 的尾注中,添画了提示语:

⚠️市场有风险, 投资需数点. 安全无边际, 流泪抹鼻涕。

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

  1. 经济周期论兼议称傲股票牛市熊市的秘密, https://ufqi.com/blog/economic-cycles-and-profits-in-stock/
  2. 国债与信用货币, https://ufqi.com/blog/treasure-credit-money/
  3. 理性经济人在边际上做选择, https://ufqi.com/blog/economic-selection-on-margin/
  4. 写写年度收益率年均收益率和年化收益率-4, https://ufqi.com/blog/income-rate-annuals-with-buffett/
  5. 写写年度收益率年均收益率和年化收益率-3, 
    https://ufqi.com/blog/income-rate-annuals-with-yale/
  6. 写写年度收益率年均收益率和年化收益率-2 , https://ufqi.com/blog/income-rate-annuals-with-cic/
  7. 写写年度收益率年均收益率和年化收益率, https://ufqi.com/blog/income-rate-annuals/
  8. 治大国若过小家——写写王朝兴衰更替背后的经济账, https://ufqi.com/blog/political-reform-country-vs-home/
  9.  写写存款利率贷款利率和负利率, https://ufqi.com/blog/captial-rate-and-minus-rate/
  10. 写写1929年美国经济大萧条与2020年美国股市大跌, https://ufqi.com/blog/us-1929-economic-crisis-2020-stock-shock/

有福金融UfqiFina : https://ufqi.com/finance

有福金融 是一个旨在促进财富稳步增长的工具平台。
UfqiFina is a platform of tools designed to promote wealth growth steadily.

本文: https://ufqi.com/blog/security-sell-to-stop-losing/ , -R/u2SU

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

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