17. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--主币种设置
记账模块是我们项目的核心模块,也是用户使用最多的模块,因此这个模块的东西比较多,我们要分为多个部分编写代码。
一、需求
币种设置的需求涉及到了我们前面编写的代码,我们来具体看一下需求。
编号 | 需求 | 说明 |
---|---|---|
1 | 主币种设置 | 1. 用户可修改主币种;2. 在注册新用户成功后,为用户设置主币种为人民币 |
二、功能编写
在主币种设置这个需求中我们需要增加一个配置表Config
,这个表用来存储用户的配置,就目前来说我们用这个表存储用户设置的主币种。同时我们也需要增加用来操作配置表的Controller ConfigController
,这个Controller 中目前只需要两个Action Query
和Update
。最后我们要在SysUserController
中新增一个根据用户Id获取用户信息的Action QueryUserInfo
,这个Action 返回的不仅包括SysUser
表中的信息,还会返回用户的配置信息(到目前为止)。这些类和方法在这里就不列出了,大家按前面所说的自己动手编写代码实现业务功能,然后对比一下我写的代码。
这里我们讲解一下在注册新用户成功后,为用户设置主币种为人民币这个需求怎么实现。看到这个需求估计大部分人会觉得直接在Register
Action 中增加设置主币种的代码就可以了,如果你也是这么想的那就错了。用户注册功能和设置主币种的关系不是很大,我们可以在注册时让系统设置主币种,也可以让用户自己手动设置,但是根据需求来看我们只能采用第一种方法,因此我们要需解决这么一个问题:在保持Register
Action 单一职责的情况下,实现在注册时自动设置主币种为人民币。我相信已经有一部分读者想到可以使用通知来实现。是的没错,要实现这个功能我们可以使用通知的方式,也就是说当用户注册成功后Register
Action会发送一条通知,告诉Config
增加一条用户主币种。实现通知的功能我们可以选择的方法很多:基于事件机制、共享对象、使用消息队列等,在这里我们为了项目后期的扩展性就选用消息队列 来实现通知的功能,并且选目前在开发领域用的最多的MQ软件**RabbitMQ **。下面我们就一起来看一下如何实现需求吧。
2.1 安装 RabbitMQ
由于现在还处于开发阶段,因此可以把RabbitMQ安装到本地。接下来我们一起将RabbitMQ安装到Docker中吧。打开命令行工具,输入如下命令就可以吧RabbitMQ安装到我们本地了:
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq
Tip:对于Docker不熟悉的同学,请先去Docker官网或者前往我的专栏Docker极简教程学习
2.2 实现需求
RabbitMQ 安装完了,我们现在就来开发需求。
-
在项目中安装RabbitMQ官方的.NET包RabbitMQ.Client
dotnet add package RabbitMQ.Client
-
在项目中新建一个文件夹MQ,在这个文件夹下创建
RabbitMQConnection
类,这个类是用来初始化连接,以及释放链接资源,代码如下:using RabbitMQ.Client; using SporeAccounting.MQ.Model;namespace SporeAccounting.MQ;/// <summary> /// RabbitMQ连接类 /// </summary> public class RabbitMQConnection : IDisposable {/// <summary>/// 连接/// </summary>private readonly IConnection _connection;/// <summary>/// 构造函数/// </summary>/// <param name="options"></param>public RabbitMQConnection(RabbitMQOptions options){var factory = new ConnectionFactory{HostName = options.HostName,Port = options.Port,VirtualHost = options.VirtualHost,UserName = options.UserName,Password = options.Password};_connection = factory.CreateConnectionAsync().Result;}/// <summary>/// 创建通道/// </summary>/// <returns></returns>public async Task<IChannel> CreateChannel(){return await _connection.CreateChannelAsync();}/// <summary>/// 释放资源/// </summary>public void Dispose() => _connection.Dispose(); }
这段代码实现了一个
RabbitMQConnection
类,用于管理与 RabbitMQ 的连接和通道创建。它接收一个包含 RabbitMQ 配置的RabbitMQOptions
对象作为参数,通过ConnectionFactory
初始化连接。配置包括主机名、端口、虚拟主机、用户名和密码等信息。在构造函数中,利用CreateConnectionAsync().Result
创建同步连接实例_connection
。此外,该类提供了CreateChannel
方法,通过调用_connection.CreateChannelAsync()
异步生成消息通道,方便与 RabbitMQ 进行通信。为了防止资源泄漏,RabbitMQConnection
实现了IDisposable
接口,在调用Dispose
方法时释放_connection
占用的资源。这个类封装了连接和通道管理的逻辑,适合在需要频繁访问 RabbitMQ 的场景中使用,提高代码的可维护性和复用性。 -
然后我们新建发布类
RabbitMQPublisher
代码如下:using RabbitMQ.Client;namespace SporeAccounting.MQ;/// <summary> /// RabbitMQ发布者类 /// </summary> public class RabbitMQPublisher {/// <summary>/// RabbitMQ连接/// </summary>private readonly RabbitMQConnection _connection;/// <summary>/// 构造函数/// </summary>/// <param name="connection"></param>public RabbitMQPublisher(RabbitMQConnection connection){_connection = connection;}/// <summary>/// 发布消息/// </summary>/// <param name="queue"></param>/// <param name="routingKey"></param>/// <param name="message"></param>public async System.Threading.Tasks.Task Publish(string queue, string routingKey, string message){await using var channel = await _connection.CreateChannel();await channel.QueueDeclareAsync(queue, durable: true);var body = System.Text.Encoding.UTF8.GetBytes(message);await channel.BasicPublishAsync(exchange: string.Empty, routingKey: routingKey, body: body);} }
这段代码实现了一个
RabbitMQPublisher
类,用于向 RabbitMQ 消息队列发布消息。类中通过依赖注入的方式,接受一个RabbitMQConnection
对象用于管理与 RabbitMQ 的连接。其核心功能集中在Publish
方法中,该方法负责将消息发送到指定的队列。调用时,方法首先通过_connection.CreateChannel
异步创建一个消息通道,并确保通道在使用完毕后释放资源。接着调用QueueDeclareAsync
方法声明队列,确保目标队列存在,并将队列设置为持久化。然后,将传入的消息字符串转换为 UTF-8 字节数组以符合 RabbitMQ 的消息格式要求。最终,通过BasicPublishAsync
方法发送消息到指定的路由键和队列。此类有效地封装了消息发布的逻辑,提供了简洁的接口来进行队列操作和消息发送,适合构建发布订阅模式的生产者端代码。通过异步编程模式,它可以在处理大量并发消息时保持高性能和资源利用率。 -
接着我们编写订阅类
RabbitMQSubscriber
,代码如下:using System.Text; using RabbitMQ.Client; using RabbitMQ.Client.Events;namespace SporeAccounting.MQ;/// <summary> /// RabbitMQ订阅者 /// </summary> public class RabbitMQSubscriber {/// <summary>/// RabbitMQ连接/// </summary>private readonly RabbitMQConnection _connection;/// <summary>/// 构造函数/// </summary>/// <param name="connection"></param>public RabbitMQSubscriber(RabbitMQConnection connection){_connection = connection;}/// <summary>/// 订阅/// </summary>/// <param name="queue"></param>/// <param name="routingKey"></param>/// <param name="onMessage"></param>/// <returns></returns>public async System.Threading.Tasks.Task Subscribe(string queue, string routingKey,Action<string> onMessage){await using var channel = await _connection.CreateChannel();await channel.QueueDeclareAsync(queue, durable: false, exclusive: false, autoDelete: false,arguments: null);var consumer = new AsyncEventingBasicConsumer(channel);consumer.ReceivedAsync += (sender, @event) =>{var body = @event.Body.ToArray();var message = Encoding.UTF8.GetString(body);onMessage(message);return System.Threading.Tasks.Task.CompletedTask;};await channel.BasicConsumeAsync(queue, autoAck: true, consumer: consumer);} }
这段代码定义了一个名为
RabbitMQSubscriber
的类,用于实现 RabbitMQ 的订阅功能。类中包含一个_connection
字段,表示与 RabbitMQ 的连接,通过依赖注入的方式传入RabbitMQConnection
对象并在构造函数中初始化。核心方法是Subscribe
,用于订阅指定队列的消息。调用时需要传入队列名称、路由键以及一个处理消息的回调函数onMessage
。在方法内部,先通过_connection
创建一个通道,然后声明队列以确保其存在。随后,实例化AsyncEventingBasicConsumer
作为消息消费者,并在其ReceivedAsync
事件中注册逻辑:每当接收到消息时,将消息体从字节数组解码为字符串,并通过onMessage
回调执行自定义处理逻辑。最后,通过BasicConsumeAsync
启动对队列的监听,启用消息自动确认模式,完成订阅过程。这种设计使得消息处理逻辑可动态配置,适用于异步场景。 -
我们将前面编写的三个类注入到项目中,代码如下:
builder.Services.AddSingleton(new RabbitMQOptions {HostName = configurationManager["RabbitMQ:Host"],Port = int.Parse(configurationManager["RabbitMQ:Port"]),UserName = configurationManager["RabbitMQ:UserName"],Password = configurationManager["RabbitMQ:Password"],VirtualHost = configurationManager["RabbitMQ:VirtualHost"], }); builder.Services.AddSingleton<RabbitMQConnection>(); builder.Services.AddSingleton<RabbitMQPublisher>(); builder.Services.AddSingleton<RabbitMQSubscriber>();
这段代码通过依赖注入将
RabbitMQOptions
配置、RabbitMQConnection
、发布器和订阅器类注册为单例服务,供应用全局使用,简化了 RabbitMQ 的连接与消息处理管理。 -
接下来我们在
Register
Action 中添加发布设置主币种消息的代码,更新后的代码如下:/// <summary> /// 注册 /// </summary> /// <param name="sysUserViewModel"></param> /// <returns></returns> [HttpPost] [Route("Register")] public ActionResult<ResponseData<bool>> Register(SysUserViewModel sysUserViewModel) {try{var role = _sysRoleServer.QueryByName("Consumer");SysUser sysUser = _mapper.Map<SysUser>(sysUserViewModel);sysUser.Salt = Guid.NewGuid().ToString("N");sysUser.Password = HashPasswordWithSalt(sysUser.Password, sysUser.Salt);sysUser.CreateUserId = sysUser.Id;sysUser.CreateDateTime = DateTime.Now;sysUser.RoleId = role.Id;_sysUserServer.Add(sysUser);//发布设置主币种消息_ = _rabbitMqPublisher.Publish("SetMainCurrency", "SetMainCurrency", sysUser.Id);return Ok(new ResponseData<bool>(HttpStatusCode.OK, "", false));}catch (Exception ex){return Ok(new ResponseData<bool>(HttpStatusCode.InternalServerError, "服务端异常", false));} }
-
然后,我们还要在MQ文件夹下新建Message文件夹并编写接收主币种消息的类
SetMainCurrency
,代码如下:using SporeAccounting.Models; using SporeAccounting.Server.Interface;namespace SporeAccounting.MQ.Message;/// <summary> /// 设置主货币 /// </summary> public static class SetMainCurrency {/// <summary>/// 开始监听/// </summary>public static void Start(IServiceProvider serviceProvider){var subscriber = serviceProvider.GetRequiredService<RabbitMQSubscriber>();_ = subscriber.Subscribe("SetMainCurrency", "SetMainCurrency", async (userId) =>{var accountBookServer = serviceProvider.GetRequiredService<IConfigServer>();accountBookServer.Add(new Config(){Id = Guid.NewGuid().ToString(),UserId = userId,Value = "CNY",ConfigTypeEnum = ConfigTypeEnum.Currency,CreateDateTime = DateTime.Now,CreateUserId = userId});});} }
这段代码定义了一个
SetMainCurrency
静态类,负责监听 RabbitMQ 消息并处理设置主货币的操作。在Start
方法中,它通过依赖注入获取了一个RabbitMQSubscriber
实例,并调用Subscribe
方法监听SetMainCurrency
队列。监听到消息后,异步回调函数会执行,该回调通过serviceProvider
获取IConfigServer
服务。随后,它创建一个新的Config
对象,设置其为主货币配置(“CNY”),并将其存储在accountBookServer
中。该配置对象包含了用户 ID、配置类型、创建时间等信息。此设计实现了一个简单的消息处理机制,能够在接收到特定消息时更新系统配置。 -
最后我们在
Programe
类中设置在项目启动时开启监听//开启监听主币种 SetMainCurrency.Start(app.Services);
三、总结
这篇文章我们实现了在注册时设置主币种的功能。我们之所以使用消息队列实现是因为注册功能和设置主币种属于两个业务,因此我们需要将它们分离出来,同时即使设置主币种操作失败了也不影响注册功能。
这里只列出了核心的类和方法,其他的方法以及和Config相关的操作请大家自己动手来实现一下,完成后和我的代码对比一下看看有什么不同。
相关文章:
17. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--主币种设置
记账模块是我们项目的核心模块,也是用户使用最多的模块,因此这个模块的东西比较多,我们要分为多个部分编写代码。 一、需求 币种设置的需求涉及到了我们前面编写的代码,我们来具体看一下需求。 编号需求说明1主币种设置1. 用户…...
ChatPaper.ai:通过阅读文献高效学习英语的新思路
前言 作为一名学习者,我们常常会遇到这样的困境:想提高英语水平,但单纯背单词缺乏语境;想读专业文献,却被英语障碍所困扰。今天我要分享一个工具 ChatPaper.ai,它让我找到了将英语学习和专业阅读完美结合的…...
.NET9 - 新功能体验(二)
书接上回,我们继续来聊聊.NET9和C#13带来的新变化。 01、新的泛型约束 allows ref struct 这是在 C# 13 中,引入的一项新的泛型约束功能,允许对泛型类型参数应用 ref struct 约束。 可能这样说不够直观,简单来说就是Span、ReadO…...
探索Python PDF处理的奥秘:pdfrw库揭秘
文章目录 探索Python PDF处理的奥秘:pdfrw库揭秘1. 背景:为何选择pdfrw?2. pdfrw是什么?3. 如何安装pdfrw?4. 五个简单的库函数使用方法4.1 读取PDF信息4.2 修改PDF元数据4.3 旋转PDF页面4.4 提取PDF中的图片4.5 合并P…...
网络爬虫——爬虫项目案例
本节将全面讲解如何通过实战爬虫项目解决复杂问题。结合最新技术和实际开发需求,案例将涵盖完整开发流程,包括需求分析、实现代码、优化方法和常见问题解决。力求实现高效、可扩展的爬虫项目架构,帮助开发者提升实战能力。 案例 1:…...
JAVA中的Lamda表达式
JAVA中的Lamda表达式 Lambda 表达式的语法使用场景示例代码1.代替匿名内部类2. 带参数的 Lambda 表达式3. 与集合框架结合使用4. 使用 Stream 操作 总结 Java 的 Lambda 表达式是 Java 8 引入的一个新特性,用于简化代码,特别是在处理函数式编程时。Lambd…...
经典游戏:飞机大战游戏python设计与实现
《飞机大战》是一款经典的二维飞行射击游戏,其核心玩法是控制玩家飞机与敌机作战,通过击落敌机获取分数并尽量避免被敌机击中。根据提供的代码,飞机大战的设计和实现可以分为以下几个主要部分:游戏初始化、游戏界面设计、玩家控制…...
网络爬虫——常见问题与调试技巧
在开发网络爬虫的过程中,开发者常常会遇到各种问题,例如网页加载失败、数据提取错误、反爬机制限制等。以下内容将结合实际经验和技术方案,详细介绍解决常见错误的方法,以及如何高效调试和优化爬虫代码。 1. 爬虫过程中常见的错误…...
深入理解TensorFlow中的形状处理函数
摘要 在深度学习模型的构建过程中,张量(Tensor)的形状管理是一项至关重要的任务。特别是在使用TensorFlow等框架时,确保张量的形状符合预期是保证模型正确运行的基础。本文将详细介绍几个常用的形状处理函数,包括get_…...
macOS 无法安装第三方app,启用任何来源的方法
升级新版本 MacOS 后,安装下载的软件时,不能在 ”安全性与隐私” 中找不到 ”任何来源” 选项。 1. 允许展示任何来源 点击 启动器 (Launchpad) – 其他 (Other) – 终端 (Terminal): 打开终端后,输入以下代码回车: …...
Leetcode148. 排序链表(HOT100)
链接 我写的错误代码: class Solution { public:ListNode* sortList(ListNode* head) {if (!head || !head->next)return head;ListNode* fast head;ListNode* slow head;while (fast&&fast->next) {fast fast->next->next;slow slow->…...
Linux线程_线程互斥_线程同步
一.线程互斥 1.进程线程间的互斥相关概念 临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临界区&…...
【Spiffo】环境配置:VScode+Windows开发环境
摘要: 在Linux下直接开发有时候不习惯快捷键和操作逻辑,用Windows的话其插件和工具都更齐全、方便,所以配置一个Windows的开发环境能一定程度提升效率。 思路: 自己本地网络内远程连接自己的虚拟机(假定用的是虚拟机…...
DevExpress控件 基本使用
DevExpress控件 一、DevExpress简介 1、所有编辑器的公共功能 全部都可以绑定数据; 全部都可以独立使用或用于由 Developer Express 提供的容器控件 (XtraGrid、XtraVerticalGrid、XtraTreeList 和 XtraBars) 内的内置编辑; 全部都使用相同的样式、外…...
设计模式——装饰器模式
装饰器模式是结构型设计模式,在Python中有一个非常著名的装饰器wrapper,它的实现方法就是使用了该设计模式,装饰器可以修饰类也可以修饰函数。 从类的设计上说,他的本质是在不定义子类的情况下动态的给对象添加一些额外的功能。举…...
【编程题目】列表、元组及集合
一.列表的题目 题目1:列表反转与排序 描述:给定一个整数列表,首先反转该列表,然后对其进行升序排序。最后输出处理后的列表。输入:一个整数列表,例如 [3, 1, 4, 1, 5, 9]输出:处理后的列表,例如 [1, 1, 3, 4, 5, 9]示例:input_list = [3, 1, 4, 1, 5, 9] # 你的代码 …...
【大数据学习 | Spark-Core】RDD的缓存(cache and checkpoint)
1. 单应用缓存:cache 1.1 cache算子 cache算子能够缓存中间结果数据到各个executor中,后续的任务如果需要这部分数据就可以直接使用避免大量的重复执行和运算。 rdd 存储级别中默认使用的算子cache算子,cache算子的底层调用的是persist算子…...
自主研发,基于PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发的不良事件管理系统源码,不良事件管理系统源码
不良事件上报系统源码,不良事件管理系统源码,PHP源码 不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板࿰…...
哈希表理解与底层模拟实现
内容摘要 本文内容包括红黑树和哈希表的性能比较逻辑分析及实现、哈希表的概念、哈希表映射关系建立的最常用的两种方法直接地址法和除留余数法介绍、介绍了哈希冲突的原因以及解决解决哈希冲突的方法、负载因子的概念、哈希表的扩容、开散列实现哈希表的思路及代码实现、闭散列…...
docker compose的安装和使用
1. Docker Compose 简介 Docker Compose 是一个工具,用于定义和运行多容器的 Docker 应用。通过编写一个 docker-compose.yml 文件,可以一次性启动所有容器,并且方便管理容器之间的依赖。 2. 安装 Docker Compose 前提条件 确保已安装 Do…...
17种Kubernetes安全检测工具详解
随着Kubernetes的广泛应用,确保其安全性就显得尤为重要。好在现有很多优秀的安全检测工具,可以帮助我们发现和修复Kubernetes集群中的安全隐患。本文将全面介绍17种常用的Kubernetes安全检测工具。 Kube-benchKube-hunterKubesec.ioTrivyKube-auditKube-secKube-vulnkube-scana…...
Python遥感开发之CGCS2000转换WGS84地理坐标系
Python遥感开发之CGCS2000转换WGS84地理坐标系 1 CGC2000坐标系介绍2 WGS84地理坐标系介绍3 代码实现CGCS2000转换WGS84地理坐标系 前言:主要借助pyproj实现从CGCS2000高斯-克吕格3度带(EPSG:4547)转换到WGS84地理坐标系(EPSG:432…...
FAX动作文件优化脚本(MAX清理多余关键帧插件)
大较好,为大家介绍一个节省FBX容量的插件!只保留有用的动画轴向,其他不参与动画运动的清除! 一.插件目的:: 1.我们使用的U3D引擎产生的游戏资源包容量太大,故全方位优化动画资源; 2.在max曲线编辑器内,点取轴向太过麻烦,费事,直观清除帧大大提高效率。 如: 二:…...
Springboot集成ElasticSearch实现minio文件内容全文检索
一、docker安装Elasticsearch (1)springboot和Elasticsearch的版本对应关系如下,请看版本对应: 注意安装对应版本,否则可能会出现一些未知的错误。 (2)拉取镜像 docker pull elasticsearch:7…...
Python 中的 | 符号
Python 中的 | 符号 正文用法 1用法2 正文 今天遇到了一个符号 |,本文将对符号 | 的意思进行说明。 x: int 1 print(x) # 1上述代码中,:int 表示的是注释内容,这个在 python 中的注释 一文中我们已经进行了说明。 用法 1 有些时候我们会…...
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务 IDS入侵检测系统 Intrusion Detection System 安全检测系统,通过监控网络流量、系统日志等信息,来检测系统中的安全漏洞、异常行为和入侵行为。 分为&am…...
记录elasticsearch-analysis-dynamic-synonym从8.15.0升级到8.16.0所遇到的问题
记录elasticsearch-analysis-dynamic-synonym从8.15.0升级到8.16.0所遇到的问题 一、打包步骤 步骤一、linux系统下执行elasticsearch-module中的build.sh脚本 步骤二、maven环境下elasticsearch-cluster-runner执行maven install命令安装到本地maven仓库。 步骤三、修改版…...
IDEA怎么定位java类所用maven依赖版本及引用位置
在实际开发中,我们可能会遇到需要搞清楚代码所用依赖版本号及引用位置的场景,便于排查问题,怎么通过IDEA实现呢? 可以在IDEA中打开项目,右键点击maven的pom.xml文件,或者在maven窗口下选中项目,…...
react native 安装好apk后无法打开
react native 打包好apk安装完成,没有打开app按钮, 在AndroidManifest.xml中 <intent-filter><action android:name"android.intent.action.MAIN" /><category android:name"android.intent.category.LAUNCHER" /&…...
HTML5 SVG
HTML5 SVG SVG(Scalable Vector Graphics)是一种基于XML的图像格式,用于在网页上创建矢量图形。与传统的位图图像(如PNG和JPEG)不同,SVG图像可以无限放大而不失真,因为它们是由直线和曲线定义的数学路径,而不是像素点。HTML5支持直接在网页中嵌入SVG,使得网页设计更加…...
【LeetCode每日一题】——485.最大连续 1 的个数
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 LeetCode 三【题目编号】 485.最大连续 1 的个数 四【题目描述】 给定…...
Python语言就业方向有哪些?
Python语言的就业方向非常广泛,涵盖了多个领域和职位,主要包括: Web开发 Python在Web开发领域有着广泛的应用,特别是通过框架如Django、Flask等。Python可以帮助开发者快速搭建网站,与各种前端技术集成,从而…...
SpringSecurity创建一个简单的自定义表单的认证应用
1、SpringSecurity 自定义表单 在 Spring Security 中创建自定义表单认证应用是一个常见的需求,特别是在需要自定义登录页面、认证逻辑或添加额外的表单字段时。以下是一个详细的步骤指南,帮助你创建一个自定义表单认证应用。 2、基于 SpringSecurity 的…...
wpf 事件转命令的方式
1,方式1 <StackPanel Background"Transparent"><StackPanel.InputBindings><KeyBinding Command"{Binding ChangeColorCommand}"CommandParameter"{Binding ElementNamecolorPicker, PathSelectedItem}"Key"{Bi…...
Docker 容器的初始化设置
虽然现在Conntainerd 大有取代Docker作为容器运行时的趋势,但是docker还是有自己的优势在。尤其是对于开发者来讲,使用Docker 比使用 containerd 方便很多,尤其是在Docker Desktop等工具的加持下。 本文主要面向Docker的初、中级学者…...
python里的数据结构
列表(List) 定义和特点: 列表是一种有序的可变序列,可包含不同类型的元素,如整数、字符串、列表等。可以通过索引访问和修改元素,索引从 0 开始。代码示例: my_list [1, 2, apple, [4, 5]] pr…...
Ros Noetic 20.04 跑通mpc_ros包保姆级教程
前言: 本文将简述mpc_ros包在noetic20.04中的安装,mpc是 一种跟踪、MPC_ROS 是一个基于ROS(Robot Operating System)的模型预测控制(Model Predictive Control,MPC)库。该项目旨在为机器人控制提供一个灵活且高效的MPC实现,使得开发者能够在ROS环境中轻松集成和使用MPC…...
MySQL 没有数据闪回?看 zCloud 如何补齐MySQL数据恢复能力
ENMOTECH 上一篇文章为大家介绍了某金融科技企业通过 zCloud 多元数据库智能管理平台的告警中心“警警”有条地管理告警并进行敏捷处置的实践案例。本篇跟大家继续分享该案例客户如何利用 zCloud 备份恢复模块下的Binlog解析功能补齐 MySQL 数据恢复能力,让运维人员…...
k8s集群加入node节点为ubuntu 22.04
文章目录 1.环境准备1.1 关闭无用服务1.2 环境和网络1.3 apt源1.4 系统优化 2. 装containerd3. 接入k8s集群3.1 kubelet、kubeadm、kubectl安装3.2 缺少一个镜像3.3 接入k8s集群 4. 一些相关问题 1.环境准备 rootcto-gpu-pro-n01:~# lsb_release -a No LSB modules are availa…...
提取图片高频信息
提取图片高频信息 示例-输入: 示例-输出: 代码实现: import cv2 import numpy as npdef edge_calc(image):src cv2.GaussianBlur(image, (3, 3), 0)ddepth cv2.CV_16Sgray cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)grad_x cv2.Scharr(g…...
向量数据库FAISS之四:向量检索和 FAISS
来自 YouTube 1.相似度搜索的传统方法(Jaccard, w-shingling, Levenshtein) 1.Jaccard 距离 公式 Jaccard ( A , B ) 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{Jaccard}(A, B) 1 - \frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)1−∣A∪B∣∣A∩B∣ 其中, A 和 …...
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件:apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…...
行列式的理解与计算:线性代数中的核心概念
开发领域:前端开发 | AI 应用 | Web3D | 元宇宙 技术栈:JavaScript、React、ThreeJs、WebGL、Go 经验经验:6 年 前端开发经验,专注于图形渲染和 AI 技术 开源项目:github 简智未来、数字孪生引擎、前端面试题 大家好&a…...
DimensionX:单图生成任意的3d/4d视图
DimensionX:单图生成任意的3d/4d视图 通俗易懂的来说 在我们的方法中,关键是如何从一张图片生成动态的3D和4D场景。我们使用一个叫做ST-Director的工具,它可以分开处理空间(3D)和时间(4D)两个方面。想象一…...
k8s上面的Redis集群链接不上master的解决办法
问题描述 之前在k8s上面部署了一台node,然后创建了6个redis的pod,构建了一个redis的集群,正常运行。 最近添加了一台slave node,然后把其中的几个redis的pod调度到了slave node上面,结果集群就起不来了,…...
芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号)
芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号) 本期是平台君和您分享的第113期内容 前一段时间,高通公司(Qualcomm)发布安全警告称,提供的60多款芯片潜在严重的“零日漏洞”,芯片安全再一次暴露在大众视野。 那什么是“零日漏洞”?平台君从网上找了一段…...
《线性代数的本质》
之前收藏的一门课,刚好期末复习,顺便看一看哈哈 课程链接:【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量,需要先明白什么是向量 不同专业对向量的看法 物理专…...
计算机视觉 1-8章 (硕士)
文章目录 零、前言1.先行课程:python、深度学习、数字图像处理2.查文献3.环境安装 第一章:概论1.计算机视觉的概念2.机器学习 第二章:图像处理相关基础1.图像的概念2.图像处理3.滤波器4.卷积神经网络CNN5.图像的多层表示:图像金字…...
SpringMVC
七、SpringMVC (1)SpringMVC简介 SpringMVC概述 SpringMVC技术与Servlet技术功能等同,均属于web层开发技术,web程序大都基于三层架构实现 如果所有的处理都交给Servlet来处理的话,所有的东西都耦合在一起,…...
使用llama.cpp进行量化和部署
git clone https://github.com/ggerganov/llama.cpp cd llama.cpp 🖥️ CPU 版本 cmake -B build_cpu cmake --build build_cpu --config Release 🖥️ CUDA 版本 cmake -B build_cuda -DLLAMA_CUDAON cmake --build build_cuda --config Release -j …...