当前位置: 首页 > news >正文

rabbitmq的三个交换机及简单使用

提前说一下,创建队列,交换机,绑定交换机和队列都是在生产者。消费者只负责监听就行了,不用配其他的。

完成这个场景需要两个服务哦。

1直连交换机-生产者的代码。

在配置类中创建队列,交换机,绑定交换机和队列

@Configuration
public class DirectRabbitConfigTest {//队列@Beanpublic Queue TestDirectQueue(){return new Queue("TestDirectQueue",true);}//交换机@BeanDirectExchange TestDirectExchange(){return new DirectExchange("TestDirectExchange",true,false);}//绑定@BeanBinding bindingDirect(){return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with("TestDirectRouting");//TestDirectRouting为路由键}
}

发送消息,访问这个接口就行。

@Controller
public class test001 {@Autowiredprivate RabbitTemplate rabbitTemplate;@ResponseBody@GetMapping("/sendDirectMessage")public String sendDirectMessage() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "test message, hello!";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String,Object> map=new HashMap<>();map.put("messageId",messageId);map.put("messageData",messageData);map.put("createTime",createTime);//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchangerabbitTemplate.convertAndSend("TestDirectExchange", "TestDirectRouting", map);return "ok";}
}

2直连交换机-消费者的代码

@Component
@RabbitListener(queues = "TestDirectQueue")//监听的队列
public class DirectReceiver {@RabbitHandlerpublic void process(Map testMessage){System.out.println("消息one:"+testMessage.toString());//这个map就是发送的消息}
}

直连交换机总结:你可以自己加几个消费者,发送消息你会发现消息被轮询了。

访问@GetMapping("/sendDirectMessage")消息就发出并被接收。

3topic交换机-生产者的代码

注意:需要自己去控制台添加firstQueue和secondQueue队列,不然消费者启动不起来。原因未知,在直连交换机的时候机器自己创建队列了,topic不知道为啥不行。

@Configuration
public class TopicRabbitConfigTest {//绑定键public final static String man = "topic.man";public final static String woman = "topic.woman";@Beanpublic Queue firstQueue() {//return new Queue(TopicRabbitConfigTest.man);return new Queue("firstQueue");}@Beanpublic Queue secondQueue() {//return new Queue(TopicRabbitConfigTest.woman);return new Queue("secondQueue");}@BeanTopicExchange exchange() {return new TopicExchange("topicExchange");}//将firstQueue和topicExchange绑定,而且绑定的键值为topic.man//这样只要是消息携带的路由键是topic.man,才会分发到该队列@BeanBinding bindingExchangeMessage() {return BindingBuilder.bind(firstQueue()).to(exchange()).with(man);}//将secondQueue和topicExchange绑定,而且绑定的键值为用上通配路由键规则topic.#// 这样只要是消息携带的路由键是以topic.开头,都会分发到该队列@BeanBinding bindingExchangeMessage2() {return BindingBuilder.bind(secondQueue()).to(exchange()).with("topic.#");}}

发送消息,访问这两个接口就行。

@Controller
public class TopicTest002 {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendTopicMessage1")public String sendTopicMessage1() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: M A N ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> manMap = new HashMap<>();manMap.put("messageId", messageId);manMap.put("messageData", messageData);manMap.put("createTime", createTime);rabbitTemplate.convertAndSend("topicExchange", "topic.man", manMap);return "ok";}@GetMapping("/sendTopicMessage2")public String sendTopicMessage2() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: woman is all ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> womanMap = new HashMap<>();womanMap.put("messageId", messageId);womanMap.put("messageData", messageData);womanMap.put("createTime", createTime);rabbitTemplate.convertAndSend("topicExchange", "topic.woman", womanMap);return "ok";}
}

4topic交换机-消费者的代码

需要监听两个队列

@Component
@RabbitListener(queues = "firstQueue")//监听的队列
public class TopicManReceiver {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("TopicManReceiver消费者收到消息  : " + testMessage.toString());}}
@Component
@RabbitListener(queues = "secondQueue")//监听的队列
public class TopicWoManReceiver {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("TopicTotalReceiver消费者收到消息  : " + testMessage.toString());}}

先访问@GetMapping("/sendTopicMessage1")接口,再访@GetMapping("/sendTopicMessage2")接口,结果如下:

总结:绑定和发送的时候都要设置路由键。

5fanout交换机-生产者

注意:这种交换机也需要自己去控制台创建队列。fanout交换机不需要设置路由key

@Configuration
public class FanoutRabbitConfigTest {/***  创建三个队列 :fanout.A   fanout.B  fanout.C*  将三个队列都绑定在交换机 fanoutExchange 上*  因为是扇型交换机, 路由键无需配置,配置也不起作用*/@Beanpublic Queue queueA() {return new Queue("fanout.A");}@Beanpublic Queue queueB() {return new Queue("fanout.B");}@Beanpublic Queue queueC() {return new Queue("fanout.C");}@BeanFanoutExchange fanoutExchange() {return new FanoutExchange("fanoutExchange");}@BeanBinding bindingExchangeA() {return BindingBuilder.bind(queueA()).to(fanoutExchange());}@BeanBinding bindingExchangeB() {return BindingBuilder.bind(queueB()).to(fanoutExchange());}@BeanBinding bindingExchangeC() {return BindingBuilder.bind(queueC()).to(fanoutExchange());}}

发送消息,访问这个接口就行。

@Controller
public class FanoutTest003 {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendFanoutMessage")public String sendFanoutMessage() {String messageId = String.valueOf(UUID.randomUUID());String messageData = "message: testFanoutMessage ";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String, Object> map = new HashMap<>();map.put("messageId", messageId);map.put("messageData", messageData);map.put("createTime", createTime);rabbitTemplate.convertAndSend("fanoutExchange", null, map);return "ok";}}

6fanout交换机-消费者

@Component
@RabbitListener(queues = "fanout.A")//监听的队列
public class FanoutA {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverA消费者收到消息  : " +testMessage.toString());}
}
@Component
@RabbitListener(queues = "fanout.B")//监听的队列
public class FanoutB {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverB消费者收到消息  : " +testMessage.toString());}}
@Component
@RabbitListener(queues = "fanout.C")//监听的队列
public class FanoutC {@RabbitHandlerpublic void process(Map testMessage) {System.out.println("FanoutReceiverC消费者收到消息  : " +testMessage.toString());}}

总结:三个消费者都收到了消息

重点:直连交换机不管绑定多少个队列,消息会到达所有队列,然后去消费者方进行轮询。

相关文章:

rabbitmq的三个交换机及简单使用

提前说一下&#xff0c;创建队列&#xff0c;交换机&#xff0c;绑定交换机和队列都是在生产者。消费者只负责监听就行了&#xff0c;不用配其他的。 完成这个场景需要两个服务哦。 1直连交换机-生产者的代码。 在配置类中创建队列&#xff0c;交换机&#xff0c;绑定交换机…...

TCP 如何获取端口信息

注&#xff1a;本文为 “TCP 如何获取端口信息” 相关讨论摘录。 机翻&#xff0c;未校。 How TCP Gets Port Information TCP 如何获取端口信息 asked Nov 10, 2024 at 19:57 user15503745 API Call for Connection API 调用以建立连接 Before the app can send data d…...

HashMap和HashTable的区别

1、HashMap是线程不安全的&#xff0c;HashTable是线程安全的 HashMap&#xff1a;Fail-fast 机制。表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛出ConcurrentModificationException异常&#xff0c;从而导致遍历失…...

USB 传输技术 OTG(On-The-Go)极简理解

OTG 极简理解 OTG&#xff0c;全称为 On-The-Go&#xff0c;它是一种 USB 传输技术 OTG 的主要应用于不同的设备或移动设备间的联接&#xff0c;进行数据交换 OTG 允许在没有电脑作为中转站的情况下&#xff0c;实现设备间的数据传送以及不同设备间的互相连接 在手机中&…...

SpringBoot插件

SpringBoot的插件机制是其强大灵活性的重要体现&#xff0c;它允许开发人员将应用程序的不同功能模块打包为独立的插件&#xff0c;并可以动态地加载和卸载这些插件。以下是对SpringBoot插件机制的详细解析&#xff1a; 一、插件机制的概念 插件机制是一种软件开发方法&#…...

【开发环境搭建篇】Visual Studio 2022 安装和使用

本文收录于 《C编程入门》专栏&#xff0c;从零基础开始&#xff0c;介绍C编程入门相关的内容&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、下载三、安装四、使用五、总结 一、前言 本文介绍如何在Windows环境下安装Visual Studio 2022。 什么是Vi…...

深度学习:Java DL4J基于RNN构建智能停车管理模型

### 深度学习&#xff1a;Java DL4J基于RNN构建智能停车管理模型 #### 引言 随着城市化进程的加速&#xff0c;停车问题日益成为城市管理的难点和痛点。传统的停车场管理方式效率低下&#xff0c;导致停车场资源无法得到充分利用&#xff0c;车主停车体验差。为了解决这些痛点…...

创建型模式-工厂模式

工厂模式是一种创建型的设计模式&#xff0c;原理是父类提供一个创建对象的方法&#xff0c;允许子类去实现具体的实例化对象。通过此模式可减少创建和具体的产品之间的耦合关系。 适用场景&#xff1a; 1、当需求中无法预估对象确切类别及个别的依赖关系。例如&#xff1a; …...

UI自动化测试框架playwright--初级入门

一、背景&#xff1a;UI自动化的痛点&#xff1a; 1、设计脚本耗时&#xff1a; 需要思考要如何模拟用户的操作&#xff0c;如何触发页面的事件&#xff0c;还要思考如何设计脚本&#xff0c;定位和操作要交互的元素、路径、位置&#xff0c;再编写代码逻辑&#xff0c;往复循…...

算法 -归并排序

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【算法】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f500; 归并排序&#x1f4d6; 简介&#x1f5bc;️ 示意图&#x1f4a1; 实现思路&#x1f4bb; 代码实现&#x1f4a1; 实现思路2 - 非递归&#x1f4bb…...

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI&#xff0c;点击按钮后&#xff0c;会变成为一个监听按钮。旁边会有音符飞入这个监听按钮&#xff0c;最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码...

NRC优先级中比较特殊的—NRC0x13和NRC0x31

1、基础知识 大家都了解 NRC0x13&#xff0c;表示长度错误和格式错误 NRC0x31&#xff0c;表示DID不支持和数据格式不支持 2、为什么说这两个NRC比较特殊 看下图的标注部分&#xff1a; 2.1、先看NRC0x13 步骤一&#xff1a;仔细看是先判断Minmun Length Check &#xff0…...

文件的介绍4

一、文件的随机读写 1.fseek I 从左往右 第一个参数 stream 是一个 指向已经被打开的文件流 的指针 第三个参数 origin 是个常量&#xff0c;指定从哪个位置开始偏移&#xff0c;它的取值&#xff1a; SEEK_SET&#xff1a;从文件开头开始偏移。SEEK_CUR&#xff1a;从当前…...

Mysql - 多表连接和连接类型

在关系型数据库中&#xff0c;多表连接&#xff08;JOIN&#xff09;是用于从多个表中检索数据的常用操作。通过连接多个表&#xff0c;可以将分散在不同表中的相关数据组合在一起&#xff0c;从而进行更复杂的查询和分析。在这篇文章中&#xff0c;我们将深入探讨MySQL中的多表…...

Tableau数据可视化与仪表盘搭建-可视化原则及BI仪表盘搭建

目录 可视化原则 BI仪表盘搭建 仪表盘搭建原则 明确仪表盘主题 仪表盘主题拆解 开发设计工作表 经营情况总览&#xff1a;突出显示的文字 经营数据详情&#xff1a;表格 每日营收数据&#xff1a;多轴折线图 每日流量数据&#xff1a;双轴组合图 新老客占比&#xf…...

如何制作一份出色的公司介绍PPT?

制作一份公司介绍的PPT需要精心设计&#xff0c;以确保内容既专业又吸引人。以下是一个基本的框架和一些建议&#xff0c;帮助您创建一份有效的公司介绍PPT&#xff1a; PPT标题页 标题&#xff1a;公司全称&#xff08;可使用公司Logo作为背景或嵌入标题中&#xff09;副标题…...

【Arm】Arm 处理器的半主机(semihosting)机制

概览 通过 semihosting 机制&#xff0c;主机可以通过调试器使用目标计算机 IO 接口。 例如开发者的 PC 通过 J-Link 来使用 STM32 MCU 的输入输出。 这些功能的示例包括键盘输入、屏幕输出和硬盘 I/O。例如&#xff0c;可以使用此机制启用 C Library 中的函数&#xff0c;如…...

C语言基本知识复习浓缩版:输出函数printf

输出函数printf学习 printf()的作用是将文本输出到屏幕上使用之前需要先引入stdio.h头文件printf函数在使用的时候&#xff0c;至少需要一个参数 printf() 是 C 语言标准库中的一个函数&#xff0c;用于将格式化的文本输出到标准输出设备&#xff08;通常是屏幕&#xff09;。…...

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…...

WebRTC:构建实时通信应用的利器

都已无处不在。而 WebRTC&#xff08;Web Real-Time Communication&#xff09;则为开发者提供了一种简便的方式&#xff0c;来在浏览器中实现实时的音视频通信和数据传输。本文将介绍 WebRTC 的基本概念、工作原理&#xff0c;以及如何利用 WebRTC 构建实时通信应用。 什么是…...

个人博客搭建(二)—Typora+PicGo+OSS

个人博客站—运维鹿: http://www.kervin24.top CSDN博客—做个超努力的小奚&#xff1a; 做个超努力的小奚-CSDN博客 一、前言 博客搭建完一直没有更新&#xff0c;因为WordPress自带的文档编辑器不方便&#xff0c;以前用CSDN写作的时候&#xff0c;习惯了Typora。最近对比了…...

华纳云:在centos7中tomcat内存怎么设置?

在 CentOS 7 中&#xff0c;可以通过修改 Tomcat 的启动脚本来调整 Tomcat 的内存设置。Tomcat 的内存配置主要涉及 JVM 参数(Java Virtual Machine)&#xff0c;可以通过设置 -Xms(初始内存)和 -Xmx(最大内存)来调整内存大小。 步骤如下&#xff1a; 1. 修改 Tomcat 启动脚本 …...

樱桃键盘win键按了没反应怎么处理

‌游戏模式‌&#xff1a;部分樱桃键盘在进入游戏模式后会禁用Win键&#xff0c;以防止在游戏过程中误触。可以通过按下Fn F9键来切换游戏模式和办公模式&#xff0c;确保键盘处于办公模式下&#xff0c;Win键即可恢复正常功能。‌ &#xff08;至此我的问题已解决&#xff0c…...

【UE5 C++课程系列笔记】23——多线程基础——AsyncTask

目录 概念 函数说明 注意事项 &#xff08;1&#xff09;线程安全问题 &#xff08;2&#xff09;依赖特定线程执行的任务限制 &#xff08;3&#xff09;任务执行顺序和时间不确定性 使用示例 概念 AsyncTask 允许开发者将一个函数或者一段代码逻辑提交到特定的线程去执…...

Docker运维高级容器技术知识点总结

1、虚拟机部署和容器化部署的区别是什么&#xff1f; 1、技术基础&#xff1a; <1>.虚拟化技术在物理硬件上创建虚拟机&#xff0c;每台虚拟机运行自己完整的操作系统、从而实现资源隔离。 <2>.容器化技术&#xff1a;将应用程序打包在容器内&#xff0c;在进程空间…...

Docker的安装和使用

容器技术 容器与虚拟机的区别 虚拟机 (VM) VM包含完整的操作系统&#xff0c;并在虚拟化层之上运行多个操作系统实例。 VM需要更多的系统资源&#xff08;CPU、内存、存储&#xff09;来管理这些操作系统实例。 容器 (Container) 容器共享主机操作系统的内核&#xff0c;具…...

Java语法总结

Java的数据类型分为基本数据类型和引用数据类型。 1.基本数据类型&#xff1a;四类八种 byte 和short 比较特殊&#xff0c;不必考虑int类型&#xff0c;只关注是否超出了表示范围。 数据超出了int的范围&#xff0c;改正&#xff1a;在后边添加L &#xff0c;定义变量报错…...

Linux文件系统的安全保障---Overlayroot!

overlayroot 是一种使用 OverlayFS 实现的功能&#xff0c;可将根文件系统挂载为只读&#xff0c;并通过一个临时的写层实现对文件系统的修改。这种方法非常适合嵌入式设备或需要保持系统文件完整性和安全性的场景。下文以 RK3568 平台为例&#xff0c;介绍制作 overlayroot 的…...

net-http-transport 引发的句柄数(协程)泄漏问题

Reference 关于 Golang 中 http.Response.Body 未读取导致连接复用问题的一点研究https://manishrjain.com/must-close-golang-http-responsehttps://www.reddit.com/r/golang/comments/13fphyz/til_go_response_body_must_be_closed_even_if_you/?rdt35002https://medium.co…...

Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索

作者&#xff1a;来自 Elastic Tommaso Teofili 了解如何使用智能提前终止策略让 HNSW 加快 KNN 搜索速度。 在高维空间中高效地找到最近邻的挑战是向量搜索中最重要的挑战之一&#xff0c;特别是当数据集规模增长时。正如我们之前的博客文章中所讨论的&#xff0c;当数据集规模…...

嵌入式c语言的内存管理

目录 一、内存布局概述 二、栈&#xff08;Stack&#xff09; 2.1. 定义与用途 2.2. 内存分配与释放 2.3. 增长方向与大小限制 三、堆&#xff08;Heap&#xff09; 3.1. 定义与用途 3.2. 内存分配与释放 3.3. 增长方向与潜在问题 四、全局/静态存储区 4.1. 定义与用…...

uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端

采用 uniapp-vue3 实现, 是一款带有丝滑动画效果的单选框组件&#xff0c;提供点状、条状的动画过渡效果&#xff0c;支持多项自定义配置&#xff0c;适配 web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&…...

【Linux】shell脚本编程

目录 概念&#xff1a; shell脚本的本质&#xff1a; shell脚本编程&#xff1a; shell变量&#xff1a; 变量的定义格式&#xff1a; 变量的分类 自定义变量&#xff1a; 环境变量&#xff1a; 命令变量与命令行参数&#xff1a; 预定义变量&#xff1a; shell中的…...

ingress-nginx-controller安装

ingress-nginx-controller安装 ingress-nginx-controller是配置ingress发布的基础。以下主要采用Helm安装。地址&#xff1a; GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for Kubernetes 1 Helm安装 安装不难&#xff0c;需要找到合适的压缩包就行。我自…...

机器学习基础-机器学习的常用学习方法

目录 半监督学习的概念 规则学习的概念 基本概念 机器学习里的规则 逻辑规则 规则集 充分性与必要性 冲突消解 命题逻辑 → 命题规则 序贯覆盖 单条规则学习 剪枝优化 强化学习的概念 1. 强化学习对应了四元组 2. 强化学习的目标 强化学习常用马尔可夫决策过程…...

如何在Windows 11 WSL2 Ubuntu 环境下安装和配置perf性能分析工具?

在Windows 11 WSL2 Ubuntu 环境下完整安装和配置perf性能分析工具 一、背景二、准备工作三、获取并编译Linux内核源码四、安装和配置perf五、测试perf六、总结 一、背景 由于WSL2使用的是微软定制的内核&#xff0c;并非标准的Ubuntu内核&#xff0c;因此直接使用apt安装linux…...

人工智能知识分享第十天-机器学习_聚类算法

聚类算法 1 聚类算法简介 1.1 聚类算法介绍 一种典型的无监督学习算法&#xff0c;主要用于将相似的样本自动归到一个类别中。 目的是将数据集中的对象分成多个簇&#xff08;Cluster&#xff09;&#xff0c;使得同一簇内的对象相似度较高&#xff0c;而不同簇之间的对象相…...

使用wav2vec 2.0进行音位分类任务的研究总结

使用wav2vec 2.0进行音位分类任务的研究总结 原文名称&#xff1a; Using wav2vec 2.0 for phonetic classification tasks: methodological aspects 研究背景 自监督学习在语音中的应用 自监督学习在自动语音识别任务中表现出色&#xff0c;例如说话人识别和验证。变换器模型…...

【Leetcode 热题 100】33. 搜索旋转排序数组

问题背景 整数数组 n u m s nums nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c; n u m s nums nums 在预先未知的某个下标 k ( 0 ≤ k < n u m s . l e n g t h ) k(0 \le k \lt nums.length) k(0≤k<nums.length) 上进行了 旋转&…...

【VScode】设置代理,通过代理连接服务器

文章目录 VScode编辑器设置代理1.图形化界面1.1 进入proxy设置界面1.2 配置代理服务器 2.配置文件&#xff08;推荐&#xff09;2.1 打开setting.json 文件2.2 配置代理 VScode编辑器设置代理 根据情况安装nmap 1.图形化界面 1.1 进入proxy设置界面 或者使用快捷键ctrl , 。…...

每日一题-两个链表的第一个公共结点

文章目录 两个链表的第一个公共结点问题描述示例说明示例 1示例 2 方法及实现方法描述代码实现 复杂度分析示例运行过程示例 1示例 2 总结备注 两个链表的第一个公共结点 问题描述 给定两个无环的单向链表&#xff0c;找到它们的第一个公共节点。如果没有公共节点&#xff0c…...

Linux存储管理之核心秘密(The Core Secret of Linux Storage Management)

Linux存储管理之核心秘密 如果你来自Windows环境&#xff0c;那么Linux处理和管理存储设备的方式对你而言可能显得格外不同。我们知道&#xff0c;Linux的文件系统并不采用Windows那样的物理驱动器表示方式&#xff08;如C:、D:或E:&#xff09;&#xff0c;而是构建了一个以&…...

js单例模式

保证一个类只有一个实例,并提供一个访问它的全局访问点 实现 静态方法实现 class SingleTon{//全局的访问点static getInstance(){// 保证一个类只有一个实例if(!this.instance){this.instancenew SingleTon()}return this.instance}}let aSingleTon.getInstance()let bSing…...

搭建一个本地轻量级且好用的学习TypeScript语言的环境

需求说明 虽然 TypeScript 的在线 Playground 很方便 https://www.tslang.com.cn/play/&#xff0c;但毕竟是在浏览器中使用&#xff0c;没有本地的 IDE 那么顺手。所以我想搭建一个本地类似 Playground 的环境&#xff0c;这样在学习 TypeScript 的过程中&#xff0c;可以更方…...

大模型(LLM)面试全解:主流架构、训练目标、涌现能力全面解析

系列文章目录 大模型&#xff08;LLMs&#xff09;基础面 01-大模型&#xff08;LLM&#xff09;面试全解&#xff1a;主流架构、训练目标、涌现能力全面解析 大模型&#xff08;LLMs&#xff09;进阶面 文章目录 系列文章目录大模型&#xff08;LLMs&#xff09;基础面一、目…...

入门嵌入式(七)——PWM

PWM 脉冲宽度调制PWM&#xff08;Pulse-Width Modulation&#xff09; 一组方波 周期 1ms 频率 1s / 周期 占空比 高电平/周期 数字信号&#xff1a;0/1高低电平 串口 IIC PWM都属于数字信号 模拟信号&#xff1a;电压值&#xff0c; 会受到电磁影响 ADC 模数转换 用于读取…...

Flutter 实现 列表滑动过程控件停靠效果 学习

实现一个 Flutter 应用程序&#xff0c;使用 Sliver 系列组件来创建具有滚动效果的复杂布局。使用 NestedScrollView 和 SliverPersistentHeader 来实现固定和动态的头部效果&#xff0c;以及一个可滚动的列表。 前置知识点学习 SingleTickerProviderStateMixin SingleTicker…...

STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显

资料下载地址&#xff1a;STM32WIFI获取网络时间8位数码管显示0.96OLED 1、项目介绍 主控芯片STM32C8T6 接线&#xff1a;串口1&#xff1a;PA9 PA10 OELD &#xff1a;PB6 PB7 数码管使用&#xff1a;MAX7219 8位数码管 Max7219_pinCLK PAout(5) Max7219_pinC…...

Kivy App开发之UX控件Slider滑块

在app中可能会调节如音量,亮度等,可以使用Slider来实现,该控件调用方便,兼容性好,滑动平稳。在一些参数设置中,也可以用来调整数值。 支持水平和垂直方向,可以设置默认值,最小及最大值。 使用方法,需用引入Slider类,通过Slider类生成一个滑块并设置相关的样式后,再…...

STM32学习(十)

I2C模块内部结构 I2C&#xff08;Inter-Integrated Circuit&#xff09;模块是一种由Philips公司开发的二线式串行总线协议&#xff0c;用于短距离通信&#xff0c;允许多个设备共享相同的总线‌。 ‌硬件连接简单‌&#xff1a;I2C通信仅需要两条总线&#xff0c;即SCL&…...