C++小白实习日记——Pollnet,Efvi,UDP,数据类型转换(上)
上周主要是熟悉了一下公司内部一些自定义结构体对应的数据类型,要求:读取文件,将文件中数据转化为定义的结构体中的数据类型,按照时间进行排序,用UDP发送数据;在另一台服务器上接收数据,按照定义好的数据结构存储传输过来的UDP包
一,发送端设计
1,读取文件并转换成指定数据结构
包括但不限于,读取文件,获取表头,打印表头,之前的同事留下的代码将表头标签用列表存储,我做了一个字段到索引的映射,就是读取第一行作为表头
const std::string _csvPath = "文件.csv";// 检查文件是否存在if (!fileExists(_csvPath)) {std::cerr << "CSV file does not exist: " << _csvPath << std::endl;return false;}// 初始化 CsvReaderCsvReader reader;try {reader.load_from_file(_csvPath.c_str());} catch (const std::exception& e) {std::cerr << "Error loading CSV file: " << e.what() << std::endl;return false;}// 获取表头信息std::vector<std::string> header;if (!reader.next_row(header)) {std::cerr << "CSV file is empty or cannot read the header row." << std::endl;return false;}// 打印表头内容std::cout << "Table Header: ";for (const auto& field : header) {std::cout << field << " ";}std::cout << std::endl;// 存储字段的有序顺序和映射std::vector<std::string> orderedFields;std::unordered_map<std::string, int> fieldMap;// 构建字段映射for (size_t i = 0; i < header.size(); ++i) {orderedFields.push_back(header[i]);fieldMap[header[i]] = static_cast<int>(i);}// 打印映射结果printFieldMap(orderedFields, fieldMap);
其中读取文件以及读表用了一个封装了的类CSVReader
// CSV 文件解析类
class CsvReader {
public:CsvReader() = default;void load_from_file(const char* filepath) {file_.open(filepath);if (!file_.is_open()) {throw std::runtime_error("Failed to open CSV file.");}}bool next_row(std::vector<std::string>& row) {row.clear();std::string line;if (std::getline(file_, line)) {std::stringstream line_stream(line);std::string cell;while (std::getline(line_stream, cell, ',')) {row.push_back(cell);}return true;}return false;}private:std::ifstream file_;
};
这个类依赖于 std::ifstream。std::ifstream是 C++ 标准库中的一个输入流类,用于从文件读取数据。std::getline是标准中的函数。
-
next_row
方法每次被调用时会从文件中读取一行数据(std::getline(file_, line)
)。如果成功读取到一行数据,函数会继续处理这行数据。 -
使用
std::stringstream
来解析这一行数据,通过std::getline(line_stream, cell, ',')
按照逗号(,
) 将行数据分割成单独的单元(单元格),然后将每个单元(cell
)加入到row
向量中。
字段映射主要是用std::vector<std::string> orderedFields; std::unordered_map<std::string, int> fieldMap;
-
orderedFields.push_back(header[i])
将每个字段名称按顺序存储到orderedFields
中,这样orderedFields
就是一个字段名的有序集合。 -
fieldMap[header[i]] = static_cast<int>(i)
将每个字段名称与其索引(即列的位置)存储到fieldMap
映射中,这样fieldMap
就是一个字段名到索引值的映射。
其中fieldMap是无序的,但是他里面的键值对有序号。
打印键值对:
// 打印字段映射
void printFieldMap(const std::vector<std::string>& orderedFields, const std::unordered_map<std::string, int>& fieldMap) {std::cout << "Field Map (Ordered):" << std::endl;for (const auto& field : orderedFields) {std::cout << " " << field << " -> " << fieldMap.at(field) << std::endl;}
}
at(field)
是 std::unordered_map
类的成员函数,它的作用是 根据键(field
)查找并返回对应的值,如果找不到该键,它会抛出一个 std::out_of_range
异常。
2,转换数据类型
std::vector<PSILEV2API::PSILev2MarketDataField> marketDataList; // 用于存储所有行的 MarketData// 解析数据行PSILEV2API::PSILev2MarketDataField marketData{};// 读取数据行std::vector<std::string> row;while (reader.next_row(row)) {std::cout << "Row: ";for (const auto &value: row) {std::cout << value << " ";}std::cout << std::endl;for (const auto &field: orderedFields) {auto it = fieldMap.find(field);if (it == fieldMap.end() || it->second >= static_cast<int>(row.size())) {continue;}std::string Field = field;Field.erase(std::remove(Field.begin(), Field.end(), '\"'), Field.end()); // 去掉引号Field.erase(0, Field.find_first_not_of(" \t\n\r"));Field.erase(Field.find_last_not_of(" \t\n\r") + 1);if (Field == "datetime") {std::string datetime = row[it->second];marketData.DataTimeStamp = convertToTimeStamp(datetime);std::cout << "DataTimeStamp: " << marketData.DataTimeStamp << std::endl;} }marketDataList.push_back(marketData); // 将每一行的 MarketData 对象存入列表}
逐行读取数据,将数据中的field与想要的标签做对比,符合要求后将其转化为需要的结构体中的数据,添加到结构体中,然后将转化后的结构体逐行push_back到marketData的列表中。
主要分为三部分:1)检查表头字段是不是在无序索引filedMap中
for (const auto &field: orderedFields)
这一行是一个范围基 for
循环,用来遍历 orderedFields
中的每一个 field
(字段名称)。orderedFields
是一个存储字段名称(如 "datetime"
, "price"
等)的 std::vector<std::string>
。
auto it = fieldMap.find(field)
这一行在 fieldMap
中查找当前字段(field
)的索引。
-
fieldMap
是一个std::unordered_map<std::string, int>
,用来存储字段名称到索引的映射关系。 -
fieldMap.find(field)
会返回一个迭代器it
,指向字段名称field
在fieldMap
中的元素。如果找到了该字段名,它会返回对应的键值对的迭代器;如果没有找到,它会返回fieldMap.end()
。
if (it == fieldMap.end() || it->second >= static_cast<int>(row.size())) { continue; }
这部分是一个条件判断,用来检查是否可以有效地从 row
中提取数据。
-
it == fieldMap.end()
:表示在fieldMap
中找不到当前字段名称field
。如果找不到字段名,则跳过当前字段的处理。 -
it->second >= static_cast<int>(row.size())
:it->second
是fieldMap
中该字段对应的索引(字段的位置)。row.size()
是当前行的列数。如果该索引超出了当前行的列数(即字段位置无效),则跳过当前字段的处理。 -
continue
:如果满足以上任一条件,continue
会跳过当前循环的剩余部分,继续处理下一个字段。
2)将表头字段的前后空格,斜杠等去掉
Field.erase(std::remove(Field.begin(), Field.end(), '\"'), Field.end());
-
std::remove
是一个标准库算法,它会在范围[Field.begin(), Field.end())
内删除所有的字符'\"'
,即所有的双引号字符(" "
)。但是,它并不会真正从容器中删除元素,而是将这些元素“移动”到容器的末尾,返回一个新的迭代器,指向新容器的有效元素区域的末尾。例如,给定字符串
"\"example\""
,std::remove
会将所有的双引号字符移到字符串的末尾,并返回一个新的“有效范围”。 -
Field.erase
将这个新的范围以外的部分(即所有的双引号)实际删除,最后得到的字符串将不再包含双引号。例如,输入
"\"example\""
,经过这行代码后,Field
会变成"example"
。
Field.erase(0, Field.find_first_not_of(" \t\n\r"));
-
Field.find_first_not_of(" \t\n\r")
:这个函数查找字符串中第一个不是空格、制表符(Tab)、换行符(\n
)、回车符(\r
)的字符的位置。-
如果
Field
开头有空格、Tab、换行符或回车符,它会返回第一个非空白字符的位置。 -
如果没有找到空白字符(即字符串没有前导空格),则返回字符串的起始位置(0)。
-
-
Field.erase(0, ...)
:这一行的作用是删除Field
字符串中的前导空白字符。它会从位置0
开始删除,删除的长度是从0
到find_first_not_of
找到的位置,实际上就是删除了所有前导的空格、制表符等。例如,如果
Field
是" example"
, 则Field.find_first_not_of(" \t\n\r")
返回3
,表示第一个非空白字符的位置是'e'
。然后,erase
会删除前面的 3 个空格,Field
变成"example"
。
Field.erase(Field.find_last_not_of(" \t\n\r") + 1);
-
Field.find_last_not_of(" \t\n\r")
:这个函数查找字符串中最后一个不是空格、制表符、换行符或回车符的字符的位置。-
如果
Field
末尾有空白字符,它会返回最后一个非空白字符的位置。 -
如果没有找到空白字符(即字符串没有尾随空格),则返回字符串的最后一个字符的位置。
-
-
Field.erase(... + 1)
:这行代码的作用是删除Field
字符串末尾的空白字符。通过find_last_not_of
找到最后一个非空白字符的位置,并删除从该位置到字符串末尾的所有字符,实际上就是去掉尾部的空白字符。例如,如果
Field
是"example "
, 则Field.find_last_not_of(" \t\n\r")
返回7
,表示最后一个非空白字符的位置是'e'
。然后,erase
会删除从位置8
开始到字符串末尾的空格,Field
变成"example"
。
3)判断如果当前表头符合转换要求,将数据赋值给std::string,然后转换数据类型
PSILEV2API::TTORATstpTimeStampType convertToTimeStamp(const std::string& datetime) {// 查找时间部分(假设格式为 "YYYY/MM/DD HH:MM:SS")size_t time_pos = datetime.find(' ');if (time_pos == std::string::npos) {throw std::invalid_argument("Invalid datetime format");}// 提取时间部分std::string time_part = datetime.substr(time_pos + 1);// 分割时、分、秒int hours, minutes, seconds;char delimiter;std::istringstream time_stream(time_part);time_stream >> hours >> delimiter >> minutes >> delimiter >> seconds;if (time_stream.fail()) {throw std::invalid_argument("Invalid time format");}// 转换为毫秒格式的整数:HHMMSS000return (hours * 10000000) + (minutes * 100000) + (seconds * 1000);
}
这里用了std::istringstream是一个标准库中的流类
-
流的输入:当使用
>>
操作符时,std::istringstream
会逐个字符地读取time_part
字符串,直到它成功地将数据解析为一个变量的类型。例如,当它试图将"14"
解析为hours
时,它成功地解析了数字 14。 -
分隔符的“消耗”:流会自动跳过空格或其他分隔符(例如冒号)。这些分隔符并不直接存储在变量中,而是被“消耗”掉,用来区分不同的数据段。
-
多个变量解析:可以通过连续使用
>>
操作符来解析多个值,每个操作符都会从流中提取出下一个数据,直到整个字符串被解析完或者遇到错误。
3,UDP发送
// 创建EfviUdpSender实例并初始化EfviUdpSender udpSender;udpSender.init("enp8s0f1", "10.100.100.162", 12345, "10.100.100.161", 12346);// 遍历 marketDataList,序列化并发送每一行数据for (size_t i = 0; i < marketDataList.size(); ++i) {const auto &marketData = marketDataList[i];// 序列化数据size_t dataSize = sizeof(marketData);std::vector<char> serializedData(dataSize);std::memcpy(serializedData.data(), &marketData, dataSize);// 打印字节流的十六进制表示for (size_t j = 0; j < dataSize; ++j) {printf("%02X ", static_cast<unsigned char>(serializedData[j]));}printf("\n");// 通过 UDP 发送数据包if (!udpSender.write(serializedData.data(), dataSize)) {std::cerr << "Failed to send market data for row " << i << std::endl;continue;}std::cout << "Market data for row " << i << " sent via UDP!" << std::endl;// 控制发送频率(例如每秒发送一次)std::this_thread::sleep_for(std::chrono::seconds(1));
先初始化EfviUdpSender udpSender,其中
-
"enp8s0f1"
:网络接口的名称,表示通过该网络接口进行数据发送。enp8s0f1
是一个 Linux 下的网络接口名称。 -
"10.100.100.162", 12345
:目标 IP 地址和端口号,表示将数据发送到该地址和端口。 -
"10.100.100.161", 12346
:源 IP 地址和端口号,表示从该地址和端口发送数据。
用for循环遍历marketDataList并序列化数据。
1. std::memcpy
函数
std::memcpy
是 C++ 标准库中的一个函数,定义在 <cstring>
头文件中。它用于将内存区域的内容复制到另一个内存区域。函数原型如下:
void* memcpy(void* dest, const void* src, std::size_t count);
-
dest
:目标内存地址,即要复制到的位置。 -
src
:源内存地址,即要从哪里复制数据。 -
count
:要复制的字节数。
在 C++ 中,结构体和类对象的数据通常以二进制格式存储。直接通过 std::memcpy
进行内存拷贝是一种高效的方法,可以避免逐个字段的序列化。尤其是在网络通信中,发送和接收的数据通常是字节流,而不是结构化数据。因此,使用 std::memcpy
将结构体数据转换为字节流,并直接发送是一种常见的做法
2. static_cast强制转换
-
这里使用
static_cast
将serializedData[j]
强制转换为unsigned char
类型。这样做的原因是printf
格式化输出时,默认处理的char
类型(尤其是有符号char
)可能会导致负数问题,因为char
可以是有符号的,取值范围为-128
到127
。 -
强制转换为
unsigned char
类型可以确保输出为 0 到 255 的有效字节值
3."%02X "
:
-
printf
用于格式化输出,第一个参数"%02X "
是格式字符串,告诉printf
如何输出数据:-
%02X
:以十六进制格式打印整数,且每个数字至少占 2 个字符宽度。如果数字是 1 位(比如0x9
),则会在前面补充0
,使其变成09
。 -
X
表示输出大写的十六进制字母(A-F
)。 -
02
表示输出的最小宽度为 2 个字符,如果一个字节的值小于 16(即 0x0 到 0xF),则会在前面补充一个零以满足 2 位宽度。 -
"
用于在输出中打印空格,确保每个字节后面都有一个空格,使输出更加易读。
所以,如果
serializedData[j]
的值是 255,那么输出将是FF
,如果它是 9,输出将是09
。 -
相关文章:
C++小白实习日记——Pollnet,Efvi,UDP,数据类型转换(上)
上周主要是熟悉了一下公司内部一些自定义结构体对应的数据类型,要求:读取文件,将文件中数据转化为定义的结构体中的数据类型,按照时间进行排序,用UDP发送数据;在另一台服务器上接收数据,按照定义…...
git安装教程(Git-2.38.1-64-bit)
目录 一、git下载 二、git安装 1.更改安装路径 2.安装组件 3.选择开始菜单文件夹 4.选择Git默认编辑器 5.决定初始化新项目(仓库)的主干名字 6.修改Git的环境变量 7.选择SSH执行文件 9.选择HTTPS后端传输 10.配置行尾符号转换 11.配置终端模…...
C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第三部分-表格方向识别
目录 说明 效果 模型 项目 编辑 代码 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分,首先,ppyoloe-plus-x 对边界框进行预测,并对置信度较高的表格边界…...
selenium 验证码滑块对齐没有验证通过
描述: 最近使用seleniuim采集有滑块验证码的数据,遇到了移动滑块对齐后,还是无法通过验证,经过模拟真人多次移动、控制移动时间(避免过快)一番尝试后、最终通过模拟抖动得以解决 解决办法: 把yoffset的值改为-6~6的…...
【Neo4J】neo4j docker容器下的备份与恢复
文章目录 一. 官网说明1. 操作说明2. 注意事项 二. docker 容器化操作1. 导出(备份)停止容器执行备份 2. 导入(恢复)停止容器(如果未停止)执行导入 3. 启动容器 一. 官网说明 https://neo4j.com/docs/operations-manual/current/…...
Java实现雪花算法获取id
Java实现雪花算法获取id 在 Java 中实现雪花算法(Snowflake)时,通常会设计一个工具类来生成全局唯一的 ID。这个工具类可以封装雪花算法的逻辑,并提供简单的接口来生成 ID。 以下是一个完整的 Java 工具类实现雪花算法的例子&am…...
Leetcode1338:数组大小减半
题目描述: 给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。 返回 至少 能删除数组中的一半整数的整数集合的最小大小。 代码思路: 这个代码的目的是解决一个特定的问题:给定一个整数数…...
【系统思辨】分散注意
注意力在我们的日常生活和工作中扮演着至关重要的角色。注意力可以提高效率和准确性、减少错误和失误,提升学习效率,促进创造力。与此同时,各种各样的生活事件在分散我们的注意力,并且还有很多分散我们注意的手段,比如…...
微信小程序中 Echarts 的巧妙运用
一、引入 Echarts 的准备工作 在微信小程序中引入 Echarts 需要进行一系列的准备工作。首先,我们可以从 echarts 官网或 GitHub 上下载 echarts-for-weixin 项目。找到其中的 ec-canvas 文件夹,这个文件夹将是我们引入到微信小程序项目中的关键部分。 …...
opencv——图片矫正
图像矫正 图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。 听名字有点熟,我们在图像旋转里接触过仿射变换,知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程,转换过程坐标点的相对位置和属性不发生变换&a…...
Gate学习(7)引入体素源
一、从GitHub下载体素源模型源码 下载地址:BenAuer2021/Phantoms-for-Nuclear-Medicine-Imaging-Simulation:用于核医学成像应用的模型(闪烁显像、SPECT 和 PET) --- BenAuer2021/Phantoms-For-Nuclear-Medicine-Imaging-Simulat…...
腾讯微信Android面试题及参考答案(多张原理图)
Android 应用的启动流程如下: 当用户点击应用图标时,首先会通过 Launcher(桌面启动器)来响应这个操作。Launcher 本身也是一个 Android 应用,它运行在系统中,负责管理和显示桌面上的图标等信息。 系统会检查应用是否已经有进程存在。如果没有,就会通过 Zygote 进程来孵化…...
【Android】View的工作流程
View的工作流程 开始了解一下View的工作流程,就是measure、layout和draw。measure用来测量View的宽高,layout用来确定View的位置,draw则用来绘制View。这一讲我们来看看measure流程,measure流程分为View的measure流程和ViewGroup…...
Linux基础指令
使用 tab 键补全 我们敲的所有的 Linux 命令 , 都可以使用 tab 键来尝试补全 , 加快效率 . 使用 ctrl c 重新输入 如果命令或者目录敲错了 , 可以 ctrl c 取消当前的命令 . ls :列出当前目录中的文件和子目录 语法 : ls [ 选项 ] [ 目录或文…...
Gemini 2.0 Flash重磅发布:多模态AI大模型,赋能实时交互与智能助手新体验
点击访问 chatTools 免费体验GPT最新模型,包括o1推理模型、GPT4o、Claude、Gemini等模型! 在AI领域竞争日益激烈的今天,谷歌再次亮剑,推出了新一代至强AI大模型——Gemini 2.0 Flash。这款模型不仅具备强大的多模态输入输出能力&a…...
项目十二 杜甫作品问卷
【项目目标】 理解网格系统的原理。理解媒体查询的工作原理。【項目内容】 使用网格系统进行响应式网页设计。运用媒体查询对不同类型的设备应用不同的样式。【项目步骤】 Bootstrap 框架资源既可以直接从 CDN 服务商服务器中引入,也可以加入本地素材文件夹中给出的资…...
7_Sass Introspection 函数 --[CSS预处理]
Sass 的 Introspection 函数允许开发者检查和操作样式表的内部结构,包括选择器、属性、值等。这些函数提供了对编译过程中 Sass 文件内容的深入访问能力,使得更复杂的逻辑处理成为可能。以下是一些常用的 Sass Introspection 函数及其用法示例࿱…...
Qt:Q_GLOBAL_STATIC实现单例(附带单例使用和内存管理)
转载 https://blog.csdn.net/m0_71489826/article/details/142288179 前言 本文主要写Q_GLOBAL_STATIC实现单例以及单例的释放,网上很多教程只有单例的创建,但是并没有告诉我们单例的内存管理,这就很头疼。 正文 使用 Qt 的 Q_GLOBAL_STA…...
HTML/CSS总结
HTML 1.1 标题标签h 为了使网页更具有语义化,我们经常会在页面中用到标题标签,HTML提供了6个等级的标题,即 标题标签语义: 作为标题使用,并且依据重要性递减 其基本语法格式如下: <h1> 标题文本…...
字符串性能对比
效率(1) : String.indexOf与String.contains效率测试_string contains效率-CSDN博客 结论是前者效率高,源码里面conatins是使用indexof 在jdk8中contains直接调用的indexOf(其他版本没有验证),所以要说效率来说肯定是indexOf高,但contains也就多了一层方法栈,so 什…...
【漫话机器学习系列】005.神经网络的结构(architecture on the neural network)
神经网络(Neural Network)是一种模拟人脑神经系统的计算模型,由大量相互连接的神经元(节点)组成,广泛应用于深度学习和机器学习领域。以下是神经网络的基本结构及关键组成部分。 1. 神经网络的基本组成 一…...
关卡选择与布局器
unity布局管理器 使用unity布局管理器轻松对关卡选择进行布局。 实现过程 准备普通按钮button设置字体和对应的sprite设置父gameobject(levelbase) 再创建UI.image(selectbackground)布局背景和大小gameobject(grid…...
数据分析实战—房价特征关系
1.实战内容 (1) 读取房价特征关系表(house_price.npz)绘制离地铁站的距离与单位面积的房价的散点图,并对其进行分析; import pandas as pd import numpy as np import warnings warnings.filterwarnings(&…...
@ResponseBody详解
ResponseBody 是 Spring Framework 中的一种注解,用于表示返回的内容应该直接写入 HTTP 响应体,而不是通过视图解析器来渲染一个视图(如 JSP 页)。当你在控制器的方法上使用 ResponseBody 时,Spring 会将方法的返回值直…...
Harmony Next开发通过bindSheet绑定半模态窗口
示例概述 Harmony Next开发通过bindSheet绑定半模态窗口 知识点 半模态窗口父子组件传值 组件 LoginComponent Component struct LoginComponent {// Prop 父子单项绑定值Prop message:string // Link 父子双向绑定值Link userName:stringLink password:stringLink isSh…...
Redis--高并发分布式结构
目录 一、引言 二、redis 1.什么是redis? 三、基础概念 1.什么是分布式? 2.应用服务和数据库服务分离 3.负载均衡 4.分库分表 5.微服务架构 四、总结 一、引言 本篇文章就简单介绍一下什么是redis,以及一些关于高并发和分布式结构的…...
Day38 动态规划part06
322. 零钱兑换 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求排列数就是外层for遍历背包,内层for循环遍历物品。 这句话结合本题 大家要好好理解。 视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilib…...
1.1 类型(types)
源码 types.rs文件源码: use euclid::{Point2D, Vector2D};//引用外部泛型/// 绘图中所有事物所使用的笛卡尔坐标系。The cartesian coordinate system used by everything in a drawing. #[derive(Debug, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] pub enu…...
PyTorch如何通过 torch.unbind 和torch.stack动态调整张量的维度顺序
笔者一篇博客PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语中有一个例子如下: # 创建一个 3x2x2 的三维张量 x torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]],[[9, 10], [11, 12]]])# 第一步:沿第 0 维分解为 3 个 2x2 张量 un…...
在 Node.js 中安装和使用 TensorFlow.js 的完整指南
在 Node.js 中安装和使用 TensorFlow.js 的完整指南 简介 TensorFlow.js 是一个开源的机器学习库,它允许在 JavaScript 环境中进行机器学习模型的开发和训练。本文将介绍如何在 Node.js 环境中安装和配置 TensorFlow.js。 环境准备 在开始之前,请确保…...
ubuntu 下如何查看用户的最近登录的时间
在 Ubuntu 系统下,可以通过以下几种方式查看用户最近的登录时间: 方法 1: 使用 last 命令 last 命令会显示系统上用户的登录记录,包括时间和来源。 last 用户名 例如,要查看用户 test 的最近登录记录: last test …...
Linux下调试工具:gdb
Windows和Linux下的调试有区别吗? 调试思路上一定是一样的;调试的操作方式有差别(Linux命令行调试,Windows窗口) 1.准备工作: 默认情况下,gdb无法进行对现在发布的程序进行调试(debug / release)。在Linux下用gcc编译…...
metagpt 多智能体系统
metagpt 多智能体系统 代码1. 动作及角色定义2. 主函数 代码解释1. 导入模块:2. 环境设置:3. 定义行动(Action):4. 定义角色(Role):5. 学生和老师的行为:6. 主函数&#…...
Python中opencv的一些函数及应用
Sobel 算子函数 功能: Sobel 算子用于计算图像的梯度(变化率),常用于边缘检测。它通过对图像应用一个基于一阶导数的滤波器来强调图像中的边缘部分,特别是水平和垂直方向上的边缘。通过计算图像的梯度,可以…...
泷羽sec学习打卡-brupsuite8伪造IP和爬虫审计
声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-FaskIP 伪造IP配置环境brupsuite导入配置1、扩展中先配置python环境2、安…...
麒麟信安推出支持信创PC的新一代云桌面方案,助力政务信创高效安全运维
12月11日,在第二届国家新一代自主安全计算系统产业集群融通生态大会上,麒麟信安发布了支持信创PC的新一代云桌面方案,该方案是基于国际TCI架构实现国产PC机云化纳管在国内的首次发布,并与银河麒麟桌面操作系统、长城国产PC整机实现…...
【我的开源】ESCurlGen 一款 ElasticSearch curl 命令生成器
由于经常编写复杂的 Elasticsearch 查询,并通过代码生成查询条件,我发现每次使用 curl 请求 Elasticsearch 时,手动复制配置信息并构建 curl 命令的过程非常繁琐,尤其是在管理多个环境的情况下更为不便。因此,我利用 A…...
基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout
1. PCB Layout 步骤 生成PCB 确定PCB layout规范 绘制板框尺寸 布局 布局规范: 按电气性能合理分区,一般分为:数字电路区(即怕干扰、又产生干扰)、模拟电路区(怕干扰)、功率驱动区(干扰源)&a…...
(css)element中el-select下拉框整体样式修改
(css)element中el-select下拉框整体样式修改 重点代码(颜色可行修改) // 修改input默认值颜色 兼容其它主流浏览器 /deep/ input::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.50); } /deep/ input::-moz-input-placeholder {color: rgba…...
金融分析-Transformer模型(基础理论)
Transformer模型 1.基本原理 transformer的core是注意力机制,其本质就是编码器-解码器。他可以通过多个编码器进行编码,再把编码完的结果输出给解码器进行解码,然后得到最终的output。 1.1编码器 数据在编码器中会经过一个self-attention的…...
Parcel 常用插件:增强功能与性能的最佳选择
前言 Parcel 是一个现代化的零配置应用打包工具,旨在简化开发流程并提高效率。通过其智能的默认配置和丰富的插件生态系统,Parcel 使得开发者能够轻松应对各种构建需求。虽然 Parcel 在大多数情况下可以开箱即用,但为了满足特定的项目需求&a…...
Vite 与 Webpack 的区别
在前端开发中,构建工具是不可或缺的,Webpack 和 Vite 是当前最流行的选择之一。尽管它们的目标相似,但在实现方式和开发体验上却有显著差异。本文将探讨 Vite 和 Webpack 的主要区别,以便于根据项目需求选择合适的工具。 1. 构建…...
服务器ubuntu重装系统后将原来的用户进行关联
服务器ubuntu重装系统后将原来的用户数据进行关联 关联用户到已存在目录 sudo useradd user_name -m -s /bin/bash -d /home***/name添加sudo权限 vim /etc/sudoers# 文件末尾添加 user_name ALL(ALL:ALL) ALL更改拥有者 sudo chown -R user_name:user_name /home***/na…...
Python模块导入:import与from...import的深度解析
Python模块导入:import与from…import的深度解析 在Python编程中,模块的导入是组织和复用代码的关键环节。Python提供了import和from...import两种常见的模块导入方式,它们在使用方式、命名空间管理、可读性、内存使用等方面各有特点&#x…...
ROS2-humble中指定OpenCV版本进行开发
本地是Ubuntu22.04系统,安装了ROS2-humble,看了下humble自带的OpenCV版本4.5.4,由于DNN模块读取.onnx格式的模型要用OpenCV4.7及以上的版本,于是编译了4.10.0的OpenCV,但开发ROS2节点时,虽然CMake中已经指定…...
如何在 Ubuntu 22.04 上使用 vnStat 监控网络流量
简介 vnStat是一个免费的、开源的、基于控制台的Linux操作系统网络流量监控工具。通过vnStat,你可以在不同的时间段监控网络统计数据。它简单、轻量级,并且消耗的系统资源很小。vnStat允许你按小时、日、月、周和日生成网络流量数据。本教程将向你展示如…...
为什么要使用数据仓库?
现状和需求 大量的企业经营性数据(订单,库存,原料,付款等)在企业的业务运营系统以及其后台的(事务型)数据库中产生的。 企业的决策者需要及时地对这些数据进行归类分析,从中获得企业运营的各种业务特征&a…...
《宇宙机器人》提示错误弹窗“找不到d3dx9_43.dll”是什么原因?“d3dx9_43.dll缺失”怎么解决?
电脑游戏运行时常见问题解析:《宇宙机器人》提示“找不到d3dx9_43.dll”的解决之道 TGA2024落幕,年度最佳游戏——《宇宙机器人》,作为一名在软件开发领域深耕多年的从业者,我深知电脑游戏在运行过程中可能会遇到的各种挑战&…...
DAC数据手册中专有名词TERMINOLOGY 讲解
DAC数据手册中TERMINOLOGY专有名词 讲解 Relative Accuracy or Integral Nonlinearity (INL):相对精度 或 积分非线性LSB(Least Significant Bit):最小有效位 Differential Nonlinearity (DNL):差分非线性单调性DNL很重…...
Java中基于TCP的Socket编程
一、概述 Socket(套接字)是网络通信的一种机制,允许不同主机之间的进程进行通信。在Java中,Socket支持TCP(传输控制协议)和UDP(用户数据报协议)。 1、TCP协议介绍 TCP协议在通信之…...