Spring Boot 与 TDengine 的深度集成实践(三)
创建 RESTful API
编写控制器类
在 Spring Boot 项目中,控制器类负责处理 HTTP 请求,并将请求转发到相应的服务或数据访问层进行处理,最后返回响应结果给客户端。我们通过使用@RestController和@RequestMapping注解来定义控制器类和 API 路由 。
在src/main/java/com/example/springboottdengineintegration/controller目录下创建一个控制器类,例如SensorDataController:
package com.example.springboottdengineintegration.controller;
import com.example.springboottdengineintegration.entity.SensorData;
import com.example.springboottdengineintegration.service.SensorDataService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/sensor-data")
public class SensorDataController {
private final SensorDataService sensorDataService;
public SensorDataController(SensorDataService sensorDataService) {
this.sensorDataService = sensorDataService;
}
在上述代码中:
- @RestController注解表明该类是一个 RESTful 风格的控制器,它是@Controller和@ResponseBody的组合注解,@Controller用于标识该类是一个控制器组件,会被 Spring 容器扫描并管理,@ResponseBody则表示该类中所有方法的返回值会直接作为 HTTP 响应体返回给客户端,而不会被解析为视图名,适用于返回 JSON、XML 等数据格式的场景 。
- @RequestMapping("/api/sensor-data")注解用于映射 HTTP 请求的 URL 路径,它可以作用于类和方法上。这里作用于类上,表示该控制器类下的所有方法的 URL 路径都以/api/sensor-data为前缀 。例如,访问/api/sensor-data路径下的某个具体方法时,完整的 URL 将是http://localhost:8080/api/sensor-data/具体方法路径,其中8080是 Spring Boot 应用默认的端口号,可在application.properties或application.yml文件中进行修改 。
实现 CRUD 操作
接下来,在SensorDataController控制器类中实现数据的增删改查(CRUD)操作,这些操作将调用SensorDataService服务层中的方法来与 TDengine 数据库进行交互 。
// 获取所有传感器数据
@GetMapping
public ResponseEntity<List<SensorData>> getAllSensorData() {
List<SensorData> sensorDataList = sensorDataService.getAllSensorData();
return new ResponseEntity<>(sensorDataList, HttpStatus.OK);
}
// 根据ID获取传感器数据
@GetMapping("/{id}")
public ResponseEntity<SensorData> getSensorDataById(@PathVariable int id) {
return sensorDataService.getSensorDataById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
// 创建新的传感器数据
@PostMapping
public ResponseEntity<SensorData> createSensorData(@RequestBody SensorData sensorData) {
SensorData savedSensorData = sensorDataService.createSensorData(sensorData);
return new ResponseEntity<>(savedSensorData, HttpStatus.CREATED);
}
// 更新传感器数据
@PutMapping("/{id}")
public ResponseEntity<SensorData> updateSensorData(@PathVariable int id, @RequestBody SensorData sensorData) {
return sensorDataService.updateSensorData(id, sensorData)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
// 删除传感器数据
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteSensorData(@PathVariable int id) {
boolean deleted = sensorDataService.deleteSensorData(id);
if (deleted) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} else {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
在上述代码中:
- 获取所有传感器数据:
-
- @GetMapping注解用于映射 HTTP GET 请求,当客户端发送 GET 请求到/api/sensor-data路径时,会调用该方法 。
-
- sensorDataService.getAllSensorData()方法用于从数据库中获取所有的传感器数据,返回一个SensorData类型的列表 。
-
- new ResponseEntity<>(sensorDataList, HttpStatus.OK)创建一个 HTTP 响应实体,将获取到的传感器数据列表作为响应体,并设置 HTTP 状态码为200 OK,表示请求成功 。
- 根据 ID 获取传感器数据:
-
- @GetMapping("/{id}")注解映射的 URL 路径中包含一个占位符{id},表示该路径是一个动态路径,其中{id}会被实际的 ID 值替换 。例如,访问/api/sensor-data/1路径时,1就是实际的 ID 值 。
-
- @PathVariable int id用于将 URL 路径中的id值绑定到方法参数id上,这样在方法内部就可以使用该 ID 值进行数据库查询 。
-
- sensorDataService.getSensorDataById(id)方法根据传入的 ID 从数据库中查询传感器数据,返回一个Optional<SensorData>类型的结果 。Optional是 Java 8 引入的一个容器类,用于解决空指针异常问题,它可以包含一个非空值或者为空 。
-
- map(ResponseEntity::ok)方法将Optional<SensorData>中的值转换为一个 HTTP 响应实体,状态码为200 OK;orElse(ResponseEntity.notFound().build())方法表示如果Optional为空,则返回一个状态码为404 Not Found的 HTTP 响应实体,表示未找到对应 ID 的数据 。
- 创建新的传感器数据:
-
- @PostMapping注解用于映射 HTTP POST 请求,当客户端发送 POST 请求到/api/sensor-data路径时,会调用该方法 。
-
- @RequestBody SensorData sensorData用于将 HTTP 请求体中的 JSON 数据转换为SensorData对象,Spring Boot 会自动根据请求体中的数据填充SensorData对象的属性 。
-
- sensorDataService.createSensorData(sensorData)方法将接收到的SensorData对象保存到数据库中,并返回保存后的SensorData对象 。
-
- new ResponseEntity<>(savedSensorData, HttpStatus.CREATED)创建一个 HTTP 响应实体,将保存后的传感器数据作为响应体,并设置 HTTP 状态码为201 Created,表示资源已成功创建 。
- 更新传感器数据:
-
- @PutMapping("/{id}")注解映射 HTTP PUT 请求,用于更新资源,当客户端发送 PUT 请求到/api/sensor-data/{id}路径时,会调用该方法 。
-
- @PathVariable int id获取 URL 路径中的 ID 值,@RequestBody SensorData sensorData获取请求体中的更新数据 。
-
- sensorDataService.updateSensorData(id, sensorData)方法根据传入的 ID 和更新后的SensorData对象,在数据库中更新对应的数据,并返回更新后的SensorData对象(如果更新成功) 。
-
- 同样,使用map(ResponseEntity::ok)和orElse(ResponseEntity.notFound().build())方法来处理更新结果,返回相应的 HTTP 响应实体 。
- 删除传感器数据:
-
- @DeleteMapping("/{id}")注解映射 HTTP DELETE 请求,当客户端发送 DELETE 请求到/api/sensor-data/{id}路径时,会调用该方法 。
-
- sensorDataService.deleteSensorData(id)方法根据传入的 ID 从数据库中删除对应的数据,并返回一个布尔值表示删除操作是否成功 。
-
- 根据删除结果,返回不同的 HTTP 响应实体。如果删除成功,返回状态码为204 No Content的响应实体,表示请求成功处理,但没有返回内容;如果删除失败(未找到对应 ID 的数据),返回状态码为404 Not Found的响应实体 。
通过以上步骤,我们在 Spring Boot 项目中成功创建了一个 RESTful API,实现了对 TDengine 数据库中传感器数据的增删改查操作 。这些 API 接口可以方便地与前端应用或其他后端服务进行交互,为业务系统提供数据支持 。
测试 API
使用 Postman 测试
在完成 RESTful API 的开发后,我们需要对其进行测试,以确保 API 的功能正常,能够正确地与 TDengine 数据库进行交互并返回预期的结果。Postman 是一款常用的 API 测试工具,它提供了简洁直观的界面,方便我们发送各种 HTTP 请求,并查看响应结果 。
- 启动 Spring Boot 应用:在 IDE 中,右键点击 Spring Boot 项目的启动类SpringBootTdengineIntegrationApplication,选择 “Run 'SpringBootTdengineIntegrationApplication'”,启动 Spring Boot 应用 。启动成功后,控制台会显示应用的启动信息,包括应用的端口号(默认为 8080),例如:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____|.__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.0)
2024-11-12 15:30:15.678 INFO 12345 --- [ main] c.e.s.SpringBootTdengineIntegrationApplication : Starting SpringBootTdengineIntegrationApplication using Java 11.0.11 on your-computer-name with PID 12345 (/path/to/your/project/target/spring-boot-tdengine-integration-0.0.1-SNAPSHOT.jar started by your-username in /path/to/your/project)
2024-11-12 15:30:15.681 INFO 12345 --- [ main] c.e.s.SpringBootTdengineIntegrationApplication : No active profile set, falling back to 1 default profile: "default"
2024-11-12 15:30:16.782 INFO 12345 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2024-11-12 15:30:16.800 INFO 12345 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-11-12 15:30:16.800 INFO 12345 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.11]
2024-11-12 15:30:16.943 INFO 12345 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-11-12 15:30:16.943 INFO 12345 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1196 ms
2024-11-12 15:30:17.663 INFO 12345 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2024-11-12 15:30:17.673 INFO 12345 --- [ main] c.e.s.SpringBootTdengineIntegrationApplication : Started SpringBootTdengineIntegrationApplication in 2.344 seconds (process running for 3.058)
- 打开 Postman:在 Postman 中,点击 “New” 按钮,选择 “Request”,创建一个新的请求 。
- 测试获取所有传感器数据的 API:
-
- 在请求方法下拉框中选择 “GET”。
-
- 在请求 URL 输入框中输入http://localhost:8080/api/sensor-data,这里的localhost是本地主机地址,8080是 Spring Boot 应用的端口号,/api/sensor-data是我们在控制器类中定义的 API 路径 。
-
- 点击 “Send” 按钮发送请求。如果 API 正常工作,Postman 会显示 HTTP 状态码为 200 OK 的响应,响应体中会包含从 TDengine 数据库中查询到的所有传感器数据,例如:
[
{
"id": 1,
"sensorId": "sensor1",
"value": 25.5,
"timestamp": 1634567890000
},
{
"id": 2,
"sensorId": "sensor2",
"value": 30.2,
"timestamp": 1634567900000
}
]
- 测试根据 ID 获取传感器数据的 API:
-
- 在请求方法下拉框中仍选择 “GET”。
-
- 在请求 URL 输入框中输入http://localhost:8080/api/sensor-data/1,其中1是要查询的传感器数据的 ID 。
-
- 点击 “Send” 按钮发送请求。如果数据库中存在 ID 为 1 的记录,Postman 会显示状态码为 200 OK 的响应,响应体中包含该条传感器数据;如果不存在,会显示状态码为 404 Not Found 的响应 。
- 测试创建新的传感器数据的 API:
-
- 在请求方法下拉框中选择 “POST”。
-
- 在请求 URL 输入框中输入http://localhost:8080/api/sensor-data。
-
- 在请求体(Body)选项卡中,选择 “raw”,并将数据格式设置为 “JSON (application/json)”,然后输入要创建的传感器数据,例如:
{
"sensorId": "sensor3",
"value": 28.7,
"timestamp": 1634567910000
}
- 点击 “Send” 按钮发送请求。如果创建成功,Postman 会显示状态码为 201 Created 的响应,响应体中包含创建的传感器数据 。
- 测试更新传感器数据的 API:
-
- 在请求方法下拉框中选择 “PUT”。
-
- 在请求 URL 输入框中输入http://localhost:8080/api/sensor-data/1,这里的1是要更新的传感器数据的 ID 。
-
- 在请求体(Body)选项卡中,输入更新后的传感器数据,例如:
{
"sensorId": "sensor1",
"value": 26.0,
"timestamp": 1634567920000
}
- 点击 “Send” 按钮发送请求。如果更新成功,Postman 会显示状态码为 200 OK 的响应,响应体中包含更新后的传感器数据;如果未找到对应 ID 的数据,会显示状态码为 404 Not Found 的响应 。
- 测试删除传感器数据的 API:
-
- 在请求方法下拉框中选择 “DELETE”。
-
- 在请求 URL 输入框中输入http://localhost:8080/api/sensor-data/1,这里的1是要删除的传感器数据的 ID 。
-
- 点击 “Send” 按钮发送请求。如果删除成功,Postman 会显示状态码为 204 No Content 的响应,表示请求成功处理,但没有返回内容;如果未找到对应 ID 的数据,会显示状态码为 404 Not Found 的响应 。
测试结果分析
通过使用 Postman 对各个 API 进行测试,我们可以根据测试结果来分析 API 的运行情况,判断是否达到预期的功能。在测试过程中,可能会遇到以下一些问题及解决方法:
- HTTP 状态码异常:
-
- 404 Not Found:表示请求的资源未找到,可能是 API 路径错误。需要仔细检查请求 URL 中的路径是否与控制器类中定义的路径一致,包括大小写、斜杠等。例如,如果控制器类中定义的路径是/api/sensor-data,而请求 URL 中写成了/api/Sensor-Data,就会导致 404 错误,因为 URL 路径是区分大小写的 。
-
- 500 Internal Server Error:表示服务器内部发生错误,可能是代码中出现了异常。需要查看 Spring Boot 应用的控制台日志,找到异常信息,分析错误原因。例如,如果在 DAO 层的查询方法中出现了 SQL 语法错误,就会导致 500 错误,此时需要检查 SQL 语句的正确性,包括表名、字段名、语法结构等 。
- 响应数据不正确:
-
- 数据缺失:如果响应体中缺少某些字段或数据不完整,可能是实体类与数据库表的映射出现问题,或者在查询或保存数据时出现了错误。需要检查实体类的注解是否正确,以及 DAO 层和服务层的代码逻辑 。例如,如果实体类中某个字段的注解错误,导致该字段无法正确映射到数据库表中,那么在查询数据时就可能会出现该字段缺失的情况 。
-
- 数据错误:如果响应数据与预期不符,可能是业务逻辑错误或数据处理错误。需要检查服务层和控制器层的代码,确保数据的处理和返回符合业务需求 。例如,在更新数据的方法中,如果更新逻辑错误,可能会导致返回的更新后的数据与实际更新的数据不一致 。
- 请求参数问题:
-
- 参数格式错误:如果请求体中的 JSON 数据格式不正确,会导致服务器无法正确解析参数,从而返回错误响应。需要确保请求体中的 JSON 数据符合 JSON 语法规范,例如,键值对必须用双引号括起来,字符串值也必须用双引号括起来等 。例如,以下是一个错误的 JSON 格式:{sensorId: "sensor1", value: 25.5, timestamp: 1634567890000},正确的格式应该是{"sensorId": "sensor1", "value": 25.5, "timestamp": 1634567890000} 。
-
- 参数缺失:如果请求中缺少必要的参数,也会导致 API 无法正常工作。需要仔细检查 API 的文档或代码,确定每个 API 所需的参数,并在请求中正确传递 。例如,创建传感器数据的 API 需要传递sensorId、value和timestamp三个参数,如果请求体中缺少其中任何一个参数,都会导致创建失败 。
通过对测试结果的分析和问题的解决,我们可以确保 Spring Boot 与 TDengine 集成项目中的 RESTful API 能够稳定、正确地运行,为后续的业务开发提供可靠的数据接口 。
相关文章:
Spring Boot 与 TDengine 的深度集成实践(三)
创建 RESTful API 编写控制器类 在 Spring Boot 项目中,控制器类负责处理 HTTP 请求,并将请求转发到相应的服务或数据访问层进行处理,最后返回响应结果给客户端。我们通过使用RestController和RequestMapping注解来定义控制器类和 API 路由…...
物理日志和逻辑日志
在 MySQL 的日志系统中,物理日志 和 逻辑日志 是两种不同类型的日志记录方式,它们的设计目标和实现方式有本质区别。以下是它们的详细解释和对比: 1. 物理日志 定义 物理日志记录的是数据页(Page)的物理修改&#x…...
[Deep-ML]Reshape Matrix(重塑矩阵)
Reshape Matrix(重塑矩阵) 题目链接: Reshape Matrix(重塑矩阵)https://www.deep-ml.com/problems/3 题目描述: 难度: easy(简单)。 分类: Linear Alg…...
Linux文件系统中的Page Cache和内存管理中的Page之间的关系
Linux文件系统中的Page Cache和内存管理中的Page之间有密切的关联,两者在底层机制上紧密结合,共同实现高效的内存和文件系统管理。以下是它们的关系和关键点: 核心关系 Page Cache的底层是内存Page Page Cache是由内存管理中的物理内存页&…...
day25-回溯__491.递增子序列 __46.全排列__47.全排列 II
491.递增子序列 这道题要求输出一个数组的所有非递减子序列,并且数组中是可以存在重复元素的,那么我们需要考虑的就一定是之前的树层去重的方法 并且要求非递减,所以我们每次添加元素到path要先判断两个条件: 该元素的值是否在同…...
微型导轨的制造工艺中,热处理的目的是什么?
热处理是指将金属或合金加热到一定温度,保温一段时间,然后通过适当的冷却方式使其发生物理变化,从而使其性能发生改变的加工技术,而在微型导轨的制造工艺中,热处理是必须的,那么热处理的目的是什么呢&#…...
学透Spring Boot — 018. 优雅支持多种响应格式
这是我的专栏《学透Spring Boot》的第18篇文章,想要更系统的学习Spring Boot,请访问我的专栏:学透 Spring Boot_postnull咖啡的博客-CSDN博客。 目录 返回不同格式的响应 Spring Boot的内容协商 控制器不用任何修改 启动内容协商配置 访…...
数据结构与算法----顺序表和复杂度
嘻嘻,我们用c语言来手撕顺序表!!!全程高能比喻代码实战,保证你笑着学会!!! 引言 1、数据结构是计算机存储、组织数据的方式。算法是一系列计算步骤,用来将输入数据转化…...
Android studio局域网屏幕共享(旧手机可以用来当监控啦)
项目地址 https://github.com/Anyuersuper/ScreenSharing 百度网盘 通过网盘分享的文件:ScreenSharing-master.zip 链接: https://pan.baidu.com/s/1URQnyI8zJF-IFl5_-ttXBg?pwdyuer 提取码: yuer 📱 屏幕分享应用 (ScreenSharing) 📋 项目…...
Redis持久化之RDB
RDB持久化是将当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 1.触发机制 手动触发费别对应save和bgsave命令: save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较…...
Ubuntu 64-bit 交叉编译 FFmpeg(高级用户指南)
适用于 ARM (aarch64)、Windows (mingw)、Android、Raspberry Pi 等平台的交叉编译。 🔹 1. 安装交叉编译工具链 ARM (aarch64) 示例 sudo apt update sudo apt install gcc-aarch64-linux-gnu g-aarch64-linux-gnu binutils-aarch64-linux…...
YOLO V8中的“中心点邻近区域 + 动态IoU匹配“
它是联合优化正样本分配的策略,旨在更精准地匹配预测框与真实目标的位置关系。以下分步详解其原理: 1. 中心点邻近区域(Central Region) 1.1 目标中心区域定义 基础思想:将真实边界框ÿ…...
【MySQL | 八、 事务管理】
文章目录 什么是事务?事务的特性:事务的意义事务的提交查看事务提交方式事务的自动提交事务的手动提交开始事务执行SQL操作事务操作提交事务示例: 事务的隔离级别并发访问的基本概念并发事务的典型问题对ACID特性的影响查看和设置隔离属性各个…...
Ubuntu 下搭建 MCU 开发环境全流程指南(以 STM32 为例)
在嵌入式开发中,许多工程师都习惯于在 Windows 平台使用 Keil、IAR 等 IDE。然而,随着对自动化、可定制性以及开放工具链的需求增长,越来越多的开发者开始尝试在 Linux 环境下进行 MCU 开发。 本篇文章将以 STM32F1 系列 为例,手把手带你在 Ubuntu 下搭建一个完整的 MCU 开…...
Redis淘汰策略详解!
目录 一、为什么需要淘汰策略? 🤔二、Redis 的淘汰策略详解 👇三、如何选择合适的淘汰策略? 🤔➡️✅四、如何切换 Redis 的淘汰策略? ⚙️🔧五、总结 🎉 🌟我的其他文章…...
基于51单片机和TM1638模块的小游戏《打地鼠》
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、TM1638模块2、定时器03、定时器1 四、主函数总结 系列文章目录 前言 有两个版本,普中开发板版本和最小系统板版本,两个版本差别在于晶振频率不一样,其他的都相同。 本文代码…...
机器学习之数据预处理(一):缺失值处理和异常值识别的几种常用方法
始终致力于将复杂知识通俗化的不断追求中,不足之处欢迎批评指正。 1、噪声处理 噪声是一个测量变量中的随机错误或偏差,是观测值和真实值之间的误差,包括错误值或偏离期望的孤立点值。对于噪声的处理,通常可以采用数据平滑技术来…...
25/4/6 算法笔记<仿真O2DES>基础知识学习
此文章就来整理一下我学习到的O2DES仿真框架的一些核心知识 核心概念: 模拟器(Simulator):模拟器是O2DES框架的核心组件,用来管理模拟时钟,事件调度和执行。可以通过Simulator类创建模拟环境&#…...
Three.js 系列专题 3:光照与阴影
内容概述 光照是 3D 场景真实感的关键。Three.js 提供了多种光源类型,每种光源有不同的效果和用途。本专题还将介绍如何启用和优化阴影效果,提升场景的深度感。 学习目标 理解不同光源类型及其应用场景。掌握在 Three.js 中添加光源并启用阴影。学会调整阴影效果以平衡真实…...
接口自动化学习五:mock工具使用
Moco简介: Mock是一个简单搭建模拟服务器的框架,可以用来模拟http、https、socket等协议。 原理: Mock会根据一些配置,启动一个真正的HTTP服务(会监听本地的某个端口),当发起的请求满足某个条件时…...
Java学习——day22(Java反射基础入门)
文章目录 1.反射的定义2. 认识反射的关键API2.1 Class2.2 Field2.3 Method2.4 Constructor 3. 示例代码讲解与分析4. 编写反射示例代码的步骤4.1 定义测试类4.2 编写主程序,使用反射获取信息4.3 通过反射创建对象并调用方法 5. 总结6.今日生词 Java反射笔记 1.反射的…...
字符串、列表、元组、字典
字符串 双引号或者单引号中的数据,就是字符串 字符串输入 之前在学习input的时候,通过它能够完成从键盘获取数据,然后保存到指定的变量中; 注意:input获取的数据,都以字符串的方式进行保存,即…...
数据分析-Excel-学习笔记
Day1 复现报表聚合函数:日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格,首先要看这个表格个构成(包含了哪些数据),几行几列,每一列的名称…...
Nginx 常见面试题
一、nginx常见错误及处理方法 1.1 404 bad request 一般原因:请求的Header过大 解决办法: 配置nginx.conf 相关设置1. client_header_buffer_size 16k; 2. large_client_header_buffers 4 64k;1.2 413 Request Entity Too Large 一般原因࿱…...
Spring 中的 @Autowired 和 @Resource
🧩 一、Autowired 和 Resource 的基本作用 注解来源作用AutowiredSpring 提供(org.springframework.beans.factory.annotation.Autowired)按类型 自动注入ResourceJDK 提供(javax.annotation.Resource)默认按名称 注入…...
IAGCN:登上《Nature》的深度学习可解释性情感分析模型突破
IAGCN:登上《Nature》的深度学习可解释性情感分析模型突破 一、技术突破背景 社交媒体时代,用户生成内容的情感分析需求激增。传统方面级情感分析模型在复杂语境下存在特征交互捕捉不足、情感极性判定偏差等问题。微软亚洲研究院联合清华大学提出的交互…...
Go 学习笔记 · 进阶篇 · 第一天:接口与多态
🐶Go接口与多态:继承没了,但自由炸裂! 最近翻 Go 的代码,突然看到这么一段: type Animal interface {Speak() string }我一愣,咦?这不就是 Java 里常见的“接口”吗? …...
模运算:数字世界中的时空扭曲法则——从密码学到量子计算的跨维演绎
一、模宇宙基本定理:重构数字时空的底层逻辑 1.1 同余关系的时空折叠效应 在模运算创造的离散时空中,数字呈现出环状拓扑结构。当我们在模7空间观察时,12与5通过时空折叠达成量子纠缠:12 ≡ 5 (mod 7)。这种性质使得RSA加密算法…...
0303hooks-react-仿低代码平台项目
文章目录 1. 副作用2.其他内置hooks2.1 useEffect2.2 useRef2.3useMemo2.4 useCallback 3.自定义hooks4. 第三方hooks5. hooks使用原则6. hooks闭包陷阱7. 总结结语 1. 副作用 当组件渲染完成时,加载一个Ajax网络请求当某个state更新时,加载一个Ajax网络…...
Batch Normalization:深度学习训练的加速引擎
引言 在深度学习的发展历程中,训练深度神经网络一直是一项极具挑战性的任务。随着网络层数的增加,梯度消失、梯度爆炸以及训练过程中的内部协变量偏移(Internal Covariate Shift)问题愈发严重,极大地影响了模型的收敛…...
nacos的地址应该配置在项目的哪个文件中
在 Spring Boot 和 Spring Cloud 的上下文中,Nacos 的地址既可以配置在 bootstrap.yml 中,也可以配置在 application.yml 中,但具体取决于使用场景和需求。以下是两者的区别和最佳实践: 1. bootstrap.yml vs application.yml …...
【数据集】 PBMC(Peripheral Blood Mononuclear Cells)数据集
🧬 一、PBMC 数据集简介 内容描述名称Peripheral Blood Mononuclear Cells(外周血单个核细胞)细胞类型包括 B 细胞、T 细胞、NK 细胞、单核细胞等技术平台通常由 10x Genomics 提供(例如 3k、4k、6k、10k 版本)数据类…...
3. go-zero中如何使用redis
问题 go-zero项目相关文档中redis是这样配置的: Name: account.rpc ListenOn: 0.0.0.0:8080 Etcd:Hosts:- 127.0.0.1:2379Key: account.rpcMysql:Host: xxxx:3306User: rootPass: xxxData: mall-userCharset: utf8mb4Cache: - Host: 192.168.145.10:6379Type: nod…...
Redis基础知识
Redis基础知识 一、Redis简介 1.1 什么是Redis? Redis是一个开源的、基于内存的数据结构存储系统,可以用作: 数据库缓存消息中间件分布式锁 1.2 Redis特点 高性能:基于内存操作支持多种数据结构支持数据持久化支持主从复制支…...
每日c/c++题 备战蓝桥杯(求解三个数的最大公约数与最小公倍数)
求解三个数的最大公约数与最小公倍数(C/C实现) 引言 在数学计算和编程问题中,求多个数的**最大公约数(GCD)和最小公倍数(LCM)**是常见需求。本文将探讨如何高效求解三个数的GCD和LCMÿ…...
解决Win11耳机没有声音的问题
方法一:更新驱动程序(有效) 进入 “设置”(快捷键:WinX),点击 “Windows 更新” → “高级选项” 点击 “可选更新” ,然后点击 “驱动程序更新” 【注】:更新后可能会出…...
滤波电容的正负极线宽需要一致吗?
今天看到一个项目的滤波电容的正端采用铺铜处理增大过流能力,但是负极却仅仅打了两个地过孔,不仅产生疑问,这样做是否合理,滤波电容的正负极线宽需要一致吗? 搜寻资料的时候看到这样一个类似的问题: 这些人…...
使用 `pandas` 库来读取 Excel 文件,并实现六种算法的遍历计算
以下是一个满足你需求的 Python 程序示例。在这个示例中,我们假设已经有了处理数据的函数,并且生成的 Excel 文件中包含了观测数据和推算数据。我们将使用 pandas 库来读取 Excel 文件,并实现六种算法的遍历计算。 import pandas as pd# 模拟…...
【Linux】文件描述符访问Open、Read、Write
每个运行的程序被称为进程(process),它有一些与之关联的文件描述符。我们可以通过这些文件描述符来访问打开的文件或者设备。 一、文件描述符 什么是文件描述符? 概念:文件描述符(File Descriptor&#x…...
在 VS2022 中修复 Linux CMake 项目构建失败:从 Ninja 迁移到 Makefile
问题背景 在使用 Visual Studio 2022 开发跨平台 C 项目时,许多开发者会选择通过 WSL (Windows Subsystem for Linux) 直接在本地调试 Linux 环境下的程序。然而,近期在配置一个 CMake 项目时,遇到了以下报错࿱…...
ctf-show-mics2
下载文件用zip解压,将文件修改为flp文件 新建虚拟机,把文件添加到软盘 再次打开虚拟机会显示flag flag:flag{ctfshow}...
STM32_USB
概述 本文是使用HAL库的USB驱动 因为官方cubeMX生成的hal库做组合设备时过于繁琐 所以这里使用某大神的插件,可以集成在cubeMX里自动生成组合设备 有小bug会覆盖生成文件里自己写的内容,所以生成一次后注意保存 插件安装 下载地址 https://github.com/alambe94/I-CUBE-USBD-Com…...
Java 基础-32-枚举-枚举的应用场景
在Java编程中,枚举(Enum)提供了一种强大的方式来定义一组固定的常量。它们不仅限于简单的用途,还可以包含构造函数、方法和字段等高级功能,使其适用于多种不同的应用场景。本文将探讨几种常见的使用枚举的场景…...
新潮透明液体水珠水滴失真故障扭曲折射特效海报字体标题设计ps样机动作素材 Bubble Photoshop Templates
只需单击几下即可创建引人注目的视觉效果!您需要做的就是将您的文本或图像放入智能对象中并应用作。 包中包含: 15 个静态 Photoshop 模板(PS 2019 及更高版本) 01-05 垂直布局 (22504000)06-10 水平布局…...
学透Spring Boot — 017. 魔术师—Http消息转换器
本文是我的专栏《学透Spring Boot》的第17篇文章,了解更多请移步我的专栏: 学透 Spring Boot_postnull咖啡的博客-CSDN博客 目录 HTTP请求和响应 需求—新的Media Type 实现—新的Media Type 定义转换器 注册转换器 编写Controller 测试新的medi…...
stable diffusion 量化加速点
文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…...
Xorg内存管理机制深度解析
Xorg内存管理机制深度解析 一、客户端资源生命周期管理 Xorg 采用 客户端绑定型资源管理 机制,所有资源(窗口、像素图、字体等)的生命周期与客户端连接状态强关联。 资源 ID 分配机制: • 每个资源由 32位标识符 表示,格式:0xBBCCDDEE ◦ BB:客户端 ID(ClientIndex)…...
第五期:深入理解 Spring Web MVC [特殊字符]( 前后端交互的综合性练习)
✨ 前言:从理解到实战,彻底掌握 Spring MVC 前后端交互 当我们学习了 Spring MVC 中的各种注解、参数绑定、请求方式、编码处理以及 Cookie/Session 操作之后,下一步就是 —— 动手实践! 理论再多,不如亲自敲一次代码…...
ansible可视化自动化平台-semaphore
1、简介 Semaphore UI 是一个开源的CI/CD工具,专注于简化和自动化软件交付流程,可轻松管理和运行 Ansible playbook,提供了一个直观的 Web 用户界面(UI),帮助DevOps团队轻松管理任务、部署和流水线。 官网…...
手撕LLM(二):从源码出发,探索LoRA加载、推理全流程
接上回接着说,前面我们通过分析源码,了解了大模型推理的详细流程,包括提示词从输入,到对话模版包装,到tokenID转换,到Embedding词向量转换;通过大模型推理,再将大模型输出进行最后一…...