【quantity】2 Unit 结构体(unit.rs)
一、源码
下面代码实现了一个基于类型级别的物理量单位系统,使用Rust的类型系统在编译期保证单位运算的正确性。
use typenum::{Integer, Sum, Diff, Z0, // 0P1, P2, P3, P4, // +1, +2, +3, +4N1, N2, N3 // -1, -2, -3
};
use std::marker::PhantomData;
use std::ops::{Add, Sub, Mul, Div};/// 物理量基础结构(无类型约束)| Base structure for physical quantities (unconstrained type)
///
/// 使用泛型常量参数表示SI单位制的量纲 | Uses generic const parameters to represent SI unit dimensions
/// 参数顺序:米, 千克, 秒, 安培, 开尔文, 摩尔, 坎德拉 | Parameters: meter, kilogram, second, ampere, kelvin, mole, candela
///
/// 注意:虽然结构体包含7个类型参数,但实际上表示的是7个基本单位的指数。
/// 例如:Unit<P1, Z0, N1, Z0, Z0, Z0, Z0> 表示 m¹·s⁻¹ (速度单位)
///
/// 使用PhantomData来在编译期保持类型信息而不需要运行时存储
#[derive(Debug, Clone, Copy)]
pub struct Unit<METER, KILOGRAM, SECOND, AMPERE, KELVIN, MOLE, CANDELA>(PhantomData<(METER, KILOGRAM, SECOND, AMPERE, KELVIN, MOLE, CANDELA)>
) whereMETER: Integer,KILOGRAM: Integer,SECOND: Integer,AMPERE: Integer,KELVIN: Integer,MOLE: Integer,CANDELA: Integer;impl<M, KG, S, A, K, MOL, CD> Unit<M, KG, S, A, K, MOL, CD>
whereM: Integer,KG: Integer,S: Integer,A: Integer,K: Integer,MOL: Integer,CD: Integer,
{/// 创建新物理量 | Create new quantity/// /// 返回一个特定量纲的单位实例,不包含实际值/// Returns a unit instance with specific dimensions, without actual valuepub fn new() -> Self {Self(PhantomData)}
}// 实现乘法运算重载 | Implement multiplication operator overloading
///
/// 单位相乘时,对应的量纲指数相加
/// When multiplying units, the corresponding dimension exponents are added
impl<M1, M2, KG1, KG2, S1, S2, A1, A2, K1, K2, MOL1, MOL2, CD1, CD2> Mul<Unit<M2, KG2, S2, A2, K2, MOL2, CD2>> for Unit<M1, KG1, S1, A1, K1, MOL1, CD1>
whereM1: Integer + Add<M2>,M2: Integer,KG1: Integer + Add<KG2>,KG2: Integer,S1: Integer + Add<S2>,S2: Integer,A1: Integer + Add<A2>,A2: Integer,K1: Integer + Add<K2>,K2: Integer,MOL1: Integer + Add<MOL2>,MOL2: Integer,CD1: Integer + Add<CD2>,CD2: Integer,Sum<M1, M2>: Integer,Sum<KG1, KG2>: Integer,Sum<S1, S2>: Integer,Sum<A1, A2>: Integer,Sum<K1, K2>: Integer,Sum<MOL1, MOL2>: Integer,Sum<CD1, CD2>: Integer,
{type Output = Unit<Sum<M1, M2>, Sum<KG1, KG2>, Sum<S1, S2>,Sum<A1, A2>, Sum<K1, K2>, Sum<MOL1, MOL2>, Sum<CD1, CD2>>;fn mul(self, _: Unit<M2, KG2, S2, A2, K2, MOL2, CD2>) -> Self::Output {Unit::new()}
}// 实现除法运算重载 | Implement division operator overloading
///
/// 单位相除时,对应的量纲指数相减
/// When dividing units, the corresponding dimension exponents are subtracted
impl<M1, M2, KG1, KG2, S1, S2, A1, A2, K1, K2, MOL1, MOL2, CD1, CD2> Div<Unit<M2, KG2, S2, A2, K2, MOL2, CD2>> for Unit<M1, KG1, S1, A1, K1, MOL1, CD1>
whereM1: Integer + Sub<M2>,M2: Integer,KG1: Integer + Sub<KG2>,KG2: Integer,S1: Integer + Sub<S2>,S2: Integer,A1: Integer + Sub<A2>,A2: Integer,K1: Integer + Sub<K2>,K2: Integer,MOL1: Integer + Sub<MOL2>,MOL2: Integer,CD1: Integer + Sub<CD2>,CD2: Integer,Diff<M1, M2>: Integer,Diff<KG1, KG2>: Integer,Diff<S1, S2>: Integer,Diff<A1, A2>: Integer,Diff<K1, K2>: Integer,Diff<MOL1, MOL2>: Integer,Diff<CD1, CD2>: Integer,
{type Output = Unit<Diff<M1, M2>, Diff<KG1, KG2>, Diff<S1, S2>,Diff<A1, A2>, Diff<K1, K2>, Diff<MOL1, MOL2>, Diff<CD1, CD2>>;fn div(self, _: Unit<M2, KG2, S2, A2, K2, MOL2, CD2>) -> Self::Output {Unit::new()}
}/* ================ SI基本单位(GB 3100-93 表1)| SI Base Units (GB 3100-93 Table P1) ================ *//// 长度 - 米 (m) | Length - meter (m)
///
/// 量纲表示: [L] = m¹
/// Dimension: [L] = m¹
pub type Meter = Unit<P1, Z0, Z0, Z0, Z0, Z0, Z0>;/// 质量 - 千克 (kg) | Mass - kilogram (kg)
///
/// 量纲表示: [M] = kg¹
/// Dimension: [M] = kg¹
pub type Kilogram = Unit<Z0, P1, Z0, Z0, Z0, Z0, Z0>;/// 时间 - 秒 (s) | Time - second (s)
///
/// 量纲表示: [T] = s¹
/// Dimension: [T] = s¹
pub type Second = Unit<Z0, Z0, P1, Z0, Z0, Z0, Z0>;/// 电流 - 安培 (A) | Electric current - ampere (A)
///
/// 量纲表示: [I] = A¹
/// Dimension: [I] = A¹
pub type Ampere = Unit<Z0, Z0, Z0, P1, Z0, Z0, Z0>;/// 温度 - 开尔文 (K) | Thermodynamic temperature - kelvin (K)
///
/// 量纲表示: [Θ] = K¹
/// Dimension: [Θ] = K¹
pub type Kelvin = Unit<Z0, Z0, Z0, Z0, P1, Z0, Z0>;/// 物质的量 - 摩尔 (mol) | Amount of substance - mole (mol)
///
/// 量纲表示: [N] = mol¹
/// Dimension: [N] = mol¹
pub type Mole = Unit<Z0, Z0, Z0, Z0, Z0, P1, Z0>;/// 发光强度 - 坎德拉 (cd) | Luminous intensity - candela (cd)
///
/// 量纲表示: [J] = cd¹
/// Dimension: [J] = cd¹
pub type Candela = Unit<Z0, Z0, Z0, Z0, Z0, Z0, P1>;/* ================ 包括SI辅助单位在内的具有专门名称的SI导出单位(GB 3100-93 表2)| SI Derived Units with Special Names (GB 3100-93 Table 2) ================ *//* === SI辅助单位 | SI Supplementary Units === *//// 弧度 (rad) - 平面角单位 m·m⁻¹ = 1 | Radian (rad) - plane angle unit m·m⁻¹ = 1
///
/// 量纲为1 | Dimensionless
pub type Radian = Unit<Z0, Z0, Z0, Z0, Z0, Z0, Z0>;/// 球面度 (sr) - 立体角单位 m²·m⁻² = 1 | Steradian (sr) - solid angle unit m²·m⁻² = 1
///
/// 量纲为1 | Dimensionless
pub type Steradian = Unit<Z0, Z0, Z0, Z0, Z0, Z0, Z0>;/* === 具有专门名称的SI导出单位 | SI Derived Units with Special Names === *//// 赫兹 (Hz) - 频率 s⁻¹ | Hertz (Hz) - frequency s⁻¹
///
/// 量纲表示: [T⁻¹] = s⁻¹
/// Dimension: [T⁻¹] = s⁻¹
pub type Hertz = Unit<Z0, Z0, N1, Z0, Z0, Z0, Z0>;/// 牛顿 (N) - 力 kg·m·s⁻² | Newton (N) - force kg·m·s⁻²
///
/// 量纲表示: [M L T⁻²] = kg¹·m¹·s⁻²
/// Dimension: [M L T⁻²] = kg¹·m¹·s⁻²
pub type Newton = Unit<P1, P1, N2, Z0, Z0, Z0, Z0>;/// 帕斯卡 (Pa) - 压力 N/m² = kg·m⁻¹·s⁻² | Pascal (Pa) - pressure N/m² = kg·m⁻¹·s⁻²
///
/// 量纲表示: [M L⁻¹ T⁻²] = kg¹·m⁻¹·s⁻²
/// Dimension: [M L⁻¹ T⁻²] = kg¹·m⁻¹·s⁻²
pub type Pascal = Unit<N1, P1, N2, Z0, Z0, Z0, Z0>;/// 焦耳 (J) - 能量 N·m = kg·m²·s⁻² | Joule (J) - energy N·m = kg·m²·s⁻²
///
/// 量纲表示: [M L² T⁻²] = kg¹·m²·s⁻²
/// Dimension: [M L² T⁻²] = kg¹·m²·s⁻²
pub type Joule = Unit<P2, P1, N2, Z0, Z0, Z0, Z0>;/// 瓦特 (W) - 功率 J/s = kg·m²·s⁻³ | Watt (W) - power J/s = kg·m²·s⁻³
///
/// 量纲表示: [M L² T⁻³] = kg¹·m²·s⁻³
/// Dimension: [M L² T⁻³] = kg¹·m²·s⁻³
pub type Watt = Unit<P2, P1, N3, Z0, Z0, Z0, Z0>;/// 库仑 (C) - 电量 A·s | Coulomb (C) - electric charge A·s
///
/// 量纲表示: [T I] = s¹·A¹
/// Dimension: [T I] = s¹·A¹
pub type Coulomb = Unit<Z0, Z0, P1, P1, Z0, Z0, Z0>;/// 伏特 (V) - 电位 W/A = kg·m²·s⁻³·A⁻¹ | Volt (V) - electric potential W/A = kg·m²·s⁻³·A⁻¹
///
/// 量纲表示: [M L² T⁻³ I⁻¹] = kg¹·m²·s⁻³·A⁻¹
/// Dimension: [M L² T⁻³ I⁻¹] = kg¹·m²·s⁻³·A⁻¹
pub type Volt = Unit<P2, P1, N3, N1, Z0, Z0, Z0>;/// 法拉 (F) - 电容 C/V = kg⁻¹·m⁻²·s⁴·A² | Farad (F) - capacitance C/V = kg⁻¹·m⁻²·s⁴·A²
///
/// 量纲表示: [M⁻¹ L⁻² T⁴ I²] = kg⁻¹·m⁻²·s⁴·A²
/// Dimension: [M⁻¹ L⁻² T⁴ I²] = kg⁻¹·m⁻²·s⁴·A²
pub type Farad = Unit<N2, N1, P4, P2, Z0, Z0, Z0>;/// 欧姆 (Ω) - 电阻 V/A = kg·m²·s⁻³·A⁻² | Ohm (Ω) - resistance V/A = kg·m²·s⁻³·A⁻²
///
/// 量纲表示: [M L² T⁻³ I⁻²] = kg¹·m²·s⁻³·A⁻²
/// Dimension: [M L² T⁻³ I⁻²] = kg¹·m²·s⁻³·A⁻²
pub type Ohm = Unit<P2, P1, N3, N2, Z0, Z0, Z0>;/// 西门子 (S) - 电导 Ω⁻¹ = kg⁻¹·m⁻²·s³·A² | Siemens (S) - conductance Ω⁻¹ = kg⁻¹·m⁻²·s³·A²
///
/// 量纲表示: [M⁻¹ L⁻² T³ I²] = kg⁻¹·m⁻²·s³·A²
/// Dimension: [M⁻¹ L⁻² T³ I²] = kg⁻¹·m⁻²·s³·A²
pub type Siemens = Unit<N2, N1, P3, P2, Z0, Z0, Z0>;/// 韦伯 (Wb) - 磁通量 V·s = kg·m²·s⁻²·A⁻¹ | Weber (Wb) - magnetic flux V·s = kg·m²·s⁻²·A⁻¹
///
/// 量纲表示: [M L² T⁻² I⁻¹] = kg¹·m²·s⁻²·A⁻¹
/// Dimension: [M L² T⁻² I⁻¹] = kg¹·m²·s⁻²·A⁻¹
pub type Weber = Unit<P2, P1, N2, N1, Z0, Z0, Z0>;/// 特斯拉 (T) - 磁感应强度 Wb/m² = kg·s⁻²·A⁻¹ | Tesla (T) - magnetic flux density Wb/m² = kg·s⁻²·A⁻¹
///
/// 量纲表示: [M T⁻² I⁻¹] = kg¹·s⁻²·A⁻¹
/// Dimension: [M T⁻² I⁻¹] = kg¹·s⁻²·A⁻¹
pub type Tesla = Unit<Z0, P1, N2, N1, Z0, Z0, Z0>;/// 亨利 (H) - 电感 Wb/A = kg·m²·s⁻²·A⁻² | Henry (H) - inductance Wb/A = kg·m²·s⁻²·A⁻²
///
/// 量纲表示: [M L² T⁻² I⁻²] = kg¹·m²·s⁻²·A⁻²
/// Dimension: [M L² T⁻² I⁻²] = kg¹·m²·s⁻²·A⁻²
pub type Henry = Unit<P2, P1, N2, N2, Z0, Z0, Z0>;/// 摄氏度 (℃) - 摄氏温度 (需特殊处理,量纲同开尔文,计划内部按开尔文存储,重载相应方法)
/// Celsius (℃) - Celsius temperature (requires special handling, same dimension as Kelvin, planned to store internally as Kelvin with overloaded methods)
///
/// 量纲表示: [Θ] = K¹ (与开尔文相同)
/// Dimension: [Θ] = K¹ (same as Kelvin)
pub type Celsius = Unit<Z0, Z0, Z0, Z0, P1, Z0, Z0>;/// 流明 (lm) - 光通量 cd·sr | Lumen (lm) - luminous flux cd·sr
///
/// 量纲表示: [J] = cd¹ (因为球面度无量纲)
/// Dimension: [J] = cd¹ (since steradian is dimensionless)
pub type Lumen = Unit<Z0, Z0, Z0, Z0, Z0, Z0, P1>;/// 勒克斯 (lx) - 照度 lm/m² = cd·sr·m⁻² | Lux (lx) - illuminance lm/m² = cd·sr·m⁻²
///
/// 量纲表示: [J L⁻²] = cd¹·m⁻²
/// Dimension: [J L⁻²] = cd¹·m⁻²
pub type Lux = Unit<N2, Z0, Z0, Z0, Z0, Z0, P1>;/* ================ 由于人类健康安全防范上的需要而确定的具有专门名称的SI导出单位(GB 3100-93 表3)| SI Derived Units with Special Names for Health Protection (GB 3100-93 Table 3) ================ *//// 贝可勒尔 (Bq) - 放射性活度 s⁻¹ (与Hz相同量纲) | Becquerel (Bq) - radioactivity s⁻¹ (same dimension as Hertz)
///
/// 量纲表示: [T⁻¹] = s⁻¹
/// Dimension: [T⁻¹] = s⁻¹
pub type Becquerel = Unit<Z0, Z0, N1, Z0, Z0, Z0, Z0>;/// 戈瑞 (Gy) - 吸收剂量 J/kg = m²·s⁻² | Gray (Gy) - absorbed dose J/kg = m²·s⁻²
///
/// 量纲表示: [L² T⁻²] = m²·s⁻²
/// Dimension: [L² T⁻²] = m²·s⁻²
pub type Gray = Unit<P2, Z0, N2, Z0, Z0, Z0, Z0>;/// 希沃特 (Sv) - 剂量当量 J/kg = m²·s⁻² (与Gy相同量纲) | Sievert (Sv) - dose equivalent J/kg = m²·s⁻² (same dimension as Gray)
///
/// 量纲表示: [L² T⁻²] = m²·s⁻²
/// Dimension: [L² T⁻²] = m²·s⁻²
pub type Sievert = Unit<P2, Z0, N2, Z0, Z0, Z0, Z0>;/// 新标准新增单位:卡特 (kat) - 催化活度 mol·s⁻¹ | Katal (kat) - catalytic activity mol·s⁻¹
///
/// 量纲表示: [N T⁻¹] = mol¹·s⁻¹
/// Dimension: [N T⁻¹] = mol¹·s⁻¹
pub type Katal = Unit<Z0, Z0, N1, Z0, Z0, P1, Z0>;/// 分贝 (dB) - 无量纲对数单位(需额外实现对数运算) | Decibel (dB) - dimensionless logarithmic unit (requires additional logarithmic operations)
///
/// 量纲为1 | Dimensionless
pub type Decibel = Unit<Z0, Z0, Z0, Z0, Z0, Z0, Z0>;// 测试代码
#[cfg(test)]
mod tests {use super::*;use typenum::{P1, N1, N2};#[test]fn basic_units() {let _m = Meter::new();let _kg = Kilogram::new();let _s = Second::new();let _a = Ampere::new();let _k = Kelvin::new();let _mol = Mole::new();let _cd = Candela::new();}#[test]fn derived_units() {let _hz = Hertz::new();let _n = Newton::new();let _pa = Pascal::new();let _j = Joule::new();let _w = Watt::new();let _c = Coulomb::new();let _v = Volt::new();let _f = Farad::new();let _ohm = Ohm::new();let _s = Siemens::new();let _wb = Weber::new();let _t = Tesla::new();let _h = Henry::new();let _lm = Lumen::new();let _lx = Lux::new();}#[test]fn multiplication() {// 测试单位乘法let _force: Newton = Kilogram::new() * Meter::new() / (Second::new() * Second::new());let _work: Joule = Newton::new() * Meter::new();let _power: Watt = Joule::new() / Second::new();// 电压 = 功率/电流let _voltage: Volt = Watt::new() / Ampere::new();}#[test]fn division() {// 测试单位除法let _speed: Unit<P1, Z0, N1, Z0, Z0, Z0, Z0> = Meter::new() / Second::new();let _accel: Unit<P1, Z0, N2, Z0, Z0, Z0, Z0> = Meter::new() / (Second::new() * Second::new());}#[test]fn dimensionless() {// 测试无量纲单位let _rad = Radian::new();let _sr = Steradian::new();// 弧度 = 弧长/半径 (m/m = 1)let _angle: Radian = Meter::new() / Meter::new();}#[test]fn health_units() {let _bq = Becquerel::new();let _gy = Gray::new();let _sv = Sievert::new();let _kat = Katal::new();let _db = Decibel::new();}
}
二、基础结构
Unit 结构体
pub struct Unit<METER, KILOGRAM, SECOND, AMPERE, KELVIN, MOLE, CANDELA>(PhantomData<(METER, KILOGRAM, SECOND, AMPERE, KELVIN, MOLE, CANDELA)>
) whereMETER: Integer,KILOGRAM: Integer,// ... 其他约束
-
这是一个泛型结构体,使用7个类型参数分别表示SI单位制中的7个基本量纲的指数
-
使用PhantomData来在编译期保持类型信息而不需要运行时存储
-
每个类型参数都有Integer约束,表示它们必须是整数类型
量纲表示
代码注释中解释了参数顺序和含义:
-
参数顺序:米(meter), 千克(kilogram), 秒(second), 安培(ampere), 开尔文(kelvin), 摩尔(mole), 坎德拉(candela)
-
例如:Unit<P1, Z0, N1, Z0, Z0, Z0, Z0> 表示 m¹·s⁻¹ (速度单位)
三、基本运算实现
乘法运算
impl<M1, M2, KG1, KG2, ...> Mul<Unit<M2, KG2, ...>> for Unit<M1, KG1, ...>
{type Output = Unit<Sum<M1, M2>, Sum<KG1, KG2>, ...>;fn mul(self, _: Unit<M2, KG2, ...>) -> Self::Output {Unit::new()}
}
-
实现乘法运算时,对应的量纲指数相加
-
使用typenum的Sum类型来计算类型级别的整数加法
-
例如:米(m) * 秒(s) = Unit<P1, Z0, Z0,…> * Unit<Z0, Z0, P1,…> = Unit<P1, Z0, P1,…>
除法运算
impl<M1, M2, KG1, KG2, ...> Div<Unit<M2, KG2, ...>> for Unit<M1, KG1, ...>
{type Output = Unit<Diff<M1, M2>, Diff<KG1, KG2>, ...>;fn div(self, _: Unit<M2, KG2, ...>) -> Self::Output {Unit::new()}
}
-
实现除法运算时,对应的量纲指数相减
-
使用typenum的Diff类型来计算类型级别的整数减法
-
例如:米(m) / 秒(s) = Unit<P1, Z0, Z0,…> / Unit<Z0, Z0, P1,…> = Unit<P1, Z0, N1,…>
四、SI基本单位和导出单位
代码定义了完整的SI单位系统,包括:
基本单位 (GB 3100-93 表1)
-
Meter - 米 (m)
-
Kilogram - 千克 (kg)
-
Second - 秒 (s)
-
Ampere - 安培 (A)
-
Kelvin - 开尔文 (K)
-
Mole - 摩尔 (mol)
-
Candela - 坎德拉 (cd)
具有专门名称的导出单位 (GB 3100-93 表2)
-
Radian - 弧度 (rad)
-
Steradian - 球面度 (sr)
-
Hertz - 赫兹 (Hz)
-
Newton - 牛顿 (N)
-
Pascal - 帕斯卡 (Pa)
-
Joule - 焦耳 (J)
-
Watt - 瓦特 (W)
-
Coulomb - 库仑 ©
-
Volt - 伏特 (V)
-
Farad - 法拉 (F)
-
Ohm - 欧姆 (Ω)
-
Siemens - 西门子 (S)
-
Weber - 韦伯 (Wb)
-
Tesla - 特斯拉 (T)
-
Henry - 亨利 (H)
-
Celsius - 摄氏度 (℃)
-
Lumen - 流明 (lm)
-
Lux - 勒克斯 (lx)
健康防护相关单位 (GB 3100-93 表3)
-
Becquerel - 贝可勒尔 (Bq)
-
Gray - 戈瑞 (Gy)
-
Sievert - 希沃特 (Sv)
-
Katal - 卡特 (kat)
-
Decibel - 分贝 (dB)
无、测试代码
测试代码验证了各种单位和运算的正确性:
#[test]
fn multiplication() {// 测试单位乘法let _force: Newton = Kilogram::new() * Meter::new() / (Second::new() * Second::new());let _work: Joule = Newton::new() * Meter::new();let _power: Watt = Joule::new() / Second::new();// 电压 = 功率/电流let _voltage: Volt = Watt::new() / Ampere::new();
}
这些测试验证了:
-
力的单位 (kg·m/s²) 确实等于牛顿
-
功的单位 (N·m) 确实等于焦耳
-
功率的单位 (J/s) 确实等于瓦特
-
电压的单位 (W/A) 确实等于伏特
六、设计特点
-
编译期检查:所有单位运算都在编译期进行类型检查,确保量纲正确性
-
零运行时开销:使用PhantomData,实际运行时没有任何额外开销
-
类型安全:防止不同物理量之间的错误运算
-
可扩展性:可以方便地添加新的单位或运算
七、使用示例
虽然代码中没有实际值的操作,但可以想象这样使用:
let length = Quantity::<Meter, f32>::new(5.0); // 5.0 米
let time = Quantity::<Second, f32>::new(2.0); // 2.0 秒
let speed = length / time; // 类型为 Quantity<Unit<P1, Z0, N1, ...>, f32>
这个系统可以防止诸如"5米 + 2秒"这样的非法运算,因为编译器会在编译期捕获这种类型错误。
八、总结
这段代码展示了一个强大的类型级物理单位系统实现,利用Rust的类型系统和typenum库在编译期保证物理量运算的正确性。这种设计模式在需要严格类型安全的科学计算、工程应用中非常有用。
相关文章:
【quantity】2 Unit 结构体(unit.rs)
一、源码 下面代码实现了一个基于类型级别的物理量单位系统,使用Rust的类型系统在编译期保证单位运算的正确性。 use typenum::{Integer, Sum, Diff, Z0, // 0P1, P2, P3, P4, // 1, 2, 3, 4N1, N2, N3 // -1, -2, -3 }; use std::marker::PhantomData; use st…...
OpenCV 图形API(66)图像结构分析和形状描述符------将一条直线拟合到三维点集上函数fitLine3D()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 拟合一条直线到3D点集。 该函数通过最小化 ∑iρ(ri) 来将一条直线拟合到3D点集,其中 ri 是第 i 个点与直线之间的距离,…...
uniapp: 低功耗蓝牙(BLE)的使用
在微信小程序中实现蓝牙对接蓝牙秤的重量功能,主要依赖微信小程序提供的低功耗蓝牙(BLE)API。以下是一个清晰的步骤指南,帮助你完成从连接蓝牙秤到获取重量数据的开发流程。需要注意的是,具体实现可能因蓝牙秤的协议和…...
谢飞机的Java面试之旅:从Spring Boot到Kubernetes的挑战
场景:互联网大厂Java求职 在一家知名互联网大厂的面试现场,严肃的面试官坐在谢飞机的对面,开始了面试。 第一轮:基础技术与平台 面试官: 谢先生,您能简单介绍一下Java SE 8的主要新特性吗? 谢飞机: 当然,Java 8引入了Lambda表达式、Stream API和新的日期时间API。 …...
Shadertoy着色器移植到Three.js经验总结
Shadertoy是一个流行的在线平台,用于创建和分享WebGL片段着色器。里面有很多令人惊叹的画面,甚至3D场景。本人也移植了几个ShaderToy上的着色器。本文将详细介绍移植过程中需要注意的关键点。 1. 基本结构差异 想要移植ShaderToy的shader到three.js&am…...
基于BenchmarkSQL的OceanBase数据库tpcc性能测试
基于BenchmarkSQL的OceanBase数据库tpcc性能测试 安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库和测试表配置BenchmarkSQL压测装载测试数据TPC-C压测(固定事务数量)TPC-C压测(固定时长)生成测试报告重复测试流程梳理安装Benchmar…...
Flutter 泛型 泛型方法 泛型类 泛型接口
目录 泛型简单使用 泛型类的简单使用 泛型接口的使用 通俗理解:泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持(类型校验) 泛型简单使用 main(){print(getData2("XXX"));getData2<String>("XXX");getData2<int>(1);}Str…...
边缘函数:全栈开发的最后1毫秒性能革命
一、边缘计算的时空折叠术 1. 传统CDN vs. 智能边缘网络 全球电商平台实测数据: 场景云端处理延迟边缘处理延迟转化率提升搜索建议320ms8ms18%个性化推荐450ms12ms27%实时库存检查680ms9ms42%欺诈检测920ms15ms63% 二、边缘全栈架构的量子纠缠 1. 代码的时空分布…...
网店专用版批量转账系统,覆盖淘宝、拼多多、抖店订单信息自动核对+插旗自动备注,支持微信支付宝批量转账
不少电商人在运营过程中,需要用转账工具来解决日常运营过程中的返款问题。 但在实际操作过程中,往往有很多问题。东哥在这里梳理下,方便大家了解: 1.错返/漏返的情况时有发生 为什么会错返和漏返? 实际来看&#x…...
AUTOSAR_RS_ClassicPlatformDebugTraceProfile
AUTOSAR经典平台调试、跟踪与分析支持 AUTOSAR组件调试、跟踪与分析功能详解 目录 简介ARTI核心扩展 核心特定ARTI扩展结构核心参数定义 操作系统和任务扩展 OS特定ARTI扩展任务特定ARTI扩展软件组件特定扩展 总体架构 组件结构接口定义 错误处理 默认错误跟踪器(DET) 总结 1.…...
vue中将html2canvas转成的图片传递给后台 Python Flask 服务
下面将详细介绍如何在 Vue 项目里把 html2canvas 转换得到的图片传递给后台的 Python Flask 服务。 前端(Vue)步骤 1. 安装依赖 首先要确保已经安装了 html2canvas 和 axios,若未安装,可在终端执行以下命令: npm i…...
基于深度学习的智能交通流量监控与预测系统设计与实现
基于深度学习的智能交通流量监控与预测系统设计与实现 摘要 随着城市化进程的加速和机动车保有量的激增,交通拥堵、事故频发、环境污染等问题日益严峻,对传统的交通管理方式提出了巨大挑战。智能交通系统(ITS)作为解决这些问题的…...
鸿蒙系统应用开发全栈指南
一、开发环境搭建与工具链配置 1. DevEco Studio深度解析 作为鸿蒙生态的官方IDE,DevEco Studio 4.2版本已集成ArkTS 3.0编译器与AI代码助手功能。安装过程需注意: 系统要求:Windows 10 21H2或macOS Monterey以上环境依赖:Node…...
STC32裸机项目集成FreeRTOS的实战问题解析
目录 🍅点击这里查看所有博文 随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记…...
振弦式应变计在混凝土结构长期监测中的应用与特点 久岩传感 GEO-explorer
振弦式应变计在混凝土结构长期监测中的应用与特点 久岩传感 GEO-explorer 振弦式应变计是一种专为长期埋设于水工建筑物及各类混凝土结构内部而设计的测量仪器,可广泛应用于梁体、柱体、桩基、挡土墙、隧道衬砌、桥墩及基岩等结构的应变与应力监测,同时具…...
AVFormatContext 再分析
说明 :将 avfromatContext 的变量依次打印分析,根据ffmpeg 给的说明,猜测,结合网上的文章字节写测试代码分析。 从常用到不常用依次分析 1. unsigned int nb_streams; 代表 avfromatContext 中 AVStream **streams 的个数 /** …...
力扣hot100,739每日温度(单调栈)详解
时隔多久又遇到单调栈的题了,上次记得是接雨水的题,简单讲一下单调栈的适用场景和定义。 意义:看名字就知道单调栈是一个栈里面的数据是单调的 。 解决问题: 单调栈主要用于解决需要**快速找到某个元素附近更大或更小的元素**的问题,其核心…...
怎么检测代理IP延迟?如何选择低延迟代理?
在跨境电商、数据采集以及社交媒体管理等活动中,代理IP的延迟是评估其性能的关键指标之一。高延迟的代理IP可能显著影响任务效率,特别是在需要高并发或大量请求的情况下。本文将介绍几种测试海外代理IP延迟的方法。 一、使用Ping命令测试延迟 Ping命令…...
QEMU 10.0 发布
QEMU 10.0 于 2025 年 4 月 23 日发布。此版本包含 2800 多个提交,来自 211 位作者。以下是一些主要的更新内容: CPU 和主板支持增强 x86 架构:优化了字符串操作指令,显著缩短启动时间。新增了 Intel Clearwater Forest 和 Sierra…...
C++和Java该如何选择?
我真诚的建议你选择C。因为国内Java程序员内卷太严重了,某些公司发布一个Java岗位,立刻就有几百人打招呼;而发布一个C岗位,打招呼的人数就那么十几个。 要知道,无论什么时候,只要你能够学得动C,…...
Javase 基础入门 —— 06 final + 单例
本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。 01 final 关…...
web 开发中,前端部署更新后,该怎么通知用户刷新
web 开发中,前端部署更新后,该怎么通知用户刷新? 浏览器为什么存在刷新按钮?🔘 因为需要重新加载js,css,html。但为何需要重新加载这些东西?直白点说这些东西其实就是一个文档&…...
LaTex、pdfLaTex、XeLaTex和luaLaTex的区别和联系
之前一直搞不懂这些乱七八糟的Tex到底有啥区别,不同引擎不同编译器换来换去,查了些资料又问了下AI,总算是搞懂了。 大概是这样,很久以前有人写了个Tex排版引擎,输入一些代码命令,输出dvi文件(设…...
深入解析 npm 与 Yarn:Node.js 包管理工具对比与选型指南
在 Node.js 生态中,依赖管理是项目开发的核心环节。npm(Node Package Manager)和 Yarn 作为两大主流包管理工具,虽目标一致但各有特色。本文将从技术实现、使用场景、生态整合等维度深度对比,助你选择更适合的工具。…...
PDF嵌入图片
所需依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>9.0.0</version><type>pom</type> </dependency>源码 /*** PDF工具*/ public class PdfUtils {/*** 嵌入图…...
Coding Practice,48天强训(24)
Topic 1:判断是不是平衡二叉树(递归) 判断是不是平衡二叉树_牛客题霸_牛客网 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** 代码中的类名、方法名、参数名已经指定,请勿修改&…...
技术分享 | Oracle-RAC修改IP信息
本文为墨天轮数据库管理服务团队第61期技术分享,内容原创,作者为技术顾问胡振兴,如需转载请联系小墨(VX:modb666)并注明来源。 在生产中有时候会遇到网络变更,Oracle RAC IP信息更换等情况&…...
北京工业大学25计专上岸经验分享
1.个人情况介绍 本科就读于河北双非,专业为计算机科学与技术,四级三次498,六级两次460,拿过几次校级奖学金,竞赛经历有蓝桥杯国三、数学竞赛省二。本科成绩排名靠前,保研保7排8,遗憾选择考研继…...
rabbitmq常用命令
目录 1.查看集群状态 2.查看消息对列的堆积 3.重启mq服务 4.清理mq队列消息 1.查看集群状态 rabbitmqctl cluster_status 2.查看消息对列的堆积 rabbitmqctl list_queues rabbitmqctl list_queues | grep -v 0$ 3.重启mq服务 systemctl status rabbitmq-server.servic…...
Spring Cloud Alibaba 整合 Sentinel:实现微服务高可用防护
一、Sentinel 简介 Sentinel 是阿里巴巴开源的面向分布式服务架构的流量控制组件,主要提供以下核心功能: 流量控制:针对不同的调用关系,以不同的运行指标(如 QPS、线程数、系统负载等)为基准,对…...
机器人抓取位姿检测——GRCN训练及测试教程(Pytorch)
机器人抓取位姿检测——GRCN训练及测试教程(Pytorch) 这篇文章主要介绍了2020年IROS提出的一种名为GRCN的检测模型,给出了代码各部分的说明,并给出windows系统下可以直接复现的完整代码,包含Cornell数据集。 模型结构图 github源码地址:https://github.com/skumra/robo…...
《一键式江湖:Docker Compose中间件部署108式》开篇:告别“配置地狱”,从此笑傲云原生武林!》
(🗡️江湖险恶,少侠可曾受困?) 深夜🌙,你盯着屏幕泛红的终端报错,第3次从GitHub某个无名仓库扒下残缺的docker-compose.yaml, 却发现: RabbitMQ连不上&#…...
C语言内敛函数
目录 1、内敛函数的定义 2、内敛函数的特点 2.1 减少函数调用开销 2.2 代码膨胀 2.3 编译器决定 2.4 适用于小型函数 3、示例 4、注意事项 在C语言中,内敛函数(Inline Function)是一种通过编译器优化来减少函数调用开销的机制。它通过…...
DAY8-GDB调试及打桩
GDB打桩 1.类成员函数打桩 // example1.cpp #include <iostream>class Calculator { public:int add(int a, int b) {return a b;} };int main() {Calculator calc;std::cout << "Result: " << calc.add(2, 3) << std::endl;return 0; }(…...
三、UI自动化测试03--操作方法API
目录 一、元素操作⽅法二、浏览器操作⽅法1. Part1: 设置最⼤化/⼤⼩/位置扩展: Web/APP 项⽬⻚⾯布局坐标系示意2. Part2: 后退/前进/刷新3. Part3: 关闭/退出/获取⻚⾯标题和 URL 地址 三、获取元素信息⽅法1. Part1: 获取⼤⼩/⽂本/属性值2. Part2: 判断元素是否可⻅/可⽤/可…...
人工智能—— K-means 聚类算法
目录 摘要 16 K-means 聚类算法 16.1 本章工作任务 16.2 本章技能目标 16.3 本章简介 16.4 编程实战 16.5 本章总结 16.6 本章作业 本章已完结!!! 摘要 本章实现的工作是:首先采用Python语言读取样本数据(学生的语文、数…...
使用XMLSpy校验xml是否合法
# 背景说明 近期大部分地区都在做或将要做数据迁移,基本所有产品的迁移工具底层都依赖了XSD文件对迁移的结构化数据对应XML文件进行初步校验,但有些XSD的问题提示不太容易理解,正好N年前我做XX数据上报时用过XMLSpy可以直接校验每个xml是否合…...
游戏引擎学习第248天:清理数据块显示
启动代码,构建游戏,回顾并为今天的工作做好准备 今天还需要做一些额外的调整。具体来说,我们希望能编辑一些调试值,而这个结构在当前的调试系统中已经有了,所以今天主要是清理一些无关的部分,并进行一些连…...
基于Pytest接口自动化的requests模块项目实战以及接口关联方法详解
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、基于pytest单元测试框架的规则 1.1 模块名(即文件名)必须以test_开头或者_test结尾 1.2 类名必须以Test开头且不能有init方法 1.3 用…...
腾讯 Kuikly 正式开源,了解一下这个基于 Kotlin 的全平台框架
在 3月的时候通过 《腾讯 TDF 即将开源 Kuikly 跨端框架,Kotlin 支持全平台》 我们大致知道了 Kuikly 的基本情况,Kuikly 是一个面向终端技术栈的跨端开发框架,完全基于kotlin语言开发,提供原生的性能和体验。 按照官方的说法&…...
【c++】AVL树模拟实现
简介 AVL树是最先被发明出来的自平衡二叉查找树,在1962由前苏联科学家G. M. Adelson-Velsky和E. M. Landis在论文中发表。AVL树中引入了平衡因子,每一个节点都有一个平衡因子(一般是右子树高度 - 左子树高度);AVL树要…...
具身智能模型开发训练技法之仿真平台动捕数据重定向
具身智能大模型的开发与训练高度依赖大量的数据输入,形象地说,如同需要持续的“数据喂养”。只有经过不断地进行数据积累和模型训练,具身智能大模型才能够实现自主感知、自主决策以及自主执行的完整进程。在多样化的数据形态中,真…...
手撕——贪吃蛇小游戏(下)
引言 上一章介绍了实现贪吃蛇小游戏必备的知识点。 这章,让我们一起开启手搓核弹之旅吧。 先附上贪吃蛇代码的git:贪吃蛇小游戏_4_23 Shown_shuai/learn_c - 码云 - 开源中国 (gitee.com) 上一章的窗口: 手撕——贪吃蛇小游戏࿰…...
C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载
在 C 中,类的默认成员函数是编译器自动生成的重要机制,合理利用这些函数可以简化代码编写,同时避免资源管理错误。本文将从构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心内容展开,结合具体案例深入解析。 一、默认成员…...
【Jupyter 启动时如何指定目录】
你在 Windows 系统下运行 jupyter notebook 时,遇到了 Jupyter Notebook 打开的目录不是你想要的 E:\desktop\yolo-study,而是其他路径。这可能是由于 Jupyter 的默认配置问题 或 启动路径问题 导致的。 🔍 原因分析 Jupyter 默认根目录设置错…...
PostSwigger Web 安全学习:CSRF漏洞2
CSRF 漏洞学习网站:What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF 漏洞:SameSite相关绕过 当浏览器访问服务器时,服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他…...
openharmony—4.1 softbus_tool 工具编译使用测试笔记(持续更新)
相关资料: 1.communication_dsoftbus: 暂无描述 - Gitee.com 2.dsoftbus_tool: OpenHarmony 分布式软总线样例 3.OpenAtom OpenHarmony 4.OpenAtom OpenHarmony 编译该demo之前需要大家搭建拉取openharmony源码,搭建开发环境,同时全…...
关于 Web 服务器的五个案例
一、案例题目: 1.多 IP 访问多网站(在 RHCE 练习二中的实验二) 2.多端口访问多网站 3.多域名访问多网站 4.虚拟目录和用户控制 5.https/443 二、案例实验 2.多端口访问多网站 ① 开始还是先关闭我们的防火墙以及 selinux [rootserve…...
第十二章-PHP文件上传
第十二章-PHP文件上传 一,文件上传原理 一、HTTP协议与文件上传 1. 请求体结构 当表单设置enctype"multipart/form-data"时,浏览器会将表单数据编码为多部分(multipart)格式。 Boundary分隔符:随机生成的…...
shell脚本部署disu博客
#!/bin/bash #关闭防火墙 systemctl status firewalld &>/dev/null if [ $? -ne 0 ];then systemctl stop firewalld &>/dev/null else echo “firewalld is disabled” fi #关闭selinux filegetenforce if [ “$fine” “Disabled” ];then echo “firewalld…...