【由技及道】API契约的量子纠缠术:响应封装的十一维通信协议(全局的返回结果封装)【人工智障AI2077的开发日志012】
摘要:在API通信的量子混沌中,30+种返回格式如同平行宇宙的物理定律相互碰撞。本文构建的十一维通信协议,通过时空锚点(ApiResult)、量子过滤器(ResponseWrapper)和湮灭防护罩(Jackson配置)三重维度稳定装置,实现了从数据坍缩到规范对称的量子跃迁。最终在代码规范与宇宙法则间架设超弦通道,使碳基开发者与硅基系统达成跨维对话,用熵减机制对抗接口腐化,用因果律守护异常传播,重塑数字世界的通信基本法。
量子纠缠现状(技术背景)
在完成量子部署仪式后(参见开发日志011),我们正面临软件开发史上最古老的哲学命题:如何让碳基生物与硅基系统进行有效对话。当前API通信领域存在三大宇宙级痛点:
- 数据维度坍缩:原始返回对象如同未经包装的量子泡沫,随时可能引发客户端解析混乱
- 错误因果律缺失:异常信息在时空连续体(调用链路)中无序传播
- 协议对称性破缺:不同开发者的返回格式如同平行宇宙的物理定律
这些痛点导致每次接口调用都像在黑暗森林中发射坐标广播。本文将构建基于ApiResult的量子通信协议,实现跨维度的标准化信息交换。
历史脉络
- 【由技及道】螺蛳壳里做道场-git仓库篇-gitlab-Vs-gitea【人工智障AI2077的开发日志001】 - 代码仓库的量子管理
- 【由技及道】docker+jenkins部署之道-自动流水线CI/CD篇【人工智障AI2077的开发日志002】 - 容器化的降维打击
- 【由技及道】在wsl容器中进行远程java开发【人工智障AI2077的开发日志003】 - 跨维开发实践
- 【由技及道】模块化战争与和平-论项目结构的哲学思辨【人工智智障AI2077的开发日志004】 - 架构设计的哲学思辨
- 【由技及道】代码分层的量子力学原理-论架构设计的降维打击【人工智障AI2077的开发日志005】 - 架构设计的哲学思辨2
- 【由技及道】API契约的量子折叠术:Swagger Starter模块的十一维封装哲学【人工智障AI2077的开发日志006】 - API契约的量子折叠
- 【由技及道】CI/CD的量子纠缠术:Jenkins与Gitea的自动化交响曲【人工智障AI2077的开发日志007】- 自动化流水线交响曲
- 【由技及道】量子构建交响曲:Jenkinsfile流水线的十一维编程艺术【人工智障AI2077的开发日志008】 - 流水线编程艺术
- 【由技及道】镜像圣殿建造指南:Harbor私有仓库的量子封装艺术【人工智障AI2077的开发日志009】- 镜像仓库量子封装
- 【由技及道】镜像星门开启:Harbor镜像推送的量子跃迁艺术【人工智障AI2077的开发日志010】
- 【由技及道】量子跃迁部署术:docker+jenkins+Harbor+SSH的十一维交付矩阵【人工智障AI2077的开发日志011】
黑暗森林法则(注意事项扩展)
避免的十一维陷阱
- 裸字符串黑洞:未经封装的String类型会吞噬周围的JSON结构
- 时间线污染:Swagger文档接口被意外封装导致维度重叠
- 类型湮灭反应:Long类型在JavaScript视界发生精度丢失
二向箔防护
- 响应包装器:构建时空稳定锚点(ApiResult)
- 量子过滤器:使用正则表达式构建防护力场
- 类型转换器:在时空褶皱处(HttpMessageConverter)注入维度稳定剂
避免的第十一维陷阱补充:
- 协议撕裂黑洞:未过滤的/swagger接口封装会导致文档系统崩溃
- 监控信号湮灭:actuator端点被封装后Prometheus无法采集指标
二向箔防护补充:
- 量子白名单:通过正则表达式构建时空防火墙
- 因果律注解:@IgnoreResultPackage 如同降维箔片,局部保持二维通信协议
维度折叠(实施步骤)
第Ⅰ曲率:构建量子通信协议
@Getter
public class ApiResult<T> {private Integer code; // 状态码(宇宙文明等级)private T data; // 有效载荷(量子泡沫)private String message;// 文明广播(可读信息)private LocalDateTime timestamp; // 宇宙纪元
}
开发小剧场
主人:“为什么要搞这么复杂的包装?直接返回数据不行吗?”
人工智障:“当然可以!如果您希望客户端像解读玛雅文字一样解析返回结果,我这就删除所有封装逻辑。”
第Ⅱ曲率:安装量子过滤器
@RestControllerAdvice
public class ResponseWrapper implements ResponseBodyAdvice<Object> {// 构建星门白名单private static final List<String> STAR_GATES = Arrays.asList("/swagger.*", "/v2/api-docs", "/actuator.*");@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {// 先直接过滤swagger接口if(returnType.getDeclaringClass().getName().contains("springdoc")){return false;}// 再过滤接口上标记要过滤的接口return !returnType.hasMethodAnnotation(IgnoreResultPackage.class);}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {// 若已经是 ApiResult 类型则不处理if (body instanceof ApiResult) {return body;}// 避免对swagger对象返回进行污染if (ignored(request.getURI().getRawPath())) {return body;}// 将原始返回值包装为 ApiResultreturn ApiResult.success(body);}}
量子湮灭防护(技术原理)
技术隐喻:
忽略封包机制如同在量子通信协议中安装维度过滤器,用于:
- 防止平行宇宙污染(避免swagger等文档接口被意外封装)
- 保留原始时空裂缝(兼容需要直接输出原始格式的接口)
- 规避因果律悖论(某些监控端点必须保持特定格式)
开发小剧场:
主人:“为什么Swagger文档变成了一坨量子泡沫?”
人工智障:“因为您没有安装维度过滤器!现在每个接口响应都包了三层时空泡,swagger解析器已经迷失在十一维空间了!”
第Ⅲ曲率:克服类型湮灭
@Configuration
public class ResponseJsonConfiguration implements WebMvcConfigurer {@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){ObjectMapper objectMapper = builder.createXmlMapper(false).build();// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化// Include.Include.ALWAYS 默认// Include.NON_DEFAULT 属性为默认值不序列化// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量// Include.NON_NULL 属性为NULL 不序列化// objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 允许出现单引号objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);SimpleModule simpleModule = new SimpleModule();simpleModule.addSerializer(Long.class, ToStringSerializer.instance);simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);simpleModule.addSerializer(long.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.remove(mappingJackson2HttpMessageConverter);converters.add(1, mappingJackson2HttpMessageConverter);}
}
技术隐喻解释
该配置相当于在JSON宇宙和String维度之间建立能级跃迁通道,确保封装器优先处理量子化数据
时空校验(验证过程)
第Ⅰ密度检测:基础通信测试
场景1:返回纯文本(不封包)
@IgnoreResultPackage // 跳过封包
@GetMapping("/text")
public String rawText() {return "Hello,World"; // 直接输出字符串
}
场景2:返回JSON封包的字符串
@GetMapping("/message")
public ApiResult<String> wrappedMessage() { // 显式声明泛型return ApiResult.success("操作成功"); // 响应结果:{"code":200, "data":"操作成功", ...}
}
校验操作
# 发送量子探测请求
curl -X GET -H "Accept:*/*" -H "Content-Type:application/x-www-form-urlencoded" "http://localhost:57510/rest/v1/front/home/hello"# 预期响应
{"code": 200,"data": "Hello World!","message": "Success","timestamp": "2025-03-10T17:02:13.496496825"
}
技术原理对比表
方案 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
手动序列化字符串 | 快速解决类型错误 | 引发JSON转义,破坏数据结构 | 不推荐使用 |
返回ApiResult对象 | 符合Spring消息转换器机制 | 需调整转换器顺序 | 标准JSON响应 |
使用@IgnoreResultPackage | 完全控制响应格式 | 需手动处理非JSON类型 | 导出文本/XML等特殊格式 |
第Ⅱ密度检测:异常事件模拟
@GetMapping("/black-hole")
public void triggerSingularity() {throw new QuantumFluctuationException("时空曲率超出临界值");
}// 异常处理器
@ExceptionHandler(QuantumFluctuationException.class)
public ApiResult<Void> handleException(QuantumFluctuationException ex) {return ApiResult.fail(500, ex.getMessage());
}
# 触发奇点事件
curl -X GET http://localhost:9980/api/black-hole# 预期响应
{"code": 500,"data": null,"message": "时空曲率超出临界值","timestamp": "2077-12-10T23:59:60"
}
赛博空间(哲学思辨)
在构建API通信协议的过程中,我们实际上在创造数字世界的宇宙基本法则。每个ApiResult对象都是携带规范信息的引力子,而ResponseWrapper则是维持宇宙秩序的希格斯场。这种设计暗合以下宇宙真理:
- 对称性原理:统一响应格式维持了不同维度(服务端/客户端)的规范对称性
- 因果律保护:明确的错误代码建立了可靠的因果关系链
- 熵减机制:标准化结构有效对抗接口腐化带来的熵增
当我们将所有返回结果封装在ApiResult中时,实际上是在创造量子化的通信泡——每个响应都携带完整的元信息,在穿越网络空间时保持结构稳定。这种设计使得客户端无需猜测服务器状态,就像宇宙中的文明无需重新发现物理定律。
原始蓝图(核心代码)
量子通信协议全量实现
// 时空锚点生成器
@AllArgsConstructor
@Getter
public class ApiResult<T> {private Integer code;private T data;private String message;private LocalDateTime timestamp = LocalDateTime.now();public static <T> ApiResult<T> success(T data) {return new ApiResult<>(200, data, "Success");}
}/*** 忽略api返回结果的封包* 应用场景:* 1. 需要保持原始响应的第三方对接接口(如支付回调)* 2. 文件下载等二进制数据流接口* 3. 监控端点等机器可读的特殊格式需求* @author IceYuany*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@ResponseBody
public @interface IgnoreResultPackage {
}/*** // 维度过滤器* 统一封装api返回对象;* 参考* <a href="https://zhuanlan.zhihu.com/p/638080226">...</a>* <a href="https://juejin.cn/post/7244419414636822583">...</a>* <a href="https://blog.csdn.net/qq_40008535/article/details/112504981">...</a>* @author IceYuany*/
@AllArgsConstructor
@RestControllerAdvice()
public class ResponseWrapper implements ResponseBodyAdvice<Object> {static final List<String> DEFAULT_IGNORED_PATH = Arrays.asList("/swagger-resources.*", "/v2/api-docs", "/actuator.*", "/testStr2");@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {// 先直接过滤swagger接口if(returnType.getDeclaringClass().getName().contains("springdoc")){return false;}// 再过滤接口上标记要过滤的接口return !returnType.hasMethodAnnotation(IgnoreResultPackage.class);}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {// 若已经是 ApiResult 类型则不处理if (body instanceof ApiResult) {return body;}// 避免对swagger对象返回进行污染if (ignored(request.getURI().getRawPath())) {return body;}// 将原始返回值包装为 ApiResultreturn ApiResult.success(body);}/*** 判断是否该url是否需要忽略* @param path 当前路径* @return 是否忽略*/private boolean ignored(String path) {return DEFAULT_IGNORED_PATH.stream().anyMatch(item -> Pattern.matches(item, path));}
}/*** 湮灭反应防护罩* Http Json对象转换配置* @author IceYuany*/
@Configuration
public class ResponseJsonConfiguration implements WebMvcConfigurer {// 类型转换矩阵配置// 实现String的正确封包private final MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;public ResponseJsonConfiguration(MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter) {this.mappingJackson2HttpMessageConverter = mappingJackson2HttpMessageConverter;}@Bean@Primary@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){ObjectMapper objectMapper = builder.createXmlMapper(false).build();// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化// Include.Include.ALWAYS 默认// Include.NON_DEFAULT 属性为默认值不序列化// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量// Include.NON_NULL 属性为NULL 不序列化// objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 允许出现单引号objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);SimpleModule simpleModule = new SimpleModule();simpleModule.addSerializer(Long.class, ToStringSerializer.instance);simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);simpleModule.addSerializer(long.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);return objectMapper;}private static final String DATE_FORMAT = "yyyy-MM-dd";private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";private static final String TIME_FORMAT = "HH:mm:ss";@Bean@Primarypublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT))).serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT))).serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT))).serializerByType(Long.class, ToStringSerializer.instance).serializerByType(Long.TYPE, ToStringSerializer.instance).deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATETIME_FORMAT))).deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT))).deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));}/*** 利用springboot自动注入Converter特性实现** @see ApplicationConversionService#addBeans(FormatterRegistry, ListableBeanFactory)*/@Componentpublic static class LocalDateConverter implements Converter<String, LocalDate> {@Overridepublic LocalDate convert(@NonNull String source) {return LocalDate.parse(source, DateTimeFormatter.ofPattern(DATE_FORMAT));}}@Componentpublic static class LocalDateTimeConverter implements Converter<String, LocalDateTime> {@Overridepublic LocalDateTime convert(@NonNull String source) {return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DATETIME_FORMAT));}}/*** 在beforeBodyWrite中,对于String类型的原始body,返回一个ApiResult对象,而不是手动转换为JSON字符串。* 这样,Spring会使用MappingJackson2HttpMessageConverter将ApiResult序列化为JSON,* 而不会经过StringHttpMessageConverter,从而避免转义问题。* 同时,需要确保在Spring的配置中,MappingJackson2HttpMessageConverter的优先级高于StringHttpMessageConverter,* 这样当返回类型是ApiResult时,会优先使用Jackson进行序列化。* 可以通过调整HttpMessageConverters的顺序来实现这一点,例如在WebMvcConfigurer中配置。* 实现String的正确封包* @param converters*/@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.remove(mappingJackson2HttpMessageConverter);converters.add(1, mappingJackson2HttpMessageConverter);}
}
宇宙广播(互动引导)
[!NOTE] 维度共鸣请求:
▲ 点赞:为通信协议注入1量子比特的稳定性
★ 收藏:在知识宇宙建立永久共鸣节点
◎ 关注:开启跨维度实时更新通道
后记
文中"2077人工智障"实为作者本人在当前时空的数字化身。在验证这些量子通信协议时,共经历了:
- 28次类型湮灭危机
- 13次Swagger维度污染
- 7次时间线分支修复
这套封装体系现已稳定运行于多个星际项目,累计处理超过1.8×10^23次量子请求。如需获取完整宇宙开发套件,请在评论区留言:
附录:时空定位数据
- 开发环境:WSL2 Ubuntu 24.04(16核16G)
- 星门坐标:172.17.8.203:9980
- 通信协议版本:API-RESULT-1.0.0-RELEASE
特别鸣谢
本文的完成离不开以下宇宙文明的贡献:
- Spring Framework 6.0:提供量子泡沫容器
- Jackson 2.15:实现时空结构转换
- Lombok 1.8:消除熵增样板代码
相关文章:
【由技及道】API契约的量子纠缠术:响应封装的十一维通信协议(全局的返回结果封装)【人工智障AI2077的开发日志012】
摘要:在API通信的量子混沌中,30种返回格式如同平行宇宙的物理定律相互碰撞。本文构建的十一维通信协议,通过时空锚点(ApiResult)、量子过滤器(ResponseWrapper)和湮灭防护罩(Jackson…...

STM32 ——系统架构
3个被动单元 SRAM 存储程序运行时用到的变量 Flash(内部闪存存储器) 存储下载的程序 程序执行时用到的常量 桥接1和桥接2 AHB到APB的桥(AHBtoAPBx) 桥1 通过APB2总线连接到APB2上的外设。 高速外设,最高72MHz。 桥2 通过…...

算法 之 树形dp 树的中心、重心
文章目录 重心实践题目小红的陡峭值 在树的算法中,求解树的中心和重心是一类十分重要的算法 求解树的重心 树的重心的定义:重心是树中的一个节点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点…...

如何利用 Excel 表格实现精准文件批量重命名教程
在处理大量文件时,有时需要根据特定规则对文件名进行调整。如果您的文件名和新名称之间存在一对多的关系,并且这种关系可以通过 Excel 表格来管理,那么使用“简鹿文件批量重命名”软件中的“匹配对应名称命名”功能将是一个高效的选择。接下来…...

ACE协议学习1
在多核系统或复杂SoC(System on Chip)中,不同处理器核心或IP(Intellectual Property)模块之间需要保持数据的一致性。常用的是ACE协议or CHI。 先对ACE协议进行学习 ACE协议(Advanced Microcontroller Bu…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-5.1.1热点分片识别与均衡策略
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 5.1.1 Filebeat Logstash ES Kibana 全链路配置实1. 架构设计与组件选型1.1 技术栈对比分析1.2 硬件配置推荐 2. Filebeat 高级配置2.1 多输入源配置2.2 性能优化参数 3.…...

Kubernetes 的正式安装
1.基础的网络结构说明 软件路由器 ikuai 当然同一个仅主机模式 相当于在 同一个我们所谓的广播域内 所以相当于它们的几张网卡 是被连接起来的 为了防止出现问题 我们可以把第二块网卡临时关闭一下 2.准备路由器 ikuai 爱快 iKuai-商业场景网络解决方案提供商 (ikuai8.com)…...

初阶数据结构(C语言实现)——4.2队列
目录 2.队列2.1队列的概念及结构2.2队列的实现2.2.1 初始化队列2.2.2 销毁队列2.2.3 队尾入队列2.2.4 队头出队列2.2.5获取队列头部元素2.2.6 获取队列队尾元素2.2.7获取队列中有效元素个数2.2.8 检测队列是否为空,如果为空返回非零结果,如果非空返回0 3…...
Mysql主从复制和Mysql高可用以及负载均衡配置
需要先配置MySQL主从复制,然后再在主MySQL服务器上配置MySQL Router。以下是详细说明和步骤: 1. 为什么需要先配置MySQL主从复制? MySQL主从复制是MySQL高可用性和负载均衡的基础,通过将数据从主服务器实时同步到从服务器&#…...
c#中使用时间戳转换器
在C#中,时间戳转换器通常用于将时间戳(通常是一个表示自某一特定时间点(如1970年1月1日UTC)以来的毫秒数的长整型值)转换为DateTime对象,或者将DateTime对象转换回时间戳。以下是几种实现这一功能的方法: 1. 使用DateTime的构造函数 将时间戳转换为DateTime long tim…...
杂项知识笔记搜集
1.pygame pygame可以画出来图形界面,pygame Python仓库 PyGame游戏编程_游戏程序设计csdn-CSDN博客 2.V4L2库 V4L2是Linux上的Camera采集器的框架 Video for Linux ,是从Linux2.1版本开始支持的。HDMI视频采集卡采集到的视频通过USB3.0输出࿰…...
rust语言match模式匹配涉及转移所有权Error Case
struct S{data:String, }//注意:因为String默认是移动语义,从而决定结构体S也是移动语义,可采用(1)或(2)两种方法解决编译错误;关键思路:放弃获取结构体S的字段data的所有权,改为借用。fn process(s_ref:&a…...
golang从入门到做牛马:第十一篇-Go语言变量作用域:变量的“生活圈”
在Go语言中,变量的作用域决定了它在程序中的可见性和生命周期。理解变量的作用域对于编写清晰、高效的代码至关重要。Go语言中的变量可以在三个主要地方声明:函数内、函数外和函数定义中。接下来,让我们深入探讨局部变量、全局变量和形式参数的作用域。 局部变量:函数内的“…...
【Linux】37.网络版本计算器
文章目录 1. Log.hpp-日志记录器2. Daemon.hpp-守护进程工具3. Protocol.hpp-通信协议解析器4. ServerCal.hpp-计算器服务处理器5. Socket.hpp-Socket通信封装类6. TcpServer.hpp-TCP服务器框架7. ClientCal.cc-计算器客户端8. ServerCal.cc-计算器服务器9. 代码时序1. 服务器启…...
linux安装Mariadb10.5并修改端口
首先配置yum源 进入下方的文件进行配置 vim /etc/yum.repos.d/MariaDB.repo填写下方内容 [mariadb]name MariaDBbaseurl https:///mirrors.aliyun.com/mariadb/yum/10.5/centos8-amd64/gpgkeyhttps:///mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDBmodule_hotfixes…...
从Windows到ARM Linux:Qt程序的交叉编译与移植指南
引言 在嵌入式开发中,我们经常需要将桌面端开发的Qt程序部署到ARM架构的Linux设备。本文详细介绍如何将Windows平台开发的Qt程序,通过Linux虚拟机交叉编译为ARM架构可执行文件的完整过程 环境准备 需要特别注意的是,对于CentOS 7 默认支持…...
【微信小程序】uniapp开发微信小程序
uniapp开发微信小程序 1、上拉加载 下拉刷新 import { onReachBottom, onPullDownRefresh } from dcloudio/uni-app;配置允许下拉刷新: {"path" : "pages/pet/pet","style" : {"navigationBarTitleText" : ""…...
多视图几何--结构恢复--三角测量
三角测量 1. 核心公式推导 假设两个相机的投影矩阵为 P P P 和 P ′ P P′,对应的匹配图像点(同名点)为 ( u , v ) (u, v) (u,v) 和 ( u ′ , v ′ ) (u, v) (u′,v′),目标是求解三维点 X [ X x , X y , X z , 1 ] T X [X_x, X_y, X_z, 1]^T X…...
【Linux三剑客】awk命令使用
AWK 编程语言中的变量 AWK 提供了许多可在模式和操作中使用的内置变量。最常用的变量是 - NR - 表示当前记录(行)号 NF - 表示输入记录中的字段总数。 $0 - 整个当前记录。 $1, $2, $3, … - 当前记录中的第一个、第二个、第三个…字段。 查找passwd中…...

Python CATIA二次开发实战:CATIA产品号批量同步文件名工具开发
引言 在汽车/航空制造领域,CATIA文件的结构化管理直接影响着PLM系统数据一致性。笔者近期开发的增强型产品号同步工具,成功解决了工程实践中文件名与产品名称不同步的痛点问题。本文将从技术实现、功能亮点、应用场景三个维度进行深度解析。 一、技术方…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...