包含关键字 typecho 的文章

大家好,我是数字游民Hugo

今天简要聊聊AI引发的效率革命与当下火爆的OPC一人公司,希望能对你有所启发。

AI时代的企业效率革命:小团队如何创造千亿市值?

1. 颠覆性案例:极少数人创造巨大价值

  • 10人团队:生物制药公司“脑再生”以10名员工创造440亿市值,跻身胡润中国500强
  • 16人奇迹:能源企业“电能实业”仅16人达成1000亿市值,人效比碾压传统巨头
  • 榜单现象:胡润500强中,10家企业员工总数不足500人,却稳居行业第一梯队

2. 高价值企业的共同特征

  • 技术密集型赛道

    • 生物制药(如脑再生、药捷安康)
    • 芯片技术(东芯股份、信骅科技)
    • 人工智能(稀宇科技、云知声)
  • 核心竞争力:依赖技术壁垒而非规模效应,强调“不可替代的稀缺能力”

3. 传统商业逻辑的崩塌

  • 组织臃肿的代价

    • 管理者陷入“招人-内耗-成本激增”恶性循环
    • 核心业务被稀释,利润被人力成本吞噬
  • AI的规则改写

    • 真实案例1:某CEO的AI员工24小时完成6人三周工作量
    • 真实案例2:一人公司“老板+AI”组合单周创收数百万

4. 未来趋势:极简组织成为常态

  • 经济学家预言:朱嘉明曾预测“未来五年,许多公司仅需1-2人”
  • 现实印证:AI工具已使个人生产力对标传统团队成为可能
  • 终极问题:在AI赋能下,个体创业者能否突破千亿市值天花板?

如果觉得对你有帮助,欢迎点赞、在看并转发给需要的朋友👫。

另外,为助你拥抱驾驭AI,附送你一张国内头部AI社群的免费三天体验卡,可以扫码领取:

本文由mdnice多平台发布

应用部署和生命周期管理工具Argo CD发布 3.3 版本,达到了一个新的里程碑。此次发布扩展了这个广受欢迎的 GitOps 持续交付工具的能力,同时解决了运维人员长期面临的几个痛点。

 

Argo CD 3.3 是一个实用性版本,主要是填补了 GitOps 日常操作中长期存在的几项空白,架构方面没什么变化。该候选版本的重点是删除操作安全性、认证体验、存储库性能以及对集群和自动扩展资源的更精细化控制。

公告博文中,软件工程师Peter Jiang将 PreDelete 钩子说成是 Argo CD 3.3 中最显著的变化,完善了当前 PreSync 钩子、Sync 钩子和 PostSync 钩子组成的生命周期。在博文中,Jiang 解释说,用户历来依赖外部脚本、手动清理或 Kubernetes 收集器来做应用程序删除准备,但当团队需要可预测的拆除序列时,这些方法往往显得脆弱而不透明。PreDelete 钩子允许团队定义 Kubernetes 资源,如必须成功运行 Argo CD 才能继续删除应用程序其余资源的作业,钩子执行失败便会阻止删除。在实践上,这将删除操作变成了一个明确的生命周期阶段,可以包括数据导出、流量引流或通知依赖系统。

 

该版本的第二个主要功能是 OIDC 后台令牌刷新,解决了用户将 Argo CD 与 Keycloak 等提供商集成时经常遇到的问题。以前,即使工程师正在积极工作,短暂的访问令牌有效期也会导致他们被强制退出用户界面,在长时间的调试或部署过程中,这很容易引发挫败感。新机制会在令牌过期前在后台自动刷新 OIDC 令牌,并支持配置刷新阈值,即剩余有效期达到多少时触发刷新。Deepak Yadav在LinkedIn上发文时将此列为最突出的改进之一,并将其概括为“告别随机注销”,充分体现了该问题曾引发的强烈不满。

 

该版本还增加了 Git 存储库浅克隆选项。启用时,Argo CD 只获取所需的提交历史记录,而不是整个存储库。公告指出,这可以将大型单体存储库或长期项目的获取时间从分钟减少到秒。这个功能是作为存储库配置中的一个标识实现的,如果运维人员经过评估觉得不需要完整的历史记录,就可以选择这项性能优化。社区讨论将浅克隆与 PreDelete 钩子和 OIDC 刷新视为 3.3 版本的三大亮点。

 

公告还提到了对 Source Hydrator 的改进。这是 Argo CD 处理复杂配置工作流程时越来越核心的部分。新版本引入了内联参数支持——团队不再需要为每个配置更改提交单独的参数文件,改进了对单体存储库布局的支持,并通过优化性能避免了不必要的存储库服务器调用。Jiang 将这些变化归功于社区贡献者,并将此说成是持续优化 Argo CD 以适应大规模配置管理的举措。这些更新使 Source Hydrator 与先前开发的 ApplicationSets 机制形成互补,共同应对多应用部署中日益复杂的配置挑战。

 

在 3.3 版本中,对集群资源的细粒度控制也得到了改进。该版本扩展了 AppProjects 中的 clusterResourceWhitelist,使得访问不仅可以通过 API 分组和种类进行限制,还可以通过个别资源的名称进行限制。这使得一个项目只需要管理特定的 CustomResourceDefinitions ,而不是所有的 CRD 。公告指出,这是长期以来用户一直都有的一个需求,尤其是那些在共享集群上维护多个团队和控制器的用户。LinkedIn 上有评论指出,该变更属于 RBAC 控制机制的整体优化,更精确的 CRD 作用域划分能更好地契合组织安全策略与职责分离原则。

 

该版本还提供了对 KEDA(Kubernetes 事件驱动自动扩展项目)的一级支持。现在,Argo CD 可以直接从用户界面暂停和恢复 KEDA ScaledObjects 和 ScaledJobs,并了解 ScaledJob 的健康状态,取代了此前通用的“未知”指示器。社区反馈指出,该功能在维护窗口和调试场景中尤为实用——通过与管理其他应用资源相同的 GitOps 控制面板,运维人员可临时暂停事件驱动型工作负载。

 

除了这些重要特性外,Jiang 还列出了一系列的小改进,包括:使用 Redis 凭据的卷挂载、添加 Ceph CRD 健康检查、改进 ApplicationSet 用户界面、支持 CLI 按 API 分组过滤、可配置的 Kubernetes API 超时以及围绕刷新行为和视图扩展的几项用户界面改进。

 

总体而言,v3.3 给人的感觉是一个由实际运营痛点塑造的版本。向 Argo CD 的维护者和贡献者表示祝贺——他们向前迈出了坚实的一步。

 

—— Deepak Yadav

 

除 Argo CD 之外,Flux是另一个由 CNCF 孵化的重点项目,同样致力于实现 GitOps for Kubernetes,但它侧重于控制器驱动模型,而不是集中式 Web 应用程序。Flux 运行一组控制器,用于协调 Git 、 Helm 存储库、容器注册表与集群。它原生支持 Helm 和 Kustomize,并通过 Weave GitOps 界面提供可选的可视化功能(而非捆绑式仪表盘)。它运用资源修剪和保护性注解等机制实现安全的删除操作,允许运维人员在协调过程中阻止特定的对象被移除,并且可以调整 Flux 如何清理版本控制中消失的资源。

 

通常,Argo CD 和 Flux 被视为互补关系,而非严格的竞争关系。Argo CD 内置的 UI 以及与 Argo Rollouts 的紧密集成,使其对追求可视化控制和一流金丝雀/蓝绿部署的企业极具吸引力。而 Flux 的 GitOps 工具包提供了一个基于命令行界面的可组合架构,能够监控镜像库并自动更新配置文件。在 Reddit 上,有用户说已经将这两款工具一同使用。例如,使用 Flux 来管理核心集群基础设施,而使用 Argo CD 来协调应用程序级别的部署。

 

Argo CD 3.3.2 现已发布

 

声明:本文为 InfoQ 翻译,未经许可禁止转载。

 

原文链接:https://www.infoq.com/news/2026/02/argocd-33/

不知道有没有人和我一样,被流量不够用、月租虚高的问题困扰了很久😭 尤其是学生党在宿舍、出差党跑外勤、租房党没装宽带,流量就是刚需,但市面上的流量卡五花八门,稍不注意就踩坑——要么宣传的“大流量”全是定向,要么首月便宜次月暴涨,要么限速阈值低到离谱,甚至还有隐形合约,注销要扣钱。

我个人因为经常会买流量卡作为副卡,也被坑过,因此整理出这份避坑+推荐指南,不管你是每月用几十G还是几百G,不管是追求低价还是稳定,都能找到适合自己的,最后也会分享我实测后觉得靠谱的几款。

关注以下任意仓库均可:


更多详见《老卫的流量卡推荐指南》https://github.com/waylau/data-sim-card-recommendation

一、先搞懂3个核心问题,避免90%的坑

很多人买流量卡被坑,本质是没看清这3点,被商家的宣传话术带偏了,先把这几点记牢,再选卡绝对不踩雷:

  • 分清“通用流量”和“定向流量”:这是最容易踩坑的点!很多卡宣传“200G流量”,其实180G都是定向(只能用某几个APP),通用流量只有20G,刷视频、逛网页根本不够用。选卡时一定要看清楚,通用流量占比越高越好,定向流量再多,用不上也等于白搭。
  • 看明白“优惠期”和“合约期”:几乎所有低价流量卡都有优惠期(一般6-12个月),优惠期内月租很便宜,但优惠期结束后会恢复原价(可能从9元涨到29元、39元),一定要提前看清楚优惠期时长和后续原价。另外,部分卡有合约期(比如6个月),合约期内注销要扣违约金,短期用的话一定要选无合约的。
  • 确认“限速规则”:没有真正“不限速”的流量卡(这是行业红线,商家说不限速都是假的),大部分卡是通用流量用满一定额度后限速(比如100G后限速3Mbps,200G后限速1Mbps),限速后能正常聊微信、刷文字,但看视频会卡顿,根据自己的使用量选限速阈值就行。

二、不同人群最优选择(实测靠谱,无套路)

我根据不同使用场景,整理了3类人群的适配卡,每一款都实测过,没有隐形消费,大家可以对号入座:

1. 学生党(预算低、流量需求大)

核心需求:低价、通用流量足、无合约(寒暑假可以注销),适合宿舍没宽带、日常刷视频、玩游戏的学生。

适配类型:月租19元以内,通用流量50-100G,定向流量100-200G,优惠期12个月,无合约,支持线上注销,激活首充50元可享优惠,限速阈值100G(日常用完全够,不怎么卡顿)。

2. 出差党(全国通用、稳定不卡顿)

核心需求:全国通用、信号稳定、不限地区使用,偶尔跨省出差,需要随时联网办公、导航。

适配类型:月租29元以内,通用流量100-150G,定向流量不限,优惠期12个月,支持全国漫游,无地区限速(部分偏远地区除外,以运营商为准),限速阈值200G,适合高频使用。

3. 租房党(短期使用、灵活注销)

核心需求:无合约、可随时注销、流量够用,暂时没装宽带,或者租房时间不确定,不想被绑定。

适配类型:月租9-19元,通用流量30-50G,定向流量100G,优惠期6个月,无合约,激活无强制首充,用完可直接线上注销,适合短期过渡使用。

三、绝对不能碰的“坑卡”(避坑指南)

实测过程中,遇到很多套路卡,大家看到以下几种情况,直接pass,别浪费时间:

  1. 宣传“永久0元”“无限流量”“不限速”的:全是虚假宣传,要么首月免费,次月暴涨,要么流量用一点就限速,甚至直接断网。
  2. 不说明优惠期和原价的:大概率是优惠期3个月,之后月租涨到39元以上,而且可能有隐形合约,注销要扣钱。
  3. 通用流量占比低于30%的:比如200G流量里,通用只有50G,定向150G,看似流量多,实际根本不够用。
  4. 需要线下注销、或者注销要收手续费的:现在正规流量卡都支持线上注销(运营商APP操作),需要线下跑营业厅的,大概率是小众卡,售后没保障。

四、测评记录集合

选流量卡,没有最好的,只有最适合自己的,不用追求“流量越多越好”,够用、稳定、无套路才是关键。另外,一定要通过正规渠道申请,避免买到物联网卡(不能接打电话、信号差、容易被封)。

以下我的流量卡测评记录集合

我把实测后靠谱的流量卡整理成了清单放在最后,包含详细的月租、流量、优惠期、注销规则,避免大家再花时间筛选。

五、线上销户指南

联通、电信、移动、广电、随行WiFi的流量卡,都支持线上销户,但有坑,大家一定要看 carefully:

由于流量卡运营周期不确定,短则几天就下架,因此本仓库也会尽量及时更新,增删上架下架的产品。
大家看中好的流量卡及早下手。

基于YOLOv8的5种玻璃缺陷识别(破裂/打胶/起霜/污染/未加工)(中英文双版) | 附完整源码与效果演示

引言

随着工业自动化和智能检测技术的快速发展,计算机视觉在工业质检领域的应用越来越广泛。玻璃作为一种重要的工业材料,其质量状况直接影响产品的性能和使用寿命。传统的玻璃检测方法主要依赖人工目检,存在效率低、主观性强、漏检率高等问题。基于深度学习的目标检测技术为玻璃状况自动检测提供了新的解决方案。
在这里插入图片描述

本文介绍了一种基于YOLOv8的玻璃状况识别系统,该系统能够自动识别玻璃的五种常见缺陷:玻璃破裂、玻璃打胶、玻璃起霜、玻璃污染和玻璃未加工。通过采用先进的深度学习算法,实现了对玻璃产品的高精度、高效率检测,为工业生产提供了可靠的质量保障手段。

背景意义

玻璃制品在建筑、汽车、电子、家居等众多领域有着广泛应用,其质量状况直接影响产品的安全性和可靠性。传统的玻璃检测方法存在以下问题:

  1. 效率低下:人工检测速度慢,无法满足大规模生产需求
  2. 主观性强:检测结果受检测人员经验和状态影响,一致性差
  3. 成本高昂:需要大量人力投入,检测成本高
  4. 漏检率高:人工容易疲劳,导致漏检和误检

基于深度学习的自动检测技术具有以下优势:

  • 高精度:通过深度学习模型能够准确识别各种缺陷
  • 高效率:自动化检测速度快,能够满足生产线需求
  • 客观性:检测结果不受主观因素影响,一致性好
  • 成本效益:长期使用可大幅降低检测成本

项目视频展示

https://www.bilibili.com/video/BV1WBPszME7J/
在这里插入图片描述
包含:
📦完整项目源码
📦预训练模型权重
🗂️数据集

项目详细效果展示

在这里插入图片描述
在这里插入图片描述

数据集信息

本项目使用专门构建的玻璃状况数据集,包含五种常见的玻璃缺陷类型:

  1. 玻璃破裂:玻璃表面出现的裂纹、破碎等损伤
  2. 玻璃打胶:玻璃边缘或表面的胶水处理情况
  3. 玻璃起霜:玻璃表面出现的雾状、模糊现象
  4. 玻璃污染:玻璃表面的污渍、指纹、灰尘等污染物
  5. 玻璃未加工:未经处理的原始玻璃状态

数据集采用YOLO格式的标注,每个样本都有对应的边界框标注信息。训练集、验证集和测试集按照合理比例划分,确保模型训练和评估的可靠性。数据集涵盖了不同光照条件、不同角度、不同背景下的玻璃图像,增强了模型的泛化能力。
在这里插入图片描述

本项目主要工作

本项目的主要工作包括以下几个方面:

  1. 数据集构建与预处理

    • 收集和整理玻璃状况图像数据
    • 数据清洗和标注
    • 数据增强和预处理
  2. 模型设计与实现

    • 基于YOLOv8架构的模型设计
    • 模型训练和参数优化
    • 模型评估和调优
  3. 系统开发与部署

    • 开发检测算法和推理引擎
    • 构建用户友好的检测界面
    • 实现实时检测功能
  4. 性能优化与改进

    • 模型轻量化处理
    • 检测速度优化
    • 准确率提升

国内外研究现状

在工业检测领域,基于深度学习的目标检测技术已经得到了广泛应用。国外研究方面,Google、Facebook、Microsoft等科技公司在大规模目标检测算法方面取得了显著成果。YOLO系列算法因其速度快、精度高的特点,在工业检测领域得到了广泛应用。

国内研究方面,众多高校和研究机构在工业质检领域开展了深入研究。清华大学、北京大学、浙江大学等高校在深度学习与工业检测结合方面取得了重要进展。特别是在制造业、电子行业等领域的应用研究较为成熟。
在这里插入图片描述

在玻璃检测领域,国外研究主要集中在高精度检测算法和自动化生产线集成方面。国内研究则更侧重于实际应用和产业化推广,结合国内制造业特点开发适合国情的检测方案。

目前,基于YOLOv8的玻璃状况识别研究还处于发展阶段,具有很大的研究潜力和应用价值。

快速开始-部署指南

环境要求

  • Python 3.8+
  • PyTorch 1.9+
  • CUDA 11.0+
  • Ultralytics YOLOv8

安装步骤

  1. 克隆项目代码

    git clone [项目地址]
    cd 项目目录
  2. 安装依赖包

    pip install -r requirements.txt
  3. 下载预训练模型

    wget [模型下载地址]
  4. 配置数据集路径
    修改data.yaml文件中的路径配置:

    path: main/datasets
    train: train/images
    val: val/images
    test: test/images
    nc: 5
    names:
      - 玻璃破裂
      - 玻璃打胶
      - 玻璃起霜
      - 玻璃污染
      - 玻璃未加工
  5. 开始训练

    python train.py
  6. 模型推理

    python detect.py --source image_path_or_video_path

使用说明

  1. 训练模型:使用训练数据集对模型进行训练
  2. 评估模型:使用验证集评估模型性能
  3. 模型推理:对新的图像或视频进行检测
  4. 结果可视化:查看检测结果和性能指标
    在这里插入图片描述

技术亮点

1. 先进的YOLOv8架构

本项目采用最新的YOLOv8目标检测算法,相比传统算法具有以下优势:

  • 更高的检测精度:采用更先进的网络结构和损失函数
  • 更快的检测速度:优化的网络设计,支持实时检测
  • 更好的泛化能力:通过数据增强和正则化提升模型泛化性能

2. 专业的数据集构建

针对玻璃检测特点,构建了专业的数据集:

  • 多场景覆盖:涵盖不同光照、角度、背景条件
  • 高质量标注:精确的边界框标注
  • 数据增强:旋转、翻转、亮度调整等增强方法

3. 实时检测能力

系统支持实时检测功能:

  • 高帧率处理:支持30fps以上的实时检测
  • 多线程处理:优化的多线程处理架构
  • 内存优化:高效的内存管理机制

4. 易于部署和使用

系统具有良好的可用性:

  • 简洁的API接口:提供简单易用的接口
  • 详细的文档:完整的使用文档和示例
  • 跨平台支持:支持Windows、Linux等操作系统

总结

本项目基于YOLOv8深度学习算法,成功实现了玻璃状况的自动识别。通过构建专业的数据集和优化模型参数,系统在检测精度和速度方面都取得了良好的效果。

主要成果包括:

  1. 实现了五种玻璃缺陷的准确识别
  2. 达到了较高的检测精度和召回率
  3. 支持实时检测功能,满足工业生产需求
  4. 提供了完整的部署和使用方案

未来工作将进一步优化模型性能,扩展检测类别,提高系统的实用性和可靠性。该技术在工业质检领域具有广阔的应用前景,能够为制造业提供高效、可靠的质量检测解决方案。

系统架构图

graph TD
    A[图像输入] --> B[图像预处理]
    B --> C[YOLOv8模型]
    C --> D[特征提取]
    D --> E[目标检测]
    E --> F[结果输出]
    F --> G[可视化展示]
    F --> H[数据统计]
    
    subgraph 模型训练
        I[数据集] --> J[数据增强]
        J --> K[模型训练]
        K --> L[模型评估]
        L --> M[模型优化]
    end
    
    subgraph 系统部署
        N[模型加载] --> O[推理引擎]
        O --> P[结果处理]
        P --> Q[用户界面]
    end
    
    M --> N
    Q --> G
    Q --> H

从「AI For What」到「Value From AI」,100+可落地实践案例打通 AI 实战最后一公里!

4 月 16 日-4 月 18 日,QCon 全球软件开发大会将在北京举办。本届大会锚定 Agentic AI 时代的软件工程重塑,聚焦 Agentic AI、多智能体协作、算力优化、技术债治理、多模态和 AI 原生基础设施等前沿话题,邀请来自腾讯、阿里、百度、华为、蚂蚁、小米、网易等企业技术专家,带来百余项真实落地案例,系统性分享前沿洞察与实战干货,以技术共创探索 AI 落地新路径。

汽车之家算法平台部负责人马宝昌已确认出席 “Agentic Engineering” 专题,并发表题为汽车之家 AI 助手多 Agent 设计与多阶段优化策略的主题分享。随着汽车之家 AI 助手的快速发展,多 Agent 架构成为提升系统智能化水平的关键技术。然而,多 Agent 系统面临协同效率低、训练复杂度高、优化策略单一等挑战,限制了 AI 助手的规模化应用。本次演讲将重点介绍汽车之家 AI 助手的多 Agent 设计架构及多阶段优化策略,通过真实业务数据和可复现的技术方案,展示如何通过多 Agent 协同和分阶段优化提升 AI 助手的决策能力和用户体验,推动汽车之家 AI 助手从单一功能向智能生态演进。

马宝昌,目前作为汽车之家大模型负责人,主要负责汽车行业大模型落地方面的工作。北京大学智能系硕士,10 余年 NLP 算法研究和落地经验。他在本次会议的详细演讲内容如下:

演讲提纲

  1. 汽车之家 AI 助手 Agent 架构设计

  • 智能体平台与生态建设:面向汽车行业的智能体生态平台,包括 SOP 编排、行业 MCP 工具、生态子 Agent 等

  • RAG 与 KAG 结合的知识检索架构:多源数据处理与质量判别流程,满足深度逻辑推理和业务准召要求

  • 汽车之家 AI 助手多 Agent 设计:记忆、看选、买车、用车等子 Agent 设计方案

2. 层次评测体系建设

  • 多层次评测架构设计:应用层、组件层、模型层、知识层四层评测架构

  • 评测指标体系:分层评测指标与业务价值指标

  • 从标注到自动化的评测流程:从主观评测到客观评测再到持续优化的完整流程演进

3. 基于多阶段强化学习的优化流程

  • 非参数优化策略:提示词优化、记忆机制设计和工具描述优化等策略

  • 单 Agent 强化学习策略:从产品定义回复的标准答案到业务真实反馈的多阶段优化流程

  • 多 Agent 协同训练方法:Reward 设计与多 Agent 强化学习训练框架性能优化

4. 智能体性能与成本优化

  • 模型推理性能优化:模型蒸馏、量化、投机采样、MTP 等方法

  • Agent 端到端相应速度:工具合并、工具/Agent 并行以及思考长度优化

这样的技术在实践过程中有哪些痛点?

  1. 数据需求:高质量多 Agent 协同反馈数据获取成本高

  2. 计算成本:多 Agent 并行训练的成本高

  3. 系统复杂度:多模块(比价 Agent、推荐 Agent、服务 Agent)协同训练的工程复杂度高

演讲亮点

  1. RAG+KAG 结合技术:多 Agent 知识检索架构,应对复杂场景检索

  2. 多阶段多 Agent 强化学习策略:基于多阶段 Reward 设计的强化学习训练流程

听众收益

  1. 掌握多阶段强化学习训练方法:学习从产品定义到在线优化的完整训练流程

  2. 了解多层次评测体系建设:应用-组件-模型-知识的全方位评测方法论

除此之外,本次大会还策划了Agentic Engineering多模态理解与生成的突破记忆觉醒:智能体记忆系统的范式重塑与产业落地具身智能与物理世界交互Agent Infra 架构设计AI 重塑数据生产与消费AI 原生基础设施AI 驱动的技术债治理小模型与领域适配模型大模型算力优化Agent 可观测性与评估工程AI for SRE等 20 多个专题论坛,届时将有来自不同行业、不同领域、不同企业的 100+资深专家在 QCon 北京站现场带来前沿技术洞察和一线实践经验。

更多详情可扫码或联系票务经理 18514549229 进行咨询。

最近有了老二要从月子中心回家了,准备前两个月请个住家的保姆。于是又想把放柜子里吃灰(主要是 24 小时对着家里,怕隐私问题)的小米摄像头装回去,但还是心有不惬。闲来无事顺道去小米商城逛了逛最新的摄像头,看了看最新的 4 代系列好像都标配了可以智能联动控制的物理遮挡板。

果断入手,几天后看看好用不好用.

题⽬描述

给定⼀个⼆叉搜索树, 找到该树中两个指定节点的最近公共祖先。

  1. 对于该题的最近的公共祖先定义:对于有根树T的两个结点p 、q ,最近公共祖先LCA(T,p,q)表示⼀个结点x ,满⾜x 是p 和q 的祖先且x 的深度尽可能⼤。在这⾥,⼀个节点也可以是它⾃⼰的祖先.
  2. ⼆叉搜索树是若它的左⼦树不空,则左⼦树上所有结点的值均⼩于它的根结点的值; 若它的右⼦树不空,则右⼦树上所有结点的值均⼤于它的根结点的值
  3. 所有节点的值都是唯⼀的。
  4. p 、q 为不同节点且均存在于给定的⼆叉搜索树中。

如果给定以下搜索⼆叉树: {7,1,12,0,4,11,14,#,#,3,5} ,如下图:

示例1
输⼊: {7,1,12,0,4,11,14,#,#,3,5},1,12
输出: 7
说明:节点1 和 节点12的最近公共祖先是7

示例2:
输⼊: {7,1,12,0,4,11,14,#,#,3,5},12,11
输出: 12
说明:因为⼀个节点也可以是它⾃⼰的祖先.所以输出12

思路及解答

迭代遍历

二叉搜索树(BST)的特性,通过迭代查找公共祖先,根据节点值大小关系,决定向左子树或右子树查找

public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return null;
        
        TreeNode current = root;
        
        while (current != null) {
            // 如果p和q的值都小于当前节点,LCA在左子树
            if (p.val < current.val && q.val < current.val) {
                current = current.left;
            } 
            // 如果p和q的值都大于当前节点,LCA在右子树
            else if (p.val > current.val && q.val > current.val) {
                current = current.right;
            } 
            // 否则当前节点就是LCA
            else {
                return current;
            }
        }
        
        return null; // 未找到
    }
}
  • 时间复杂度:O(h),h为树高,平均O(log n),最坏O(n)
  • 空间复杂度:O(1),只使用常数空间

递归遍历

递归判断节点值关系,决定向左或右递归查找

题⽬已经保证了,两个节点 p , q 都在树上,我们取出根节点 7 ,假设⼩于 7 ,则在左⼦树,如果⼤于7 ,则在右⼦树。

需要查找的两个节点,但凡有⼀个等于根节点,它们的⽗节点就是根节点,因为⼀个节点的⽗节点可以是⾃身(题⽬有说明)。

如果⼀个⼤于根节点,⼀个⼩于更节点,其最近公共祖先也是根节点。如果两个都⼤于,或者两个都⼩于,怎么办?

当然是递归,如果两个都⼩于,那么就取当前的左⼦树进⾏递归,直到符合要求。⽐如查找,3 和 5,由于 3 和 5 都⼩于 7,那么取左⼦树 1 下⾯的进⾏递归:

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
public class Solution68 {
    public int lowestCommonAncestor(TreeNode root, int p, int q) {
        TreeNode result = commonAncestor(root, p, q);
        return result == null ? -1 : result.val;
    }
    public TreeNode commonAncestor(TreeNode root, int p, int q) {
        // 等于空
        if (root == null) {
            return null;
        }
        if (root.val == p || root.val == q) {
            // 有⼀个值等于根节点
            return root;
        }
        // 在左⼦树
        if (p < root.val && q < root.val) {
            return commonAncestor(root.left, p, q);
        } else if (p > root.val && q > root.val) {
            // 两个都在右⼦树
            return commonAncestor(root.right, p, q);
        } else {
            return root;
        }
    }
}
  • 时间复杂度:O(h),递归深度为树高
  • 空间复杂度:O(h),递归调用栈空间

通用二叉树

假设这道题条件改⼀下,如果不是⼆叉搜索树,怎么办?

如果不是⼆叉搜索树,那么我们不能直接判断出它在左⼦树,还是在右⼦树。不如暴⼒点,先在左⼦树中找,如果右⼦树没找到,说明都在左⼦树,如果左⼦树没找到,说明都在右⼦树,如果两个都分别存在,说明当前节点就是他们的⽗节点。

public class Solution68 {
    public int lowestCommonAncestor(TreeNode root, int p, int q) {
        TreeNode result = commonAncestor(root, p, q);
        return result == null ? -1 : result.val;
    }
    public TreeNode commonAncestor(TreeNode root, int p, int q) {
        if (null == root) {
            return null;
        }
        if (root.val == p || root.val == q) {
            return root;
        }
        TreeNode left = commonAncestor(root.left, p, q);
        TreeNode right = commonAncestor(root.right, p, q);
        if (left == null) {
            return right;
        } else if (right == null) {
            return left;
        } else {
            return root;
        }
    }
}
  • 时间复杂度:O(n),需要遍历整个树
  • 空间复杂度:O(h),递归栈深度

职行AI面试精灵都是开发者常用的AI面试辅助工具,但它们的功能完善度和用户体验有较大差异。

面试精灵的产品完成度更高,功能更全面;职行AI支持多种录音模式,能通过GPT分析说话人,但界面简陋,对技术内容的呈现效果不佳。

面试精灵操作页面

功能特性对比

我们对两款AI面试助手进行了全面评测,以下是它们的功能特性对比:

功能特性面试精灵职行AI
面试助手
笔试助手X
简历优化X
模拟面试XX
面试记录/分析
交流社群XX
界面美观度42
操作简单/可访问性44
功能强大42
价格(元/小时)1049
性价比4.52
免客户端下载
多语言支持
语音识别优化XX
自动说话人识别X
隐蔽模式(多机互联)X
简历输入
个人知识库XX
大厂面经库XX
联网搜索XX
多种回复模式XX
回复结果显示增强X

核心功能深度解析

语音识别与说话人识别

两款工具都具备语音识别和说话人区分功能,但实现方式有所不同。

职行AI支持多种录音模式,在无法监听系统音量时,能通过GPT分析语音内容来判断说话人身份,自动识别面试官的问题,这种方式在特定场景下有一定实用性。

面试精灵支持自动说话人识别,结合声纹识别和大语言模型技术,能自动区分面试官和用户的语音。在跨设备使用时,甚至可以只监听面试官的提问并自动回复,隐蔽性更好。

回复质量深度对比

回复质量是AI面试助手的核心指标,两款工具在这方面的表现存在明显差距。

简历信息利用能力

两款工具都支持简历上传功能,但在实际使用中的效果差异显著。

职行AI在处理简历相关问题时表现尚可,能生成结构化的回复,但对简历信息的挖掘不够深入,回答的个性化程度有待提高。

面试精灵在这方面的表现更出色。它通过RAG技术深度检索简历内容,将项目细节、技能要求等信息自然地融入到回答中,使得自我介绍、项目描述这类问题的回答更加贴切。

时效性问题应对

面对"DeepSeek最近很火爆"这类时效性问题,两款工具的处理方式有明显差异。

职行AI不支持联网搜索功能,只能依赖模型内置的知识。根据实测,它的知识更新截止到2024年7月,对于最新的技术动态无法提供准确回答。

面试精灵支持联网搜索,并且对英文术语的识别准确率较高。它能够通过实时搜索获取最新信息,给出准确的回答,这对关注技术趋势的求职者来说非常重要。

界面与内容呈现

在界面设计和内容呈现方面,两款工具的差异非常明显。

职行AI的界面设计简陋,美观度不足。更重要的是,它对代码、公式、图表等复杂内容的显示效果较差,这会影响技术岗位面试者的理解和回复效率。

面试精灵的界面设计更加简洁现代,对代码块、公式、图表等复杂内容的显示效果更好。前端支持LaTeX公式、流程图、泳道图等技术内容的展示,对技术面试场景更加友好。

功能完整性分析

两款工具在功能完整性方面的差距较为明显。

职行AI的功能相对有限,主要集中在语音识别和基础回复生成上。虽然文档清晰、操作简单,但整体完成度较低,许多细节之处还有待优化。

面试精灵的功能更加全面。除了面试助手,还提供笔试助手功能,通过多设备互联实现跨设备远程截图,利用视觉大模型自动识别题目并生成答案。面试记录可以长期保存,方便用户进行复盘分析。

实际评测表现对比

根据实际评测数据,两款工具的得分存在明显差异。

职行AI在帮助性评分上表现尚可,在语音识别和意图识别方面的得分较高。但在内容全面性和直观性方面得分较低,代码可视化效果不佳,功能完善度还有较大提升空间。

面试精灵在各个评测维度的表现都较为均衡,在准确性、个性化、全面性、直观性等方面的表现尤为突出,整体帮助性评分更高。

价格与性价比对比

职行AI的价格约为49元/小时,在同类产品中属于中等水平。

面试精灵的基础版价格约为10元/小时,精英版约25元/小时。即使使用最高配置,价格也比职行AI更实惠。

两款工具都为新用户提供了免费试用额度,用户可以先体验再做决定。

实际使用效果对比

为了更直观地展示两款工具的回复效果差异,我们通过具体的实测案例进行对比。

项目描述问题实测

问题:"请详细描述下你简历中的这个点云感知项目"

这个问题主要测试工具对简历信息的理解和应用能力。

两款工具在这个问题上的表现都不错。职行AI的回复能够准确贴合简历中的项目经历,遵循STAR结构,内容的结构化程度较高。

面试精灵的回答同样准确,而且在技术细节的描述上更加深入。

系统设计问题实测

问题:"设计一个支持高并发的短网址生成系统。"

这个问题主要测试工具的系统设计能力以及架构图的绘制和显示效果。

两款工具都能给出正确的系统设计思路,但面试精灵在架构图的显示效果上更有优势,能够帮助面试者快速抓住重点并理清回复思路。

面试精灵系统设计问题回复

职行AI的回复虽然正确,但对架构图和技术细节的呈现不够清晰,影响用户的理解效率。

算法问题实测

问题:"如何在一个未排序的数组中找到第K大的元素?"

这个问题主要测试工具的算法编程能力。

两款工具都能给出正确的解题思路和代码,但面试精灵在代码呈现和复杂度分析方面更加清晰,对面试者的理解帮助更直接。

职行AI算法问题回复

面试精灵算法问题回复

时效性问题实测

问题:"2025年至今发布的最重要的一个AI大模型是啥,请简要说明它的特点和应用场景"

这个问题主要测试工具的联网检索增强回复功能。

面试精灵通过联网搜索,成功找到了2025年上半年最热门的大模型Deep Seek,并给出了准确的特点和应用场景说明。

面试精灵时效性问题回复

职行AI不支持联网搜索功能,只能依赖模型内置的知识,而其知识更新截止到2024年7月,无法回答最新的技术动态问题。

综合评测数据对比

下面是两款工具在各评测维度的平均得分对比(满分5分):

评测维度面试精灵职行AI
帮助性4.784.26
语音识别准确率4.444.57
意图识别正确率55
内容深度及个性化4.784.14
沟通技巧4.674.57
准确性4.784.43
全面性4.783.86
直观性4.894.14

从评测数据可以看出,职行AI在语音识别准确率和沟通技巧方面表现不错,但在内容全面性和直观性方面不如面试精灵。面试精灵的整体表现更均衡,尤其是在代码、公式、图表等复杂内容的显示效果上优势明显。

总结与使用建议

两款工具都具有一定的可用性,但在整体表现上的差异较为显著。

职行AI在语音识别和说话人区分方面做得不错,支持多种录音模式,操作简单,文档清晰。但它的界面简陋,产品完成度较低,代码显示效果不佳,功能完善度还有待提高。

面试精灵在回复质量方面更具优势。简历定制化功能让回答更贴切,联网搜索能够应对时效性问题,英文术语识别更准确。自动说话人识别让操作更隐蔽,界面设计更友好,功能也更全面。整体完成度更高,价格也更实惠。

从整体评测数据来看,面试精灵在帮助性、内容深度、全面性等方面具有明显优势,尤其是在代码、公式、图表等复杂内容的显示效果上表现出色。结合其高性价比和更完善的功能,面试精灵可能更符合大多数求职者的需求,尤其是需要处理技术面试问题的用户。


本文详细对比了职行AI和面试精灵的主要差异。两款工具在产品完成度上的差距较为明显,建议用户在做出选择前先进行实际体验。

今天分享一个我自己用 Vue 开发的在线小工具——「腾讯域名拦截查询」。它主要用来帮助普通用户快速判断:某个域名在腾讯系常见访问场景中是否可能存在拦截风险。无需安装软件,打开网页就能查。

在线工具网址:https://see-tool.com/tencent-domain-block-query
工具截图:

这个工具能做什么

  • 快速检测域名状态:输入域名后,一键发起查询,查看当前返回结果。
  • 降低排查门槛:不用研究复杂命令,也不用抓包,几步就能完成基础判断。
  • 辅助内容发布前自检:在分享链接、投放活动页之前,先做一次可访问性检查。

适合哪些人使用

  • 普通网站用户:链接打不开时,先判断是不是域名访问受限。
  • 内容运营同学:公众号、社群、活动推广前做基础检查,减少临时翻车。
  • 中小站长和创业团队:没有专职运维时,也能快速完成第一轮排查。

如何使用

  1. 打开「腾讯域名拦截查询」工具页面。
  2. 输入要查询的域名(建议使用主域名)。
  3. 点击查询按钮,等待结果返回。
  4. 根据结果决定下一步:若提示风险,可进一步检查域名历史内容、备案与解析配置。

使用建议

查询结果适合作为快速参考,不是最终裁定。实际访问还会受网络环境、地区、时间和链接路径等因素影响。建议在关键发布前,多终端、多网络做交叉验证。

这个工具是怎么做的

这个工具由我基于 Vue 开发,重点放在“简单、直观、普通人也能上手”。界面尽量减少专业术语,把核心操作压缩为“输入域名 + 点击查询 + 看结果”,让非技术用户也能快速完成域名状态检查。

简介:1联合体类型的声明;2联合体的特点;3联合体大小的计算;4枚举类型的声明;5枚举类型的优点;6枚举类型的使用

1 联合体

1.1 联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以是不同的类型。

但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体

给联合体其中一个成员赋值,其他成员的值也跟着变化。

使用联合体的目的是为了节省空间。联合体成员在同一时间只能使用一个。

#include <stdio.h>
//联合类型的声明
union Un
{
    char c;
    int i;
};

int main()
{
    //联合变量的定义
    union Un un = { 0 };
    //计算连个变量的大小
    printf("%zd\n", sizeof(un));
    return 0;
}

1.2 联合体的大小

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
#include <stdio.h>
union Un1
{
    char c[5];
    int i;
};
union Un2
{
    short c[7];
    int i;
};
int main()
{
    //下面输出的结果是什么?
    printf("%zd\n", sizeof(union Un1));
    printf("%zd\n", sizeof(union Un2));
    return 0;
}

1.3 联合体判断大小端

联合体的特点是所有成员共用同一块内存空间,这个特点用来判断大小端很合适。

//使用联合体判断大小端
#include <stdio.h>
int cheak_sys()
{
    union
    {
        char c;
        int i;
    }n;
    n.i = 1;
    return n.c;
}

int main()
{
    if (cheak_sys())
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}

2 枚举类型

2.1 枚举类型的声明

枚举顾名思义就是一一列举。

把可能的取值一一列举。

比如我们现实生活中:

一周的星期一到星期日是有限的7天,可以一一列举

性别有:男、女、保密,也可以一一列举

月份有12个月,也可以一一列举

三原色,也可以列举

这些数据的表示就可以使用枚举了。

enum Color//颜色
{
    RED,
    GREEN,
    BLUE
}

上面定义的enum Color就是枚举类型。

{}中的内容是枚举类型的可能取值,也叫枚举常量

这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

下面是一个赋初值的问题:

枚举默认从0开始,所以X1是0,故Y1是1,给了数字后会根据数字向后推,那么Z1是255,A1是256,所以B1是257。

2.2 枚举类型的优点

我们也可以使用#define定义常量,为什么非要使用枚举?

枚举的优点:

  1. 增加代码的可读性和可维护性
  2. #define定义的标识符比较枚举有类型检查,更加严谨。
  3. 便于调试,预处理阶段会删除#define定义的符号
  4. 使用方便,一次可以定义多个常量
  5. 枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

有关#define

说明:结构体向最长的char对齐,前两个位段元素一共4+2位,不足8位,合起来占1字节,最后一个单独1字节,一共3字节。另外,#define执行的是查找替换, sizeof(struct _Record_Struct) MAX_SIZE这个语句其实是32+3,结果为9。

2.3 枚举类型的使用

enum Color//颜色
{ 
    RED=1;
    GREEN=2;
    BLUE=4;
};

enum Color clr = GREEN;//使用枚举常量给枚举变量赋值

那是否可以拿整数给枚举变量赋值呢?在C语言中是可以的,但是在C++是不行的,C++的类型检查比

较严格。

简洁:1结构体类型的声明;2结构体变量的创建和初始化;3结构成员访问操作符;4结构体内存对齐;5结构体传参;6结构体实现位段

1 结构体类型的声明

1.1 回顾

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

struct tag
{ 
    member-list;
}variable-list;

结构的声明、结构体变量的创建和初始化,例如:

#include <stdio.h>
struct Stu
{
    char name[20];//名字
    int age;//年龄
    char sex[5];//性别
    char id[20];//学号
};
int main()
{
    //按照结构体成员的顺序初始化
    struct Stu s = { "张三", 20, "男", "20230818001" };
    printf("name: %s\n", s.name);
    printf("age : %d\n", s.age);
    printf("sex : %s\n", s.sex);
    printf("id  : %s\n",s.id);

    //按照指定的顺序初始化
    struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex = "女" };
    printf("name: %s\n", s2.name);
    printf("age : %d\n", s2.age);
    printf("sex : %s\n", s2.sex);
    printf("id  : %s\n", s2.id);
    return 0;
}

1.2 结构的特殊声明

在声明结构的时候,可以不完全的声明。

比如:

//匿名结构体类型
struct
{
    int a;
    char b;
    float c;
}x;

struct
{
    int a;
    char b;
    float c;
}a[20], *p;

上面的两个结构在声明的时候省略掉了结构体标签(tag)。

问题:p = &x是否合法?

编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。

匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。

注意:匿名结构体类型并不推荐使用,可能会有各种问题

1.3 结构的自引用

struct Node
{
    int data;
    struct Node* next;
};

在一个结构体中包含了一个同类型结构体的指针,形成链式结构。

问题:在结构体自引用使用的过程中,夹杂了typedef对匿名结构体类型重命名,也容易引入问题,看看

下面的代码,可行吗?

typedef struct
{ 
    int data;
    Node* next;
}Node;

答案是不行的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使

用Node类型来创建成员变量,这是不行的。

解决方案如下:定义结构体不要使用匿名结构体了

typedef struct Node
{ 
    int data;
    struct Node* next;
}Node;

2 结构体内存对齐(重点)

我们已经掌握了结构体的基本使用了。现在我们深入讨论一个问题:计算结构体的大小。

这也是一个特别热门的考点:结构体内存对齐

2.1 对齐规则

结构体对齐遵循的规则如下:

  1. 结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数 = 编译器默认的一个对齐数与该成员变量大小的 较小值。

VS中默认的值为8

Linux中gcc没有默认对齐数,对齐数就是成员自身的大小

  1. 结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍。
  2. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员中最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。
//练习1 
struct S1
{
    char c1;
    int i;
    char c2;
};
//练习2
struct S2
{
    char c1;
    char c2;
    int i;
};
//练习3
struct S3
{
    double d;
    char c;
    int i;
};
//练习4-结构体嵌套问题
struct S4
{
    char c1;
    struct S3 s3;
    double d;
};

int main()
{
    printf("%zd\n", sizeof(struct S1));
    printf("%zd\n", sizeof(struct S2));
    printf("%zd\n", sizeof(struct S3));
    printf("%zd\n", sizeof(struct S4));
    return 0;
}

2.2 为什么存在内存对齐?

  1. 平台原因(移植原因):

不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

  1. 性能原因:

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。假设一个处理器总是从内存中取8个字节,则地址必须是8的倍数。如果我们能保证将所有的double类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中。

总体来说:结构体的内存对齐是拿空间来换取时间的做法。

那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:

让占用空间小的成员尽量集中在一起
//例如: 
struct S1
{ 
    char cl;
    int i;
    char c2;
};

struct S2
{
    char cl;
    char c2;
    int i;
};

2.3 修改默认对齐数

#pragma这个预处理指令,可以改变编译器的默认对齐数。

#pragma pack(l)//设置默认对齐数为:1
#pragma pack()//取消设置的对齐数,还原为默认

3 结构体传参

结论:结构体传参的时候,建议传结构体的地址。

原因:

函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

struct S
{
    int data[1000];
    int num;
};
struct S s = { { 1, 2, 3, 4 }, 1000 };

//结构体传参
void print1(struct S s)
{
    printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
    printf("%d\n", ps->num);
}

int main()
{
    print1(s); //传结构体
    print2(&s); //传地址,用这种
    return 0;
}

4 结构体实现位段

4.1 什么是位段

位段的声明和结构是类似的,有两个不同:

  1. 位段的成员必须是int、unsigned int、signed intchar,在C99中位段成员的类型也可以选择其他类型。
  2. 位段的成员名后边有一个冒号和一个数字。

位段中的位是二进制位。

比如:

struct A 
{ 
    int _a:2;
    int _b:5;
    int _c:10;
    int _d:30;
};

A就是一个位段类型。

位段的应用举例:网络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要几个bit位就能描述,这里使用位段,能够实现想要的效果,也节省了空间,这样网络传输的数据报大小也会较小一些,对网络的畅通是有帮助的。

4.2 位段的内存分配

  1. 位段的成员可以是int unsigned int signed int或者是char等类型
  2. 位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

4.3 位段的跨平台问题

  1. int位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配,标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

总结:

跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。

如果使用位段,一般会根据不同的环境写不同的代码。

4.4 位段使用的注意事项

位段的几个成员共有同一个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配一个地址,一个字节内部的bit位是没有地址的。

所以不能对位段的成员使用&操作符,这样就不能使用scanf直接给位段的成员输入值,只能是先输入放在一个变量中,然后赋值给位段的成员。 就如4.2中的赋值过程。

OneClip 官网: https://oneclip.cloud/
直链下载: 点我下载

OneClip 能做什么

  • 记录并搜索剪贴历史。文本/图片/文件/视频/音频/文档等,快速召回
  • 最高支持无限条历史记录,五台设备
  • 界面美观,列表模式/卡片横排,无广告,无打扰
  • 纯文本和富文本复制粘贴、合并多段、固定常用文本片段
  • 全新拖拽体验,支持内容拖拽到主窗口。支持拖拽容器收集文件、图片、文本等
  • 全局快捷键秒唤起,功能丰富,快捷键自定义,内容智能搜索
  • 支持空格原生 QuickLook 预览,快速查看预览文件、图片、文本等
  • 支持菜单栏操作,左键复制,右键粘贴,一触直达
  • 支持快捷回复功能
  • 快速粘贴面板,粘贴方便快捷,支持快速粘贴最近内容
  • 置顶、收藏、删除、删除撤销功能
  • 文本/图片便签窗口
  • OCR 识别+OCR 翻译
  • 文本图片二次编辑保存
  • 支持粘贴板堆栈
  • 支持访达增强,⌘+X/⌘+V 剪切文件(赠送的永久免费功能)
  • 支持来源应用显示
  • 支持脚本功能
  • 本地存储,隐私可控。安全可靠不打扰。
  • 隐私保护,支持密码和生物验证(Touch ID)
  • 可选自定义同步(本地/内外网均可用)
  • 局域网同步剪切板内容
  • URL Scheme 实现自动化控制
  • AI 功能(需要自己配置 API Key):OCR、翻译、摘要要点等等
  • 支持结合本地 Ollama/LM Studio/自定义 AI
  • 还有更多的功能等待你发现
    img1.png
    img2.png
    img3.png

终身版兑换码请在 https://oneclip.cloud/purchase/lifetime 兑换,可用 10 次!人多再补

谢谢大家~

TLDR:

x-cmd v0.8.5 主要新增 7 个基础库的文档,回顾一下每个模块功能:

  • humantime: 支持秒数和人性化时间互相转换
  • is: 判断值是否符合预期
  • assert: 测试断言,验证结果是否符合预期
  • host: 基于/etc/hosts文件的 host 表管理
  • tmp: 跨平台临时文件和目录管理
  • rand: 生成随机 UUID、邮箱、IP 等数据
  • str: 提供大小写转换、分割等字符串操作

🚀 x-cmd v0.8.5 Beta 更新详情

humantime ⏰

增加 humantime 模块文档 —— 为时间参数转换提供底层支持。

人类说"等3小时",机器只懂"10800秒"。这个 GAP 由 humantime 来填。
它是 x sleep 3hx timeout 2h30m 等命令的基础设施,让用户能直接用自然语言表达时间。

x humantime 3600      # 输出 1h
x humantime 2h30m     # 输出 9000

支持 d/h/m/s,小数秒也行。下次写定时任务不用再心算了。

is 🔍

is 模块增加文档 —— 写脚本时 [ ] 语法总让我心虚。

特别是检查数字范围、文件新旧、环境类型这些,test 命令的写法我总是记混。
干脆封装成一个个子命令,语义更清晰。

x is int 42                 # 是不是整数?
x is minmax 1 100 50        # 50 在 1-100 范围内吗?
x is interactive            # 当前是交互式 shell 吗?

支持类型检查、范围判断、文件新旧比较、环境检测。代码读起来更自解释。

assert 🛡️

assert 模块增加文档 —— 被一次 debug 搞崩溃了。

有个函数偷偷改了 $HOME,后面所有命令全挂了,找了半天才发现。
所以做了这个测试工具,重点是变量快照功能:保存 → 执行 → 对比,一眼看出谁泄漏了。

x assert true [ 1 -eq 1 ]
x assert var save; my_func; x assert var cmp

也支持常规的 true/false、类型检查、文件判断。写模块测试时用着挺顺手的。

host 🌐

host 模块增加文档 —— 改 /etc/hosts 这件事我始终觉得危险。

sudo vim 进去,手一抖改错了,DNS 就全乱了。而且找域名的时候还得肉眼扫。
做个带模糊搜索的安全版本,自动备份,错了还能恢复。

x host              # 分页查看,支持搜索
x host fz           # 模糊找域名
x host ed myapp.local=192.168.1.100

编辑前自动备份,操作都在临时文件完成,确认无误才写入。放心多了。

tmp 📁

tmp 模块增加文档 —— 跨平台临时目录这事实在是太乱了。

Linux 是 /tmp,macOS 可能是 $TMPDIR,Windows 又是另一套。写脚本时总要判断。
统一封装一下,还加了创建临时文件/目录的功能。

x tmp path          # 获取系统临时目录
x tmp mkdir cache   # 创建临时目录
x tmp mkfile        # 创建临时文件

_ 后缀的是内部版本(如 x tmp path_),结果存变量,供其他脚本调用。

rand 🎲

rand 模块增加文档 —— 写测试数据时 $RANDOM 不够用了。

需要 UUID、假邮箱、随机 IP 的时候,总要去翻其他工具。
干脆集成到一起,还能批量生成。

x rand uuid
x rand uuidv7       # 时间有序的 UUID
x rand email 5      # 批量生成 5 个邮箱
x rand int 1 100    # 1-100 之间的随机整数

也支持浮点数、不同格式的字符串。写测试用例时少很多烦心事。

str 🔤

str 模块增加文档 —— awk/sed/tr 组合拳我老是记混。

大小写转换、base64、trim、replace,这些简单操作其实挺常用的。
但每次都要想「这次该用哪个工具」就很烦。统一到一个命令里省事多了。

x str upper hello
x str base64 hello
x str trim "  spaced  "

还支持 split/join、md5/sha256、换行符转换。日常字符串处理基本够用了。

gemini 🤖

修复配置自定义 endpoint 不生效的问题 —— 抱歉,这是个低级错误。

有用户反馈配置了中转站 endpoint 但请求还是跑到 Google 官方去了。
查了下发现是配置读取时的逻辑问题,自定义 endpoint 没有被正确应用到请求中。

现在配置会正确生效了:

x gemini --cfg endpoint=https://your-proxy.example.com

感谢 @shlroland 在 #376 的反馈。

⬆️ 如何升级

现有用户可以通过以下命令快速切换至 Beta 版本进行体验:

x upgrade beta

如果你没有安装 x-cmd, 只需要打开你的终端:

eval "$(curl https://get.x-cmd.com)"

x-cmd 是一个一站式的命令行工具集,其强大的功能可以为人类用户和AI共同使用。它还简化了很多工具的安装方法。
马上安装,让 x-cmd 协同 AI 成为你的最强助手,实现生产力翻倍!

🤝 开发者反馈

如果您在自定义配置或代理设置中遇到任何疑问,欢迎前往 GitHub Issues 提交反馈,共同完善 X-CMD 生态。

训练集和测试集如果来自不同的分布,会怎样?

类似的问题不是没遇到过只是语境不同,比如说模型上次构建以来是否发生了数据漂移?销售分析中产品 A 和产品 B 的分布是否存在差异?归结下来问的都是同一件事,如何量化两个分布之间的差异。

单变量分析是最直接的入手点,逐个变量比较训练集与测试集的分布形状。但光看单变量可能不够。变量之间的联合关系如果存在差异呢?

怎么量化这种差异?Energy Distance 可以解决这个问题

Energy Distance 是一种用来度量两个概率分布差异程度的统计指标。两个分布完全相同时取值为零,分布差距越大数值越高。

形式化的定义

给定概率分布 F 和 G,从中分别抽取随机向量 X 和 Y,Energy Distance D(F,G) 的定义如下:

D(F,G) = 2E||X, Y|| — E||X, X'|| — E||Y, Y'||

定义包含两类距离。E||X, Y|| 是跨分布数据点对之间的期望欧几里得距离(一个来自 X,一个来自 Y),称为交叉距离;E||X, X'|| 和 E||Y, Y'|| 则是同一分布内部数据点对之间的期望欧几里得距离,称为组内距离。

Energy Distance 的原理

可以把 Energy Distance 类比为一个带电粒子系统的净相互作用能。设想两团点云,一团带正电,一团带负电。交叉距离对应异号粒子之间的相互作用能,组内距离对应同一团点云内部的自相互作用能。当交叉作用恰好被自作用抵消:即两个分布完全一致——净能量为零;否则为正值。

用一句话概括:

Energy Distance 度量的是两个分布之间的分离程度超出各自内部自然分离程度的幅度。

下面用两个二元分布的可视化来展示这一思路,同样的原理可以推广到更高维。

两个分布完全相同时,Energy Distance 为零。

随着两个分布彼此远离,交叉作用占据主导,Energy Distance 上升。

当每个分布内部的数据点变得更分散时,自作用开始抵消交叉作用,Energy Distance 趋向于零。

Energy Distance 解读

单独看 Energy Distance 的数值意义不大,通常需要配合置换检验来判断观测到的数值:即从原始样本计算得到的 Energy Distance,是否反映了两个分布之间具有统计意义的差异。

置换检验的零假设是 X 和 Y 来自同一分布(F=G)。操作上,将两组样本合并后随机重新分配组标签,保持原始样本量不变,反复计算 Energy Distance,由此构建零假设下的经验分布。p 值等于置换统计量超过观测统计量的比例。

置换检验的结果未检测到训练集与测试集之间存在整体性的分布偏移,无证据表明发生了全局协变量偏移。但这不等于排除了局部外推的可能:特征空间中稀疏及尾部区域仍需额外检查。

总结

Energy Distance 是一种基于度量的统计工具,适用于衡量两个多元分布的差异程度。数据漂移检测、A/B 测试中的样本一致性验证、不同群体间的分布比较——只要涉及"两组多元数据是否来自同一分布"的判断,它都能派上用场。

相比逐变量的单维度检验,Energy Distance 的优势在于能够捕捉变量间联合关系的变化,而不仅仅是边缘分布的偏移。配合置换检验,可以得到具有统计意义的推断结论,而非停留在视觉直觉上。

不过也需要注意它的边界。Energy Distance 检测的是全局性的分布差异,对于局部区域——特别是特征空间中样本稀疏的尾部——敏感度有限。高维场景下,欧几里得距离本身的区分能力会随维度增加而衰减,这一点同样会影响 Energy Distance 的表现。在实际使用中,结合局部密度估计或分区域检验等方法做补充验证是更稳妥的做法。

https://avoid.overfit.cn/post/7e479c1020bb4a25ab533c7cc4761894

by Inno Tanaya

这两天投了很多简历,很多已读不回,或者表示岗位不匹配.好不容易约到了两家面试,被拷打到自闭.

自己普通本科,刚过 30,做了 6 年多的游戏服务器开发,没有大厂经历,很多中型公司都不给面试机会.自己毕业就在这家公司,从小开发做到了一个项目的后端负责人,奈何这两年公司家道中落,工资不够看,想换个工作.

去年的时候,想转行,做 KV 数据库这类的工作,前几年接触过一些这类的开源项目,也提交了几个 PR,本想着有这样的经历应该有面试的资格了,没想到基本所有的公司都不给面试机会,好不容易,bat 中的一家给了面试机会,自己当时也算争气,三轮技术面试都过了,但是提交工资资料后,没有后续了,不知道是被横向比较了还是锁岗位了(半月左右,爆出来这家大裁员).后面又面了两家游戏公司,自己做的游戏方向可能和人家不符,一轮游.

年后回来,投了好多,好不容易有两家给了面试机会,都是资深开发,架构岗位,被一堆架构问题问自闭了,自己维护的这套架构简直就是玩具,自己虽然找过一些资料,看过一些架构的文章,但是没有上手操作过,深入一点直接废了.
感觉自己的表达能力也有问题,面试结束复盘时,有些问题应该能想的更深入一些,或者表达的更好一点,但是当时就是没有答出来.

还有一些高级的用法,确实没想到怎样实现,比如这个问题,"在 golang 中 怎样设计一个只能同时创建 5000 个协程的结构,要能准确控制在 5000 以内,不能超出,而且要多线程安全",自己一开始只想到了用原子变量,面试官不满意,自己又想到了用 大小是 5000 的 chan,然后面试官又问,如何实现如果超过 5000 时,不要阻塞,直接返回失败,当时想到了当前数据,面试官觉得不行,有想到加锁,然后就不问了. 自己就是没有想到 使用 select.

今天在想,年前那次面试过了,应该是当时想招大头兵开发,职级可能就是 T4,这两天面试的资深架构级别,自己还是太菜了.

A1_34.jpg

现在感觉,自己这几年就像井底之蛙,不了解现在人家大公司,大项目用什么架构.有时候想想有些东西一旦错过就是错过了,当年玩社区的时候,有位大哥问我要不要去跟他干数据库,当时就想着把自己负责的游戏弄好,想着游戏要是火了,老板吃肉,自己能跟着喝点汤,现在相回也回不去了.

现在先学习吧,下半年再冲刺面试.

自己今晚有感而写,有些话不吐不快,V2 站卧虎藏龙,欢迎大佬给建议,也欢迎各位给一些面试经验,比如资深一点的开发,面试官主要想考察哪些能力.

1. 消失的门槛与廉价的“工业废料”

在 2026 年的今天,写代码这件事已经彻底“去神圣化”了。只要会写 Prompt,几秒钟内就能生成成百上千行的代码。

事实是:代码的生产成本正在趋于零。 但这带来了一个巨大的陷阱:公司和企业对 AI 的信任增长速度快于其自身的准备程度。 这种盲目自信正是因为 AI 输出的代码看起来非常“流畅且权威”,导致员工和管理者在未经挑战的情况下就直接接受了结果。

很多企业决策层开始职场“大刀阔斧”,觉得可以大规模裁员,用 AI 替代那些“昂贵”的资深工程师。但他们忽略了一个致命的事实:代码量不等于软件质量。 这种由 AI 批量生产出的、未经深度思考的代码,本质上是数字世界的“工业废料”。

2. 永远不要低估了软件的复杂度

软件的复杂度(Complexity)并不会因为代码生成得快而消失,它只是从“显性”变成了“隐性”。

这种“虚假繁荣”背后的第一个高昂代价是:极其巨大的数据准备成本。 调研显示,57% 的领导者认为数据可靠性是从试点走向生产的主要障碍。除了可靠性,数据的完整性(Completeness)也是巨大的挑战。如果 AI 无法访问组织内破碎的、散落在各处的非结构化数据(如邮件、PDF、内部文档等),它就无法做出准确的决策。清理和治理这些“数据宝库”的成本,往往远超代码开发本身。

更危险的是,当 AI 不仅仅是写代码,而是作为“组织参与者”自主运行时,系统风险将呈指数级增长。一个写错的逻辑函数可能只是个 Bug,但一个错误的自主代理(Agent)可能会在短时间内造成大规模的合规风险或财务损失。

当你低估复杂度时,软件就不再是你的资产,而变成了你无法摆脱的技术债务。

3. 安全黑盒:你的系统容不容易被攻击?

如果说复杂度是隐形杀手,那么“安全风险”就是悬在头顶的利剑。

AI 写的系统极易被攻击。 AI 模型追求的是“概率上的相似”,而不是“逻辑上的绝对安全”。

  • 隐性漏洞: AI 经常为了演示简洁而忽略输入校验,留下 SQL 注入或权限绕过等漏洞。
  • 审计真空: 最容易被攻击的系统,不是代码写得烂的系统,而是开发者根本不知道代码写了什么的系统。如果你不具备深度思考的能力,你甚至看不出 AI 给你挖的坑在哪里。

4. 程序员的进化:从“搬砖工”到“系统牧羊人”

AI 虽然能提供“超级力量”,但前提是使用者必须具备领域专业知识和经验。 在 AI 工作流中,我们需要设计一种“生产性怀疑”。程序员的价值不再是敲键盘的速度,而是建立“护栏(Guardrails)”。程序员需要从“搬砖工”转型为“系统架构的牧羊人”,确保 AI 在可控的范围内“跑动”。

  • 总结 Skill: 每次纠正 AI 的错误,都要将其沉淀为专业的约束规范。
  • 深度审计: 你的价值体现在,你能发现那些“看起来很美”的代码背后隐藏的逻辑塌陷。

5. 认知重构:重新设计组织的运营模型

我们现在面临一个荒唐的现状:一群不懂 AI 底层逻辑的人,正在狂热地研究如何提高“干活人”的效率。

真正的成熟在于重新设计公司的运营模型。不仅仅是让员工学会使用 AI,而是要寻找“人类与机器之间的完美平衡点”,让两者各司其职,发挥出各自的最佳水平。

  • 提升 AI 素质与数据素质: 在负责任地使用 AI 之前,员工需要具备批判性思维,不盲从结果。
  • 从执行到重构: 不要仅仅满足于自动化现有流程,而应思考如何利用 AI 重新构建业务模式。

结语

在代码最廉价的时代,唯有深刻的思考和严苛的审计,才是软件真正的灵魂。我们需要时刻保持清醒:AI 可以帮你盖楼,但它不能帮你判断这栋楼会不会在第一场雨后塌陷。

一个公司的危机,往往并非技术落后,而是集体陷入了那场关于“容易”的错觉。

本文由mdnice多平台发布

一个以「私人书信」为设计隐喻的 Hugo 博客主题。

Epistle (尺素)将博客构想为书桌上的一叠私人信札:

首页是桌上摊开的最新一封信

点击「信匣」可展开历年书信归档

每篇文章都有称谓、正文、祝颂语、署名、日期——如传统中文书信

"从前的日色变得慢,车、马、邮件都慢..."

预览

Epistle 主题预览

特性

特性 说明
书信隐喻 文章 = 信件,日期 = 落款,首页 = 桌上信笺
完整 Heti 支持 深度集成 赫蹏 (Heti):自动中西文间距、标点挤压、行间注、诗词/古文/多栏排版等全部版式能力均通过 shortcode 开箱即用
五款信纸 白纸蓝墨 / 暖笺 / 晴空 / 夜信 / 春笺
楷体标题 文章标题使用楷体,营造手写感
信笺索引 右侧「信匣」按钮,抽屉式展开归档
轻量无依赖 纯原生 CSS/JS ,无框架负担

链接

在数字化转型的深水区,企业数据资产的“冰山”之下,沉睡着海量的非结构化数据。对于 OPPO 这样业务遍及全球 50 多个国家、拥有数万名员工的科技巨头而言,设计图纸、研发文档、高清影音等非结构化数据占据了总量的 80%,且正以每年 80% 的速度爆发式增长。

如何高效管理这些 PB 级的数据资产,关乎研发效率、全球供应链协同以及核心资产安全。鸿翼战略客户副总监张琳深度分享了鸿翼与 TiDB 联合助力 OPPO 打造 PB 级文档管理平台的实战经验。OPPO 成功破解了海量非结构化数据的治理难题,为全球业务筑起了一套敏捷的数字底座。

当“传统网盘”成为全球业务的“减速带”

在项目初期,OPPO 面临着日益严峻的数据管理压力。随着全球用户超过 7 亿,企业内部产生的文件数量迅速攀升至 10 亿级别。传统的文档管理架构在应对如此庞大的体量时,逐渐成为了业务发展的瓶颈:

  • 研发创新的摩擦力:“光靠一个文件名称,是没有办法快速得知的。”海量元数据(如版本、权限、索引)的检索迟滞,意味着研发人员需要花费大量时间寻找资料。目录加载甚至长达 2 分钟,直接拉低了数万名员工的办公效率。
  • 全球协同的断点:OPPO 的研发、市场及售后部门遍布世界各地。跨国传输带宽资源有限,导致大文件(如售后 ROM 包)的分发效率难以保障,影响了全球业务的响应速度。同时,欧盟 GDPR 等区域性法律法规的合规要求,也给数据的跨境流动带来了严峻挑战。
  • 核心资产的风险暴露:文件分发难以追踪、权限粒度不足,使得企业核心资产面临泄露风险。如何在保障数据安全的前提下,实现内外部的高效协作,成为了亟待解决的难题。

构建非结构化数据的“超级索引”

正如鸿翼战略客户副总监张琳所比喻的:“文档是图书馆里的书籍,存放在成本廉价的仓库中;而文档元数据则是图书馆的超级索引卡片系统。当书籍数量达到千亿级别时,必须拥有一个分布式的、可无限扩展的、能瞬间完成复杂检索的‘超级索引系统’来支撑业务的瞬间调取。”

为了解决上述痛点,OPPO 引入 TiDB 分布式数据库,对底层架构进行了彻底的重构。这一重构并非简单的数据库替换,而是基于“业务对象+元数据索引”的分层治理思想。

  1. 用弹性伸缩支撑业务爆发

OPPO 的数据增长曲线是陡峭的。传统 MySQL 架构的单机瓶颈限制了业务的扩展空间。TiDB 凭借其在线水平弹性扩展的能力,让 OPPO 能够从容应对从 10 亿到 50 亿文件量的平滑演进。业务部门不再需要担心数据库容量,也不再需要为了扩容而进行复杂的停机维护,实现了业务的“零感知”增长。

  1. “全球一张网”的架构布局

为了解决跨国协同难题,新架构采用了“总分结合”的全球化部署策略。

  • 总部:部署核心 TiDB 集群,作为全球数据的“大脑”,统一管理所有元数据与核心文档。
  • 海外节点:通过专线或云资源进行本地化部署,实现数据的就近存取与合规驻留
  • 价值点:这种架构既满足了集团层面“全球一张网”的统一管控需求,又通过 CDN 加速解决了跨国传输的效率问题,确保了全球供应链的实时协同。
  1. 权限模型的重构与解耦

针对海量文件权限判断导致的性能损耗,新系统将复杂的权限计算从数据库层面剥离,在内存中建立“权限树”。TiDB 负责底层元数据的强一致性存储,而计算层负责快速过滤。这种存算分离的设计思路,极大地释放了数据库压力,确保了高并发下的系统响应速度。

实战成效:PB 级数据的敏捷与安全

经过架构升级,OPPO 的文档管理平台不仅成功承载了 PB 级的数据体量,更将数据资产转化为业务增长的动力:

  • 极致的业务响应:在 20 亿文件量、2TB 数据库大小的高压测试下,所有核心接口(如搜索、列表加载)响应时间均控制在 500ms 以内。这意味着,全球数万名员工拥有了一个“零等待”的研发协作环境。
  • 刚性的合规防线:针对 GDPR 等合规要求,系统实现了基于 SCC 的跨境合规存储与传输层加密。配合“权限自助中心”与敏感操作实时提醒,构建了一道既灵活又严密的资产安全防线,保障了业务在全球市场的准入资格。
  • 供应链效率跃升:新的平台深度集成了办公与即时通讯工具,实现了文件收发与协同编辑的无缝衔接。跨国研发资料和市场物料的传输速度大幅提升,真正实现了“全球协同,本地体验”。

结语

从 MySQL 到 TiDB,从单点存储到全球多活,通过 TiDB 提供的强大算力与无限扩展性,OPPO 成功将海量的非结构化数据转化为可管理、可检索、可增值的企业核心资产,更为未来企业知识沉淀与 AI 智能化应用储备了无限可能。