Robot Operating System——内部审查(Introspection)Service

大纲

  • introspection_service
    • 检验Parameter值和类型
    • 修改内部审查(Introspection)功能的状态
    • 完整代码
  • introspection_client
    • 完整代码
  • 测试
  • 参考资料

在ROS 2(Robot Operating System 2)中,内部审查(Introspection)是一种强大的功能,它允许用户和开发者查询和理解系统中的实时状态和配置。这种能力特别重要,因为它提供了一种方法来监视和调试复杂的机器人系统,从而确保系统的健康和性能。

Introspection功能通常包括但不限于以下几个方面:

  1. 节点状态和信息查询:允许查询系统中活动节点的状态,包括它们的名称、命名空间、正在运行的进程ID等信息。
  2. 主题和服务发现:提供机制来发现系统中活动的主题和服务,包括它们的类型、发布者和订阅者。
  3. 参数配置和管理:允许动态查询和设置节点参数,这对于调整系统行为和性能参数至关重要。
  4. 服务调用和响应监控:能够监视服务请求和响应,帮助开发者理解系统中的交互和潜在问题。

本文我们将通过例子demo_nodes_cpp/src/services/introspection_service.cpp和demo_nodes_cpp/src/services/introspection_client.cpp来讲解如何使用内部审查(Introspection)功能。

introspection_service

demo_nodes_cpp/src/services/introspection_service.cpp沿用了《Robot Operating System——Service的同步/异步通信》的相关功能,提供了计算两个整型值之和的功能。本文我们不分析这块代码,只是贴出来供大家参考。

class IntrospectionServiceNode : public rclcpp::Node
{
public:DEMO_NODES_CPP_PUBLICexplicit IntrospectionServiceNode(const rclcpp::NodeOptions & options): Node("introspection_service", options){auto handle_add_two_ints = [this](const std::shared_ptr<rmw_request_id_t> request_header,const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response) -> void{(void)request_header;RCLCPP_INFO(this->get_logger(), "Incoming request\na: %" PRId64 " b: %" PRId64,request->a, request->b);response->sum = request->a + request->b;};// Create a service that will use the callback function to handle requests.srv_ = create_service<example_interfaces::srv::AddTwoInts>("add_two_ints", handle_add_two_ints);

和内部审查(Introspection)功能相关是之后的代码。

我们会通过Parameter参数service_configure_introspection来控制Node的内部审查(Introspection)功能的开启后者关闭。这种设计非常有必要,因为内部审查(Introspection)功能会消耗很多资源。如果我们不排查问题,最好将其关闭。

我们在后面的代码中可以发现,不管是Service还是Client,都默认将service_configure_introspection设置为disabled。

    this->declare_parameter("service_configure_introspection", "disabled");

检验Parameter值和类型

我们使用Parameter校验回调检测Parameter参数是否符合我们的设计。在本例中,我们要求自定义的service_configure_introspection是String类型,且其值只能是:“disabled”、“metadata"和"contents”。

对于校验回调函数相关知识可以参考《Robot Operating System——Parameter设置的预处理、校验和成功回调》。

// demo_nodes_cpp/src/services/introspection_service.cppauto on_set_parameter_callback =[](std::vector<rclcpp::Parameter> parameters) {rcl_interfaces::msg::SetParametersResult result;result.successful = true;for (const rclcpp::Parameter & param : parameters) {if (param.get_name() != "service_configure_introspection") {continue;}if (param.get_type() != rclcpp::ParameterType::PARAMETER_STRING) {result.successful = false;result.reason = "must be a string";break;}if (param.as_string() != "disabled" && param.as_string() != "metadata" &&param.as_string() != "contents"){result.successful = false;result.reason = "must be one of 'disabled', 'metadata', or 'contents'";break;}}return result;};on_set_parameters_callback_handle_ = this->add_on_set_parameters_callback(on_set_parameter_callback);

修改内部审查(Introspection)功能的状态

如果上述校验通过,Parameter参数就会被设置成功。然后我们就可以在“成功回调”中通过Node::configure_introspection方法修改部审查(Introspection)功能的状态。

// demo_nodes_cpp/src/services/introspection_service.cppauto post_set_parameter_callback =[this](const std::vector<rclcpp::Parameter> & parameters) {for (const rclcpp::Parameter & param : parameters) {if (param.get_name() != "service_configure_introspection") {continue;}rcl_service_introspection_state_t introspection_state = RCL_SERVICE_INTROSPECTION_OFF;if (param.as_string() == "disabled") {introspection_state = RCL_SERVICE_INTROSPECTION_OFF;} else if (param.as_string() == "metadata") {introspection_state = RCL_SERVICE_INTROSPECTION_METADATA;} else if (param.as_string() == "contents") {introspection_state = RCL_SERVICE_INTROSPECTION_CONTENTS;}this->srv_->configure_introspection(this->get_clock(), rclcpp::SystemDefaultsQoS(), introspection_state);break;}};post_set_parameters_callback_handle_ = this->add_post_set_parameters_callback(post_set_parameter_callback);

在ROS 2中,RCL_SERVICE_INTROSPECTION_OFF、RCL_SERVICE_INTROSPECTION_METADATA、和RCL_SERVICE_INTROSPECTION_CONTENTS是用于配置服务内部审查(Introspection)级别的枚举值。这些枚举值允许开发者控制ROS 2节点中服务的内省细节级别,以适应不同的监控和调试需求。

  • RCL_SERVICE_INTROSPECTION_OFF:
    这个枚举值用于完全关闭服务的内省功能。当选择这个级别时,系统不会收集或提供任何关于服务调用的内省数据。这可以用于生产环境中,当性能是关键考虑因素,且不需要内省数据时。

  • RCL_SERVICE_INTROSPECTION_METADATA:
    使用这个枚举值,服务的内省将仅包括基本的元数据信息,如服务的名称和类型。这提供了一种中等级别的内省,允许开发者和系统管理员了解服务的基本情况,而不会暴露服务调用的具体内容。这种级别的内省对于理解系统的结构和服务的布局很有用,同时保持了较高的隐私和性能。

  • RCL_SERVICE_INTROSPECTION_CONTENTS:
    当设置为这个枚举值时,服务的内省将包括服务调用的完整内容,包括请求和响应数据。这是最详细的内省级别,允许开发者深入了解服务的运行情况和交互数据。这对于调试复杂的问题和性能分析特别有价值,但可能会增加系统的开销,并可能暴露敏感信息。

完整代码

// Copyright 2023 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.#include <cinttypes>
#include <memory>
#include <vector>#include "rcl/service_introspection.h"#include "rclcpp/qos.hpp"
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_components/register_node_macro.hpp"#include "example_interfaces/srv/add_two_ints.hpp"
#include "rcl_interfaces/msg/set_parameters_result.hpp"#include "demo_nodes_cpp/visibility_control.h"// This demo program shows how to configure service introspection on the fly,
// by hooking it up to a parameter.  This program consists of a service
// node (IntrospectionServiceNode) that listens on the '/add_two_ints' service
// for clients.  When one connects and sends a request, it adds the two integers
// and returns the result.
//
// The above is a fairly common ROS 2 service, but what this program is trying
// to demonstrate is introspection capabilities.  The IntrospectionServiceNode
// has a string parameter called 'service_configure_introspection'.  If this is
// set to 'disabled' (the default), then no introspection happens.  If this is set
// to 'metadata' (see details on how to set the parameters below), then
// essential metadata (timestamps, sequence numbers, etc) is sent to a hidden
// topic called /add_two_ints/_service_event.
//
// To see this in action, run the following:
//
// ros2 launch demo_nodes_cpp introspect_services_launch.py
//   Since the default for introspection is 'disabled', this is no different than
//   a normal client and server.  No additional topics will be made, and
//   no introspection data will be sent.  However, changing the introspection
//   configuration dynamically is fully supported.  This can be seen by
//   running 'ros2 param set /introspection_service service_configure_introspection metadata'
//   which will configure the service to start sending service introspection
//   metadata to /add_two_ints/_service_event.
//
// Once the parameter is set, introspection data can be seen by running:
//   ros2 topic echo /add_two_ints/_service_eventnamespace demo_nodes_cpp
{class IntrospectionServiceNode : public rclcpp::Node
{
public:DEMO_NODES_CPP_PUBLICexplicit IntrospectionServiceNode(const rclcpp::NodeOptions & options): Node("introspection_service", options){auto handle_add_two_ints = [this](const std::shared_ptr<rmw_request_id_t> request_header,const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response) -> void{(void)request_header;RCLCPP_INFO(this->get_logger(), "Incoming request\na: %" PRId64 " b: %" PRId64,request->a, request->b);response->sum = request->a + request->b;};// Create a service that will use the callback function to handle requests.srv_ = create_service<example_interfaces::srv::AddTwoInts>("add_two_ints", handle_add_two_ints);auto on_set_parameter_callback =[](std::vector<rclcpp::Parameter> parameters) {rcl_interfaces::msg::SetParametersResult result;result.successful = true;for (const rclcpp::Parameter & param : parameters) {if (param.get_name() != "service_configure_introspection") {continue;}if (param.get_type() != rclcpp::ParameterType::PARAMETER_STRING) {result.successful = false;result.reason = "must be a string";break;}if (param.as_string() != "disabled" && param.as_string() != "metadata" &&param.as_string() != "contents"){result.successful = false;result.reason = "must be one of 'disabled', 'metadata', or 'contents'";break;}}return result;};auto post_set_parameter_callback =[this](const std::vector<rclcpp::Parameter> & parameters) {for (const rclcpp::Parameter & param : parameters) {if (param.get_name() != "service_configure_introspection") {continue;}rcl_service_introspection_state_t introspection_state = RCL_SERVICE_INTROSPECTION_OFF;if (param.as_string() == "disabled") {introspection_state = RCL_SERVICE_INTROSPECTION_OFF;} else if (param.as_string() == "metadata") {introspection_state = RCL_SERVICE_INTROSPECTION_METADATA;} else if (param.as_string() == "contents") {introspection_state = RCL_SERVICE_INTROSPECTION_CONTENTS;}this->srv_->configure_introspection(this->get_clock(), rclcpp::SystemDefaultsQoS(), introspection_state);break;}};on_set_parameters_callback_handle_ = this->add_on_set_parameters_callback(on_set_parameter_callback);post_set_parameters_callback_handle_ = this->add_post_set_parameters_callback(post_set_parameter_callback);this->declare_parameter("service_configure_introspection", "disabled");}private:rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr srv_;rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtron_set_parameters_callback_handle_;rclcpp::node_interfaces::PostSetParametersCallbackHandle::SharedPtrpost_set_parameters_callback_handle_;
};}  // namespace demo_nodes_cppRCLCPP_COMPONENTS_REGISTER_NODE(demo_nodes_cpp::IntrospectionServiceNode)

introspection_client

demo_nodes_cpp/src/services/introspection_client.cpp沿用了《Robot Operating System——Service的同步/异步通信》的中Client端相关功能,它会每隔500毫秒向Server端发送一个计算2+3之和的请求。

    timer_ = this->create_wall_timer(std::chrono::milliseconds(500),[this]() {if (!client_->service_is_ready()) {return;}if (!request_in_progress_) {auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();request->a = 2;request->b = 3;request_in_progress_ = true;client_->async_send_request(request,[this](rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedFuture cb_f){request_in_progress_ = false;RCLCPP_INFO(get_logger(), "Result of add_two_ints: %ld", cb_f.get()->sum);});return;}});

对于内部审查(Introspection)功能的开启关闭,它的逻辑和Service端一模一样,我们即不赘述了。

完整代码

// Copyright 2023 Open Source Robotics Foundation, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.#include <chrono>
#include <memory>
#include <vector>#include "rcl/service_introspection.h"#include "rclcpp/qos.hpp"
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_components/register_node_macro.hpp"#include "example_interfaces/srv/add_two_ints.hpp"
#include "rcl_interfaces/msg/set_parameters_result.hpp"#include "demo_nodes_cpp/visibility_control.h"// This demo program shows how to configure client introspection on the fly,
// by hooking it up to a parameter.  This program consists of a client
// node (IntrospectionClientNode) that has a timer callback that runs every
// 500 milliseconds.  If the service is not yet ready, no further work is done.
// If the client doesn't currently have a request in flight, then it creates a
// new AddTwoInts service request, and asynchronously sends it to the service.
// When that request completes, it sets the flag back to having no requests in
// flight so another request is sent.
//
// The above is a fairly common ROS 2 client, but what this program is trying
// to demonstrate is introspection capabilities.  The IntrospectionClientNode
// has a string parameter called 'client_configure_introspection'.  If this is
// set to 'disabled' (the default), then no introspection happens.  If this is set
// to 'metadata' (see details on how to set the parameters below), then
// essential metadata (timestamps, sequence numbers, etc) is sent to a hidden
// topic called /add_two_ints/_service_event.
//
// To see this in action, run the following:
//
// ros2 launch demo_nodes_cpp introspect_services_launch.py
//   Since the default for introspection is 'disabled', this is no different than
//   a normal client and server.  No additional topics will be made, and
//   no introspection data will be sent.  However, changing the introspection
//   configuration dynamically is fully supported.  This can be seen by
//   running 'ros2 param set /introspection_client client_configure_introspection metadata'
//   which will configure the client to start sending service introspection
//   metadata to /add_two_ints/_service_event.
//
// Once the parameter is set, introspection data can be seen by running:
//   ros2 topic echo /add_two_ints/_service_eventnamespace demo_nodes_cpp
{
class IntrospectionClientNode : public rclcpp::Node
{
public:DEMO_NODES_CPP_PUBLICexplicit IntrospectionClientNode(const rclcpp::NodeOptions & options): Node("introspection_client", options){client_ = create_client<example_interfaces::srv::AddTwoInts>("add_two_ints");auto on_set_parameter_callback =[](std::vector<rclcpp::Parameter> parameters) {rcl_interfaces::msg::SetParametersResult result;result.successful = true;for (const rclcpp::Parameter & param : parameters) {if (param.get_name() != "client_configure_introspection") {continue;}if (param.get_type() != rclcpp::ParameterType::PARAMETER_STRING) {result.successful = false;result.reason = "must be a string";break;}if (param.as_string() != "disabled" && param.as_string() != "metadata" &&param.as_string() != "contents"){result.successful = false;result.reason = "must be one of 'disabled', 'metadata', or 'contents'";break;}}return result;};auto post_set_parameter_callback =[this](const std::vector<rclcpp::Parameter> & parameters) {for (const rclcpp::Parameter & param : parameters) {if (param.get_name() != "client_configure_introspection") {continue;}rcl_service_introspection_state_t introspection_state = RCL_SERVICE_INTROSPECTION_OFF;if (param.as_string() == "disabled") {introspection_state = RCL_SERVICE_INTROSPECTION_OFF;} else if (param.as_string() == "metadata") {introspection_state = RCL_SERVICE_INTROSPECTION_METADATA;} else if (param.as_string() == "contents") {introspection_state = RCL_SERVICE_INTROSPECTION_CONTENTS;}this->client_->configure_introspection(this->get_clock(), rclcpp::SystemDefaultsQoS(), introspection_state);break;}};on_set_parameters_callback_handle_ = this->add_on_set_parameters_callback(on_set_parameter_callback);post_set_parameters_callback_handle_ = this->add_post_set_parameters_callback(post_set_parameter_callback);this->declare_parameter("client_configure_introspection", "disabled");timer_ = this->create_wall_timer(std::chrono::milliseconds(500),[this]() {if (!client_->service_is_ready()) {return;}if (!request_in_progress_) {auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();request->a = 2;request->b = 3;request_in_progress_ = true;client_->async_send_request(request,[this](rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedFuture cb_f){request_in_progress_ = false;RCLCPP_INFO(get_logger(), "Result of add_two_ints: %ld", cb_f.get()->sum);});return;}});}private:rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client_;rclcpp::TimerBase::SharedPtr timer_;rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtron_set_parameters_callback_handle_;rclcpp::node_interfaces::PostSetParametersCallbackHandle::SharedPtrpost_set_parameters_callback_handle_;bool request_in_progress_{false};
};}  // namespace demo_nodes_cppRCLCPP_COMPONENTS_REGISTER_NODE(demo_nodes_cpp::IntrospectionClientNode)

测试

在两个终端中,分别启动服务端和客户端
在这里插入图片描述
在这里插入图片描述
然后再开一个终端查看内部审查数据

ros2 service echo --flow-style /add_two_ints

在这里插入图片描述
可以看到服务端和客户端在内部审查(Introspection)功能处于关闭状态时什么也看不到。

我们再开一个终端,修改服务端的Parameter。

ros2 param set /introspection_service service_configure_introspection metadata

在这里插入图片描述
这个时候我们就可以在审查终端数据开始更新。下图表示服务端收到一条客户端的请求,并发送返回给客户端。
在这里插入图片描述
我们将内部审查(Introspection)功能开启到RCL_SERVICE_INTROSPECTION_CONTENTS级别,然后观察变化。

ros2 param set /introspection_service service_configure_introspection contents

在这里插入图片描述
这次我们看到请求和返回都有了详细数据。
在这里插入图片描述
我们还可以对客户端开启内部审查(Introspection)功能,同样开启到RCL_SERVICE_INTROSPECTION_CONTENTS级别。

ros2 param set /introspection_client client_configure_introspection contents

在这里插入图片描述
可以看到审查终端中,数据变化的更快。一次请求被拆分成4个部门,分别是:

  • 客户端的REQUEST_SENT。表示向服务端发起请求。
  • 服务端的REQUEST_RECEIVED。表示服务端收到请求。
  • 服务端的RESPONSE_SENT。表示服务端发送返回结果。
  • 客户端的RESPONSE_RECEIVED。表示客户端收到返回结果。

在这里插入图片描述

参考资料

  • https://docs.ros.org/en/iron/Tutorials/Demos/Service-Introspection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876840.shtml

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

相关文章

【中项】系统集成项目管理工程师-第7章 软硬件系统集成-7.3软件集成

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

python 裁剪图片

情况&#xff1a; 有时候看视频&#xff0c;看到一个漂亮的妹子&#xff0c;按下 Alt PrintScreen 进行截图之后&#xff0c;会把整个屏幕都截图。 需要适当剪裁一下。 每次打开 PS &#xff0c; 也太慢了。 所以写个代码&#xff0c; 快速处理。 效果对比&#xff1a; 原始…

【2025留学】德国留学真的很难毕业吗?为什么大家不来德国留学?

大家好&#xff01;我是德国Viviane&#xff0c;一句话讲自己的背景&#xff1a;本科211&#xff0c;硕士在德国读的电子信息工程。 之前网上一句热梗&#xff1a;“德国留学三年将是你人生五年中最难忘的七年。”确实&#xff0c;德国大学的宽进严出机制&#xff0c;延毕、休…

OOP知识整合----集合

目录 一、定义 1、集合: ( 不限制长度&#xff0c;存多少是多少) 2、集合框架: 二、List集合中常用的方法 1、Boolean add(Object o) 2、void add(int index,Object o) 3、Boolean remove(Object o) 4、Object remove(int index) 5、int size() 6、Boolean conta…

Code Effective学习笔记--第8章防御式编程

这一章聚焦如何通过断言和Java的异常处理机制这些防御式编程的方法来提高程序的健壮性和安全性&#xff0c;这是防御式编程技术的方面。但是健壮性和安全性到了一定的程度其实是矛盾的&#xff0c;健壮性意味着对于任何的输入&#xff0c;程序都不会终止而且都能给出返回&#…

Tftp服务器环境搭建

1、什么是Tftp TFTP&#xff08;Trivial File Transfer Protocol&#xff0c;简单文件传输协议&#xff09;是一种基于UDP&#xff08;User Datagram Protocol&#xff09;的文件传输协议&#xff0c;它被设计为一个非常简单的文件传输机制&#xff0c;特别适用于那些对复杂性有…

make2exe:自动集成测试

模板Makefile&#xff0c;生成多个C/C模块的集成测试程序。

免费【2024】springboot 基于微信小程序的宠物服务中心

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

JavaDS —— 二叉搜索树、哈希表、Map 与 Set

前言 我们将学习 Map 与 Set 这两个接口下的 TreeMap 与 TreeSet &#xff0c;HashMap 与 HashSet &#xff0c;在学习这四个类使用之前&#xff0c;我们需要先学习 二叉搜索树与 哈希表的知识。 二叉搜索树 在学习二叉树的时候&#xff0c;我们就已经了解过二叉搜索树的概念…

酒店智能门锁接口pro[0922]D801 对接收银-SAAS本地化-未来之窗行业应用跨平台架构

proUSB接口函数[0922中性版]-D801 调用函数库&#xff1a; 提供Windows下的32位动态连接库proRFL.DLL&#xff0c;函数使用详细说明 //-----------------------------------------------------------------------------------// 功能&#xff1a;读DLL版本&#xff0c;不涉…

【Linux C | 网络编程】进程池退出的实现详解(五)

上一篇中讲解了在进程池文件传输的过程如何实现零拷贝&#xff0c;具体的方法包括使用mmap&#xff0c;sendfile&#xff0c;splice等等。 【Linux C | 网络编程】进程池零拷贝传输的实现详解&#xff08;四&#xff09; 这篇内容主要讲解进程池如何退出。 1.进程池的简单退…

Java并发编程(上)

并发&#xff1a;多个线程&#xff08;进程&#xff09;竞争一个资源 并行&#xff1a;多个线程&#xff08;进程&#xff09;同时运行不同资源 线程和进程的关系简单地说&#xff0c;进程是一个容器&#xff0c;一个进程中可以容纳若干个线程&#xff0c;一个进程里面&#…

微信小程序入门

创建一个入门程序 这是index.vxml代码 <!--index.wxml--> <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view class"container" ><view&…

苹果CMS:资源采集站如何设置定时采集详细教程讲解

我们搭建好站点之后&#xff0c;会自定义一些采集&#xff0c;但是需要每天去手动执行&#xff0c;有时候甚至会忘记&#xff0c;那我们如何处理呢&#xff1f;今天我们就来介绍一下如何设置定时器。 如果按照官方例子来设置定时器会遇到一个问题就是采集的资源未绑定类型&…

WAF+API安全代表厂商|瑞数信息入选IDC报告《生成式AI推动下的中国网络安全硬件市场现状及技术发展趋势》

近日&#xff0c;全球领先的权威资讯机构IDC正式发布《IDC Market Presentation&#xff1a;生成式AI推动下的中国网络安全硬件市场现状及技术发展趋势&#xff0c;2024》报告。报告中IDC 评估了众多厂商的安全硬件产品能力&#xff0c;并给出了产品对应的推荐厂商供最终用户参…

04 | 深入浅出索引(上)

此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记&#xff01; 索引的常见模型 可以提供查询效率的数据结构有很多&#xff0c;常见的有三种&#xff1a;哈希表、有序数组、搜索数。 哈希表是一种以 key-value 形式存储的数据结构。输入一个 key&#xff0c;通过固定…

强烈推荐java人,2024年大厂面试背这份(八股文+场景题结合)!很管用!

2024 年的行情&#xff0c;和 3~4 年前不同&#xff0c;通过海量简历投递和海量面试找工作的时代已经过去了。 在如今面试机会较少&#xff0c;并且面试难度较大的情况下。 充分做好面试的准备才是快速通过面试最有效的方法&#xff01; 切忌把真实面试当靶场&#xff0c;最…

信息学奥赛初赛天天练-48-CSP-J2020完善程序2-变量交换、冒泡排序、贪心算法、最小区间覆盖

PDF文档公众号回复关键字:20240728 2020 CSP-J 完善程序2 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) 最小区间覆盖 给出 n 个区间&#xff0c;第 i 个区间的左右端点是 [ai,bi]。现在要在这些区间中选出若干个&#xff0c;使得区间 [0, m] 被所选区间的…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…

第九讲 后端1

后端&#xff08;Backend&#xff09; 用带噪声的数据估计内在状态&#xff08;Estimated the inner state from noisy data&#xff09;——状态估计问题渐进式&#xff08;Incremental&#xff09;&#xff1a;保持当前状态的估计&#xff0c;在假如新信息时&#xff0c;更新…