2023年4月

可以后端开发的 javascript引擎有

  • Chrome V8 基于C++

  • java的Rhino引擎(JDK6被植入),Java8 被替换为Nashorn

Rhino和Nashorn都是用Java实现的JavaScript引擎。它们自身都是普通的Java程序,运行在JVM上

Rhino简介

Rhino [ˈraɪnəʊ]是一种使用 Java 语言编写的 JavaScript 的开源实现,原先由Mozilla开发。

Rhino 是一种动态类型的、基于对象的脚本语言,它可以简单地访问各种 Java 类库。

当时Netscape想用纯Java来实现新版浏览器,自然需要一个Java版的JavaScript引擎实现;另外也希望能在服务器端把JavaScript当作Java应用里的脚本语言使用。于是Rhino就诞生了。

官网自带
Rhino历史
,跟
Wikipedia上的Rhino词条
基本上一样,有兴趣的话可以去看看。

Parser
是从SpiderMonkey移植过来的。自然也是手写的纯递归下降式。
JavaScript对象的接口是org.mozilla.javascript.Scriptable。主要实现类是IdScriptableObject、ScriptableObject。用Object[]来存字段,挺高效的。

IdScriptableObject {
  Object[] valueArray;
  short[] attributeArray;
  // ...
}

Rhino可以通过参数从11个预设的优化基本中选择一个使用。只从JVM以上的层面看,Rhino既可以工作于纯解释模式(-1),也可以工作于纯编译模式(0-9)。
这11个级别分别是

Rhino 优化级别

当优化级别为-1时,
Rhino使用一个用Java写的字节码解释器来解释执行JavaScrip
t。

此时,Rhino的工作流程简单说是:( [ ... ]表示数据实体,( ... )表示Rhino处理数据的程序)

[ JavaScript源码 ] -> ( 语法分析器
Parser
) -> [ 抽象语法树(AST)
ast
] -> ( Rhino内部表现形式生成器
IRFactory
) -> [ Rhino内部表现形式
ScriptNode
] -> ( Rhino字节码生成器
CodeGenerator
) -> [ Rhino字节码
Icode
] -> ( Rhino解释器
Interpreter
) -> [ 运行结果 ]

这里说的Rhino字节码是Rhino内部用来表示JavaScript程序语义的一套字节码,跟JVM所支持的Java字节码没关系。
当优化级别为0~9时,Rhino使用一个用Java写的编译器将JavaScript编译为Java字节码;生成出来的Java字节码交由JVM直接执行
。至于底下的JVM是解释执行Java字节码,还是将Java字节码编译为机器码再执行,Rhino并不关心。
此时,Rhino的工作流程简单说是:

[ JavaScript源码 ] -> ( 语法分析器
Parser
) -> [ 抽象语法树(AST)
ast
] -> ( Rhino内部表现形式生成器
IRFactory
) -> [ Rhino内部表现形式
ScriptNode
] -> ( 可选优化
Optimizer
) -> ( Java字节码生成器
Codegen
) -> [ Java Class文件(包含Java字节码) ] -> JVM加载和执行生成的字节码 -> [ 运行结果 ]

只从JVM以上的层面看,Nashorn是一种单层的纯编译型JavaScript实现。所有JavaScript代码在首次实际执行前都会被编译为Java字节码交由JVM执行。

这种以编译的方式模式执行JavaScript,跟一个Java源码编译器(例如javac)把Java源码编译为Class文件然后交由JVM执行,过程是类似的。只不过Rhino做的优化不够多而且JavaScript的语义也远比Java动态,所以此时Rhino上运行JavaScript的性能仍然无法跟Java的性能比。

JDK6 JDK7  Rhino区别

顺带一提,Sun/Oracle JDK6 / OpenJDK6中自带的Rhino是经过裁剪的,去掉了Mozilla Rhino中的部分功能。其中一个被去掉的功能就是Rhino的编译模式。这意味着JDK6自带的Rhino只能用解释模式运行。

而Oracle JDK7 / OpenJDK7放宽了这一限制,当有SecurityManager时只能用解释模式,否则可以配置"rhino.opt.level"系统属性来设置Rhino的优化级别;默认仍然是用解释模式(优化级别默认为-1)。

Nashorn起初是Oracle内部一个实验项目,用于验证JSR 292功能的完整性、可用性、易用性。后来得到了内部的关注,决定将其产品化,作为默认的JavaScript实现替换掉从JDK6开始包含在JDK之中的Rhino。

Nashorn

Nashorn(读作Naz-horn[naːsˌɔn])是Oracle全新开发的JavaScript实现。高度兼容ECMAScript 5标准,并尽可能兼容Rhino。
它使用Java语言实现,运行在JVM上,借助JDK7开始包含的
JSR 292(invokedynamic)
新功能达到较高的性能
,同时保持代码的相对整洁

在2012年底Nashorn就已经达到可以完全通过
test262
测试套件的兼容性,就这点说它甚至比SpiderMonkey、V8更佳兼容于标准。

Nashorn是一个纯编译的JavaScript引擎
。它没有用Java实现的JavaScript解释器,而只有把JavaScript编译为Java字节码再交由JVM执行这一种流程,跟Rhino的编译流程类似

Nashorn还在快速开发中,日新月异,所以它的工作流程在不断变化。简单来说,Nashorn的编译入口可以从Context.compile()开始看:

[ JavaScript源码 ] -> ( 语法分析器 Parser ) -> [ 抽象语法树(AST) ir ] -> ( 编译优化 Compiler ) -> [ 优化后的AST + Java Class文件(包含Java字节码) ] -> JVM加载和执行生成的字节码 -> [ 运行结果 ]

只从JVM以上的层面看,Nashorn是一种单层的纯编译型JavaScript实现。所有JavaScript代码在首次实际执行前都会被编译为Java字节码交由JVM执行。

(当然JVM自身可能是混合执行模式的,例如HotSpot VM与J9 VM。所以Nashorn在实际运行中可能需要一定预热才会达到最高速度)

Nashorn不但可以执行JavaScript,还可以当作库为其它工具提供一些基础服务。例如说
它现在为NetBeans IDE中的JavaScript编辑器提供语法高亮支持和调试支持

从Oracle JDK 8 build 82开始,Nashorn已经作为JDK8的一部分包含在安装包中。安装后可以在JDK安装目录的jre/lib/ext/nashorn.jar找到Nashorn的实现。

直接使用Java类的实例来容纳JavaScript对象的字段,在对象内嵌入字段而不放在spill array里的好处是:

  1. 对象更加紧凑,数据离得更近,局部性更好

  2. 数组访问有边界检查,而对象字段访问则没有,后者效率更高

参考内容:

Rhino 和 Nashorn 到底怎么运行? - RednaxelaFX的回答 - 知乎 https://www.zhihu.com/question/27631001/answer/37407481

各JavaScript引擎的简介,及相关资料/博客收集帖 https://hllvm-group.iteye.com/group/topic/37596


转载
本站
文章《
JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述
》,
请注明出处:
https://www.zhoulujun.cn/html/webfront/browser/webkit/2020_0718_8520.html

前言

ChatGPT从出来的时候我就一直密切关注,为此还加了不少群,用了不少套壳的程序,公司还开了专门的培训会,技术团队还为此搭建了接入ChatGPT的服务,帮助全公司的产品、商务、测试、运维、研发一起对ChatGPT做直观了解以及认知。

时隔数月,我才又重新写一篇文章,借此表达对ChatGPT的看法,帮助大家减少一些浮躁的心情。

因为之前我有写过一篇关于副业防骗的文章:
https://www.cnblogs.com/fulongyuanjushi/p/16843513.html

为此我还受到不少攻击,如果是经常关注我的人应该知道,我不是经常发文的,这个通过我发文的时间就可以看出来,主要还是以技术为主,这次蹭热点发文,主要是发现加了我好友的不少同行因为ChatGPT影响了学习的态度,所以我专门从另一个角度来写关于ChatGPT文章,希望给大家一些我觉得正确的认识。


AI诈骗

为什么一上来就说这个呢,因为我明显发现骗子们开始按捺不住了,混在人群中放冷箭,但大家依然徜徉在ChatGPT的海洋中不可自拔,殊不知黑手已经在身边。

因为今年这个东西才真的火起来,所以骗子们一开始也没有研究出太多套路,我借用
河南省反诈骗中心
揭露的骗局和危害给大家一些清醒的认识。

1)、骗取使用费

国内涌现一批名字中包含"ChatGPT"的微信公众号、小程序产品,这些产品使用ChatGPT的官方图标当头像,通过免费试用吸引用户,一旦免费次数用尽就开始收取费用;

河南省反诈骗中心温馨提醒:ChatGPT目前还没有国内版本,那些所谓可以代问、代注册的软件或者小程序,顶着ChatGPT官方图标当头像,打着先免费试用的幌子,他们有的是收取高额费用给你牵线搭桥的违法中介;有的甚至是在你充值或者购买会员后就会突然跑路的骗子,只不过是蹭着ChatGPT的热点,在盯着你的钱袋子。

666666.jpg

2)、钓鱼邮件

不法分子在境外会使用ChatGPT生成针对特定人或者组织的“鱼叉式”网络钓鱼邮件,致使邮件接收方更容易上当受骗,接收者一旦点击该邮件,系统就会被恶意代码感染中毒。

不法分子锁定目标人群或者组织趁虚而入,生成鱼叉式网络钓鱼邮件,一旦点开这些邮件,系统就会被恶意代码感染中毒,甚至掉入电信网络诈骗的陷阱。

3)、泄露个人信息

不法分子利用用户注册使用仿冒的ChatGPT,从而获取用户姓名、电话、银行卡号、身份证号码等个人信息,为实施电信网络诈骗设好圈套。

目前,ChatGPT的开发者、人工智能研究机构OpenAl并没有在中国大陆提供有关ChatGPT的服务,也没有相应的公司运营。请务必提高警惕,分辨网上信息真伪,切勿轻易泄露个人信息。

这一点希望大家注意,这是一种电信+AI联合诈骗的手段,未来诈骗集团可能会强强联合,信息安全将成为一个沉重的话题。


警方提醒

同样的,还存在一些有组织的团伙进行诈骗,手法老套但却利用了从众的心理。这里借用
南宁市公安局福建园派出所社区民警周鼎晨
揭露的骗局给大家了解下:

1)、有一些山寨的小程序或者是APP,然后就是把这个头像换成是ChatGPT一样的,但是经过我们的认证,就是跟真正的这个ChatGPT, 回答的答案是完全不一样的,另一方面的话,它可能是首次使用免费,后面也会继续收取高额的费用。

2)、有不法分子他会利用这个ChatGPT来生成与提问者相关的一些链接,然后当你点进去的时候, 链接它就会进行一个比较特定的攻击,会恶意获取你电脑里面的内容。

3)、不法分子还可能会利用智能聊天软件拟人的聊天对话能力,冒充真实的人或者组织骗取他人信息等。

112.jpg

我认为第3点会是未来主要的诈骗手段,同时会衍生出各种花样和套路。

如果ChatGPT是李逵,那么国内有不少是李鬼,注意别被割了韭菜而不自知。

一些打着套壳程序的产品很可能是披着羊皮的狼,目前ChatGPT刚火起来,你们需要一定的时间来认知和吸收,对于骗子也是如此,他们目前也在研究骗法,如何发展出新时代的套路是他们当前研究的重要课题。

我大胆预测未来两年,会出现接近于ChatGPT的各种仿冒伪劣产品,内核其实是有组织、有资源、有规模的AFI,也就是人工诈骗智能,其中最突出的肯定是FraudGPT。


法律红线

接下来,我想对很多正在依靠ChatGPT谋利的同行们做一个提醒,那就是千万不要踩法律红线,否则得不偿失。

有别于一些诈骗团伙,一部分人其实还是借着真东西来谋利的,这部分人的做法我认为初衷是好的,就是简单的交易变现,但要特别注意遵守国内的法律,尤其是互联网安全相关的法律,如果违反的话其实判的还是挺重的,你们可以去了解下。

我这里主要提醒两点:

1)、商标这块,一定注意不要违反商标法,这块很多人是没当回事的,比如ChatGPT的商标,它即使没有注册本身也受法律保护,因为它已经驰名了,你们可以去查找商标法的资料;

2)、转接服务,这块就是当下最多人干的事情,转接国外的API接口从注册到落地阶段都有可能是违法的,最严重的就是很可能触及国内的网络安全和数据安全管理法,下面我摘录的一段法治网的文章中标注的内容:

转接服务者首先绕开了国家公用电信网提供的国际出入口信道,为用户提供接入ChatGPT的服务,提供能使他人访问国内IP不能访问的境外网站的“转接”服务,该行为不仅违反了电信条例、互联网信息服务管理办法,其行为极有可能触犯刑法第285条规定的提供侵入、非法控制计算机信息系统程序、工具罪,处最高七年有期徒刑并处罚金。

3)、代注册和卖账号,其实做这个买卖的人本身就知道是违法的,纯粹就是铤而走险。下面是我摘录的另一段法治网的文章中标注的内容:

中国大陆地区是没有办法注册chatgpt账号的,只能破碎虚空进行注册,这涉嫌违反了计算机信息网络国际联网管理暂行规定。因此,这类代注册行为涉嫌非法经营,情节严重的可能会构成犯罪。而且ChatGPT无法使用中国手机号注册,消费者不能用自己现有的手机号码,那么代注册行为可能涉及到一些能够批量制造、联网、验证手机号码的“技术手段”,涉嫌违反《中华人民共和国反电信网络诈骗法》。

所以,希望同行们引以为鉴,不要给自己的职业生涯留下隐患,你目前没有事,可能只是因为没有人举报你,一旦惹上麻烦就是一辈子的事。


我的观点

ChatGPT这么火,未来的路在哪里?我不是专家,只能站在一个工作多年但其实挺普通的软件工程师的角度来看待这个问题。

1)、加强对国内ChatGPT相关热点的关注

我这里稍微说下自己浅显的看法,目前ChatGPT很火,但国内和国外分别有不同的态势。

国外是爆炸式冲击,甚至给某些国家带来了一些恐慌,意大利封禁就是一个开端,究其原因还是为了本国利益着想,但可以侧面说明国外在自然语言处理方面的研究确实走在了前面,至少已经拿出了可以让普通人也感受到变革的产品,这给我们敲响了警钟。

而国内对于ChatGPT的态度显而易见,是肯定会扶持本地厂商的,如果明白了这一点,我建议大家要开始多关注百度、阿里、腾讯等等这些大厂在ChatGPT这方面的动态,早点参与内测及研究他们的产品。

这就类似于很多年前你用Google搜索,眨眼几年之后你就发现大部分人依赖百度了,然后就是微信、支付宝,以及之后的美团、饿了么、滴滴等等如雨后春笋一般出现,哪怕是比较近的抖音、小红书、视频号这些也是谁先下场谁先获利。

你现在早点开始接触国内厂商的AI产品,其实就好比早些年你提前比别人会使用微信支付宝一样的情境,走在前面你才能早点发现机会。

2)、短期内对编程领域的冲击不大

一个原因是上一点讲过的国情原因上了一把锁,第二个原因是国内厂商在这块的发展方向着重于非编程领域,主要还是提供知识库、强化内容检索、AI作画、文学创作、智能媒体助手等等。

这些方向广泛冲击的还是一些具备重复性工作的领域,另外我有使用过一下百度的AI产品,比如AI作画,其实没有想象中的厉害,至少我觉得远不如原创画师的作品,因为完全没有灵魂。

另外就是像法律、文学、医疗等行业,可能会带来变革,但现阶段程度较小,因为这些领域不仅仅是流程化,还存在变数,需要大量人工干预;

对于编程领域而言,我暂时没看到AI从项目产品设计到编码到生产落地的完整流程化的影子,只能作为知识库和检索工具辅助研发人员的工作,这本身反而是一件好事,如何利用它让自己变得更强大才是接下来你应该关心的课题。

3)、大部分人尚不关心

普通老百姓对于我们热烈讨论的这些事情的认知其实还是一片空白,说简单点就是大部分人其实是不知道的,只有特定的圈子比如互联网行业的人了解的更多一点,其次就是网络诈骗集团了。

当这些AI产品真正开始影响到方方面面生活的时候,我敢肯定会有不少人出来反对和提出异议的,但这不会阻碍发展,此乃大势所趋。

可是会给国内厂商带来思考,就是如何降低这些社会影响,比如百度现在就开始调整思路了,他所做的AI作画即使还没有达到预期水准就已经被艺术家们联合抵制上了热搜,这就是苗头,所以接下来他们的产品都尽量打上了为民服务的标签,以辅助和提高各行业效率为主,绝不越俎代庖。

这就是害怕未来真正智能化变革给他造成反噬,最终淹没在广大人民群众的海洋里,你人工智能发展再好没用啊,你害我没饭吃,我只能起来反抗啊(笑)。

所以说,我认为在国内,人工智能的发展一定是润物细无声的,这也是国情。

4)、真正的变革需要一个契机

我认为真正的变革还没开始,因为缺少一个契机,ChatGPT虽然大火,但存在一个问题,就是大家都觉得他会改变整个生态和世界,可是他怎么改变,通过什么手段改变,还没有一个具象化的显现。

我举个例子,很多人说ChatGPT可以取代程序员了,我觉得如果排除各种可能存在的干扰,这真的是一种可以预见的现实,不仅仅存在于理论,而是他确实可以取代程序员。

但问题就在这里,目前还没有一个可行性的方案来呈现ChatGPT帮助企业完整的将一个项目从产品设计、编码、测试、上线发布、最终落地,通通都实现,最终形成流水线,我通常认为这样才是真正取代了程序员,否则依然是懂行的程序员的辅助工具,我以为你很强,原来你只是我打败敌人的黄金圣衣。

那到底ChatGPT能不能做到呢?我认为未来一定是可以的,甚至我觉得现在可能已经可以了,只是还没有一个人真的成为ChatGPT工程师,让ChatGPT将这个完整流程具象化。

当真有这么一个人或某个产品问世的时候,我觉得这个契机就来了,变革也真正开始了。

说的更通俗一点,单纯就以ChatGPT而言,如果有
词圣
问世了,那么真正的变革就来了,所以我们要关注这个契机的出现。


总结

以上是我当下的考量,我们面临变革的时候不要恐慌,也别急着到处去迎合ChatGPT,到处去找账号,甚至到处去花钱,一旦用不了这东西我就感觉天要塌了之类的。

还是要静极思动,先冷静的了解他,尝试使用他,多看看关于他的新闻,关注国内相关的政策,这些才是最终影响你生活的,毕竟你不是老外,如果你确定自己不会移民的话,那你还是把关注点多放在国内的产品上吧。

ChatGPT未来在国内的发展形势我大体认为不会影响编程技术人员,除非你自己放弃接触和了解,我想这样的人几乎没有吧,因为卷。

希望我这篇从另一个角度帮你认知ChatGPT的文章可以带给你一些思考,让你沉心静气,重新有条不紊地开始自己的工作学习。


敲键盘不易,转载请注明来源及作者,谢谢。

\(\color{#FFFFFF}{那是什么样的旅途呢}\)

\(\color{#FFFFFF}{真的会害怕很多东西呢。想想害怕的其实不止这样一件事,便产生了“其实都一样没关系的,都应该踏过去的”这样的想法}\)

\(\color{#FFFFFF}{——3月29日}\)

:这个真的是 旅游 记。作个人纪念。
会配上一些图片
完整相册等有空更新。


前篇 —— 我的退役生活

如前篇【NOIP退役记】,我在去年的 NOIP2022 中成绩并不如意,作为一名水平一般的高二选手离开了 OI 。

也许有点可惜,没有拿到如意的奖项,还有很多很多的 OI 知识没有学过。也许是来不及,也许是学不会。

我回到了教室,回到了老师的课堂。

当然,由于停课落下了非常多的书,特别是高二上总在教各科最难的书,我只能先慢慢自己补上这些东西,找到一点文化课的感觉,之后才能跟上课堂。

有时会看见机房的高二同学在刷题。

总之,老师们白板笔落屏的咚咚声之间,我平静,开心,或者有时低落,这样平静平静地学习着。其实我的情绪是非常活跃的,也许只是相比于打OI时的我平静。

GDKOI的那一天下午,我从市图书馆走出来,登上回家的公交车,用手机看着xtx他们给我直播KOI滚榜
前放了一万遍的宣传片

至2023年的这个3月,阶段考来临的前一周,被询问了是否要参加GDOI。


Day -5

阶段考的成绩出了。

问题还是非常多

Day -4

有点后悔报GDOI了。(

请假回了家。稍微休息一下

image

zwy(我的斜后桌)给我的湿纸巾。走的时候我把它绑成了蝴蝶结

Day -2~-3

退役了五个月的我,还会些什么呢?

事实上我只复习了最最简单基础的最短路、线段树
、树剖
之类的东西。复习多了杂了其实对我没什么用,有着这样的认知。


Day -1

我启程了。

取票机,入站口
,在候车室打音游的xtx
,一切都很熟悉

车上看yxhao(教练)和xgf聊着我并没有怎么了解的OI相关的事情,我安心打烤(pjsk)。

image

很喜欢25时。

广州南站的站台也是熟悉的。

办完入住才出发去学校报到。公交在学校正门(1号门)下,我们一众人跑来跑去找了半天才找到3号门。*猫骂人*

陌生的别的学校的校服...好多哦

我很喜欢发的牌子的带子,不知道为什么,明明只是普通的蓝色带子上面印上白色的字。

去试机。我好像被分到了很多初中生的考场()。机子的键盘似乎跟我们学校的键盘差不多,我还挺喜欢这个手感的。键盘手感方面点名批评广附黄华路校区考场()

image

考场门口。

回到报到处,遇到了一个看起来很小(各种意义)的妹子。我们不小心对上了眼,然后打了招呼聊了起来()发现她是纪中初一的。她在我隔壁考场,人很厉害,很能聊6666666666666666666666661

image

和金中的各位合影。拍照的爷叫我们比个姿势,于是我自毙了。

回去已经六七点了,午饭都还没吃,很饿很饿很饿,遂点外卖。

晚上和 xgfxtx 他们一起 vp 了一场四题水场 abc。我码力很不行,最后一个写完。

image

乌乌。

他们为什么一边打泡泡堂一边怪叫啊。

被 xtx 推荐了一堆很抽象的 pjsk 谱。


晚上十二点,眠。


Day 1

早餐挺不错的。登上了七点去广附的第一趟车。

到的时候还很早,看了几眼有点陌生了的去年 NOIP 前写的考前 trick 概览。

解压密码是什么 upupup,意义不明,不记得了()对初二 CSP 的解压密码还印象深刻,提高和普及分别是他山之石 可以攻玉。高一的 NOIP 密码是钢铁之心(IronHeart)。

开题。

T1,题意感觉还算简单。开始脑抽了两分钟想答案连续,直接处理出两个方向的到达边界就行,但是一看样例输出并不连续,再看发现是到终点站下。
然后换了做法
\(\color{#FFFFFF}{,我也不知道不知道不知道我为什么要换做法}\)

给了一系列区间的话,想到对区间排序。处理出每个区间与其相交的区间中左端点最大的,然后从经过位置 x 的右端点最大的区间开始向左搜,得到到达左端点的答案。对我而言不大好写,写了蛮久的。
然后样例一二都过了,三却少 了 一 半 的 答 案
看了好一会,才注意到样例 3 的 x=1,并且只有一个区间左端点为1。研究了一下发现自己的做法并不能处理区间包含区间的情况,如果要改的话就得处理掉被完全包含的区间。
想了想也不是很好写,过去了差不多 2h 了,应该来不及了。
然后我换了个思路()
回归到了我看错题意时的做法。
也是把端点坐标拆掉然后排序,但是处理每个点是否能联通左右两个点。最后从点 x 出发处理两个方向的到达边界,遍历所有的区间,如果区间被包含并且左端点<x or 右端点>x,就可以取左端点 or 右端点 作为答案。
相当相当相当好写,用半小时写完了。
刚才的我是傻逼。

T2,开到这里的时候认为按照自己那个拉几码力 2h 分别写 t2t3 暴力就够了。不过还是稍微考虑了一下 k=0 或者 树 有没有什么性质。树的情况对我来说好像也不是很清晰,没想一会就决定写暴力了。
\((n+m)2^n\)
爆搜一下拿 20 直接跑路,但是因为数组类型的问题也调了一些时间。已经变成了写暴力都要调很久了的样子了...

T3,看了半天没看懂题意。读懂后时间也所剩无几,直接闭着眼开始写暴力,但样例没有过,没有调完,考试结束了。


去食堂。

我和xtx还有纪中妹妹一起吃饭。妹子说她 47 行写完了 T1。很厉害,666666

一起聊了很多关于我们学校的事情。
除了没有纪中卷之外
金中和纪中很多地方还挺像的。

xtx 说了他的 T1 做法,我发现其实就是我一开始写的那个假做法加上我想了而没有写的那个修改。并且他也和我一样一开始没有考虑包含的情况,样例没过后才进行了修改。

在回程的车上,坐在最后一排,遇到了一个初二的音

游人(我在打烤的时候被他发现了)。和大家聊得很开心。

今天非常困,回到酒店之后我就躺下了。还打了一小会烤。

image

这天是愚人节,烤有场景特殊剧情。很草。图为五个Luka x 升天nene机器人。还有神高

四壮士组团/emumfy同团之类各种各种离谱组合(x

躺到四点五十几,准备逃离。

毕竟退役的我是真的来旅游的()()()()()


我对这里很不熟悉,不知道去哪里好。

image

我们教练。如果老师你看到了拜托原谅原谅原谅原谅原谅一下我呜呜呜呜呜呜呜呜呜呜呜呜

总之先坐公交去地铁站。

虽然现在都不用买实体票了,但我还是去取票机买了一枚去客村站的圆圆的绿色地铁票:这是我第一次来广州参赛的时候所下的站点,当时在六中考。

image

喜欢。

我们所住的大学城真的有点偏远。从出门至到站花了我差不多一个小时。。。

这里在市中心,有热闹的街市和灯火华丽的综合体。由于天气阴湿,那边的广州塔在水雾中只露出一个灰色的影子。

image

初二时比赛(CSP2019)到酒店的必经之路。(客村)

在街巷里面漫游着,又回到了地铁站。遂坐去鹭江。

image

鹭江出站后旁边正好是六中校门。CSP2019(第一次去比赛)和GDKOI2023(没去)考场。

天色渐暗,便去了hy和ll推荐的广州热门意餐店。

非常好吃,感谢款待。()


回程,又是一小时的路程。

image

在大学城南站面到了 ll 老师,收获了 scut 妖妖梦礼物。+w+

image

SCUT uuz 吧唧 x 叶脉书签

整个人湿淋淋的。主要是汗湿,除此还有广州阴阴湿湿的天气。猫猫的雨丝几乎没有停过。

image

虽说是静静凉凉的大学城,但特别漂亮。


贴猫。

遂眠。


Day 2

早上在餐厅问阿姨说那个是不是粿条,她说是。其实是河粉,她说潮汕地区才叫粿条。在上面放了酸豇豆,很喜欢。

image

吃了一半的时候

依然坐了第一趟车。

今天没什么可看了。计划是三道暴力。

解压密码是什么 downdowndown,忘了。呼应昨天的。↑↑↑

开题。

T1,数据范围是 10。一开始想了想状压黑棋相邻行,正好
\(2^{10}\)
而且行变化单调,红棋处理到各点的步数这样。想了一下应该不可做。
要处理出步数非常麻烦。如果不用 DP 一类的方法,不仅博弈胜负部分难讨论,这个步数不管是什么情况都很难算。
只有第一档(1~4)非常好做。遂写20。
其他档的部分分想了很久,中间还时不时忽略了黑棋的行动限制。想到了奇偶性的这一点。仅仅是 m=1 都讨论出了至少三种情况,胜负判断还好,但是步数分别讨论来算实在是太麻烦了。
如果多测还分讨,其实我应该拿不到什么分了。时间也过去了很久。
遂20跑路。

T2。我考场读错了题意,非常严重。
读成了 Alice 先手 与 Bob 轮流写。,,,,,,,,,,,,,,,
如果读成这样的题意又非常不好手拟。在过了样例 2 中 20 组数据的多达 16、17 组的情况下,我没有过多怀疑题意读错,也找不到调试的有效方法。但我还是去反复读了几遍题意,然而估计是先入为主的原因,我依然没有怀疑原来的想法。
中途我看了一眼 T3。感觉是剩下的时间都不够写暴力的麻烦题,遂继续调 T2。
显然读错题意的情况下是调不出来什么的。
遂考试结束。


出考场发现旁边的人都很怨气。()大概是真的非常难。我一直对题目的难度认知没什么把握。

总之,两天 100+25+0+20+0+0 。

不过考了多少其实无所谓。我的旅途要结束了。


面到了 杰阿克 qfr 姐姐!非常可爱。

去广州东站的路上,和高一的三位坐了同一辆车。一路非常安静()我坐在副驾。司机是个年轻人,开车 很 放 飞,过隧道的时候没什么车然后一脚油门,我瞟了一眼表盘上已经一百二十几km/h了。。。。真的恐怖

不得不说,我(们)这三天每天都能走错很多路。第一天出地铁站就走反,去考场报到在12门左右横跳才走到543号门(目的是3号门),第二天我除了客村之外的每个站都走错一次出口,第三天去广州东站结果跑到了汽车站,转向后走过头又转回来。。。

熟悉的二号候车室。特别特别熟悉。来过好多次。

image

这个候车室的车的目的地应该都是到潮汕地区的

在这里遇到了金中海湾的老师。

这次的站台给人老旧的感觉()


返程了。

位置和豪哥坐一起。豪哥听说我带了文化课资料说要监督我写作业。666666666666666666666666

于是 “xtx,可不可以帮我打一下烤的活动()()” (他真帮我打完了)

中途看了一眼坐在后面一排的 xtx 在干什么,结果他在教从不打音游的 xgf 打烤。草,

写着化学平衡的题目。拿着 myx 家长贡献的橙子一个,非常喜欢这个味道。结果不小心把橙子掰开了()()()

橙子的皮不会很厚。索性全部掰开了,分给众人吃。我之前也喜欢把橙子掰成一片一片来吃,但更常见的应该还是横切着吃()

“不愧是擅长树剖的,擅长竖着剖橙子”

“?”


豪哥在看 OI wiki,我在写化学作业,xtx 在打啤酒烧烤
,我们都有光
,一切都很和谐。

image

我发现对着车窗也可以拍到后排

我的OI旅途在回响中结束了。






次日早上,我回到了校园。

早上正好有信息技术课,我逃来了机房,用 yl 手机查了查 xtl 估分。

我与预估一致,是 145。高二非常寄,高一的 xgf 感觉还不错,但没有省队的高度,祝愿他剩下一年能够进步,明年能够成功。

看了一下 xgf 的得分,大概是d1t1过,其余每一道题都有部分分的程度。感受到了写暴力也需要水平。

接下来要加油文化课呢。

我的数学老师钟湖准备开公开课,课程是排列组合复习课。
我感觉我应该可以高中排列组合免修
,但是在办公室跟他讨论课的时候他突然拿了一道组合题来考我

我:应该可以容斥爆草一下吧

被吐槽了杀鸡不要用牛刀。
感觉 OI 里的解法都会首先避免分讨,容斥蛮常见的。我的大脑好像在拒绝分类讨论做组合数学()()

结果变成了我组合数学能力的bug了。在面对老师的紧张压迫和大脑疯狂导向容斥法的情况下,我居然没有写出来

猫:你就用容斥写啊

这周还是疫情结束后的首次金山中学校庆(146周年)和创造节(第28届)。看了一下表格有惊人的六七十项活动,似乎校外人员也可以来参加,今年一定会非常非常热闹吧。

创造节前夕的周三经历了金山中学白蚁节。被数量如此庞大的巨大黑色白蚁席卷校园,这种节日放在全国高校都是非常炸裂的(((((((((x)地上到处都是白蚁的尸体。


接下来

希望可以开心,可以学很多东西,文化课的知识,或者高考后可以继续学算法竞赛,或者画很棒的画,重新弹钢琴,或者是玩很有意思的游戏,还有可以和猫在一起。

有缘再见!

Final ECHO.

前言

上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(Repository )带来的好处是一套代码可以适用于多个类,把常用的CRUD通用方法抽象出来通过接口形式集中管理,从而解除业务逻辑层与数据访问层之间的耦合,使业务逻辑层在存储、访问数据库时无须关心数据的来源及存储方式。工作单元模式(UnitOfWork)它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表,跨多个请求的业务,统一管理事务,统一提交从而保障事物一致性的作用。

MongoDB从入门到实战的相关教程



MongoDB从入门到实战之MongoDB简介

第一步,添加Nuget包引用

需要添加两个Nuget包分别是:
Microsoft.AspNetCore.MiddlewareAnalysis

Microsoft.Extensions.DiagnosticAdapter
,前者是分析记录中间件核心代码实现后者是用来接收日志输出的,由于是用的DiagnosticSource方式记录日志,所以需要使用DiagnosticListener对象的SubscribeWithAdapter方法来订阅。

第二步,实现一个分析诊断适配器

这个适配器是为了方便我们把从DiagnosticSource接收到的日志对象输出到控制台,具体代码实现如下

    public class AnalysisDiagnosticAdapter
    {
        private readonly ILogger<AnalysisDiagnosticAdapter> _logger;
        public AnalysisDiagnosticAdapter(ILogger<AnalysisDiagnosticAdapter> logger)
        {
            _logger = logger;
        }

        [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareStarting")]
        public void OnMiddlewareStarting(HttpContext httpContext, string name, Guid instance, long timestamp)
        {
            _logger.LogInformation($"中间件-启动: '{name}'; Request Path: '{httpContext.Request.Path}'");
        }

        [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareException")]
        public void OnMiddlewareException(Exception exception, HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
        {
            _logger.LogInformation($"中间件-异常: '{name}'; '{exception.Message}'");
        }

        [DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareFinished")]
        public void OnMiddlewareFinished(HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
        {
            _logger.LogInformation($"中间件-结束: 耗时[{duration/10000}] '{name}'; Status: '{httpContext.Response.StatusCode}'");
        }
    }

第三步,注册相关服务来启用分析中间件的功能

  1. 注册中间件分析服务
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMiddlewareAnalysis();
  1. 订阅我们的分析诊断适配器
var listener = app.Services.GetRequiredService<DiagnosticListener>();
var observer = ActivatorUtilities.CreateInstance<AnalysisDiagnosticAdapter>(app.Services);
using var disposable = listener.SubscribeWithAdapter(observer);

这样基本就完成了分析记录中间件的功能,启动程序看看效果

日志已经成功的输出到我们的控制台了,不过才四个中间件,应该不止这么少的,再在注册中间件分析服务哪里添加一句代码

var builder = WebApplication.CreateBuilder(args);
// 新增的下面这句代码
builder.Services.Insert(0, ServiceDescriptor.Transient<IStartupFilter, AnalysisStartupFilter>());
builder.Services.AddMiddlewareAnalysis();

现在再来看看效果,发现变成8个中间件了多了四个

在Release模式编译后,运行发现中间件的执行效率非常高,几乎不占用时间

异常记录这里就不放图了,有兴趣的朋友自己去试试。
简单三步就可以知道一个请求到底执行了哪些中间件还是挺方便的。想知道实现原理可以去看看Microsoft.AspNetCore.MiddlewareAnalysis这个库,一共才四个文件看起来不费事。