【AimRT】AimRT Hello World
目录
- 一、工程结构
- 二、源码说明
- /CMakeLists.txt
- /cmake/GetAimRT.cmake
- /src/CMakeLists.txt
- /src/module/helloworld_module/CMakeLists.txt
- /src/app/helloworld_app/CMakeLists.txt
- /src/install/cfg/helloworld_cfg.yaml
- /src/module/helloworld_module/helloworld_module.h
- /src/module/helloworld_module/helloworld_module.cc
- /src/app/helloworld_app/main.cc
- 三、编译与运行
官方 Hello World 文档链接:https://docs.aimrt.org/tutorials/quick_start/helloworld_cpp.html
这里对其增加一些说明。
目前 AimRT 仅支持从源码安装,并且对于第三方依赖,也是通过拉取源码的方式安装,该方式通过 CMake 的FetchContent 实现,虽然该方式可以增强AimRT环境配置的兼容性,但对于封闭网络开发与网络不好的用户不太友好,而且部署一次环境是局部生效的,同一台电脑再新建一个工程还需要拉取源码安装一次。
该 Hello World Demo 涉及以下内容:
- 基于 CMake FetchContent 通过源码引用 AimRT;
- 编写一个基础的基于 AimRT CPP 接口的
Module
; - 使用基础的日志功能;
- 使用基础的配置功能;
- 以 App 模式集成
Module
; - 编译项目,并运行进程以执行
Module
中的逻辑。
一、工程结构
├── CMakeLists.txt
├── cmake
│ └── GetAimRT.cmake # 基于 CMake FetchContent 通过源码引用 AimRT
└── src├── CMakeLists.txt├── install # 存放部署时的一些配置、启动脚本等│ └── cfg│ └── helloworld_cfg.yaml # AimRT配置文件 ├── module # 存放业务逻辑代码│ └── helloworld_module│ ├── CMakeLists.txt│ ├── helloworld_module.cc # Module源文件│ └── helloworld_module.h # Module头文件└── app # 以App模式集成Module└── helloworld_app ├── CMakeLists.txt└── main.cc
二、源码说明
/CMakeLists.txt
根 CMake ,用于构建工程。
# 指定项目所需的最低CMake版本
cmake_minimum_required(VERSION 3.24)# 定义项目的名称为helloworld,并指定该项目将使用C和C++语言
project(helloworld LANGUAGES C CXX)# 设置项目使用的C++标准为C++20
set(CMAKE_CXX_STANDARD 20)
# 要求CMake确保编译器支持指定的C++标准。
# 如果编译器不支持该标准,CMake配置将失败。
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 禁用编译器特定的扩展
set(CMAKE_CXX_EXTENSIONS OFF)# 包含一个名为GetAimRT.cmake的CMake模块
# 用于通过源码引用 AimRT
include(cmake/GetAimRT.cmake)# 添加并处理src子目录
add_subdirectory(src)
/cmake/GetAimRT.cmake
通过源码引用 AimRT
# 包含FetchContent模块,该模块提供了一系列函数和宏,用于从远程仓库获取内容
include(FetchContent)message("get aimrt ...")# 使用FetchContent_Declare函数声明一个名为aimrt的外部项目
FetchContent_Declare(aimrtGIT_REPOSITORY https://github.com/AimRT/aimrt.git # 项目仓库链接GIT_TAG v0.9.2) # 项目版本# 获取aimrt项目属性
# 用于检查项目是否已经被下载、配置和构建
FetchContent_GetProperties(aimrt)# 检查aimrt项目是否已经下载并准备好用于构建
# 如果项目尚未准备好,则调用FetchContent_MakeAvailable函数下载、配置和构建该项目,
# 并将其添加到当前项目的构建系统中,使其可用
if(NOT aimrt_POPULATED)FetchContent_MakeAvailable(aimrt)
endif()
/src/CMakeLists.txt
引用 src 下的各个子目录
add_subdirectory(module/helloworld_module)
add_subdirectory(app/helloworld_app)
/src/module/helloworld_module/CMakeLists.txt
创建helloworld_module
静态库
# 递归地查找当前源目录(${CMAKE_CURRENT_SOURCE_DIR})下所有以.cc结尾的文件,
# 并将这些文件的路径列表赋值给变量src
file(GLOB_RECURSE src ${CMAKE_CURRENT_SOURCE_DIR}/*.cc)# 创建一个名为helloworld_module的静态库目标
add_library(helloworld_module STATIC)
# 为helloworld_module静态库创建一个别名目标helloworld::helloworld_module
# 别名目标允许以更具命名空间风格的方式引用库,这在大型项目中尤其有用,可以避免名称冲突
add_library(helloworld::helloworld_module ALIAS helloworld_module)# 将之前通过file(GLOB_RECURSE ...)找到的源文件(变量src)添加到helloworld_module目标的私有源文件中
# PRIVATE意味这些文件仅对helloworld_module目标本身可见,不会传播到依赖于它的其他目标
target_sources(helloworld_module PRIVATE ${src})# 为helloworld_module目标添加公共头文件目录
# 公共头文件目录意味着这些目录不仅可用于构建helloworld_module本身,
# 还可用于构建依赖于helloworld_module的任何目标
target_include_directories(helloworld_modulePUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..)# 指定helloworld_module目标需要链接的库
target_link_libraries(helloworld_module# yaml-cpp库是私有依赖项,仅用于构建helloworld_module本身,不会传播到依赖于它的其他目标PRIVATE yaml-cpp::yaml-cpp # 公共依赖项,不仅用于构建helloworld_module,还用于构建依赖于helloworld_module的任何目标PUBLIC aimrt::interface::aimrt_module_cpp_interface)
/src/app/helloworld_app/CMakeLists.txt
创建helloworld_app
可执行文件
# 递归地查找当前源目录(${CMAKE_CURRENT_SOURCE_DIR})下所有以.cc结尾的文件,
# 并将这些文件的路径列表赋值给变量src
file(GLOB_RECURSE src ${CMAKE_CURRENT_SOURCE_DIR}/*.cc)# 添加名为helloworld_app的可执行文件
add_executable(helloworld_app)# 为helloworld_app目标指定源文件
target_sources(helloworld_app PRIVATE ${src})# 为helloworld_app目标指定头文件
target_include_directories(helloworld_appPRIVATE ${CMAKE_CURRENT_SOURCE_DIR})# 为helloworld_app目标指定链接库
target_link_libraries(helloworld_appPRIVATE aimrt::runtime::core helloworld::helloworld_module)
/src/install/cfg/helloworld_cfg.yaml
配置文件
aimrt:log: # log配置core_lvl: Debug # 内核日志等级,可选项:Trace/Debug/Info/Warn/Error/Fatal/Off,不区分大小写backends: # 日志后端- type: console # 控制台日志options:color: true # 是否要彩色打印module_filter: "(.*)" # 支持以正则表达式的形式,来配置哪些模块的日志可以通过本后端处理pattern: "[%c.%f][%l][%t][%n][%G:%R @%F] %v" # 日志格式化输出- type: rotate_file # 将日志打印到文件中options:path: ./log # 日志文件存放目录filename: examples_cpp_hello_world.log # 日志文件名称# 模块自定义业务配置,以模块名称为节点名
HelloWorldModule:name: "HelloWorldModule"array: - name: helloenable: true- name: worldenable: false
/src/module/helloworld_module/helloworld_module.h
Module头文件
// 防止头文件在当前编译单元中被多次引用
#pragma once#include "aimrt_module_cpp_interface/module_base.h"// 定义一个 HelloWorldModule 类,继承自aimrt::ModuleBase
class HelloWorldModule : public aimrt::ModuleBase
{
public:HelloWorldModule() = default;~HelloWorldModule() override = default;// 模块信息,包括name、version、author、description等aimrt::ModuleInfo Info() const override{return aimrt::ModuleInfo{.name = "HelloWorldModule",.major_version = 0,.minor_version = 1,.patch_version = 0,.build_version = 0,.author = "vistar",.description = "AimRT hello world model"};}// 初始化模块资源bool Initialize(aimrt::CoreRef core) override;// 启动模块bool Start() override;// 关闭模块void Shutdown() override;private:// 返回一个日志记录器实例auto GetLogger() { return core_.GetLogger(); }private:aimrt::CoreRef core_;aimrt::parameter::ParameterHandleRef parameter_handle_;
};
/src/module/helloworld_module/helloworld_module.cc
Module源文件
#include "helloworld_module/helloworld_module.h"
#include "yaml-cpp/yaml.h"bool HelloWorldModule::Initialize(aimrt::CoreRef core)
{// Save aimrt framework handlecore_ = core;// LogAIMRT_INFO("Init HelloWorldModule.");try{// Read cfgauto file_path = core_.GetConfigurator().GetConfigFilePath();if (!file_path.empty()){// 将配置写入到临时文件中,使用YAML-CPP加载配置YAML::Node config = YAML::LoadFile(file_path.data());std::string moduleName = config["name"].as<std::string>();AIMRT_INFO("moduleName: {}", moduleName);for (const auto &itemNode : config["array"]){std::string itemName = itemNode["name"].as<std::string>();bool enable = itemNode["enable"].as<bool>();AIMRT_INFO("name: {}, enable: {}", itemName, enable);}}}catch (const std::exception &e){AIMRT_ERROR("Init failed, {}", e.what());return false;}AIMRT_INFO("Init HelloWorldModule succeeded.");return true;
}bool HelloWorldModule::Start()
{AIMRT_INFO("Start HelloWorldModule succeeded.");return true;
}void HelloWorldModule::Shutdown()
{AIMRT_INFO("Shutdown HelloWorldModule succeeded.");
}
/src/app/helloworld_app/main.cc
#include <csignal>
#include <iostream>#include "core/aimrt_core.h"
#include "helloworld_module/helloworld_module.h"using namespace aimrt::runtime::core;AimRTCore *global_core_ptr_ = nullptr;// 信号处理函数
void SignalHandler(int sig)
{if (global_core_ptr_ && (sig == SIGINT || sig == SIGTERM)){global_core_ptr_->Shutdown();return;}raise(sig);
};int32_t main(int32_t argc, char **argv)
{// 注册 ctrl+c 信号监听,用 SignalHandler 函数处理signal(SIGINT, SignalHandler);// 注册 kill 信号监听,用 SignalHandler 函数处理signal(SIGTERM, SignalHandler);std::cout << "AimRT start." << std::endl;try{// 实例化 AimRTCoreAimRTCore core;global_core_ptr_ = &core;// register moduleHelloWorldModule helloworld_module;core.GetModuleManager().RegisterModule(helloworld_module.NativeHandle());// 通过命令行参数读取配置文件路径AimRTCore::Options options;options.cfg_file_path = argv[1];// 初始化AimRT,初始化注册的 Modulecore.Initialize(options);// 启动AimRT,启动注册的 Module// 阻塞主线程等待结束core.Start();core.Shutdown();global_core_ptr_ = nullptr;}catch (const std::exception &e){std::cout << "AimRT run with exception and exit. " << e.what() << std::endl;return -1;}std::cout << "AimRT exit." << std::endl;return 0;
}
三、编译与运行
编译工程和普通编译CMake工程操作一样:
# 在根CMakeList.txt同级目录执行
# 生成构建文件,配置项目
cmake -B build# 编译和链接可执行文件和库文件
cd build
make -j
运行AimRT可执行文件,需要传入配置文件。
编译完成后,将生成的可执行文件helloworld_app
和配置文件helloworld_cfg.yaml
拷贝到一个目录下,然后执行以下命令运行进程:
./helloworld_app helloworld_cfg.yaml
相关文章:
【AimRT】AimRT Hello World
目录 一、工程结构二、源码说明/CMakeLists.txt/cmake/GetAimRT.cmake/src/CMakeLists.txt/src/module/helloworld_module/CMakeLists.txt/src/app/helloworld_app/CMakeLists.txt/src/install/cfg/helloworld_cfg.yaml/src/module/helloworld_module/helloworld_module.h/src/…...
在Typora中实现自动编号
文章目录 在Typora中实现自动编号1. 引言2. 准备工作3. 自动编号的实现3.1 文章大纲自动编号3.2 主题目录(TOC)自动编号3.3 文章内容自动编号3.4 完整代码 4. 应用自定义CSS5. 结论 在Typora中实现自动编号 1. 引言 Typora是一款非常流行的Markdown编辑…...
Vue2/Vue3使用DataV
Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…...
Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决
在 Docker 环境中搭建 Redis 哨兵模式集群的步骤与问题解决 在 Redis 高可用架构中,哨兵模式(Sentinel)是确保 Redis 集群在出现故障时自动切换主节点的一种机制。通过使用 Redis 哨兵,我们可以实现 Redis 集群的监控、故障检测和…...
数据库设计
数据库设计全攻略:从理论到实践 在当今数字化驱动的世界里,数据已然成为企业和组织最为宝贵的资产之一。而数据库,作为数据的“栖息地”,其设计的优劣直接关系到整个信息系统的性能、可维护性以及能否高效满足业务需求。一个精心构思的数据库设计方案,就如同为一座高楼打…...
三甲医院等级评审八维数据分析应用(一)--组织、制度、管理可视化篇
一、引言 1.1 研究背景与意义 在当今医疗领域,三甲医院作为医疗服务的核心载体,肩负着保障民众健康、推动医学进步的重任。随着信息技术的飞速发展,数据已成为医院运营管理、医疗质量提升以及科学决策的关键要素。三甲医院等级评审作为衡量医院综合实力与服务水平的重要标…...
【2025软考高级架构师】案例题重点知识——第一部分
1.架构风格相关问题 什么是架构风格? 软件架构风格类似于建筑风格,从相同类型的软件系统中抽取其架构的共性,是一种惯用模式,反映了众多系统共有的结构和语义 (1)软件架构为软件系统提供了一个结构、行为和属性的高级抽象。 (2)软件架构风格是特定应用领域的惯用模式,架…...
Science Robotics让软机器人“活”得更久的3D打印!
软机器人硬件在医疗、探索无结构环境等领域有广泛应用,但其生命周期有限,导致资源浪费和可持续性差。软机器人结合软硬组件,复杂组装和拆卸流程使其难以维修和升级。因此,如何延长软机器人的生命周期并提高其可持续性成为亟待解决…...
【JVM】总结篇-运行时内存篇
文章目录 JVM内存模型(内存结构)程序计数器 pc虚拟机栈本地方法栈 native堆堆空间堆中一些JVM参数堆中垃圾回收过程MinorGC MajorGC FullGC年轻代GC(Minor GC)触发机制:老年代GC(Major GC/Full GC)触发机制:…...
【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
【数据仓库】hive on Tez配置
hive on Tez 搭建 前提是hive4.0hadoop3.2.2数仓已搭建完成,现在只是更换其执行引擎 为Tez。搭建可参考【数据仓库】hive hadoop数仓搭建实践文章。 Tez 下载 下载地址 https://archive.apache.org/dist/tez/ 官网地址 https://tez.apache.org/releases/apac…...
基于HTML和CSS的旅游小程序
一、技术基础 HTML(HyperText Markup Language):超文本标记语言,用于定义网页的内容和结构。在旅游小程序中,HTML用于搭建页面的基本框架,包括标题、段落、图片、链接等元素,以及用于交互的表单…...
CDP集成Hudi实战-文件存储布局实况讲解
[〇]关于本文 本文我们参考一张在hdfs中的hud表讲解一下hudi表的文件存储布局 [一]时间线文件解析 目录结构中列出的文件和子目录如下: 1-文件类型解析 时间线目录中的文件主要有以下几种类型: <commit_id>.deltacommit.inflight 表示一项事务&…...
22408操作系统期末速成/复习(考研0基础上手)
第一部分:计算题: 考察范围:(标红的是重点考) 第一章:CPU利用率: 第二章: 进程调度算法(需要注意不同调度算法的优先级和题目中给出的是否可以抢占【分为可抢占和不可抢占ÿ…...
Qt的信号与槽
文章目录 信号与槽机制信号与槽的定义 Qt使用信号与槽机制进行对象间的通信。当某个对象的状态发生变化时,该对象会触发一个信号。 该信号和另外一些对象的槽函数绑定,信号的触发将导致这些槽函数的执行,以处理第一个对象状态的变化。触发信号…...
牛客网刷题 ——C语言初阶——JZ15 二进制中1的个数
1.题目描述 题目OJ链接 描述 输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。 2.思路 求2进制中1的个数,可以转换为求每一位,1的个数,1&1还是1 所以判断如果该数值&1为真,我们就co…...
【游戏设计原理】47 - 超游戏思维
对于这条原理,我首先想到的是开放世界,或者探索性游戏,这是最能包容各类玩家的游戏类型。这类游戏定义了基本规则,玩家的可操作性很强。就像上图里的沙池一样,里面有滑梯,是规则性比较明确的,而…...
Elasticsearch Serverless中的数据流自动分片深度解析
Elasticsearch Serverless中的数据流自动分片深度解析 一、Elasticsearch Serverless概述 1. 什么是Elasticsearch Serverless Elasticsearch Serverless是一种云端全托管的Elasticsearch服务,它基于云原生Serverless技术架构,提供自动弹性和完全免运…...
Elasticsearch JavaRestClient版
文章目录 初始化RestHighLeveClient(必要条件)索引库操作1.创建索引库(4步)2.删除索引库(3步)3.判断索引库是否存在(3步)4.总结:四步走 文档操作1.创建文档(4…...
通过爬虫方式实现视频号助手发布视频
1、将真实的cookie贴到解压后目录中cookie.txt文件里,修改python代码里的user_agent和video_path, cover_path等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、2025年1月份最新版; 代码如下: import json import…...
如何在VMware ESXi和Workstation中打开VMDK文件?
VMware 中的 VMDK 是什么? 在 VMware 中,VMDK 是虚拟磁盘文件的格式,全称是 Virtual Machine Disk。VMDK 文件用于存储虚拟机的硬盘内容,包括操作系统、应用程序、文件等。它相当于虚拟机的硬盘驱动器,可以模拟出各种…...
【计算机视觉技术 - 人脸生成】2.GAN网络的构建和训练
GAN 是一种常用的优秀的图像生成模型。我们使用了支持条件生成的 cGAN。下面介绍简单 cGAN 模型的构建以及训练过程。 2.1 在 model 文件夹中新建 nets.py 文件 import torch import torch.nn as nn# 生成器类 class Generator(nn.Module):def __init__(self, nz100, nc3, n…...
「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能
本篇教程将实现滑动解锁屏幕功能,通过 Slider 组件实现滑动操作,学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能: 滑动解锁区域:用…...
JVM学习指南(9)-JVM运行时数据区
JVM学习指南(9)-JVM运行时数据区 引言 Java虚拟机(JVM)是Java程序运行的核心,它为Java程序提供了一个与平台无关的执行环境。JVM的重要性不仅在于它实现了Java的跨平台特性,还在于它对程序执行过程中内存的管理。JVM运行时数据区是程序执行过程中存储数据的关键区域,理解…...
前端实现大文件上传(文件分片、文件hash、并发上传、断点续传、进度监控和错误处理,含nodejs)
大文件分片上传是前端一种常见的技术,用于提高大文件上传的效率和可靠性。主要原理和步骤如下 文件分片 确定分片大小:确定合适的分片大小。通常分片大小在 1MB 到 5MB 之间使用 Blob.slice 方法:将文件分割成多个分片。每个分片可以使用 Bl…...
什么是 C++ 的序列化?
什么是 C 的序列化? 序列化(Serialization)是指将对象的状态转换为可以存储或传输的格式的过程。它使得对象能够以二进制或文本的形式被保存到文件中,或者通过网络发送到远程计算机上,稍后可以重新构造出来࿰…...
047_小驰私房菜_Qcom 8系列,Jpeg GPU 旋转
【问题背景】 横屏模式下,发现有些三方app拍照旋转了90度。 【修改策略】 adb shell setprop endor.debug.camera.overrideGPURotationUsecase 1 或者在/vendor/etc/camera/camxoverridesettings.txt 里面添加如下内容 overrideGPURotationUsecase1 【解释】 Ga…...
【C++】2039:【例5.6】冒泡排序
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯我的初步实现我的代码实现问题分析 💯老师的实现方式老师代码的特点分析老师代码的执行过程 💯我的代码与老师代码的对比优点…...
【Java回顾】Day4 反射机制
反射机制 之前学过一部分,笔记在20250103Java包_网络编程.md里,这里在之前的笔记的基础上做一些补充。 反射:得到class对象后反向获取对象的各种信息。 包 Field 类或接口中的字段(成员变量),动态访问和修改类的字段 模板 获取Class 对象 …...
MATLAB画柱状图
一、代码 clear; clc; figure(position,[150,100,900,550])%确定图片的位置和大小,[x y width height] %准备数据 Y1[0.53,7.9,8.3;0.52,6.8,9.2;0.52,5.9,8.6;2.8,5.8,7.9;3.9,5.2,7.8;1.8,5.8,8.4]; % withoutNHC X11:6; %画出4组柱状图,宽度1 h1…...
web漏洞之文件包含漏洞
一、文件包含漏洞 1、把DVWA页面改为low级别,然后点击File Inclusion页面 原理是File Inclusion页面访问的是low.php和include.php,这两个页面包含了include($_GET[page])这句话,意思是page会把用户输入的参数带进来然后由$_GET读取&#x…...
spring mvc源码学习笔记之六
pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...
深入理解 PyTorch 的 Dataset 和 DataLoader:构建高效数据管道
文章目录 简介PyTorch 的 DatasetDataset 的基本概念自定义 Dataset实现 __init__ 方法示例:从 CSV 文件加载数据 实现 __len__ 方法实现 __getitem__ 方法另一种示例:直接传递列表训练集和验证集的定义 1. 单个 Dataset 类 数据分割2. 分别定义两个 Da…...
VSCode设置ctrl或alt+mouse(left)跳转
总结: (1)VSCode初次远程连接服务器时,需要在服务器上下载 python 拓展,然后选择对应的环境 (2)VSCode设置ctrl或altmouse(left)跳转到定义...
在Ubuntu 18.04.6 LTS安装OpenFace流程
一、修改配置:将gcc8,g8作为默认选项 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 sudo update-alternatives --config gcc 选择版本,再查看gcc --version sudo update-alternatives --install /usr/bin/g g /usr/bin/g-…...
微服务拆分的艺术:构建高效、灵活的系统架构
目录 一、微服务拆分的重要性 二、微服务拆分的策略 1. 按照业务领域拆分 2. 按照团队结构拆分 3. 按照业务边界拆分 4. 按照数据和数据库拆分 5. 按照用户界面或外部接口拆分 6. 按照功能模块或领域驱动设计拆分 7. 按照性能和可伸缩性需求拆分 三、微服务拆分的实践…...
PHP框架+gatewayworker实现在线1对1聊天--发送消息(6)
文章目录 发送消息原理说明发送功能实现html部分javascript代码PHP代码 发送消息原理说明 接下来我们发送聊天的文本信息。点击发送按钮的时候,会自动将文本框里的内容发送出去。过程是我们将信息发送到服务器,服务器再转发给对方。文本框的id为msgcont…...
java项目之读书笔记共享平台(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的闲一品交易平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 读书笔记共享平台的主要使…...
RabbitMq的Java项目实践
在现代软件开发中,消息队列(Message Queue,简称MQ)作为一种重要的组件,承担着上下游消息传递和通信的重任。RabbitMQ作为一款流行的开源消息队列中间件,凭借其高可用性、可扩展性和易用性等特点,…...
气膜球幕:引领元宇宙时代的科技与艺术光影盛宴—轻空间
在科技与艺术交织的时代,未来的观影体验将不再受限于传统屏幕的束缚。随着气膜球幕的崭新亮相,突破性的光影效果和沉浸式体验让我们走进了一个全新的视听世界。这不仅仅是一个简单的球形影院,它是连接现实与虚拟、科技与艺术、光与影的桥梁&a…...
行为模式2.命令模式------灯的开关
行为型模式 模板方法模式(Template Method Pattern)命令模式(Command Pattern)迭代器模式(Iterator Pattern)观察者模式(Observer Pattern)中介者模式(Mediator Pattern…...
Linux环境下静态库和动态库的实现
Linux 环境下静态库和动态库的实现 在软件开发中,库是非常重要的组成部分。它们包含了一组可复用的函数和代码片段,用于提高开发效率和代码质量。在Linux系统中,库分为静态库和动态库两种。本文将介绍它们的实现方式,结合C语言代…...
如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?
如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…...
Tortoisegit 安装之后没有Add、ignore解决
在本地的仓库文件夹中点击右键,找到Settings, 从General 找到Contex Menu,我的系统是Win11,所以用Win11 Contex Menu 将所需要的操作打勾即可。...
线性代数考研笔记
行列式 背景 分子行列式:求哪个未知数,就把b1,b2放在对应的位置 分母行列式:系数对应写即可 全排列与逆序数 1 3 2:逆序数为1 奇排列 1 2 3:逆序数为0 偶排列 将 1 3 2 只需将3 2交换1次就可以还原原…...
C语言带参数的宏定义的相关知识汇总(最常用的形式、带标记分隔符##的形式...)
阅读大型C工程代码时,绕不开带参数的宏定义的阅读,所以有必要强化一下这一块的知识。 01-带参数的宏定义最常用的形式 # define S(a,b) a*b ... ... ... area S(3,2);则在编译预处理时area S(3,2);被展开为: area 3 * 2;02-带标记分隔符…...
cpp编译链接等
一、编译预处理 C程序编译的过程:预处理 -> 编译(优化、汇编)-> 链接 预处理指令主要有以下三种: 包含头文件:#include 宏定义:#define(定义宏)、#undef(删除宏…...
openbmc sdk09.03 适配(一)
1.说明 本节是根据最新的sdk09.03适配ast2600平台。 sdk下载路径为: https://github.com/AspeedTech-BMC/openbmc可参阅文档: https://blog.csdn.net/wit_yuan/article/details/144613247nfs挂载方法: # mount -o nolock -t nfs serverip:/xx...
JavaScript HTML DOM 实例
JavaScript HTML DOM 实例 JavaScript 的 HTML DOM(文档对象模型)允许您通过脚本来控制 HTML 页面。DOM 是 HTML 文档的编程接口,它将 Web 页面与编程语言连接起来,使得开发者可以改变页面中的内容、结构和样式。在这篇文章中,我们将通过一系列实例来探讨如何使用 JavaSc…...
【Vue】:解决动态更新 <video> 标签 src 属性后视频未刷新的问题
问题描述 在 Vue.js 项目,当尝试动态更新 <video> 标签的 <source> 元素 src 属性来切换视频时,遇到了一个问题:即使 src 属性已更改,浏览器仍显示旧视频。具体表现为用户选择新视频后,视频区域继续显示之…...