Skip to content

Commit

Permalink
2024-10-04 12:04:53
Browse files Browse the repository at this point in the history
  • Loading branch information
JQiue committed Oct 4, 2024
1 parent bbb6e30 commit 39eac9f
Show file tree
Hide file tree
Showing 5 changed files with 187 additions and 11 deletions.
10 changes: 9 additions & 1 deletion docs/operating-system/linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,7 @@ sudo mount -t cifs -o credentials=/root/win-credentials //WIN_SHARE_IP/<share_na
sudo vim /etc/ssh/sshd_config
```

找到`PermitRootLogin prohibit-password`行并用`#`注释掉,新添加`PermitRootLogin yes`,保存编辑退出,使用`sudo service ssh restart`就行了
找到`PermitRootLogin`行并改为`PermitRootLogin yes`,以及开启`PubkeyAuthentication yes`,保存编辑退出,使用`sudo service ssh restart`就行了

每次连接输入密码太麻烦,可以使用密钥的方式来登录,首先本机使用`ssh-keygen -t ed25519`生成密钥对,然后使用`ssh-copy-id 用户名@机器地址`上传密钥到远程机器,随后输入密码验证一下,以后就可以免密登录了

Expand Down Expand Up @@ -696,3 +696,11 @@ crontab -e
```text
0 23 * * * rtcwake -v -s 32400 -m mem
```

## benchmark

购买了一台 Linux 服务器怎么不跑一下各种测试呢?

```sh
wget -qO- bench.sh | bash
```
14 changes: 7 additions & 7 deletions docs/rust/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ geometry = { path = "crates/geometry" }
```

::: tip
如果想要知道依赖的用法,可以使用`cargo doc --open`
如果想要知道依赖的用法,可以使用`cargo doc --open`,如果不想生成依赖就加上`--no-deps`参数
:::

### Cargo.lock
Expand Down Expand Up @@ -215,7 +215,7 @@ add-one = { path = "../add-one" }

整个工作空间只会在根目录下有`Cargo.lock`文件,即使在每个包中添加相同的依赖包,Cargo 也不会重复下载,保证相同的包都是一个版本,节约了磁盘空间,确保了包之间彼此兼容

除此之外,还有不包含的`[package]`的工作目录,被称为**虚拟清单**(virtual manifest)。对于没有主`package`的场景且希望将所有的`package`组织在一起时非常适合
除此之外,还有不包含的`[package]`的工作目录,被称为**虚拟清单**(virtual manifest)。对于没有主`package`的场景且希望将所有的`package`组织在一起时非常适合,虚拟清单是不能够添加`dependencies`

## Build Scripts

Expand All @@ -232,20 +232,20 @@ add-one = { path = "../add-one" }
```rs
// build.rs
fn main() {
// 默认情况下,build.rs 不会每次都重新编译执行,但可以使用 stdout 来和 Cargo 进行通信告知何时重新运行构建脚本
println!("cargo:rerun-if-changed=src/example.c");
cc::Build::new().file("src/example.c").compile("example");
// 默认情况下,build.rs 不会每次都重新编译执行,但可以使用 stdout 来和 Cargo 进行通信告知何时重新运行构建脚本
println!("cargo:rerun-if-changed=src/example.c");
cc::Build::new().file("src/example.c").compile("example");
}

// main.rs
// 外部函数接口(FFI)声明,“C”指定使用了 C 语言的 ABI
// #[link(name = "example")] // 用于告诉 Rust 编译器需要链接哪个外部库,由于使用了 cc,所以自动处理了链接,因此可以忽略
extern "C" {
fn c_add(a: i32, b: i32) -> i32;
fn c_add(a: i32, b: i32) -> i32;
}

fn main() {
unsafe { println!("{}", c_add(1, 2)) };
unsafe { println!("{}", c_add(1, 2)) };
}
```

Expand Down
22 changes: 20 additions & 2 deletions docs/rust/libraries.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ lettre 是一个功能强大的邮件库

比较知名的 HTTP 请求库

最简单的 GET 请求
GET 请求

```rust
let body = reqwest::get("https://www.rust-lang.org")
Expand All @@ -159,7 +159,7 @@ let body = reqwest::get("https://www.rust-lang.org")
.await?;
```

发送 POST 请求
POST 请求

```rust
use reqwest::Client;
Expand Down Expand Up @@ -419,3 +419,21 @@ fn is_foo(text: &str) -> bool {
REF_RE.is_match(text)
}
```

## Anyhow

anyhow 主要解决以下问题:

+ 简化错误处理:anyhow 提供了一个通用的错误类型 anyhow::Error,它可以包装几乎任何类型的错误。这使得在函数返回值中使用`Result<T, anyhow::Error>`变得非常方便
+ 动态错误:anyhow::Error 是一个动态错误类型,可以在运行时存储任何实现了 std::error::Error trait 的错误
+ 错误上下文:anyhow 提供了 .context() 方法,允许为错误添加额外的上下文信息
+ 适合应用程序级别使用:anyhow 特别适合在应用程序的顶层使用,当可能需要处理多种不同类型的错误

## Thiserror

thiserror 主要解决以下问题:

+ 自定义错误类型:thiserror 提供了一个派生宏,使得创建自定义错误类型变得简单
+ 静态错误:与 anyhow 不同,thiserror 创建的是静态类型的错误,这意味着它们在编译时就确定了类型
+ 错误消息模板:thiserror 允许你为每种错误类型定义自定义的错误消息模板
+ 适合库级别使用:thiserror 当需要定义明确的错误类型
150 changes: 150 additions & 0 deletions docs/rust/standard.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,156 @@ fn main() {

## 文件操作

读取文件内容:

```rust
use std::fs;
use std::io::{self, Read};

// 读取整个文件内容到字符串
fn read_whole_file() -> io::Result<()> {
let content = fs::read_to_string("example.txt")?;
println!("File content: {}", content);
Ok(())
}

// 读取文件内容到字节数组
fn read_file_to_bytes() -> io::Result<()> {
let content = fs::read("example.txt")?;
println!("File content (bytes): {:?}", content);
Ok(())
}

// 使用 BufReader 逐行读取文件
fn read_lines() -> io::Result<()> {
let file = fs::File::open("example.txt")?;
let reader = io::BufReader::new(file);
for line in reader.lines() {
println!("{}", line?);
}
Ok(())
}
```

写入文件:

```rust
use std::fs::{self, File};
use std::io::{self, Write};

// 写入字符串到文件
fn write_string_to_file() -> io::Result<()> {
fs::write("output.txt", "Hello, Rust!")?;
Ok(())
}

// 使用 BufWriter 写入文件
fn write_with_bufwriter() -> io::Result<()> {
let file = File::create("output.txt")?;
let mut writer = io::BufWriter::new(file);
writeln!(writer, "Line 1")?;
writeln!(writer, "Line 2")?;
writer.flush()?;
Ok(())
}
```

文件和目录操作:

```rust
use std::fs;
use std::path::Path;

// 创建目录
fn create_directory() -> io::Result<()> {
fs::create_dir("new_directory")?;
Ok(())
}

// 递归创建目录
fn create_directories() -> io::Result<()> {
fs::create_dir_all("path/to/new/directory")?;
Ok(())
}

// 遍历目录
fn traverse_directory(dir: &Path) -> io::Result<()> {
if dir.is_dir() {
for entry in fs::read_dir(dir)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
println!("Directory: {:?}", path);
traverse_directory(&path)?;
} else {
println!("File: {:?}", path);
}
}
}
Ok(())
}

// 删除文件
fn remove_file() -> io::Result<()> {
fs::remove_file("file_to_delete.txt")?;
Ok(())
}

// 删除目录
fn remove_directory() -> io::Result<()> {
fs::remove_dir("directory_to_delete")?;
Ok(())
}

// 重命名文件或目录
fn rename_file_or_directory() -> io::Result<()> {
fs::rename("old_name.txt", "new_name.txt")?;
Ok(())
}

// 检查文件或目录是否存在
fn check_existence() {
let path = Path::new("file_or_directory");
if path.exists() {
println!("Path exists");
} else {
println!("Path does not exist");
}
}

// 获取文件元数据
fn get_file_metadata() -> io::Result<()> {
let metadata = fs::metadata("example.txt")?;
println!("File size: {} bytes", metadata.len());
println!("File type: {:?}", metadata.file_type());
println!("Last modified: {:?}", metadata.modified()?);
Ok(())
}
```

临时文件和目录:

```rust
use std::fs::File;
use tempfile::{tempdir, NamedTempFile};

// 创建临时文件
fn create_temp_file() -> io::Result<()> {
let mut file = NamedTempFile::new()?;
writeln!(file, "Some content")?;
println!("Temp file path: {:?}", file.path());
Ok(())
}

// 创建临时目录
fn create_temp_directory() -> io::Result<()> {
let dir = tempdir()?;
println!("Temp directory path: {:?}", dir.path());
// 目录会在 `dir` 离开作用域时自动删除
Ok(())
}
```

## 网络编程

Rust 标准库提供了`std::net`模块,用于网络编程。这个模块包含了处理 TCP 和 UDP 通信的基本类型
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"url": "https://github.com/JQiue/jqiue-notes"
},
"scripts": {
"dev": "vuepress dev docs --clean-cache",
"dev": "vuepress dev docs",
"build": "vuepress build docs",
"lint:md": "markdownlint **/*.md --ignore node_modules -f",
"lint:prettier": "prettier --check ."
Expand Down

0 comments on commit 39eac9f

Please sign in to comment.