如何使用CAPL解析YAML文件?
- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
📘前言
- 🍅 在基于
CAPL
编写测试用例时,时常会用到配置文件,虽然CAPL内置了对INI
配置文件的读写函数,不过INI
配置文件比较简单,无法记录较为复杂的数据结构,而YAML
配置文件 是一种人性化的数据序列化格式,功能强大,适用于所有编程语言,但是CAPL
语言并没有函数支持解析YAML
文件,本文就基于C++
的开源库yaml-cpp
创建一个动态链接库,以实现CAPL
对YAML
文件的支持。
目录
- 📘前言
- 📙 1、YAML文件语法简介
- 📙 2、CAPL 示例
- 📙 2.1、读取标量(Yaml_GetScalarValue)
- 📙 2.2、读取列表(Yaml_GetListValues)
- 📙 2.3、读取字典(Yaml_GetMapValue)
- 📙 3 编译和应用yaml-cpp库
- 📙 3.1 编译
- 📙 3.2 配置
- 📙 4、示例工程和源码获取
📙 1、YAML文件语法简介
YAML (YAML Ain't Markup Language)
是一种人类友好的数据序列化标准,适用于所有编程语言。它具有以下特点:
1.1 基本结构:
- 大小写敏感。
- 使用缩进表示层级关系(通常2个空格)(YAML对缩进非常敏感,必须使用空格(不能使用制表符),且同一层级元素必须对齐)
- 使用-表示列表项
- 使用key: value表示键值对
1.2 主要特性:
支持三种基本数据结构:
- 标量(字符串、数字、布尔值等)
- 序列(数组/列表)
- 映射(字典/键值对)
1.3 示例结构:
# 注释以#开头
简单键值:key1: value1key2: value2列表示例:- 项目1- 项目2- 项目3嵌套结构:parent:child1: 值1child2: 值2children:- 子项1- 子项2多行字符串: |这是多行文本内容
1.4 数据类型支持:
- 字符串(默认不需要引号)
- 数字(整数、浮点数)
- 布尔值(true/false)
- null(用~或null表示)
- 时间日期(ISO8601格式)
1.5 优势:
- 可读性强,结构清晰
- 适合配置文件和数据交换
- 支持跨平台和跨语言
- 比JSON更灵活,比XML更简洁
1.6 典型应用场景:
- 配置文件(如Docker Compose、Kubernetes)
- 数据序列化
- 测试用例定义
- CI/CD管道配置
📙 2、CAPL 示例
如下图所示,基于C++开源库yaml-cpp封装的可以在CAPL中使用的yaml_demo.dll,主要函数接口:
-
long Yaml_GetScalarValue(const char* filename, const char* key, char* returnValue, long returnValueSize, char* error_info, long error_info_size)
:读取yaml文件中的标量- filename:yaml文件路径
- key:读取的键值对的key ,可以通过
settings.debug
的方式读取嵌套的内层的参数 - returnValue:无论是布尔/数值/字符串类型变量,都以字符串的方式返回
- returnValueSize:returnValue参数的最大长度
- error_info:如果解析yaml文件失败,失败信息通过该参数返回
- error_info_size::error_info参数的最大长度
- 返回值:读取成功,返回值为1,否则返回值为-1
-
long Yaml_GetListValues(const char* filename, const char* key, char returnValues[][1024], long maxReturnValues, char* error_info, long error_info_size)
:读取yaml文件中的列表- returnValues:二维字符串数组,yaml文件中的列表参数无论什么类型都转为字符串类型返回,
注意这里以C语言类型的数组传参,要求CAPL语言中定义的接收数组的字节数也必须是1024
。 - maxReturnValues:允许返回的列表的最大元素数
- 返回值:读取成功,返回值为读取的列表的元素个数,否则返回值为-1
- returnValues:二维字符串数组,yaml文件中的列表参数无论什么类型都转为字符串类型返回,
-
long Yaml_GetMapValue(const char* filename, const char* key, char* returnValue, long returnValueSize, char* error_info, long error_info_size)
:读取yaml文件中的字典,参数定义和GetScalarValue
函数一致,唯一不同的是GetMapValue函数读取的字典数据以json字符串的方式返回。*说明:这个dll只实现了读取yaml文件,没有实现写入yaml文件。*
- 该
CANoe Demo
工程下有个Config.yaml
文件,内容如下:
# config.yaml
name: Example Project
version: 1.0.0
dependencies: #yaml风格的列表- library1- library2- library3
system: [linux,window,mac] #json风格的列表settings:debug: truemax_connections: 100timeout: 30.5description: This is a sample project中文: 支持中文颜色: # 中文参数- 红色- 绿色- 蓝色nested_structure:level1:level2:level3: deep_value
list_of_maps:- name: item1value: 10- name: item2value: 20- name: item3value: 30
mixed_list:- string_value- 42- 3.14- true-
nested_key: nested_value
empty_value: null
📙 2.1、读取标量(Yaml_GetScalarValue)
- 如下CAPL脚本,分多种情况读取
标量
参数
/*@!Encoding:65001*/
includes
{#pragma library("yaml_demo.dll") // X86 平台
}
variables
{char filename[100] = "node\\Config.yaml";char returnValue[4096];char List_returnValue[100][1024];char error_info[256];long result;
}
on key 'e'
{//获取普通的标量result = Yaml_GetScalarValue(filename,"name",returnValue,elcount(returnValue),error_info,elcount(error_info));write("name = %s",returnValue); //获取字典的一个元素,值为布尔类型(转为字符串输出)result = Yaml_GetScalarValue(filename,"settings.debug",returnValue,elcount(returnValue),error_info,elcount(error_info));write("settings.debug = %s",returnValue); //获取字典的一个标量元素,值为字浮点数类型(转为字符串输出)result = Yaml_GetScalarValue(filename,"settings.timeout",returnValue,elcount(returnValue),error_info,elcount(error_info));write("settings.timeout = %s",returnValue); //获取字典的一个标量元素,值为字符串类型(转为字符串输出)result = Yaml_GetScalarValue(filename,"settings.description",returnValue,elcount(returnValue),error_info,elcount(error_info));write("settings.description = %s",returnValue); //获取字典嵌套的一个标量元素result = Yaml_GetScalarValue(filename,"nested_structure.level1.level2.level3",returnValue,elcount(returnValue),error_info,elcount(error_info));write("nested_structure.level1.level2.level3 = %s",returnValue); //获取字典嵌套的一个标量元素(中文字符)result = Yaml_GetScalarValue(filename,"settings.中文",returnValue,elcount(returnValue),error_info,elcount(error_info));write("settings.中文 = %s",returnValue); //获取字典嵌套的一个列表元素的元素result = Yaml_GetScalarValue(filename,"list_of_maps.name",returnValue,elcount(returnValue),error_info,elcount(error_info));write("list_of_maps.name = %s",returnValue);
}
- 测试结果如下:
Program / Model name = Example Project
Program / Model settings.debug = true
Program / Model settings.timeout = 30.5
Program / Model settings.description = This is a sample project
Program / Model nested_structure.level1.level2.level3 = deep_value
Program / Model settings.中文 = 支持中文
Program / Model list_of_maps.name = item1
📙 2.2、读取列表(Yaml_GetListValues)
- 读取列表的示例CAPL脚本如下:
on key 'r'
{long i;//获取一个列表result = Yaml_GetListValues(filename,"dependencies",List_returnValue,elcount(List_returnValue),error_info,elcount(error_info));for(i =0;i<result;i++)write("dependencies[%d] = %s",i,List_returnValue[i]);//获取一个列表(json风格)result = Yaml_GetListValues(filename,"system",List_returnValue,elcount(List_returnValue),error_info,elcount(error_info));for(i =0;i<result;i++)write("system[%d] = %s",i,List_returnValue[i]);//获取字典的一个列表元素,且支持中文result = Yaml_GetListValues(filename,"settings.颜色",List_returnValue,elcount(List_returnValue),error_info,elcount(error_info));for(i =0;i<result;i++)write("settings.颜色[%d] = %s",i,List_returnValue[i]);//获取字典的一个列表元素,列表嵌套字典类型result = Yaml_GetListValues(filename,"list_of_maps",List_returnValue,elcount(List_returnValue),error_info,elcount(error_info));for(i =0;i<result;i++)write("list_of_maps[%d] = %s",i,List_returnValue[i]);
}
- 测试结果如下:
Program / Model dependencies[0] = library1
Program / Model dependencies[1] = library2
Program / Model dependencies[2] = library3
Program / Model system[0] = linux
Program / Model system[1] = window
Program / Model system[2] = mac
Program / Model settings.颜色[0] = 红色
Program / Model settings.颜色[1] = 绿色
Program / Model settings.颜色[2] = 蓝色
Program / Model list_of_maps[0] = {"name":"item1","value":"10"}
Program / Model list_of_maps[1] = {"name":"item2","value":"20"}
Program / Model list_of_maps[2] = {"name":"item3","value":"30"}
📙 2.3、读取字典(Yaml_GetMapValue)
- 读取字典的示例CAPL脚本如下:
on key 'y'
{long i;//获取一个字典,以json字符串的方式返回result = Yaml_GetMapValue(filename,"settings",returnValue,elcount(returnValue),error_info,elcount(error_info));write("result = %d ,returnValue = %s",result,returnValue);
}
- 测试结果如下:
Program / Model result = 1 ,returnValue = {"debug":"true","max_connections":"100","timeout":"30.5","description":"This is a sample project","中文":"支持中文","颜色":["红色","绿色","蓝色"]}
📙 3 编译和应用yaml-cpp库
📙 3.1 编译
编译C++库的一般步骤
1,下载开源库
git clone https://github.com/jbeder/yaml-cpp.git
如果上述下载失败或者没有安装git,可以选择手动下载 yaml-cpp 中国镜像地址
2、下载cmake
Cmake 下载官网,安装包类型:
- Windows: .msi 或 .zip 格式
- macOS: .dmg 或 .tar.gz 格式
- Linux: 源码或特定发行版的二进制包
对于 Windows 用户,建议下载 .msi 安装包(如 cmake-3.28.1-windows-x86_64.msi),安装时勾选 “Add CMake to system PATH” 以便命令行直接使用。
3,编译yaml-cpp
这里要注意编译的平台和类型,比如我这里在使用yaml-cpp编译的库创建动态库时的配置时X86平台,配置是Debug
类型,所以下面的编译参数就是-A Win32 -DCMAKE_BUILD_TYPE=Debug,
编译完成后,会在.\build\Debug
路径下生成一个yaml-cppd.lib
文件,这就是编译的库文件
cd yaml-cpp
mkdir build
cd build
cmake .. -A Win32 -DCMAKE_BUILD_TYPE=Debug
cmake --build . --config Debug
📙 3.2 配置
在Visual studio中手动配置yaml-cppd.lib
文件的步骤如下
1、项目属性 → C/C++ → 常规 → 附加包含目录:
path\to\yaml-cpp\include
2、项目属性 → 链接器 → 常规 → 附加库目录:
path\to\yaml-cpp\build\Debug
3、项目属性 → 链接器 → 输入 → 附加依赖项:
yaml-cppd.lib
4、示例代码
#define YAML_CPP_STATIC_DEFINE // 如果使用静态库
#include <yaml-cpp/yaml.h>int main() {YAML::Node config = YAML::LoadFile("config.yaml");std::string name = config["name"].as<std::string>();return 0;
}
5、常见问题解决
编译错误:
- 确保 Visual Studio 工具链选择的是 x86
- 清理 build 目录重新生成
链接错误:
- 检查是否正确定义了 YAML_CPP_STATIC_DEFINE
- 确保 Debug/Release 配置匹配
📙 4、示例工程和源码获取
- 🍅 基于CAPL语法生成的解析YAML配置文件的DLL文件(CANoe工程文件)
- 🍅 基于CAPL语法生成的解析YAML配置文件DLL(C++源码以及CANoe工程Demo)
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
相关文章:
如何使用CAPL解析YAML文件?
🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…...
如何让老电脑运行快些(极限榨干老电脑硬件)
要让老电脑运行更快,可以通过增加虚拟内存、优化系统设置和硬件升级等方法实现。以下是具体建议: 1. 增加虚拟内存(适合硬盘空间大的老电脑) 虚拟内存(页面文件)是硬盘上的一部分空间,用于扩展…...
C++在嵌入式中表现如何?
C在嵌入式中表现如何? 作为一个从机械转行到嵌入式开发的老兵,我深深体会到了C在嵌入式领域的独特魅力与挑战。从最初在厦门某马写单片机代码时的纯C语言,到后来在世界500强外企开发汽车电子项目时大量使用C,这些年的经历让我对这…...
Elasticsearch 系列专题 - 第四篇:聚合分析
聚合(Aggregation)是 Elasticsearch 的强大功能之一,允许你对数据进行分组、统计和分析。本篇将从基础到高级逐步讲解聚合的使用,并结合实际案例展示其应用。 1. 聚合基础 1.1 什么是聚合(Aggregation)? 聚合是对文档集合的统计分析,类似于 SQL 中的 GROUP BY 和聚合…...
TensorFlow充分并行化使用CPU
关键字:TensorFlow 并行化、TensorFlow CPU多线程 场景:在没有GPU或者GPU性能一般、环境不可用的机器上,对于多核CPU,有时TensorFlow或上层的Keras默认并没有完全利用机器的计算能力(CPU占用没有接近100%)…...
JAVA Web_定义Servlet_1 欢迎考生
题目 假定:本地服务器(127.0.0.1)上有一名为jspExam的Web项目,现按要求定义一Servlet,实现以下功能: 1)Servlet的类名自定义,假定可以用以下url访问该Servlet, http://127.0.0.1:80…...
鸿蒙NEXT开发Emitter工具类(ArkTs)
import { emitter } from kit.BasicServicesKit;/*** TODO Emitter工具类(进行线程间通信)* author: 鸿蒙布道师* since: 2025/04/11*/ export class EmitterUtil {/*** 发送事件* param eventId 事件ID,string类型的eventId不支持空字符串。…...
vue项目引入tailwindcss
vue3项目引入tailwindcss vue3 vite tailwindcss3 版本 初始化项目 npm create vitelatest --template vue cd vue npm install npm run dev安装tailwindcss3 和 postcss 引入 npm install -D tailwindcss3 postcss autoprefixer // 初始化引用 npx tailwindcss init -p…...
Quartz修仙指南:从定时任务萌新到调度大能的终极奥义
各位被Thread.sleep()和ScheduledExecutorService折磨的道友们!今天要解锁的是Java界任务调度至尊法宝——Quartz!这货能让你像玉皇大帝安排天庭日程一样,精确控制每个任务的执行时机!准备好告别蹩脚的手动定时器了吗?…...
Process Explorer 性能调优实战:精准定位资源泄漏与高负载进程
一、下载与安装 下载地址 Process Explorer安装包下载:https://pan.quark.cn/s/950c36ba5364下载后解压压缩包,运行 procexp.exe(32 位系统)或 procexp64.exe(64 位系统)。 界面概览 主界面以树…...
Docker 常用命令指南
Docker 提供了丰富的命令行工具来管理镜像、容器、网络和数据卷等资源。本指南按类别整理 Docker 的常用命令,并为每个命令提供简体中文说明和示例,以帮助您快速查询和掌握日常使用。 1. 镜像管理 Docker 镜像(Image)是打包好的应用程序及其依赖环境,可用于创建容器。常用…...
3.1A、34V DC/DC 同步降压转换器WD5034
以下是对 WD5034 相关内容的编辑: WD5034 是一款性能卓越的高效率、单片同步降压 DC/DC 转换器,凭借其先进的恒定频率、平均电流模式控制架构,在众多电源管理芯片中脱颖而出。以下是其详细特点和优势: 出色的负载能力:…...
面向对象高级(1)
文章目录 final认识final关键字修饰类:修饰方法:修饰变量final修饰变量的注意事项 常量 单例类什么是设计模式?单例怎么写?饿汉式单例的特点是什么?单例有啥应用场景,有啥好处?懒汉式单例类。 枚举类认识枚…...
Vim 编辑器的常用快捷键介绍
以下是 Vim 编辑器的常用快捷键分类介绍,帮助你快速掌握高效编辑技巧: 一、基础模式切换 Vim 的核心是 模式化操作,常用模式包括: 普通模式(默认):导航、命令输入。插入模式:输入/…...
如何使用AI辅助开发R语言
R语言是一种用于统计计算和图形生成的编程语言和软件环境,很多学术研究和数据分析的科学家和统计学家更青睐于它。但对与没有编程基础的初学者而言,R语言也是有一定使用难度的。不过现在有了通义灵码辅助编写R语言代码,我们完全可以用自然语言…...
docker 运行自定义化的服务-后端
docker 运行自定义化的服务-前端-CSDN博客 运行自定义化的后端服务 具体如下: ①打包后端项目,形成jar包 ②编写dockerfile文件,文件内容如下: # 使用官方 OpenJDK 镜像 FROM jdk8:1.8LABEL maintainer"ATB" version&…...
【Grok 大模型深度解析】第二期:架构探秘与训练哲学
在上一期的内容中,我们对 Grok 大模型从技术溯源的角度,了解了它从 Transformer 架构局限性出发,迈向混合架构创新的历程,同时也梳理了从 Grok - 1 到 Grok - 3 的版本迭代所带来的技术跃迁以及其独特的差异化优势。这一期,我们将深入到 Grok 大模型的架构内部,探究其精妙…...
oracle update 原理
Oracle 11g 中的 UPDATE 操作是数据库修改数据的关键机制,其核心原理涉及事务管理、多版本并发控制(MVCC)、Undo/Redo 日志、锁机制等 1. 执行前的准备 SQL 解析与执行计划: Oracle 解析 UPDATE 语句,生成执行计划&…...
优化项目缓慢卡顿
大家好,好久不见,因为最近在搞几个老项目,没怎么跟大家见面。在做老项目的时候发现了一些小问题拿出来跟大家分享分享。 因为这个问题是生产环境下面出现的,所以在开发环境的时候很难发现,而且网速快的话也很难发现&a…...
【黑客帝国连接虚拟与现实:数据采集系统(DAQ)硬核技术深度解析】
1. DAQ系统核心架构:从物理世界到数字域的精密映射 1.1 传感器与信号调理:物理量到电信号的精准转换 传感器的物理原理与非线性补偿 热电偶(Thermocouple):基于塞贝克效应,其输出电压与温度差的非线性关系…...
解决unity设置鼠标图标发布以后没有效果的问题
public Texture2D dragCursor; Cursor.SetCursor(dragCursor, Vector2.zero, CursorMode.Auto); 首先设置一个Texture2D的变量,用来保存自己想要设置的图,然后将鼠标设置为自己定义的图片。原本是很简单的功能,而且在编辑器里面运行也正常。…...
CExercise_10_1动态数组Vector
题目: 动手自己实现动态数组Vector,基于以下结构体定义和函数声明: typedef int ElementType; typedef struct { ElementType *data; // 指向堆空间的数组 int size; // 元素的个数 int capacity; // 数组的容量 } Vector; // 请实现下面方法…...
Nextra + TypeScript + MDX 项目的完整目录结构
典型的 Nextra TypeScript MDX 博客项目的完整目录结构。 Pages 架构 my-blog/ ├── components/ # React 组件 │ ├── HelloWorld.tsx # 示例组件 │ └── ... # 其他组件 ├── pages/ # 页面…...
MDM功能演示:远程锁定与数据擦除,保障企业移动设备安全
在当今高度互联的商业环境中,企业数据伴随着员工穿梭于不同城市、时区和设备之间。智能手机、平板电脑和笔记本电脑赋予员工随时随地办公的能力,但也带来了新的安全挑战:设备一旦遗失或落入不当之手,企业数据就面临泄露风险。 无…...
快速idea本地和推送到远程仓库
在你需要推送的那个文件夹打开 #创建本地仓库 git init#添加文件并首次提交 git add . git commit -m "Initial commit"#添加远程仓库地址 git remote add origin https://gitee.com/你的用户名/你的仓库名.git#查看远程仓库是否设置chengg git remote -v#原来远程仓…...
django数据迁移操作受阻
错误信息: django.db.utils.OperationalError: (1227, Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation)根据错误信息分析,该问题是由于MySQL用户 缺乏SYSTEM_VARI…...
使用Lombok的@Slf4j和idea构建:找不到log符号-解决
问题:在使用Lombok的Slf4j构建项目时提示如下内容: MvcConfiguration.java:26:9 java: cannot find symbol symbol: variable log location: class cn.edu.wynu.mrcinerec.mrserver.config.WebMvcConfiguration查了网上的方法都是改配置 但是使用Googl…...
物联网传感器技术架构与功能解析
物联网传感器作为物联网体系的关键组成部分,主要承担环境或物体状态信息的捕获与传输功能。其通过检测物理、化学或生物参数,将模拟信号转化为数字格式,并利用多种通信协议实现数据交互,最终服务于各类智能化应用。 核心功能模块分…...
wx213基于php+vue+uniapp的新闻资讯小程序
开发语言:PHP框架:phpuniapp数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:PhpStorm 系统展示 管理员登录界面 管理员功能界面 新闻类别管理 新闻信息管理 用户管理 管理员管…...
SOEM编译Ubuntu 22.04
下载SOEM源码 $ git clone https://github.com/OpenEtherCATsociety/SOEM.git编译源码 进入SOEM源码目录 $ mkdir build && cd build $ cmake .. $ make测试 eth1 位网卡名 $ cd test/linux/slaveinfo/ $ sudo ./slaveinfo eth1SOEM (Simple Open EtherCAT Master) …...
栈和队列(Stack和Queue)
栈和队列(Stack和Queue) 1:栈的概念 示意图: 2:创建一个类Stack,给定一个整形数组elem,数组已使用长度usedSize,默认长度default_size为10,再给定一个构造方法࿰…...
Django的定制以及admin
Django是一个全面的Python Web开发框架,具有丰富的功能,和众多开箱即用的接口。 简单使用 我们使用Django的django-admin工具创建项目: django-admin startproject project1 cd project1 django-admin startapp app1以后,一个简…...
LLM架构解析:编码器-解码器架构(Encoder-Decoder Architecture)(第四部分)—— 从基础原理到实践应用的深度探索
本专栏深入探究从循环神经网络(RNN)到Transformer等自然语言处理(NLP)模型的架构,以及基于这些模型构建的应用程序。 本系列文章内容: NLP自然语言处理基础词嵌入(Word Embeddings)…...
Unity VideoPlayer 播放无声音
增加一个videoPlayer下挂,audiorSource脚本 this.videoPlayer.EnableAudioTrack(0, true); this.videoPlayer.audioOutputMode VideoAudioOutputMode.AudioSource; this.videoPlayer.SetTargetAudioSource(0, this.videoPlayer.GetComponent<AudioSource>()…...
【Kafka基础】监控与维护:动态配置管理,灵活调整集群行为
1 基础配置操作 1.1 修改主题保留时间 /export/home/kafka_zk/kafka_2.13-2.7.1/bin/kafka-configs.sh --alter \--bootstrap-server 192.168.10.33:9092 \--entity-type topics \--entity-name yourtopic \--add-config retention.ms86400000 参数说明: retention…...
AutoGen深度解析:从核心架构到多智能体协作的完整指南
AutoGen是微软推出的一个革命性多智能体(Multi-Agent)框架,它通过模块化设计和灵活的对话机制,极大地简化了基于大型语言模型(LLM)的智能体系统开发。本文将深入剖析AutoGen的两个核心模块——core基础架构和agentchat多智能体对话系统,带您全…...
接口请求控制工具
接口请求控制工具 功能说明代理转发安全控制访问控制错误处理配置管理日志管理 技术栈快速开始环境要求配置说明启动服务 工具源码 功能说明 代理转发 支持多路由配置支持静态资源代理灵活的路由规则配置支持请求转发和响应处理支持负载均衡 支持多目标服务器配置提供多种负载…...
Git 实践笔记
这里写自定义目录标题 一、将当前改动追加到某次commit上二、git 强制修改分支位置 一、将当前改动追加到某次commit上 stash工作区中的当前改动 git stash假设需要修改的commit是 f744c32,将HEAD移动到需要改动的commit的父提交上 git rebase f744c32^ --interact…...
记一个Unity中Humanoid中骨骼与武器脱离的问题
在Untiy中,有时人物的Humanoid的骨骼对应上了,但是套用动画的时候武器等节点有时会脱离,这是因为Humanoid只包含了人物骨骼,不包括其他额外的骨骼,因此如果想要武器节点也跟随,需要在Humanoid中也绑定骨骼设…...
Python asyncio
一些Pre关键概念 asyncio 本质上还是单进程单线程的Python程序; 建立event_loop 概念,上面event_loop 可以理解为大脑,下面是若干个可执行的Task; Task 没有控制权,没有办法控制event_loop 执行某个Task,只…...
【前端分享】JavaScript异步编程详解!
JavaScript 的异步编程是其核心特性之一,主要用于处理非阻塞操作(如网络请求、文件读写、定时任务等)。由于 JavaScript 是单线程的,异步机制可以避免代码阻塞,提高性能和用户体验。以下是 JavaScript 异步编程的核心概…...
深度学习基础--CNN经典网络之InceptionV1研究与复现(pytorch)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 InceptionV1是提出并行卷积结构,是CNN的经典网络之一;本次任务是探究InceptionV1结构并进行复现实验;欢迎收藏 关注…...
用 Vue 3 + D3.js 实现动态数据流图
文章目录 一、项目背景与功能概览二、项目准备与依赖安装2.1 安装 Vue 3 项目2.2 安装 D3.js2.3 项目结构 三、实现动态数据流图3.1 创建 DataFlowChart 组件3.2 动态更新数据流3.2.1 动态更新边和节点位置3.2.2 动画效果 四、节点拖拽与编辑功能实现4.1 添加节点拖拽功能4.2 编…...
46、Spring Boot 详细讲义(三)
五、Spring Boot 与 Web 开发 1. 简介 Spring Boot 是基于 Spring Framework 开发的一个框架,旨在简化配置,快速构建应用。它内嵌 Tomcat 等 servlet 容器,支持 RESTful API 开发,处理静态资源,以及集成视图层技术如 Thymeleaf 和 Freemarker。 2. Spring MVC 集成 Sp…...
热门面试题第15天|最大二叉树 合并二叉树 验证二叉搜索树 二叉搜索树中的搜索
654.最大二叉树 力扣题目地址(opens new window) 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大…...
为了避免unboundLocalError和为什么X的值一直不变呢?
## 1.为了避免unboundLocalError 发生unboundLocalError! def generate_integer(level):if level 1:X randint(1,9)return X这里出错的原因在于,一旦if 后面的条件没有成立,然后X根本没出生,然后你去使用它,这是有…...
Express中间件(Middleware)详解:从零开始掌握(1)
1. 中间件是什么? 想象中间件就像一个"加工流水线",请求(Request)从进入服务器到返回响应(Response)的过程中,会经过一个个"工作站"进行处理。 简单定义:中间件是能够访问请求对象(req)、响应对象(res)和下…...
Linux升级gcc版本
目录 1.安装 scl 工具集 2.安装新版本gcc 3.启用新版本 gcc 4.将启动新版本gcc指令写入配置文件 本文主要讲述如何去升级 linux 操作系统下的 gcc 编译器版本。 1.安装 scl 工具集 sudo yum install centos-release-scl scl-utils-build 由于作者已经安装过,…...
【概念】什么是UI(User interface)什么是UX(User experience)?
1. 软件生命周期管理 (Software Life Cycle Management) 解释: 中文: 软件生命周期管理是指从软件规划、设计、开发、测试、部署到后续维护甚至退役的整个过程。English: Software Life Cycle Management refers to the systematic process of plannin…...
【GIT】git pull --rebase 功能解析
1. git pull 命令基础 git pull 是一个常用的 Git 命令,用于从远程仓库获取最新的更改,并尝试将这些更改合并到当前分支中。这通常涉及两个步骤:首先,git fetch 命令从远程仓库下载最新的更改;然后,git me…...