rust 全栈应用框架dioxus
逛github时发现了一个号称全栈应用框架dioxus
,适用于web
/ desktop
/ mobile
。零配置、集成了热启动和基于信号的状态管理。是由rust
编写的,所以也就不受平台限制。
既然说的这么好,那就来试试构建一下三种平台的应用,构建的应用编译成web
、 desktop
、 mobile
三个平台的应用。
与其他跨平台框架对比
这里列出几个大家熟知的平台,这些差异可以dioxus
官网看到。
dioxus
的定位:
- 使用组件、属性、钩子构建UI视图,状态管理更像
Svelte
- 页面编写保持和HTML、CSS一致
- 可以任意切换适配目标平台渲染器进行渲染。
- 有很多功能库持续建设,和
dioxus
保持同步更新。
对于使用dioxus
进行开发,有以下几点有用的功能:
- 热更新
- 具有日志记录、项目模板、代码检查等交互式cli。
- 集成构建部署不同平台,包括
web
、macos
、ios
和windows
。 - 支持现代web开发方式,如SSR、混合开发、html流
- 直接访问系统API,如JNI(android) 、CoreFoundation (Apple) 、web-sys(web)
- 类型安全的应用程序路由和服务端功能。
VS Tauri
tauri
是基于web框架(如:react、vue、svelte等)的构建移动应用程序框架。
- 限制了它只能使用js或webassembly;而
dioxus
可以让你使用线程、访问文件系统等操作,无需IPC桥接。 - 限制了它只能作用于js;而
dioxus
可以提供其他能力:后台服务、打包工具、原生渲染器。 - 它们也有共享的一些库,是由
tauri
维护的
VS Leptos
leptos
是一个rust
框架,它使用webassembly
来构建web
应用程序。
- 它使用信号系统驱动响应和渲染。而
dioxus
使用信号仅驱动响应。 - 它专注web,提供了一些web平台的组件;而
dioxus
目标是全平台包括桌面、移动、web。 - 它使用类似html的语法;而
dioxus
自定义了一套自己的DSL语法。
VS Yew
yew
是一个构建单应用web
程序框架。它是dioxus
的灵感来源,而dioxus
为了支持更多的平台和功能。yew
并不满足。
VS Electron
electron
是使用js、html、css等web技术开发桌面应用程序的框架。
dioxus
使用原生的webview
渲染,它们的构建产物体积相差巨大。dioxus
还可以和主机共享系统资源。- 相比
electron
已经很成熟了,而dioxus
still quite young。
VS egui
egui
是一个跨平台的GUI库。
- 它被设计为在每一帧上重新绘制,适用于游戏或其他交互式应用。而
dioxus
只会绘制一次,然后在每一帧上修改,这也使得dioxus
可以使用web原生技术。 - 它提供了自己的样式和布局方案。而
dioxus
则可以让你使用适用于web的第三方样式库,比如tailwindcss
和material-ui
。 - 它的状态管理是基于全局单一对象的。而
dioxus
鼓励使用组件和props传递状态。
通过这些比较呢,可以初步看到dioxus
具有的优势。因为我还没有使用过svelte
,对于这种基于信号的状态管理还是比较陌生。
构建Hello world
通过以上对比,我们可以看到想要学习使用dioxus
,必须学习rust
。如果没有学习过rust
,那可能需要先去学习rust
.
还有一个最重要的区别就是dioxus
自己设计了一套DSL语法,类似html标签和css的语法,但可能在使用上还是有些不习惯。但是毕竟不破不立,想要跨平台、想要速度快,如果局限于现有某个技术,那么你也会有这个技术的瓶颈限制。
环境配置
- 本地安装
rust
http://rust-lang.org/ - 选择编辑工具,我这里选择了
vscode
,并安装了语法提示插件rust-analyzer
- 安装
cargo-binstall
,使用它直接安装dx
而无需从源码编译。 - 安装
dioxus-cli
套件,包括两个部分:dioxus
核心库和dx
命令行工具。
系统环境配置,因为我是mac,所以无需配置,其他系统请查看Platform-specific dependencies;
初始化项目
dioxus
提供了dx
命令行工具,用于创建、编译、运行、调试项目。
新创建项目可以使用dx new <project-name>
,因为我已经创建好了文件夹,所以需要初始化dx init
初始化项目时可以选择项目模板,我们选择最简单的模板第一个就行。后续的设置路由、样式都先不需要,最后完成初始化。
和rust项目比较,多了一个Dioxus.toml
用于配置dioxus
项目。默认安装了dioxus-web
、dioxus-desktop
和dioxus-mobile
,且默认平台为web。
编写我们的hello world
清空模板里的代码,输出Hello world!
在页面上.
在主入口文件main.rs
:
use dioxus::prelude::*;fn main() {dioxus::launch(App);
}#[component]
fn App() -> Element {rsx! {h1 { "Hello, world!" }}
}
我们这行dx serve
等待编译完成,第一次编译会慢一点,后续就会快很多。
我们访问web服务地址http://127.0.0.1:8080
可以看到页面输出了Hello world!
,可以继续我们的开发了 ✊
可以看到web服务已经可以访问成功了,我们编译为桌面应用,使用dx serve --platform desktop
dioxus
提供了开发桌面、移动应用,可以直接在系统上构建GUI页面展示,我们执行命令后,默认直接打开窗口。
构建移动应用ios
的app,对于移动端的开发,需要本地安装XCode
开发工具,并且需要选择下载ios
资源包。
本地rust
需要安装目标编译资源
rustup target add aarch64-apple-ios aarch64-apple-ios-sim
所有环境准备好之后,我们启动xcode
启动一个ios的模拟器。然后在dioxus
项目中执行dx serve --platform ios
,它会自动探测到模拟器并安装应用。
dioxus
核心人员都是全职在维护,感觉应该还是比较靠谱的。
目前版本最新
0.6.3
发展过程中可能存在较大更新,但是值得关注。
基础知识
开始编写应用程序的最重要的就是掌握界面设计编码,作为前端开发人员,对于html必不陌生,对于dioxus
,为了方便跨平台构建而不受已有语言的限制,自定义了一套自己的DSL语法。新的语法会带来一些陌生、不适以及潜在的问题,但也伴随无限的可能性。
组件
界面设计实现是由一个个组件组成的,组件可复用,可组合。在之前的例子中 App
就是一个组件,它是一个函数,返回一个Element
。使用rsx!{ }
宏来定义UI结构。
#[component]
fn App() -> Element {rsx! {h1 { "Hello, world!" }}
}
我们还使用了#[component]
它可以方便我们创建组件,用来简化组件接收到的数据结构定义。如果不使用,我们需要为组件定义参数结构体,并指定参数传递。
根组件
App
不能接受参数。
#[derive(Props, Clone, PartialEq)]
struct AppProps {name: String,
}fn AppHeader(props: AppProps) -> Element {rsx! {h1 { "Hello, {props.name}!" }}
}
我们定义的结构体AppProps
必须实现Props
trait,并且支持Clone
和PartialEq
trait。为了简化这一行为,方便创建组件,提供了#[component]
derive简化这一过程,无需再定义结构体;还可以帮助我们检查组件定义的正确性。
#[component]
fn AppHeader(name: String) -> Element {rsx! {h1 { "Hello, {name}!" }}
}
通过#[component]
可以方便定义组件接收的参数。定义要接收的参数,无需再手动解构。
dioxus
是声明式框架,通过定义组件状态、属性来决定组件的的行为。
rsx!{ }
通过使用rsx!{ }
宏来定义UI结构,和html
一样,我们可以使用比如div
h1~h6
img
等熟知的标签来构建页面结构。
rsx!{ }
使用rust的结构体定义元素结构,在声明标签结构时,采用的严格模式语法解析。这也在开发模式下提前暴露问题,从而避免运行时错误。
let handle_click = move |event| {info!("Button clicked!");
};rsx! {div {class:"flex flex-col gap-15px",h2 { "Welcome to {name}" }button {onclick: handle_click,"Click me",}}
}
使用变量时,直接使用{ }
包裹,rsx
会解析使用format!()
处理字符串。元素的事件绑定和react是一致的,通过on
+事件名绑定事件处理函数。事件处理函数是一个闭包函数,接收事件句柄对象
条件/循环渲染
条件渲染可以通过rust的数据类型bool
类型变量,或者Option<>
类型的值来判断。
let show_title = true;rsx! {{show_title.then(|| rsx!{ h2 { "Welcome to {name}" }})}
}
也可以通过if
语句进行判断
rsx! {if show_title {h2 { "Welcome to {name}" }}
}
对于循环渲染,可以使用迭代器.map
或者for .. in
进行渲染
rsx! {ul {{(0..3).map(|i| rsx!{ li {"index {i}"}})}}ul {for i in 0..3 {li {"index {i}"}}}
}
条件渲染和循环渲染,通常在业务中变量是动态的,比如通过点击事件更新变量值,而我们直接使用rust声明的变量值在修改时会存在所有权转移的问题,在上文中,点击事件的回调是一个闭包,想要在里面修改,并试图让视图更新,变量的所有权问题导致变得复杂。
在后面的章节 状态管理 中dioxus
提供和视图绑定的hooks帮助我们管理视图状态,比如我们通过use_signal
来控制状态,然后更新变量,从而重新渲染视图。
let mut show_title = use_signal(|| false);
let handle_click = move |event| {show_title.set(!show_title());
};rsx! {div {if show_title() {h2 { "Welcome to {name}" }}button {onclick: handle_click,"Click me",}}}
加载静态资源
dioxus
提供了assets!()
来加载静态资源,比如如图片、css、js、json等。
在目录assets
下定义css样式文件style.css
,并导入到main.rs
中。
static STYLE_CSS: Asset = asset!("/assets/css/style.css");
样式导入后需要将它和组件绑定在一起,通过document::Stylesheet {}
引入,和html的link标签作用是一样的。
rsx! {document::Stylesheet {href:STYLE_CSS}// ...
}
加载图片也是同样的使用asset!
,让后绑定到元素的属性上。
rsx! {img { src:BG_IMAGE, width:300,height:150}
}
通过/
访问项目的根目录,不能直接将资源路径赋值给标签属性,这样无法加载到资源。
通过asset!
加载资源还做了一些优化措施,我们也可以通过第二个参数设置来优化资源,比如通过将png
转换为avif
.
static BG_IMAGE: Asset = asset!("/assets/imgs/dioxus.png",ImageAssetOptions::new().with_avif()
);
可以看到本来500多kb的png图片转换为avif后只有不到100kb了,提升了的图片的加载速度。
状态管理
在rust
中有所有权的概念,我们创建一个变量,在一个地方使用后,再在另一个地方使用会报错所有权被转移的错误。为了在其他地方使用我们可以借用变量,只使用它的值;或者调用.clone()
来创建一个变量的副本。
dioxus
提供了一个hookuse_hook
函数处理这种情况,在每一次使用时,都会返回.clone()
的值。
let name = use_hook(|| "hboot");
use_hook
接受一个闭包函数,用于初始化渲染时创建变量。它不是响应式的,只能用来共享变量值,如果需要响应式变量,则需要使用use_signal
。
use_signal
的设计来源于Svelte
,dioxus
的组件和react
的组件一样,响应式数据发生变更时,就会重新渲染组件。创建的响应式变量可以通过.set()
方法来更新值,
#[component]
fn AppFooter() -> Element {let mut count = use_signal(|| 0);rsx! {button {onclick: move |_| count+=1,"Clicked {count} times"}}
}
对于响应式数据,我们经常会遇到的父子组件共享数据,我们可以将use_signal
创建的变量传递给子组件,而对于需要共享更多的组件,跨更深的层级,一直传递不好维护。
dioxus
提供两种方式共享数据:Context
和GlobalSignal
Context
局限于有上下级关系的组件,它提供了一个共享的上下文数据。通过use_context_provider
创建数据对象,在子孙组件中通过使用use_context
来获取消费数据。
我们在App
组件中,创建一个Context
对象,并在后续组件中使用。
#[component]
fn App() -> Element {use_context_provider(|| "Dioxus-app");rsx! {AppFooter {}}
}
我们提供了一个类型&str
的变量值,在AppFooter
来获取消费。可以看到我们在获取变量时只定了类型&str
,这里是必须的,它帮助在上文环境中找到对应的Context
,如果定义了的类型找不到,则会报错。
#[component]
fn AppFooter() -> Element {let app_name: &str = use_context();rsx! {footer {class:"bg-red-100 flex flex-col gap-15px",h2 { "Footer {app_name}" }}}
}
可以配合use_signal
创建响应式变量,当变量发生更新时,所有依赖的组件都会重新渲染。
let app_name = use_signal(|| "Dioxus-app");
use_context_provider(|| app_name);
在获取消费时,它的类型变成了Signal<&str>
。
GlobalSignal
是一个全局共享的信号,它允许多个组件共享一个变量,并且当变量发生变化时,所有依赖它的组件都会重新渲染。通过Signal::global
创建一个全局响应式变量,可以通过.write()
方法来更新变量的值。
static APP_NAME: GlobalSignal<&str> = Signal::global(|| "Dioxus-app");
在更新变量时,通过.write()
获取可变引用,然后*
解引用指向值存储地址修改值。
*APP_NAME.write() = "Rust";
除了这些本地同步执行的变量初始化,还有异步请求获取的数据,因为是异步的,它会在一段时间后初始化完毕,需要我们记录状态,dioxus
提供了use_resource
函数来帮助我们管理异步数据状态,它提供了开始、暂停、停止等方法来控制。
use_resource(|| async move {// 异步请求
});
Hooks
dioxus
借鉴了react的hooks概念,提供了一些Hook
,用于管理组件状态。在上一章节中使用了几个常用的hook
,当然还有一些hook
供我们使用
Hook
使用规则
dioxus
的Hook
使用规则同react
的hooks限制,只能在组件body中使用,不能在函数或其它语句块中使用。约定俗成使用use_
自定义hook。
- 不能在条件语句中使用
- 不能循环语句中使用
- 不能在闭包中使用
响应式变量不能直接在组件体内修改,可以在副作用hook中修改,比如use_effect
,它会在组件初始渲染时执行一次;且会收集其中使用到的响应式变量,当变量发生变化时,组件重新渲染,也会再次执行它。
let mut count = use_signal(|| 0);// 不要直接修改
count+=1;// 在副作用hook中修改
use_effect(move || {count+=1;
})
use_hook
use_hook
不是一个响应式声明变量的hook,它提供创建一个值,以便我们可以在组件内部使用它。解决了rust
变量的所有权限制。
let count = use_hook(|| 0);
use_signal
use_signal
是一个响应式声明变量的hook,组件会跟踪值的变化,当值变化时,组件会重新渲染。
let mut count = use_signal(||0);use_effect(move || {count+=1;
})
当声明了一个Signal
变量后,提供一些方法在不同的情况下来操作这个变量。
// 获取到变量的一个克隆值
let value:i32 = count();// 获取变量值的引用
let value:&i32 = &count.read();// 设置变量的值
count.set(10);// 获取内部值的一个可变引用,然后解引用并修改值
let value:&mut i32 = &mut count.write();
*value = 10;
use_effect
use_effect
是一个副作用可执行的hook函数,在组件初始渲染时执行一次;并且会收集在其内部使用到的响应式变量,当它们发生变化时,组件重新渲染,也会再次执行它。
use_resource
use_resource
是一个执行异步任务的hook函数。
use_memo
use_memo
是一个存储缓存值的hook,由其它变量计算一个可被跟踪的计算值。依赖的响应式变量发生更改时,计算一个新值,判断是否和之前的值相同。
let dobule_count = use_memo(move || count*2);
更新值和旧值相同时,则不会更新组件。
use_reactive
use_reactive
可以将一个原始数据值转为响应式变量,并跟踪原始值的变化。
可用于父子组件传递数据时,父组件传递了一个响应式变量的值引用,子组件通过use_memo
使用了未被跟踪的值,即使值发生变化,use_memo
的值也不会更新。
#[component]
fn Child(count: i32) -> Element {let double_count = use_memo(move || count * 2);rsx! {div {"Count: {double_count}"}}
}
为了处理这种情况,通过use_reactive
转换为可跟踪的响应式变量。
#[component]
fn Child(count: i32) -> Element {let double_count = use_memo(use_reactive(&count, |val| val * 2));rsx! {div {"Count: {double_count}"}}
}
提供了一个use_reactive!
简化书写依赖,可从闭包函数中获取需要依赖跟踪的值。依赖多个变量时,可使用元组()
传递。
#[component]
fn Child(count: i32) -> Element {// let double_count = use_memo(use_reactive(&count, |val| val * 2));let double_count = use_memo(use_reactive!(|count| count * 2));rsx! {div {"Count: {double_count}"}}
}
use_context_provider
use_context_provider
是一个用于创建一个上下文数据的hook,它允许在组件树中传递数据。子孙组件可以通过use_context
进行消费。
最关键的是变量的数据类型,它是根据类型推导出需要获取上下文的哪个变量数据。
use_drop
use_drop
是一个用于清理资源的hook,在组件销毁时执行清理操作。组件默认会清理hooks、副作用函数,也可以自定义清理操作。
use_drop
可以在服务端渲染时被调用。
还提供其它很多不同地hooks
但由于dioxus
仍在设计中,未来不确定性会被移除。
引用
-
dioxus
-
dioxus-doc
相关文章:
rust 全栈应用框架dioxus
逛github时发现了一个号称全栈应用框架dioxus,适用于web / desktop / mobile。零配置、集成了热启动和基于信号的状态管理。是由rust编写的,所以也就不受平台限制。 既然说的这么好,那就来试试构建一下三种平台的应用,构建的应用编译成web 、…...
电子电器框架 --- 数据连接性和云集成在增强电气/电子架构方面的作用
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
Nvidia 可能会发布具有增强内存配置的 RTX 5080 和 5070 Super
距离英伟达正式发布RTX 50系列显卡仅过去数月,有关"Super"系列升级版显卡的传闻已甚嚣尘上。据硬件爆料平台Chiphell论坛(该消息源可靠性参差不齐)用户透露,英伟达可能正在研发配备24GB显存的RTX 5080 Super和16GB显存的…...
预留库存的实现
1. 实体类 import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data;import java.sql.Timestamp;Data TableName("products") public class Product {private Long id;private String name;private int stock; }Data TableName("shopping_c…...
[逆向工程]如何理解小端序?逆向工程中的字节序陷阱与实战解析
[逆向工程]如何理解小端序?逆向工程中的字节序陷阱与实战解析 关键词:逆向工程、小端序、字节序、二进制分析、数据解析 引言:为什么字节序是逆向工程师的必修课? 在逆向工程中,分析二进制数据是最基础的任务之一。…...
【Python笔记 05】 if判断、比较运算符与逻辑运算符
一、if判断 1、基本格式 if 要判断的条件: #条件成立为true条件成立的时候要做的事情注:注意判断条件后面的冒号,以及条件成立要做的事情此行代码的缩进,最好是软件自动缩进。 2、练习题 用户在控制台输入成绩,…...
AI应用实战:Excel表的操作工具
有个小需求是这样的,需要在一份数据表里,将1000多个客户的月报数据分别单独截图存档,有客户需要的时候就要发给客户,截图下来的也是以客户为命名,这样查找时也比较容易匹配上。 在没有写工具之前,以往财务…...
P1903 [国家集训队] 数颜色 / 维护队列 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分两种: modify ( i , x ) \operatorname{modify}(i,x) modify(i,x):执行 a i ← x a_i\gets x ai←x. query ( …...
Transformer数学推导——Q33 分析正弦编码的频率衰减对长程依赖建模的影响
该问题归类到Transformer架构问题集——位置编码——绝对位置编码。请参考LLM数学推导——Transformer架构问题集。 1. 背景知识:Transformer 与长程依赖 在自然语言处理和其他序列数据处理任务中,Transformer 模型凭借其强大的性能脱颖而出。与传统的…...
微服务架构下的熔断与降级:原理、实践与主流框架深度解析
微服务架构下的熔断与降级:原理、实践与主流框架深度解析 在现代分布式系统中,熔断 (Circuit Breaker) 和 降级 (Degrade) 是保障系统弹性与高可用性的核心机制。本文将系统解析两者的原理、区别与协同方式,并结合主流框架 (Resilience4j、S…...
大脑、机器人与贝叶斯信念及AI推理
在机器不再局限于重复性任务的世界里,机器人技术已经大胆地迈入了感知、学习和决策的领域。这篇文章探讨了智能机器人系统是如何构建的——从理解它们嘈杂的传感器和不确定的环境,到使它们能够做出明智的选择并随着时间的推移调整自己的行为。 AI推理 …...
stm32wb55rg (4) 启用usart串口
code repo: 访问gitee 上节课成功点亮了LED,这次来把usart 用起来,毕竟有交互才是系统。 技术准备 首先查看手册,发现mcu有1个usart和1个 lpuart。 usart 的使用需要两个pin,一个接收一个发送。继续查看pin and ball definition…...
LSTM预测模型
LSTM预测模型 时间序列预测通常需要捕获时间依赖性,而 L S T M LSTM LSTM(长短时记忆网络)是处理时间序列数据的经典深度学习方法之一。结合长短时注意力机制( L o n g − S h o r t A t t e n t i o n M e c h a n i s m Long-S…...
[计算机网络]物理层
文章目录 物理层的概述与功能传输介质双绞线:分类:应用领域: 同轴电缆:分类: 光纤:分类: 无线传输介质:无线电波微波:红外线:激光: 物理层设备中继器:放大器:集线器(Hub):…...
Day16(贪心算法)——LeetCode45.跳跃游戏II763.划分字母区间
1 LeetCode45.跳跃游戏II 1.1 题目描述 与跳跃游戏类似,跳跃游戏II给定长为n的从0开始索引的整数数组nums,nums[i]是你在i处能向右跳跃的最大步数,求到达数组最后一个索引处需要跳跃的最少次数。 一个示例:nums[2,3,1,1,4]&a…...
【MySQL】表的内外连接
表的内外连接 一. 内连接二. 外连接1. 左外连接2. 右外连接 三. 简单案例四. SQL 实战 表的连接分为内连接和外连接 一. 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,之前博客中的查询都是内连接,也是在开发过程中使用的最多…...
Prometheus使用Recoding Rules优化性能
通过PromQL可以实时对Prometheus中采集到的样本数据进行查询,聚合以及其它各种运算操作。而在某些PromQL较为复杂且计算量较大时,直接使用PromQL可能会导致Prometheus响应超时的情况。这时需要一种能够类似于后台批处理的机制能够在后台完成这些复杂运算…...
Linux 怎么安装 Oracle Java 8
在 Linux 系统上安装 Oracle Java 8 的步骤如下: 1. 下载 Oracle Java 8 访问 Oracle 官方网站的 Java 下载页面: 下载链接:Oracle Java 8 下载页面选择适合 Linux x64 的安装包(通常是 .tar.gz 格式)。需要登录 Or…...
项目三 - 任务2:创建笔记本电脑类(一爹多叔)
在本次实战中,我们通过Java的单根继承和多接口实现特性,设计了一个笔记本电脑类。首先创建了Computer抽象类,提供计算的抽象方法,模拟电脑的基本功能。接着定义了NetCard和USB两个接口,分别包含连接网络和USB设备的抽象…...
基于蓝耘MaaS平台进行api调用创建本地智能ai
关于MaaS平台 MaaS 平台即 “模型即服务”(Model as a Service)平台,是一种依托云计算的人工智能服务模式。 模型即服务(MaaS)平台面向企业开发者、创业者及非技术背景用户,提供开箱即用的热门AI模型服务&…...
【Luogu】动态规划七
P1566 加等式 - 洛谷 思路: 其实这道题就是一个纸老虎,说这么多,其实最后就是问所有 a[i] 的组成方法之和有多少种 那么显然的一个dp就是 dp[j] dp[j - a[i]] 然后这题就结束了,就是这么简单,最后记得减去 n&…...
Kotlin 常见问题
以下从基础、中级、高级三个难度等级为你提供 Kotlin 面试题及参考答案: 基础难度 1. Kotlin 中 val 和 var 的区别是什么? 答案要点:val 用于声明不可变变量,类似于 Java 中的 final 变量,一旦赋值后就不能再重新赋…...
应急演练考试排查-DC01
DC01:攻击者最早通过哪种方式获取了机器权限?( ) A、远程登录(RDP登录) B、主机系统漏洞 C、软件服务漏洞 D、钓鱼 E、物理访问 F、内网横向手段 G、低权限账户提权 H、未获取到主机权限 DC01&…...
Spring MVC 中解决中文乱码问题
在 Spring MVC 中解决中文乱码问题,需要从 请求参数编码 和 响应内容编码 两方面入手。以下是完整的解决方案: 一、解决请求参数中文乱码 1. POST 请求编码(表单提交) 配置 CharacterEncodingFilter 在 web.xml 中添加 Spring 提…...
排序算法详解笔记(二)
归并排序 #include <vector> #include <iostream> #include <algorithm> // For std::inplace_merge in optimization// Helper function to merge two sorted subarrays void merge(std::vector<int>& arr, int left, int mid, int right) {int …...
Spark GraphX 机器学习:图计算
引言 在数字化时代,图数据(Graph Data)的价值日益凸显:社交网络中的用户关系、电商平台的商品关联、知识图谱的实体链接……这些以“节点(Vertex)”和“边(Edge)”为核心的非结构化…...
claude 3.7,极为均衡的“全能型战士”大模型,国内直接使用
文章目录 零、前言一、操作指南操作指导 二、小球弹跳三、生成 Mandelbrot set 集四、文本总结能力五、智力推理题六、感受 零、前言 Claude 3.7 Sonnet(下面简称 Claude 3.7)由 Anthropic 发布,“全球首个混合推理模型”的 AI 大模型&#x…...
机器学习-入门-决策树(1)
机器学习-入门-决策树(1) 4.1决策树的基本流程 决策树基于“树”结构进行决策 每个“内部结点”对应于某个属性上的“测试”(test)每个分支对应于该测试的一种可能结果(即该属性的某个取值)每个“叶结点”对应于一个“预测结果” 学习过程࿱…...
机器学习实操 第一部分 机器学习基础 第6章 决策树
机器学习实操 第一部分 机器学习基础 第6章 决策树 内容概要 第6章深入介绍了决策树,这是一种功能强大的机器学习算法,能够处理分类、回归以及多输出任务。决策树通过递归地分割数据集来构建模型,具有易于解释和可视化的特点。本章详细讲解…...
Python实例题:ebay在线拍卖数据分析
目录 Python实例题 题目 实现思路 代码实现 代码解释 read_auction_data 函数: clean_auction_data 函数: exploratory_analysis 函数: visualize_auction_data 函数: 主程序: 运行思路 注意事项 Python实…...
算法题(137):丢手绢
审题: 本题需要我们找到距离最远的两个孩子之间的距离,并打印 思路: 方法一:暴力枚举 我们可以找到每个孩子的距离其他孩子的最远距离,然后维护一个maxdis变量得到所有孩子距离其他孩子最远距离的最大值。 而距离分为顺…...
2025年具身智能科技研报
引言 本报告系统梳理了2025年具身智能领域的最新进展,基于国内外权威新闻源与行业研究报告,通过数据可视化与深度分析相结合的方式,呈现该领域多维发展态势。从技术突破层面看,多模态大模型的突破性进展为具身智能注入新动能&…...
TCL科技2025一季度归母净利润10.1亿,半导体显示业务业绩创新高
4月29日,TCL科技(000100)披露2024年年报及2025年一季报。2024全年,TCL科技实现营业收入1648亿元,归母净利润15.6亿元;实现经营现金流净额295亿元,同比增长16.6%。2025年一季度,TCL科…...
阿里云 CentOS YUM 源配置指南
阿里云 CentOS YUM 源配置指南 在使用 CentOS 7 时,由于 CentOS 官方源停止维护等原因,yum install 命令可能会报错 “Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64”。以下是通过更换阿里云源解决该问题的详细步骤。 一、备份原有配…...
阿里云 OpenManus 实战:高效AI协作体系
阿里云 OpenManus 实战:高效AI协作体系 写在最前面初体验:快速部署,开箱即用 真实案例分享:从单体开发到智能良好提示词过程展示第一步:为亚马逊美国站生成商品描述第二步:为eBay全球站生成商品描述结果分析…...
阿里云服务迁移实战: 05-OSS迁移
概述 Bucket 复制分为两种,同区域复制和跨区域复制 同账号复制比较简单,根据提示填写信息即可,本文主要介绍跨账号复制。 同区域复制 授权角色选择 “AliyunOSSRole”, 创建方法见 “跨区域复制”。然后点击确定即可。 跨区域复制 假设我…...
Vue高级特性实战:自定义指令、插槽与路由全解析
一、自定义指令 1.如何自定义指令 ⑴.全局注册语法 通过 Vue.directive 方法注册,语法格式为: Vue.directive(指令名, {// 钩子函数,元素插入父节点时触发(仅保证父节点存在,不一定已插入文档)inserted(…...
Python入门:流程控制练习
本文将介绍Python中流程控制的基础知识,包括条件判断和循环结构,并提供多个实用示例帮助初学者快速掌握这些概念。所有代码都使用基础语法,非常适合Python新手学习。 1. 简单条件判断: 编写一个程序,要求用户输入一个…...
Unity PBR基础知识
PBR原理 基于物理的渲染(Physically Based Rendering,PBR)是指使用基于物理原理和微平面理论建模的着色/光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 PBR基础理念 微平面理论(Micr…...
智慧交警系统架构设计方案
一、引言:智慧交警为何成为城市治理的刚需? 当前,中国城市化进程加速,汽车保有量激增,交通拥堵、事故频发、执法效率不足等问题日益突出。传统交通管理依赖人力巡查与分散系统,已难以应对复杂需求。智慧交…...
NOC科普一
拓扑结构 NoC里Router之间的link链路连接可以定义成不同的结构以改变通信测量和简化片上通信结构。 (a)Ring:环形,每个router都有2个相邻节点,虽然部署和故障排除相对容易,但主要缺点是其通信的距离也即环…...
Linux CentOS 7 安装Apache 部署html页面
*、使用yum包管理器安装Apache。运行以下命令: sudo yum install httpd *、启动Apache服务 sudo systemctl start httpd *、设置Apache服务开机自启 sudo systemctl enable httpd *、验证Apache是否运行 sudo systemctl status httpd 或者,通过浏…...
人工智能在医疗行业的应用和发展前景
人工智能在医疗行业的应用和发展前景 引言 在科技日新月异的今天,人工智能(Artificial Intelligence,AI)已然成为全球最具潜力与影响力的技术之一。医疗行业,作为关乎人类健康与生命的关键领域,正迅速成为人工智能应用的热门阵地。人工智能在医疗领域的应用,不仅为解决…...
vue3+Nest.js项目 部署阿里云
可以先参考之前的vue3express部署的文章 vue3viteexpressmongoDB上线(新手向)_vue3 vite express-CSDN博客 区别在于express和数据库 前端前往上面文章查看 1.nest.js部署 首先,把nest.js中相关的文件打包 除去依赖(node_modules)上传到服…...
phpstudy修改Apache端口号
1. 修改Listen.conf文件 本地phpstudy安装目录: 2.其他问题 ① 修改httpd.conf不起作用 ② 直接通过控制面板配置好像有延迟缓存...
JSON-RPC 2.0 规范中文版——无状态轻量级远程过程调用协议
前言 JSON-RPC是一种简单、轻量且无状态的远程过程调用(RPC)协议,它允许不同系统通过标准化的数据格式进行通信。自2010年由JSON-RPC工作组发布以来,已成为众多应用中实现远程交互的基础协议之一。本规范主要表达了JSON-RPC 2.0版…...
DeepSeek+Dify之七借助API和Trae完成demo
DeepSeek+Dify之六通过API调用工作流 文章目录 背景准备资料1、借助Trae来创建demo2、前后端主要代码3、测试demo4、完整项目背景 在软件开发与项目实践领域,常常需要借助各种工具与技术来快速搭建可运行的示例项目,以验证思路、展示功能或进行技术探索。本文聚焦于借助 Tra…...
C++ 红黑树
上一节我介绍了二叉搜索树家族的AVL树,这里我们来介绍二叉搜索树家族的另一个成员,也是使用最广泛的成员。 1.AVL树与红黑树的区别 平衡性质 AVL 树:是严格的平衡二叉树,要求任意节点的左右子树高度差的绝对值不超过 1ÿ…...
学习海康VisionMaster之线圆测量
一:进一步学习了 今天学习下VisionMaster中的线圆测量:核心就是坐标点到直线的距离量测 1:什么是线圆测量? 工业自动化中很常见的应用尺寸测量,需要量测一个零件的外形尺寸,其中一项如果是需要测量圆心到直…...
Uniapp:置顶
目录 一、出现场景二、效果展示三、具体使用一、出现场景 在项目的开发过程中,我们经常会用到置顶的功能,比如说从页面的最下方滑动到最上面太慢了,这个时候我们就可以使用置顶功能。 二、效果展示 三、具体使用 参数名类型必填说明scrollTopNumber否滚动到页面的目标位置…...