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

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-units1(或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,RefCellUnsafeCell的新功能
2,各种原子整数类型的新函数
3,{integer}::min_valuemax_value
4,MEMsize_ofalign_of
5,ptr::nullnull_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/longjmpRustpanic都使用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_secsfrom_millis函数都变成了常量函数,允许按常量式创建Duration.

3,:cargo new现在默认生成二进制文件,而不是.可用--lib/--bin来设置.

1.26.0稳定版

impl特征

impl Trait来了!提供了叫"存在类型"的功能.核心想法是:

fn foo() -> impl Trait {//...
}

此类型签名,表示"foo是一个无参但返回实现Trait特征的类型"的函数.也即,不会告诉你foo具体返回类型,只告诉你它实现了指定特征.

特征对象有何不同?

fn foo() -> Box<Trait> {//...
}

假设有个针对i32f32实现的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开始,没有&sref初始代码,完全按你的期望编译执行.总之,在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中,现在可声明返回Resultmain:

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::openio::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,不再允许通过非终止Traitimpl 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整数转罗马数字

罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1。12 写做 XII &#xff0c;即为…...

docker 部署mysql主从复制

一&#xff1a;环境准备 1&#xff1a;创建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进行吞吐量测试&#xff0c;您可以使用 subprocess 模块来执行IxChariot的TCL命令行。下面是一个简单的示例代码&#xff1a; import subprocess# 定义IxChariot的安装路径和测试脚本路径 ixchariot_path &q…...

51单片机应用从零开始(五)·加减乘除运算

51单片机应用从零开始&#xff08;一&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;二&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;三&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;四&#xff09;-CSDN博客 详解 KEIL C51 软件的使用建立工程…...

Meta降本增效大招之:弃用产品

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

Adobe Illustrator——原创设计的宝藏软件

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

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.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…...

Ubuntu18.04编译OpenCV时遇到无法下载ADE的问题

安装OpenCV过程中编译时出现下载ADE失败的问题 报错如下&#xff1a; -- 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套》 源码获取 源码获取入口 前言 在复杂社会化网络中&#xff0c;灵活运用社会生活产生的大数据&am…...

算法实战:亲自写红黑树之五 删除erase的平衡

本文承接自&#xff1a; 算法实战&#xff1a;亲自写红黑树之一-CSDN博客 算法实战&#xff1a;亲自写红黑树之二 完整代码-CSDN博客 算法实战&#xff1a;亲自写红黑树之三 算法详解-CSDN博客 算法实战&#xff1a;亲自写红黑树之四 插入insert的平衡-CSDN博客 目录 一、入口…...

春秋云境靶场CVE-2021-41402漏洞复现(任意代码执行漏洞)

文章目录 前言一、CVE-2021-41402描述二、CVE-2021-41402漏洞复现1、信息收集1、方法一弱口令bp爆破2、方法二7kb扫路径&#xff0c;后弱口令爆破 2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止…...

12 Go的接口

概述 在上一节的内容中&#xff0c;我们介绍了Go的作用域&#xff0c;包括&#xff1a;局部作用域、全局作用域、命名空间作用域等。在本节中&#xff0c;我们将介绍Go的接口。Go语言中的接口是一种类型&#xff0c;它定义了一组函数的集合。接口是一种抽象的描述&#xff0c;它…...

Python编程-----并行处理应用程序

目录 一.进程 二.线程 三.Python标准库中并行处理的相关模块 Threading模块 &#xff08;1&#xff09;使用Thread对象创建线程 &#xff08;2&#xff09;自定义派生于Thread的对象 &#xff08;3&#xff09;线程加入join() (4)用户线程和daemon线程 (5)Timer线程 线…...

kubernetes集群编排——istio

官网&#xff1a;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…...

mfc140u.dll丢失的解决方法,以及mfc140u.dll解决方法的优缺点

在使用电脑过程中&#xff0c;有时会遇到一些与动态链接库文件&#xff08;DLL&#xff09;相关的错误。其中&#xff0c;mfc140u.dll丢失的错误是较为常见的一种。当这个关键的mfc140u.dll文件丢失或损坏时&#xff0c;可能会导致某些应用程序无法正常运行。在本文中&#xff…...

2源码安装网络协议

2.2源码安装/网络协议 一、源码包应用场景 有时我们所用的内核版本太旧&#xff0c;系统自带的库&#xff08;如libstdc.so.6&#xff09;版本低或者依赖的其他软件版 本较低&#xff0c;导致无法安装目标软件。 软件/库其实是对机器汇编指令集的封装&#xff0c;在X86体系下…...

未来服务器操作系统的趋势与展望

摘要&#xff1a; 随着云计算、大数据和人工智能不断的发展&#xff0c;服务器操作系统也需要随之进行新一轮的升级。本文通过分析当前服务器操作系统的现状&#xff0c;探讨了未来服务器操作系统的趋势和展望&#xff0c;并针对一些关键问题提出了解决方案。 一、引言 服务器…...

VB.net WebBrowser网页元素抓取分析方法

在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

自建ES6.2.4切阿里云商业版ES(7.10)整体方案

一、切换目的&阿里云商业版ES版本选择 1.1 升级切换阿里云商业版7.10目的 自建的Elasticsearch服务运维难度高,操作复杂,需要手动调整资源,遇到性能瓶颈时优化难度相对云上Elasticsearch较大。使用阿里云提供的ES服务,提高系统稳定性使用云服务es,易于备份,数据恢复…...

Vue实现封装自定义指令

目录 一、什么是自定义指令&#xff1f; 二、自定义指令的使用 Vue中的自定义指令使用Vue.directive函数进行定义。该函数接受两个参数&#xff0c;第一个是指令名称&#xff0c;第二个是指令选项对象。 上述代码中&#xff0c;我们定义了一个名为my-directive的自定义指令…...

<MySQL> 查询数据进阶操作 -- 聚合查询

目录 一、聚合查询概述 二、聚合函数查询 2.1 常用函数 2.2 使用函数演示 2.3 聚合函数参数为*或列名的查询区别 2.4 字符串不能参与数学运算 2.5 具有误导性的结果集 三、分组查询 group by 四、分组后条件表达式查询 五、MySQL 中各个关键字的执行顺序 一、聚合查询…...

arm开发板

一个简单的hello world程序 minicom用来和开发板之间交互并且可以向开发板传输文件。打印hello world字符串。在linux虚拟机上编译我的代码&#xff0c;使用的交叉编译工具是arm-linux-gnueabihf-gcc (hard float) 可以使用 readelf -h libc.so.6 查看开发板是不是&#xff08…...

nodejs+vue教室管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户 用户管理&#xff1a;查看&#xff0c;修改自己的个人信息 教室预约&#xff1a;可以预约今天明天的教室&#xff0c;按着时间段预约&#xff08;可多选&#xff09;&#xff0c;如果当前时间超过预约时间段不能预约该时间段的教室 预约教室的时候要有个预约用途&#xff…...

rabbitMQ的Topic模式的生产者与消费者使用案例

topic模式 RoutingKey 按照英文单词点号多拼接规则填充。其中消费者匹配规则时候 * 代表一个单词&#xff0c;#表示多个单词 消费者C1的RoutingKey 规则按照*.orange.* 匹配 绑定队列Q1 package com.esint.rabbitmq.work05;import com.esint.rabbitmq.RabbitMQUtils; import …...