分布式系统架构-samgr/source系统服务开发框架基础代码message.c讲解

  • 本篇概述
  • 代码框架
  • 消息管理流程图
  • message.h
    • 关键结构体
    • 函数声明
  • message.c
    • 发送请求与响应
    • 接收消息与释放消息
    • 共享
  • 知识补充

本篇概述

本篇主要讲解message.h和message_inner.h以及message.c的部分代码,这三个文件代码核心在于消息(msg)的收发,通过请求与响应的方式,利用消息交换进行外部接口对服务于功能的调用管理,请求与响应像是一对相生相融的兄弟,共同决定了系统的安全运作。

代码框架

message
├── 关键结构体
│ └── Identity
│ └── Request
│ └── Response
│ └── Exchange
├── 宏定义
│ └── Handler
│ └── Exchange
├── 消息功能函数
│ └── SAMGR_SendRequest
│ └── SAMGR_SendResponse
│ └── SAMGR_MsgRecv
│ └── SAMGR_FreeMsg
│ └── SharedSend
│ └── FreeReference
│ └── SAMGR_SendSharedRequest
│ └── SAMGR_SendSharedDirectRequest
│ └── SAMGR_SendResponseByIdentity

消息管理流程图

在这里插入图片描述

message.h

关键结构体

关键的结构体包括:

  • Identity:它决定了请求和响应对应服务或功能的id。
  • Request :其中包括了请求的消息id与数据内容。
  • Response :主要包含了响应的内容。
  • ==Exchange ==:这里尤为强调exchange,因为它是消息管理的基础,函数对请求与响应的功能性调用都是以exchange结构体内容为基础的。
/*** @brief Identifies a service and feature.* 概述:标识服务和特性* You can use this structure to identity a {@link IUnknown} feature to which messages will be* sent through the asynchronous function of {@link IUnknown}. \n* 你可以使用这个结构去标识一个功能,这个功能的信号将通过异步功能IUnknown发送*/
struct Identity {/** Service ID 服务ID*/int16 serviceId;/** Feature ID 功能ID*/int16 featureId;/** Message queue ID  消息队列ID*/MQueueId queueId;
};/*** @brief Defines a request.* 概述:定义一个请求* You can use this structure to define the request that will be sent to a feature through the* asynchronous function of {@link IUnknown}. \n* 你可以使用这个框架来定义将通过异步IUnknown接口发送给一个功能的请求* Request, which is data that is packed to send to a feature. \n* 请求是被打包发送给一个feature(功能、特征)的数据* If the data is not empty and the length is not 0, the system automatically releases the data. \n* 如果数据不为空且长度不为0,系统将自动释放数据*/
struct Request {/** Message ID 消息ID*/int16 msgId;/** Data length 消息长度*/int16 len;/** Data content 数据内容*/void *data;/** Message value, which is defined by developers 被开发者定义的消息值*/uint32 msgValue;
};/*** @brief Defines a response.* 概述:定义一个响应* This structure is used to send a response after the message processing function of a service* or feature processes a request. \n* 这个框架是用来在一个服务或功能处理一个请求的消息处理功能之后发送的一个响应* If the data is not empty and the length is not 0, the system automatically releases the data. \n* 如果数据不为空且长度不为0,系统将自动释放数据*/
struct Response {/** Data content 响应的数据内容*/void *data;/** Data length 响应的数据长度*/int16 len;
};struct Exchange {Identity id; /**< The target service or feature identity. 目标服务或功能的id*/Request request;Response response;short type;  /**< The exchange type. 交换类型*/Handler handler;   /**< async response or immediately request callback function 异步响应或立即请求的回调函数*/uint32 *sharedRef; /**< use to share the request and response for saving memory 用于共享请求和响应以节约内存*/
};

函数声明

其中,最重要的函数莫过于:SAMGR_SendRequest()和SAMGR_SendResponse(),它们的注解与声明如下:

/*** @brief Sends a request to a service or feature of a specified identity.* 概述:向一个服务或功能的特定id发送一个请求* This function is called by a service to send messages to its own features through the* asynchronous function of {@link IUnknown}. \n** @param identity Indicates the pointer to the ID of the feature or service that processes* the message.* identity代表指向一个服务或功能的id,它会处理这条消息* @param request Indicates the pointer to the request.* request代表指向请求的指针* @param handler Indicates the function handling the response. If the value is <b>NULL</b>,* no response is required.* handler代表处理响应的功能,如果这个值为空则没有响应被请求* @return Returns <b>EC_SUCCESS</b> if the request is sent successfully; returns other error codes* if the request fails to be sent. The caller needs to release the memory applied in the request.* 如果请求被成功发送将会返回EC_SUCCESS,返回错误代码如果请求发送失败,调用者需要释放请求应用的内存空间* @since 1.0* @version 1.0*/
int32 SAMGR_SendRequest(const Identity *identity, const Request *request, Handler handler);/*** @brief Sends a response after processing a request.* 概述:在处理请求后发送一个响应* This function is called to send a response after processing a request by {@link MessageHandle}* of a service or {@link OnMessage} of a feature. \n** @param request Indicates the pointer to the original request.* request代表指向原始请求的指针* @param response Indicates the pointer to the response content.* response代表响应内容的指针* @return Returns <b>EC_SUCCESS</b> if the response is sent successfully; returns other error* codes if the response fails to be sent.* 如果响应被成功发送将会返回EC_SUCCESS,返回错误代码如果请求发送失败* @attention*  <ul><li>This function can be called only in {@link MessageHandle} or {@link OnMessage}. </li>* 这个函数只能在MessageHandle或OnMessage中被调用*  <li>The request must be the original one passed from {@link MessageHandle} or*  {@link OnMessage}. Otherwise, a memory exception occurs. </li>* 请求必须是最初的从MessageHandle或OnMessage发送来的,否则内存例外便会发生*  <li> When the caller sends a request, the <b>handler</b> callback function must be carried. </li>* 当调用者发送一个请求时,handler回调函数必须被携带*  <li>The response is sent to the message queue of the service to which the requester belongs*  for processing. Therefore, the requester should wait for the response in non-blocking mode. </li></ul>* 响应被发送到请求者所属的服务的消息队列进行处理。因此,请求者应该以非阻塞模式等待响应。* @since 1.0* @version 1.0*/
int32 SAMGR_SendResponse(const Request *request, const Response *response);

我们将其余函数声明代码也列在下面供读者参考:

//消息接收
int32 SAMGR_MsgRecv(MQueueId queueId, uint8 *interMsg, uint32 size);/*** The function just release the Message->data and Message->sharedRef(use free), not release the msg entry.* 这个函数仅仅释放Message->data和Message->sharedRef(use free),不释放消息入口* If you alloc the msg on the heep, you should release it by yourself, you`d better alloc on the stack.* 如果你在堆上分配了消息空间,你需要自行释放它,你最好在栈中分配消息空间* The function will be called automatically.* 这个函数将被自动调用* Do not call this function manually, except the SM_SendRequest return error!* 不要人为地调用这个函数,除非SM_SendRequest返回错误代码**/
//消息释放
int32 SAMGR_FreeMsg(Exchange *exchange);/*** @brief Sends a request to multiple services or features to save memory.** This function is used to publish topics for the {@link Broadcast} service to broadcast messages. \n** @param identity Indicates the pointer to the IDs of services or features, to which requests* are sent.* @param request Indicates the pointer to the request.* @param token Indicates the pointer to reference counting.* @param handler Indicates the function handling the response. If the value is <b>NULL</b>,* no response is required.* @retval Returns the token if the request is sent successfully; returns <b>NULL</b> if the* request fails to be sent.* @attention*  <ul><li>Ensure that the thread specified by <b>identity</b> processes the message after*  all messages are sent. Common practice: Add a lock before sending a request and add*  the same lock during processing. </li>*  <li>If <b>NULL</b> is returned, the caller needs to release the memory of the request. </li></ul>* @since 1.0* @version 1.0*/
uint32 *SAMGR_SendSharedRequest(const Identity *identity, const Request *request, uint32 *token, Handler handler);/*** @brief Sends a request and response of a caller to the feature thread. The handler is directly* called to process the request and response without using the message processing functions.* (Customized function for the broadcast service)** This function is used to publish topics for the {@link Broadcast} service to broadcast messages. \n* The value of reference counting is incremented by one each time this function is called. \n** @param id Indicates the pointer to the IDs of services or features, to which the request and* response are sent.* @param request Indicates the pointer to the request.* @param resp Indicates the pointer to the response.* @param ref Indicates the reference counting.* @param handler Indicates the function for handling the request and response. This parameter* cannot be <b>NULL</b>.* @return Returns <b>EC_SUCCESS</b> if the request and response are sent successfully; returns* other error codes if the request and response fail to be sent.* @attention*  <ul><li>Ensure that the thread specified by <b>identity</b> processes the message after all*  messages are sent. Common practice: Add a lock before sending a request and add the same lock*  during processing. </li>*  <li>If <b>NULL</b> is returned, the caller needs to release the memory of the request and*  response. </li>*  <li>If the response changes each time when a request is sent, ensure that the response*  will not be released. (Set <b>len</b> to <b>0</b>, the <b>data</b> of response will be*  the resident memory.) </li></ul>* @since 1.0* @version 1.0*/
int32 SAMGR_SendSharedDirectRequest(const Identity *id, const Request *req, const Response *resp, uint32 **ref,Handler handler);
/*** @brief Sends a response to a specified service or feature after processing the original request.* (Customized function for <b>bootstrap</b>)** This function is called to send a response after processing a request by {@link MessageHandle}* of a service or {@link OnMessage} of a feature. \n* This function can be customized to implement phased startup of different types of services. \n** @param id Indicates the pointer to the ID of a service or feature. The response is sent to the* thread of the service or feature for processing.* @param request Indicates the pointer to the original request.* @param response Indicates the pointer to the response content.* @return Returns <b>EC_SUCCESS</b> if the response is sent successfully; returns other error* codes if the response fails to be sent.* @attention*  <ul><li>This function can be called only in <b>MessageHandle</b> or <b>OnMessage</b>. </li>*  <li>The request must be the original one passed from <b>MessageHandle</b> or <b>OnMessage</b>.*  Otherwise, a memory exception occurs. </li>*  <li> When the caller sends a request, the <b>handler</b> callback function must be carried. </li>*  <li>The response is sent to the message queue of a specified ID for processing. Therefore,*  wait for the response in non-blocking mode. </li></ul>* @since 1.0* @version 1.0*/
int32 SAMGR_SendResponseByIdentity(const Identity *id, const Request *request, const Response *response);static int32 SharedSend(MQueueId queueId, Exchange *exchange, int initRef);
static BOOL FreeReference(Exchange *exchange);

message.c

发送请求与响应

详细代码及注解如下:

//定义发送请求函数
int32 SAMGR_SendRequest(const Identity *identity, const Request *request, Handler handler)
{if (request == NULL || identity == NULL) {return EC_INVALID;}//初始化消息交换结构体Exchange exchange = {*identity, *request, {NULL, 0}, MSG_NON, handler, NULL};//将交换消息需要的目标服务或功能id的队列id置空exchange.id.queueId = NULL;//如果处理器的值非空则重新赋值队列id以及交换类型if (handler != NULL) {exchange.id.queueId = SAMGR_GetCurrentQueueID();exchange.type = MSG_CON;}//将id队列中的执行信息压入exchange中return QUEUE_Put(identity->queueId, &exchange, 0, DONT_WAIT);
}//定义发送响应函数
int32 SAMGR_SendResponse(const Request *request, const Response *response)
{// we need send the default the con message or not?if (request == NULL) {return EC_INVALID;}//获取交换请求对象Exchange *exchange = GET_OBJECT(request, Exchange, request);//交换类型一定要是需要被确认的请求if (exchange->type != MSG_CON) {return EC_INVALID;}if (exchange->handler == NULL) {return EC_SUCCESS;}//对交换类型、响应数据及长度进行初始化exchange->type = MSG_ACK;exchange->response.data = NULL;exchange->response.len = 0;//将响应的内容赋值到exchange结构体中去if (response != NULL) {exchange->response = *response;}// If there is no task queue, we will call the response processor in current task.//如果没有任务队列,则调用当前任务中的响应处理器。if (exchange->id.queueId == NULL) {exchange->handler(&exchange->request, &exchange->response);return EC_SUCCESS;}// Send back to the origin to process the task.// 如果上述情况都不满足则进行发送分享,这里的含义是将任务发送回原点以处理任务,即重置任务。int32 ret = SharedSend(exchange->id.queueId, exchange, 1);if (ret != EC_SUCCESS) {exchange->handler(&exchange->request, &exchange->response);(void)FreeReference(exchange);}return EC_SUCCESS;
}

接收消息与释放消息

详细代码及注解如下:

//定义消息接收函数
int32 SAMGR_MsgRecv(MQueueId queueId, uint8 *interMsg, uint32 size)
{if (queueId == NULL || interMsg == NULL || size == 0) {return EC_INVALID;}//将传入的消息复制入地址为0x00的位置if (memset_s(interMsg, size, 0x00, size) != EOK) {return EC_FAILURE;}//在执行队列ID中加入接收到的消息信息return QUEUE_Pop(queueId, interMsg, 0, WAIT_FOREVER);
}//定义释放消息
int32 SAMGR_FreeMsg(Exchange *exchange)
{//检查exchange的索引是否需要置空,调用函数以达成free索引的功能if (!FreeReference(exchange)) {return EC_SUCCESS;}//检查请求并置空请求数据if (exchange->request.len > 0) {SAMGR_Free(exchange->request.data);exchange->request.data = NULL;}//检查响应并置空响应数据if (exchange->response.len > 0) {SAMGR_Free(exchange->response.data);exchange->response.data = NULL;}return EC_SUCCESS;
}

共享

我们可以利用共享消息来节省一定的时间效率与空间效率,详细代码及注解如下:

//发送共享请求
uint32 *SAMGR_SendSharedRequest(const Identity *identity, const Request *request, uint32 *token, Handler handler)
{if (identity == NULL || request == NULL) {return NULL;}Exchange exchange = {*identity, *request, {NULL, 0}, MSG_NON, handler, token};exchange.type = (handler == NULL) ? MSG_NON : MSG_CON;exchange.id.queueId = NULL;int32 err = SharedSend(identity->queueId, &exchange, 0);if (err != EC_SUCCESS) {HILOG_ERROR(HILOG_MODULE_SAMGR, "SharedSend [%p] failed(%d)!", identity->queueId, err);(void)FreeReference(&exchange);}return exchange.sharedRef;
}//发送共享直接请求
int32 SAMGR_SendSharedDirectRequest(const Identity *id, const Request *req, const Response *resp, uint32 **ref,Handler handler)
{if (handler == NULL || ref == NULL) {return EC_INVALID;}Exchange exchange = {0};if (req != NULL) {exchange.request = *req;}if (resp != NULL) {exchange.response = *resp;}exchange.handler = handler;exchange.sharedRef = *ref;exchange.type = MSG_DIRECT;exchange.id = *id;exchange.id.queueId = NULL;int32 err = SharedSend(id->queueId, &exchange, 0);if (err != EC_SUCCESS) {HILOG_ERROR(HILOG_MODULE_SAMGR, "SharedSend [%p] failed(%d)!", id->queueId, err);(void)FreeReference(&exchange);}*ref = exchange.sharedRef;return err;
}//通过id发送响应
int32 SAMGR_SendResponseByIdentity(const Identity *id, const Request *request, const Response *response)
{// we need send the default the con message or not?if (request == NULL || id == NULL) {return EC_INVALID;}Exchange *exchange = GET_OBJECT(request, Exchange, request);if (exchange->type == MSG_NON) {return EC_INVALID;}exchange->id.queueId = id->queueId;return SAMGR_SendResponse(request, response);
}//定义共享发送函数
static int32 SharedSend(MQueueId queueId, Exchange *exchange, int initRef)
{/* if the msg data and response is NULL, we just direct copy, no need shared the message. *///如果消息数据和响应是空值,我们只需要直接复制,不需要分享消息if ((exchange->request.data == NULL || exchange->request.len <= 0) &&(exchange->response.data == NULL || exchange->response.len <= 0)) {return QUEUE_Put(queueId, exchange, 0, DONT_WAIT);//这里是直接将消息队列id复制入exchange执行task的id中}/* 1.add reference */MUTEX_GlobalLock();//加入全局互斥锁if (exchange->sharedRef == NULL) {//加入引用exchange->sharedRef = (uint32*)SAMGR_Malloc(sizeof(uint32));if (exchange->sharedRef == NULL) {MUTEX_GlobalUnlock();return EC_NOMEMORY;}*(exchange->sharedRef) = initRef;}//地址移1位(*(exchange->sharedRef))++;MUTEX_GlobalUnlock();//将任务队列中的id加入exchange中return QUEUE_Put(queueId, exchange, 0, DONT_WAIT);
}//释放exchange中的索引值
static BOOL FreeReference(Exchange *exchange)
{if (exchange == NULL) {return FALSE;}BOOL needFree = TRUE;/* 检查共享索引 */MUTEX_GlobalLock();if (exchange->sharedRef != NULL) {//共享索引地址移1位,但不能为0,因此当出现0时需要及时进行重置if (*(exchange->sharedRef) > 0) {(*(exchange->sharedRef))--;}if (*(exchange->sharedRef) > 0) {needFree = FALSE;}}MUTEX_GlobalUnlock();if (needFree) {SAMGR_Free(exchange->sharedRef);exchange->sharedRef = NULL;}return needFree;
}

知识补充

在exchange结构体中,我们对The exchange type.即交换类型有详细的枚举类型定义:

enum ExchangeType {MSG_EXIT = -1,//退出MSG_NON = 0,//不需要确认MSG_CON = 1,//需要确认MSG_ACK = 2, //应答消息MSG_SYNC = 3,//同步消息MSG_DIRECT = 4,//直接交换
};

事实上,消息的传导,即响应请求模式是基于COAP协议的。
详情请见:COAP协议简介。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 蓝桥杯——最大公约数

    辗转相除法&#xff1a; 辗转相除法相比更相减损法更常用&#xff0c;这里就介绍一下辗转相除法的实现方法 这个偏向模板化&#xff0c; 1.递归实现 你可以这样记&#xff0c;这里的参数列表内的a和b是向左移动的&#xff0c;a变成b&#xff0c;b变成a%b&#xff0c;b0返回a a与…...

    2024/4/19 23:02:21
  2. 美团高级测试面试700题汇总:软测+MySQL+Liunx+Python+自动化等

    前言 面试&#xff1a;如果不准备充分的面试&#xff0c;完全是浪费时间&#xff0c;更是对自己的不负责。 今天给大家分享下我整理的BAT软件测试面试专题及答案&#xff0c;其中大部分都是大企业面试常问的面试题&#xff0c;可以对照这查漏补缺&#xff0c;当然了&#xff…...

    2024/4/15 18:06:53
  3. CRT常用设置

    shift insert&#xff08;跟鼠标右键一个效果&#xff09; 使用SecureCRT的常用配置 1. Session Options --> Terminal 中将Anti-idle下的 Sending String选项打钩&#xff0c;并且在后面输入框中随意输入几个空格。用处是防止你在停止操作几分钟后操作会被断开&#xff0…...

    2024/4/18 0:25:24
  4. 详解Linux文件系统

    文章目录思维导图下载:磁盘组成与分区磁盘的组成:为啥要进行格式化FHS文件系统层级标准ext文件系统结构ext文件系统与目录的关系术语ext系列文件系统的区别ext文件系统ext2文件系统日志文件系统ext3ext4xfs文件系统软链接与硬链接学习遇到的问题dumpe2fs 思维导图下载: http…...

    2024/4/19 8:22:50
  5. 归并排序C++

    //确定分界点 //递归排序左右 //归并合二为一//总体思想&#xff1a;分治 //先进行递归分治 在一个小区间进行排序 之后回溯在一个左右区间都排好的大区间排序 最后归为一个大区间排序 //比如&#xff1a;1 3--7 4 --8 9 -- 10 3-- 4 8 //第一次1 3 --4 7 --8 9--3 10 -- 4 8 /…...

    2024/4/20 1:07:04
  6. 《信息工程》读书笔记

    可行性研究包括 明确任务、调查环境、提出方案和可行性分析 四个方面 企业系统规划法是一种对企业 管理信息系统 进行规划和设计的结构化方法&#xff0c;它是由美国的 IBM 公司在20世纪60年代末创造并逐步发展起来的。 防火墙在逻辑上是一个 隔离器、 过滤器 、监视器 按照…...

    2024/4/15 18:07:49
  7. SpringSecurity-api安全机制之https

    参考视频教程: **Spring Cloud微服务安全实战 ** 命令 只要安装了java环境就可以执行这一行命令 keytool -genkeypair -alias xxx -keyalg RSA -keystore /Users/eistert/Desktop/uaa/keys/xxx.key-alias 别名 -keystore 秘钥存储位置输入密码本身的口令 xxxx名字和姓氏…...

    2024/4/15 18:07:39
  8. pytorch深度学习(1)--线性模型

    线性模型示例一&#xff1a;示例二&#xff1a;刚入门深度学习的小白&#xff0c;以下代码示例以及近期发表文章示例都是跟着B站刘二大人学习所得。示例一&#xff1a; 代码如下&#xff08;示例&#xff09;&#xff1a; # 引入绘图的包 import numpy as np import matplotl…...

    2024/4/15 18:07:54
  9. Java8函数式编程

    Java8新引入函数式编程方式&#xff0c;大大的提高了编码效率 函数式接口&#xff1b;它指的是有且只有一个未实现的方法的接口&#xff0c;一般通过FunctionalInterface这个注解来表明某个接口是一个函数式接口。函数式接口是Java支持函数式编程的基础。 四大函数式接口 1…...

    2024/4/15 18:07:44
  10. 实验七 数据库应用

    实验目的&#xff1a;了解数据库系统、关系模型、客户-服务器模式等基本概念&#xff0c;掌握SQL的数据定义、数据操纵和数据查询等语句的语法&#xff1b;了解JDBC各种数据库驱动程序类型&#xff0c;熟悉JDBC提供的接口和类&#xff0c;掌握指定驱动类型、连接数据库、执行SQ…...

    2024/4/18 5:05:55
  11. 2021/10/30python在ctf应用

    数据处理 获取网页内容 获取respond 发送GET 发送POST 发送COOKIE 普通盲注 # -*- coding: utf-8 -*- # Author : Yn8rt # Time : 2021/7/27 12:21 # Function: import requests import sysurl http://xxxxxxxxxxxxxxx letter 0123456789abcdefghijklmnopqrstuvwxyz-{}…...

    2024/4/17 22:31:52
  12. 2021-10-30 关于ORACLE 19c DBA_JOBS不能自动执行 LAST_DATE为空 排查方式

    ORACLE DBA_JOBS 相关报错解决方式 背景&#xff1a;在新创建的ORACLE 19c单实例数据库环境&#xff0c;恢复生产环境数据后&#xff0c;发现任务调度重启、重建仍不能自动进行调度&#xff0c;后发现DBA_JOBS不会自动执行&#xff0c;NEXT_DATE正常&#xff0c;LAST_DATE为空&…...

    2024/4/6 10:58:51
  13. 美多商场之图形验证码

    美多商场之图形验证码1.图形验证码逻辑分析2.图形验证码接口设计和定义3.图形验证码后端逻辑4.图形验证码前端逻辑1.图形验证码逻辑分析 目的&#xff1a;了解图形验证码前后端业务逻辑流程和功能需求 知识要点 将图形验证码的文字信息保存到Redis数据库&#xff0c;为短信验证…...

    2024/4/6 10:58:50
  14. kettle工具实现数据清洗

    一、Excel的输入 1.将要处理的文件保存到Excel表中&#xff0c;然后打开kettle创建一个转换并命名&#xff0c;拖入“Excel输入”控件。 2.配置Excel表控件 二、生成记录 1.新建转换&#xff0c;打开“生成记录”控件。 2.限制处输入记录内容。 3.运行并查看和数据 三、生成随…...

    2024/4/15 18:07:54
  15. 剑指 Offer 06. 从尾到头打印链表(复习打卡)

    目录 题目描述 思路 题目描述 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] 思路 遍历链表&#xff0c;将其放在数组中&#xff0…...

    2024/4/6 10:58:48
  16. Java基础_131. 字符串拼接升级版

    字符串的拼接既耗时, 有浪费空间, 这里要采用StringBuilder 来改进. 拼接字符串的需求和分析思路: 第一步: 定义数组. 第二步, 定义一个方法. 第3步, 在方法内部书写拼接的步骤. 如果是最后一个元素, 直接拼接这个元素就可以了. 如果不是最后一个元素, 拼接该元素之后, 还要拼接…...

    2024/4/15 18:07:29
  17. 练习题(┭┮﹏┭┮)

    /*编写一个程序&#xff0c;从键盘上输入以一个0~100之间的整数&#xff0c;然后判断该数是否既可以被3整除又可以被7整除的数。*///filenameK:lianxi_3import java.util.Scanner;public class lianxi_3{public static void main(String[] args){Scanner readernew Scanner(Sys…...

    2024/4/15 18:07:24
  18. MySQL 批量insert 、单条insert

    目录准备数据表单条insert批量insert本文简单介绍在MySQL中insert数据方法。准备数据表 CREATE TABLE test5 (id int(11) NOT NULL AUTO_INCREMENT,name varchar(45) NOT NULL,age tinyint(4) NOT NULL DEFAULT 0 COMMENT 0:yes, -1:no,PRIMARY KEY (id),UNIQUE KEY name_UNIQ…...

    2024/4/15 18:07:59
  19. set是如何去重的?

    面试题&#xff1a;set是如何去重的&#xff1f; 回到源码&#xff1a; public boolean add(E e) {return map.put(e, PRESENT)null;}点进去 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int …...

    2024/4/15 18:07:34
  20. sed简介

    sed介绍 sed是Stream Editor&#xff08;流编辑器&#xff09;的缩写&#xff0c;简称流编辑器&#xff1b;用来处理文件的。 原理&#xff1a; sed是一行一行读取文件内容并按照要求进行处理&#xff0c;把处理后的结果输出到屏幕。 首先sed读取文件中的一行内容&#xff0…...

    2024/4/15 18:07:54

最新文章

  1. 创新指南|利用 AI 工具转变您的内容策略

    内容策略涉及规划、创建和管理内容。无论您是在策划博客文章、社交媒体更新还是网站内容&#xff0c;精心制定的内容策略是营销活动成功的关键。然而&#xff0c;如果没有合适的工具&#xff0c;维持强大的内容策略可能会具有挑战性。这就是人工智能(AI) 工具发挥作用的地方&am…...

    2024/4/20 5:49:10
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. redis之主从复制、哨兵模式

    一 redis群集有三种模式 主从复制&#xff1a; 主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。 主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。 缺陷&#xff1a; 故障恢复无法自动化&…...

    2024/4/18 20:00:55
  4. DNS和HTTP

    DNS应用层协议 域名解析系统 使用IP地址&#xff0c;来描述设备在网络上的位置 IP地址并不适合来进行传播网站&#xff0c;就采用了域名的方式来解决网站传播的问题。如www.baidu.com这样类似的就很容易让人记住。其域名就直接代表了这个网站。而且有一套自动的系统会将域名解…...

    2024/4/20 3:13:53
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/19 14:24:02
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/19 18:20:22
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/19 11:57:31
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/19 11:57:31
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/19 11:57:52
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/19 11:57:53
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/19 11:58:14
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/19 11:58:20
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/19 23:45:49
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/19 11:58:39
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/19 11:58:51
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/20 3:12:02
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/19 11:59:15
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/19 11:59:23
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/19 11:59:44
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/19 11:59:48
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/19 12:00:06
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/19 16:57:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/19 12:00:25
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/19 12:00:40
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57