rust 前端npm依赖工具rsup升级日志
rsup
是使用 rust 编写的一个前端 npm 依赖包管理工具,可以获取到项目中依赖包的最新版本信息,并通过 web 服务的形式提供查看、升级操作等一一系列操作。
在前一篇文章中,记录初始的功能设计,自己的想法实现过程。在自己的使用过程功能中,也会发现一些存在的问题,有一些问题值得记录的再次标记,供大家参考。
rsup 工具安装
在上一篇文章中描写的安装rsup
工具部分错误,因为我本地是 macos 系统,
rust 默认执行cargo build
构建的是适合 macos 的可执行文件,对于 windows、linux 是不能直接用;还有一个问题,就是rsup-web
静态服务资源是不会被编译进工具包的,我本地能用也仅仅是我本地有源代码,它指向静态资源路径的就是我电脑的绝对地址。
可以采取将静态资源链接打包进二进制文件中。
- 使用
include_bytes!
rust 内置的宏将静态文件的内容嵌入到二进制文件 - 使用第三方 crate,比如
embed-resource
或者rust-embed
但是为了方便控制 web 静态资源,比如可以单独更新。采取了静态文件和可执行文件分离的方式,提供下载器同时下载rsup
可执行文件和rsup-web
web 静态资源。针对不同的系统定义默认的下载路径,然后通过配置文件读取 web 静态资源提供 web 服务。
rsup
工具包包含了配置文件、可执行文件、web 服务文件等。根据不同的系统,提供了三种安装工具包包括 linux、macos、windows。
macos installer
ubuntu instanller
windows instanller
提供了安装脚本文件sh
一键下载解压、安装。无需手动配置环境变量。
curl -fsSL https://github.com/ngd-b/rsup/blob/main/install.sh | sh
windows
用户需要手动下载安装包,解压后执行installer.exe
即可,并且需要手动配置环境变量。
installer
子包下载资源
这是为了解决上述问题新增的一个安装器,更友好的交互方式进行安装。也方便后面对下载方式进行更友好的优化。
执行安装器需要使用管理员权限。windows
右键以管理员身份执行 exe;类 linux 系统需要使用sudo
执行。
提供了从 github 或者 gitee 下载资源两种方式。使用第三方库 crate 目前只提供了从dialoguer
进行交互选择。github
下载资源。
use clap::{Parser, ValueEnum};
use dialoguer::{theme::ColorfulTheme, Select};#[derive(Parser, Debug, Clone, ValueEnum)]
pub enum Origin {Github,Gitee,
}impl Origin {// ...pub fn as_str(&self) -> &'static str {match self {Origin::Github => "github",Origin::Gitee => "gitee",}}/// 将枚举pub fn choices() -> Vec<&'static str> {vec![Origin::Github.as_str(), Origin::Gitee.as_str()]}
}/// 提示用户选择下载源
/// @return 下载源
pub fn prompt_origin() -> Origin {let select = Select::with_theme(&ColorfulTheme::default()).with_prompt("Please select download source...").default(0).items(Origin::choices().as_slice()).interact().unwrap();match select {0 => Origin::Github,1 => Origin::Gitee,_ => unreachable!(),}
}
使用reqwest
下载资源,并将资源保存到默认路径。文件路径output
的目录必须要提前创建,而fs::File::create(output)
创建了资源文件,如果文件已经存在会直接覆盖。
use reqwest::Client;
use tokio::fs;/// 下载文件
///
async fn download_file(client: &Client, url: &str, output: &str) -> Result<(), Box<dyn Error>> {// 下载地址let res = client.get(url).send().await?;if res.status().is_success() {// 下载成功// 保存文件到指定目录// 文件路径let mut file = fs::File::create(output).await?;// 保存文件let bytes = res.bytes().await?;file.write_all(&bytes).await?;Ok(())} else {let error_message = format!("Request failed with status code: {}", res.status());Err(Box::new(std::io::Error::new(std::io::ErrorKind::Other,error_message,)))}
}
文件下载完成后需要解压。所有的资源文件都是.tar.gz
格式的,使用flate2
解压文件,并且需要使用tar
进行解包提取到指定目录。
use flate2::read::GzDecoder;
use tar::Archive;/// 解压文件
///
/// @param url 下载地址
/// @param target_dir 保存目录
async fn decompress_file(url: &str, target_dir: &str) -> Result<(), Box<dyn Error>> {let tar_gz = File::open(url)?;let decomppress = GzDecoder::new(tar_gz);let mut archive = Archive::new(decomppress);// 处理解压目录,不存在则创建目录if !Path::new(target_dir).exists() {fs::create_dir_all(target_dir).await?;}archive.unpack(target_dir)?;Ok(())
}
所需要的资源下载解压完成后,现在默认目录下(类 linux 系统下是/opt/rsup
)有三个文件
rsup
可执行文件config.toml
配置文件web
web 静态资源
可以直接去执行rsup
可执行文件。但是当前目录下没有package.json
文件,我们可以指定参数--dir
去访问指定目录下的package.json
。为了方便命令的使用,安装时经将命令添加到环境变量中。
针对不同的操作系统,环境变量的配置文件不一样。windows
系统需要用户自行配置,macos
系统下是.zshrc
;其他类系统默认为.bashrc
use std::io::Write;
use std::{error::Error, fs::OpenOptions};/// 提示用户是否添加命令到环境变量
/// 默认添加
pub fn prompt_add_to_env(path: &str) -> Result<(), Box<dyn Error>> {// ... 省略部分代码let home_dir = std::env::var("HOME")?;// 确定系统使用的shelllet shell_file_name = match os {"macos" => ".zshrc",_ => ".bashrc",};// 环境变量配置目录let shell_config_path = format!("{}/{}", home_dir, shell_file_name);// 写入配置let mut file = OpenOptions::new().append(true).open(shell_config_path)?;writeln!(file, "\n# Add rsup to PATH\nexport PATH=\"{}:$PATH\"", path)?;
}
写入配置文件后,需要重新加载配置文件。执行source ~/.zshrc
或者.bashrc
,这样就可以全局使用rsup
命令了。
config
子包管理配置文件
配置文件的读取和写入使用config
子包,提供配置文件读写操作。installer
安装时会默认生成配置文件,在rsup
执行时会读取配置文件。为了方便配置文件管理,新增config
子包。
使用了 crate toml
对配置文件config.toml
进行读写序列化和反序列化。
use std::{error::Error,fs::{self, File},io::{self, Write},path::Path,
};impl Config {/// 读取配置文件///pub async fn read_config() -> Result<(), Box<dyn Error>> {// 读取配置文件let config_dir = Config::get_url();let config_file_dir = format!("{}/config.toml", config_dir);// ... 省略部分代码let config_content = fs::read_to_string(&config_file_dir)?;let config: Config = toml::from_str(&config_content)?;Ok(())}/// 写入配置文件pub async fn write_config() -> Result<Config, Box<dyn Error>> {let config_dir = Config::get_url();// ... 省略部分代码// 配置文件let config_url = format!("{}/config.toml", config_dir);let mut file = File::create(config_url.clone())?;let mut config = Config::default();// 配置文件路径config.dir = config_dir.clone();// 静态文件目录config.web.static_dir = format!("{}/web", &config_dir);let config_content = toml::to_string(&config)?;file.write_all(config_content.as_bytes())?;Ok(config)}
}
在主入口main
中执行读取配置文件,然后可以在各个子包中读取。为了方便使用,在config
中提供了静态全局变量CONFIG
,使用了第三方 crateonce_cell
实现。
use once_cell::sync::OnceCell;// 全局共享配置
pub static CONFIG: OnceCell<Config> = OnceCell::new();impl Config {pub async fn read_config() -> Result<(), Box<dyn Error>> {// ... 省略部分代码// 保存配置数据共享CONFIG.set(config).unwrap();}/// 父级包获取配置pub fn get_config() -> &'static Config {CONFIG.get().unwrap()}
}
这样就可以在其他子包中直接使用config::Config::get_config()
获取配置数据了。
配置文件中包含的配置项有:
name = "rsup"
version = "0.3.0"
dir = "/opt/rsup"[web]
port = 8888
static_dir = "/opt/rsup/web"[pkg]
npm_registry = "https://registry.npmmirror.com"
配置文件中的dir
字段是安装目录,默认安装在/opt/rsup
;web.port
字段是 web 服务的端口号,默认8888;pkg.npm_registry
字段是 npm 依赖源地址,默认为国内镜像。通常只建议修改pkg.npm_registry
设置源地址,方便请求依赖包。
command
子包提供命令行交互
提供了新的子包command
,用于解析命令行参数。统一管理命令行参数,方便使用。并且提供了一些方法使用。
在使用rsup
命令时,可以指定目录使用前端 npm 依赖管理web服务;也可以通过输入自命令进行交互式操作。
子命令包含了两部分:Config
配置命令;Update
更新命令。新创建了command
子包,在主包解析参数时进行逻辑判断,如果输入命令则执行对应的子命令;未输入子命令则默认执行 web 服务;
#[tokio::main]
async fn main() {let args = Cli::parse();match args.command {Some(Commands::Config { .. }) | Some(Commands::Update { .. }) => {run().await;}_ => {let package = Package::new();// 默认启动pkg解析服务let package_clone = package.clone();task::spawn(async move {pkg::run(args.pkg_args, package_clone).await;});web::run(package.clone()).await;}}
}
执行run()
方法调用了子包command
中的方法,并解析命令行参数,根据参数执行对应的操作。
pub async fn run() {let cli = Commands::parse();let _ = match cli {Commands::Config { config } => match config {ConfigOptions::List => ConfigOptions::list_config().await,ConfigOptions::Set { key, value } => ConfigOptions::set_config_value(&key, value).await,ConfigOptions::Get { key } => ConfigOptions::get_config_value(&key).await,ConfigOptions::Delete => todo!(),},Commands::Update { update } => {// 获取最新的包地址let (rsup_url, rsup_web_url) = utils::get_pkg_url(None);// 获取命令安装目录let config = external_config::Config::get_config().await;match update {UpdateOptions::Rsup => UpdateOptions::rsup_update(rsup_url, &config.dir).await,UpdateOptions::Web => {UpdateOptions::rsup_web_update(rsup_web_url, &config.dir).await}}}};
}
Config
配置命令
Config
配置命令用来管理配置文件,提供交互式操作。我们之前在installer
安装时,默认生成配置文件。通过config
命令可以查看、修改、删除配置项。
config list
可以展示出配置文件config.toml
,在我们安装好rsup
命令后,执行rsup config list
可以看到配置文件内容。
config set key value
可以修改配置文件中的值,例如:rsup config set web.port 9999
修改web服务端口号。
对于配置文件的访问、修改,主要是使用了子包config
中的方法。为了方便修改,对于子包config
的实现进行了调整,文章上面提到的实现为第一版实现,可以做对比差异。
初始实现的需要在core
主入口中调用一次读取配置文件,然后在其他子包中通过config::Config::get_config()
获取。这种方式在config
子包中不方便直接修改配置文件,需要重新读取。
使用tokio::sync::RwLock
实现读写锁,它是线程安全的。使用once_cell::sync::Lazy
实现懒加载,在首次使用时才去读取配置文件。
pub static CONFIG: Lazy<RwLock<Config>> = Lazy::new(|| {// 这里调用初始化let config = Config::read_config().unwrap();RwLock::new(config)
});
在使用set
设置配置项时,需要管理员权限,配置更新后会同步更新config.toml
配置文件
Update
更新命令
rsup
工具包含自身和web
服务两部分,提供了更新命令,可以更新rsup
工具和web
服务。
通过rsup update rsup
更新工具,通过rsup update web
更新web服务。
utils
子包提供公共方法
为了方便子包之间的共用方法的服用,提供了utils
子包,提供了一些公共方法。
遇到的问题
记录一下遇到的问题,方便后续查阅。
在使用本地config
模块与配置文件config
发生命名冲突
通过extern
明确导入外部模块
// 引入外部crate
extern crate config as external_config;
发布包到crates-io
时名称重复,本地引用修改名称
本地开发时使用的名称utils
,为了发布到crates-io
时,需要修改名称rsup_utils
,避免名称重复。然后本地引用时使用package
字段指定名称,这样不需要去调整代码里的引用。
[package]
utils = { version = "0.1.0", path = "../utils", package = "rsup_utils" }
下载文件时展示进度条
之前的文件下载时,控制台会陷入长时间的阻塞状态,没有任何反应,为了提供更好的交互体验,使用indicatif
展示进度条。
要采用进度条,在下载文件时就要使用流式读取文件,以便更新进度条。
增加两个新的lib库,futures-util
提供对于stream
的扩展函数。
cargo add indicatif
cargo add futures-util
修改请求reqwest
增加特性支持stream
[dependencies]
reqwest = { version = "0.12.9", features = ["stream"] }
修改之前的下载函数download_file
,不再使用write_all
一次性写入文件,通过分批次读取写入,并同步更新进度条。
/// 下载文件
///
async fn download_file(client: &Client, url: &str, output: &str) -> Result<(), Box<dyn Error>> {// 下载地址let res = client.get(url).send().await?;if res.status().is_success() {// 获取文件大小let content_size = res.content_length().ok_or("无法获取文件大小")?;// 下载成功// 保存文件到指定目录// 文件路径let mut file = fs::File::create(output).await?;// 创建进度条let pb = ProgressBar::new(content_size);pb.set_style(ProgressStyle::default_bar().template("{msg} [{elapsed_precise}] {bar:80} {percent}%")?.progress_chars("##-"),);// 创建流式响应体let mut downloaded = 0;let mut stream = res.bytes_stream();while let Some(item) = stream.next().await {let chunk = item?;file.write_all(&chunk).await?;let len = chunk.len() as u64;downloaded += len;pb.set_position(downloaded);}pb.finish_with_message("下载完成");// 保存文件// let bytes = res.bytes().await?;// file.write_all(&bytes).await?;Ok(())} else {let error_message = format!("Request failed with status code: {}", res.status());Err(Box::new(std::io::Error::new(std::io::ErrorKind::Other,error_message,)))}
}
解决web
服务自动后刷新页面加载不到的问题
这是典型的SPA的问题,由于我们使用的是history路由模式,路由由前端控制。我们刷新页面比如http://localhost:8888/home
时,会请求http://localhost:8888/home
,但是web
服务没有这个路由,所以会返回404
,导致刷新页面加载不到。
为了处理这个问题,需要增加通配符路由处理跳转route("/{tail:.*}", web::get().to(index))
,{tail:.*}
是一个路径参数,它可以匹配任何路径。
let server = HttpServer::new(move || {//...App::new().app_data(web::Data::new(ms.clone())).route("/", web::get().to(index)).wrap(cors).service(web::scope("/api").configure(api::api_config)).service(Files::new("/static", format!("{}/static/", &static_file_path)).prefer_utf8(true),).route("/ws", web::get().to(socket_index))// SPA fallback route.route("/{tail:.*}", web::get().to(index))
})
windos
系统下不同的命令执行名称
在windows
系统下,我们执行npm -v
时,实际内部执行的是npm.cmd -v
,而在mac系统下,执行npm -v
时,实际内部执行的是npm -v
,所以需要根据系统类型,使用不同的命令。
// 判断系统,如果是windows,则使用npm.cmd
let npm_cmd = if cfg!(windows) { "npm.cmd" } else { "npm" };
如果安装时是.exe
的话就不需要添加后缀了,直接使用即可。比如node
web
服务API参数映射处理
在处理API请求参数时,通过枚举定义了参数类型,然后通过解析匹配到指定的数据结构。
async fn update_pkg(req: web::Json<ReqParams>,data: web::Data<Ms>,
) -> Result<impl Responder, Error> {match &*req {ReqParams::UpdatePkg(params) => {}err => {// ...}
}
如果定义的数据结构字段存在重叠,某个结构完全包含另一个结构的字段,在匹配时就需要将完全包含的结构放在前面,否则可能会匹配到错误的结构。
#[derive(Deserialize, Serialize, Debug)]
#[serde(untagged)]
pub enum ReqParams {UpdatePkg(UpdateParams),// 删除// 目前接受一个nameRemovePkg(RemoveParams),
}
UpdateParams
和RemoveParams
存在字段重叠,UpdateParams
包含了RemoveParams
的所有字段,要想匹配到UpdateParams
,需要将RemoveParams
放在前面。
最后
部署了rsup
文档服务网站rsup|Npm Helper
往期rsup
文章:
- 模式匹配、trait 特征行为、必包、宏
- 多线程任务执行
- 并发线程间的数据共享
- 包、模块,引用路径
- 开发一个命令行工具
- rust 命令行工具rsup管理前端npm依赖
相关文章:
rust 前端npm依赖工具rsup升级日志
rsup是使用 rust 编写的一个前端 npm 依赖包管理工具,可以获取到项目中依赖包的最新版本信息,并通过 web 服务的形式提供查看、升级操作等一一系列操作。 在前一篇文章中,记录初始的功能设计,自己的想法实现过程。在自己的使用过…...
J-LangChain,用Java实现LangChain编排!轻松加载PDF、切分文档、向量化存储,再到智能问答
Java如何玩转大模型编排、RAG、Agent??? 在自然语言处理(NLP)的浪潮中,LangChain作为一种强大的模型编排框架,已经在Python社区中广受欢迎。然而,对于Java开发者来说,能…...
文档识别-C#中英文文档识别接口-PDF文件内容识别API
文档识别接口可满足用户在数字化转型过程中对文档处理的高效、准确需求。翔云文档识别接口以成熟的文字识别技术、自然语言处理技术、图像识别技术为核心,能够将文档上的非可编辑文本转化为可编辑的数据,从而提升信息处理的速度与实现文档数字化管理的准…...
什么是元数据管理?为什么数据治理的第一步是整理元数据?
什么是元数据管理? 以下是关于元数据管理、数据治理从元数据开始的原因以及数据治理逻辑的简单介绍: 元数据管理 元数据是关于数据的数据,它主要描述了数据的定义、来源、关系、质量、用途等信息。比如在一个学生成绩管理系统中ÿ…...
QSplashScreen --软件启动前的交互
目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显…...
react使用react-quill 富文本插件、加入handlers富文本不显示解决办法
可以调整图片大小 quill-image-resize-module-react 加入插件quill-image-resize-module-reactQuill.register("modules/imageResize", ImageResize); // 注册图片缩放富文本配置中加入如下const quildConfig {toolbar: {container: [["bold", "ital…...
基于vue框架的的银生中学图书管理系统c7b4q(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,书籍分类,书籍信息,书籍借阅,书籍归还 开题报告内容 基于Vue框架的的银生中学图书管理系统开题报告 一、项目背景与意义 随着信息技术的飞速发展和教育现代化进程的加快,学校图书管理面临着前所未有的挑战与机遇。银…...
2025年02月27日Github流行趋势
项目名称:aibrix 项目地址url:https://github.com/vllm-project/aibrix 项目语言:Jupyter Notebook 历史star数:2568 今日star数:554 项目维护者:Jeffwan, varungup90, brosoul, nwangfw, kr11 项目简介&am…...
去耦电容的作用详解
在霍尔元件的实际应用过程中,经常会用到去耦电容。去耦电容是电路中装设在元件的电源端的电容,其作用详解如下: 一、基本概念 去耦电容,也称退耦电容,是把输出信号的干扰作为滤除对象。它通常安装在集成电路…...
Vue.js响应式基础
响应式基础 API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态 ref() 在组合式 API 中,推荐使用 ref() 函数来声明…...
解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案
文章目录 前言操作步骤步骤1:注册账号步骤2:在线体验步骤3:获取API密钥步骤4:安装chatbox步骤5:chatbox设置 价格方面 前言 最近在使用DeepSeek时,开启深度思考功能后,频繁遇到“服务器繁忙&am…...
Java SSE流式数据前后端实现
#Java SSE流式数据前后端实现 Java后端实现 RestController public class SSEController {GetMapping(value "/sse/stream", produces MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter streamSse() throws InterruptedException, IOException {SseEmitter …...
DeepSeek开源周Day4:三连发!突破 AI 训练瓶颈的立体解决方案,并行计算三剑客DualPipe、EPLB与Profile-data
项目地址: https://github.com/deepseek-ai/DualPipehttps://github.com/deepseek-ai/eplbhttps://github.com/deepseek-ai/profile-data 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天 (4/5)! 一、背景概述 …...
3-1 WPS JS宏工作簿的新建与保存(批量新建工作簿)学习笔记
************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...
esp8266 rtos sdk开发环境搭建
1. 安装必要的工具 1.1 安装 Git Git 用于从远程仓库克隆代码,你可以从Git 官方网站下载 Windows 版本的安装程序。安装过程中可保持默认设置,安装完成后,在命令提示符(CMD)或 PowerShell 中输入git --version&#…...
Pycharm使用matplotlib出现的问题(1、不能弹出图表 2、图表标题中文不显示)
Pycharm使用matplotlib出现的问题 问题1:Pycharm调试时出现:AttributeError: module backend_interagg has no attribute FigureCanvas. Did you mean: FigureCanvasAgg? 排查原因:可能是由于matplotlib后端设置不正确或与运行环境不兼容引…...
【MySql】EXPLAIN执行计划全解析:15个字段深度解读与调优指南
文章目录 一、执行计划核心字段总览二、关键字段深度拆解1. type(访问类型)——查询性能的晴雨表典型场景分析: 2. key_len(索引使用长度)——索引利用率的检测仪计算示例: 3. Extra(附加信息&a…...
学习路程八 langchin核心组件 Models补充 I/O和 Redis Cache
前序 之前了解了Models,Prompt,但有些资料又把这块与输出合称为模型输入输出(Model I/O):这是与各种大语言模型进行交互的基本组件。它允许开发者管理提示(prompt),通过通用接口调…...
Everything——你的文件搜索效率革命
Everything 是一款由 voidtools 开发的文件搜索工具,专为 Windows 系统设计。它以极快的速度和高效的搜索能力著称,能够基于文件名实时定位文件和目录。以下是其主要特点和功能概述: 1. 核心特点 快速搜索:Everything 使用 NTFS…...
【一起学Rust | Tauri2.0框架】单实例应用程序的深入解析:零漏洞实现与优化实战
文章目录 前言一、 单实例应用的意义二、 实现单实例应用的方法1 Windows下的实现1.1 创建命名Mutex1.2 在Tauri应用中集成Mutex检查 2 macOS下的实现2.1 获取Bundle Identifier2.2 检查是否已经有实例在运行 3 Linux下的实现3.1 获取进程列表3.2 检查是否已经有实例在运行 4 在…...
React + TypeScript 数据血缘分析实战
React TypeScript 数据血缘分析实战 目录 技术选型与架构设计核心概念解析基础场景实现 场景一:visx库基础血缘图实现场景二:React-Lineage-DAG企业级方案场景三:动态数据源与复杂交互 TypeScript类型系统深度优化性能优化与工程化实践开源…...
解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server
当使用 MySQL 时,您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上,服务器还没有配置为接受来自相关主机的连接。 Common Caus…...
4. 示例:创建带约束的随机地址生成器(范围0x1000-0xFFFF)
文章目录 前言代码示例:运行方法:查看结果:关键功能说明:扩展功能建议: 前言 以下是一个完整的SystemVerilog测试平台示例,包含约束随机地址生成、日志输出和波形生成功能: 代码示例࿱…...
Dashboard-frps
通过浏览器查看 frp的状态以及代理统计信息展示。 注:Dashboard 尚未针对大量的 proxy 数据展示做优化,如果出现 Dashboard 访问较慢的情况,请不要启用此功能。 需要在 frps.ini中指定 dashboard服务使用的端口,即可开启此功能&…...
鸿蒙兼容Mapbox地图应用测试
鸿蒙Next已经发布一段时间了,很多之前的移动端地图应用,纷纷都要求适配鸿蒙Next。作为开发者都清楚,所谓的适配其实都是重新开发,鸿蒙的开发语言和纯前端的Javascript不同,也可以Android原始开发的语言不同。鸿蒙自带的…...
PyCharm 的使用 + PyCharm快捷键 + 切换中文界面
2025 - 02 - 27 - 第 62 篇 Author: 郑龙浩 / 仟濹 【PyCharm的使用】 文章目录 如何使用Pycharm1 新建工程,新建 .py 文件,运行2 常用快捷键3 其他快捷键 - DeepSeek 总结如下**代码编辑****导航与定位****查找与替换****运行与调试****代码重构****其…...
Ubuntu下QT安装和调试的常见问题(一)__could_not_dertermine_which_make
前言 Ubuntu下QT的安装会有一些奇怪的问题出现,并没有像Windows下Visual Studio的安装那么直接就可以使用那么方便,本文就“make”挂接的问题,给出一些小的感受。 1、问题的提出 很多问题的解答,AI无论是上文心一言,还…...
JAVA面试_进阶部分_Linux面试题
Linux概述 1. 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix 的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工 具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网 络为核心的设…...
【深度学习】强化学习(RL)-A3C(Asynchronous Advantage Actor-Critic)
A3C(Asynchronous Advantage Actor-Critic)详解 A3C(Asynchronous Advantage Actor-Critic) 是 深度强化学习(Deep Reinforcement Learning, DRL) 领域的重要算法,由 DeepMind 在 2016 年提出。…...
DeepSeek-v1到DeepSeek-v3再到DeepSeek-R1的变迁和进化史,创新点,值得大家学习,DeepSeek系列干货
DeepSeek-v1 1.高质量的数据构建:2T tokens中英文数据集(数据去重、过滤和重混); 2. 模型架构参考LlaMa; 3.数据并行、张量并行、超参数设置等: 衍生:DeepSeek-Coder、deepseek MoE、DeepSe…...
基于多层感知机(MLP)实现MNIST手写体识别
实现步骤 下载数据集处理好数据集确定好模型(初始化模型参数等等)确定优化函数(损失函数也称为目标函数)和优化方法(一般选用随机梯度下降 SDG )进行模型的训练进行模型的评估 import torch import torch…...
windows下安装pyenv+virtualenv+virtualenvwrapper
1、下载pyenv 进入git官网,打包下载zip到本地 2、解压到安装目录 解压下载好的pyenv-win-master.zip到自己的安装目录,如D:\Program Files 3、配置环境变量 右击桌面 此电脑 --> 属性 --> 高端系统设置 --> 环境变量 --> 新建系统变量…...
C# 确保程序只有一个实例运行
常规需求 C#程序只能运行一次,不能多开: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; using System.Runtime.InteropServices; using System.Security.Principal; namespace BallLocation {sta…...
MySQL 的存储引擎有哪些?它们之间有什么区别?
MySQL 支持多种存储引擎,每种存储引擎都有其独特的特性和适用场景。以下是 MySQL 中常见的存储引擎及其主要区别: 1.常见存储引擎及其特点 (1)InnoDB • 事务支持:支持完整的 ACID 特性,适用于需要事务处理的场景。 • 锁机制&…...
大语言模型的评测
大语言模型评测是评估这些模型在各种任务和场景下的性能和能力的过程。 能力 1. 基准测试(Benchmarking) GLUE(General Language Understanding Evaluation):包含多个自然语言处理任务,如文本分类、情感分…...
《从零到全栈:Vue2入门宝典》
1. Vue 简介 1.1 什么是 Vue? Vue 是一套用于构建用户界面的渐进式框架。Vue 的核心库专注于视图层,易于与其他库或现有项目集成。Vue 的目标是通过尽可能简单的 API 实现数据双向绑定和组件化开发。 1.2 什么是“渐进式”? “渐进式”意味…...
next.js-学习3
next.js-学习3 6. 设置数据库1. 传代码到github https://github.com/2. github和Vercel链接,用Vercel预览和部署3. 创建数据库4. 初始化数据库 7.读取数据1. 在/app/lib/data.ts中这两行是连接postgres的2. 在/app/dashboard/page.tsx中使用3.在/app/dashboard/page…...
Hadoop第2课(伪分布式集群的搭建)
jdk和hadoop安装包: hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下(hadoop用户的主目录) 2、解压jdk安装包到~目录 卸载jdk的命令:r…...
Linux——进程池
前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 1.实现思路 思路:通过创建匿名管道,来实现父子进程之间的通信 注1:父写,子读 注2:匿名管道只能用来进行具有血管关系的进程…...
JavaScript 简单类型与复杂类型-简单类型的内存分配
深入理解JavaScript中的简单类型(基本数据类型)和复杂类型(引用数据类型)如何在内存中存储对于编写高效、无误的代码至关重要。本文将专注于探讨简单类型的内存分配机制,即栈(Stack)内存&#x…...
深度生成模型(一)——具身智能综述与算法分类简介
具身智能对于机器人的控制可以分为端到端模型和非端到端模型: 端到端模型:具身模型(如 ACT 和 DP)将视觉感知(Vision)与动作生成(Action)整合为单一神经网络,直接实现从…...
Vue 中,使用模板(Template) 和 Render 函数编写组件的区别
在 Vue 2 中,模板(Template) 和 Render 函数 是两种不同的组件编写方式,它们各有特点和适用场景。以下是它们的核心区别和实际应用场景分析: 1. 基本区别 特性模板(Template)Render 函数语法形…...
【笔记】论文阅读方法(AI大模型)
1 为什么读论文 构建知识体系:通过Related Works快速了解该方向研究现状,追踪经典论文 紧跟前沿技术:了解领域内新技术及效果,快速借鉴到自身项目 培养科研逻辑:熟悉论文体系,了解如何创造新事物&#x…...
JWT+redis实现令牌刷新优化方案
令牌刷新优化方案的详细实现步骤: 1. 令牌服务层改造 1.1 JWT工具类增强 // JwtUtils.java 新增方法 public class JwtUtils {// 生成带动态过期时间的令牌public static String createToken(String subject, String userId, String username, long expirationMi…...
安全面试5
文章目录 sql的二次注入在linux下,现在有一个拥有大量ip地址的txt文本文档,但是里面有很多重复的,如何快速去重?在内网渗透中,通过钓鱼邮件获取到主机权限,但是发现内网拦截了tcp的出网流量,聊一…...
vim临时文件泄露
##解题思路 感觉ctfshow的题目都挺有意思的,大家可以去做做 首先题目提示vim临时文件泄露,一般在vim编辑的时候,会有个swp的中间文件生成,根据这个特性,从而可以猜测,我们可以通过访问一个swp文件路径&am…...
使用Docker将ros1自定义消息通过rosjava_bootstrap生成jar包
文章目录 预准备环境rosjava_bootstrap坏消息好消息 环境安装docker安装rosjava_bootstrap仓库rosjava_center仓库修改rosjava_bootstrap代码拉取docker镜像放置自己的自定义消息 启动docker编译 预准备环境 rosjava_bootstrap rosjava_bootstrap是将自定义的ROS消息生成java…...
本地快速搭建一套AI人脸识别技术研究学习的实验环境
如果你想在本地搭建一套学习和研究AI人脸识别技术的框架,建议使用开源工具和框架进行实验,因为它们通常提供了较为丰富的文档和社区支持,能够帮助你深入理解人脸识别的核心原理。以下是一套可行性强且综合性的方案,涵盖了人脸检测…...
SpringBoot项目连接Oracle视图报错整理
在若依框架中增加连接Oracle视图报错 工具测试连接 通过使用plsql连接数据库测试,连接成功 1. 相关配置内容 连接配置 url: jdbc:oracle:thin:192.168.0.210:1521:HIS username: portal_his password: XXXXXX driver-class-name: oracle.jdbc.driver.OracleDr…...
【我的 PWN 学习手札】House of Husk
House of Husk House of Husk是利用格式化输出函数如printf、vprintf在打印输出时,会解析格式化字符如%x、%lld从而调用不同的格式化打印方法(函数)。同时C语言还提供了注册自定义格式化字符的方法。注册自定义格式化字符串输出方法…...