Home avatar

This is my blog

Rust 引用下的成员不能发生 Move

引用下的成员不能发生 move

For example:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
struct Foo {i: i32, string: String}

impl Foo {
    fn get_data(&self) -> i32 {
        return self.i;                  // 发生 Copy。
    }

    fn get_string(&self) -> String {
        return self.string;             // error. 引用的成员不能发生 Move。
    }

    fn move_string(self) -> String {    // 传拥有资源的标志符 self 才可以
        return self.string
    }
}
fn main() {
}

可见 Rust 比 C++ 在引用方面做了一些更加严格的限制。

记录一次将宝塔的网站换成手工搭建

原因

vps 的宝塔的 Let’s encrypt 证书三个月后无法自动续签。不知道是原因。算了, 手工搭建, 然后 acme.sh 自动续签证书。

acme.sh 申请证书

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash

# 设置 acme.sh 路径变量
ACME_SCRIPT="/root/.acme.sh/acme.sh"

# 设置 Cloudflare API 凭据
export CF_Token=""        # 我的个人资料 -> API 令牌 -> 创建令牌
export CF_Account_ID=""   # 进入域 -> 右下角的 "帐户ID"

DOMAIN_GROUPS=(
    "foo.domain.com *.foo.domain.com"   # 支持申请 SAN 域名
    "bar.domain.com *.bar.domain.com"
)

# 显示开始信息
echo "开始申请SAN SSL证书..."
echo "========================================"

# 检查 acme.sh 是否存在
if [ ! -f "$ACME_SCRIPT" ]; then
    echo "❌ 错误: 找不到 acme.sh 脚本"
    exit 1
fi

# 为每组域名申请证书
for group in "${DOMAIN_GROUPS[@]}"; do
    main_domain=$(echo "$group" | awk '{print $1}')

    echo "🔄 申请证书: $group"

    # 构建并执行命令
    cmd="$ACME_SCRIPT --issue"
    for domain in $group; do
        cmd="$cmd -d $domain"
    done
    cmd="$cmd --dns dns_cf --force"

    eval $cmd

    if [ $? -eq 0 ]; then
        echo "✅ 证书申请成功: $main_domain"
    else
        echo "❌ 证书申请失败: $main_domain"
    fi
    echo "----------------------------------------"
done

echo "📋 最终证书列表:"
"$ACME_SCRIPT" --list

列出 acme 管理的域名:

Potobuf 的编码

编码的作用

其实当前的数值类型 (int, short, char, …)可以理解为定长编码, 但是现实中, 我们 80% 的情况下, 只使用一些小的正整数, 还有些情况下, 使用小的负数。 这样一来我们就可以压缩信息。比如: 0000 0000 0001, 我们可以压缩为 11 个 0, 一个 1。因为信息(11 个 0, 1 个 1)是连在一起的 (还有多个信息也是连在一起的), 我们需要一种方案来区分开 11 个 0一个 1, 还有区分其他信息。可以理解为需要信息边界 (自定义的概念), 而 variant 的消息边界是"每个字节的最高位(第8位)用来表示是否有后续字节", 信息内的信息边界是, 全是 0 则不记录。信息之间的消息边界是, 最高位 (第 8 位) 为 0 时, 信息的右边界。