不同类型的压力分别在不同的节点上执行; 异地容灾:在数据中心故障时快速切换到异地; 典型结构 一个典型的MongoDB复制集由3个以上具有投票权的节点组成: (1)一个主节点(Primary),接受写入操作和选举时投票; (2) 2 实践准备工作 准备VMware Workstation 跟上一篇一样,这次我们仍然会通过VMware Workstation启动几个虚拟机来完成搭建实践。 准备三台CentOS 7.x虚拟机 这里模拟的是三个Mongo节点的主从复制集,因此分别命名为mongo-master、mongo-slave1、mongo-slave2。 ? (IP地址为你配置的虚拟机IP): 192.168.58.100 mongo-master 192.168.58.101 mongo-slave1 192.168.58.102 mongo-slave2 参考资料 唐建法,《MongoDB高手课》(极客时间) 郭远威,《MongoDB实战指南》(图书) 作者:周旭龙 出处:https://edisonchou.cnblogs.com 本文版权归作者和博客园共有
实战 今天给大家带来抓包教程的抓包分析实战,让大家更了解抓包,以及防止抓包危害的措施。 网球锤子抓包教程 抓包介绍 1.什么是抓包 https://cloud.tencent.com/developer/article/1886911 2.什么是抓包2 https://cloud.tencent.com 1.导入 https://cloud.tencent.com/developer/article/1886895 2.实战修改过程 https://cloud.tencent.com/developer /article/1886914 - 网球教程 1.实战 https://cloud.tencent.com/developer/article/1886917 2.技巧 https://cloud.tencent.com 以抓包来说明 本教程准备 设备:iPhone 抓包工具:HttpCatcher网球 对象:微截图2 说明:教程仅供学习参考,请支持正版,禁止利用本教程进行违法行为 1.第一步抓取传输内容 •打开HTTP
Rust 安装 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" 2. Rust 的目标:安全 “we need a safer systems programming language[2] Rust 不受以下情况的影响: 空悬指针(dangling pointers): thread::spawn(|| { data = 1000; }); // <2> println! (buffer_overflow, '') // <2> } 这行代码会出现 panic assert_eq!() 的两边必须相等,否则程序 panic 使用 cargo 编译不会通过。 参考资料 [1] rust in action: https://livebook.manning.com/book/rust-in-action [2] we need a safer systems
https://www.gauge.sh/blog/parsing-python-asts-20x-faster-with-rust Rust newtype 终极教程 通过Rust的newtype包装器可以提高类型安全性 这个教程非常全面,推荐阅读: https://www.howtocodeit.com/articles/ultimate-guide-rust-newtypes 微软Surface的UEFI是用Rust /ba-p/4159998 教程 - 使用Rust开发跨平台安全应用 讲解了Rust如何与TS配合。 https://www.firezone.dev/blog/using-tauri Rust 社区统计数据 这个统计各大社交平台上的Rust数据。显示Rust正在快速增长。2个月涨了几%。 https://rust.code-maven.com/rust-update-2024-06-17 --
unsafe Rust 编译器:我不允许!你:我偏要!欢迎来到 Rust 的"法外之地" 引入 学到这里,你可能已经对 Rust 的借用检查器又爱又恨了。 坑点 2:忘记 unsafe 块 unsafe fn dangerous() { println!("I'm dangerous!") 实战案例:实现一个简单的 Vec 让我们看看 unsafe 在实际中的应用。 , vec.get()); // Some(2) println!("vec[2] = {:?}" 参考资料 The Rustonomicon - unsafe Rust Rust Book - unsafe Rust Rust by Example - unsafe
基本概念 match 是 Rust 中的强大模式匹配语法,类似于其他语言的 switch,但功能更强大。它允许你根据变量的值执行不同的代码分支,并且可以匹配复杂的数据结构。 ("One or Two"), // 匹配 1 或 2 3..=6 => println! { 1 => "one", 2 => "two", _ => "other", }; println! ("Result: {}", result); 穷尽性检查 Rust 要求 `match` 必须覆盖所有可能情况,否则编译报错。这保证了代码的安全性。 实战例子:Option 和 Result fn main() { let maybe_name = Some("Alice"); match maybe_name { Some
Rust 线程基础:spawn、join 和 move 闭包Rust 的线程在 std::thread 模块中。 2. 实际案例一:并行计算斐波那契数列斐波那契(Fib)是经典递归问题,单线程慢如狗。用线程并行计算大 Fib 值,性能飞起! 实战场景:在游戏服务器中,Arc<Mutex<Player>> 共享玩家状态;或 CLI 工具并行下载文件,Mutex 记录进度条。警告:死锁风险!别在锁内调用另一个锁住的 Mutex。 调试神器:RUST_LOG=debug cargo run,或 gdb 附着。线程,让 Rust 并发如丝般顺滑 Rust 线程不是“可选糖衣”,而是安全并发的基石。 实战中,从小项目起步:试试并行排序日志文件,或构建 mini Web 服务器。Rust 的并发哲学:让编译器抓错,别让运行时崩溃。
新手也能学会的高性能gpu开发,只需要rust和cubel基础知识即可实现,让你的程序简单的使用gpu加速! CubeCL是一个现代化的Rust GPU计算框架,它让编写高性能、可移植的GPU内核变得简单。 简单易用:用Rust写GPU代码,学习曲线平缓 高性能:自动向量化优化,充分利用GPU算力 可移植:同一份代码可运行在WGPU/CUDA等不同后端 类型安全:Rust的类型系统保证代码安全性 提示: 即使没有GPU编程经验,通过本教程你也能快速上手CubeCL! GPU内核编程 与传统GPU编程不同,CubeCL允许直接用Rust编写运算逻辑。
本文是《Rust in action》学习总结系列的第二部分,更多内容请看已发布文章: 一、Rust实战系列-Rust介绍 “主要介绍 Rust 的语法、基本类型和数据结构,通过实现一个简单版 grep 2. 数字类型 整数和小数(浮点数) Rust 使用相对传统的方式定义整数和小数,操作数字使用算数符号。为了实现不同类型的运算,Rust 支持运算符重载。 (2)安全:多次访问 collention 可能出现值被修改的情况,直接对 collection 进行迭代时,Rust 会保证 collection 不被其他进程修改。 ,Rust 是基于表达式的语言,这种语言的特点是所有表达式都会返回值,从而可以使用以下两种模式:(1)简洁的辅助函数,(2)从条件表达式的返回值直接进行变量赋值。 特征是 Rust 开发者为对象添加函数的方式。由于 [T; 1], [T; 2], ..., [T; n] 是不同的类型,为数组实现特征会变得很麻烦。从数组中创建切片很容易,因为不需要指定长度。
今天咱们就聊聊 Rust 的测试系统——内置的、强大的、让你爱上写测试的神器。 ( + , , "2+2 应该等于 5,但现在不等于"); } 测试 Result 和 Option #[test] fn test_result() { let result: Result : # 安装 dotenvy cargo add dotenvy # 创建 .env 文件 API_KEY=test_key // 测试前加载 dotenvy::dotenv().ok(); 实战案例 三剑客 测试要独立:不依赖顺序,不共享状态 文档测试:让文档示例永远正确 下篇预告: 咱们已经学了内存的基础(栈和堆),但 Rust 的内存模型可不止这些。 下篇深入聊聊Rust 的内存模型,看看所有权、借用、生命周期是怎么在内存层面工作的! 参考资料 Testing Chapter Integration Tests
build.rs fn main() { cc::Build::new() .file("math_lib.c") .compile("math_lib"); } 2. Point) -> f64 { let dx = p1.x - p2.x; let dy = p1.y - p2.y; (dx * dx + dy * dy).sqrt() } (p1, p2); printf("Distance: %.2f\n", dist); // 5.00 return ; } ⚠️ 重要: #[repr(C)] 是必须的! 坑点 2:字符串没有\0结尾 // ❌ 错误:忘记\0 let c_str = b"Hello"; // C 端会读取到垃圾数据 // ✅ 正确:添加\0 let c_str = b"Hello\0 实战案例:封装 SQLite C 库 让我们看一个真实的 FFI 封装案例——封装 SQLite 的 C API: use std::ffi::{CStr, CString}; use std::os:
比如宏调用处有个名字 name1,同时宏内部也有一个名字 name1,那么卫生宏展开的时候就会把自己内部的 name1 改名成 name2;普通宏则不改名,“捕捉”外部的名字。 对于最后一个索引也是如此,所以a &a[2.. .len()]和a &a[2..]都是一样的。 因此,为了方便地创建整个数组的切片,我们可以使用&a[…]。 S是对i32s切片的引用。 ("s1: {s1}"); let mut s2: String = String::from("Hello "); println! ("s2: {s2}"); s2.push_str(s1); println! ("s2: {s2}"); let s3: &str = &s2[6..]; println!
今天咱们就来扒一扒 Rust 的内存模型,搞清楚你的数据到底住在哪儿,以及为什么 Rust 要这么设计。 Rust 说:"这种小东西,随便复制,不用管我!" ("s1 = {}, s2 = {}", s1, s2); // 输出:s1 = hello, s2 = hello // 现在 s1 和 s2 各自有一份数据 } 内存布局 "); process_data(&s); // 只是借用 process_data(&s); // 再借一次 process_data(&s); // 随便借 } 实战案例 有没有被 Rust 的所有权转移坑过?评论区聊聊你的"血泪史"! 参考资料 Rust Book - Stack and Heap Rust By Example - Box
, numbers); // [9, 8, 5, 2, 1] } 看到没?|a, b| b.cmp(a) 这个闭包直接写在 sort_by 里面,不用单独定义函数,多清爽! , name); }; greet(); // Hello, Rust! 解决方案: 显式指定类型: let add = |x: f64, y: f64| x + y; 坑点 2:闭包作为函数参数 fn main() { let numbers = vec! Box(需要堆分配) fn make_adder_boxed(x: i32) -> Box<dyn Fn(i32) -> i32> { Box::new(move |y| x + y) } 实战案例 参考资料 Rust Book - 闭包 Rust by Example - Closures
Rust 教程 - 函数基础 函数:代码界的"打工人",给啥干啥,干完交活 引入 你是不是已经写过一些 Rust 代码了? } 表达式 vs 语句:Rust 的"灵魂拷问" 这是 Rust 新手最容易懵的地方。 简单说: 表达式(Expression):有返回值的东西,比如 1 + 2、x * 3、func() 语句(Statement):执行某个动作,不返回值,比如 let x = 5;、println! ("{}", name); } 实战案例 案例 1:温度转换器 fn main() { let celsius = 25.0; let fahrenheit = celsius_to_fahrenheit 参考资料 Rust Book - 函数 Rust By Example - 函数
Rust Vec 集合使用教程 本教程将介绍如何在 Rust 中使用 Vec<T> 集合。 Vec<T> 是一个动态数组,可以存储任意类型的元素。 [1, 2, 3]; // 创建一个包含初始元素的 Vec<i32> } 运行结果 无输出。 2. 访问和修改 Vec<T> 中的元素 要访问 Vec<T> 中的元素,可以使用索引操作符 []。 [1, 2, 3]; v.push(4); // 添加元素 v.remove(1); // 删除第二个元素 println!("v: {:?}" [1, 2, 3]; for i in &v { println!("{}", i); // 输出每个元素 } } 运行结果 1 2 3 5. [1, 2, 3]; println!("len: {}", v.len()); // 输出长度 println!
今天咱们就聊聊 Rust 调试的那些事儿,从最原始的 println! 到专业的 gdb/lldb,再到 IDE 神器! 核心概念 Rust 调试的"三个阶段" 阶段 1:println! 打印变量名 + 值(Rust 1.58+ 支持) let x = ; println!("{x = ?}"); // 输出:x = 42 // 2. 条件打印(只在特定条件下打印) if cfg! 的特殊性: Rust 的调试器支持还在完善中,有些类型可能显示不完整。 解决思路: 看错误信息中的行号 找出哪个变量"活得不够长" 调整作用域或所有权 实战案例 案例:调试一个内存泄漏 问题代码: use std::cell::RefCell; use std::rc:: 学完 Rust 后的学习路线是什么?敬请期待! 参考资料 Rust 调试指南 tracing 官方文档 VS Code Rust 调试 gdb 使用手册 lldb 使用手册
Rust 教程 - 结构体 结构体:数据的"收纳盒",把相关字段装一起 引入 你有没有写过这样的代码: let user_name = "Alice"; let user_age = ; let user_email 今天咱们就来聊聊 Rust 的结构体,看看它怎么帮你组织数据,以及它和其他语言的"类"有什么不一样。 核心概念 结构体是什么? ("能装下 rect2 吗? 用这个 只读数据 &self 修改数据 &mut self 消耗/转换结构体 self 实战案例 案例 1:学生管理系统 struct Student { id: u32, name 参考资料 Rust Book - 结构体 Rust By Example - 结构体
代码 proc-macro2 = "1.0" # TokenStream 的替代品 2. 坑点 2:在过程宏 crate 中使用 std // ❌ 错误:过程宏 crate 不能直接用 std use std::println; // ✅ 正确:使用 proc_macro 提供的 API 恭喜你完成了 Rust 高级主题四部曲: ✅ 第 35 篇:unsafe Rust ✅ 第 36 篇:FFI ✅ 第 37 篇:宏编程 ✅ 第 38 篇:高级宏 这些是 Rust 中最强大也最复杂的特性 掌握它们,你就真正进入了 Rust 高手的行列! 下篇预告 高级主题学完了,接下来咱们进入 实战项目篇! Writing a Skeleton Driver - 过程宏实战
[, , ]; let v2 = v1; // v1 的所有权转移给 v2 // println!("{:?}", v1); // ❌ 编译错误! v1 已失效 } 解决: 用 clone() 或借用 let v2 = v1.clone(); // 深拷贝 // 或者 let v2 = &v1; // 借用 2. 再统一添加 let to_add: Vec<_> = nums.iter().copied().collect(); for num in to_add { nums.push(num); } 实战案例 is great Rust is fast Rust is safe"; let counts = count_words(text); for (word, count) 参考资料 Rust Book - Vectors Rust Book - HashMaps Rust Book - Strings std::vec::Vec std::collections::HashMap