2311rust到27版本更新
1.23
从Rust1.0
开始,有叫AsciiExt
的特征
来提供u8,char,[u8]
和str
上的ASCII
相关功能.要使用它,需要如下编写
代码:
use std::ascii::AsciiExt;
let ascii = 'a';
let non_ascii = ' ';
let int_ascii = 97;
assert!(ascii.is_ascii());
assert!(!non_ascii.is_ascii());
assert!(int_ascii.is_ascii());
在Rust1.23
中,现在直接在这些类上定义这些方法
,因此不再需要导入trait
.
#[allow(unused_imports)]
use std::ascii::AsciiExt;
//也可继续以前导入.
来抑制
相关警告.
此外,新API
:
现在从非原子类型实现
各种std::sync::atomic
类型.如,
let x = AtomicBool::from(true);
()
现在实现了FromIterator<()>
;
RwLock<T>
已取消
发送限制
货物特点
1,Cargo Check
现在可检查你的单元测试
.
2,cargo uninstall
现在可在一个命令
中卸载
多个包.
1.24
rustup component add rustfmt-preview
//格式组件.
有两点:首先,在此使用的是
rustup component add
//而不是
cargo install
如果以前通过cargo install
使用过rustfmt
,应该先卸载
它.
其次,这是一个预览.
增量编译
从Rust1.24
开始,默认增量编译
.
要在Cargo.toml
中设置codegen-units
为1(或16)
,以提升每一滴性能.
未定义行为.Rust
一般努力减少未定义行为,在安全代码中没有未定义行为,在不安全代码中尽量少.
跨越FFI
边界,恐慌(panic)!
时,可调用UB
.即:
extern "C" fn panic_in_ffi() {panic!("Test");
}
在Rust1.24
中,代码
现在中止
,而不是ub
.
str::find
,在&str
中查找给定的符:它现在快了10
倍!这要归功于memchr
.[u8]::contains
也用它.
此外,还稳定了一些新API
:
RefCell::replace
RefCell::swap
std::sync::atomic::spin_loop_hint
最后,现在可在常量式
中使用这些函数
,如,初化静
:
1,Cell,RefCell
和UnsafeCell
的新功能
2,各种原子
整数类型的新函数
3,{integer}::min_value
和max_value
4,MEM
的size_of
和align_of
5,ptr::null
和null_mut
1.24.1
稳定版
更改细节:
1,通过FFI
展开时不会中止(恢复1.24.0
中添加的行为)
2,在窗口
上为链接器
参数发出UTF-16
文件
3,使错误索引
生成器再次工作
4,如果要更新,Cargo
在窗口7
上发出警告.
rlua
的异常.
深入
挖掘后,发现了原因:setjmp/longjmp
.由C标准库提供这些函数
来处理错误.先调用setjmp
,然后稍后再调用longjmp
.
这样,控制流
返回到之前调用setjmp
的位置.它一般用来实现异常
,甚至协程.Lua
的实现使用setjmp/longjmp
来实现异常:
与C++
或Java
不同,C
语言不提供异常
处理机制.为了改善,Lua
使用了C语言中的setjmp
工具,这导致了类似异常处理
的机制.
如果用C++
编译Lua
,则更改代码
来使用真正的异常并不困难.
所以,问题变成了:为什么会在窗口
上破裂
窗口
有个叫"结构化异常处理
"(SEH
)的概念.窗口
使用SEH
来实现setjmp/longjmp
,因为SEH
的整个思想
是有统一的错误处理.
类似,C++
异常使用SEH
,Rust
恐慌也是.
看看rlua
的工作原理.rlua
有个protect_lua_call
内部函数,来调用Lua
.它像这样使用
:
protect_lua_call(self.state, 0, 1, |state| {ffi::lua_newtable(state);
}) ;
即,protect_lua_call
需要一些包含闭包
的参数.把此闭包
传递给lua_pcall
,它再抓传递
给它的代码(该闭包
)可能抛的longjmp
.
即,代码
现在像如下伪码
:
protect_lua_call(self.state, 0, 1, |state| {let result = panic::catch_unwind(|| {ffi::lua_newtable(state);});if result.is_err() {process::abort();}
}) ;
之前,在讨论setjmp/longjmp
时,说过在Rust
代码中的问题是,它不处理Rust
析构器.因此,在除窗口
之外的所有平台上,上述catch_unwind
恶作剧都被有效地忽略了,因此一切正常.
但是,在窗口
上,因为setjmp/longjmp
和Rust
的panic
都使用SEH
,因此抓住了longjmp
,并运行
新的中止
代码!
1.25.0
稳定版
已从LLVM4
升级到了LLVM6
.
嵌套
导入组.
use std::fs::File;
use std::io::Read;
use std::path::{Path, PathBuf};
现在可这样写:
//在一行上
use std::{fs::File, io::Read, path::{Path, PathBuf}};
//更多空间
use std::{fs::File,io::Read,path::{Path,PathBuf}
};
接受允许设置
结构对齐方式属性
的如下对齐:
#[repr(align(x))]
示例:
struct Number(i32);
assert_eq!(std::mem::align_of::<Number>(), 4);
assert_eq!(std::mem::size_of::<Number>(), 4);
#[repr(align(16))]
struct Align16(i32);
assert_eq!(std::mem::align_of::<Align16>(), 16);
assert_eq!(std::mem::size_of::<Align16>(), 16);
1,std::ptr::NonNull<T>
.此类型类似*mut T
,但为非null
且协变.NonNull<T>
保证它不会为null
,即Option<NonNull<T>>
的大小与*mut T
相同.
如果要用不安全
代码构建
数据结构,NonNull<T>
适合你!
2,libcore
获得了,包含以前仅在libstd
中可用的Duration
类型的time
模块.
此外,与Duration
关联的from_secs
和from_millis
函数都变成了常量函数
,允许按常量式创建Duration
.
3,:cargo new
现在默认生成二进制文件
,而不是库
.可用--lib/--bin
来设置.
1.26.0
稳定版
impl
特征
impl Trait
来了!提供了叫"存在类型"
的功能.核心想法是:
fn foo() -> impl Trait {//...
}
此类型签名
,表示"foo
是一个无参
但返回实现Trait
特征的类型"的函数.也即,不会告诉你foo
的具体返回类型
,只告诉你它实现了指定特征
.
与特征对象
有何不同?
fn foo() -> Box<Trait> {//...
}
假设有个针对i32
和f32
实现的Trait
特征:
trait Trait {fn method(&self);
}
impl Trait for i32 {//实现在此
}
impl Trait for f32 {//实现在此
}
考虑以下函数:
fn foo() -> ? {5
}
如何填充
返回类型.以前,只能用特征对象
:
fn foo() -> Box<Trait> {Box::new(5) as Box<Trait>
}
但这引入了要分配
的Box
.在此也没有
返回动态数据
,所以也会影响特征
对象的动态调度
.因此,从Rust1.26
开始,可这样写:
fn foo() -> impl Trait {5
}
这不会创建
,特征
对象,与写了-> i32
一样,但,只提及Traits
部分.从而得到静态调度
,但隐藏
了真实类型.
闭包
中有用.Rust
中闭包
都有个唯一
的,不可写的但实现了Fn
特征的类型
.即,如果函数
返回闭包
,可如下:
//以前
fn foo() -> Box<Fn(i32) -> i32> {Box::new(|x| x + 1)
}
//后
fn foo() -> impl Fn(i32) -> i32 {|x| x + 1
}
没有装箱(Box)
,没有动态调度
.返回
迭代器类似.迭代器不仅一般甚至包含嵌套闭包
.如:
fn foo() {vec![1, 2, 3].into_iter().map(|x| x + 1).filter(|x| x % 2 == 0)
}
编译时,报错:
error[E0308]: mismatched types--> src/main.rs:5:5|
5 | / vec![1, 2, 3]
6 | | .into_iter()
7 | | .map(|x| x + 1)
8 | | .filter(|x| x % 2 == 0)| |_______________________________^ expected (), found struct `std::iter::Filter`|= note: expected type `()`found type `std::iter::Filter<std::iter::Map<std::vec::IntoIter<{integer}>, [closure@src/main.rs:7:14: 7:23]>, [closure@src/main.rs:8:17: 8:31]>`
以前,必须在此
使用特征对象
,但现在可简单
这样:
fn foo() -> impl Iterator<Item = i32> {vec![1, 2, 3].into_iter().map(|x| x + 1).filter(|x| x % 2 == 0)
}
并完成
它.同未来
工作类似.
注意,有时仍需要特征对象
.仅当函数
返回单个类型
时,才能使用impl Trait
;如果要返回
多个,则需要动态调度.如:
fn foo(x: i32) -> Box<Iterator<Item = i32>> {let iter = vec![1, 2, 3].into_iter().map(|x| x + 1);if x % 2 == 0 {Box::new(iter.filter(|x| x % 2 == 0))} else {Box::new(iter)}
}
为了使语法
更对称,也可在参数位置
使用impl Traits
:
//以前
fn foo<T: Trait>(x: T) {
//以后
fn foo(x: impl Trait) {
更好的匹配绑定
你是否曾经引用过Option
,并试使用match
?如,如下代码
:
fn hello(arg: &Option<String>) {match arg {Some(name) => println!("Hello {}!", name),None => println!("你是谁?"),}
}
如果试在Rust1.25
中编译它,会得到错误:
error[E0658]: non-reference pattern used to match a reference (see issue #42640)--> src/main.rs:6:9|
6 | Some(name) => println!("Hello {}!", name),| ^^^^^^^^^^ help: consider using a reference: `&Some(name)`
error[E0658]: non-reference pattern used to match a reference (see issue #42640)--> src/main.rs:7:9|
7 | None => println!("I don't know who you are."),| ^^^^ help: consider using a reference: `&None`
好的,当然.修改代码:
fn hello(arg: &Option<String>) {match arg {&Some(name) => println!("Hello {}!", name),&None => println!("你是谁?"),}
}
添加了编译器抱怨的&s
.再次试编译:
错误`[E0507]`:无法移出借用的内容--> src/main.rs:6:9|
6 | &Some(name) => println!("Hello {}!", name),| ^^^^^^----^| | || | hint: to prevent move, use `ref name` or `ref mut name`|无法移出借用的内容
好的如下:
fn hello(arg: &Option<String>) {match arg {&Some(ref name) => println!("Hello {}!", name),&None => println!("你是谁?"),}
}
不得不添加两个&s
和一个ref
.
从Rust1.26
开始,没有&s
和ref
的初始代码
,完全按你的期望编译
和执行
.总之,在match
语句中自动引用或解引用
.所以
match arg {Some(name) => println!("Hello {}!", name),
编译器会自动引用Some
,且因为借用了name
,因此name
也自动绑定为ref name
.如果修改为:
fn hello(arg: &mut Option<String>) {match arg {Some(name) => name.push_str(", world"),None => (),}
}
编译器自动按可变引用
借用,且name
也按ref mut
绑定.
main
也可返回结果
use std::fs::File;
fn main() {let f = File::open("bar.txt")?;
}
导致了如下编写代码:
fn run(config: Config) -> Result<(), Box<Error>> {//...
}
fn main() {//...if let Err(e) = run(config) {println!("Application error: {}", e);process::exit(1);}
}
在Rust1.26
中,现在可声明返回Result
的main
:
use std::fs::File;
fn main() -> Result<(), std::io::Error> {let f = File::open("bar.txt") ;Ok(())
}
现在正常工作
!如果main
返回错误,则退出
并显示错误码,并打印出
错误的调试表示.
包含…=
可如下使用..
:
for i in 1..3 {println!("i: {}", i);
}
这打印i:1,
然后打印i:2
.在Rust1.26
中,你现在可如下创建包含区间
:
for i in 1..=3 {println!("i: {}", i);
}
这打印如前i:1
,然后打印i:2
,但也打印i:3
.
fn takes_u8(x: u8) {//...
}
fn main() {for i in 0..256 {println!("i: {}", i);takes_u8(i);}
}
编译时
收到提示:
警告:U8
文本出域
--> src/main.rs:6:17|
6 | for i in 0..256 {| ^^^|= note: #[warn(overflowing_literals)] on by default
但是,可用包含区间
来完成:
fn takes_u8(x: u8) {//...
}
fn main() {for i in 0..=255 {println!("i: {}", i);takes_u8(i);}
}
产生你可能期望的256
行输出.
基本切片模式
允许在切片
上匹配.如:
let arr = [1, 2, 3];
match arr {[1, _, _] => "starts with one",[a, b, c] => "starts with something else",
}
在本例中,知道arr
的长度为3
,因此需要在[]
中加入3个项.不知道长度
时,也可匹配
:
fn foo(s: &[u8]) {match s {[a, b] => (),[a, b, c] => (),_ => (),}
}
128
位整数,Rust
现在有128
位整数!
let x: i128 = 0;
let y: u128 = 0;
大小是u64
的两倍,因此可容纳更多值
.即,
u128: 0 - 340,282,366,920,938,463,463,374,607,431,768,211,455
i128: 170,141,183,460,469,231,731,687,303,715,884,105,728 - 170,141,183,460,469,231,731,687,303,715,884,105,727
库稳定
稳定了比File::open
和io::Read::read_to_string
更方便的fs::read_to_string
,它可轻松地一次读取整个文件
到内存
中:
use std::fs;
use std::net::SocketAddr;
let foo: SocketAddr = fs::read_to_string("address.txt")?.parse()?;
现在,你可用Debug
格式将数字格式化为十六进制:
assert!(format!("{:02x?}", b"Foo\0") == "[46, 6f, 6f, 00]")
标准库中的所有宏
现在都支持尾随逗号
.
1.26.2
稳定版
漏洞:允许同时对路径
有两个可变
借用.
let mut foo = Some("foo".to_string());
let bar = &mut foo;
match bar {Some(baz) => {bar.take(); //不应允许,因为`baz`唯一引用`条形指针`.},None => unreachable!(),
}
1.26.2
拒绝上述代码,并显示
以下错误消息:
error[E0499]: cannot borrow `*bar` as mutable more than once at a time--> src/main.rs:6:9|
5 | Some(baz) => {| --- first mutable borrow occurs here
6 | bar.take(); //不应被允许,因为`baz`有一个......| ^^^ second mutable borrow occurs here
...
9 | }|第一次借用到此结束
错误:因为上一个错误而中止
1.27.0
稳定版
SIMD
好了,现在是大新闻:现已发布SIMD
基础!SIMD
代表"单指令,多数据
".考虑如下此函数:
pub fn foo(a: &[u8], b: &[u8], c: &mut [u8]) {for ((a, b), c) in a.iter().zip(b).zip(c) {*c = *a + *b;}
}
在此,取两个切片
,并把数字
相加,在第三个切片中放置结果
.
但是,编译器可做得更好.LLVM
一般会"自动向量化
"代码.
在Rust1.27
中,添加了std::arch
模块,允许直接
使用这类指令,不必
依赖编译器.此外,还包括一些允许
根据各种标准
选择指定实现的功能.如:
#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"),target_feature = "avx2"))]
fn foo() {#[cfg(target_arch = "x86")]use std::arch::x86::_mm256_add_epi64;#[cfg(target_arch = "x86_64")]use std::arch::x86_64::_mm256_add_epi64;unsafe {_mm256_add_epi64(...);}
}
在此,根据目标机器,使用cfg
标志选择正确的版本;在x86
上,使用该版本,在x86_64
上,使用其版本.也可在运行时
选择:
fn foo() {#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]{if is_x86_feature_detected!("avx2") {return unsafe { foo_avx2() };}}foo_fallback();
}
在此,有两个
版本函数:一个使用可让你执行256
位操作的指定类型的SIMD
功能的AVX2
.
is_x86_feature_detected!
宏生成代码,来检测CPU
是否支持AVX2
,如果支持,则调用foo_avx2
函数.如果没有,则回退到非AVX
实现,foo_fallback
.
std::arch
专门用来构建
这类工作.并在高级上用稳定std::simd
的模块.
如下,没有simd
.
let lots_of_3s = (&[-123.456f32; 128][..]).iter().map(|v| {9.0 * v.abs().sqrt().sqrt().recip().ceil().sqrt() - 4.0 - 2.0}).collect::<Vec<f32>>();
要用SIMD
,请更改为:
let lots_of_3s = (&[-123.456f32; 128][..]).simd_iter().simd_map(f32s(0.0), |v| {f32s(9.0) * v.abs().sqrt().rsqrt().ceil().sqrt() - f32s(4.0) - f32s(2.0)}).scalar_collect();
它几乎是一样的:simd_iter
而不是iter
,simd_map
而不是map
,f32s(2.0)
而不是2.0
.但是,你获得为你生成的SIMD
化版本.
dyn
特征
给定Foo
特征,如下是一个特征对象
:
Box<Foo>
在Rust1.27
中,稳定了一个新的dyn Trait
语法.特征对象
现在如下:
//旧`=>`新
Box<Foo> => Box<dyn Foo>
&Foo => &dyn Foo
&mut Foo => &mut dyn Foo
同样,对其他指针类型,Arc<Foo>
现在是Arc<dyn Foo>
等.
开发了可自动升级
代码到更新
习惯用语的rustfix
的工具.
#[must_use]
函数
最后,升级了#[must_use]
属性:现在可用于函数.
以前,它仅适合Result<T,E>
等类型.但是现在,可这样
:
#[must_use]
fn double(x: i32) -> i32 {2 * x
}
fn main() {double(4); //警告:必须使用的`"double"`的未使用返回值let _ = double(4); //(无警告)
}
稳定了几个新API
:
DoubleEndedIterator::rfind
DoubleEndedIterator::rfold
DoubleEndedIterator::try_rfold
Duration::from_micros
Duration::from_nanos
Duration::subsec_micros
Duration::subsec_millis
HashMap::remove_entry
Iterator::try_fold
Iterator::try_for_each
NonNull::cast
Option::filter
String::replace_range
Take::set_limit
hint::unreachable_unchecked
os::unix::process::parent_id
process::id
ptr::swap_nonoverlapping
slice::rsplit_mut
slice::rsplit
slice::swap_with_slice
Cargo
更改目标目录
,用--target-dir
标志.
Cargo
试自动发现项目中的测试,示例和二进制文件
.但是,有时需要显式配置.
快速摘要:
1,RLS
不再干扰
命令行生成
2,有时,Rustfmt
停止了错误
文本格式
3,不再允许通过非终止Trait
的impl Trait
返回main
.
4,对implTrait
类型的方法参数
,不再适合::<>(turbofish)
5,NaN>NaN
在常量
环境中,不再返回true
.
6,Rustup
应该不会再因为缺少文档
而失败
7,如果代码继续编译,则只有更改浮点比较
,可能会改变行为.
fn main() -> Result<(), std::io::Error> {Ok(())
}
如下.
struct Foo;
impl Foo {fn bar(&self, _arg: impl Copy) {}
}
fn main() {Foo.bar::<u32>(0);
}
浮点比较
:
use std::f64::NAN;
const FOO: bool = ::std::f64::NAN >= ::std::f64::NAN;
# On 1.26.0
assert_eq!(FOO, true);
# On 1.26.1
assert_eq!(FOO, false);//假
相关文章:
2311rust到27版本更新
1.23 从Rust1.0开始,有叫AsciiExt的特征来提供u8,char,[u8]和str上的ASCII相关功能.要使用它,需要如下编写代码: use std::ascii::AsciiExt; let ascii a; let non_ascii ; let int_ascii 97; assert!(ascii.is_ascii()); assert!(!non_ascii.is_ascii()); assert!(int_a…...

网络运维Day18
文章目录 环境准备导入数据确认表导入成功练习用表解析表格结构设计 查询语句进阶什么是MySQL函数常用功能函数数学计算流程控制函数查询结果处理 连接查询(联表查询)表关系什么是连接查询连接查询分类笛卡尔积内连接(INNER)外连接 子查询什么是子查询子查询出现的位置子查询练…...
leetcode刷题日志-13整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为…...
docker 部署mysql主从复制
一:环境准备 1:创建mysql主库镜像 docker run -p 3307:3306 --name mysql_m \ -v /opt/mysql_m/log:/var/log/mysql \ -v /opt/mysql_m/data:/var/lib/mysql \ -v /opt/mysql_m/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD123456 \ -d mysql:5.7 2&…...

C++打怪升级(十一)- STL之list
~~~~ 前言1. list是什么2. list接口函数的使用1. 构造相关默认构造n个val构造迭代器范围构造拷贝构造 2 赋值运算符重载函数2 析构函数3 迭代器相关begin 和 endrbegin 和rend 4 容量相关emptysize 5 元素访问相关frontback 6 修改相关push_backpop_backpush_frontpop_frontins…...
Python编程陷阱(七)
陷阱26:不要使用list.reverse方法来反转列表 列表是Python中最常用的数据结构之一,它可以存储任意类型的元素,并且可以动态地增加或删除元素。有时候,我们需要将列表中的元素反转,比如打印或排序它们的值,就需要使用list.reverse方法或[::-1]切片来反转列表。但是,如果我…...
Python如何调用ixchariot进行吞吐量测试
Python如何调用ixchariot进行吞吐量测试 要使用Python调用IxChariot进行吞吐量测试,您可以使用 subprocess 模块来执行IxChariot的TCL命令行。下面是一个简单的示例代码: import subprocess# 定义IxChariot的安装路径和测试脚本路径 ixchariot_path &q…...

51单片机应用从零开始(五)·加减乘除运算
51单片机应用从零开始(一)-CSDN博客 51单片机应用从零开始(二)-CSDN博客 51单片机应用从零开始(三)-CSDN博客 51单片机应用从零开始(四)-CSDN博客 详解 KEIL C51 软件的使用建立工程…...

Meta降本增效大招之:弃用产品
今晚无意间进入去哪儿技术沙龙的直播间,听到他们要删除50%的代码和停掉50%的服务。我就想起Meta公司最近写的这篇博客:Automating product deprecation。 这篇博客对于效能平台的建设非常具有指导意义。文章最后有原文链接和我个人的总结。 这是一个系列…...

Adobe Illustrator——原创设计的宝藏软件
今天,我们来谈谈一款在Adobe系列中曾经多次给大家都提到的原创性极强的设计理念丰富的矢量图形编辑软件——Adobe Illustrator。 Adobe Illustrator,其定位是一款与Photoshop相类似对矢量图形进行编辑的软件。 Adobe Illustrator,作为全球最著…...

LEEDCODE 220 存在重复元素3
class Solution { public:int getId(int a, int valuediff){// 值// return a/(valuediff1);return a < 0 ? (a ) -) / (valuediff 1) - 1 : a / (valuediff 1);}public: unordered_map<int, int> bucket;bool containsNearbyAlmostDuplicate(vector<int>&am…...

从内网到公网:使用Axure RP和内网穿透技术发布静态web页面的完整指南
文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…...

第三天课程 RabbitMQ
RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应&am…...
Ubuntu18.04编译OpenCV时遇到无法下载ADE的问题
安装OpenCV过程中编译时出现下载ADE失败的问题 报错如下: -- ADE: Downloading v0.1.2a.zip from https://github.com/opencv/ade/archive/v0.1.2a.zip -- Try 1 failed CMake Warning at cmake/OpenCVDownload.cmake:248 (message):ADE: Download failed: 28;&quo…...

基于JavaWeb+SSM+社区居家养老服务平台—颐养者端微信小程序系统的设计和实现
基于JavaWebSSM社区居家养老服务平台—颐养者端微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 在复杂社会化网络中,灵活运用社会生活产生的大数据&am…...
算法实战:亲自写红黑树之五 删除erase的平衡
本文承接自: 算法实战:亲自写红黑树之一-CSDN博客 算法实战:亲自写红黑树之二 完整代码-CSDN博客 算法实战:亲自写红黑树之三 算法详解-CSDN博客 算法实战:亲自写红黑树之四 插入insert的平衡-CSDN博客 目录 一、入口…...

春秋云境靶场CVE-2021-41402漏洞复现(任意代码执行漏洞)
文章目录 前言一、CVE-2021-41402描述二、CVE-2021-41402漏洞复现1、信息收集1、方法一弱口令bp爆破2、方法二7kb扫路径,后弱口令爆破 2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识,禁止…...
12 Go的接口
概述 在上一节的内容中,我们介绍了Go的作用域,包括:局部作用域、全局作用域、命名空间作用域等。在本节中,我们将介绍Go的接口。Go语言中的接口是一种类型,它定义了一组函数的集合。接口是一种抽象的描述,它…...
Python编程-----并行处理应用程序
目录 一.进程 二.线程 三.Python标准库中并行处理的相关模块 Threading模块 (1)使用Thread对象创建线程 (2)自定义派生于Thread的对象 (3)线程加入join() (4)用户线程和daemon线程 (5)Timer线程 线…...

kubernetes集群编排——istio
官网:https://istio.io/latest/zh/about/service-mesh/ 部署 [rootk8s2 ~]# tar zxf istio-1.19.3-linux-amd64.tar.gz [rootk8s2 ~]# cd istio-1.19.3/[rootk8s2 istio-1.19.3]# export PATH$PWD/bin:$PATH demo专为测试准备的功能集合 [rootk8s2 istio-1.19.3]# i…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...