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

c注册cpp回调函数

在C语言中注册回调函数,函数需要使用静态函数,可使用bind和function来转换

案例一:

#include <iostream>
#include <functional>
#include <string.h>
#include "http_server.h"
#include "ret_err_code.h"
#include "log_api.h"#include "file_transfer.h"
#include "request_reprogram.h"
#include "request_progress.h"#define PORT "8089"
#define HOST_INFO "http://localhost:8089"#define FILE_TRANSFER "/path/a"
#define REQUEST_REPROGRAM "/path/b"
#define REQUEST_PROGRESS "/path/c"std::mutex HttpServer::mtx;
HttpServer *HttpServer::instance = nullptr;
std::function<int32_t(struct mg_connection *conn, void *cbdata)> EcuFileTransferHandler;
std::function<int32_t(struct mg_connection *conn, void *cbdata)> RequestReprogramHandler;
std::function<int32_t(struct mg_connection *conn, void *cbdata)> RequestProgressHandler;extern "C" {int32_t EcuFileTransferHandlerWrapper(struct mg_connection *conn, void *cbdata) {if (EcuFileTransferHandler) {return EcuFileTransferHandler(conn, cbdata);}return RET_OK;}int32_t RequestReprogramHandlerWrapper(struct mg_connection *conn, void *cbdata) {if (RequestReprogramHandler) {return RequestReprogramHandler(conn, cbdata);}return RET_OK;}int32_t RequestProgressHandlerWrapper(struct mg_connection *conn, void *cbdata) {if (RequestProgressHandler) {return RequestProgressHandler(conn, cbdata);}return RET_OK;}
}HttpServer::HttpServer()
{EcuFileTransferHandler = std::bind(&EcuFileTransfer::EcuFileTransferHandler, EcuFileTransfer::GetInstance(), std::placeholders::_1, std::placeholders::_2);RequestReprogramHandler = std::bind(&RequestReprogram::RequestReprogramHandler, RequestReprogram::GetInstance(), std::placeholders::_1, std::placeholders::_2);RequestProgressHandler = std::bind(&RequestProgress::RequestProgressHandler, RequestProgress::GetInstance(), std::placeholders::_1, std::placeholders::_2);
}HttpServer* HttpServer::GetInstance(void)
{if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {instance = new HttpServer;}}return instance;
}void HttpServer::DelInstance(void)
{std::lock_guard<std::mutex> lock(mtx);if (instance) {delete instance;instance = nullptr;}
}int32_t HttpServer::SetSourcePackagePath(string path)
{sourcePackagePath = path;return RET_OK;
}int32_t HttpServer::SetTargetPackagePath(string path)
{targetPackagePath = path;return RET_OK;
}static int LogMessage(const struct mg_connection *conn, const char *message)
{puts(message);return RET_OK;
}int32_t HttpServer::Init()
{EcuFileTransfer::GetInstance()->SetSourcePackagePath(sourcePackagePath);EcuFileTransfer::GetInstance()->SetTargetPackagePath(targetPackagePath);const char *options[] = {"listening_ports",PORT,"request_timeout_ms","10000","error_log_file","error.log","enable_auth_domain_check","no",0};int err = 0;/* Check if libcivetweb has been built with all required features. */mg_init_library(MG_FEATURES_DEFAULT);if (err) {LOG_ERR("Cannot start CivetWeb - inconsistent build.\n");return RET_EINVAL;}/* Callback will print error messages to console */memset(&callbacks, 0, sizeof(callbacks));callbacks.log_message = LogMessage;/* Start CivetWeb web server */ctx = mg_start(&callbacks, 0, options);if (ctx == nullptr) {LOG_ERR("Cannot start CivetWeb - mg_start failed.");return RET_EINVAL;}/* OTA-MASTER HTTP SERVER */mg_set_request_handler(ctx, FILE_TRANSFER, EcuFileTransferHandlerWrapper, 0);mg_set_request_handler(ctx, REQUEST_REPROGRAM, RequestReprogramHandlerWrapper, 0);mg_set_request_handler(ctx, REQUEST_PROGRESS, RequestProgressHandlerWrapper, 0);return RET_OK;
}int32_t HttpServer::Deinit()
{/* Stop the server */mg_stop(ctx);return RET_OK;
}

案例二:

#include <iostream>
#include <stdlib.h>
#include <string>
#include <cstring>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <functional>
#include "file_transfer.h"
#include "ret_err_code.h"
#include "cJSON.h"
#include "def_databus.h"std::mutex EcuFileTransfer::mtx;
EcuFileTransfer *EcuFileTransfer::instance = nullptr;
std::function<int32_t(const char *key, const char *filename, char *path, size_t pathlen, void *user_data)> FieldFound;
std::function<int32_t(const char *key, const char *value, size_t valuelen, void *user_data)> FieldGet;
std::function<int32_t(const char *path, long long file_size, void *user_data)> FieldStore;extern packagesListInfo ServerPackListInfo;extern "C" {int32_t FieldFoundWrapper(const char *key, const char *filename, char *path, size_t pathlen, void *user_data) {if (FieldFound) {return FieldFound(key, filename, path, pathlen, user_data);}return RET_OK;}int32_t FieldGetWrapper(const char *key, const char *value, size_t valuelen, void *user_data) {if (FieldGet) {return FieldGet(key, value, valuelen, user_data);}return RET_OK;}int32_t FieldStoreWrapper(const char *path, long long file_size, void *user_data) {if (FieldStore) {return FieldStore(path, file_size, user_data);}return RET_OK;}
}static int SendJSON(struct mg_connection *conn, cJSON *json_obj)
{char *json_str = cJSON_PrintUnformatted(json_obj);size_t json_str_len = strlen(json_str);/* Send HTTP message header */mg_send_http_ok(conn, "application/json; charset=utf-8", json_str_len);/* Send HTTP message content */mg_write(conn, json_str, json_str_len);/* Free string allocated by cJSON_Print* */cJSON_free(json_str);return (int)json_str_len;
}EcuFileTransfer::EcuFileTransfer()
{FieldFound = std::bind(&EcuFileTransfer::field_found, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5);FieldGet = std::bind(&EcuFileTransfer::field_get, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);FieldStore = std::bind(&EcuFileTransfer::field_store, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
}EcuFileTransfer* EcuFileTransfer::GetInstance(void)
{if (instance == nullptr) {std::lock_guard<std::mutex> lock(mtx);if (instance == nullptr) {instance = new EcuFileTransfer;}}return instance;
}void EcuFileTransfer::DelInstance(void)
{std::lock_guard<std::mutex> lock(mtx);if (instance) {delete instance;instance = nullptr;}
}int32_t EcuFileTransfer::SetSourcePackagePath(string path)
{sourcePackagePath = path;return RET_OK;
}int32_t EcuFileTransfer::SetTargetPackagePath(string path)
{targetPackagePath = path;return RET_OK;
}int32_t EcuFileTransfer::field_found(const char *key, const char *filename, char *path, size_t pathlen, void *user_data)
{if (strcmp(key, "file")) {return MG_FORM_FIELD_STORAGE_GET;}strcat(path, file->GetFilePath().c_str());if (access(path, 0) == -1) {int flag = mkdir(path, S_IRWXU);if (flag != 0) {std::cout << "Fail to create directory. errno " << errno << std::endl;}}strcat(path, "/");strcat(path, filename);return MG_FORM_FIELD_STORAGE_STORE;
}int32_t EcuFileTransfer::field_get(const char *key, const char *value_untruncated, size_t valuelen, void *user_data)
{/* Copy the untruncated value, so string compare functions can be used. *//* The check unit test library does not have build in memcmp functions. */if (!strcmp(key, "uuid")) {string item = string(value_untruncated, valuelen);file->SetUuid(item);} else if (!strcmp(key, "ecuId")) {string item = string(value_untruncated, valuelen);file->SetEcuId(string(item));} else if (!strcmp(key, "ecuSoftCode")) {string item = string(value_untruncated, valuelen);file->SetEcuSoftCode(string(item));} else if (!strcmp(key, "ecuSoftVer")) {string item = string(value_untruncated, valuelen);file->SetEcuSoftVer(string(item));} else if (!strcmp(key, "packageType")) {string item = string(value_untruncated, valuelen);file->SetPackageType(string(item));} else if (!strcmp(key, "fileMd5")) {string item = string(value_untruncated, valuelen);file->SetFileMd5(string(item));file->SetFilePath(string(item));} else if (!strcmp(key, "packageCount")) {string item = string(value_untruncated, valuelen);file->SetPackageCount(string(item));} else if (!strcmp(key, "packageNum")) {string item = string(value_untruncated, valuelen);file->SetPackageNum(string(item));} else if (!strcmp(key, "fileCount")) {string item = string(value_untruncated, valuelen);file->SetFileCount(string(item));} else if (!strcmp(key, "fileNum")) {string item = string(value_untruncated, valuelen);file->SetFileNum(string(item));} else {}return RET_OK;
}int32_t EcuFileTransfer::field_store(const char *path, long long file_size, void *user_data)
{file->SetStoreSuccess(true);return RET_OK;
}int32_t EcuFileTransfer::EcuFileTransferHandler(struct mg_connection *conn, void *cbdata)
{const struct mg_request_info *ri = mg_get_request_info(conn);(void)cbdata; /* currently unused */if (0 != strcmp(ri->request_method, "POST")) {/* this is not a POST request */mg_send_http_error(conn, 405, "Only post method");return 405;}if (file == nullptr) {file = new EcuFile();}struct mg_form_data_handler fdh = {FieldFoundWrapper,FieldGetWrapper,FieldStoreWrapper,NULL};fdh.user_data = nullptr;string status = "100";/* Call the form handler */int ret = mg_handle_form_request(conn, &fdh);if (ret <= 0) {std::cout << "no any elem" << std::endl;}int32_t fl = atoi(file->GetFileCount().c_str());int32_t fr = atoi(file->GetFileNum().c_str());int32_t pl = atoi(file->GetPackageCount().c_str());int32_t pr = atoi(file->GetPackageNum().c_str());if (fl == fr) {string cmd = "cd " + file->GetFilePath() +" &&" + " cat * > update.zip" +" && mkdir -p " + targetPackagePath +" && unzip -o update.zip -d " + targetPackagePath +" && rm update.zip" +" && cd .." +" && rm -r " + file->GetFilePath();FILE *fp = popen(cmd.c_str(), "r");if(fp == NULL) {perror("popen error");}pclose(fp);if (file->GetStoreSuccess()) {bool repeat = false;size_t size = ServerPackListInfo.packInfo.size();for(size_t i = 0; i < size; i++) {string id = ServerPackListInfo.packInfo.at(i).ecuId;if (!id.compare(file->GetEcuId())) {repeat = true;}}if (!repeat) {struct packagesInfo info;info.ecuId = file->GetEcuId();info.ecuSoftCode = file->GetEcuSoftCode();info.ecuSoftVer = file->GetEcuSoftVer();info.packagePath = targetPackagePath;info.packageType = file->GetPackageType();ServerPackListInfo.packInfo.push_back(info);ServerPackListInfo.packageCount = ServerPackListInfo.packInfo.size();ServerPackListInfo.batchUpdateFlag = false;ServerPackListInfo.packlistStatus = 1;ServerPackListInfo.batchId = "0.0.0";ServerPackListInfo.CreateTime = 0;}}if (pl == pr) {status = "200";}}if (file != nullptr) {delete file;file = nullptr;}cJSON *obj = cJSON_CreateObject();if (!obj) {/* insufficient memory? */mg_send_http_error(conn, 500, "Server error");return 500;}cJSON_AddStringToObject(obj, "status", status.c_str());SendJSON(conn, obj);cJSON_Delete(obj);return 200;
}int32_t EcuFile::SetUuid(string id)
{uuid = id;return RET_OK;
}int32_t EcuFile::SetEcuId(string id)
{ecuId = id;return RET_OK;
}int32_t EcuFile::SetEcuSoftCode(string code)
{ecuSoftCode = code;return RET_OK;
}int32_t EcuFile::SetEcuSoftVer(string ver)
{ecuSoftVer = ver;return RET_OK;
}int32_t EcuFile::SetPackageType(string type)
{packageType = type;return RET_OK;
}int32_t EcuFile::SetFileMd5(string md5)
{fileMd5 = md5;return RET_OK;
}int32_t EcuFile::SetPackageCount(string cnt)
{packageCount = cnt;return RET_OK;
}int32_t EcuFile::SetPackageNum(string num)
{packageNum = num;return RET_OK;
}int32_t EcuFile::SetFileCount(string cnt)
{fileCount = cnt;return RET_OK;
}int32_t EcuFile::SetFileNum(string num)
{fileNum = num;return RET_OK;
}int32_t EcuFile::SetFilePath(string path)
{filePath = path.substr(0, 8);return RET_OK;
}int32_t EcuFile::SetStoreSuccess(bool success)
{storeSuccess = success;return RET_OK;
}string EcuFile::GetUuid()
{return uuid;
}string EcuFile::GetEcuId()
{return ecuId;
}string EcuFile::GetEcuSoftCode()
{return ecuSoftCode;
}string EcuFile::GetEcuSoftVer()
{return ecuSoftVer;
}string EcuFile::GetPackageType()
{return packageType;
}string EcuFile::GetFileMd5()
{return fileMd5;
}string EcuFile::GetPackageCount()
{return packageCount;
}string EcuFile::GetPackageNum()
{return packageNum;
}string EcuFile::GetFileCount()
{return fileCount;
}string EcuFile::GetFileNum()
{return fileNum;
}string EcuFile::GetFilePath()
{return filePath;
}bool EcuFile::GetStoreSuccess()
{return storeSuccess;
}

相关文章:

c注册cpp回调函数

在C语言中注册回调函数&#xff0c;函数需要使用静态函数&#xff0c;可使用bind和function来转换 案例一&#xff1a; #include <iostream> #include <functional> #include <string.h> #include "http_server.h" #include "ret_err_code.…...

批量将excel中字段为“八百”替换成“九百”

要批量将Excel中字段为"八百"的内容替换为"九百"&#xff0c;您可以使用Python的openpyxl库来实现。以下是一个示例代码演示如何读取Excel文件并进行替换操作&#xff1a; from openpyxl import load_workbook # 打开Excel文件 wb load_workbook(your_ex…...

关于docker-compose up -d在文件下无法运行的原因以及解决方法

一、确认文件下有docker-compose.yml文件 二、解决方法 检查 Docker 服务是否运行&#xff1a; 使用以下命令检查 Docker 服务是否正在运行&#xff1a; systemctl status docker 如果 Docker 未运行&#xff0c;可以使用以下命令启动它&#xff1a; systemctl start docker …...

机器学习笔记 - 基于keras + 小型Xception网络进行图像分类

一、简述 Xception 是深度为 71 层的卷积神经网络,仅依赖于深度可分离的卷积层。 论文中将卷积神经网络中的 Inception 模块解释为常规卷积和深度可分离卷积运算(深度卷积后跟点卷积)之间的中间步骤。从这个角度来看,深度可分离卷积可以理解为具有最大数量塔的 Inception 模…...

【Unity每日一记】SceneManager场景资源动态加载

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

自动驾驶数据回传需求

1、需求分析 用户 用户需求 实时性要求 需回传数据 数据类型 采样周期 数据量 大小 数据回传通道 研发工程师 分析评估系统性能表现&#xff0c;例如智驾里程统计、接管率表现、油耗表现、AEB报警次数等 当天 车身底盘数据、自动驾驶系统状态数据等 结构化数据 10…...

使用Jmeter自带recorder代理服务器录制接口脚本

脚本录制 配置线程组 添加代理服务器 端口 和 录制脚本放置位置可根据需要设置 启动录制 点击启动后 弹出创建证书提示&#xff0c;点击OK 这个证书后续需要使用到 然后可见 一个弹窗。 Recorder . 本质是代理服务录制交易控制 可设置对应数据 方便录制脚本的查看 证书配置…...

我和 TiDB 的故事 | 远近高低各不同

作者&#xff1a; ShawnYan 原文来源&#xff1a; https://tidb.net/blog/b41a02e6 Hi, TiDB, Again! 书接上回&#xff0c; 《我和 TiDB 的故事 | 横看成岭侧成峰》 &#xff0c;一年时光如白驹过隙&#xff0c;这一年我好似在 TiDB 上投入的时间总量不是很多&#xff0…...

深入浅出Pytorch函数——torch.nn.init.zeros_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

Jenkins-发送邮件配置

在Jenkins构建执行完毕后&#xff0c;需要及时通知相关人员。因此在jenkins中是可以通过邮件通知的。 一、Jenkins自带的邮件通知功能 找到manage Jenkins->Configure System&#xff0c;进行邮件配置&#xff1a; 2. 配置Jenkins自带的邮箱信息 完成上面的配置后&#xf…...

网络通信原理传输层TCP三次建立连接(第四十八课)

ACK :确认号 。 是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。确认号X+1SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的…...

【Python机器学习】实验14 手写体卷积神经网络(PyTorch实现)

文章目录 LeNet-5网络结构&#xff08;1&#xff09;卷积层C1&#xff08;2&#xff09;池化层S1&#xff08;3&#xff09;卷积层C2&#xff08;4&#xff09;池化层S2&#xff08;5&#xff09;卷积层C3&#xff08;6&#xff09;线性层F1&#xff08;7&#xff09;线性层F2 …...

Debian查询硬件状态

很早以前写过一个查询树霉派硬件状态的文章&#xff0c;用是Python写的一个小程序。里面用到了vcgencmd这个测温度的内部命令&#xff0c;但这个命令在debian里面没有&#xff0c;debian里只有lm_sensors的外部命令&#xff0c;需要安装&#xff1a;apt-get install lm_sensors…...

除自身以外数组的乘积(c语言详解)

题目&#xff1a;除自身外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据保证数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请不要使用除…...

ONES × 鲁邦通|打造研发一体化平台,落地组织级流程规范

近日&#xff0c;ONES 签约工业互联网行业领先的解决方案提供商——鲁邦通&#xff0c;助力鲁邦通优化组织级流程规范&#xff0c;落地从需求到交付的全生命周期线上化管理。 依托于 ONES 一站式研发管理平台&#xff0c;鲁邦通在软硬件设计开发、项目管理和精益生产等方面的数…...

【GaussDB】 SQL 篇

建表语句 表的分类 普通的建表语句 复制表内容 只复制表结构 create table 新表名(like 源表名 including all); 如果希望注释被复制的话要指定including comments 复制索引、主键约束和唯一约束&#xff0c;那么需要指定including indexes including constraints &#xf…...

rn和flutter出现“Running Gradle task ‘assembleDebug

在第一次运行rn和flutter时&#xff0c;会卡在Running Gradle task assembleDebug&#xff0c;可以使用阿里的镜像&#xff0c;如下图&#xff1a; maven { url https://maven.aliyun.com/repository/google/ } google() maven { url https://maven.aliyun.com/repository/jcen…...

Shell脚本基础( 四: sed编辑器)

目录 1 简介 1.1 sed编辑器的工作流程 2 sed 2.1 基本用法 2.2 sed基本格式 2.2.1 sed支持正则表达式 2.2.2 匹配正则表达式 2.2.3 奇数偶数表示 2.2.4 -d选项删除 2.2.5 -i修改文件内容 2.2.6 -a 追加 2.3 搜索替代 2.4 变量 1 简介 sed是一种流编辑器&#xff0c;…...

微信消息没通知iphone can‘t show notifications

小虎最近手机微信消息没通知&#xff0c;本来以为要卸载&#xff0c;但是发现原来是多客户端登录导致消息被其他平台截取&#xff0c;所有没有通知。 解决方法 小虎是在手机和电脑端同时登录的&#xff0c;所有退出电脑端后手机新消息就有提示了。可能是一个bug。...

Linux Kernel:pid与namespace

环境: Kernel Version:Linux-5.10 ARCH:ARM64 一:前言 Linux内核涉及进程和程序的所有算法都围绕task_struct数据结构建立,具体可看另一篇文章: Linux Kernel:thread_info与task_struct 同时Linux提供了资源限制(resource limit, rlimit)机制,对进程使用系统资源施…...

开源后台管理系统Geekplus Admin

本系统采用前后端分离开发模式&#xff0c;后端采用springboot开发技术栈&#xff0c;mybatis持久层框架&#xff0c;redis缓存&#xff0c;shiro认证授权框架&#xff0c;freemarker模版在线生成代码&#xff0c;websocket消息推送等&#xff0c;后台管理包含用户管理&#xf…...

【MATLAB基础绘图第16棒】绘制热图(Heatmap)

热图&#xff08;Heatmap&#xff09; 热图的主要作用是直观展示重点研究对象的差异情况&#xff0c;多用于经济学与工学差异性分析之中。 heatmap函数创建热图 语法 hheatmap(tbl,xvar,yvar) hheatmap(tbl,xvar,yvar,ColorVariable,cvar) hheatmap(cdata) hheatmap(xvalue…...

数据库--SQL关键字的执行顺序

数据库相关链接&#xff1a; 数据库--数据类型&#xff1a;http://t.csdn.cn/RtqMD 数据库--三大范式、多表查询、函数sql&#xff1a;http://t.csdn.cn/udJSG 数据库--MySQL增删改查&#xff1a;http://t.csdn.cn/xkiti 一、一条sql语句通常包括&#xff1a; select fro…...

如何优雅地处理Java多线程编程中的共享资源问题,以确保线程安全和高性能?

文章目录 &#x1f389;欢迎来到Java面试技巧专栏~如何优雅地处理Java多线程编程中的共享资源问题&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;Java面试技巧文章作者技术和水平有限&…...

每天一道leetcode:剑指 Offer 64. 求1+2+…+n(中等递归)

今日份题目&#xff1a; 求 12...n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 示例1 输入: n 3 输出: 6 示例2 输入: n 9 输出: 45 提示 1 < n < 10000 题目思路 使用递归…...

服务器安装centos7踩坑

1、制作启动工具 下载iso https://developer.aliyun.com/mirror/?spma2c6h.25603864.0.0.20387abbo2RFbn http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.1995f5ad4AhJaW下载 UltraISO https://cn.ultraiso.net/插入u盘启动 到了如图所示页面…...

Java | IDEA中 jconsole 不是内部或外部命令,也不是可运行的程序

解决办法&#xff1a; 1.先将Terminal的Shell path 修改为C:\WINDOWS\system32\cmd.exe 2.在检查环境变量中的ComSpec的值 3.找到自己电脑下载的jdk的bin的地址 4.将jdk的bin地址加入到系统变量path中...

将Swift Package构建为通用二进制文件 Universal Binary

将Swift软件包构建为通用二进制文件 因此&#xff0c;在苹果在WWDC 2020期间宣布他们将把Mac从英特尔处理器过渡到苹果硅之后&#xff0c;现在是时候让每个人都准备好他们的软件了。 对大多数人来说&#xff0c;这次过渡可能更容易一些&#xff0c;特别是那些已经在iOS上支持a…...

正则表达式:贪婪与非贪婪模式

正则中的三种模式&#xff0c;贪婪匹配、非贪婪匹配和独占模式。 在这 6 种元字符中&#xff0c;我们可以用 {m,n} 来表示 &#xff08;*&#xff09;&#xff08;&#xff09;&#xff08;?&#xff09; 这 3 种元字符&#xff1a; 贪婪模式&#xff0c;简单说就是尽可能进行…...

UVa247 Calling Circles(Floyd warshall算法)

题意 给定两个人相互打电话&#xff0c;如果a打给b,b打给c,c打给a&#xff0c;则说a,b,c在同一电话圈中。给出n个人的m次通话&#xff0c;输出所有的电话圈 思路 用graph[u][v]1表示u和v之间有打电话。在使用floyd算法计算所有的点对之间的值。graph[u][v]1表示u,v之间有直接…...

Java项目之基于ssm框架的社区生活超市管理系统(附源码)

基于ssm框架的社区生活超市管理系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于ssm框架的社区生活超市管理系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式。更…...

Android 实现录音功能

思路&#xff1a; 通过媒体录制器MediaRecorder实现&#xff1a;MediaRecorder是Android自带的音频和视频录制工具&#xff0c;它通过操纵摄像头和麦克风完成媒体录制&#xff0c;既可录制视频&#xff0c;又可单独录制音频。 MediaRecorder常用方法(录音与录像通用)&#xf…...

drawio导出矢量图

1.选中要导出的图 2.导出为pdf 3.用adobe打开pdf&#xff0c;另存为eps...

关于angular router-outlet

关于angular router-outlet Angular是一个现代化的前端框架&#xff0c;它提供了很多强大的工具来帮助我们开发出高效的Web应用。其中一个最常用的功能是路由&#xff08;routing&#xff09;系统&#xff0c;它允许我们在不同的URL之间导航并加载不同的组件。而<router-ou…...

设计模式详解-桥接模式

类型&#xff1a;结构型模式 实现原理&#xff1a;将抽象类和实现类分离&#xff0c;使其独立&#xff0c;然后使用接口再将二者连接起来。 意图&#xff1a;将抽象部分与实现部分分离&#xff0c;使它们都可以独立的变化。 主要解决&#xff1a;类变化频繁时用继承可能会出…...

设计模式—— 单一职责原则

文章目录 设计模式的目的设计模式原则单一职责原则基本介绍应用实例单一职责原则注意事项和细节 设计模式的目的 1&#xff0c;代码重用性&#xff08;即&#xff1a;相同功能的代码&#xff0c;不用多次编写&#xff09; 2&#xff0c;可读性&#xff08;即&#xff1a;编程…...

嵌入式系统中如何选择RTC电池?

RTC&#xff08;Real Time Clock&#xff09;是一种用于提供系统时间的独立定时器&#xff0c;它可以在系统断电或低功耗模式下继续运行&#xff0c;只需要一个后备电池作为供电源。在嵌入式系统中&#xff0c;选择合适的RTC电池时非常关键的&#xff0c;它会影响系统时间的准确…...

56 | 国内游戏直播竞品分析

国内游戏直播竞品分析 一、需求分析 当前直播用户群可分为两大类: 主播观众用户需求: 1.主播: 作为直播内容的创造者,主播表现方式和内容很大程度上决定了观众的需求, 其中主播主要只有三点需求: (一) 通过某一手段(如游戏技术、唱歌技巧)获取他人关注,满足虚荣心…...

STM32 CubeMX (第一步Freertos任务管理:创建、删除、挂起、恢复)

STM32 CubeMX Freertos STM32 CubeMX &#xff08;Freertos任务&#xff1a;创建、删除、挂起、恢复&#xff09; STM32 CubeMX Freertos前言一、STM32 CubeMX 配置时钟树配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09…...

0101读写分离测试-jdbc-shardingsphere-中间件

文章目录 1 前言2、创建SpringBoot程序2.1、创建项目2.2、添加依赖2.3、生成实体类、service与Mapper1.5、配置读写分离 2、测试2.1、读写分离测试2.2、事务测试2.3、负载均衡测试 结语 1 前言 shardingshpere-jdbc定位为轻量级 Java 框架&#xff0c;在 Java 的 JDBC 层提供的…...

sqlite3将词典导入数据库

使用sqlite3代码实现将词典导入数据库中 #include <head.h> #include <sqlite3.h> #include <strings.h> #include <unistd.h> int main(int argc, const char *argv[]) {sqlite3 *db NULL;if(sqlite3_open("./dict.db",&db) ! SQLITE…...

浏览器 - 事件循环机制详解

目录 1&#xff0c;浏览器进程模型进程线程浏览器的进程和线程1&#xff0c;浏览器进程2&#xff0c;网络进程3&#xff0c;渲染进程 2&#xff0c;渲染主线程事件循环异步同步 JS 为什么会阻塞渲染任务优先级 3&#xff0c;常见面试题1&#xff0c;如何理解 js 的异步2&#x…...

析构函数中不应该抛出异常(摘录)

析构函数中抛出异常时概括性总结 从语法上面讲&#xff0c;析构函数抛出异常是可以的&#xff0c;C并没有禁止析构函数引发异常&#xff0c;但是C不推荐这一做法&#xff0c;从析构函数中抛出异常是及其危险的。 如果析构函数抛出异常&#xff0c;则异常点之后的程序不会执行&a…...

Windows定时任务计划无法显示任务程序界面的问题解决

笔者这两天写了一个python脚本程序&#xff0c;用来自动从公司的主数据系统获取数据&#xff0c;并按格式编制成excel。脚本程序编写一切顺利&#xff0c;运行结果很是完美&#xff0c;笔者很是舒心。但在最后一步&#xff0c;用上班的电脑每天早上定时运行它时&#xff0c;出了…...

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

问题描述 使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制&#xff0c;如被限制的IP地址一分钟可以访问10次&#xff0c;而不被限制的IP地址则可以无限访问&#xff1f; ChatGPT 解答 最近ChatGPT爆火&#xff0c;所以也把这个问题让ChatGPT来解答&#x…...

Python学习笔记_进阶篇(二)_django知识(一)

本章简介&#xff1a; Django 简介Django 基本配置Django urlDjango viewDjango 模板语言Django Form Django 简介 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MVC的软件设计模式&#xff0c;即模型M&#xff0c;视图V和控制器C。它最初是被开发来…...

【hive】hive中row_number() rank() dense_rank()的用法

hive中row_number() rank() dense_rank()的用法 一、函数说明 主要是配合over()窗口函数来使用的&#xff0c;通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序&#xff0c;有两个第二名时接下来就是第四名(同样是在各个分组内)dense_rank() …...

【云原生】【k8s】Kubernetes+EFK构建日志分析安装部署

目录 EFK安装部署 一、环境准备&#xff08;所有主机&#xff09; 1、主机初始化配置 2、配置主机名并绑定hosts&#xff0c;不同主机名称不同 3、主机配置初始化 4、部署docker环境 二、部署kubernetes集群 1、组件介绍 2、配置阿里云yum源 3、安装kubelet kubeadm …...

计算实数数组中所有元素的绝对值 numpy.fabs()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 计算实数数组中所有元素的绝对值 numpy.fabs() [太阳]选择题 请问关于以下代码表述错误的是&#xff1f; iimport numpy as np a np.array([-1,-3]) b np.array([-1,34j]) print("【显…...

深入浅出Pytorch函数——torch.nn.init.orthogonal_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...