【Rust Cookbook系列】六 数据结构
1. 位域 1.1 定义并操作位域风格的类型 需要安装bitflags库,可通过cargo add bitflags 命令安装 [dependencies]bitflags = "2.1.0" 如下实例在 bitflags! 宏的帮助下创建类型安全的位域类型 MyFlags,并为其实现基本的清理操作(clear 方法)以及 Display trait。随后,展示了基本的按位操作和格式化。 use bitflags::bitflags;use std::fmt;// 定义 MyFlags 枚举类型,表示一个 32 位二进制标志位bitflags! { #[derive(Clone, Copy, PartialEq, Eq, Debug )] struct MyFlags: u32 { const FLAG_A = 0b00000001; // 第一位标志位表示 FLAG_A const FLAG_B = 0b00000010; // 第二位标志位表示 FLAG_B ...
【如何百科】Ubuntu离线安装MiniKube
1. 工具包准备 安装机器架构 Ubuntu16.04 AMD64 docker的安装过程详见文章:【如何百科】Ubuntu 安装最新 docker 1.1 Minekube 下载 官方二进制下载地址下载链接 官方 Deb 包下载地址下载链接 官方 RPM 包下载地址下载链接 1.2 helm 下载 官方二进制包下载地址下载链接 官方 Deb 包下载地址下载链接 1.3 kubernetes 相关命令工具下载,至少需要下载以下三个工具 本文以 v1.26.3 版本为主。下载地址 kubectl kubelet kubeadm 2. minikube 镜像准备 2.1 下载 minikube 必需的 9...
【Rust Cookbook系列】五 密码学
1. 散列(哈希) 1.1 计算文件的 SHA-256 摘要 需要安装ring,data-encoding,error-chain 库,可通过cargo add ring,cargo add data-encoding ,cargo add error-chain 命令安装 [dependencies]data-encoding = "2.3.3"error-chain = "0.12.4"ring = "0.16.20" 以下实例中,先创建文件,写入一些数据。然后使用 digest::Context 计算文件内容的 SHA-256 摘要 digest::Digest。 use data_encoding::HEXUPPER;use error_chain::error_chain;use ring::digest::{Context, Digest, SHA256};use std::fs::File;use std::io::{BufReader, Read,...
【Rust Cookbook系列】四 并行/并发
1. 显式线程 1.1 生成短期线程 需要安装crossbeam库,可通过cargo add crossbeam 命令安装 [dependencies]crossbeam = "0.8.2" 使用 crossbeam crate 为并发和并行编程提供了数据结构和函数。Scope::spawn 生成一个新的作用域线程,该线程确保传入 crossbeam::scope 函数的闭包在返回之前终止,这意味着您可以从调用的函数中引用数据。 本实例将数组一分为二,并在不同的线程中并行计算。 extern crate crossbeam;fn main() { let arr = &[1, 25, -4, 10, 36, 88, -99]; let max = find_max(arr); assert_eq!(max, Some(88));}fn find_max(arr: &[i32]) -> Option<i32> { const THRESHOLD: usize =...
【Rust Cookbook系列】三 压缩
1. 使用 tar 包 需要安装flate2和tar库,可通过cargo add flate2 和cargo add tar 命令安装 [dependencies]flate2 = "1.0.25"tar = "0.4.38" 1.1 压缩目录为 tar 包 压缩 /root/testtar目录内的内容到 archive.tar.gz 压缩包中。创建一个用 GzEncoder 和 tar::Builder 包裹的 File。使用 Builder::append_dir_all,将 /root/testtar目录内的内容递归添加到 backup/code路径下的归档文件中。在将数据写入压缩包 archive.tar.gz 之前,GzEncoder 负责清晰地将数据压缩。 /root/testtar目录结构如下: /root/testtar/├── Cargo.lock_copy├── Cargo.toml_copy└── src-rust └── main.rs 详细代码如下: use...
【Rust Cookbook系列】二 命令行
1. 参数解析 需要安装clap库,可通过cargo add clap --features derive命令安装 [dependencies]clap = { version = "4.1.11", features = ["derive"] } 1.1 解析命令行参数 此应用程序使用 clap 构建器样式描述其命令行界面的结构。文档还提供了另外两种可用的方法去实例化应用程序。在构建器样式中,short 和 long 选项控制用户将要键入的标志;short 标志看起来像 -f,long 标志看起来像 --file。 use clap::{Arg, Command};fn main() { let matches = Command::new("命令行-测试") .version("0.1.0") .author("Hackerman Jones...
【Python杂记】async和await使用
1. 使用的库(库 httpx 可通过 pip install httpx 命令安装) import httpximport asyncioimport time 2. async 和 await 的普通使用 async def fetch_other(url): await asyncio.sleep(10) print(url)async def test_other(): urls = ['https://httpbin.org/get', 'https://httpbin.org/cookies', 'https://httpbin.org/uuid', 'https://httpbin.org/response-headers?freeform='] tasks = [asyncio.ensure_future(fetch_other(url)) for url in urls] await asyncio.gather(*tasks) 3. async 和...
【Rust Cookbook系列】一 算法
1. 生成随机值 需要安装rand库,可通过cargo add rand命令安装 [dependencies]rand = "0.8.5" 1.1 生成随机数 在随机数生成器 rand::Rng 的帮助下,通过 rand::thread_rng 生成随机数。可以开启多个线程,每个线程都有一个初始化的生成器。整数在其类型范围内均匀分布,浮点数是从 0均匀分布到 1,但不包括 1。 use rand::Rng;fn main() { let mut rng = rand::thread_rng(); let n1: u8 = rng.gen(); let n2: u16 = rng.gen(); println!("随机生成 u8: {}", n1); println!("随机生成 u16: {}", n2); println!("随机生成 u32: {}",...
【Rust杂记】2023-03-13-压缩数据和解压数据
1. 使用compress压缩文件 1.1 使用到的库flate2,配置文件Cargo.toml中添加(或通过cargo add flate2 添加) [dependencies]flate2 = "1.0.25" 1.2 使用库flate2压缩代码 use flate2::write::GzEncoder;use flate2::Compression;use std::env::args;use std::fs::File;use std::io::copy;use std::io::BufReader;use std::time::Instant;fn main() { //在real_main函数中处理真正的程序 //为了干净的结束和退出,在主函数中使用它 std::process::exit(real_main());}fn real_main() -> i32 { if args().len() != 3 { eprintln!("Usage:...
【Rust杂记】标准库中的数据结构与算法
1. 数据结构 Rust的标准库提供了几种数据结构,可用于以各种方式存储和操作数据。如下所示: Vec<T>:一个可增长的数组,可以存储可变数量的T类型元素。它被实现为一个动态分配的数组,并提供对其元素的有效访问。 fn main() { let mut v = Vec::new(); v.push(1); v.push(2); v.push(3); assert_eq!(v[0], 1); assert_eq!(v[1], 2); assert_eq!(v[2], 3);} LinkedList<T>:一个双链表,可以存储可变数量的类型T的元素。它允许有效地插入和删除列表两端的元素,但与Vec相比,它对单个元素的访问速度较慢。 use std::collections::LinkedList;fn main() { let mut list = LinkedList::new(); list.push_back(1); ...