Synchronized同步Quque队列Concurrency并发与线程锁Lock

GWA2 Java最近做了一次核心功能的升级,缺省模式下不再开启用于进行线程同步控制的synchronized功能。

在最近一次新项目的GWA2 Java开发部署中,我们需要调试一个通过WebApp.readObject来读取外部资源的功能。由于需求涉及到读取一个较长的资源列表,我们就设计了一个自动程序,循环轮询基于GWA2 Java的API接口。一切进展顺利,但程序偶尔会出现超时的现象。

起初我们怀疑是WebApp.readObject的方法中没有限制timeOut,导致读取外部资源时卡壳,进而影响到GWA2 Java应答外部需求。我们即对读取外部的URLConnection方法设置了 setConnectionTimeout和setReadTimeout两个限制时长的操作。这一改进也很快得到验证,部分请求确实会触发timeOut,根据需求适当延长这个限制即可。

然而问题仍然偶尔还会出现,尽管我们将轮询API的进程改为一个,轮询时间间隔如果稍微缩短一点,可能就会出现卡壳。问题一路narrow-down下来,就锁定在了程序执行上,当前一次的轮询没有完成,就触发下一次轮询时,下一次的轮询会天然地增加等待时长。相当于基于多线程、多进程的Apache+Tomcat变成了单线程服务。更为严重的表象时,当API应答程序在处理外部资源请求时,其他所有同一应用程序接口也一并被悬停,直至最后Timeout/504.

问题就不是当前API接口问题了,进一步的分析,我们将故障定位在此前某次某个项目的数据安全性核查时,发现没有数据共享/进程安全的设置,就在GWA2 Java的入口程序设置了Synchronized(this) 关键词约束——这样,整个Application应用将变得非常安全,只是性能上不再支持并发请求,所有请求必需单队列逐个处理。

通常在一般情况下,如此安全的设置和不支持并发请求并不会立即显现出来。这是因为GWA2 Java的应用开发交付后,多需要每个请求在数个毫秒级内处理完成,也即用户能感知到的2-3秒内,GWA2 Java应用程序已经顺序地完成了几十到几百个队列请求了。这几百个“同时”完成的请求,给终端用户甚至是开发者以支持“并发Concurrency”的假象。这样以来,某次更新GWA2 Java时,加入的 Synchronized的约束居然一直使用到现在,直到我们在测试育有超时的程序引发的GWA2 Java不能及时在毫秒级完成任务的特殊情况下,才触发我们进一步分析和完善这一潜在的漏洞(Bug)。

fig1.应用程序多线程下的线程锁

接着这个机会,我们想深入复习一下Synchronized同步Quque队列Concurrency并发与线程锁Lock。由于软件开发的主流逐渐步入以线程为单位,我们在网上找到一张描述线程间获取共享资源的流程示意图(如上图fig1.)。尽管这些名词有些抽象,我们可以拿一个具象的东西来说明这里的来龙去脉。比如高速公路上的收费站(如下图fig2.),收费服务就可以视为一个网络应用服务,每一个收费口就是一个应用服务的实例或进程,而每一个闸机口就一个处理线程。有一个闸机口的就是单线程,有多个闸机口的就是多线程。

fig.2高速公路收费口多通道并行

收费口的线程(闸机口)是多个并行,这很显然的是能够提升通行效率,而且线程同时开得线程越多,通行越快。这也是多进程多线程成为主流的关键之一。这是理想状态,也是默认的并行处理结果。因为每个闸机口在处理请求通行时,不需要彼此“问询”或者“交互”,各个可以独立自主地完成。用户计算机术语说是不不要处理“共享资源”,也不需要锁什么的。

如果我们人为的设置一个“共享资源”,情况会怎样?比如这所有的线程(闸机口)只有一把钥匙能开,每个线程完成计费、收费后通知这边钥匙去开闸放行。这就是典型的多线程秒变单线程了,完成收费后的线程需要等等开闸机的钥匙,然后再才能服务下一个请求。这个开闸机的“钥匙”就是fig1.中的“锁”。

只有一把钥匙的情况是虚拟的,现实生活中可能不存在。但核查车辆是否合法、司机是否违章是确实存在的需求,比如再多的闸机口都需要统一请求到交通中央数据库去比对车辆记录、司机记录,然后等待反馈结果。在世界的另一面,交通警察执法等在不停地向数据库中写入、更新违法、违章记录。当一笔写入发生时,所有的读取访问,都要被“悬停”等待,这就是“锁”。

由是可见,这同步与并发存在矛盾,为了减缓这种矛盾,收费口闸机口可能缓存交通中央数据库的数据,用一段时间再做一次更新,做到“准实时”(及时,in-time),而非“真实时”(准实,real-time). 在惊心动魄的逃亡类电影情节中我们偶尔能看到,男主女主苦主刚刚通过机场登机口闸机,边检员的屏幕上就显示出新推送到的苦主作为犯罪嫌疑人的资料。
在线网络服务中,用得较多的需要同步控制的“共享资源”的场景,如电商网站的库存,库存数据是每笔交易后都需要更新,当有更新发生时,必须进行枷锁操作,以使得当前有且仅有一个线程在操作数据,从而避免了“一货两卖”的错误。

同步、并发和锁的问题不独在Java中,在GWA2 PHP也会涉及到。所不同的是PHP的Synchronized的控制,既有系统地的PThread对象组件,也有微观flock方法函数。

只谈设计思想和实现思路,已经构成一篇博客Blog, 居然没有任何示例代码补贴出来。所幸无论是Java,还是PHP或者 GWA2 Perl, GWA2 Python等,都能够轻易地的通过搜索引擎找到编写良好的关于synchronization同步和Concurrency并发的示例代码。


GWA2

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

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

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

本页地址: https://ufqi.com/blog/gwa2-php-synchronized/ , -R/T2ST

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

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

经济周期论兼议称傲股票牛市熊市的秘密

断断续续的编译、精读完成了Stan Weinstein的《称傲股票牛市熊市的秘密》一书的原著。原著英文篇幅并不长,不足400页,翻译成中文可能不足300页,但却差不多花了我三个月的时间,从2021年11月到2022年1月,差不多是每天几页书的速度在读。在之前的阶段性评论时,我写到:

“又念及这每一段文字下面都是美国华尔街股市无数散户的森森白骨,读得快了怕是阴气太重无法消散。在冬日正午的阳光下散步时去反思去揣摩去论证去质疑…” ( 山高水长师恩难忘, https://ufqi.com/blog/thanks-to-teachers/ )

实际情况是阅读此书确实让人收获颇丰。这本书在豆瓣网上评分9.0+/10.0,在亚马逊电商网上评分为9.4+/10.0. 尽管一度被揶揄说是被书名误导坏了的一本书。如此高的评分,也促使我们将其以致敬的方式收入到 有福经典UfqiClsc: https://ufqi.com/news/clscpage.1074.html?tit=称傲牛熊市的秘密 Stan Weinstein’s Secrets For Profiting in Bull and Bear Markets .

Stan Weinstein( 史丹·温斯坦 )不避讳地说,他的理论属于证券分析的技术派。证券技术分析的理论前提是周期论,历史会重演,太阳底下没有新鲜的事。连贯起来之前阅读涉猎的有关经济周期的相关资料,我觉得有必要对其进一步地梳理,以期形成一个关于经济周期论的自我认知小结。这已经是温习经济学内容过程中的第十篇记录了,之前一篇是 “国债与信用货币”( https://ufqi.com/blog/treasure-credit-money/ ), 其他章节的链接也分别附录于文末备查。

经济发展是有周期的,历史是会重演。太阳底下没有新鲜的事( There is no new thing under the sun. ),这句出自《圣经》的话说对了一半。对的一半刚好印证了我们的证券技术分析的历史会重演,在一个时期(周期)内,比如在太阳的这个如日中天的时段内,我们人生所经历的起起伏伏、历史朝代的更更替替、证券市场的涨涨跌跌、大海潮汐的来来回回、冬去春来寒暑易节因循不爽。
其错的一半可以用中国的古书《庄子》一句解读:夏虫不可语冰。我们还未完整地经历一个太阳周期,就说太阳底下没有新鲜的事情,显然有些偏颇了。如同夏天的虫子说,水不可能结冰一样。这里所谓夏天的虫子,是指该虫子的生命周期起于春末夏初、终于夏末秋初。

fig1. 不同对象的周期的层级与大小

从个体人的视角来分析经济周期,大致有如下几个层级:
R0. 个人的生老病死周期,作为工具人的时间大约30-40年;
R1. 比个体长一个层级的可能是一家公司/集体的创立、发展、繁荣与消亡;
R2. 比一家公司更长一级的周期是行业周期,一个行当的兴盛与衰亡;
R3. 一个政权实体的更替周期要比一个行业更长,但也有兴衰荣枯的节奏;
R4. 几百年的政权更替周期比起我们所赖以生存的地球周期,还是小一些;
R5. 地球的周期之于太阳系的周期,也小很多.

比个体人更小的循环周期可能是我们饲养的阿猫阿狗(R-1),也据说我们体内的细胞组织大约21天会全新更替一次——老的全部死去、新的全部创制就位。地球所归属的太阳系目前探知有46亿年了,这个太阳目前是生老病死的哪个阶段,人类目前似乎还把握不准,更大的还有银河系(R6),人马座星云等等。一个可以感知的对比是,个体人的尺寸之于地球,相当于体内细胞组织尺寸之于人体。

fig1.的图示显得个体人依附于某一个集体组织,集体组织/公司归属于时代的某一行业,行业又受制于政府/政权的管控,政府/政权短则数十年、长则数百年重新捣毁推倒重建轮回一次。基于这些认识,我们分析经济发展的周期,就显得容易多了。承认了经济发展是有规律地周期运动,那么作为经济的一部分,证券市场分析,则也在周期的大势之内。
fig1.的图示是单调的示意图,如果用傅里叶级数( Fourier Series )这样的数学大杀器或能更形象地描述周期发展的过程。

fig2. 傅里叶级数的收敛性表示经济周期 ( https://upload.wikimedia.org/wikipedia/commons/b/bd/Fourier_series_square_wave_circles_animation.svg )

fig2.中,从上到下从大到小可以分别表示政权/政府、行业/组织、公司/集体、个体。如果假设右侧所绘制的曲线上部表示“好的”,下部表示“坏的”,可以明显地看到,政权/政府对好与坏的结果影响最大,行业/组织在大趋势下形成小的波动,公司/集体影响次之,个体对好与坏结果的影响却是极其有限,波动范围极其窄小。
几乎是生逢盛世良治善政意味着躺赢地在“好的”区间(1n, 2n, 3n, 4n),而生逢乱世兵荒马乱,任你是绝世高手义薄云天,意味着几乎是地狱模式一般地拼尽全力也只为求生活命,在“坏的”区间(1u, 2u, 3u, 4u).

在Stan Weinstein里的书里,作者墩墩告诫并不断反复强调,技术分析要先看证券市场大势,并提出从森林到树木( From Forest to Tree )的选股择时方法。整体市场面是牛市还是熊市?某个行业是兴盛还是衰亡?某个个股是看空还是看多?当三者都满足时,该股票才被列入候选项,然后根据价格走势图择机买入,之后再择机卖出。
不要对抗大趋势,不在熊市时候出手,甚至不在下跌的时候持有,这大概是Stan Weinstein这本书的精髓所在,完全推翻了传统股票操作的金科玉律——低买高卖。取而代之的是Stan Weinstein推荐的呼之欲出的“高买高卖”,理论上破解了“新手死于追高,老手死于抄底”。

作为反例证,
1. 在整体大势上,如果2021年8月份入市香港股市,恒生指数已经进入熊市;
2. 在行业选择上,如果2021年5月份买入美国股市的中国互联网概念股票,尽管美国股市处于牛市,但该行业已经全面进入熊市;2021年9月份买入中国股市的医药行业股票,尽管中国股市还处于牛市,但该行业已进入熊市;
3. 在个股选择上,反例则比比皆是。

不幸进入这些熊市的股市或者相关行业、个股,传统的下跌回撤-20%以上的心理价位很容易跌破,如果没有这些意识而误打误撞进入,提前止损是唯一的出路。不要猜测底部,也许根本就没有底部,只有更低。回本盈利更是遥遥无期,也许最终会涨回来,只是没有人知道什么时候,三五年后作为被困被锁的资金,已经大幅折损。即便数年后回本并且盈利20%以上,计算一下年化收益率,也很难说有胜算,甚至无法跑赢实际通货膨胀率。更不幸永远涨不回来了,本金彻底灭失,这也是《聪明的投资者》告诉大家的,投资的核心是要有“安全边际( Margin of Safety )”(有福经典UfqiCsc: https://ufqi.com/news/clscpage.1069.html?tit=聪明的投资者 The intelligent investor )。

不对抗大势,相反顺势而为,则取胜的概率则较大。以较大的概率进行证券市场技术分析,即使偶尔有失误,也对长期收益不会影响太大,毕竟从概率上来说,赢面较大。如同做传统普通的生意买卖一样,有赚有亏,整体上是盈利的即可。这大概就是知道并利用经济周期的出发点和落脚点。
至于经济周期中的其他周期,也是可以观测到的,也是可以利用的。比如房地产周期,金融危机周期,煤炭石油能源周期等等。

最后,认清并理解市场参与者角色定位也很重要。Stan Weinstein也提到在证券市场里认清市场构成格局,不要试图让每个人都明白市场的阶段性和周期律。既不做教父,也不做圣母,因为正常的证券市场始终需要留一半清醒、留一半醉。他在书中举了一个极端的例子:如果所有投资人都读了这本书,都理解并遵照书中的套路去分析市场走势,当一个市场中只有买方或者只有卖方时,市场就死掉了。
这就是大师格局的思维了,以此可以将他与邪教异说区分清楚。世上所有的邪教都鼓吹:听我的,听我的,只能听我的,除了我之外再无别的神。
通过这里,我们也很容易理解,证券市场的参与者中,政府、中介机构总是天然地鼓吹入市、入市——只要资金入市,他们就有得赚,而市场中的买方和卖方又必须针锋相对地不一致,市场才能正常运转。
基于这样的四方角色分析的认知,市场上3/4的力量始终是同一个音调地喊“买入、买入”,而只有1/4的力量在微弱地发出声音说“卖出、卖出”。所以根据媒体和舆论意见建议去操作股票,十之八九要亏损的。

不知是幸运还是厄运,市面上经过各方鱼龙混杂地搅合,已经没有一个独霸天下的股票操作方法,相反地是各种法术千方百计、姹紫嫣红满园春的局面。这其中有多少真真假假,似乎已经不重要了,政府和中介机构可以渔利,四方角色中已经有两个赢家,至于后面是卖方获利,还是买方获利已经不重要了,铁打的营盘流水的兵。

小结一下, 经济发展是有周期的,历史是会重演。Stan Weinstein告诉大家了一个小秘密:股票的阶段性按周期的起伏涨跌规律。这个秘密如同天下所有的武林绝学一样,只传给信他的人,而且知道的人多了就不灵光了。

fig2.是一幅静态描绘大周期中套小周期的概念,借助于计算技术及互联网络的发展,我们可以看到更好的动画演示版本。通过动画版本,将个体人代入那个最小的圆圈(第四个红圈),看看我们社会中的一个个个体是如何随着社会大潮随波逐流跌宕起伏的吧。

fig3.傅里叶级数表述大小周期嵌套与互动动画

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

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

—-

有福经典 UfqiClsc

有福经典UfqiClsc 是全人类传统优秀文化的网络再呈现,其致力于通过互联网络将传统文化中的书籍、图画、音乐、电影、软件等作品以不同的载体形式展现在读者面前。通过互联网络,有福经典UfqiClsc 希望能够将人类文化中的智慧瑰宝无差别地呈现在每一个网民面前,以期为往圣继绝学,为万世开太平。https://ufqi.com/news/?mod=clsc


https://ufqi.com/blog/economic-cycles-and-profits-in-stock/ , -R/p2SS

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

床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌电热蚊香液套装无味婴儿孕妇家用补充液插电式灭蚊液护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏书皮纸自粘透明磨砂加厚包书皮小学生一二三四年级上册上学期书膜全套课本书本保护套16k封面外壳防水a4

Web应用开发中的本地存储限额localStroage Quota

近几年互联网络的发展似乎进入一个瓶颈期。不独一时一地,全球趋势大致如此,大概处于传统互联网络已经日至成熟,而创新技术在萌芽期尚未获得突破之际。所以传统互联网络技术只好在细节上打磨、内卷(involution)和进化(evolution),以此来消磨革命性(revolution)和创新性(innovation)技术来临前的时光。Web应用(网页应用)的开发者中新推进的本地化静态存储locaStorage就是这方面的一个代表。

作为矢志不渝的目标之一,Web应用要在性能和体验上追赶并且超越本地应用,除了客户端机器本身性能和网络带宽的飞速提升,Web应用本身对数据的处理也是重要的革新和优化方向之一。将Web应用中的常用数据在客户端本地进行持久化静态存储是个不错的主意,目前多数浏览器已经支持,而且一经推出即获得好评和广泛应用部署。比如在我们最近的老项目 有福新闻(UfqiNews, https://ufqi.com/news ) 和新项目 有福金融(UfqiFina, https://ufqi.com/finance )中,都有用到网页对象 window.localStorage对象对用户常用的交互数据进行本地化储存。

处于谨慎安全与性能考虑,浏览器的本地存储localStore对象给与每个域名的空间是有限的,这个限制是理性的和平衡的。有了这个限制,在调用localStorage 进行本地存储操作时,就可能会触及限额超额的问题。目前多数浏览器默认的window.localStorage的限额为每个域名5MB的空间. 基本上节省点用,一些基本需求还是可以得到满足的。

这个节省点用,是个模糊的描述。最近我们在Web开发中就遇到了localStorage报错说超额失败了。这个错误信息大致描述为:

DOMException: Failed to execute ‘setItem’ on ‘Storage’: Setting the value of ‘A_USER_KET_NAME’ exceeded the quota.

至少有两个公开的Web应用中存在很容易触发类似问题进而影响正常功能使用的现象, 比如第三方共享/分享插件 ShareThis 和博客程序 WordPress 。引起window.localStorage的问题可能很多,ShareThis 和 WordPress报错也不一定是他们本身存储了太多的东西,但目前发现,他们由于localStorage问题影响了正常功能使用。

ShareThis 的Web页面的JavaScript程序对访问过的每一个页面无差别地将其写入本地存储localStorage,写入时Key为 st_shares_URL_WITH_PARAMETERS , 这很恐怖的导致 localStorage 存储尺寸飞速上升,如果访问页面地址很长,而用户又在一个domain站点里访问了很多页面,我们观测到当我们在 UfqiNews 访问2000+页面时,localStorage 存储ShareThis的数据已经开始报错超额了!😢

WordPress 的新版本在启用编辑器时,会调用localStoage,当操作localStorage读写失败时,编辑器就无法使用了。😰

上述读写本地存储localStorage问题表现在:
1) 同一个页面功能不该创建过多的Keys,比如ShareThis, 应该将所需本地化的数据统一放入一个 ShareThis_LocalStoage 主键Key下面,然后再是各个key/value 对,更加明确;
2)既然 localStorage有限额quota,那么在设计数据结构时和流转机制时,就应该以某种先进后出或者先进先出的形式,有定期更新和删除操作,不然再大的空间也有用完耗尽的一天;
3) 既然 localStorage有限额quota ,那么在设计读写操作程序时,就应该有错误处理机制,当遇到无法返回预期数据处理结果时,应该平滑地进行下面的操作,或读取远程服务器数据或操作磁盘文件系统,而不应该让程序因此而卡壳掉。

我们在 有福新闻UfqiNews和有福金融的开发中就遇到类似需求。当我们需要存储用户个性化的一些动态信息时,比如用户最近阅读的主题词或者用户查询的基金代码等。在没有window.localStorage对象之前,只能在服务器端存储,在服务器端上维持个庞大的用户浏览历史记录表,而且需要实时高并发的写入更新。这存储还可以,高并发的写入更新实在勉为其难。window.localStorage生逢其时,可以很好的满足这个需求,我们可以将用户的浏览历史数据,写入本地localStorage, 既是个性化、分布式的,也避免了实时高并发地写入更新服务器数据。

fig.1. 有福新闻UfqiNews全局热点和用户自选主题词列表
fig.2. 有福金融UfqiFina用户自选基金行情K线图查询历史列表

有鉴于在 本地存储中 ShareThis 和 WordPress上述问题的经验教训,我们在设计本地存储时,
1)遵循了一个功能点,设计为一个主键Key的方式,然后将相应的数据放入这个主键Key下面,以JSON等方式进行读写。
2)同时,考虑到本地读写的便捷性,我们还对历史数据进行排序和统计,让更高频地使用的主题词或条目排列在最前面,方便用户更快捷地命中信息。
3)基于这些统计数据,我们对所要存储的数据有了把握,可以控制要存储的数据条目数和所占用空间的尺寸。定期或者按需清除不需要的数据,从而节省有限的 window.localSroage空间,以图长久。
4)考虑到在服务器端无法感知的本地存储限额异常错误的发生,在运行时,如果读写本地存储异常时则跳过功能点继续其他页面流程,而不是卡壳程序。

在 内卷(involution)和进化(evolution)过程中,没有革命性(revolution)和创新性(innovation) ,我们能依靠的只有在细节上更精准地把握,才有可能产生新的突破(disruption),从而完成由量变到质变的飞跃(leap)。
JavaScript担当起Web应用开发的主角,还有很长的路要走,但前途是光明的,恰如数年前我们所预见的那样:JavaScript或成主导的编程语言( https://dl.ccf.org.cn/article/articleDetail.html?id=3738875941521408 )。 如果不去体验几乎难以想象,上面的fig.2.基金行情K线图是完全基于JavaScript的 HighChartStock 所绘制出来的。


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.


有福金融UfqiFina

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

发表在 UfqiNews有福新闻, 社会生活 | 标签为 , , , , , , , , , , | 一条评论

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

山高水长师恩难忘

最近在读《Secret’s for Profiting in Bull and Bear Markets》这本书的原著。由于是每天几页的精读,所以读得速度很慢,留下很多思考和消化的时间。倒不是因为这本书有多么的高深或者艰涩难懂的理论,相反它是一本类似通俗读物的财经畅销书( https://ufqi.com/news/ulongpage.3377.html?tit=股票称傲牛市熊市的秘密 ),甚至读到过半会发现事情就那么些,多数是车轱辘话来回式地强调和反复。又念及这每一段文字下面都是美国华尔街股市无数散户的森森白骨,读得快了怕是阴气太重无法消散。在冬日正午的阳光下散步时去反思去揣摩去论证去质疑,渐次觉得或许这位“华尔街神童”作者(史丹·温斯坦/Stan Weinstein)真是一位好老师。由此及彼,这位老师让我回想起过去四十多年来每逢艰难困苦时,总是有天使般的老师向我施以援手,岁月悠悠这些师恩不曾随时光暗淡,反而逐渐光辉起来了——姜德臣老先生、杨光老师、杨洪波老师和尹耀廷教授

2022元旦,辞旧迎新之际,用追忆来开启新一年。

我成长在普通农村家庭,1980年代后中国改革开放已经蔚然成风,然而我的老家依然是牛耕人织原始版的耕农画面。生活依然主要吃食杂粮,过年过节才有白面馒头或者肉食饺子等大餐。记忆初期就是这样,在这种背景下,求学是很算是很奢侈的了,我记忆中小学1-3年级没怎么上,大概一年级没怎么读,二年级读一阵子,然后读三年级似乎正式起来。一方面是自己可能真显露一些“天分”,二则家人可能也没把学习当回事。

3-5年级持续好成绩,及至初一升读到本乡的一所中学,第一学期结束,依然是各种奖状的大赢家。这时候决定我命运的转折点来了,也就是我的第一位恩师,也是我的大爷——爷爷的哥哥——姜德臣老先生。他是位老师,我记事起他就退休了,门生很多,结交广泛。在我升读本乡初一那一年,他通过熟人介绍将我和他的小女儿(我的小姑姑)一同从本乡普通中学转入本县很有名气的另一所中学。择校这种事,那时候就开始有了。

大爷的确是恩师。记得小时候经常在某个清晨,我们家刚起床,大爷就步入院子先是对我的父母进行诸如“勤俭持家”“人勤春早”“家和万事兴”的教育,然后再对我进行诸如“诗书继世长”“人情练达即文章”“燕雀焉知鸿鹄之志”“大鹏展翅抟扶摇直上九千里”子类的教导。

多年之后回想这次择校,既有父母的极力推崇攀附,也有自己小时候显露出的好学聪慧的一面(夏日午后的晒麦场上讨论可不可以接胡耀邦赵紫阳的班),以至于得到老先生的法眼抬爱。当其时,我曾经有一阵子体验过“一目十行”“过目不忘”的技能,那种体验就是将一页书的内容类似拍照一样形成图片在脑海中,合上书本,若是背诵或者提问,会将脑海中的那本书翻到某一页,然后再查某一行,然后图片就再现了。

多年以后我逐渐完成了初中、高中、大学和研究生教育,老先生始终是我的启蒙恩师,他的教诲也时时闪现。及至后来我返乡时,他交托我一本小册子,是自己平日里读书或思考心得的“增广贤文”,嘱托我整理成册,择机印刊传于子孙后辈小生,敦敦教诲,殷殷期盼。

被转入本县好一点的一所初中后,我们需要离家住校,可是那所学校刚声名鹊起,基础设施里原本没有学生宿舍。好在有办法,对于一些不在学校居住的老师,将其办公室部分征用作为学生宿舍。老师办公和学生宿舍共用。颇具喜感的画面就是白天是老师们的办公室,放学后老师和学生一起在“办公室”里生火做饭(部分回家的老师不用)。

就这样我幸运的遇到了第二位恩师,也是我的室友——杨光老师。杨老师年龄偏长,我在他的办公室居住生活,他偶尔不回家吃饭,也在学校吃住,于是那么两间平房既是我的宿舍,也是杨老师的宿舍和办公室。杨光老师和蔼可亲,我生活和学习上都得到他莫大的帮助。可以想象一个十三四岁左右的男孩子要自己生火做饭。我从他那里学习得了手工赶制面条,一个人的分量,通常鸡蛋大小的面团就足够了。他偶尔做的豆腐特别馋人,我甚至在未经他许可的情况下偷偷地尝几口。
说起生火做饭比较有画面感的是,就是找柴火架起来烧火煮水。那时候稍微先进点的灶具是用煤油炉,赶上市面上没有煤油供应或者没钱买煤油的情况下,就去学校四野找干枯树枝回来烧火。生活总是有办法的,糊锅烧焦和吃食带霉点的馒头是经常的事,毕竟那时候虽然有电灯,但没电冰箱。
生活也是丰富多彩的,我甚至在老师们打麻将桌旁边酣然入睡。

总觉得那时候我的学习全靠另外一个“我”在进行,就是没有自我意思或者事后全回想不起来。懵懂少年?也就类似情况完成了初中学业,高中入学考试考入本县一中。
在一中校园起初是高一(1)班,后来文理科分班后转入6班。记得清楚居然是因为我们创办过《六班日报》。杨洪波老师是我的班主任老师,带语文课。高二下我经历了生命中最严重的伤害,被歹徒偷袭几乎没了性命。所幸大难不死,住院数周康复后无法再在校外居住,杨老师伸出援手。他的办公室后侧有一间可容纳一床的小屋,稍经收拾就留做我的宿舍,从此在校内安居下来,直至高三毕业。

当其时由于头部受伤严重,加上被偷袭的心理阴影,学习上似乎始终无法回归正常聪慧,事后回想起来那些事似乎像“断片”一样无法补全。在杨老师办公室居住的时间里,也结识了杨老师的小儿子向军哥。在他们父子悉心照料和关怀下,我余下的高中生活似乎都是幸福的。而且随着伤病痊愈,后面的事情越发记得清晰。
有一次清早,我在诵读古诗词如琵琶行或者出师表或者岳阳楼记之类的,杨老师听闻步出道,作为理科生为何天天背诵这些诗词?我不记得是由于杨老师带语文课,还是别的什么就读起来的感觉很好。我也不记得是否杨老师训教之后每早转做数理化习题集了。
感念师恩,当写到这一节时,我渐次觉得,如果选一组形容词来,没有比 山高水长 更好的词汇来概括这如父如兄般的温暖。那是雪中送炭,是久旱甘霖。事后推演,如果没有杨老师的帮助,我是否能走出伤病阴影,是否能完成高中,都是未知数。
在那个多事之秋还发生过很多事,在家庭、学习、身心各方困扰下,很多无厘头的事情在当时看来似乎都有注解。我曾经身无分文地从家乡蹭火车去大上海找黑社会,某个高架桥下待了一晚上也没看到电影里的情节,寻找无果再从上海返回家乡。失踪的这些天里,杨老师四处打探寻找我,甚至派人到乡下村上探问回否。

高中毕业离开家乡,起初的岁月里艰难挣扎。待生活稍微好转,重新联络到杨老师时,他已经八十多岁了,偶尔中秋或教师节寄去问候,或年节探望,多是匆匆来忙忙去。所幸某年回访家乡看望恩师,得杨老师手书《朱熹家训》小楷一幅,奉为至宝,装裱于厅堂,以此感念。

朱熹家训,安徽涡阳一中杨洪波老师书法小楷作品

初入京城学习那年我20岁。尹耀廷教授已经退休,之后返聘到学校任教,我们是实打实的亦师亦友的忘年交。入学之后,我似乎已经完全从高二那年的灾难中恢复了,学习也犹如神助,能感觉到是自我在进步。
世事难料,而且总在我还没准备好怎么应对时就发生了。经年连月的读书,我的家庭再也无法支持我越来越昂贵的学业开支了。大一的账目结清,大二就得欠款了,奖学金似乎是杯水车薪。欠款到大三开学,实在无法向当时的班主任交代,甚至一度被老师逼着搬出学生宿舍。当其时似乎不知道哪里来得勇气,我给时任副校长的尹耀廷教授写了一封信。信的内容已经有些模糊,大致是作为学生1-2年来,见闻学校的教与学的各种利弊,希望能改进如此如此。
或许是考虑到我的信,更可能是鉴于我各科考试的优异成绩单,尹教授批复同意我以勤工俭学的方式完成学业。这犹如激流涌浪中的一根救命绳索把我从溃败的边缘拉了回来。也许是尹教授的一丝善念,却挽救了一个青年的一生。如同姜老先生将我从本乡普通初中转入本县知名初中,杨洪波老师收留安置我到其办公室养伤学习,尹教授此举也是我人生的转折点之一。

那之后,我完成了大学学业,继续与尹教授共事。得益于他的青睐,当我提出进修和学习培训时,他总是热心帮助,耐心指导。我从科技英语逐渐转为软件开发工程师职业,兴趣使然,也有尹教授的助攻。及至多年后,我申请英国大学的计算机研究生课程时,咨询尹教授的意见,他欣然同意并愿意写教授推荐信于我。
再次退休后,尹教授热衷于编制音视频内容,我自然应然地担当其技术支持。这或许是有底气地说我们是亦师亦友的一对,如父如子的一双吧。
许是他初见我时的穷学生的模样,在此后的岁月中,虽然我的境况渐次好转,他仍不时地接济我。逢年过节我带孩子们去看望他,他总是以给孩子压岁钱的形式,塞好大的红包。

夏天他偶尔会说,这双凉鞋子我穿着不合适,不如送你吧;秋天他可能会提及,有一大块布料未裁动,不如你拿去做条裤子。
在异乡漂泊的岁月里,这点点滴滴无不都汇聚成涓涓细流,温暖着一个青年、一家人的心房。也许他当真将我视如己出,可能我还未准备好做侍奉。

近年尹教授年事日渐高升,及至前次通电话时,他已入住养老院,又由于疫情防控,探视多有不便,已恍然几年不见。电话里,尹教授知悉我已加入国民党,嘱咐我老房子里有黄埔同学会相关孙中山先生的纪念品。念及此,思忖中夹杂某种交托后事的悲凉,又及自己也年近知天命,止不住潸然泪下…

岁月如梭,时光荏苒,当我看到孩子们一天天长大,自己一天天变老的时候,姜德臣老先生、杨光老师、杨洪波老师和尹耀廷教授。我的这些恩师或已千古或已年事甚高,不理世事。他们的恩情,或欲报无门,惟谨遵教诲,每日三省吾身,于小家,于大国,殚精竭虑死而后已。

师恩如山高,高山仰止,仰之弥高;
师恩如水长,上善若水,下自成蹊。

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

护发素发膜正品修复干枯免洗家用护发补水顺滑女士发热焗油膏书皮纸自粘透明磨砂加厚包书皮小学生一二三四年级上册上学期书膜全套课本书本保护套16k封面外壳防水a4彩染发剂植物纯自己在家染头发膏女2021流行色显白天然冰糖雪梨膏儿童宝宝砀山慈梨膏

两个实例解释清楚Java Annotations注解

Java Annotations注解和Java Comments注释,英文里差别很大,在中文中一字之差让人颇为费解。Java Comments注释是随着Java语言的诞生就有的,意义明确,简单易懂,就是在源代码中的解释信息,通常用在帮助代码编写人员理解代码。Java Annotations出现的较晚,在Java 1.5(Java 5)中才引入,目前(2022年)Java部署的主流是Java 8(Java 1.8),最新发行版是Java 11(Java 1.11).

但Java Annotations注解的意义和作用就显得有些费解,比如官方文档中:

Annotations do not directly affect program semantics, but they do affect the way programs are treated by tools and libraries, which can in turn affect the semantics of the running program. Annotations can be read from source files, class files, or reflectively at run time.

Annotations注解不会直接影响程序的语义,但是他们确实影响工具和库处理程序的方式,进而影响运行中的程序的语义。Annotations注解可以从源文件 ,class文件,或者运行时的反射中读取。

随着“工具和库处理程序”的流行,比如在Java开发中逐渐流行的Spring全家桶等,处处可见的@RequestXXX 等表述,让后生Java Annotations逐渐走入开发者的视野。然则只言片语地要解释清楚Java Annotations注解是什么东西及怎么作用或者工作的,却非易事。

我们所主导的Java 开发框架GWA2 in Java(  https://ufqi.com/dev/gwa2/ )并没有过多地倚重Java Annotations注解,主要是在初期技术架构选型时,我们考察了使用Reflection等相关技术时,发现其性能会下降安全受影响。

Due to 1) issues of performance and security of java.lang.reflection, We do not use it as routing or dynamic module invoking at present.

鉴于Reflection相关技术存在性能和安全相关方面问题,GWA2 in Java 目前没有考虑将其作为路由和动态模块加载技术手段。

然而,Java开发业界似乎形成了一种站在“巨人肩膀”上搭积木式地的堆叠,第一个扣子歪了大家也就一顺溜地继续歪下去,所谓性能和安全问题都是可以克服的,不能解决的部分也是在可接受范围内,皆大欢喜。
近期我们接手了两个Java开发的二期项目,基于Java Spring全家桶,项目技术栈虽然是Java,但其所依赖的各种第三方组件达到令人眼花缭乱的地步(如下图)。

Java Spring 组件套系

既然Java Annotations如此重要,自然要弄清楚,然而当我们试图向一些工程师解释Java Annotations是什么、怎么样的时候,发现并不容易,一方面是Java语言本身的复杂性,另一方面是Annotations是上层应用,是可选项。经过一番搜索、思考和探究,我觉得如下两个实例可以清晰地解释Java Annotations注解的基本原理和应用实践,回答了Java Annotations注解是什么,为什么和怎么样的问题。

实例1. 用Java Annotations注解标记某个对象类、实例、方法和属性具有或不具有某个属性。

这个实例来自官网 ( https://docs.oracle.com/javase/1.5.0/docs/guide/language/annotations.html )

e.g.1.1. SampleTestTag.java: 自定义一个Java Annotation注解对象,其中的 @Retention 和 @Target 是注解的注解,称之为“元注解”, 注解类的什么是在名称前加 “@” at符号

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SampleTestTag { 

}

e.g.1.2. FooBar.java: 创建一个对象类 FooBar , 使用上面创建的Java注解 SampleTestTag

public class FooBar {
    @SampleTestTag public static void m1() { }
    public static void m2() { }
    @SampleTestTag public static void m3() {
        throw new RuntimeException("Boom");
    }
    public static void m4() { }
    @SampleTestTag public static void m5() { }
    public static void m6() { }
    @SampleTestTag public static void m7() {
        throw new RuntimeException("Crash");
    }
    public static void m8() { }
}

e.g.1.3. FooBarTest.java: 创建一个测试程序,调用对象类 FooBar, 测试 SampleTestTag 的区分作用

import java.lang.reflect.*;

public class FooBarTest {
   public static void main(String[] args) throws Exception {
      int passed = 0, failed = 0;
      for (Method m : Class.forName(args[0]).getMethods()) {
         if (m.isAnnotationPresent(SampleTestTag.class)) {
            try {
               m.invoke(null);
               passed++;
            } catch (Throwable ex) {
               System.out.printf("Test %s failed: %s %n", m, ex.getCause());
               failed++;
            }
         }
      }
      System.out.printf("Passed: %d, Failed %d%n", passed, failed);
   }
}

该测试程序预期运行的结果大致为:

$ java FooBarTest FooBar
Test public static void Foo.m3() failed: java.lang.RuntimeException: Boom 
Test public static void Foo.m7() failed: java.lang.RuntimeException: Crash 
Passed: 2, Failed 2

这个实例表示,通过自定义一个注解,可以将对象类的某些方法标记出来,核心方法是isAnnotationPresent。 这只是一个简单的实例,如果这个路子走得通,有这种简单的方法或范式,可以将对象类、实例、方法和属性进行分类,仿佛打开了潘多拉的盒子,赋予开发者无穷尽的分类能力。
当具备这种能力后,可以在运行时根据分类,让A类的运行,让B类的都熄火;在英国区运行A类,在北美运行B类;让VIP的运行A类,让非VIP的运行B类;让小孩看A类,让老人看B类,其他人看C类….

显然这种能力是强大的,但同时其复杂性也显现出来了,开发者看到的代码和最终运行时的代码可能高度的 不–一–致。 尽管代码都摆在哪里,但具体跑那些代码需要看运行时的状态。由此造成了可怕的所见非所得。

实例2. 用Java Annotations注解标记某个对象类、实例、方法和属性具有某个属性的某种赋值。

这是对实例1的进化和升级,如果实例1提供让某个对象具有或不具有,是与非的简单二元分类,则实例2将这种能力无限升级到让某个对象的拥有某个属性,而且这个属性的赋值可以千变万化。
大白话就是注解可以带参数了,这几乎要开一开脑洞才好理解,结合下面这个实例。( https://www.educba.com/java-annotations/ )

e.g.2.1. MagicianAnnotation.java: 自定义一个注解类,该注解带有两个参数,分别给了缺省默认值

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MagicianAnnotation {
    String Wizard() default "Reynolds";
    String House() default "Green";
}

e.g.2.2. MagicianObject.java: 创建一个对象类,使用MagicianAnnotation修饰,该对象类有一个方法 getString, getString也使用注解MagicianAnnotation进行修饰,且带有两个参数

@MagicianAnnotation
public class MagicianObject {
    @MagicianAnnotation(Wizard = "Harry Potter", House = "Red")
    public String getString()  {  return null; }
}

e.g.2.3. MagicianTest.java: 创建一个测试类,运行MagicianObject, 观测被MagicianAnnotation所修饰的情况

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;

public class MagicianObjectTest {
	
	public static void main(String[] args) throws NoSuchMethodException, SecurityException {
		new MagicianObject();
		Class<Magician> magic = MagicianObject.class;
		readAnnotationOn(magic);
		Method method = magic.getMethod("getString", new Class[]{});
		readAnnotationOn(method);
	}
	
	static void readAnnotationOn(AnnotatedElement element){
		try{
			System.out.println("\n Find annotations on " + element.getClass().getName());
			Annotation[] annotations = element.getAnnotations();
			for (Annotation annotation : annotations){
				if (annotation instanceof MagicianAnnotation){
					MagicianAnnotation mData = (MagicianAnnotation) annotation;
					System.out.println("Wizard Name :" + mData.Wizard() + " , House Color :" + mData.House());
				}
			}
		} 
		catch (Exception e){
			e.printStackTrace();
		}
	}
}

该测试程序预期运行的结果大致为:

$ java MagicianObjectTest 
Find annotations on java.lang.Class
Wizard Name :Reynolds , House Color :Green

Find annotations on java.lang.reflect.Method
Wizard Name :Harry Potter , House Color :Red

实例2表明,引入了自定义的注解之后,在原代码层面的注解及其属性、赋值等,最终会在运行时分别读取到,依据这些设置、配置的属性及赋值,同样的代码可能会产生千变万化的运行结果。
这种魔法虽然赋予了开发者丰富的技能,却也为程序的追踪设置了陷阱,正如我们在各种Java开发手册( https://ufqi.com/news/ulongpage.1510.html?tit=Java開發手冊-阿里巴巴-嵩山版-3:常量定义 )中,都敦敦教诲不要在程序源代码中留置“魔法”。

【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

所以,本意上理解,Java Annotation注解是对注释的丰富和扩展,它的边界不应该扩展到影响程序运行逻辑上去,注解的根本仍然是像内置的那几个作用那样(  @Override, @Deprecated, @SuppressWarnings等等 ),是帮助理解代码,而不是修改变更、路由导向程序业务逻辑本身。
从这个意义上来说,Java Spring全家桶等剑走偏锋似乎走得有些远了。

回到起初,希望这两个实例能够清楚的解释了Java Annotations注解的来龙去脉,如同菜刀可以切菜也可以杀人一样,注解可以帮助开发者理解代码,也可以通过Reflect反射技术对程序的运行逻辑进行修改变更、路由导向等等。理解了这些,再去看Java Spring框架中的 @RequestXXX 就会豁然开朗,不过尽管知道了基本原理,要弄清楚每一个自定义的注解的具体含义,还需要进一步地解读源代码或技术手册。

回到上面的技术栈分析图,一个相对简单的Java Web应用CRM系统,如果基于GWA2 Java 进行构建,直接就是Tomcat跑起来一个应用即可。而如果看上面的供应链,就显得复杂无比,各种封装和嵌套多达4-5层,而每一层嵌套又引入更多的第三方组件,由是一个简单的应用变得复杂无比。在其成本上升的同时,其开发门槛也显得高高在上了,几乎没有一个人能够全部掌握所涉及的全部组件。对每一个组件不说去拆解分析源代码,恐怕操作使用说明文档能看完整了也非易事。

供应链越长,质量越难控制。
在立即可用小步快跑快速迭代风行的时期,可能关乎质量、性能、安全等皆居于次要地位。


GWA2

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

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

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

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

书皮纸自粘透明磨砂加厚包书皮小学生一二三四年级上册上学期书膜全套课本书本保护套16k封面外壳防水a4彩染发剂植物纯自己在家染头发膏女2021流行色显白天然冰糖雪梨膏儿童宝宝砀山慈梨膏山羊绒围巾女冬英伦百搭围脖双面格子加厚保暖披肩

工程技术思维论

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

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

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

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

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

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

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

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

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

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

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

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

反例之一:粗暴对待用户

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

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

谷歌搜索不吃屎

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

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


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

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

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

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

医用外科口罩一次性医疗专用口罩防尘透气成人三层防护透气医生插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板床上电脑桌大学生宿舍上铺懒人可折叠小桌子家用寝室简约学习书桌电热蚊香液套装无味婴儿孕妇家用补充液插电式灭蚊液