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

从0到1实现一个RS蓝图系统-概念提出技术栈选型

请不要自我设限,真正好的人生态度,是现在就做,不等、不靠、不懒惰。

——小野《改变力》

一、什么是蓝图?

  • 蓝图(BluePrint) 是Epic Games 针对虚幻4引擎开发的可视化脚本语言。
  • 当你使用蓝图的时候,其实就是在编写代码,只不过它采用更加可视化的方法,它不需要你编写任何C++代码,只需要将不同功能的蓝图节点连接起来,就能实现想要的功能。
  • 蓝图是一种允许你以可视化的方式创建内容的系统,你所构建的内容通常称作“蓝图文件(Blueprints)”。
  • 你可以创建许多不同类型的蓝图,蓝图相当于游戏内容的容器,它包含了许多基本单元,这些单元被称之为“组件Components”。举个例子:一个汽车蓝图,就可以包含车架组件、车轮组件、引擎组件等诸如此类的组件,它门还能包含脚本功能,让油门被踩下时,引擎驱动汽车前进,但我们也可以不编写任何功能,只不过汽车不知道如何前进而已。
  • 蓝图还可以包含数据,而且数据是可以调整的。
  • 蓝图节点的本质:将功能不同的节点连接在一起。

二、实现原理

  1. 节点和连接
    开发者通过拖拽不同类型的节点(如事件、条件、动作等)到工作区,并通过连接线将这些节点连接起来,形成一个逻辑流程。

  2. 图形界面
    工具提供了一个直观的图形界面,使得开发者可以更容易地理解和管理复杂的逻辑结构。

  3. 底层代码生成
    在后台,这些工具会将可视化的节点和连接转换为底层的代码(如C++、C#或GDScript),并在运行时执行这些代码。

  4. 实时调试
    大多数可视化编程工具还提供了实时调试功能,允许开发者在运行时查看和修改节点的状态,以便快速找到和修复问题。

三、我要实现的RS蓝图系统

1、应用场景

低代码 / 定制产品化 / 插件化

2、核心功能

1、蓝图组件

它负责具体某个功能的实现以及实现方式、规范标准、回调、触发条件

2、蓝图编辑器

它负责将各个蓝图组件拼接起来构成一个完整的蓝图结构树,并保存起来

3、蓝图引擎

它负责解析蓝图结构树,并按顺序/触发条件调用蓝图组件,贯穿整个蓝图生命周期

4、可观测

蓝图生命周期的全局可视化

三、技术栈选型

1、前端

Vue3+Vite+TS

2、后端

Rust actix-web

3、数据库

Redis + PgSQL + MongoDB

4、监控

ELK

四、开发环境搭建

接下来我们搭建开发环境,并且实现最基本的蓝图节点组件。

1、操作系统 Deepin

Virtual Box 安装 Deepin 系统_virtualbox 安装deepin-CSDN博客文章浏览阅读220次,点赞10次,收藏3次。Virtual Box 安装 Deepin 系统_virtualbox 安装deepinhttps://blog.csdn.net/weixin_47560078/article/details/133959287?spm=1001.2014.3001.5502

2、搭建前端开发环境

安装 vs code,

安装 nodejs ,

# 安装 nodejs
sudo apt-get install nodejs# 安装 npm
sudo apt-get install npm# node 版本
node -v
v10.21.0# n 模块是管理 nodejs 版本的
sudo npm install n -g# 安装稳定版 nodejs
sudo n stable # nodejs 版本
node -v
v20.18.0# npm 版本
npm -v
10.8.2# 升级 npm
# sudo npm install -g npm # 安装编译工具包
sudo apt install build-essential# 安装 cnpm
# sudo npm install -g cnpm --registry=http://registry.npmmirror.com# 使用淘宝的镜像源
npm config set registry http://registry.npmmirror.com

3、搭建后端开发环境

安装 Rust,

# 官网 https://www.rust-lang.org/
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

修改 Rust 镜像源,

# $CARGO_HOME/.cargo/ 下创建 config.toml
$ touch config.toml# 添加以下内容[source.crates-io]
replace-with = 'ustc'[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

4、搭建数据库环境

4.1、Redis

使用 apt 安装 redis,

sudo apt install redis-server
# redis-cli --version

redis 远程设置,

sudo vim /etc/redis/redis.conf # 注释掉绑定地址,让 Redis 可远程访问
# bind 127.0.0.1 ::1# 取消注释 requirepass 启动密码认证,并设置访问密码
requirepass 0123456789# 以守护进程运行Redis 
daemonize yes

重启 redis,

sudo systemctl restart redis-server

4.2、PgSQL

最终会跳转到指南页面,https://www.postgresql.org/download/linux/ubuntu/

一般的流程是引入软件包下载源,然后进行 apt 安装软件包,Ubuntu 通常已经包含了 postgresql 软件源,

sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
# 安装最新版本的 postgresql 
sudo apt install postgresql -y

查看运行状态跟版本,

sudo systemctl is-active postgresql
sudo systemctl is-enabled postgresql
sudo systemctl status postgresql
psql --version

安装过程会创建一个名为postgres的与默认postgres角色关联的用户账号,我们可以通过该账号来访问 PostgreSQL,

sudo -i -u postgres
(base) sam@sam-PC:~$ sudo -i -u postgres
postgres@sam-PC:~$ psql
psql (11.18 (Deepin 11.18-0+deb10u1))
输入 "help" 来获取帮助信息.postgres=# help
您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面
键入: \copyright 显示发行条款\h 显示 SQL 命令的说明\? 显示 pgsql 命令的说明\g 或者以分号(;)结尾以执行查询\q 退出
postgres=# \q
postgres@sam-PC:~$ exit
注销
(base) sam@sam-PC:~$ 

4.3、pgadmin4

pgsql 的官方可视化工具,这里使用 pip 安装,

创建文件夹,并且配置 web 登录的账号密码, 

$ sudo mkdir /var/lib/pgadmin
$ sudo mkdir /var/log/pgadmin
$ sudo chown $USER /var/lib/pgadmin
$ sudo chown $USER /var/log/pgadmin
# 创建 pgadmin4 python 环境
$ python3 -m venv pgadmin4
$ source pgadmin4/bin/activate
# 安装 pgadmin4
(pgadmin4) $ pip install pgadmin4
...
(pgadmin4) $ pgadmin4
NOTE: Configuring authentication for SERVER mode.Enter the email address and password to use for the initial pgAdmin user account:Email address: user@domain.com
Password: 
Retype password:
Starting pgAdmin 4. Please navigate to http://127.0.0.1:5050 in your browser.* Serving Flask app "pgadmin" (lazy loading)* Environment: productionWARNING: Do not use the development server in a production environment.Use a production WSGI server instead.* Debug mode: off

Conda 环境也可以,

# 配置路径
(myenv3.8) sam@sam-PC:~/anaconda3/envs/myenv3.8/lib/python3.8/site-packages/pgadmin4$ ls
babel.cfg          branding.py  config_distro.py  DEPENDENCIES  jest.config.js  migrations    pgacloud  pgAdmin4.py    __pycache__  sbom.json  version.py         webpack.shim.js
babel.config.json  commit_hash  config.py         docs          LICENSE         package.json  pgadmin   pgAdmin4.wsgi  README.md    setup.py   webpack.config.js  yarn.lock
(myenv3.8) sam@sam-PC:~/anaconda3/envs/myenv3.8/lib/python3.8/site-packages/pgadmin4$ 

访问 url , 输入刚刚在控制台设置的账号密码,

http://127.0.0.1:5050/browser/

配置 postgres 账号密码,然后创建一个新的 Servers 连接,

# psql
ALTER USER postgres WITH PASSWORD 'your_password';

配置 pgAdmin4 账号密码,登录,

开启语法提示:【配置-查询工具-自动完成】

4.4、MongoDB

安装,

# 下载地址
https://www.mongodb.com/try/download/community

tar -zxvf mongodb-linux-x86_64-ubuntu2004-8.0.4.tgz 

启动,

# 创建MongoDB要使用的目录和文件
sudo mkdir -p mongodb/data mongodb/log mongodb/conf
sudo touch mongodb/conf/mongodb.conf

修改配置文件内容

# sudo vim mongodb/conf/mongodb.confprocessManagement:fork: true
net:bindIp: localhostport: 27017
storage:dbPath: /home/sam/mongodb/data
systemLog:destination: filepath: /home/sam/mongodb/log/mongod.loglogAppend: true
storage:journal:enabled: true

使用配置文件启动

# 使用配置文件启动
bin/mongod -f /home/sam/mongodb/conf/mongodb.conf# 关闭 MongoDB
# bin/mongod --shutdown --dbpath /home/sam/mongodb/data

报错,

./mongod: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by ./mongod)
./mongod: /lib/x86_64-linux-gnu/libpthread.so.0: version `GLIBC_2.30' not found (required by ./mongod)

看下当前系统存在哪些 GLIBC 版本,

strings /usr/lib64/libc.so.6 |grep GLIBC_
# 或者
strings /lib/x86_64-linux-gnu/libc.so.6 |grep GLIBC_

没有 29、30 的版本。

解决方案:

1、MongoDB 降版本

2、操作系统升版本

3、升级 glibc (物理机慎操作)

https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-6.0.19.tgz

再次启动 MongoDB,成功。

# sudo bin/mongod -f /home/sam/mongodb/conf/mongodb.confabout to fork child process, waiting until server is ready for connections.
forked process: 4967
child process started successfully, parent exiting

五、前端框架搭建

1、整合 Vue + Vite + ElementUI

# 创建 vite vue
cnpm create vite@latest

# element-plus 国内镜像 https://element-plus.gitee.io/zh-CN/
# 安装 element-plus
cnpm install element-plus --save

按需引入 element plus,

cnpm install -D unplugin-vue-components unplugin-auto-import

在 main.ts 引入 element-plus 和样式,

// src\main.ts
import { createApp } from 'vue'
//import './style.css'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'createApp(App).use(ElementPlus).mount('#app')

配置 vite,

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],
})

2、安装依赖

axios + vue-draggable

cnpm install axios

cnpm install vuedraggable@next

cnpm install sass-embedded

3、创建基本组件

在src/components目录下创建两个文件:Node.vue和Canvas.vue。

// Node.vue
<template><div class="node" :style="{ top: node.y + 'px', left: node.x + 'px' }">{{ node.name }}</div>
</template><script lang="ts" setup>
import { defineProps } from 'vue'interface Node {x: number;y: number;name: string;
}const props = defineProps<{ node: Node }>()
</script><style scoped>
.node {position: absolute;width: 100px;height: 50px;background-color: lightblue;border: 1px solid #000;text-align: center;line-height: 50px;cursor: move;
}
</style>
// Canvas.vue
<template><div class="canvas"><draggablev-model:list="state.nodes":disabled="!state.enabled"item-key="id"class="w-100"ghost-class="ghost"chosen-class="chosen"@start="state.dragging = true"@end="onDragEnd"animation="300"><template #item="{ element }"><Node :node="element" /></template></draggable></div>
</template><script lang="ts" setup>
import { reactive, ref } from 'vue'
import draggable from 'vuedraggable'
import Node from './Node.vue'interface Node {id: number;name: string;x: number;y: number;
}const state = reactive({enabled: true,nodes: [{ id: 1, name: 'Start', x: 50, y: 50 },{ id: 2, name: 'Process', x: 200, y: 50 }],dragging: false
})function onDragEnd(event: any) {state.dragging = false;// Update node positions after drag
}</script><style scoped lang="scss">
.canvas {width: 100%;height: 100vh;position: relative;background-color: #f0f0f0;
}
.ghost {opacity: 0.5;border: 1px solid #18a058;
}
.chosen {border: 1px solid #18a058;
}
.item {width: 100%;&:hover {background-color: #f0f0f0;}
}
.not-draggable {cursor: no-drop;
}
</style>

更新App.vue,

// App.vue
<script setup lang="ts">
import Canvas from './components/Canvas.vue'</script><template>
<Canvas/>
</template><style scoped>
</style>

运行效果,

修改 Canvas.vue,从后端获取数据,

// ...import axios from 'axios'// ...onMounted(() => {axios.get('http://localhost:8080/nodes').then(response => {state.nodes = response.data;}).catch(error => {console.error(error);});
})// ...

六、后端框架搭建

1、基础框架

首先,创建一个新的二进制 Cargo 项目,并切换到新目录:

cargo new backend
cd backend

通过向 Cargo.toml 文件添加以下内容,将 actix-web 添加为项目的依赖项。

[dependencies]
actix-web = "4"

请求 handler 使用异步函数,接受零个或多个参数。

use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};#[get("/")]
async fn hello() -> impl Responder {HttpResponse::Ok().body("Hello world!")
}#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {HttpResponse::Ok().body(req_body)
}async fn manual_hello() -> impl Responder {HttpResponse::Ok().body("Hey there!")
}

接下来,创建 App 实例并注册请求 handler。

  • 对于使用了路由宏的 handler,使用 App::service 方法注册路由;
  • 对不使用路由宏而注册自定义路由的情况,使用 App::route 方法。

最后,使用 HttpServer 启动应用程序。

#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| {App::new().service(hello).service(echo).route("/hey", web::get().to(manual_hello))}).bind("127.0.0.1:8080")?.run().await
}

编译并运行程序

cargo run 

访问 http://localhost:8080/

2、序列化 Node 节点

 修改  Cargo.toml,新增序列化依赖,对应序列化 Node 节点,

serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
use serde::Serialize;#[derive(Serialize)]
struct Node {id: u32,name: String,x: i32,y: i32,
}#[get("/nodes")]
async fn get_nodes() -> impl Responder {let nodes = vec![Node { id: 1, name: "Start".to_string(), x: 50, y: 50 },Node { id: 2, name: "Process".to_string(), x: 200, y: 50 },];HttpResponse::Ok().json(nodes)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| {App::new().service(get_nodes)}).bind("0.0.0.0:8080")?.run().await
}

3、跨域请求

接口测试成功,但是还有一个跨域问题,

在 actix-web 里, 我们需要配合 actix_cors 来处理关于跨域请求的配置,

[dependencies]
actix-cors = "0.7.0"
// main.rs
use actix_web::{get, http, post, web, App, HttpResponse, HttpServer, Responder};
use serde::Serialize;
use actix_cors::Cors;#[derive(Serialize)]
struct Node {id: u32,name: String,x: i32,y: i32,
}#[get("/nodes")]
async fn get_nodes() -> impl Responder {let nodes = vec![Node { id: 1, name: "Start".to_string(), x: 50, y: 50 },Node { id: 2, name: "Process".to_string(), x: 200, y: 50 },];HttpResponse::Ok().json(nodes)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| {let cors = Cors::default().allowed_origin("http://localhost:5173")// .allowed_origin_fn(|origin, _req_head| {//     origin.as_bytes().ends_with(b".rust-lang.org")// }).allowed_methods(vec!["GET", "POST"]).allowed_headers(vec![http::header::AUTHORIZATION, http::header::ACCEPT]).allowed_header(http::header::CONTENT_TYPE).max_age(3600);App::new().wrap(cors).service(get_nodes)}).bind("0.0.0.0:8080")?.run().await
}

效果,

参考资料

介绍 - actix-web 中文文档 - Rust-Web 开发指南

actix_web - Rust

actix_cors - Rust

https://dev.epicgames.com/documentation/zh-cn/unreal-engine/overview-of-blueprints-visual-scripting-in-unreal-engine

PostgreSQL: The world's most advanced open source database

pgAdmin - PostgreSQL Tools

相关文章:

从0到1实现一个RS蓝图系统-概念提出技术栈选型

请不要自我设限&#xff0c;真正好的人生态度&#xff0c;是现在就做&#xff0c;不等、不靠、不懒惰。 ——小野《改变力》 一、什么是蓝图&#xff1f; 蓝图(BluePrint) 是Epic Games 针对虚幻4引擎开发的可视化脚本语言。当你使用蓝图的时候&#xff0c;其实就是在编写代码…...

npm淘宝镜像

通过命令行配置npm的淘宝镜像源和官方镜像源&#xff0c;以及如何安装和使用cnpm来解决安装包卡顿或无法安装的问题。通过设置registry和disturl&#xff0c;配合清理缓存&#xff0c;可以优化npm的下载速度。 1、​官方默认镜像 npm config set registry https://registry.n…...

深入解析:Python中的决策树与随机森林

在这个数据驱动的时代&#xff0c;机器学习技术已经成为许多企业和研究机构不可或缺的一部分。其中&#xff0c;决策树和随机森林作为两种强大的算法&#xff0c;在分类和回归任务中表现尤为出色。本文将带领大家深入了解这两种算法在Python中的实现&#xff0c;从基础到实战&a…...

奇怪问题| Chrome 访问csdn 创作中心的时候报错: 服务超时,请稍后重试

Chrome 访问csdn 创作中心的时候报错&#xff1a; 服务超时,请稍后重试用无痕浏览器可以正常访问 关闭代理无效清缓存和Cookies无效。考虑无痕浏览器模式下插件不生效&#xff0c;尝试把chrome 插件也禁用&#xff0c;发现有效&#xff0c;是该扩展程序的缘故...

【Leetcode】1705. 吃苹果的最大数目

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 有一棵特殊的苹果树&#xff0c;一连 n n n 天&#xff0c;每天都可以长出若干个苹果。在第 i i i 天&#xff0c;树上会长出 a p p l e s [ i ] apples[i] apples[i] 个苹果&a…...

职业技能赛赛后心得

这是一位粉丝所要求的&#xff0c;也感谢这位粉丝对我的支持。 那么本篇文章我也是分成四个部分&#xff0c;来总结一下这次赛后心得。 赛中问题 那么这里的赛中问题不会只包含我所遇到的问题&#xff0c;也会包含赛中其他选手出现的问题。 那么首先我先说一下我在赛中遇到的…...

从AI换脸到篡改图像,合合信息如何提升视觉内容安全?

本文目录 引言一、AI“真假之战”下的发展现状与考验挑战1.1 视觉内容安全现状与技术分类1.2视觉内容安全企业1.3视觉内容安全领域挑战 二、开山之石&#xff1a;引领视觉内容安全的创新之路2.1合合内容安全系统2.2发起编制相关技术规范2.3参与篡改检测挑战赛 三、视觉内容安全…...

c# 实现一个简单的异常日志记录(异常迭代+分片+定时清理)+AOP Rougamo全局注入

1. 日志目录和文件管理 日志目录&#xff1a;日志文件存储在 ./Exceptions 目录下。日志文件命名&#xff1a;日志文件的命名格式为 yyyy_MM_dd.log&#xff0c;表示当天的日期。如果当天的日志文件大小超过 maxFileSizeBytes&#xff08;3KB&#xff09;&#xff0c;则会创建…...

webrtc学习----前端推流拉流,局域网socket版,一对多

提示&#xff1a;局域网socket版&#xff0c;一对多 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种实时通讯技术&#xff0c;允许网…...

美国加州房价数据分析01

1.项目简介 本数据分析项目目的是分析美国加州房价数据&#xff0c;预测房价中值。 环境要求&#xff1a; ancondajupyter notebookpython3.10.10 虚拟环境&#xff1a; pandas 2.1.1 numpy 1.26.1 matplotlib 3.8.0 scikit-learn1.3.1 2. 导入并探索数据集 通用的数据分析…...

用Python开启人工智能之旅(四)深度学习的框架和使用方法

第四部分&#xff1a;深度学习的框架和使用方法 用Python开启人工智能之旅&#xff08;一&#xff09;Python简介与安装 用Python开启人工智能之旅&#xff08;二&#xff09;Python基础 用Python开启人工智能之旅&#xff08;三&#xff09;常用的机器学习算法与实现 用Pyt…...

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的&#xff0c;在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号&#xff0c;到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了...

信号仿真高级工程师面试题

信号仿真高级工程师面试题可能涵盖多个方面,旨在全面评估应聘者的专业知识、技能水平、实践经验和问题解决能力。以下是一些可能的面试题及其简要解析: 一、专业知识与技能 描述你对信号仿真的理解 考察点:对信号仿真基本概念、原理及应用的掌握程度。参考答案:信号仿真是…...

循环和迭代

从更高层次的思维角度来看迭代和循环的区别&#xff1a; 哲学层面&#xff1a; 迭代体现了"螺旋上升"的发展理念&#xff0c;每次迭代都在前一次的基础上有所提升和改进 循环体现了"周而复始"的概念&#xff0c;强调重复相同的过程 思维方式&#xff1a…...

一个简单封装的的nodejs缓存对象

我们在日常编码中&#xff0c;经常会用到缓存&#xff0c;而一个有效的缓存管理&#xff0c;也是大家必不可少的工具。而nodejs没有内置专用的缓存对象&#xff0c;并且由于js的作用域链的原因&#xff0c;很多变量使用起来容易出错&#xff0c;如果用一个通用的缓存管理起来&a…...

【Rust自学】5.3. struct的方法(Method)

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 5.3.1. 什么是方法(Method) 方法和函数类似&#xff0c;也是用fn关键字进行声明&#xff0c;方法也有名称&#xff0c;也有参数&#xff…...

ChatGPT之父:奥尔特曼

奥尔特曼 阿尔特曼一般指萨姆奥尔特曼,他是OpenAI的联合创始人兼首席执行官,被称为“ChatGPT之父”.以下是其具体介绍: 个人经历 1985年4月22日出生于美国芝加哥,8岁学会编程,9岁拥有电脑,对信息技术和互联网产生兴趣.高中就读于约翰巴勒斯中学,后进入斯坦福大学主修计…...

如何在谷歌浏览器中设置桌面快捷方式

在日常使用电脑时&#xff0c;反复在浏览器中输入经常访问的网址不仅耗时&#xff0c;而且降低了工作效率。为了解决这一问题&#xff0c;我们可以通过在主屏幕上创建谷歌浏览器的快捷方式来简化操作。本文将详细介绍如何在Windows和Mac系统中实现这一功能。 一、步骤概述 1. …...

systemverilog中的priority if

1 基本概念 在 SystemVerilog 中&#xff0c;priority - if是一种条件判断结构。它和普通的if - else语句类似&#xff0c;但在条件评估和错误检查方面有自己的特点&#xff0c;主要用于按顺序评估多个条件&#xff0c;并且对不符合预期的情况进行报错。报错如下两点 当所有条件…...

图像处理-Ch2-空间域的图像增强

Ch2 空间域的图像增强 文章目录 Ch2 空间域的图像增强Background灰度变换函数(Gray-level Transformation)对数变换(Logarithmic)幂律变换(Power-Law)分段线性变换函数(Piecewise-Linear)对比度拉伸(Contrast-Stretching)灰度级分层(Gray-level Slicing) 直方图处理(Histogram …...

css 编写注意-1-命名约定

编写按照可维护性、性能和可读性规则&#xff1a; 1.代码组织与结构​​​​​​​ 层次清晰&#xff1a;使用模块化的结构&#xff0c;将样式分块组织。命名规范&#xff1a;采用统一的命名规则&#xff08;如 BEM、SMACSS&#xff09;以增强可读性。​​​​​​​ /* BEM …...

虚幻引擎反射机制

在虚幻引擎中&#xff0c;反射系统是一种强大的机制&#xff0c;它允许开发者和引擎本身在运行时获取并操作类、对象、属性和方法的元信息。这个系统是基于UObject&#xff08;Unreal Engine中所有支持反射的对象的基类&#xff09;构建的&#xff0c;为游戏开发提供了极大的灵…...

Knife4j Swagger

1. 依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>2. 配置 第二步配置完成就可以访问&#xff1a;http://localhost…...

Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总

问题1&#xff1a;打包的过程中不断提示 &#xff1a;codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决&#xff1a;打开钥匙串&#xff0c;点击证书---显示简介---信任----改为始终信任 &#xff08;记住 &#xff1a;不能只修改钥匙的显示简介的…...

卷积神经网络入门指南:从原理到实践

目录 1 CNN的发展历史 2 CNN的基本原理 3 CNN核心组件 3.1 卷积操作基础 3.2 卷积层详解 3.3 高级卷积操作 3.3.1 分组卷积&#xff08;Group Convolution&#xff09; 3.3.2 深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;&#xff1a; 3.3 池…...

eNSP安装教程(内含安装包)

通过网盘分享的文件&#xff1a;eNSP模拟器.zip 链接: https://pan.baidu.com/s/1wPmAr4MV8YBq3U5i3hbhzQ 提取码: tefj --来自百度网盘超级会员v1的分享 &#xff01;&#xff01;&#xff01;&#xff01;解压后有四个文件&#xff0c;先安装Box&#xff0c;第二个安装cap&a…...

VBA技术资料MF244:利用VBA在图表工作表中创建堆积条形图

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…...

【计算机网络安全】网络攻击

实验二 网络攻击 实验人员&#xff1a;第五组全体成员 一、实验目的&#xff1a; 1&#xff1a;掌握ARP欺骗的原理&#xff0c;实践ARP欺骗的过程。 2&#xff1a;掌握TCP劫持的原理&#xff0c;实践TCP劫持的过程。 3&#xff1a;掌握DNS欺骗的原理&#xff0c;实践DN…...

20241230 基础数学-线性代数-(1)求解特征值(numpy, scipy)

所有代码实现&#xff0c;基于教程中的理论通过python实现出来的。效率不高&#xff0c;但有代码可以看。 由于scipy/sckitlearn/sparkx 底层的实现都被封装了&#xff08;小白兔水平有限&#xff0c;fortran代码实在没看懂&#xff09;这里的实现至少可以和理论公式对应的上。…...

基于图注意力网络的两阶段图匹配点云配准方法

Two-stage graph matching point cloud registration method based on graph attention network— 基于图注意力网络的两阶段图匹配点云配准方法 从两阶段点云配准方法中找一些图匹配的一些灵感。文章提出了两阶段图匹配点云配准网络&#xff08;TSGM-Net&#xff09; TSGM-Ne…...