使用lldb查看Rust不同类型的结构
目录
前言
正文
标量类型
复合类型——元组
复合类型——数组
函数
&str
struct
可变数组vec
Iter
String
Box
Rc
Arc
RefCell
Mutex
RwLock
Channel
总结
前言
笔者发现这个lldb挺好玩的,可以查看不同类型的结构,虽然这好像是C++的东西,
看看Rust的也可以,
笔者使用RustRover中的调试模式,在后面的代码,在打印语句哪一行打断点。
输出使用
expr <变量>
正文
参考如下
数据类型 - Rust 程序设计语言 中文版Rust 程序设计语言中文也译为 Rust 权威指南,是 Rust 官方推出的学习 Rust 的必备教程。Rust Wiki 版的 Rust 程序设计语言简体中文版将由 Rust 中文翻译项目组持续维护和更新,确保内容最新最全。https://www.rustwiki.org.cn/zh-CN/book/ch03-02-data-types.html
标量类型
标量(scalar)类型表示单个值。Rust 有 4 个基本的标量类型:整型、浮点型、布尔型和字符
比如
let a=1;println!("{a}")
输出
(lldb) expr a
(i32) a = 1
i32表示是32为的整数,当前值为1
获取其地址
(lldb) expr &a
(*mut i32) &a = 0x000000839274f5f4
加个引用符号。
对于其他类似的,比如u32,u8、true等,这些标量类型都是放在某一个地址中,没有其他东西。
使用其他命令——frame variable -L
(lldb) frame variable -L a0x000000d6151df964: (i32) a = 1
可以看到输出了地址、类型、变量、值。
在tauri中没有什么区别。
复合类型——元组
看看元组内部长什么样的
比如
let a=(1,2.0,'g');println!("{a:?}")
输出
(lldb) expr a
(tuple$<i32,f64,char>) a = (__0 = 1, __1 = 2, __2 = 'g')
可以使用 .0或者__0访问其中的数据
(lldb) expr a.__0
(i32) __0 = 1
(lldb) expr a.0
(i32) __0 = 1
看来这个元组是多个标量和在一起的类型
在rust代码中,无法使用 __0
类型 `(i32, f64, char)` 中没有字段 `__0` [E0609]
在tauri中没有什么区别。
复合类型——数组
let a=[1,2,3];println!("{a:?}")
输出
(lldb) expr a
([i32; 3]) a = ([0] = 1, [1] = 2, [2] = 3)
这里是i32类型,长度为3的数组。
在lldb访问其中的值,可以使用a[0],也可以使用a.0
(lldb) expr a[0]
(i32) [0] = 1
(lldb) expr a.0
(i32) [0] = 1
函数
如果是一个函数
fn f1()->i32{return 1;
}
fn main() {let a=f1;println!("123");}
a会是什么? 输出看看
(lldb) expr a
(*mut ) a = 0x0000000011117b00
*mut 表示是一个可变的指针
笔者想调用a,但是没成功
(lldb) expr a()
error: function call failed
不知道什么情况。
&str
let x="abc";println!("{x}");
换个字母。
看看&str的在lldb的输出
(lldb) expr x
(ref$<str$>) x = "abc" {data_ptr = 0x00007ff791a1a3b0length = 3
}
有两个东西,笔者都不知道改怎么称呼,就叫 字段,
有两个字段,一个data_ptr,显而易见,是存放数据的地址,可以修改
另一个length,就是长度了。
进去地址看看
(lldb) expr x.data_ptr
(*mut u8) data_ptr = 0x00007ff791a1a3b0
发现又是是个可变指针,指向一个u8类型的内存地址
可以加个*访问了
(lldb) expr *(x.data_ptr)
(u8) *data_ptr = 97
发现是97,这不就是a的ASCLL码,
访问一下其他的
(lldb) expr *x.data_ptr+1
(u32) = 98
(lldb) expr *x.data_ptr+2
(u32) = 99
没问题。
笔者本来想修改数据的,没想到失败了
(lldb) memory region x.data_ptr
[0x00007ff688860000-0x00007ff688883000) r--
memory region 是 LLDB 调试器中的一个命令,
用于显示指定内存地址所在的内存区域的属性和权限信息。
它会告诉你某个地址是否可读、可写、可执行,以及该内存区域的起始和结束范围。
可以发现,只有r,只有只读
笔者就算在变量设置mut,内存还是还是只读
但是,可以修改长度
(lldb) expr (x).length=1
(u64) length = 1
总之,这个&str就像一个“结构体”,感觉不是很准确,应该说像“json”。
笔者发现tauri 通信函数greet
#[command]
fn greet(name: &str) -> String {println!("Hello, {}!", name);format!("Hello, {}! You've been greeted from Rust!", name)
}
这个name,内存居然拥有写的权限
(ref$<str$>) name = "world" {data_ptr = 0x000001b36114b6f0length = 5
}
(lldb) memory region 0x000001b36114b6f0
[0x000001b361050000-0x000001b36114f000) rw-
笔者不能理解
struct
看看结构体
如下,
struct book<'a>{id: i32,name:&'a str,}let book1 = book{id: 1,name: "rust",};println!("{}", book1.name);
输出
(lldb) expr book1
(shared_state_concurrency::main::book) book1 = {id = 1name = "rust" {data_ptr = 0x00007ff7d53fa3b0length = 4}
}
真像json,比如取值——length
(lldb) expr book1.name.length
(u64) length = 4
没问题
可变数组vec
let a=vec![1, 2, 3];println!("{:?}", a);
输出
(lldb) expr a
(alloc::vec::Vec<i32,alloc::alloc::Global>) a = size=3 {[0] = 1[1] = 2[2] = 3
}
获取第一个字段——buf,a.0、a[0]、或者a.buf,都行
(lldb) expr a.buf
(alloc::raw_vec::RawVec<i32,alloc::alloc::Global>) buf = {inner = {ptr = {pointer = {pointer = 0x000002b284ccfc20}_marker = {}}cap = (__0 = 3)alloc = {}}_marker = {}
}
看看这个地址可不可以写
(lldb) memory region 0x000002b284ccfc20
[0x000002b284cb0000-0x000002b284cd0000) rw-
发现有w,可以写,改成66 77 88。
修改数据
memory write -s 4 0x000001d9e06a7430 42 4d 58
因为是i32类型的,32位,需要4个字节,
66是十进制,变成16进制是42
其他同理。写完后
(lldb) expr a(alloc::vec::Vec<i32,alloc::alloc::Global>) a = size=3 {[0] = 66[1] = 77[2] = 88
}
没问题
Iter
看看迭代器
let a=vec![1,2,3];let iter= a.iter();println!("{a:?}")
如果以json数据表示iter的结构,如下
{"iter": {"ptr": {"pointer": "0x000001dd45d299f0"},"end_or_len": "0x000001dd45d299fc","_marker": {}}
}
发现这个iter,pointer和 end_or_len都是地址,
意思就很明显了,从pointer开始,到end_or_len结束。
f0到fc ,中间有12个字节,类型是i32的,没问题。
String
let a=String::from("hello");println!("{:?}", a);
输出
(lldb) expr a
(alloc::string::String) a = "hello" {vec = size=5 {[0] = 104[1] = 101[2] = 108[3] = 108[4] = 111}
}
可以看到String里面放了一个vec,
(lldb) expr a.vec
(alloc::vec::Vec<u8,alloc::alloc::Global>) vec = size=5 {[0] = 104[1] = 101[2] = 108[3] = 108[4] = 111
}
这个vec元素的类型还是u8。
如果考虑成json结构,可能是这样的
{"a":{"vec": {"buf": {"inner": {"ptr": {"pointer": {"pointer": "0x000001651effdeb0"},"_marker": {}},"cap": {"__0": 5},"alloc": {}},"_marker": {}},"len": 5}}
}
没问题
Box
Box是智能指针,允许将一个值放在堆上而不是栈上
let a=Box::new(1);println!("{:?}", a);
输出,看看a长什么样
(lldb) expr a
(*mut i32) a = 0x00000279d903de90
确实是一个指针
获取其中的值*a
(lldb) memory region 0x00000279d903de90
error: 'jb_renderers_set_markup' is not a valid command.
[0x00000279d9030000-0x00000279d9050000) rw-
有写的权限
Rc
Rc被称为 引用计数
let a=Rc::new(1);println!("{:?}", a);
输出
(lldb) expr a
(alloc::rc::Rc<i32,alloc::alloc::Global>) a = strong=1, weak=0 {value = 1
}
这个Rc就比Box要复杂的得多
使用json表示内部的结构
{"a:rc":{"ptr": {"pointer":{"strong":{"value": {"value": 1}},"weak":{"value": {"value": 1}},"value":1}},"phantom":{},"alloc": {}}
}
表示的不是很准确,因为pointer其实是一个指针。
(lldb) expr a.ptr.pointer
(*mut alloc::rc::RcInner<i32>) pointer = 0x000001eb490a7710
拥有写的权限
(lldb) memory region 0x000001eb490a7710
[0x000001eb49090000-0x000001eb490b0000) rw-
使用一次clone,
let b=Rc::clone(&a);
发现strong变成了2
(lldb) expr a.ptr.pointer.strong.value.value
(u64) value = 2
Arc
Arc原子引用计数指针,可以安全地在多线程环境中共享数据
结构和Rc几乎一模一样,但是其中的类型不一样。笔者就不展示了
RefCell
允许你即使在有不可变引用时也可以改变数据
let a=RefCell::new(1);println!("{:?}", a);
输出用json表示
"a:RefCell":{"value": {"value": 1},"borrowed": {"value": {"value": 0}}}
这个RefCell 有点高级,笔者没有看到关于地址的东西
使用一下
{let mut b=a.borrow_mut();*b=2;println!("{:?}", a);}
在大括号里面,发现这个a的borrow的值
(lldb) expr a.borrow.value.value
(i64) value = -1
居然变成了-1,有点意思
Mutex
看看互斥锁
let a=Mutex::new(1);println!("{a:?}")
输出,用json表示结构
{"a:Mutex":{"inner": {"futex": {"v": {"value": 0}}},"poison": {"failed": {"v": {"value": 0}}},"data": {"value": 1}}
}
如果使用了lock
let lock=a.lock().unwrap();
可以发现futex的值变成了1
(lldb) expr a.inner.futex.v.value
(u8) value = 1
RwLock
let a=RwLock::new(1);println!("{a:?}")
其结构用json表示
{"a:RwLock": {"inner": {"state": {"v": {"value": 0}},"writer_notify": {"v": {"value": 0}}},"poison": {"failed": {"v": {"value": 0}}},"data": {"value": 1}}
}
和Mutex差不多,但是inner内部变了
很容易猜测,使用一次读锁,state对应的值变成1
使用一次写锁writer_notify对应的值变成1
但是,笔者使用读锁,确实如下
let b=a.read().unwrap();
(lldb) expr a.inner.state.v.value
(u32) value = 1
使用写锁
let mut b=a.write().unwrap();
发现并不是writer_notify变成1
(lldb) expr a
(std::sync::poison::rwlock::RwLock<i32>) a = {inner = {state = {v = (value = 1073741823)}writer_notify = {v = (value = 0)}}poison = {failed = {v = (value = 0)}}data = (value = 1)
}
而是这个state变成了一个很大的值,1073741823,这个值感觉不是巧合,笔者不能理解。
写锁是独占的。
笔者添加4个读锁,发现state对应的值变成了4
看来根据这个state的值可以判断是读锁还是写锁。具体实现笔者不是很清楚,必然和state有很大的关系。
Channel
看看通道
use std::sync::mpsc::channel;
use std::thread;
fn main() {let (tx, rx) = channel();thread::spawn(move || {let val = String::from("hi");tx.send(val).unwrap();});println!("123")
}
tx 和rx用json表示
{"tx": {"inner": {"flavor": {"0": {"counter": "0x0000020b23389b00"}}}},"rx": {"inner": {"flavor": {"0": {"counter": "0x0000020b23389b00"}}}}
}
可以发现,二者的结构是一模一样的。最后都指向一个地址。
意思就显而易见了,把某个消息传递到某个地址,然后再从这个地址中获取消息
这就是通道吗?有点意思。
总结
看了看,rust的不同类型的结构
感觉这个结构,无论是什么,好像都可以用json表示。有点意思
相关文章:
使用lldb查看Rust不同类型的结构
目录 前言 正文 标量类型 复合类型——元组 复合类型——数组 函数 &str struct 可变数组vec Iter String Box Rc Arc RefCell Mutex RwLock Channel 总结 前言 笔者发现这个lldb挺好玩的,可以查看不同类型的结构,虽然这好像是C的东…...
M0的基础篇之PWM学习
一、困惑 上一节课就是单纯的之配置了一个基础的定时器进行计数,计到一定的数值也就是到了一定的时间就进入中断,执行中断里面的任务,也就是一个最基础的定时的功能 这一节课的定时器产生了一个pwm波。也就是我们可以改变里面高电平的持续时间…...
win10-启动django项目时报错
前提 win10系统下已经安装了pip 和django(因为搜报错解决办法的时候,有博客说先检查下django有没有安装),另外也没有安装anaconda,没有用虚拟环境 报错如下 在pycharm执行新建app的命令python mange.py startapp app02…...
coze工作流完成行业调研报告
一、coze 是什么? Coze是由字节跳动推出的新一代AI应用开发平台,定位是零代码或低代码的AI开发平台,也被称为字节跳动版的GPTs ,国内版名为“扣子”。 Coze有国内版和国外版两个版本。国内版网址为http://www.coze.cn ÿ…...
为什么有了BST了,还要红黑树,红黑树有什么优点
BST(二叉搜索树)和红黑树都是常见的树形数据结构,但红黑树在某些方面对BST进行了优化,主要解决了BST在特定情况下可能出现的性能问题。以下是红黑树的核心优点及其存在的必要性: BST的局限性 BST的时间复杂度与树的高…...
【Linux基础】网络相关命令
目录 netstat命令 1.1 命令介绍 1.2 命令格式 1.3 常用选项 1.4 常用命令实例 1.4.1 显示所有TCP连接 1.4.2 查看路由表 1.4.3 实时监控网络接口流量 1.4.4 查看监听中的端口以及关联进程 ping命令 2.1 命令介绍 2.2 命令格式 2.3 常用选项 2.4 常用示例 ifconfi…...
DB4S:一个开源跨平台的SQLite数据库管理工具
DB Browser for SQLite(DB4S)是一款开源、跨平台的 SQLite 数据库管理工具,用于创建、浏览和编辑 SQLite 以及 SQLCipher 数据库文件。 功能特性 DB4S 提供了一个电子表格风格的数据库管理界面,以及一个 SQL 查询工具。DB4S 支持…...
多个python环境下,pip安装无法成功解决方案
问题 使用pip install xxx,安装过程很顺利且无任何报错,但是一旦在python中import xxx时,仍然提示xxx不存在。 解决方案 首先排除掉xxx包命名是否正确—— 这个非本文重点。 当已经确认xxx包命名正确,且常规通过pip install 即…...
人脸真假检测:SVM 与 ResNet18 的实战对比
在人工智能蓬勃发展的当下,人脸相关技术广泛应用于安防、金融、娱乐等诸多领域。然而,随着人脸合成技术的日益成熟,人脸真假检测成为保障这些应用安全的关键环节。本文将深入探讨基于支持向量机(SVM)结合局部二值模式&…...
求数组中的两数之和--暴力/哈希表
暴力法太好用了hhhhhhhhhhhhhhhhhhh我好爱鹅鹅鹅鹅鹅鹅呃呃呃呃呃呃呃呃呃呃 #include <iostream> #include <vector> using namespace std; int main(){ int n,target; cin>>n>>target; vector<int> nums(n); for(int i0;i<n;i){ cin>>…...
Go多服务项目结构优化:为何每个服务单独设置internal目录?
文章目录 Go多服务项目结构优化:为何每个服务单独设置internal目录?背景什么是 Go 的 internal 机制?传统根 internal 目录的局限为什么要每个服务单独设置 internal ?推荐结构示例 总结 Go多服务项目结构优化:为何每个…...
Wallcraft 3.53.0 | 提供高质量动态4D壁纸,解锁高级版,无广告干扰
Wallcraft是一款专注于提供高质量、原创壁纸的应用程序,特别是其特色的动态4D壁纸。这款应用程序不仅提供了大量免费的4K超高清壁纸和炫酷背景,还特别推出了带有视差效果的动态超高清4K壁纸及视频壁纸。用户可以根据个人喜好选择并设置这些壁纸作为手机屏…...
akshare爬虫限制,pywencai频繁升级个人做量化,稳定数据源和券商的选择
做量化,数据和交易接口是策略和自动化交易的基石,而稳定的数据和快人一步的交易接口是个人做量化的催化剂。 之前写过一篇文章:个人做量化常用的数据,多以爬虫为主,最近akshare爬虫限制,pywencai频繁升级。…...
leetcode504.七进制数
标签:进制转换 机试真题 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。 示例 1: 输入: num 100 输出: "202" 示例 2: 输入: num -7 输出: "-10" 思路:求n进制就是循环取余数,…...
OpenAI 结构改革:迈向民主化 AI 的新篇章
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Satori:元动作 + 内建搜索机制,让大模型实现超级推理能力
Satori:元动作 内建搜索机制,让大模型实现超级推理能力 论文大纲一、背景:LLM 推理增强的三类方法1. 基于大规模监督微调(SFT)的推理增强2. 借助外部机制在推理时进行搜索 (RLHF / 多模型 / 工具)3. 现有局限性总结 二…...
Python序列化的学习笔记
1. Npy&Numpy O4-mini-Cursor:如果.npy文件里包含了「Python对象」而非纯数值数组时,就必须在加载时加上allow_pickleTrue。...
如何修改进程优先级?
文章目录 1. 摘要2. 命令实现2.1 使用 renice(调整普通进程的优先级)2.2 使用 chrt(调整实时进程的优先级) 3. 代码实现 1. 摘要 在实际开发中,我们经常会遇到创建进程的场景,但是往往并不关心它的优先级…...
java命令行打包class为jar并运行
1.创建无包名类: 2.添加依赖jackson 3.引用依赖包 4.命令编译class文件 生成命令: javac -d out -classpath lib/jackson-core-2.13.3.jar:lib/jackson-annotations-2.13.3.jar:lib/jackson-databind-2.13.3.jar src/UdpServer.java 编译生成class文件如下 <...
JAVA自动装箱拆箱
引言 Java 中的**装箱(Boxing)和拆箱(Unboxing)**是自动类型转换的机制,用于在基本数据类型(如 int、long 等)和其对应的包装类(如 Integer、Long 等)之间进行转换。这种…...
Linux系统之----模拟实现shell
在前面一个阶段的学习中,我们已经学习了环境变量、进程控制等等一系列知识,也许有人会问,学这个东西有啥用?那么,今天我就和大家一起综合运用一下这些知识,模拟实现下shell! 首先我们来看一看我…...
Doris和Clickhouse对比
目录 一、Doris和Clickhouse对比**1. 底层架构****Doris****ClickHouse** **2. 运行原理****Doris****ClickHouse** **3. 使用场景****Doris****ClickHouse** **4. 优缺点对比****总结** 二、MPP架构和Shared-Nothing 架构对比**1. 什么是 MPP 架构?****定义****特点…...
思考:(linux) tmux 超级终端快速入门的宏观思维
tmux 工具集合 GitHub - rothgar/awesome-tmux: A list of awesome resources for tmux 要点: 习惯性思维的变换与宿主机之间的双向复制、粘贴手动备份全部窗口,以及还原自定义窗格提示信息TPM 插件的安装思想别名 在有些场景里,可能无法…...
JavaScript基础-全局作用域
在JavaScript中,理解不同种类的作用域是掌握这门语言的关键之一。作用域决定了变量和函数的可访问性(即可见性和生命周期)。其中,全局作用域是最基本也是最宽泛的作用域类型。本文将深入探讨全局作用域的概念、特点及其使用时需要…...
【MCAL】TC397+EB-tresos之I2c配置实战(同步、异步)
I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信。本篇文章首先从理论讲起,介绍了英飞凌TC3x系列芯片对应MCAL中对I2C驱动的定义与介绍,建议读者在阅读本篇文章之前对I2C有个简单的认识…...
电网拓扑分析:原理与应用
在现代电力系统中,电网拓扑分析是一项至关重要的技术,它为电力系统的安全、稳定和高效运行提供了坚实的基础。电网拓扑描述了电力系统中各元件(如发电机、变压器、输电线路、负荷等)之间的连接关系,通过拓扑分析&#…...
leetcode-hot-100(哈希)
写在前面 这部分官方标记为哈希,下面的代码使用的都是 C 进行实现,说到 C 中的哈希,需要了解一下 C 中的 hashtable(std::unordered_map或std::unordered_set)。 std::unordered_map std::unordered_map 是一个存储…...
音频类网站或者资讯总结
我爱音频网: 我爱音频网 - 我们只谈音频,丰富的TWS真无线蓝牙耳机拆解报告 (52audio.com) 其他更多资讯 音频行业全品类深度剖析,2024市场趋势解读汇总-EDN 电子技术设计 (ednchina.com)...
优选算法——前缀和
目录 1. 数组的中心下标 2. 除自身以外数组的乘积 3. 和为k的子数组 4. 和可被K整除的子数组 5. 连续数组 6. 矩阵区域和 1. 数组的中心下标 题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode) 题目展示: 题目分析&am…...
VScode密钥(公钥,私钥)实现免密登录【很细,很全,附带一些没免密登录成功的一些解决方法】
一、 生成SSH密钥对 ssh-keygen 或者 ssh-keygen -t rsa -b 4096区别:-t rsa可以明确表示生成的是 RSA 类型的密钥-b参数将密钥长度设置为 4096 位默认:2048 位密钥不指定-t参数,ssh -keygen默认也可能生成 RSA 密钥【确保本机安装ssh&#…...
MySQL进阶篇2_SQL优化、锁
文章目录 1 SQL优化1.1插入数据优化1.2主键优化页分裂页合并主键设计原则 1.3order by设计优化1.4group by设计优化小理解 1.5limit设计优化顺序IO和随机IO小疑惑 1.6count设计优化1.7update优化关于隐式事务事务的DML操作 锁全局锁表级锁表锁元数据锁意向锁 行级锁锁的释放条件…...
Yocto项目实战经验总结:从入门到高级的全面概览
本文面向开发者和实际项目经验者,分享经过大量实战积累的 Yocto 项目工程经验和基础技巧。本文简明但精彩,应用和观察相结合,充分适合做为全面进阶 Yocto 项目开发的实用指南。 一、入门理解:Yocto 是什么?规划如何开始…...
关于web3
主流看法,集合当前网络上的大部分资料的看法? 基于区块链运行的交易系统?面向的交易市场是基于世界的,由于将整个世界的交易联系起来,所以底层区块链就类似于一个非常大的分布式系统,由于需要在各个地区都…...
以影像为笔,劳润智在世界舞台上书写艺术之路
在光影交织中,摄影师劳润智的镜头仿佛能穿透喧嚣,捕捉人类情感最细腻的脉动。从疫情下洛杉矶裁缝日常的温馨瞬间,到象征自由与解脱的飞鸟影像,再到探索时间与空间交错的抽象作品,每一幅作品都展现了他对艺术的深度追求与对生活的温柔洞察。 劳润智的作品为他赢得了多个国际奖项…...
2025python学习笔记
一.Python语言基础入门 第一章 01.初识Python Python的起源: 1989年,为了打发圣诞节假期,Gudio van Rossum吉多范罗苏姆(龟叔)决心开发一个新的解释程序(Python维形)1991年,第一个…...
数学相关使用笔记
1、样本标准差计算步骤整理 1. 基础数据 数据样本:[44.530, 44.023, 43.837, 44.213, 44.498] 样本量:n5 2. 计算步骤 (1) 求均值 总和 44.53044.02343.83744.21344.498 221.101 均值 221.101/5 44.2202 (2) 求平方差 ① (44.530-44.2202) 0.3…...
0.环境初始化
容器化部署 Nginx 前端文件在 html\hmdp 下,挂载到 /usr/share/nginx/html 下 所以要求 nginx.conf : root /usr/share/nginx/html; index index.html; 反向代理:proxy_pass http://host.docker.internal:8081; listen 80; 因为容器内端…...
数仓-范式建模、维度建模、雪花模型、星型模型对比及其适用范围
1. 范式建模 定义 范式建模是一种基于关系型数据库设计的建模方法,遵循数据库的范式规则(如第一范式、第二范式、第三范式等),通过消除数据冗余、规范化字段和表结构来优化存储。数据被分解为多个表,通过外键关系进行…...
批量导出docker镜像
#!/bin/bash # 创建备份目录 BACKUP_DIR"docker_images_single_backup" mkdir -p "$BACKUP_DIR" # 遍历所有镜像 docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" | while read -r line; do # 提取镜像名称和ID REPO_TAG$(echo …...
棒球裁判员学习指南·棒球1号位
针对棒球裁判员的规则学习与能力提升指南,包含系统性学习路径和实践建议,帮助裁判员高效掌握规则并提升执法水平: 一、基础规则体系构建 1. 官方规则精读 核心文件:完整研读《世界棒垒球联盟(WBSC)官方规…...
vue注册用户使用v-model实现数据双向绑定
定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…...
BM14 链表的奇偶重排
20250510 题目我的解法❗️问题描述:为什么会报 OutOfMemoryError?🔍详细分析✅如何修复?✅推荐修改方案(正确版本)✅为什么这样改有效?🧪测试示例✅总结 修改 题目 我的解法 impor…...
Client 和 Server 的关系理解
client.py 和 server.py 是基于 MCP(Multi-Component Protocol)协议的客户端-服务端架构,二者的关系如下: 1. 角色分工 server.py:服务端,负责注册和实现各种“工具函数”(如新闻检索、情感分…...
Checkmk实战指南:从零构建企业级监控系统
在当今复杂的IT环境中,监控系统如同运维团队的"眼睛"和"耳朵",而Checkmk正是一款能够帮助企业实现全方位监控的开源利器。本文将带您从零开始,通过8个关键步骤构建一个功能完备的监控系统,涵盖从安装部署到高级优化的完整流程。 一、为什么选择Checkm…...
多模态大模型中的视觉分词器(Tokenizer)前沿研究介绍
文章目录 引言MAETok背景方法介绍高斯混合模型(GMM)分析模型架构 实验分析总结 FlexTok背景方法介绍模型架构 实验分析总结 Emu3背景方法介绍模型架构训练细节 实验分析总结 InternVL2.5背景方法介绍模型架构 实验分析总结 LLAVA-MINI背景方法介绍出发点…...
车载电子电器架构 --- 汽车网关概述
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
JVM对象创建内存分配
对象创建的主要流程: 检查加载类–》分配内存–》初始化–》设置对象头–》实例化,执行init方法。 在内存分配中,虚拟机将为新生对象内存分配 Minor GC : 新生代垃圾收集,特点是频繁,回收速度快; Full GC …...
project从入门到精通(五)
目录 创建资源的基本信息 在project中创建资源工作表 编辑信息详解 最大单位 标准费率与加班费率 每次使用成本 成本累算 基准日历 三类资源工作表的总结——不同的资源必须要设置的属性 除了资源名称是必须设置的之外,剩余的资源的可设置选项如下图所…...
研发效率破局之道阅读总结(5)管理文化
研发效率破局之道阅读总结(5)管理文化 Author: Once Day Date: 2025年5月10日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...
Java常用类概述
Java常用类概述 一、字符串三剑客1. String(不可变字符串)2. StringBuilder(可变,线程不安全)3. StringBuffer(可变,线程安全) 二、日期时间类(重点掌握新版APIÿ…...