Logo

site iconJustYY | 小赖子

小赖子的英国生活和资讯,以及投资和个人生活。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

JustYY | 小赖子 RSS 预览

理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型

2025-07-02 05:26:28


C++ 中的 dynamic_cast 是什么?

用途

  • 在运行时在多态类型之间安全地进行转换
  • 通常用于将基类指针转换为派生类指针(向下转型)
  • 使用 RTTI(运行时类型识别)进行类型检查

基本语法

Derived* d = dynamic_cast<Derived*>(basePtr);
  • 如果 basePtr 实际指向一个 Derived 对象,则转换成功
  • 否则,返回 nullptr

转换失败的情况

  1. 指针转换: 如果实际对象不是目标类型,则返回 nullptr
  2. 引用转换: 如果失败,会抛出 std::bad_cast 异常

指针向下转型示例

class Entity {
    virtual ~Entity() {}
};

class Player : public Entity {};
class Enemy : public Entity {};

Entity* e = new Enemy;
Player* p = dynamic_cast<Player*>(e);

if (p) {
    // 可以安全使用 p
} else {
    // p 是 nullptr
}

引用向下转型示例

try {
    Entity& e_ref = *new Enemy;
    Player& p_ref = dynamic_cast<Player&>(e_ref);
} catch (const std::bad_cast& ex) {
    // 捕获异常
}

派生类转基类(向上转型)

  • 总是安全的
  • 是隐式进行的,不需要转换语法
  • 不需要使用 dynamic_cast

向上转型示例

class Entity {
    virtual void say() {}
};

class Player : public Entity {
    void jump() {}
};

Player p;
Entity* e = &p;  // 隐式向上转型,安全
e-*gt;say();        // 正确
// e->jump();    // 错误:Entity 中没有 jump()

dynamic_cast 的使用条件

  • 基类必须是多态类(至少有一个 virtual 函数)
  • 只能用于指针或引用
  • 编译器需启用 RTTI(大多数默认启用)

static_castdynamic_cast 比较

特性 static_cast dynamic_cast
编译期检查
运行期安全
失败时可检测 ❌(行为未定义) ✅(返回 nullptr 或抛出异常)
需要虚函数

总结

  • 在处理多态类时,使用 dynamic_cast 进行类型安全的向下转型
  • 对于指针转换,请检查是否为 nullptr;引用转换请使用 try-catch 捕获异常
  • 派生类到基类的转换(向上转型)总是安全的,可隐式进行

C/C++编程

英文:Understanding dynamic_cast in C++: Safe Downcasting Explained

本文一共 372 个汉字, 你数一下对不对.
理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型 C++ C++ 学习笔记 程序设计 计算机
The post 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型 first appeared on 小赖子的英国生活和资讯.

大娃今年拿了英国JMC数学袋鼠竞赛Gold金奖, 我媳妇说这就是普娃的天花板了

2025-06-29 06:10:57


eric-2025-gold-jmc-kangaroo-scaled 大娃今年拿了英国JMC数学袋鼠竞赛Gold金奖, 我媳妇说这就是普娃的天花板了 学校 教育 数学 育儿 资讯

Eric在今年的JMC数学竞赛袋鼠杯获得金牌,JMC由XTX赞助。

每年英国的中小学都会举办各类数学竞赛,我之前也在这里介绍过。今年我家娃参加了 JMC(Junior Mathematical Challenge,初中数学挑战赛),获得了 Gold(金奖/金牌)成绩。不过我个人觉得这个年龄段拿金奖算是中等偏上的水平,但我媳妇却坚持说他只是个“普娃”。

娃今年就读于 IVC 的 8 年级,是在这所学校的最后一年。9 月份他就要升入 Perse 私立学校了。今年他参加了 JMC,也就是 7 至 8 年级学生参与的初中数学竞赛。据说再往上,9 年级及以上的学生则是参加 SMC(Senior Mathematical Challenge,高中组竞赛)。

JMC 第一轮是选择题,共 25 题。前 15 题每题 5 分(总共 75 分),第 16-25 题每题 6 分(共 60 分),总分为 135 分。
娃在第一轮错了一道“大题”和一道“小题”,最后得了 124 分,只差 1 分就能晋级奥林匹克(Olympiad)了。听说今年奥林匹克的晋级线是 125 分,如果按照去年的标准,他是够资格进入下一轮的。

晋级失败后进入了“袋鼠赛”(Kangaroo),这一轮也是选择题形式。他这次错了三题,但最终仍然拿到了 Gold Kangaroo(金牌袋鼠奖)。不过因为不是奥林匹克,我们理解这个奖项更像是一种鼓励性质的表彰。

据说 JMC 的奥林匹克下一轮是 6 道简答题,难度会有明显提升。

今年 JMC 初赛的试卷可以点这里查看难度:JMC-2025-Paper。历年的试卷和参考答案都可以在 UKMT 官网免费下载。

去年他也是 JMC 金奖,但奖状上写的是 “Gold Certificate”,而今年写的是 “Gold Kangaroo”,感觉今年的成绩更进一步。据说 5-6 年级也会参加这套试题,不过 5 年级的学生主要是以参与为主,不进入后续轮次。

2025年英国青少年数学挑战赛 (JMC) 成绩已公布(官网),证书及袋鼠竞赛资格的等级划分如下:铜牌54分,银牌73分,金牌91分,袋鼠竞赛资格100分(仅限英国)。青少年袋鼠竞赛成绩也已公布,金牌113分及以上,银牌101分及以上,铜牌85分及以上。

等级划分:
铜牌:54分
银牌:73分
金牌:91分
袋鼠竞赛资格(仅限英国):100分

青少年袋鼠竞赛成绩:
金牌:113分及以上
银牌:101分及以上
铜牌:85分及以上
奥林匹克竞赛资格:125分

2025年英国青少年袋鼠数学考试将采用60分钟、25道选择题的考试形式。排名前10%的参赛者将获得金牌证书,接下来的20%将获得银牌证书,接下来的30%将获得铜牌证书。考试题目极具挑战性,鼓励学生进行数学思维。

2025年英国青少年袋鼠数学考试的主要特点:
考试形式:60分钟,包含25道选择题。
计分方式:1-15题每答对得5分,16-25题每答对得6分。答错不扣分。
证书:金牌(前10%)、银牌(接下来的20%)、铜牌(接下来的30%)以及参与/资格证书。
难度:题目按难度排序,难度越难,越靠近题目末尾。
目的:挑战学生,鼓励数学思维。

备考:
历年试卷:利用英国数学考试(UKMT)的历年试卷和答案作为宝贵的备考资源。
在线课程:考虑参加 Mathsaurus 等在线课程,进行有针对性的备考。
注重理解:本次比赛注重解决问题,而非猜测。

IVC学校发邮件提醒参加下一轮:

Dear student,

Congratulations on earning an invitation to the Junior Kangaroo 2025 follow-on round of the Junior Maths Challenge!

This is a fantastic achievement, and we are all incredibly proud of you.

The challenge will take place in school on Tuesday, 10th June, during period 1 in K15 and will last for one hour.

Please arrive a few minutes early to settle in and prepare. Remember to bring an HB pencil and a rubber with you.

If you’d like to prepare, you can download past papers, solutions, and investigations here. I hope you find the Kangaroo a rewarding and stimulating experience.

Wishing you the best of luck—have fun and enjoy the problem-solving challenge!

亲爱的同学:

恭喜您获得2025年青少年袋鼠数学挑战赛(Junior Kangaroo 2025)后续赛的邀请!

这是一个了不起的成就,我们都为您感到无比自豪。

挑战赛将于6月10日(星期二)在K15年级第一节课在学校举行,持续一小时。

请提前几分钟到场,安顿好并做好准备。记得带上HB铅笔和橡皮。

如果您想提前准备,可以在这里下载历年试卷、答案和调查问卷。希望您觉得袋鼠数学挑战赛是一次有益且充满启发的体验。

祝您好运——玩得开心,享受解题挑战!

英国学校竞赛

本文一共 1100 个汉字, 你数一下对不对.
大娃今年拿了英国JMC数学袋鼠竞赛Gold金奖, 我媳妇说这就是普娃的天花板了. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 大娃今年拿了英国JMC数学袋鼠竞赛Gold金奖, 我媳妇说这就是普娃的天花板了 学校 教育 数学 育儿 资讯
The post 大娃今年拿了英国JMC数学袋鼠竞赛Gold金奖, 我媳妇说这就是普娃的天花板了 first appeared on 小赖子的英国生活和资讯.

哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里

2025-06-25 03:28:28


这些年我陆续折腾过一些小项目,比如博客、在线工具、STEEM见证人等。目前我手头上管理着28台服务器,大多是一些价格便宜的VPS,最近新添的一台是家里鞋柜里的一块树莓派4B(Raspberry Pi)。

我把每台服务器的信息都记录在一个 Excel 表格中,包括 IP 地址、VPS 提供商、内存、硬盘等。这些信息都是静态配置数据。

平时我也写了不少小工具和 Bash 脚本,挂在 crontab 上定期运行,用来监控一些异常情况,比如磁盘空间不足、高 CPU 负载等。一旦检测到异常,就会通过邮件及时通知我。

比如以下BASH脚本(awk/sed)检测硬盘剩余空间:

#!/bin/bash
disk=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ "$disk" -gt 90 ]; then
  echo "Disk usage above 90%" | mail -s "Disk Alert" [email protected]
fi

这两天,我在所有服务器上部署了哪吒(Nezha)监控软件的 Agent,这样我就可以在一个统一的网页后台中方便地查看每台服务器的运行状态。比如一看就知道哪台服务器硬盘快满了、CPU高负载等。

管理员登录后台后甚至可以直接通过网页进行 SSH 连接,这在我不方便用终端(比如在公司)时处理一些紧急问题非常实用。

提高安全性

由于这个后台权限非常高(支持以 root 权限 SSH 到每台服务器),所以安装完成后第一件事就是修改默认密码(初始账号是 admin/admin),建议设置一个强密码,甚至有条件可以禁用密码登陆,用OAUTH来替代。

此外,面板服务建议配置 HTTPS。默认监听端口是 8008,最好修改为其他端口。如果只是个人使用,不要公开后台的 URL。

每台服务器都需要安装 Nezha-Agent,和面板之间的通信必须通过 TLS 加密,面板服务器也需要配置好 Nginx 的反向代理。

以下在nginx设置了SSL还有反向代理到8008端口(Nezha Agent)。

server {
    listen 443 ssl;
    server_name panel.example.com;

    ssl_certificate /etc/ssl/certs/fullchain.pem;
    ssl_certificate_key /etc/ssl/private/privkey.pem;

    location / {
        proxy_pass http://localhost:8008;
        proxy_set_header Host $host;
    }
}

开源项目地址:github/nezha 监控

nezha-all-servers-dashboard 哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里 产品推荐 服务器 网站信息与统计 运维 运维 DevOps

所有28台服务器包括家里的一台树莓派4B都在一个页面上显示:健康状态:CPU、内存、硬盘、网络等。

nezha-dashboard 哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里 产品推荐 服务器 网站信息与统计 运维 运维 DevOps

游客可以看到服务器的分布还有健康状态。

nezha-monitor-ssh-1 哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里 产品推荐 服务器 网站信息与统计 运维 运维 DevOps

后台可以直接以root身份登陆服务器,很强大。

nezha-dashboard-admin-1 哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里 产品推荐 服务器 网站信息与统计 运维 运维 DevOps

管理员界面,可以看到每台服务器的IP地址还有控制台入口。

运维/DevOps

英文:

nezha-monitor-servers-offline-scaled 哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里 产品推荐 服务器 网站信息与统计 运维 运维 DevOps

服务器掉线可以很清楚的知道哪些机器从什么时候开始掉线的。

本文一共 835 个汉字, 你数一下对不对.
哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里 产品推荐 服务器 网站信息与统计 运维 运维 DevOps
The post 哪吒 Nezha 服务器监控软件: 一下子把28台服务器都放在一个页面里 first appeared on 小赖子的英国生活和资讯.

停机问题与悖论: 当逻辑凝视自身

2025-06-20 02:34:47


old-computer 停机问题与悖论: 当逻辑凝视自身 学习笔记 算法 计算机

上一个世纪的电脑

停机问题:程序能预测自己吗?


问题:给定程序 P 和输入 x,你能判断 P(x) 是否会停机,还是永远运行下去吗?

  • 由阿兰·图灵于 1936 年提出
  • 被证明为不可判定——不存在通用算法能解决所有情况
  • 本质是自指问题:程序能分析另一个程序(甚至是自己)吗?

图灵的思想实验

假设:H(P, x) 判断 P(x) 是否停机

定义下面的Python函数:

def D(P):
    if H(P, P):
        while True: pass  # 无限循环
    else:
        return 0  # 停机

那 D(D) 会发生什么?

  • 如果 D(D) 停机 → 它应该陷入死循环
  • 如果 D(D) 死循环 → 它应该停机

逻辑中的类比:自指悖论

1. 理发师悖论

  • 理发师为所有“不自己刮胡子”的人刮胡子
  • 那理发师给自己刮吗?
  • 造成矛盾 —— 和 D(D) 的情况完全相同

2. 说谎者悖论

"这句话是假的。"

  • 如果是真的 → 它就是假的
  • 如果是假的 → 它就是真的
  • 纯粹的自指,导致真假互相循环

3. 罗素悖论(集合论)

R = { x | x 是集合 且 x ∉ x }

  • R ∈ R 吗?
  • 如果是 → 不应该在 R 中
  • 如果不是 → 应该在 R 中

4. Grelling–Nelson 悖论

异描述词 = 不描述自身的形容词

  • “异描述词”是异描述词吗?
  • 如果是 → 就不是;如果不是 → 就是

5. 哥德尔不完备性定理

"这句话无法被证明。"

  • 如果能被证明 → 矛盾
  • 如果不能证明 → 它是真的但系统无法证明
  • 某些真理超出了系统本身的证明能力

6. Quine 程序

# Python 中的 Quine 示例
s = 's = {!r}\nprint(s.format(s))'
print(s.format(s))
  • 输出自身源码的程序
  • 体现了受控的自指结构

7. 决定性问题(Entscheidungsproblem)

  • 希尔伯特问:是否存在一种通用方法判定一切数学命题的真假?
  • 图灵与邱奇给出的答案:否
  • 停机问题正是其不可判定性的关键依据

总结对照表

问题 领域 核心问题 结论
停机问题 计算机科学 程序是否能分析自身? 不可判定
理发师悖论 逻辑 自指导致矛盾 悖论
说谎者悖论 哲学 真假自指 悖论
罗素悖论 集合论 集合是否包含自身 矛盾
哥德尔定理 数学逻辑 不可证明真理 不完备
Quine 程序 编程 输出自身代码 可控自指

最后的思考

  • 所有这些悖论都说明了:当一个系统试图描述自身时,往往会触及其极限
  • 自指非常强大,但也极具风险
  • 停机问题不仅是计算问题,更是逻辑深处的一面镜子

计算机科学

英文:The Halting Problem and Its Paradoxical Cousins: When Logic Looks at Itself

本文一共 691 个汉字, 你数一下对不对.
停机问题与悖论: 当逻辑凝视自身. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 停机问题与悖论: 当逻辑凝视自身 学习笔记 算法 计算机
The post 停机问题与悖论: 当逻辑凝视自身 first appeared on 小赖子的英国生活和资讯.

Bash 编程: 计算两个正整数的最大公约数/GCD

2025-06-19 05:36:19


使用 Bash 脚本计算最大公约数(GCD)

什么是 GCD?

  • GCD最大公约数(Greatest Common Divisor) 的缩写。
  • 它是能同时整除两个整数的最大正整数。
  • 例如:
    • 8 和 12 的 GCD 是 4
    • 14 和 49 的 GCD 是 7
  • GCD 常用于化简分数、密码算法以及数论中。

计算 GCD 的常见算法

1. 欧几里得算法

  • 最常见且高效的算法
  • 基于这样一个原理:gcd(a, b) = gcd(b, a % b)
  • 重复上述步骤直到 b 为 0,此时 a 即为最大公约数。

2. 减法法

  • 不断用较大的数减去较小的数,直到两个数相等。
  • 结果就是它们的 GCD。
  • 相比欧几里得算法,这种方法在处理大数时效率较低。

3. 二进制 GCD 算法(Stein 算法)

  • 使用位运算代替除法运算。
  • 在某些硬件中更高效,因为避免了除法和取模操作。
  • 基于以下规则:
    • 若两个数都为偶数:gcd(a, b) = 2 * gcd(a/2, b/2)
    • 若其中一个是偶数,则将其除以 2
    • 若两个数都为奇数,且 a > b,则 gcd(a, b) = gcd((a - b)/2, b)

功能概述

  • 该脚本计算两个数字的最大公约数(GCD)
  • 确保输入参数是正整数
  • 当输入缺失或无效时,提供用法说明

脚本功能解释

  • gcd() 函数: 使用循环和取模操作实现欧几里得算法。
  • 参数个数检查: 确保用户传入了两个参数,否则提示用法并退出。
  • 正则校验: 使用 Bash 正则判断两个输入是否为纯数字。
  • 范围校验: 确保两个数字都大于零。
  • 函数调用: 调用 gcd 函数并输出结果。

计算两正整数最大公约数GCD的BASH函数

以下是计算GCD的BASH代码

#!/bin/bash

## 计算两个数的最大公约数

gcd() {
    local a=$1
    local b=$2

    while [ $b -ne 0 ]; do
        local temp=$b
        b=$((a % b))
        a=$temp
    done

    echo $a
}

# 检查是否传入了两个参数
if [ $# -ne 2 ]; then
    echo "用法: $0 <number1> <number2>"
    exit 1
fi

## 检查两个参数是否为正整数
if ! [[ $1 =~ ^[0-9]+$ ]] || ! [[ $2 =~ ^[0-9]+$ ]]; then
    echo "两个参数必须为正整数。"
    exit 1
fi
if [ $1 -le 0 ] || [ $2 -le 0 ]; then
    echo "两个参数都必须大于零。"
    exit 1
fi

# 调用 gcd 函数并打印结果
result=$(gcd "$1" "$2")
echo $result

输入校验流程

  1. 检查是否传入了两个参数
  2. 使用正则表达式确保输入为整数:=~ ^[0-9]+$
  3. 确保两个数都大于 0

使用示例

两个互质整数co-prime,它们的最大公约数为1。

命令 输出
./gcd.sh 24 36 12
./gcd.sh 7 13 1

小提示:

  • 使用 chmod +x gcd.sh 让脚本可执行
  • 然后运行:./gcd.sh 12 30

BASH小技巧

英文:Compute GCD in Bash with Input Validation

本文一共 599 个汉字, 你数一下对不对.
Bash 编程: 计算两个正整数的最大公约数/GCD. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c Bash 编程: 计算两个正整数的最大公约数/GCD BASH BASH 学习笔记 数学 程序设计 算法 计算机
The post Bash 编程: 计算两个正整数的最大公约数/GCD first appeared on 小赖子的英国生活和资讯.