Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用---后台调用Python Matplotlib绘制图形
Rust语言最接近Python Matplotlib绘图库的应该是Plotters,但是试用下来还是没有Matplotlib效果好,所以尝试在Tauri + Leptos项目中,后台调用Python Matplotlib绘制图形,并返回给前端Leptos展示。
具体效果如下:
1. 前端Leptos
Leptos前端需要从数据库选取用于绘图的产品成分数据,使用信号selected_pdt_data(结构变量数列)实时更新,然后invoke调用Tauri后台命令,将包含产品成分数据的结构变量传递给后台命令。具体代码如下:
use serde::{Deserialize, Serialize};#[wasm_bindgen]
extern "C" {#[wasm_bindgen(js_namespace = ["window", "__TAURI__", "core"], js_name = invoke)]async fn invoke_without_args(cmd: &str) -> JsValue;#[wasm_bindgen(js_namespace = ["window", "__TAURI__", "core"])] //Tauri API 将会存储在 window.__TAURI__ 变量中,并通过 wasm-bindgen 导入。async fn invoke(cmd: &str, args: JsValue) -> JsValue;
}#[derive(Serialize, Deserialize, Clone, Debug)]
struct Pdt {pdt_id:i64,pdt_name:String,pdt_si:f64,pdt_al:f64,pdt_ca:f64,pdt_mg:f64,pdt_fe:f64,pdt_ti:f64,pdt_ka:f64,pdt_na:f64,pdt_mn:f64,pdt_date:String,
}#[component]
pub fn AcidInput() -> impl IntoView {let (selected_pdt_data, set_selected_pdt_data) = signal::<Vec<Pdt>>(vec![]);let python_acid_image = move|ev:SubmitEvent| {ev.prevent_default();//跳转到images绘图页面,主要由images.rs定义。//navigate("/images", Default::default());spawn_local(async move {// 调用 Tauri 的 invoke 方法获取 base64 图片数据let selected_count = selected_pdt_data.get_untracked().len();if selected_count == 0 {set_vic_plot_error.set(String::from("错误:未选中产品数据,请勾选数据前的复选框!!"));return;} else if selected_count > 7 {set_vic_plot_error.set(String::from("错误: 选中产品数据超过7个,请重新选择!!"));return;}set_vic_plot_error.set(String::new());let pdts_data = SelectedPdtData{productdata: selected_pdt_data.get_untracked(),};let args_js = serde_wasm_bindgen::to_value(&pdts_data).unwrap(); //直接序列化数组let pdts_curve_js = invoke("python_acid_plot", args_js).await;// 处理Tauri命令返回if let Some(err) = pdts_curve_js.dyn_ref::<js_sys::Error>() {set_vic_plot_error.set(format!("后端错误: {}", err.to_string()));return;}let result = match pdts_curve_js.as_string() {Some(s) => s,None => {set_vic_plot_error.set(format!("无效的返回类型: {:?}", pdts_curve_js));return;}};// 处理图片数据let image = result;//log!("图片数据: {:?}", image);// 检查 Base64 数据是否包含前缀let base64_data = if image.starts_with("data:image/png;base64,") {image.trim_start_matches("data:image/png;base64,").to_string()} else {image};// 将 Base64 字符串解码为二进制数据let binary_data = match STANDARD.decode(&base64_data) {Ok(data) => data,Err(_) => {set_vic_plot_error.set("Base64解码失败".to_string());return;}};// 将二进制数据转换为 js_sys::Uint8Arraylet uint8_array = Uint8Array::from(&binary_data[..]);// 创建 Bloblet options = BlobPropertyBag::new();options.set_type("image/png");let blob = match Blob::new_with_u8_array_sequence_and_options(&Array::of1(&uint8_array),&options,) {Ok(blob) => blob,Err(_) => {set_vic_plot_error.set("创建图片Blob失败".to_string());return;}};// 生成图片 URLlet image_url = match Url::create_object_url_with_blob(&blob) {Ok(url) => url,Err(_) => {set_vic_plot_error.set("创建图片URL失败".to_string());return;}};// 打印生成的 URL,用于调试//log!("Generated Blob URL: {}", image_url);// 动态创建 <img> 元素let img = document().create_element("img").expect("Failed to create img element");img.set_attribute("src", &image_url).expect("Failed to set src");img.set_attribute("alt", "Plot").expect("Failed to set alt");// 设置宽度(例如 300px),高度会自动缩放img.set_attribute("width", "1000").expect("Failed to set width");// 将 <img> 插入到 DOM 中let img_div = document().get_element_by_id("img_div_python").expect("img_div not found");// 清空 div 内容(避免重复插入)img_div.set_inner_html("");img_div.append_child(&img).expect("Failed to append img");});};view! { //view!宏作为App()函数的返回值返回IntoView类型<main class="container"><div><form id="img_python" on:submit=python_acid_image><div class="error-message" style="color: red; font-weight: bold;">{move || vic_plot_error.get() }</div><button type="submit">"绘制温粘曲线Matplotlib"</button><p></p> <div id="img_div_python" style="flex: 1;"><imgsrc=""width="1000"/></div></form></div></main>}
}
2. 后台Tauri
前端调用了后台的python_acid_plot命令,将包含产品成分数据的结构变量序列化后传递给后台命令,后台将结构体转换成HashMap格式再传递给调用的python脚本。具体代码如下:
struct Pdt {pdt_id:i64,pdt_name:String,pdt_si:f64,pdt_al:f64,pdt_ca:f64,pdt_mg:f64,pdt_fe:f64,pdt_ti:f64,pdt_ka:f64,pdt_na:f64,pdt_mn:f64,pdt_date:String,
}#[tauri::command]
fn python_acid_plot(app: tauri::AppHandle, productdata: Vec<Pdt>) -> Result<String, String> {use std::collections::HashMap;let resource_path = app.path().resolve("resources/views.py", BaseDirectory::Resource).expect("Failed to resolve resource");// 将Pdt结构体转换为HashMaplet data: Vec<HashMap<&str, serde_json::Value>> = productdata.iter().map(|pdt| {let mut map = HashMap::new();map.insert("pdt_id", serde_json::json!(pdt.pdt_id));map.insert("pdt_name", serde_json::json!(pdt.pdt_name));map.insert("pdt_si", serde_json::json!(pdt.pdt_si));map.insert("pdt_al", serde_json::json!(pdt.pdt_al));map.insert("pdt_ca", serde_json::json!(pdt.pdt_ca));map.insert("pdt_mg", serde_json::json!(pdt.pdt_mg));map.insert("pdt_fe", serde_json::json!(pdt.pdt_fe));map.insert("pdt_ti", serde_json::json!(pdt.pdt_ti));map.insert("pdt_ka", serde_json::json!(pdt.pdt_ka));map.insert("pdt_na", serde_json::json!(pdt.pdt_na));map.insert("pdt_mn", serde_json::json!(pdt.pdt_mn));map.insert("pdt_date", serde_json::json!(pdt.pdt_date));map}).collect();// 将HashMap序列化为JSON字符串// 添加调试日志//println!("Input data to Python script: {:?}", data);let input_data = serde_json::to_string(&data).map_err(|e| e.to_string())?;// 添加调试日志//println!("JSON input data: {}", input_data);// 创建Python进程并将数据通过标准输入传递let mut command = Command::new("E:/python_envs/eric7/python.exe").arg(resource_path).stdin(std::process::Stdio::piped()).stdout(std::process::Stdio::piped()).stderr(std::process::Stdio::piped()).spawn().map_err(|e| e.to_string())?;// 将JSON数据写入Python进程的标准输入if let Some(stdin) = command.stdin.as_mut() {Write::write_all(stdin, input_data.as_bytes()).map_err(|e| e.to_string())?;}// 等待命令完成并获取输出let output = command.wait_with_output().map_err(|e| e.to_string())?;if output.status.success() {let image_data = String::from_utf8(output.stdout).map_err(|e| e.to_string())?.trim().to_string();Ok(image_data)} else {let error_message = String::from_utf8(output.stderr).map_err(|e| e.to_string())?;Err(error_message)}
}
3. python脚本
Python脚本为调用Matplotlib绘图,需要将传递的JSON数据处理成字典数列,作为函数参数。具体代码如下:
# -*- coding: utf-8 -*-
import sys
import json
from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib import font_manager
import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO
import base64# 尝试多种中文字体
try:plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'WenQuanYi Zen Hei', 'Arial Unicode MS']plt.rcParams['axes.unicode_minus'] = False
except:# 如果设置失败,尝试指定字体路径try:font_path = 'C:/Windows/Fonts/msyh.ttc' # 微软雅黑字体路径font_prop = font_manager.FontProperties(fname=font_path)plt.rcParams['font.family'] = font_prop.get_name()except Exception as e:print(f"字体设置失败: {str(e)}", file=sys.stderr)def draw_vis_temp_curve(productdata):# 初始化所有可能用到的变量global B0_1, B1_1, T0_1, B0_2, B1_2, T0_2global label_Name_1, label_Name_2, label_Name_3, label_Name_4, label_Name_5, label_Name_6, label_Name_7global Pdt_chem_list1, Pdt_chem_list2, Pdt_chem_list3, Pdt_chem_list4, Pdt_chem_list5, Pdt_chem_list6, Pdt_chem_list7B0_1 = B1_1 = T0_1 = 0.0B0_2 = B1_2 = T0_2 = 0.0label_Name_1 = label_Name_2 = label_Name_3 = label_Name_4 = label_Name_5 = label_Name_6 = label_Name_7 = ""Pdt_chem_list1 = Pdt_chem_list2 = Pdt_chem_list3 = Pdt_chem_list4 = Pdt_chem_list5 = Pdt_chem_list6 = Pdt_chem_list7 = []curve_num = len(productdata)########################### 开始绘制温粘曲线#########################################para_list = [[1375.76, 122.29, 1.06247, 1.57233, 1.61648, 1.44738, 1.92899, 1.47337], [1272.64, 117.64, 1.05336, 1.42246, 1.48036, 1.51099, 1.86207, 1.36590],\[1192.44, 112.99, 1.03567, 1.27336, 1.43136, 1.41448, 1.65966, 1.20929]]Mol_list = [60.084, 101.96, 56.077, 40.3044, 159.6882, 79.9, 61.98, 94.2, 86.94]y_min_1 = 999999y_max_1 = 0y_min_2 = 999999y_max_2 = 0y_min_3 = 999999y_max_3 = 0y_min_4 = 999999y_max_4 = 0y_min_5 = 999999y_max_5 = 0y_min_6 = 999999y_max_6 = 0y_min_7 = 999999y_max_7 = 0for j,temp_obj in enumerate(productdata,1):if j == 1:label_Name_1 = temp_obj['pdt_name']Pdt1_Si_val = temp_obj['pdt_si']Pdt1_Al_val = temp_obj['pdt_al']Pdt1_Ca_val = temp_obj['pdt_ca']Pdt1_Mg_val = temp_obj['pdt_mg']Pdt1_Fe_val = temp_obj['pdt_fe']Pdt1_Ti_val = temp_obj['pdt_ti']Pdt1_Na_val = temp_obj['pdt_na']Pdt1_K_val = temp_obj['pdt_ka']Pdt1_Mn_val = temp_obj['pdt_mn']......//具体绘图程序不便展示plt.tight_layout()buffer = BytesIO()plt.savefig(buffer, dpi=400, format='png', transparent=True, facecolor = 'none')buffer.seek(0)imageVis = base64.b64encode(buffer.read()).decode('utf-8')return f"data:image/png;base64,{imageVis}"########################### 温粘曲线绘制完成 ######################################### # 从标准输入读取JSON数据并处理编码
input_data = sys.stdin.buffer.read().decode('utf-8')
try:productdata = json.loads(input_data)# 调用绘图函数result = draw_vis_temp_curve(productdata)# 输出结果print(result, end="")
except Exception as e:print(f"Error processing input: {str(e)}", file=sys.stderr)sys.exit(1)
4. tauri.conf.json设置
为了让程序找到python程序文件,并在cargo tauri build编译时将python文件编译进程序中,需要将python文件放在src-tauri\resources目录下,并修改tauri.conf.json程序,具体内容如下:
{"beforeBuildCommand": "trunk build && xcopy /E /I src-tauri\\resources src-tauri\\target\\release\\resources",},"bundle": {"resources":["resources/plot.py", "resources/views.py"]}
}
至此就实现了前端Leptos调用后台Tauri命令,并传递结构变量作为参数,后台再调用Python Matplotlib程序绘图,并将图形返回给前端Leptos显示。
相关文章:
Tauri(2.5.1)+Leptos(0.7.8)开发桌面应用---后台调用Python Matplotlib绘制图形
Rust语言最接近Python Matplotlib绘图库的应该是Plotters,但是试用下来还是没有Matplotlib效果好,所以尝试在Tauri Leptos项目中,后台调用Python Matplotlib绘制图形,并返回给前端Leptos展示。 具体效果如下: 1. 前端…...
Qemu-STM32(十七):STM32F103加入AFIO控制器
概述 本文主要描述了在Qemu平台中,如何添加STM32F103的AFIO控制器模拟代码,AFIO是属于GPIO引脚复用配置的功能。 参考资料 STM32F1XX TRM手册,手册编号:RM0008 添加步骤 1、在hw/arm/Kconfig文件中添加STM32F1XX_AFIO&#x…...
刀客doc:小红书商业技术负责人苍响离职
根据大厂日爆的爆料,小红书商业化再度迎来高层人事变动,原商业平台技术负责人苍响(薯名),职级L2,已于本月正式离职,其下属团队现由电商业务负责人接管。 根据刀客doc获得的资料,苍响…...
CC52.【C++ Cont】滑动窗口
目录 1.题目 2.分析 方法1:暴力枚举 方法2:暴力枚举的优化:"同向双指针",也称滑动窗口 前置知识 核心操作 例子解释 代码 提交结果 1.题目 LCR 008. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target…...
linux中由于编译选项-D_OS64BIT导致的核心已转储问题
linux中由于编译选项-D_OS64BIT导致的核心已转储问题排查解决: 原因: a.so b.so a.so使用b.so 程序1 程序2 使用a.so 程序1运行正常,程序2启动后提示核心已转储。 程序1和程序2运行的代码都一致,只执行创建xApplication app&…...
Ubuntu搭建 Nginx以及Keepalived 实现 主备
目录 前言1. 基本知识2. Keepalived3. 脚本配置4. Nginx前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn Java基本知识: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRU…...
Knife4j 接口文档添加登录验证流程分析
Knife4j 接口文档添加登录验证流程是非常必要的,否则接口文档一旦暴露到外面是很危险的,今天我们详细分析一下。在1.9.6的版本时,作者把swagger-bootstrap-ui项目重命名为Knife4j,今天分析2.0.6版本。 1、pom.xml文件引入 <pa…...
C++之string
string 是C中常见的一个用于处理和操作字符串的类。一直有用它来存储字符串,今天来介绍介绍一下它的定义和一些基本用法吧。 1、头文件 #include <string>2、定义和初始化 #include <iostream> #include <string> using namespace std;int main…...
【含文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
项目介绍 本课程演示的是一款基于SSM的电影数据挖掘与分析可视化系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...
DeepSeek提示词技巧
以下是使用Deepseek等AI工具时提升效果的提示词模式总结,涵盖核心规律、应用场景及效果对比: 规律一:结构化提示(解决模糊性问题) 问题:开放式问题导致回答笼统 模式:角色任务约束输出格式 例子…...
软考高项(信息系统项目管理师)第 4 版全章节核心考点解析(第4版课程精华版)
一、核心输入输出速记体系(力扬老师独家口诀) (一)规划阶段万能输入(4 要素) 口诀:章程计划,组织事业 ✅ 精准对应(ITTO 核心输入): 章程&#…...
【linux网络】网络基础概念
1. 初始协议 1.1 OSI 七层模型 OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范; 把网络从逻辑上分为了 7 层. 每一层都有相关、相对应的物理设备&a…...
【PyTorch动态计算图实战解析】从原理到高效开发
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:梯度计算可视化案例2:动态控制流案例3:自定义反向传播运行结果验证三、性能对比测试方法论…...
【专题五】位运算(1):常见位运算操作总结
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
react-native-vector-icons打包报错并且提示:copyReactNativeVectorIconFonts相关信息
使用react-native-vector-icons,打包时会报: FAILURE: Build failed with an exception. * What went wrong: Some problems were found with the configuration of task :app:copyReactNativeVec torIconFonts (type Copy).- Gradle detected a proble…...
【Sqlalchemy Model转换成Pydantic Model示例】
【Sqlalchemy Model转换成Pydantic Model示例】 由于Sqlalchemy和Pydantic的模型字段类型可能有差异, 所以需要一个通用的装换类 def sqlalchemy_to_pydantic_v2(sqlalchemy_model, pydantic_model):"""通用函数,将 SQLAlchemy 模型实例转换为 Pyd…...
探索语音增强中的多尺度时间频率卷积网络(TFCM):代码解析与概念介绍
探索语音增强中的多尺度时间频率卷积网络(TFCM):代码解析与概念介绍 在现代音频处理领域,语音增强技术始终是一个备受关注的研究热点。其主要目标是通过去除背景噪声、回声或其他混杂信号,提升语音通话或录音的质量。…...
私有知识库 Coco AI 实战(四):打造 ES 索引参数小助手
经过前面的实战,我们已经能够快速、准确的检索 ES 官方文档的内容了,但是还是要自己去阅读。既然 Coco AI 能与大模型交互,我们何不直接用大模型来阅读文档,回答我们的问题? 模型配置 我们进入 Coco AI 管理后台&…...
苍穹外卖心得体会
1 登录认证 技术点:JWT令牌技术(JSON Web Token) JWT(JSON Web Token)是一种令牌技术,主要由三部分组成:Header头部、Payload载荷和Signature签名。Header头部存储令牌的类型(如JW…...
Ubuntu上搭建python环境并安装第三方库
Ubuntu上搭建python环境并安装第三方库 更新系统包列表安装Python和pip验证安装创建并使用虚拟环境虚拟环境中安装第三方库编写并测试python脚本运行.py文件 使用Ubuntu 24.04搭建python环境并安装第三方库 更新系统包列表 sudo apt update安装Python和pip sudo apt install…...
redis高阶2 高性能
灵魂拷问: redis 为什么块? 纯内存访问单线程避免上下文切换渐进式ReHash , 缓存时间戳 Redis 的 key 和 value组织结构: 全局哈希表: 为了实现从键到值的快速访问。 redis 使用了一个哈希表 来保存所有键值对。一个哈希表 其实就…...
go编解码json和http请求
1.json概述 json是日常工作中http请求的最重要的数据格式。对比日常使用python中的json,获得http请求后json.loads和json.dumps函数,go中显的非常麻烦,这里结合json和http请求的总结下,便于积累和学习。这里给出一个json的类型&a…...
洛谷题解 | CF1979C Earning on Bets
目录 题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 说明/提示题目思路AC 代码 题目描述 You have been offered to play a game. In this game, there are $ n $ possible outcomes, and for each of them, you must bet a certain integer amount of coins. In th…...
在线文章系统自动化测试报告
目录 1. 项目简介 1.1. 用户登录页面 1.2. 文章列表页面 1.3. 文章详情页面 1.4. 文章编辑与发布页面 2. 测试计划 3. 测试环境/工具/技术栈 4. 编写自动化测试用例编辑 5. 自动化测试脚本开发 5.1. 项目整体结构 5.2. 配置utils.py 5.2.1. 导入必要的库 5.2.2.…...
C++ 类和对象(3)初始化列表、友元函数、内部类
文章目录 再谈构造函数构造函数体内赋值 初始化列表初始化列表特点 类型转换static成员static特点C11中成员初始化的新用法 友元友元函数友元函数特点 友元类友元类的特点 内部类内部类的特点 再谈构造函数 构造函数体内赋值 当我们创建对象时,编译器会调用构造函…...
CF4C Registration system(哈希实现)
解题思路:因为这道题在每次输入一个字符串后,都需要进行一次查找以判断是否需要按照规则生成新的用户名,故这道题使用STL容器map进行哈希是最合适的(map的查找时间复杂度为log n),在题目描述中,如果用户名已经被注册&a…...
DDI0487--A1.7
Introduction RAS(Reliability,Availability,Serviceability) RAS是衡量一个系统可靠性的三个方面: Reliability——持续提供正确服务的能力。 Availability——正确提供服务的准备状态。 Serviceability——能够进行修改和修复的能力。 R…...
MySQL事务(transaction)(笔记)
事务(Transaction)(必须掌握必须理解) 1.什么是事务? 一个事务是一个完整的业务逻辑单元(一个业务逻辑单元常常涉及到多条DML语句共同执行完成),不可再分(最小的工作单元) 一个事务就是一个业务,完成一个…...
ADS1299模拟前端(AFE)代替芯片——LHE7909
在现代医疗科技的飞速发展中,精确的生物电势测量设备变得越来越重要。领慧立芯推出的LHE7909,是一款专为心电图(ECG)和其他生物电势测量设计的低噪声24位模数转换器(ADC),为医疗设备制造商提供了…...
(三十二)Android开发中AppCompatActivity和Activity之间的详细区别
在 Android 开发中,AppCompatActivity 和 Activity 是两个核心类,用于创建和管理应用程序的用户界面。尽管它们功能上有重叠,但它们之间存在显著的区别。本文将详细讲解 AppCompatActivity 和 Activity 的区别,并结合代码示例和具…...
Neo4j 的 `SET n += $properties` 语法详解
Neo4j 的 SET n $properties 语法详解 SET n $properties 是 Neo4j Cypher 查询语言中的一个非常有用的语法,用于更新节点或关系的属性。让我详细解释它的含义和工作原理: 基本含义 SET:Cypher 中用于修改属性或标签的关键字n࿱…...
springboot 框架把 resources下的zip压缩包, springboot 项目启动后解压到项目根目录工具类
最近有一个需求,在开发的时候 有一些c的扩展文件 需要放到服务器上,如果手动放上去,给用户部署项目就很麻烦,就根据这个需求,先把项目需要的 扩展文件 打包成zip压缩包 然后项目启动的时候 把resources文件夹下的 zip压…...
指针(5)
1.sizeof 和 strlen 的对比 1.1sizeof sizeof 是操作符,sizeof 计算变量所占内存空间的大小,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占空间的大小。 sizeof 只关注占用内存的空间的大小,不在…...
机器学习day4-Knn+交叉验证api练习(预测facebook签到位置)
数据集:FackebookV : 预测 row id:签⼊事件的id x y:坐标 accuracy: 准确度,定位精度 time: 时间戳 place_id: 签到的位置,需要预测的内容 具体步骤: # 1.获取数据集 # 2.基本数据处理 # 2.1 缩⼩数据…...
AI工具 Trae 创建java项目和配置运行环境完整示例
以下是使用字节跳动 Trae IDE 创建 Java 项目并配置运行环境的完整示例,结合其核心功能和搜索结果的实践案例整理: 一、环境准备与安装 下载与安装 访问 Trae 官网 下载 Windows 或 macOS 版本客户端,安装完成后选择中文界面和主题(推荐 Dark/DeepBlue 主题)。首次启动时支…...
【论文_序列转换模型架构_20230802v7】Attention Is All You Need 【Transformer】
https://arxiv.org/abs/1706.03762 20170612 v1 代码实现_notebook ∗Equal contribution. Listing order is random. Jakob proposed replacing RNNs with self-attention and started the effort to evaluate this idea. 提出用 self-attention 替代 RNNs,并开始…...
清晰易懂的跨域请求知识——拿捏
1. 什么是跨域请求? 简单来说:当你的 前端网页(例如 http://frontend.com)通过 JavaScript 调用 后端接口(例如 http://backend.com/api)时,如果两者的 域名、端口、协议 中任意一项不同&#…...
前端漏洞不扫描理由
漏洞类型豁免理由基于DOM的XSS1.已实施安全加固: 使用encodeURIComponent对URL参数进行编码 对特殊字符(<>“”&)进行HTML实体转义 使用template literal替代字符串拼接 移除了直接操作DOM的不安全写法,二次扫描仍然扫描出来,且修改建议模糊 2…...
论文阅读的三个步骤
论文阅读的三个步骤 方法说明链接:https://www.academia.edu/4907403/How_to_Read_a_Paper 方法框架如下...
Javascript 中的继承?如何实现继承?
一、继承的本质 继承:子对象可以自动拥有父对象的属性和方法,就像孩子继承父母的基因。JavaScript 的继承:通过原型链实现(原型和原型链是底层核心)。 二、4 种常见继承方式 1. 原型链继承(传家宝模式&am…...
深入理解 Linux 权限管理:从基础到进阶
在 Linux 系统中,权限管理是保障系统安全与资源合理分配的核心机制。无论是服务器管理员,还是日常使用 Linux 的开发者,深入掌握权限管理,不仅能避免因权限设置不当导致的数据泄露或系统故障,还能灵活高效地管理各类资…...
第1阶段-前5天-考试题及答案
文章目录 1.1 用户 root 的家目录是哪里?1.2 如何查询 linux 系统 ip 地址?1.3 检查是否可以访问 baidu.com 的命令?1.4 [rootoldboy-c7 /etc/sysconfig/ ]# 说说每一部分含义?1.5 说说 Linux 常见快捷键?(至少 3 个)1.6 Windows 分为 C 盘,D 盘,但是 Linux 一切从 根或/ …...
农村供水智能化远程监控解决方案
农村供水智能化远程监控解决方案 ——基于巨控GRM242Q-4D4I4Q(HE)模块的快速部署方案 一、项目需求与痛点 某西南山区农村供水项目需管理12个分散站点,每个站点包含: 4-20mA模拟量:压力传感器、流量计485通信设备:智能水表&…...
4月29日星期二今日早报简报微语报早读
4月29日星期二,农历四月初二,早报#微语早读。 1、特朗普声称中方领导人打了电话,外交部:近期中美元首没有通话; 2、跳水世界杯总决赛名单出炉,“梦之队”全主力出战; 3、深圳:对年…...
C++日更八股--first
### 内存static和dynamic的区别 static(静态) 和 dynamic(动态)<br> static:内存分配在编译的时候确定,大小和生命周期固定,无需运行时分配开销<br> dynamic:内存分配在运行时动态申请…...
Git操作指令
1.基础操作指令: (1).查看修改的状态(git status): 查看修改的状态(暂存区、工作区) (2).添加工作区到暂存区(git add 单个文件名 | 通配符): 添加工作区一个或多个文件的修改到暂存区 (3).提交暂存区到本地仓库(git commit -m "注释内容"): 提交暂存区内容到本…...
Linux——安装NVM
1. 安装命令 官方地址:https://github.com/nvm-sh/nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash2. 安装完成后执行命令 source ~/.bashrc3. 验证 nvm -v...
C++之AVL树
前言 一、AVL的概念 二、AVL树的实现 2.1 AVL的结点结构 2.2 AVL树结点的插入 平衡因子的更新 更新原则: 更新停止的条件: 插入结点以及更新平衡因子的代码实现 旋转 右单旋 左单旋 左右双旋 右左双旋 2.3 AVL树的查找 2.4 AVL树的平衡性检测 总结 前言 …...
解决STM32H743单片机USB_HOST+FATF操作usb文件
前缀 花了两天的时间整理了一下在使用STM32H743单片机开发usb相关功能时遇到的问题及解决方案,具体为以下2种情况: 1.USB插上单片机后,单片机卡死,导致长时间没有喂狗程序重启; 2.USB正常插拔后,使用FAT…...
数据结构|并查集
Hello !朋友们,这是我在学习过程中梳理的笔记,以作以后复习回顾,有时略有潦草,一些话是我用自己的话描述的,可能不够准确,还是感谢大家的阅读! 目录 一、并查集Quickfind 二、两种算…...