.NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试

news2024/11/30 8:39:29

2023年11月15日,对.net的开发圈是一个重大的日子,.net 8.0正式版发布。

圈内已经预热了有半个月有余,性能不断超越,开发体验越来越完美,早在.net 5.0的时候就各种吹风Aot编译,直到6.0 7.0使用仍然比较麻烦,我个人比较期待本次更新的aot体验。

有的群友几个小时都等不了啦,半夜就开始更新预览版,我是等到第二天早上正式布发布才开始的,开机第一件事情下载.net8.0 SDK,随后更新vs2022企业版。


支持开源

我是开源人:https://github.com/2881099

本文通过我们的开源项目升级,以及AOT试验,记录了整个经验过程。

使用我们开源项目的朋友一般都知道,特点依赖较少(甚至零依赖),每次 .net 新版本发布很轻松就支持了,并且为 AOT 埋下了种子。

第一个要更新的开源项目是FreeRedis,这个项目没有任何外部依赖,本身是支持.net 8.0的,本次维护主要把和测试有关项目类型修改成.net8.0,前后只花了大概十分钟,跑完测试后发布了 FreeRedis 1.2.5

FreeRedis 是 .NETFramework 4.0 及以上 访问 redis-server 的客户端组件

第二个要更新的开源项目是CSRedisCore,大致步骤同上,目前这个项目处于稳定维护阶段,不再增加新功能。

CSRedisCore 是 .NETFramework 4.0 及以上 访问 redis-server 的客户端组件,也是 FreeSql 作者早年发布的 nuget 版本

第三个要更新的开源项目是FreeSql,这个项目比较庞大,解决方案内有50个子项目,由于主项目也是零依赖,所以基本不需要修改就支持.net8.0。最新编译器提示.netcoreapp2.1高风险漏洞的警告,不得已移除了.netcoreapp2.1有关的依赖注入支持,前后大约花了半个小时,测试后发布了 FreeSql 3.2.805

FreeSql 是一款功能强大的对象关系映射(O/RM)组件,支持 .NET Core 2.1+、.NET Framework 4.0+ 以及 Xamarin✨

第四个要更新的项目是FreeScheduler,这是一个纯净版的定时任务框架,依赖较少只花了5分钟测试发布。

FreeScheduler 实现轻量化定时任务调度,支持集群、临时的延时任务和重复循环任务(可持久化),可按秒,每天/每周/每月固定时间,自定义间隔执行,支持 .NET Core 2.1+、.NET Framework 4.0+ 运行环境。

其他几个开源项目稳定且不依赖 .net 版本,所以本次无需维护更新。


测试与支持 FreeRedis aot

下午没事去买了一杯咖啡,到12点钟还睡不着,刷视频刷到一点半还是睡不着,于是想折腾点什么东西,正好.net 8.0 aot特性,测试一下FreeRedis,看看是否支持。

我是直接创建控制台程序测试的,设置成aot发布之后,.csproj 内容如下:

<Project Sdk="Microsoft.NET.Sdk">
	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net8.0</TargetFramework>
		<PublishAot>True</PublishAot>
	</PropertyGroup>
	
	<ItemGroup>
		<PackageReference Include="FreeRedis" Version="1.2.5" />
	</ItemGroup>
</Project>

发布 aot 需要使用控制台命令:

dotnet publish -r win-x64 -c release

第一次发布失败,提示要安装桌面版C++,于是我重新去官网下载vS2022企业版安装器,运行它点击修改安装,选中桌面版C++进行安装,大概过了15分钟,安装完毕。

如果已经安装过vs2022,在此点击修改

我可怜的C盘,要占4G多

E:\github\FreeRedis\examples\console_net8>dotnet publish -r win-x64 -c release
适用于 .NET MSBuild 版本 17.8.3+195e7f5a3
  正在确定要还原的项目…
  所有项目均是最新的,无法还原。
  console_net8 -> E:\github\FreeRedis\examples\console_net8\bin\release\net8.0\win-x64\console_net8.dll
  Generating native code
C:\Users\28810\.nuget\packages\freeredis\1.2.5\lib\netstandard2.0\FreeRedis.dll : warning IL3053: Assembly 'FreeRedis'
produced AOT analysis warnings. [E:\github\FreeRedis\examples\console_net8\console_net8.csproj]
C:\Users\28810\.nuget\packages\freeredis\1.2.5\lib\netstandard2.0\FreeRedis.dll : warning IL2104: Assembly 'FreeRedis'
produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries [E:\github\FreeRedis\examples\c
onsole_net8\console_net8.csproj]
  console_net8 -> E:\github\FreeRedis\examples\console_net8\bin\release\net8.0\win-x64\publish\

只要编译成功,发布aot必然会成功,只是会有一些警告。

2023/11/16  13:06         5,637,120 console_net8.exe
2023/11/16  13:06       137,695,232 console_net8.pdb
2023/11/16  04:13           127,268 FreeRedis.pdb

请无视 .pdb 文件,它是调试用途的可以删除,console_net8.exe 只有 5兆大小。

第二次发布后,运行成功了,纯字符串数值之内的操作全部成功。

正当得意之时,redis.AclGetUser 方法抛出了一个新的错误,该方法返回的是一个实体类型 AclGetUserResult,有使用 Activetor.CreateInstance(typeof(AclGetUserResult)),Aot本身是支持这个方法的,错误提示是不支持该方法的对象类型 AclUserResult。

Unhandled Exception: System.MissingMethodException: No parameterless constructor defined for type 'FreeRedis.AclGetUserResult'.
   at System.ActivatorImplementation.CreateInstance(Type, Boolean) + 0x119
   at FreeRedis.RespHelper.CreateInstanceGetDefaultValue(Type) + 0x120
   at FreeRedis.RespHelper.MapToClass[T](Object[], Encoding) + 0x4a
   at FreeRedis.RedisClient.<>c__DisplayClass457_0.<AclGetUser>b__1(Object[] a, Boolean _) + 0x220
   at FreeRedis.RedisResult.ThrowOrValue[TValue](Func`3) + 0x58
   at FreeRedis.RedisClient.PoolingAdapter.<>c__DisplayClass9_0`1.<AdapterCall>b__0() + 0x141
   at FreeRedis.RedisClient.LogCallCtrl[T](CommandPacket cmd, Func`1 func, Boolean aopBefore, Boolean aopAfter) + 0x3bb
   at FreeRedis.RedisClient.LogCall[T](CommandPacket cmd, Func`1 func) + 0x63
   at FreeRedis.RedisClient.PoolingAdapter.AdapterCall[TValue](CommandPacket, Func`2) + 0x9a
   at console_net8.Program.Main(String[] args) + 0xa4
   at console_net8!<BaseAddress>+0x2c67f0

于是我系统的去看了官方aot文档,发现文档太过于简陋,反复看了七八遍也没有找到相关的解决内容。不得已扩大了搜索范围,在谷歌搜索关键字 .net aot 花了近一个小时,最终定位的关键字是 rd.xml,配置相当简单,只需要把FreeRedis的类型全部配置即可。

对应的 .csproj 内容如下:

<Project Sdk="Microsoft.NET.Sdk">
	<PropertyGroup>
		<OutputType>Exe</OutputType>
		<TargetFramework>net8.0</TargetFramework>
		<PublishAot>True</PublishAot>
	</PropertyGroup>

	<ItemGroup>
		<RdXmlFile Include="rd.xml" />
	</ItemGroup>

	<ItemGroup>
		<PackageReference Include="FreeRedis" Version="1.2.5" />
	</ItemGroup>
</Project>

对应的 rd.xml 内容如下:

<Directives>
	<Application>
		<Assembly Name="FreeRedis"  Dynamic="Required All">
		</Assembly>
	</Application>
</Directives>

重新发布后,完美的解决所有问题,.exe 文件体积增涨到 7兆。

这多亏当初设计FreeRedis的时候把依赖简单最低,才这么容易支持更多的运行平台。


第二轮aot试验 FreeScheduler

FreeRedis对.net 8.0以及aot的支持完美收官,这个时候已经凌晨三点,咖啡的劲还很足。

我本身对FreeSql Aot是不抱希望的,所以,就去测试FreeScheduler了。

FreeScheduler支持三种存储方式,内存/数据库/redis

基于内存,毫无压力,直接通过测试。(得益于依赖较少)

基于redis,由于FreeRdis通过了aot测试,基本不会有太大的问题,记得设置好rd.xml,顺利通过。

对应的 .csproj 如下:

<Project Sdk="Microsoft.NET.Sdk.Web">
	<PropertyGroup>
		<TargetFramework>net8.0</TargetFramework>
		<Nullable>enable</Nullable>
		<ImplicitUsings>enable</ImplicitUsings>
		<InvariantGlobalization>true</InvariantGlobalization>
		<PublishAot>true</PublishAot>
	</PropertyGroup>

	<ItemGroup>
		<RdXmlFile Include="rd.xml" />
	</ItemGroup>

	<ItemGroup>
		<ProjectReference Include="..\..\FreeScheduler\FreeScheduler.csproj" />
	</ItemGroup>
</Project>

对应的 rd.xml 内容如下:

<Directives>
	<Application>
		<Assembly Name="FreeScheduler"  Dynamic="Required All">
		</Assembly>
		<Assembly Name="FreeRedis"  Dynamic="Required All">
		</Assembly>
	</Application>
</Directives>

FreeScheduler还有一个web管理面板功能,抱着尝试的态度试一试,创建.net8.0自带的web API aot项目,把有关代码加到项目的运行,居然能直接通过,太牛逼了,这是我没有想到的。

对应 Program.cs

using FreeRedis;
using FreeScheduler;
using Newtonsoft.Json;

var redis = new RedisClient("127.0.0.1,poolsize=10,exitAutoDisposePool=false");
redis.Serialize = obj => JsonConvert.SerializeObject(obj);
redis.Deserialize = (json, type) => JsonConvert.DeserializeObject(json, type);
redis.Notice += (s, e) =>
{
    if (e.Exception != null)
        Console.WriteLine(e.Log);
};
Scheduler scheduler = new FreeSchedulerBuilder()
    .OnExecuting(task =>
    {
        Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] {task.Topic} 被执行");
        task.Remark("log..");
    })
    .UseStorage(redis)
    .Build();
if (Datafeed.GetPage(scheduler, null, null, null, null).Total == 0)
{
    scheduler.AddTask("[系统预留]清理任务数据", "86400", -1, 3600);
    scheduler.AddTaskRunOnWeek("(周一)武林大会", "json", -1, "1:12:00:00");
    scheduler.AddTaskRunOnWeek("(周日)亲子活动", "json", -1, "0:00:00:00");
    scheduler.AddTaskRunOnWeek("(周六)社交活动", "json", -1, "6:00:00:00");
    scheduler.AddTaskRunOnMonth("月尾最后一天", "json", -1, "-1:16:00:00");
    scheduler.AddTaskRunOnMonth("月初第一天", "json", -1, "1:00:00:00");
    scheduler.AddTask("定时20秒", "json", 10, 20);
    scheduler.AddTask("测试任务1", "json", new[] { 10, 30, 60, 100, 150, 200 });
}

var builder = WebApplication.CreateSlimBuilder(args);

builder.Services.AddSingleton(scheduler);

var app = builder.Build();
var applicationLifeTime = app.Services.GetService<IHostApplicationLifetime>();
applicationLifeTime.ApplicationStopping.Register(() =>
{
    scheduler.Dispose();
    redis.Dispose();
});
app.UseFreeSchedulerUI("/freescheduler/");

app.Run();

2023/11/16  04:23               127 appsettings.Development.json
2023/11/16  04:23               151 appsettings.json
2023/11/16  13:34        25,104,384 Examples_FreeScheduler_Net80_aot.exe
2023/11/16  13:34       238,948,352 Examples_FreeScheduler_Net80_aot.pdb
2023/11/16  13:31            31,208 FreeScheduler.pdb

Examples_FreeScheduler_Net80_aot.exe 25兆,流弊了,双击运行它吧~~~~

打开浏览器访问:http://localhost:5000/freescheduler/

FreeScheduler 管理面板

意想不到,连管理面板都支持 AOT,这让我有了继续试验的动力~~~


aot试验意外收获 FreeSql

四点了,还没犯困!

最后抱着必凉的心态尝试终极试验,FreeScheduler使用数据库持久化。

第一次失败,报错在FreeSql内部,这是是有TaskInterval类型不存在,它其实是FreeScheduler程序集的,并且rd.xml已经配置好了,反复折腾仍然报错。

Unhandled Exception: System.NotSupportedException: 'FreeScheduler.TaskInterval[]' is missing native code or metadata. This can happen for code that is not compatible with trimming or AOT. Inspect and fix trimming and AOT related warnings that were generated when the app was published. For more information see https://aka.ms/nativeaot-compatibility
   at System.Reflection.Runtime.General.TypeUnifier.WithVerifiedTypeHandle(RuntimeArrayTypeInfo, RuntimeTypeInfo) + 0x54
   at System.Array.InternalCreate(RuntimeType elementType, Int32 rank, Int32* pLengths, Int32* pLowerBounds) + 0x64
   at System.Array.CreateInstance(Type elementType, Int32 length) + 0x46
   at System.RuntimeType.GetEnumValues() + 0x53
   at FreeSql.Internal.Utils.GetTableByEntity(Type entity, CommonUtils common) + 0x138a
   at FreeSql.Internal.CommonProvider.CodeFirstProvider.<SyncStructure>b__51_0(CodeFirstProvider.TypeAndName a) + 0x6e
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() + 0x3f
   at System.Linq.Enumerable.WhereEnumerableIterator`1.ToArray() + 0x5c
   at FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure(CodeFirstProvider.TypeAndName[] objects) + 0xd6
   at FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure[TEntity]() + 0x6c
   at FreeScheduler.TaskHandlers.FreeSqlHandler..ctor(IFreeSql fsql) + 0xf0
   at FreeSchedulerBuilder.Build() + 0x2f
   at Program.<Main>$(String[] args) + 0x180
   at Examples_FreeScheduler_Net80_aot!<BaseAddress>+0xca7fc3

从堆栈 GetEnumValues 可以看出是执行 Enum.GetValues 报错,通过不断尝试中的其中一次,在程序开始写了一行:

Console.WriteLine(Enum.GetValues(typeof(TaskInterval)));

重新发布后,又出现另一个错误,大致与上面的相同,只是类型变成了 TaskStatus,同样加上一行代码:

Console.WriteLine(Enum.GetValues(typeof(TaskStatus)));

又出现了另一个错误:

Unhandled Exception: System.InvalidOperationException: The binary operator Equal is not defined for the types 'System.Reflection.Runtime.TypeInfos.NativeFormat.NativeFormatRuntimeNamedTypeInfo' and 'System.Reflection.Runtime.TypeInfos.RuntimeConstructedGenericTypeInfo'.
   at System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType, String, Expression, Expression, Boolean) + 0x26b
   at System.Linq.Expressions.Expression.Equal(Expression, Expression, Boolean, MethodInfo) + 0x63
   at FreeSql.Internal.Utils.<GetDataReaderValueBlockExpression>g__LocalFuncGetExpression|65_0(Boolean ignoreArray, Utils.<>c__DisplayClass65_0&) + 0x3916
   at FreeSql.Internal.Utils.GetDataReaderValueBlockExpression(Type type, Expression value) + 0x18d
   at FreeSql.Internal.Utils.<>c__DisplayClass66_0.<GetDataReaderValue>b__1(Type valueType2) + 0x68
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey, Func`2) + 0xa4
   at FreeSql.Internal.Utils.GetDataReaderValue(Type type, Object value) + 0x147
   at FreeSql.Internal.Utils.GetTableByEntity(Type entity, CommonUtils common) + 0x145c
   at FreeSql.Internal.CommonProvider.CodeFirstProvider.<SyncStructure>b__51_0(CodeFirstProvider.TypeAndName a) + 0x6e
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() + 0x3f
   at System.Linq.Enumerable.WhereEnumerableIterator`1.ToArray() + 0x5c
   at FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure(CodeFirstProvider.TypeAndName[] objects) + 0xd6
   at FreeSql.Internal.CommonProvider.CodeFirstProvider.SyncStructure[TEntity]() + 0x6c
   at FreeScheduler.TaskHandlers.FreeSqlHandler..ctor(IFreeSql fsql) + 0xf0
   at FreeSchedulerBuilder.Build() + 0x2f
   at Program.<Main>$(String[] args) + 0x1a8
   at Examples_FreeScheduler_Net80_aot!<BaseAddress>+0xca8423

这次使用 vs2022 附加进程的方式进行了调试,深入 FreeSql 内部源码(表达式树)环境,定位到了一行代码:

Expression.Equal(type, Expression.Contrast(Guid?))

把 Guid? 后面的问题去掉后,再次发布。(由于每次发布时间要20-30秒,重试时间成本太高,卡在这个问题已经有半个小时)

2023/11/16  04:23               127 appsettings.Development.json
2023/11/16  04:23               151 appsettings.json
2023/11/16  13:52        29,018,112 Examples_FreeScheduler_Net80_aot.exe
2023/11/16  13:52       238,948,352 Examples_FreeScheduler_Net80_aot.pdb
2023/11/16  13:31            31,208 FreeScheduler.pdb
2021/11/03  01:47         1,763,632 SQLite.Interop.dll

对于一个 web 项目并且包含 bootstrap 有关静态资源文件,.exe 文件只有 29兆太满意了

看到控制台上的 SQL,太惊喜了,成功啦~~~~


最后建议

从 .net6.0 到 .net8.0,我们肉眼看不到变化,实际微软做了很多内部工作,在 aot 使用体验上明显能感知。

有人说信创国产运行,那现在 aot 算什么?

.net8.0 AOT 已经到了可用的阶段,期待未来版本能改进以下问题:

  • 发布速度变快,目前20-30秒一次实在太慢
  • 编译前检查错误,而不是等发布后再报运行时错误
  • 加强调试,.pdb 100兆++ 为何调试还都是 c++ 有关内容,不能白瞎了这么大的调试文件啊
  • 尽快修复 Console.WriteLine(Enum.GetValues(typeof(TaskInterval))) 这个问题

我是开源人:https://github.com/2881099

Native AOT apps have the following limitations:

  • No dynamic loading, for example, Assembly.LoadFile.
  • No run-time code generation, for example, System.Reflection.Emit.
  • No C++/CLI.
  • Windows: No built-in COM.
  • Requires trimming, which has limitations.
  • Implies compilation into a single file, which has known incompatibilities.
  • Apps include required runtime libraries (just like self-contained apps, increasing their size as compared to framework-dependent apps).
  • System.Linq.Expressions always use their interpreted form, which is slower than run-time generated compiled code.
  • Not all the runtime libraries are fully annotated to be Native AOT compatible. That is, some warnings in the runtime libraries aren’t actionable by end developers.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1215576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos虚拟机使用docker下载镜像太慢的解决办法

虚拟环境&#xff1a; 1、VMware Workstation 16 Pro 2、CentOS 7&#xff08;CentOS Linux release 7.9.2009 (Core)&#xff0c;内核版本3.10.0-1160.el7.x86_64&#xff09; 问题描述&#xff1a; 虚拟机可以与物理主机互相Ping通&#xff0c;也可以Ping通百度&#xff0…

Python自动化测试之request库(四)

前段时间写过一个通过cookies完成登录&#xff0c;今天我们写一篇通过post发送请求完成登录豆瓣网 模拟登录 1、首先找到豆瓣网的登录接口 打开豆瓣网站的登录接口&#xff0c;请求错误的账号密码&#xff0c;通过F12或者抓包工具找到登录接口 通过F12抓包获取到请求登录接口…

【每日一题】最长奇偶子数组

文章目录 Tag题目来源解题思路方法一&#xff1a;枚举方法二&#xff1a;一次遍历 其他语言python3 写在最后 Tag 【一次遍历】【枚举】【数组】【2023-11-16】 题目来源 2760. 最长奇偶子数组 解题思路 方法一&#xff1a;枚举 本题有多种方法可以解决&#xff0c;最朴素的…

Java面向对象(高级)-- static关键字的使用

文章目录 一、static关键字&#xff08;1&#xff09;类属性、类方法的设计思想&#xff08;2&#xff09; static关键字的说明&#xff08;3&#xff09;static修饰属性1. 复习变量的分类2. 静态变量2.1 语法格式2.2 静态变量的特点2.3 举例2.3.1 举例12.3.2 举例22.3.3 举例3…

力扣每日一题-最长奇偶子数组-2023.11.16

力扣每日一题&#xff1a;最长奇偶子数组 题目链接:2760.最长奇偶子数组 题目描述 代码思路 利用单指针进行扫描&#xff0c;符合子数组起点要求时&#xff0c;开始记录子数组长度。题目本身不难理解&#xff0c;就是判断的条件比较多&#xff0c;需要耐心和细心。 代码纯享…

一文搞懂GPU的概念、工作原理,以及与CPU的区别

中午好&#xff0c;我的网工朋友。 最近GPTs热度很高啊&#xff0c;你们都用上了吗&#xff1f; ChatGPT到现在热度仍不减&#xff0c;人工智能还在快速发展&#xff0c;这都离不开高性能、高算力的硬件支持。 如果以英伟达A100GPU的处理能力计算&#xff0c;运行ChatGPT将需…

时间序列数据集——可用于预测和分类

文章目录 一.UCI数据集 一.UCI数据集 UCI官方网站 UCI数据集是由加州大学欧文分校维护的用于机器学习的数据库。官方网站收集了622个数据集&#xff0c;可用于时间序列预测、数据分类回归等多种任务&#xff0c;包含交通流量、电力、生物、空气质量、互联网等等各个方面的数据…

git宝藏干货

git命令 怎样删除gitee仓库 Gitee上传代码 在Gitee上创建该项目的远程仓库 进入你想要上传的文件目录下&#xff0c;右键单击空白处&#xff0c;点击Git Bash Here 命令行输入下列命令&#xff0c;初始化本地仓库 git init 添加项目目录下所有文件至本地仓库 git add . …

ATE测试设备功能、原理、特点详解

ATE(Automatic Test Equipment)自动测试设备是用于检测电子产品、电气设备的自动化测试系统&#xff0c;是电测行业首选的一种测试方式&#xff0c;被广泛应用于通信、消费电子、汽车电子、智能家居、半导体、电源模块、医疗电子、航天航空等领域。ATE测试设备在电子设计、研发…

【excel技巧】Excel表格里的图片如何批量调整大小?

Excel表格里面插入了很多图片&#xff0c;但是每张图片大小不一&#xff0c;如何做到每张图片都完美的与单元格大小相同&#xff1f;并且能够根据单元格来改变大小&#xff1f;今天分享&#xff0c;excel表格里的图片如何批量调整大小。 方法如下&#xff1a; 点击表格中的一…

c语言:解决判断两个字符串是不是互为旋转字符的问题

题目&#xff1a; 思路&#xff1a;先判断两个字符长度是否相等&#xff0c;如果不相等&#xff0c;肯定不是互为旋转字符串。 方法一&#xff1a;将第一份字符串右旋0-n&#xff08;字符个数&#xff09;次&#xff0c;判断是否有一次右旋完的字符串等于第二个字符串。如果有&…

MySQL分页查询的工作原理

前言 MySQL 的分页查询在我们的开发过程中还是很常见的&#xff0c;比如一些后台管理系统&#xff0c;我们一般会有查询订单列表页、商品列表页等。 示例&#xff1a; SELECT * FROM goods order by create_time limit 0,10; 在了解order by和limit的工作原理之前&#xff0c…

HarmonyOS开发:动态共享包的依赖问题

一、共享包的依赖方式 在需要依赖的模块包目录下oh-package.json5文件中添加依赖&#xff1a; "dependencies": {"ohos/srpaasUI": "file:../../srpaasUI","ohos/srbusiness": "file:../../feature/srbusiness"} 引入之后…

掌握接口自动化测试,看这篇文章就够了,真滴简单

前言&#xff1a; 接口测试在我们测试工作当中&#xff0c;经常会遇到&#xff0c;对于接口自动化操作&#xff0c;也越来越多的公司进行实践起来了&#xff0c;市面上有很多工具可以做接口自动化比如&#xff1a;Postman、JMeter、SoapUI等。这一篇安静主要介绍通过代码的形式…

阿尔法狗的算法解析-增强学习和蒙特卡洛树搜索算法

阿尔法狗(AlphaGo)是谷歌旗下DeepMind开发的一个著名的增强学习算法,它在围棋领域取得了显著的成就。本文主要探讨其中两个重要的算法:增强学习算法和蒙特卡洛树搜索算法。 AlphaGo涉及的算法 AlphaGo是DeepMind团队开发的一个由多种算法和技术组合而成的系统,其包括以下…

基于单片机C51全自动洗衣机仿真设计

**单片机设计介绍&#xff0c; 基于单片机C51全自动洗衣机仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机C51的全自动洗衣机仿真设计是一个复杂的项目&#xff0c;它涉及到硬件和软件的设计和实现。以下是对这…

uniapp 微信小程序分享功能 onShareAppMessage(options)

一、背景 在微信小程序中需要完成转发分享功能&#xff0c;接收人未登录小程序情况下&#xff0c;在微信上打开不用强制登录&#xff0c;可以查看部分分享的内容&#xff1b;如果用户要查看更多内容&#xff0c;可以点击【查看全部】按钮&#xff0c;触发登录逻辑&#xff0c;…

【2023云栖】郭瑞杰:阿里云搜索产品智能化升级

本文根据 2023 云栖大会演讲实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;郭瑞杰 | 阿里云资深技术专家、搜索负责人 演讲主题&#xff1a;阿里云搜索产品智能化升级发布 近日在2023云栖大会上&#xff0c;阿里云搜索负责人郭瑞杰对阿里云搜索产品智…

轻松实现文件改名:让新文件名与目录名称一致

在日常工作中&#xff0c;我们经常需要处理文件改名的问题。有时候&#xff0c;我们需要将新文件名设置为与目录名称相同&#xff0c;以方便管理和查找。然而&#xff0c;这个过程可能很繁琐&#xff0c;尤其是当你有大量的文件需要改名时。幸运的是&#xff0c;现在有一种简单…

【Mquant】7:构建价差套利(三) ——空间误差校正模型

文章目录 1. 上节回顾2. 纯碱价差套利3. 什么是协整性分析4. 通过协整性检验5. 空间误差校正模型&#xff08;VECM&#xff09;6. 构建交易策略7 总结 1. 上节回顾 【Mquant】6&#xff1a;构建价差套利(二)上节带领大家编写了统计套利均值回归的程序&#xff0c;通过历史回测…