“AI不是要取代人类,而是要放大人类的价值。”当阿里在2026年开年发布“商业操作系统”(B-OS)时,这句宣言让无数产品经理热血沸腾。从ChatGPT到Sora,从大模型军备竞赛到AI视频卷出新高度,这场技术革命正以摧枯拉朽之势重塑商业格局——而产品经理,正是这场变革中最关键的“价值放大器”。

一、AI狂飙:从实验室到产业毛细血管的“真实效能”

当行业还在争论“千亿参数是否必要”时,AI早已悄然渗透到产业最深处:
汽车赛道:大搜车用AI重构二手车交易全流程,从维保记录解析到夜间直播留资,AI工具日均调用超百万次,将信息不对称的“黑箱”变成标准化数据流。某华东车商靠AI走播机器人拿下30%夜间订单,证明AI不是“炫技”,而是“印钞机”。

影视制作:Minimax的“动物奥运会”视频引爆全网,背后是Hailuo-02模型对高难度人体动作的精准复现。PixVerse的“实时世界模型”让视频生成从“重现历史”跃迁至“创造现在”,导演喊“cut”的瞬间,AI已根据新指令调整画面。

医疗领域:哈佛医学院的EVE模型预测出3200多个疾病相关基因中的3600万个致病突变,将基因诊断从“大海捞针”变为“精准打击”。DeepMind的Enformer神经网络一次编码超20万个碱基对,让基因表达预测准确率飙升。

这些案例揭示一个真相:AI的真实效能不在于参数规模,而在于能否解决具体场景的“真实痛点”。当行业从“技术炫技”转向“场景深耕”,产品经理的价值被彻底放大——他们既是技术价值的“翻译官”,也是商业闭环的“设计者”。

二、产品经理的“泼天富贵”:50万岗位缺口与百万年薪

“现在入行AI产品经理,就像2010年做移动互联网产品。”这句话正在成为现实:
薪资暴涨:初级AI产品经理年薪25-40万,专家级年薪百万已成常态。某二本机械专业学员通过4个月系统学习,成功转型AI医疗产品经理,薪资翻3倍。

需求井喷:2025年全球AI大模型市场规模突破5000亿美元,中国核心企业超300家,AI产品经理岗位缺口达50万。阿里、腾讯等大厂明确要求产品经理“必须具备大模型落地经验”。

跨界红利:文科生、非科班背景正成为AI产品经理的主力军。某日语专业硕士通过强化数据分析能力,成功转型AI产品经理,年薪超40万;翻译专业出身的点点用低代码平台开发AI智能体,年入百万。

这场风口的核心逻辑是:AI技术普惠化后,企业需要大量“懂业务、会翻译、能闭环”的产品经理,将技术能力转化为商业价值。正如阿里B-OS的逻辑:算力、模型、连接管道都由平台提供,产品经理只需定义“当A发生时,参考B规则,执行C动作”——这直接将AI创业门槛从“算法科学家”拉低到“资深业务专家”。

三、破局关键:从“PRD写手”到“价值定义者”

当AI能自动生成PRD、分析用户反馈、甚至写竞品报告时,产品经理的核心价值在哪里?答案藏在三个真实案例中:
客服系统的情感革命:某团队用AI优化客服系统,上线后用户投诉激增。原因很简单:AI能正确回答问题,却无法处理“我等了三天”的情绪。后来加入“情绪识别+人性化话术”模块,用户满意度提升23%。

物流延误的“上帝视角”:传统AI只能回答“物流受天气影响”,而业务专家会调用CRM数据发现客户是VIP,协调杭州仓补发顺丰空运,并在钉钉同步处理进度——这需要AI理解“业务流”而非“关键词”。

二手车估值的“数据炼金术”:大搜车的AI估值模型融合车况、区域行情、历史成交等268维因子,将经验判断转化为数据标签。这背后是产品经理对“非标品标准化”的深度理解。
这些案例揭示AI时代产品经理的三大核心能力:
业务洞察力:比AI更懂“上下文图谱”,知道“这个客户昨天在钉钉里特批了什么折扣”。
场景定义力:将技术能力转化为具体功能,如用RAG系统让大模型精准输出行业知识。
闭环设计力:从“提示词工程”到“Agent编排”,确保AI输出能反哺业务系统。

四、未来已来:2026年的三大生存法则

别被“千亿参数”迷惑:企业更关注推理成本,参数量超500亿的项目落地率不足20%。掌握模型量化压缩技术(如AWQ),用4bit量化实现80%精度保留,才是硬通货。
数据质量大于数量:某电商评论分析项目因爬虫数据含敏感信息被下架,血泪教训证明:构建数据清洗SOP(去重→脱敏→质量评分)比盲目收集数据更重要。
懂部署者得天下:阿里P7级产品岗需掌握vLLM部署与负载测试,能用Docker快速搭建本地测试环境。技术大厂要求产品经理“像系统设计师一样思考”,构建能随时间产生复利价值的系统。

结语:站在风口的“价值放大器”

当OpenAI与马斯克为“非营利初心”对簿公堂时,真正的AI革命正在产业深处发生:它不追求“无人驾驶”的乌托邦,而是用AI重构二手车检测、客服对话、视频生成等具体场景;它不制造“算法霸权”,而是让文科生、传统行业从业者通过“业务理解+AI工具”实现价值跃迁。
对于产品经理而言,这是最好的时代——AI放大了他们的效率、洞察力与商业敏感度;这也是最坏的时代——那些只会写PRD、做竞品分析的“执行者”,终将被AI取代。但有一点毋庸置疑:当技术成为基础设施时,定义价值的人,永远站在风口之上。

在日常开发工作中,我们经常会遇到需要自动化处理文档的场景,尤其是PowerPoint演示文稿。无论是批量生成报告、根据数据动态创建演示文稿,还是对现有PPT进行内容调整,手动操作都显得效率低下且容易出错。如何利用Java的强大能力,实现对PowerPoint幻灯片的添加、隐藏和删除,从而极大地提高工作效率,成为了许多开发者关注的焦点。本文将深入探讨这一需求,并提供一套高效实用的解决方案。

库介绍与环境配置:Spire.Presentation for Java

要实现Java对PowerPoint幻灯片的自动化操作,我们需要借助一个功能强大的第三方库。Spire.Presentation for Java 正是这样一个专门为Java应用程序设计,用于创建、读取、编辑、转换和打印PowerPoint文件的API。它支持多种PPT格式,并提供了丰富的接口,让开发者能够轻松控制幻灯片的各个方面,包括文本、图片、表格、图表以及幻灯片本身的操作。

Maven依赖配置:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.presentation</artifactId>
        <version>11.1.1</version>
    </dependency>
</dependencies>

环境配置说明:

在开始编程之前,请确保您的开发环境已正确配置。这包括安装Java Development Kit (JDK) 1.8或更高版本,并配置好Maven或Gradle构建工具。此外,推荐使用IntelliJ IDEA或Eclipse等IDE,它们能提供更好的代码提示和调试体验。

Java 在 PowerPoint 中添加幻灯片

添加幻灯片是构建演示文稿的基础。Spire.Presentation for Java 允许我们创建全新的PPT文件,并在其中添加各种类型的幻灯片,甚至可以向幻灯片中添加内容。

代码示例:

Java

import com.spire.presentation.*;

public class Slides {
    public static void main(String[] args) throws Exception {

        //创建一个 PowerPoint 文档并加载示例文档

        Presentation presentation = new Presentation();
        presentation.loadFromFile("/Sample.pptx");

        //在文档末尾添加新幻灯
        presentation.getSlides().append();

        //在第二页插入空白幻灯片
        presentation.getSlides().insert(1);

       //保存文档
        presentation.saveToFile("output/AddSlide.pptx", FileFormat.PPTX_2010);
    }

}

代码解析:

  1. new Presentation():创建一个空的PowerPoint演示文稿对象。
  2. presentation.getSlides().append():在PowerPoint文件的末尾添加一个新的空白幻灯片。
  3. presentation.getSlides().insert(1):在指定位置添加一张新的幻灯片,这里是添加为第二张。
  4. presentation.saveToFile(...):将修改后的演示文稿保存到指定路径和格式。

Java 在 PowerPoint 中隐藏指定幻灯片

有时我们需要在不删除幻灯片的前提下,使其在演示模式下不可见。Spire.Presentation 提供了简便的方法来实现这一功能。

代码示例:

import com.spire.presentation.*;

public class Slides {
    public static void main(String[] args) throws Exception {

        //创建一个 PowerPoint 文档并加载示例文档
        Presentation presentation = new Presentation();
        presentation.loadFromFile("/Sample.pptx");

        //隐藏第二张幻灯片
        presentation.getSlides().get(1).setHidden(true);

        //保存文档
        presentation.saveToFile("output/Hideslide.pptx", FileFormat.PPTX_2010);
    }

}

代码解析:

  1. presentation.loadFromFile(...):加载一个已存在的PowerPoint文件。
  2. presentation.getSlides().get(1).setHidden(true):通过索引获取需要操作的幻灯片对象。然后将setHidden的参数设置为true使该幻灯片隐藏。
  3. presentation.saveToFile(...):保存修改后的演示文稿。

Java 删除 PowerPoint 中指定幻灯片

当某些幻灯片不再需要时,我们可以将其从演示文稿中彻底移除。Spire.Presentation for Java 同样提供了直接的方法来删除幻灯片。

代码示例:

import com.spire.presentation.*;

public class Slides {
    public static void main(String[] args) throws Exception {

        //创建一个 PowerPoint 文档并加载示例文档
        Presentation presentation = new Presentation();
        presentation.loadFromFile("/Sample.pptx");

        //删除第二张幻灯片
        presentation.getSlides().removeAt(1);

        //保存文档
        presentation.saveToFile("output/Removeslide.pptx", FileFormat.PPTX_2010);
    }

}

代码解析:

  1. presentation.loadFromFile(...):加载一个已存在的PowerPoint文件。
  2. presentation.getSlides().removeAt(1):这是删除幻灯片的关键API。它会从幻灯片集合中移除指定索引的幻灯片,此处删除了第二张幻灯片。
    注意事项: 删除幻灯片后,后续幻灯片的索引会自动更新。例如,如果删除了索引为1的幻灯片,原来索引为2的幻灯片将变为索引1。在进行批量删除操作时,应特别注意这一变化,通常建议从后往前删除,或者每次删除后重新获取幻灯片集合的大小和索引。
  3. presentation.saveToFile(...):保存修改后的演示文稿。

总结

本文详细介绍了如何使用 Spire.Presentation for Java 库在Java应用程序中实现PowerPoint幻灯片的添加、隐藏和删除操作。通过这些实用的代码示例,我们展示了如何创建新的演示文稿、向其中添加自定义内容的幻灯片,以及如何根据需求灵活地隐藏或移除现有幻灯片。掌握这些技能,将极大地提升您在自动化办公、数据报告生成和演示文稿管理方面的效率。Spire.Presentation 的强大功能远不止于此,它在自动化文档处理领域拥有广阔的应用前景,期待各位开发者能利用它创造更多有价值的解决方案。

前言

在做图片相关功能时,有一个需求几乎绕不开:
用户拖动参数,图片实时变化。

比如:

  • 调整模糊强度
  • 改变对比度、饱和度
  • 预览滤镜效果,再决定是否应用

在 UIKit 时代,我们可能会用 UIImageView + CoreImage + GCD 硬撸。
但到了 SwiftUI,很多人第一反应是:

SwiftUI + CoreImage + 实时预览,这事靠谱吗?

答案是:靠谱,但得用对方式。

这篇文章就从一个最小可用 Demo开始,一步一步把实时滤镜预览这件事讲清楚。

先说结论:实时预览的关键点是什么?

在 SwiftUI 里做 CoreImage 实时预览,核心其实只有三点:

  1. 图片渲染要尽量轻
  2. 滤镜计算不能阻塞主线程
  3. UI 状态变化要最小化

如果你一上来就把所有滤镜计算都丢进 body
那基本等于在和 SwiftUI 的刷新机制正面硬刚。

一个最基础的目标效果

我们先定一个目标:

  • 显示一张原图
  • 拖动 Slider
  • 实时调整高斯模糊强度
  • 图片随着 Slider 连续变化

这是绝大多数滤镜编辑页的基础形态。

Step 1:准备 CoreImage 的基础组件

先把 CoreImage 的几个核心对象准备好:

import SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins

let context = CIContext()
let filter = CIFilter.gaussianBlur()

这里有两个细节值得注意:

  • CIContext 应该尽量复用
  • 不要在 body 里反复 new CIContext

CIContext 本身是重量级对象,频繁创建会直接拖垮性能。

Step 2:一个最简单的 SwiftUI 结构

我们先搭一个最基础的页面结构:

struct ContentView: View {
    @State private var intensity: Double = 0.5
    let image = UIImage(named: "example")!

    var body: some View {
        VStack {
            Image(uiImage: image)
                .resizable()
                .scaledToFit()

            Slider(value: $intensity)
                .padding()
        }
    }
}

到这一步,UI 是没问题的,但还没有任何滤镜逻辑

Step 3:把 CoreImage 滤镜接进来

关键思路是:
不要直接操作 UIImage,而是用 CIImage 作为中间态。

我们先写一个专门负责“生成滤镜图片”的方法:

func applyProcessing() -> UIImage {
    let beginImage = CIImage(image: image)
    filter.inputImage = beginImage
    filter.radius = Float(intensity * 20)

    guard let outputImage = filter.outputImage else {
        return image
    }

    if let cgimg = context.createCGImage(outputImage, from: beginImage!.extent) {
        return UIImage(cgImage: cgimg)
    }

    return image
}

这段代码做了几件事:

  1. UIImage 转成 CIImage
  2. 设置滤镜参数
  3. 通过 CIContext 渲染成 CGImage
  4. 再转回 UIImage

Step 4:把实时预览“接”到 SwiftUI 状态上

接下来是最关键的一步:
让 SwiftUI 在 Slider 变化时刷新图片,但不炸性能。

先引入一个新的状态:

@State private var processedImage: UIImage?

然后改造 body

var body: some View {
    VStack {
        Image(uiImage: processedImage ?? image)
            .resizable()
            .scaledToFit()

        Slider(value: $intensity)
            .padding()
            .onChange(of: intensity) { _ in
                processedImage = applyProcessing()
            }
    }
}

此时你已经可以看到:

  • Slider 一动
  • 图片跟着变
  • 滤镜是实时的

但——
这还不是一个“能上线”的写法。

性能问题从哪开始暴露?

当你快速拖动 Slider 时,会发现:

  • UI 有轻微卡顿
  • 真机上比模拟器更明显
  • 图片越大,问题越严重

原因也很直接:

滤镜计算跑在主线程。

Slider 的 onChange 本身就在主线程,
CoreImage 渲染又是 CPU / GPU 混合操作,
自然会影响 UI 响应。

Step 5:把滤镜计算移出主线程

一个简单、有效的方式是:
Task + MainActor 控制线程切换。

改造 onChange

.onChange(of: intensity) { _ in
    Task.detached {
        let output = applyProcessing()
        await MainActor.run {
            processedImage = output
        }
    }
}

这样做之后:

  • 滤镜计算在后台执行
  • UI 只负责展示结果
  • 拖动 Slider 明显顺滑很多

这一步,是“能不能实时预览”的分水岭。

再往前一步:为什么 SwiftUI 特别适合做这件事?

如果你用 UIKit 做过类似功能,会发现:

  • 手动管理线程
  • 手动刷新 ImageView
  • 状态和 UI 同步很痛苦

而 SwiftUI 的优势在于:

  • 状态驱动 UI
  • 图片只是状态的一个映射
  • 滤镜逻辑和 UI 逻辑可以完全解耦

你只需要保证一件事:

状态更新是轻的,计算是异步的。

一点真实项目里的经验总结

在真实项目中,我一般会遵守这几个原则:

  1. Slider 变化频繁时,必要时做节流
  2. 滤镜链尽量复用,不要每次 new
  3. 大图先 downscale 再做预览
  4. 最终导出时再跑一次“高质量渲染”

实时预览追求的是“看起来对”
而不是“每一帧都是最终质量”

总结

SwiftUI 并不是不适合做图像处理,
而是不能用同步思维去写异步计算

一旦你把:

  • CoreImage 的计算
  • SwiftUI 的状态刷新
  • 主线程和后台线程的职责

这三件事理顺了,
实时滤镜预览这件事,其实比 UIKit 时代要轻松得多。

汽车供应链作为制造业中最复杂的网络之一,正面临着前所未有的挑战。全球化的供应链布局、多级供应商体系、频繁的需求波动以及外部环境的不确定性,使得传统管理方式显得力不从心。近年来,随着人工智能技术的成熟,"工业超级智能体"逐渐成为解决这些痛点的关键工具。它不仅仅是技术的堆砌,更是一种全新的供应链管理范式,通过数据驱动和智能决策,实现供应链的全链路协同与自主优化。
一、供应链的复杂挑战与智能体的必要性
汽车供应链的复杂性远超一般人的想象。一辆汽车包含上万个零部件,涉及数百家直接供应商和数千家间接供应商,任何环节的延迟或异常都可能导致整个生产线的停滞。例如,2021年的芯片短缺就让全球汽车产量减少了超过1000万辆。与此同时,市场需求的个性化趋势日益明显,消费者对配置、颜色和功能的定制化需求使得排产计划变得极其复杂。再加上疫情、地缘政治等外部风险的频繁冲击,传统基于经验和局部优化的管理方法已经难以应对。
工业超级智能体的价值正是在这种背景下凸显出来。它不同于传统的ERP或SCM系统,后者更多是流程的电子化记录工具,而智能体则具备主动感知、分析和决策的能力。通过接入物联网设备、ERP系统、物流平台等多源数据,智能体能够实时监控供应链状态,预测潜在风险,并自动生成应对方案。举个例子,当某个供应商的原材料质量出现波动时,智能体不仅能立即预警,还能通过历史数据和替代方案库,在几分钟内推荐最优的供应商切换策略,甚至自动触发订单调整流程。这种能力使得供应链从"被动响应"转向"主动防控",大幅提升了整体韧性。
二、智能体技术的核心架构与运作机制
工业超级智能体的落地离不开一套成熟的技术架构。以Geega供应链智能体为例,其系统分为三层:数据感知层、智能决策层和执行协同层。数据感知层通过物联网设备和系统接口,实时采集供应商产能、物流状态、库存水平等300余类数据;智能决策层则融合了机器学习算法和行业知识图谱,能够进行需求预测、风险评级和方案模拟;执行协同层通过与ERP、WMS等系统的集成,将决策转化为实际操作指令。
这套架构的独特之处在于其"感知-决策-执行"的闭环能力。例如,当预测到未来两周某车型需求将上升20%时,智能体会自动模拟三种供应方案:增加现有供应商订单、启用备用供应商或调整生产节奏。它会综合考虑成本、交货期和风险系数,选择最优方案并自动下发执行指令。整个过程无需人工干预,但却能保持95%以上的决策准确率。更值得一提的是,智能体具备持续学习能力。每次决策执行后,它会对比实际结果与预测结果,自动优化算法模型。这种自我迭代的机制使得系统越用越智能,逐步降低对人工经验的依赖。
三、从理论到实践:行业案例深度解析
广域铭岛在其打造的供应链智能体中,实现了对500余家核心供应商的实时监控。系统通过智能算法,将供应商的交货准时率从82%提升至96%,同时将库存周转天数减少了18天。
特斯拉通过其自主研发的供应链智能体,实现了电池原材料采购的精准预测,将采购周期从60天压缩至35天
某国外汽车集团则通过智能体系统,将全球工厂的设备备件库存降低了30%,同时保证了99.5%的供应及时率。这些案例共同证明,工业超级智能体正在重塑汽车供应链的运作模式,使其变得更加敏捷、高效和抗风险。

在上篇文章,我们学会了现代 CSS 颜色的基础用法。

本篇我们进入更高级的领域:如何像设计师一样操纵颜色

CSS 现在能做的事情,甚至比设计软件还要强大!

1. 操纵颜色

1.1. 基础回顾

先复习一下上篇文章的内容:

:root {
  --primary: #ff0000;
}

.primary-bg-50-opacity {
  /* h s l 不是字母,是变量! */
  background: hsl(from var(--primary) h s l / 0.5);
}

注意: h s l 这三个字母其实是变量,分别存储了色相(hue)、饱和度(saturation)、亮度(lightness)的值。

我们可以替换这些变量,比如给绿色(#00ff00)加点蓝:

/* 基础绿色没有蓝色成分 */
.green-with-a-touch-of-blue {
  /* 在蓝色通道加 25 */
  color: rgb(from #00ff00 r g calc(b + 25));
}

这就像调色板,在基础的绿色中,添加点“蓝色颜料”。

1.2. 实用技巧

掌握了基础用法,我们就可以讲些实际开发中会用到的场景了。

  1. 创建互补色(色轮对面的颜色):
:root {
  --color-primary: #2563eb; /* 蓝色 */

  /* 色相加 180 度,跳到对面 */
  --color-secondary: hsl(from var(--color-primary) calc(h + 180) s l);
}
  1. 创建三色组合:
:root {
  --color-primary: #2563eb;

  /* 色轮上均匀分布 120 度 */
  --color-secondary: hsl(from var(--color-primary) calc(h + 120) s l);
  --color-tertiary: hsl(from var(--color-primary) calc(h - 120) s l);
}

就像时钟:12 点是主色,4 点和 8 点是配色,完美对称!

使用效果如下:

<!-- 这是一张图片,ocr 内容为:CHANGE THE PRIMARY COLOR: -->

  1. 相对调整
:root {
  --color-primary-base: #2563eb;

  /* 比基础色亮 25% */
  --color-primary-lighter: hsl(from var(--color-primary-base) h s calc(l + 25));

  /* 比基础色暗 25% */
  --color-primary-darker: hsl(from var(--color-primary-base) h s calc(l - 25));
}

使用这种方法,不管基础色是多亮,都会相对地变亮或变暗。

这就像调空调,“比现在低 5 度”比“设定到 20 度”更灵活。

使用效果如下:

<!-- 这是一张图片,ocr 内容为:CHANGE THE PRIMARY COLOR: -->

2. 暗黑模式的层次感

现在我们能相对调整颜色了,可是究竟有什么用呢?

让我给你举个具体的使用场景。

在浅色主题中,我们可以根据阴影来区分层次:

<!-- 这是一张图片,ocr 内容为:LEVEL 1 LEVEL 2 LEVEL 3 -->

但在深色背景下,阴影的效果并不明显。

因此在深色主题中,我们希望每个层次的颜色略微变浅。

借助上篇讲过的 light-dark()和相对颜色调整,我们便可以实现:

:root {
  --surface-base-light: hsl(240 67% 97%);
  --surface-base-dark: hsl(252 21% 9%);
}

/* 第一层:基础层 */
.surface-1 {
  background: light-dark(var(--surface-base-light), var(--surface-base-dark));
}

/* 第二层:稍微亮一点 */
.surface-2 {
  background: light-dark(var(--surface-base-light), hsl(from var(--surface-base-dark) h s calc(l + 4)));
}

/* 第三层:再亮一点 */
.surface-3 {
  background: light-dark(var(--surface-base-light), hsl(from var(--surface-base-dark) h s calc(l + 8)));
}

想象一下深海:越接近水面,光线越充足。暗色模式的层次就是这个原理。

使用效果如下:

<!-- 这是一张图片,ocr 内容为:LEVEL 1 LEVEL 1 LEVEL 2 LEVEL 2 LEVEL LEVEL 3 -->

3. 完整配色方案

设计师创建配色方案时,不只是简单地调整亮度,还会同时微调色相和饱和度,比如

  • 变亮时:饱和度增加,色相向冷色调偏移
  • 变暗时:饱和度降低

这便可以通过 CSS 来实现:

:root {
  --primary-base: hsl(221 83% 50%);

  /* 400: 亮度60%,色相-3度,饱和度+5% */
  --primary-400: hsl(from var(--primary-base) calc(h - 3) calc(s + 5) 60%);

  /* 300: 亮度70%,色相-6度,饱和度+10% */
  --primary-300: hsl(from var(--primary-base) calc(h - 6) calc(s + 10) 70%);

  /* 以此类推... */
}

为什么要这么麻烦呢?

因为只调亮度会让浅色看起来“失去活力”。

就像拍照:自动模式能拍,但手动调整曝光、对比度、色温会更漂亮。

为了让你更直观地看到变化

<!-- 这是一张图片,ocr 内容为:PRIMARY COLOR SCALE SYSTEMS PERCEPTUAL SCALE(ADJUSTS HUE & SATURATION) 200 700 900 600 1000 100 400 800 500 300 FLAT SCALE(ONLY LIGHTNESS CHANGES) 600 500 400 300 100 700 1000 900 800 200 -->

第一排是都调整的版本,第二排是未调整色相和饱和度的版本。

最明显的区别在于 100、200 和 300 这几个色块,当仅调整亮度值时,颜色看起来失去了一些鲜艳度。

4. OKLCH 更科学的配色方式

4.1. 问题:HSL

HSL 虽然很棒,但在使用时,你会发现一些问题,让我们看个例子:

.green-bg {
  /* 饱和度 100%,亮度 50% */
  background: hsl(100 100% 50%);
  color: white;
}

.blue-bg {
  /* 同样饱和度 100%,亮度 50% */
  background: hsl(220 100% 50%);
  color: white;
}

你会发现,色和蓝色的饱和度、亮度虽然完全一样,但视觉效果完全不同:

<!-- 这是一张图片,ocr 内容为:BLUE GREEN -->

明显蓝色背景上的文字清晰易读,对比度超过 5,而绿色背景上的文字却很难看清,对比度仅略高于 1。

之所以会这样,是因为 HSL 的“亮度”不符合人眼感知。

人眼对绿色比蓝色更敏感,所以同样的“50%亮度”,绿色看起来更亮。

4.2. 解决:OKLCH

而这就是 oklch() 的优势。

OKLCH 是基于感知亮度设计的:

.consistent-green {
  background: oklch(0.54 0.23 261);
}

.consistent-blue {
  background: oklch(0.54 0.23 146);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为:BLUE GREEN -->

现在不管什么颜色,亮度值相同,人眼看起来的亮度就相同!

4.3. 讲解:OKLCH 的三个参数

在 LCH 颜色模型中:

第一个值是亮度(Lightness),取值范围为 0 到 1。它的计算方式与 HSL 略有不同,因为它基于感知亮度,但概念相同,即 0 是黑色,1 是白色。

第二个值是色度(Chroma),类似于饱和度,0 是灰色,越大越鲜艳,但最大值不固定,取决于亮度和色相(这是 OKLCH 最麻烦的地方)

第三个值是色相(Hue),和 HSL 一样是色轮,0 到 360 度,区别是 0 度是洋红色(HSL 里 0 度是红色)

OKLCH 的尴尬之处就在于色度(Chroma)的最大值会变:

/* 某些色相+亮度组合,0.4 已经是极限 */
.max-chroma-1 {
  background: oklch(0.6 0.4 120);
}

/* 但另一些组合,0.4 可能太高或太低 */
.max-chroma-2 {
  background: oklch(0.8 0.4 200); /* 可能超出范围 */
}

就像不同口味的饮料,有的最浓是“3 勺糖”,有的最浓是“5 勺糖”,没有统一标准。

4.4. 实用技巧:结合相对颜色

虽然直接写 OKLCH 值很麻烦,但我们可以用 HSL 定义基础色,然后用 OKLCH 保持一致性:

.toast {
  --base-color: hsl(225, 87%, 56%); /* 用熟悉的 HSL 定义 */
}

[data-toast="info"] {
  /* 只改变色相,保持亮度和色度 */
  --toast-color: oklch(from var(--base-color) l c 275);
}

[data-toast="warning"] {
  --toast-color: oklch(from var(--base-color) l c 80);
}

[data-toast="error"] {
  --toast-color: oklch(from var(--base-color) l c 35);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为:USING OKLCH SOME GENERAL INFO TOAST THIS MIGHT END BADLY OH NO, SOMETHING HAS GONE WRONG! USING HSL SOME GENERAL INFO TOAST THIS MIGHT END BADLY OH NO,SOMETHING HAS GONE WRONG! -->

这样做的好处在于:不同颜色的提示框,边框对比度、整体饱和度感觉都很一致。

5. 混合颜色

有的时候,我们可能需要混合两种颜色:

.purple {
  /* 红色和蓝色各占 50% */
  color: color-mix(in srgb, red, blue);
}

就像调颜料:红色颜料加蓝色颜料,得到紫色。

目前必须定义一个颜色空间,所以必须写 in srgbin oklab 等,未来会默认用 oklab

不同颜色空间混出来的结果不一样:

<!-- 这是一张图片,ocr 内容为:SRGB OKLCH OKLAB XYZ XYZ -->

一般推荐:

  1. 先试 oklab
  2. 再试 oklch
  3. 不满意就换其他的

5.1. 控制混合比例

默认情况下,使用该功能时 color-mix(),每种颜色将使用 50% 的强度。

当然,我们也可以控制特定颜色的具体强度。

/* 90% 红色 + 10% 蓝色 */
.red-with-a-touch-of-blue {
  background: color-mix(in oklab, red 90%, blue);
}

/* 或者反过来写 */
.or-like-this {
  background: color-mix(in oklab, red, blue 10%);
}

5.2. 创建半透明色

有两种方法可以获得透明的值:

方法一:让总量小于 100%

/* 60% + 20% = 80%,所以透明度是 80% */
.semi-opaque {
  background: color-mix(in oklab, red 60%, blue 20%);
}

方法二:混入 transparent

/* 30% 的不透明红色 */
.thirty-percent-opacity-red {
  background: color-mix(in oklch, red 30%, transparent);
}

不过如果只是想降低透明度,还是用相对颜色更直接:

.better-way {
  background: rgb(from red r g b / 0.3);
}

5.3. 小技巧:分段渐变

/* 不用手动算中间的每个颜色,color-mix 帮你搞定 */
.banded-gradient {
  background: linear-gradient(to right, red, color-mix(in oklch, red 75%, blue), color-mix(in oklch, red 50%, blue), color-mix(in oklch, red 25%, blue), blue);
}

使用效果如下:

<!-- 这是一张图片,ocr 内容为: -->

6. 未来更简单

重复写这些代码很烦?

CSS 自定义函数快来了:

/* 定义函数 */
@function --lower-opacity(--color, --opacity) {
  result: oklch(from var(--color) l c h / var(--opacity));
}

/* 使用函数 */
.lower-opacity-primary {
  background: --lower-opacity(var(--primary), 0.5);
}

或者定义整套色阶函数:

@function --shade-100(--color) returns <color> {
  result: hsl(from var(--color) calc(h - 12) calc(s + 15) 95%);
}

@function --shade-200(--color) returns <color> {
  result: hsl(from var(--color) calc(h - 10) calc(s + 12) 85%);
}
/* 以此类推... */

.call-to-action {
  background: --shade-200(var(--accent));
}

.hero {
  background: --shade-800(var(--primary));
  color: --shade-100(var(--primary));
}

一次定义,到处使用,完美!

7. 总结

最后总结下本篇文章的重点:

  1. 用 calc() 操纵颜色 - 数学生成配色方案
  2. OKLCH - 基于人眼感知的颜色系统,不同色相亮度一致
  3. color-mix() - 像调颜料一样混合颜色

在实际使用时:

  • 简单需求:相对颜色 + HSL
  • 需要视觉一致性:OKLCH
  • 需要混合颜色:color-mix()
  • 暗黑模式层次:light-dark() + 相对颜色

本篇整理自《A pragmatic guide to modern CSS colours - part two》,希望能帮助到你。

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

在工程项目的复杂运作中,高效的工程协同对于确保各方顺畅合作、项目顺利推进至关重要。筑业软件的工程协同功能,以其独特的资料共享模式,为项目团队搭建了便捷的协作桥梁。
云端资料便捷分享
筑业软件赋予资料员强大的资料分享能力。资料员可将存储于云端丰富的工程资料,通过简单操作,依据接收方的账号或手机号进行分享。例如,在项目施工过程中,资料员整理好最新的施工进度资料,只需在软件界面选择分享功能,输入相关人员的手机号或账号,即可快速完成分享,确保资料及时传递给需要的团队成员。
即时查看与编辑
接收方一旦收到分享通知,登录云资料软件,就能立即查看与编辑接收到的工程资料。这种即时性极大地提升了工作效率,避免因等待资料传递或格式转换等问题造成的时间浪费。比如,项目技术负责人收到资料员分享的工程变更资料后,可即刻登录软件查看详细内容,并根据实际情况进行编辑批注,提出专业意见,为后续施工决策提供支持。
保障协作流畅性
该功能确保了项目团队成员之间资料的实时同步与更新,使得各方始终基于最新信息开展工作。无论是在施工现场的一线人员,还是位于办公室的管理层,都能通过云资料软件获取一致的资料,有效避免因信息不一致导致的误解和错误。例如,在多部门协作完成一项复杂工程任务时,各部门成员可随时查看和编辑共享资料,实时沟通协作,确保任务顺利推进,各个环节紧密衔接。
筑业软件的工程协同功能,通过云端资料分享、即时查看编辑、保障协作流畅以及灵活权限设置等特性,为工程项目各方提供了高效、便捷且安全的协作环境,有力推动项目的顺利实施与成功交付。

随着数字化发展的深入,合同作为一个重要的应用基础,也是第一时间进行数字化的转型,电子合同逐步替代了传统纸质合同。但是电子合同的厂商市场上却有很多,那这些厂商生成的电子合同是不是都是安全有保障的呢?今天我们便简单剖析一下各个厂商。

首先,我们要先明确一点的便是,国内并没有一个官方、绝对的“安全性排名”,因为不同厂商的安全架构、合规侧重和客户群体有所不同。但是,我们可以通过一套核心的安全评估框架,对国内主流的电子合同厂商进行对比分析,帮助判断哪家更符合您的安全要求。

  1. 核心安全评估框架

1) 合规性与认证(基础门槛)

Ø 等保三级:国内非银行机构最高备案认证,必备项。

Ø 商用密码产品认证:使用国密算法对数据进行加密的合规证明,必备项。

Ø ISO系列:27001(信息安全管理)、27701(隐私保护)、22301(业务连续性)等,国际通用标准。

Ø 行业特定合规:如公安行业的电子签章标准、医疗行业的HIPAA/GDPR(如涉及出海业务)等。

2) 技术安全性

Ø 加密技术:是否全链路采用SSL/TLS、数据存储加密、关键信息是否使用硬件加密机(HSM) 进行私钥保护。国密算法支持是重要加分项。

Ø 数据隔离与主权:是否为大型客户提供数据隔离部署(公有云、混合云、私有云),数据能否明确存储在国内。

Ø 安全运维与审计:是否有完善的内部安全管控、渗透测试、灾备体系。

3) 司法实践与证据效力

Ø 是否与公证处直连,形成在线争议解决闭环。

Ø 是否有大量的法院判例支持,其证据链是否被司法机构普遍采信。

Ø 是否提供从合同起草、签署到存证、出证的一站式服务。

  1. 主流厂商安全性特点分析(按综合安全能力排序参考)

基于以上框架,以下是国内市场主流厂商的特点分析:

第一梯队:综合安全能力最强,服务大型企业及政府机构

  1. 北京安证通信息科技股份有限公司

优势:

Ø 历史积淀与技术创新:拥有二十年电子签名领域经验,技术架构历经多次迭代,形成高稳定性、高扩展性的产品体系。

Ø ·大型企业服务经验:服务超过300家央企、国企及中国500强企业,包括中石油、中建五局等,积累大量复杂业务场景解决方案。

Ø ·全栈安全能力:从身份认证、电子签名到合同存证,构建多层次安全防护体系,通过等保三级认证,符合金融、政务等高安全要求场景。

Ø ·定制化服务能力:针对大型企业复杂业务流程,提供从咨询、实施到运维的全流程定制化服务,确保系统深度贴合业务需求。

安全侧重点:

在政府、集团企业、住建行业、工程建设行业等领域安全口碑突出,尤其注重行业合规与隐私保护等。

  1. 法大大

优势:

市场覆盖极广,生态集成度高。合规资质齐全(等保三级、密评、ISO系列等)。与腾讯云深度合作,背靠其安全能力。司法衔接广泛,已对接多家法院和仲裁委。

安全侧重点:

在各类行业均有大量标杆案例,安全体系经过海量业务验证,平衡了安全性与产品易用性。

  1. e签宝

优势:

行业头部厂商,阿里系投资,在政务和大企业市场占有率很高。拥有全链条的电子签名服务,从CA机构到签署平台。在政务领域的合规经验非常丰富。

安全侧重点:

特别符合国内政务和大型国企的安全与合规要求,对国内标准理解深刻。

第二梯队:在特定领域或场景有安全优势

  1. 腾讯电子签

优势:

背靠腾讯的安全能力和C端生态(微信),在个人与小B场景的便捷性和安全结合得很好。内生于腾讯云的安全体系,合规资质齐全。

安全侧重点:

依托腾讯整体安全防护,在防攻击、数据安全方面有天然优势。适合已使用腾讯生态的企业。

  1. 字节跳动电子签(飞书合同)

优势:

深度集成于飞书,主打内部管理和供应链协同场景。享有字节跳动的安全技术底座,在用户体验和内部风控流程结合上做得较好。

安全侧重点:

更适合飞书生态内的企业,实现办公、签约、数据的一体化安全管理。

  1. 契约锁

优势:

专注于电子印章的统一管理,常与OA、ERP系统集成,提供一体化印控方案。支持混合部署,满足集团型客户对物理印章和电子印章的统一管控需求。

安全侧重点:

印控安全和一体化管理,适合对内部用印流程风控要求极高的中大型组织。

技术架构的核心突破
工业智造超级智能体正在彻底改变汽车制造业的数字化转型路径。与传统的自动化系统不同,这种智能体采用了一种全新的架构设计——它不仅仅是简单的机器替代人力,而是构建了一个能够自主感知、分析和决策的智能生态系统。这个系统的核心在于将物联网、人工智能和大数据技术深度融合,形成一个能够自我学习和持续优化的智能网络。
在汽车制造领域,这种技术架构表现得尤为突出。以Geega平台为例,其架构设计专门针对汽车制造的特殊需求,包含了三个关键层次:实时数据感知层、智能决策层和自主执行层。数据感知层通过部署数以万计的传感器,实时采集生产线、设备状态、物料流动等全方位数据;智能决策层则运用机器学习算法对这些数据进行分析,生成最优的生产调度方案;自主执行层则将决策转化为具体的生产指令,实现从冲压、焊装、涂装到总装的全流程智能化控制。
这种架构设计使得汽车制造企业能够实现从被动响应到主动预测的根本转变。比如在焊装车间,系统能够实时监测焊接机器人的工作状态,预测可能出现的设备故障,提前安排维护计划,避免生产线停摆。这种预见性维护能力,正是传统制造系统所欠缺的。
实施过程中的关键考量
汽车制造工厂的数字化转型绝非易事,它需要一个系统性的实施路径。首先面临的挑战是数据基础的构建。汽车制造涉及上百个工序、数千个零部件,数据采集的复杂程度远超一般制造业。
接下来是算法模型的训练和优化阶段。这个阶段往往需要3-6个月的时间,期间需要工程师与产线人员密切配合,不断调整和优化模型参数。值得注意的是,每个汽车工厂的生产线布局、设备型号都有差异,这就需要智能体系统具备很强的自适应能力。某新能源汽车工厂在实施过程中就遇到了这样的问题——原有的质量检测算法在新产线上准确率只有85%,经过两个月的持续迭代才提升到99%以上。
最后是实现全价值链协同的阶段。智能体不仅要优化单个车间的生产效率,更要实现跨车间、跨工厂的协同运作。例如,当总装车间出现生产延误时,系统能够自动调整焊装和涂装车间的生产节奏,同时协调供应商调整零部件配送计划。这种全链路的协同能力,正是数字化转型带来的最大价值。
实践案例与成效分析
在具体实践方面,广域铭岛为某知名汽车集团打造的数字化转型方案取得了显著成效。该企业通过部署生产优化智能体,实现了焊装生产线效率提升38%,质量缺陷率降低65%。更令人印象深刻的是,系统能够实时预测设备故障,提前12-24小时发出预警,使非计划停机时间减少了85%。这些改进直接带来了每年数亿元的成本节约。
另一个典型案例来自某新能源汽车电池工厂。通过引入质量检测智能体,将电池检测准确率提升至99.8%,同时检测效率提高了6倍。这套系统不仅能够识别表面缺陷,还能通过分析生产过程中的数百个参数数据,预测潜在的质量风险。在实际运行中,系统成功预警了多次批量性质量事故,避免了数千万元的损失。
吉利汽车集团的数字化转型案例同样值得关注。通过构建智能供应链系统,实现了从订单到交付的全流程数字化管理。客户下单后,系统能够自动生成生产方案,实时调度生产线资源,将定制车型的交付周期从4周缩短到2周。这种柔性制造能力使得企业能够快速响应市场需求变化,在激烈的市场竞争中占据优势。
这些案例表明,工业智造超级智能体正在成为汽车制造业数字化转型的关键驱动力。它不仅提升了生产效率和产品质量,更重要的是改变了汽车制造企业的运营模式和价值创造方式。随着技术的不断成熟,预计未来三年内,采用智能体技术的汽车制造企业将获得25-35%的综合效益提升,这将成为决定企业竞争力的重要因素。

1月13日,Zoho宣布在迪拜、阿布扎比投建的两座数据中心正式投入运营。这是继2024年沙特利雅得、吉达数据中心落地后,Zoho在中东的又一重要基建动作。至此,Zoho在中东地区自建的数据中心已达四座,将用来全面提升对当地客户的服务响应效率与数据安全保障能力

图片

两座数据中心目前已获得迪拜电子安全中心 (DESC)颁发的CSP安全标准认证,并且符合 ISO 27001、ISO 22301、ISO 27017和CSA STAR二级数据中心认证标准。这意味着,Zoho有资格为当地政府、机构、企业及出海中东的海外企业提供安全可靠的数字化服务。

Zoho联合创始人沙伊莱什•戴维说到:「阿联酋是Zoho在中东的核心战略市场,目前已投资8000万迪拉姆(约合人民币1.52亿),两座数据中心的启用是我们持续投资中东市场战略的重要一步,更好地帮助企业实现本地数据存储,增强数据主权,并支持国家网络安全议程。」

过去五年,Zoho在中东市场的发展势头持续攀升,成功从早期的市场探索者蜕变为中东企业数字化转型的关键伙伴。仅在2025年,Zoho在阿联酋的业务就增长了38.7%,合作伙伴网络扩大了29%,本地员工人数增加了35%,助力7000多家企业实现数字化转型升级。

概述

阿里云安全保障急招安全工程师,在这里,有机会(可入职后培养):

1学习前沿云上攻防技能,落地创新安全架构方案,建设云上纵深防御架构体系。

2跟进前沿AI安全保障技能(如MCP/A2A Agent访问控制、Prompt Injection),保障AI场景数据安全、身份与访问控制安全,探索AI时代产品的最佳安全实践。

3在全栈可控的技术安全治理体系中,紧跟前沿AI Agent技术,将AI智能化技术落地到安全保障流程中,提升治理效果、效率。

投递方式:aliyun_xz@service.aliyun.com

岗位一:SDL安全专家(AI智能化)

职责要求:

能够深入产品线产研流程,理解安全需求,度量/管理产线安全风险,并推动安全加固方案的落地执行,推动产线实现纵深防御体系

推进产线DevSecOps安全发布流程建设,完成产品架构评审、风险扫描、代码审计、漏洞修复等基础安全运营工作,探索安全左移工作

负责大型产品整体上云安全架构设计及安全解决方案设计

根据业务线的特性,制订定制化的安全解决方案,对业务进行威胁建模,针对安全薄弱点,定期进行全链路攻防演练

负责设计、评估云产品对客安全能力,推动云产品默认安全建设,增强客户对云产品的安全感、信任感

负责将安全领域专家知识转化为AI Agent、数据集、Prompt,推动SDL流程智能化

技能要求:

有安全攻防经验,熟悉常见的web漏洞原理以及对应的修复方法

熟悉常见的安全运营工具,包括黑白灰盒、waf、rasp、sca等

熟悉Java\Python\Go\C/C++中至少一种编程语言,能够独立编写脚本和简单程序,有代码审计工作经验者尤佳

需有良好的沟通、协调、风险管理能力,能够独立推动前沿安全解决方案在产研团队的落地

具备安全架构设计经验,能够结合产研团队诉求(稳定、性能、体验、成本)设计合理的安全架构方案,并推动落地

具备数据度量思维,熟练掌握SQL、数据报表技能,能够清晰地梳理产线风险水位、安全治理效能,并尽量通过数据来论证,帮助产线一号位理解安全治理逻辑,并影响其决策,推动产线安全水位良性上升。

能够将安全领域专家知识持续沉淀为标准化语料数据,将DevSecOps的治理策略转化为Prompt,并推动Agent集成到DevSecOps流程中,提升流程智能化水位。

(加分)具备AI Agent实践、运营经验,掌握如何提升Agent效果的调优技巧

岗位二:云原生安全架构师

职责描述:

负责参与云上云原生安全体系建设,探索AI&云场景下的云原生最佳实践,推动最佳实践在云产品的落地

评审PaaS类云产品安全架构,基于风险,设计符合纵深防御要求的安全架构解决方案,并推动产研团队将安全架构解决方案落地

支撑供应链安全漏洞应急分析、修复方案落地与设计

负责推动热修复、热迁移方案设计并推动落地,评估并支持提升功防场景的云产品可用性

技能要求:

具备容器安全、虚拟化安全相关经验

具备功防演练实战经验

具备威胁建模、安全架构设计经验

熟悉常见的安全运营工具,包括黑白灰盒扫描工具、waf、rasp、sca等

熟悉Java\Python\Go\C/C++中至少一种编程语言,能够独立编写脚本和简单程序,有代码审计工作经验者尤佳

(加分)先知、补天、漏洞盒子、HackerOne、BugCrowd、ASRC、TSRC等平台有高质量漏洞提交的白帽子。或挖掘过高质量CVE/CNVD漏洞。

(加分)主导高质量的安全类开源项目

(加分)负责过大型安全架构改造项目,并具备落地成绩

(加分)熟悉DevSecOps流程,具备相关经验和成绩

(加分)具备AI类产品功防经验或对AI场景具备极大兴趣和思路

为了标准化 iOS 和 Android 平台的事件工具,Uber 工程团队重新设计了其移动分析架构,解决了所有权分散、语义不一致和跨平台数据不可靠的问题,目标是简化工程工作,提高数据质量,并为骑手和司机应用的产品和数据团队提供可靠的洞察。

 

根据 Uber 工程师的说法,移动分析对于决策、功能采用和衡量用户体验至关重要。随着应用程序和团队的增长,工具变得分散。功能团队独立定义并发出事件,共享 UI 组件常常缺乏分析钩子,类似的交互在不同的团队中有不同的记录方式。其结果是,超过 40%的移动事件属于自定义或临时事件,这不仅增加了分析复杂度,还降低了聚合指标的可信度。

 

为了应对这些挑战,工程师将核心分析职责从功能级代码转移到了共享基础设施。他们与产品、设计和数据科学团队合作,定义了点击、展示和滚动等标准事件类型。这些事件基于共享模式通过代码生成,在 UI 组件层进行监控,通过集中式报告层输出,由后端服务进行数据增强,并通过 Uber 的分析管道进行消费。

Uber 移动分析系统架构(图片来源:Uber博客

 

其中一项关键决策是将分析逻辑嵌入到平台级 UI 组件中。工程师引入了分析构建器,用于管理事件生命周期、元数据附件和事件发出逻辑,使功能团队可以开展标准化的分析工作而无需编写自定义工具。他们对包含 100 个展示记录组件的示例应用做了性能测试,结果显示,CPU 使用率或帧率没有退化,这是在性能敏感设备上推广该工具的先决条件。

ImpressionAnalyticsBuilder 类事件生成的数据流图(图片来源:Uber博客

 

该平台还实现了常见的元数据收集。应用级元数据(如接送地点或餐厅 UUID)会自动记录,而事件类元数据(包括列表索引、行标识符、滚动方向和视图位置)则由 AnalyticsBuilder 捕获。界面通过 Thrift 模型实现了标准化,可以确保容器视图、按钮和滑块的日志记录保持一致。

分析元数据金字塔概览(图片来源:Uber博客

 

为了验证平台有效性,工程师通过新旧 API 对两个功能进行了 dual-emitted 分析。查询结果表明,跨平台事件量、元数据及界面是匹配的,而像滚动开始/停止计数和视图位置等语义也保持了一致。试点应用揭示了平台和记录方法的差异,并突出了列表增强的好处——将多个行事件合并为单个标准化事件,简化了查询并提高了可测试性。功能团队还采用了可见性检查机制,减少了自定义实现。

 

试点应用之后,Uber 分析团队进行了旧事件到标准化 API 的迁移,使得产品团队可以专注于他们的路线图。在需要支持的地方,他们创建了自动化脚本,扫描 iOS 和 Android 代码,评估高优先级事件,并生成适合迁移的列表。平台团队还添加了一个 linter,目的是拦截使用非标准 API 新建的点击或展示事件,防止它们进一步漂移。根据工程师的反馈,跨平台一致性得到提升,元数据和语义保持了统一,工具代码量减少,展示计数更可靠,并实现了可扩展的开箱即用 UI 交互覆盖功能。

 

展望未来,Uber 工程师正在通过组件化增强分析功能,为按钮和列表等 UI 元素分配唯一 ID,以便标准化事件命名和元数据,进一步减少开发人员的工作量。

原文链接:

https://www.infoq.com/news/2026/01/uber-mobile-analytics-platform/

助理安全研究员(漏洞挖掘与利用)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn

职位职位链接:https://360campus.zhiye.com/campus/detail?jobAdId=69b88265-4f41-4e90-b2e3-02ae630c7631

工作职责

1、深入研究软件、设备、系统、网络协议等某领域或多领域的安全漏洞,利用逆向工程、模糊测试、静态/动态代码分析等技术,主动发现并验证新的安全漏洞;

2、探索应用大语言模型(LLM)技术于Web与二进制领域的复杂漏洞挖掘,结合专业知识,设计构建相关自动化工具/流程;

3、研究前沿攻防技术,跟踪国内外安全动态与漏洞披露信息,复现漏洞,研究攻击手法和防御技术,持续提升公司的安全研究能力;

4、参与相关项目或课题,推动漏洞研究能力的价值转化。

任职资格

1、计算机科学、信息安全或相关领域本科及以上学历;

2、对Web和二进制安全漏洞有一定的认知,具备一定的逆向分析能力和研究能力,熟练使用常见工具,如:IDA、WinDbg、GDB等;

3、熟练掌握C/C++/Python等至少一种语言,熟悉X86或ARM汇编指令,有扎实的编程基础;

4、对漏洞挖掘与利用感兴趣,有热情和自我驱动力,有一定的抗压能力和较强的团队协作精神。

以上职位满足以下至少一项条件者优先录用:

1、参加过天府杯、Pwn2Own等赛事,并成功攻破目标,作为CTF主力选手取得过优秀的成绩。

2、在有影响力的业界会议(学术/工业)上发表论文;

3、有独立挖掘漏洞的经验,获得过主流厂商的CVE编号;

4、通过使用/定制/自研工具发现有效漏洞;

安全研究员(Windows方向)(北京)

薪资:17-19k,15薪,具体可进一步沟通

投递方式:campus@360.cn

职位直达链接:https://360campus.zhiye.com/campus/detail?jobAdId=d7b48154-dd38-45ee-9492-0b4baec1004a

工作职责

1持续跟踪并深入分析最新的Windows平台漏洞,研究其根本原理、高级利用技术及有效的缓解措施。

2研究和复现野外流行的攻击手法、APT攻击中使用的先进技术,特别是针对杀毒软件、EDR等安全产品的绕过技术(如白利用、无文件攻击、内存驻留、EDR盲点等)。

3基于研究成果,设计和开发创新的威胁检测模型和主动防御方案,并将其工程化,落地到实际的安全产品中,提升产品的核心检测与防护能力。

任职资格

1计算机科学、信息安全、网络工程或相关专业本科及以上学历。

2精通C/C++编程,熟悉Python等脚本语言,具备扎实的Windows平台开发能力(如Win32 API, Native API)。

3熟练掌握x86/x64汇编语言,能够熟练使用IDA Pro, WinDbg, x64dbg等工具进行静态分析和动态调试。

4深入理解Windows操作系统内核机制,包括内存管理、进程/线程调度、对象管理、文件系统、驱动模型等。

5对主流的漏洞利用技术(如ROP, JOP, 堆利用等)及相应的防御和绕过技术(如ASLR, DEP, CFG bypass)有深入的理解。

6 对安全研究抱有浓厚兴趣和热情,具备强烈的自我驱动力、好奇心和优秀的学习能力,能够独立解决复杂技术问题。
加分项(满足以下一项或多项者优先):

7有独立发现并分析过漏洞(有CVE编号者优先)的经验。

8有Windows内核驱动开发或内核安全攻防经验者优先。

9有反病毒、反外挂、EDR、HIPS等安全产品核心研发经验者优先。

10在知名安全会议或在安全社区、个人博客上发表过高质量技术文章者优先。

11在CTF竞赛中取得过优异成绩者优先。

度小满引入 Apache Doris 替换原有 Greenplum,实现整体查询效率提升 82%,与此同时,集群缩减 2/3、年省数百万的巨大效益。本文将分享度小满如何基于 Doris 从 0 到 1 构建超大规模数据分析平台,并围绕平滑迁移、异地多活容灾等方面,分享实践经验。

本文整理自度小满 Doris 数据库负责人汤斯在 Doris Summit 2025 中的演讲,并以演讲者第一视角进行叙述。

度小满金融(原百度金融)作为一家覆盖现代财富管理、支付、金融科技等多板块的科技公司,数据的分析处理对其极为重要,已经深度融入业务生命周期的每个环节,是进行风险控制、商业决策、用户体验优化及运营提效的基石。

随着业务高速发展,度小满原有基于 Greenplum 搭建的 OLAP 平台,逐渐暴露出三大痛点:

  • 规模与稳定性瓶颈:存储已接近饱和,扩容至百余台已接近硬件规模的承载上限,如果继续扩容,将面临更严重的稳定性挑战。

  • 性能与体验不佳:Greenplum SQL 查询执行速度慢,且经常出现 “计算时间远小于排队时间” 的情况,严重影响业务分析效率。

  • 缺失技术支持:当前使用的 Greenplum 6 版本技术架构已显得陈旧,并且 2024 年 Greenplum 宣布将停止开源,后续的技术支持与迭代升级将无法保障。

为了应对这些痛点,度小满金融迫切寻找更为高效、稳定且具备现代化技术架构的数据处理解决方案,以支持其未来的业务发展。

Apache Doris:高吞吐、快查询

面对日益增长的业务体量与复杂多变的分析需求,选用一个高效、可靠的数据库系统,已成为支撑业务稳健发展与快速创新的关键。Apache Doris 以其出色的性能表现与高度灵活的架构,成为众多场景下的优选方案。为深入验证其在海量数据与复杂分析场景中的能力,我们展开了一系列性能测试,关键结果如下:

  • 查询性能:在 1TB TPC-DS 标准测试集中, Apache Doris的查询速度约是 Greenplum 6 的 20-30 倍

  • 导入性能:在基于 Flink 写入的 TPS 测试中,基于单分片导入,压测最大 TPS 为:5000W/s

  • JSON 数据处理:针对新推出的 Variant JSON 数据类型,测试显示:存储 2-3 万 Key 时,其空间占用仅为普通 JSON 的 1/10 甚至更低,查询效率则提升至 10 倍以上

综上可知,Apache Doris 在写入吞吐、响应速度及存储效率上表现卓越,有力证明了其应对大规模、实时化、半结构化数据分析挑战的坚实技术基础。

基于 Apache Doris 的大规模数据分析平台

在上述详实的选型调研之后,我们决定采用 Apache Doris 替代原有 Greenplum 集群,构建超大规模数据分析平台。

为验证 Apache Doris 在真实业务场景中的表现,我们先进行了小范围试点,部署了少量 Doris 集群,并先行接入几个关键业务方。试点期间,系统在性能、稳定性和易用性方面获得高度评价。基于这一积极反馈,我们稳步扩展 Doris 集群规模,最终在效率与成本上实现大幅提升:

  • 整体效率:端到端分析任务耗时从 274 秒降至 47 秒,效率提升 82%,任务超时查杀比例从 1.3%骤降至 0.11%,降幅达 91%,彻底解决高峰期排队问题实现 0 排队,使分析师的工作不再因拥堵而中断,体验和生产力均有极大提升。

  • 集群成本:在同等资源成本下, Doris 仅以 1/3 的集群数量即可提供与 Greenplum 同等的服务能力,存储性能提升 200%。截至目前,已完成 百余台原 Greenplum 服务器的清退工作,以更少的硬件资源支撑了更高的计算与存储需求,实现年度硬件成本节约数百万元

从 0-1 数据平台建设经验

我们基于 Apache Doris 成功替换了 Greenplum,完成了从 0-1 的数据平台重构,覆盖架构设计、数据流转与业务协同的系统性工程。以下将围绕快速平滑迁移、异地多活容灾与全链路生态集成三个核心环节,展开具体实践。

01 快速迁移

为保障业务连续性与数据安全,我们开发了自动化迁移工具 SqlGlot,将大规模数据从原有 GP 集群迁移至 Doris 集群。整个过程历经半年,累计迁移 PB 级规模数据,全程业务无感知。

  • 表结构迁移:在表结构迁移阶段,团队从 GP 系统中导出表结构及相关元数据,借助 SqlGlot 工具实现字段映射与语法适配,并在此基础上完成分区构建与分桶策略设计,确保每个分桶数据量控制在 1G~3G 的合理范围内。该流程最终成功转换超过 20,000 张表,并保障了所有表的分区与分桶结构符合业务与性能要求。

  • 表数据迁移:我们通过分布式导出将 GP 数据并行迁移至 Doris 机器,并基于 Doris 官方推荐的 Stream Load 进行并发控制,以文件流式加载的方式高效导入数据至 Doris 集群。整个过程累计完成 PB 级规模数据迁移,稳定支持了 5000+ 次数据同步任务。

  • SQL 迁移:为解决因业务规模庞大、场景复杂而导致的官方工具语法支持不全的问题,我们基于 SqlGlot 并结合正则匹配能力,将 PostgreSQL SQL 高效转换为 Doris SQL。整个迁移流程包括“转换成功 → 执行成功 → 数据一致” ,累计完成约 47 万个 SQL 的转换,实现 95% 的执行成功率 与 92% 的数据一致率

02 异地双机房灾备

为保障数据安全并实现集群高可用,我们基于 Apache Doris 构建了异地双机房灾备架构,确保数据与服务具备跨机房容灾与双活能力。核心设计如下:

我们将所有 Doris 集群节点均匀部署于 A 与 B 两个异地机房,通过设置 tag.location 属性明确节点所属机房。用户账号按机房绑定,访问请求通过轮询机制自动分配,实现负载均衡(例如首次请求路由至 A 机房,第二次则路由至 B 机房)。建表时通过配置 location 参数,确保每张表在双机房各保留 2 个副本,从而达成数据异地双活与故障自动切换。

关键配置示例

  1. 设置节点机房标签

alter system modify backend ”BE1:9050" set ("tag.location" = "group_a");alter system modify backend ”BE2:9050" set ("tag.location" = "group_b");
复制代码

  1. 建表时指定双机房副本分布

CREATE TABLE ubevent (ts DATETIME, uid INT, ...) DUPLICATE KEY(ts) DISTRIBUTED BY HASH(uid) BUCKETS 10PROPERTIES ("replication_allocation" = "tag.location.group_b: 2, tag.location.group_a: 2");
复制代码

03 生态整合

为构建高效、稳定、易用的数据平台,我们还围绕 Apache Doris 进行系统性生态整合:

  • 计算引擎无缝集成:通过 Doris 官方提供的 Spark Connector 与 Flink Connector,实现了与现有 Spark、Flink 计算引擎的高效对接,保障了数据流水线稳定运行。

  • 运维体系化与自动化:集成 Prometheus、Grafana 及 Doris Manager,构建了覆盖监控、告警、管理与调优的自动化运维体系,全面提升集群稳定性与运维效率。

优化经验

为进一步提升数据平台的效率及资源利用率,在实际落地过程中,围绕集群、负载、存储等多维度总结了以下优化经验:

01 集群隔离

当前我们有多个 Doris 集群,为合理承接不同业务方的接入需求,我们主要依据业务成本与稳定性要求两大维度进行评估与路由。通常而言,稳定性越高,对应成本也越高。

新建集群时,稳定性最优,但相应成本也最高。为在成本与稳定性之间取得平衡,我们大多场景是基于 Workload Group 资源硬隔离方案,对 CPU 与内存进行资源组级别的隔离,有效减少不同业务负载间的资源竞争。若业务对稳定性的要求超出共享集群所能提供的范围,则仍需要通过新建独立集群来满足。

02 存储压力

在 Apache Doris 的落地与运维过程中,我们曾面临因业务快速增长带来的高达 80%-90% 的磁盘存储压力。针对这一问题,进行了一系列优化:

  • 控制表生命周期:部分业务或因对动态分区相关语法不熟悉,未主动采用该策略。为此,集成动态分区的参数配置,简化了开发难度,并提供统一注册入口,业务开发人员仅需选择是否开启、保留天数即可。

  • 修改压缩格式:将默认压缩算法从 LZ4 切换为 ZSTD。实测表明,存储空间平均节省约 50%,虽带来约 20%~30% 的 CPU 与内存负载上升,但整体 ROI 仍然较高。

  • 存储指标监控告警:为预防因误操作或异常行为导致的存储激增,建立了针对“人员”与“表”双维度的监控体系。环比分析业务人员数据占用趋势及单表每日增长量,可自动识别异常(如单日增长飙升至日常 10 倍),并及时触发告警及通知。

  • Hive 与 Doris 打通:在基于 Kerberos 认证的 Hive 环境中,对 Doris Hive Catalog 功能进行了二次开发,实现跨系统的直接数据访问,无需依赖 Flink 等同步工具,简化了架构并提升了数据使用效率。

03 负载均衡

为确保系统在负载高峰期的稳定运行,特别是应对异常 SQL 与大查询带来的资源压力,应对措施如下:

  • 双机房负载均衡:基于已有的异地双机房架构,通过轮询机制实现业务流量在 A 与 B 机房之间的自动分发:首个 SQL 请求路由至 A,次个请求则导向 B,以此循环,确保双机房负载均衡,避免单点资源过载。

  • SQL 参数限制:通过 enable_query_memory_overcommit = falseexec_mem_limit = 256 * 1024 * 1024 * 1024 等参数将最大占用内存限制为 256G,避免集群被打满,后续计划降至 60G。

  • Workload 资源队列动态调整:基于任务类型划分资源队列,配置 CPU 的软隔离和内存的硬隔离,并支持错峰调度。比如:例行任务通常在夜间执行,为其创建专门资源队列,数据分析等公共任务大多在白天执行,将配置更大的资源队列,随着白天/夜间需求的变化动态调整资源。此外,依据各队列负载设定并行度与并发数,控制任务排队时长。

  • 异常 SQL 拦截:实时识别与拦截异常 SQL,避免其影响 BE 节点稳定性。初期使用 Doris 内置正则规则进行拦截,但规则复杂导致 CPU 开销上升。为此,我们将拦截逻辑外移至平台层执行,以避免正则匹配及超大 JOIN 导致的 CPU 负载过高。

04 集群稳定性

随着集群规模不断扩大,保障 FE、BE 节点稳定性成为运维工作的核心挑战,为此,我们构建了以下保障体系:

  • 分层触达+全维度覆盖:根据不同指标优先级设置通知电话、短信、飞书提醒,P0 监控准确率 ≥80%;

  • 自动异常处理:为 FE 和 BE 的宕机重启设置了自动化处理方案,在识别到服务卡住时,系统会自动重启进程。此外,对于磁盘掉线,将自动下线故障盘并触发副本补齐。

我们同时采用对战分析、火焰图和日志查看等方法进行详细记录,以便后续调优。此外,编写了 SOP 手册,涵盖不同场景的应对措施,并进行了异常处理演练。

结束语

截至目前,我们已搭建 3 个基于 Doris 2.1.10 版本的线上集群,其中最大规模的集群达万 core 级别、上百 TB 内存和 PB 级磁盘。目前仍在扩容中,计划在年底前新增百余台 CN 节点和数十台 Mix 节点。未来,我们将重点关注并探索以下能力:

  • 存算分离:重点关注 Doris 3.X 版本的存储分离架构,推动落地实践。

  • 湖仓一体:全面打通数据湖与数据仓库,目前已小规模试点 Paimon;此外,针对数据外置场景,计划通过异步物化视图提升查询性能。

  • 智能物化视图探索:引入语义建模与 AI 智能分析,降低研发与业务沟通门槛,并对智能推荐与模板化方案进行探索与实践。

是的,PHP 拥有光明的未来。各位看官可能会觉得这是玩笑,但您别急,且听我扯几句。这不是标题党,也不是哗众取宠。这是楼主近几天实实在在的有感而发。

这一切源于最近我家小朋友有了编程的兴趣;在尝试学第一门编程语言。让我意想不到的是,他选择了 PHP 。我很惊讶,PHP 不是没落了吗?大家讨论的都是 JS ,Go ,Rust ,Python 等等热门语言,按理说小孩网上怎么搜也不会蹦出 PHP 这三个字母吧。令我更意想不到的是,他学得津津有味。而且已经有了一些成果。观察几天后,我才发现,这一切并非偶然。

最重要一点因素,是 PHP 有最友好的社区,没有之一。不管是内外网,PHP 社区有极高的包容度。PHP 的讨论区很少有无谓的争吵,虚荣的推销。相反,PHP 社区有很多在其他圈子少见的谦逊与耐心 — 这也是我小孩喜欢网上讨论 PHP 的关键因素:当其他社区因为一个语法糖,一个框架,一个包争得面红耳赤时,经验丰富的 PHP 程序员却愿意放下姿态去回答几岁小孩的入门问题。进入 Zig ,Rust 等等社区,你会看到如邪教一般的传道与重写,我一个大人都有点承受不住。为了小孩的身心健康,我打心底更愿意小孩在 PHP 社区成长。

另外,不管喜不喜欢这门语言,少有人会否认 PHP 一直是一门及其实用且稳定的语言。尤其在 web 1.0 时代,PHP 绝对是指哪打哪的大杀器。哪怕是今天,快速迭代一个中小型全栈项目,很多人都会拿起 Laravel/ThinkPHP 。而现代化的 PHP 8 更是吸收了各家所长,OOP ,函数式,协程,可以说要什么有什么。更难能可贵的是在快速迭代的同时依然保持了高度的兼容性。对比乱成一锅粥的 Node/JS ,小孩写的 PHP 代码,不管是老语法,还是旧框架,往往都能运行,正向反馈频繁。我相信现在这些代码 5 年后依然能正常运行。

看到这里,您可能就明白我为什么说 PHP 有光明的未来了。后浪推前浪,世界终归是我们下一代的。当孩子们选择了 PHP ,他们怎么不会再一次为 PHP 带来阳光呢。

— 于 PHP 8.5 发布日

temporal 官网示例

python:

@workflow.defn
class SleepForDaysWorkflow:
    # Send an email every 30 days, for the year
    @workflow.run
    async def run(self) -> None:
        for i in range(12):
            # Activities have built-in support for timeouts and retries!
            await workflow.execute_activity(
                send_email,
                start_to_close_timeout=timedelta(seconds=10),
            )

            # Sleep for 30 days (yes, really)!
            await workflow.sleep(timedelta(days=30))

ruby:


# Send an email every 30 days, for the year
class SleepForDaysWorkflow < Temporalio::Workflow::Definition
  def execute
    12.times do
      # Activities have built-in support for timeouts and retries!
      Temporalio::Workflow.execute_activity(
        SendEmailActivity,
        start_to_close_timeout: 10
      )

      # Sleep for 30 days (yes, really)!
      Temporalio::Workflow.sleep(30 * 24 * 60 * 60)
    end
  end
end

C#:

[Workflow]
public class SleepForDaysWorkflow
{
    // Send an email every 30 days, for the year
    [WorkflowRun]
    public async Task RunAsync()
    {
        for (int i = 0; i < 12; i++)
        {
            // Activities have built-in support for timeouts and retries!
            await Workflow.ExecuteActivityAsync(
                (Activities act) => act.SendEmail(),
                new() { StartToCloseTimeout = TimeSpan.FromSeconds(10) });

            // Sleep for 30 days (yes, really)!
            await Workflow.DelayAsync(TimeSpan.FromDays(30));
        }
    }
}

PHP:

class SleepForDaysWorkflow implements SleepForDaysWorkflowInterface
{
  // Send an email every 30 days.
  public function sleepForDays(): void
  {
      for ($i = 0; $i < 12; $i++) {
          // Activities have timeouts, and will be retried by default!
          $this->sendEmailActivity->sendEmail();

          // Sleep for 30 days (yes, really)!
          Workflow::sleep(30 * 24 * 60 * 60)
      }
  }
}

感觉对于 java 程序员 php 的心智负担好小啊

Agoda 近日分享了他们如何将多个独立的数据管道整合为一个基于Apache Spark的集中式平台,以消除财务数据中的不一致性的。该公司构建了一个多层质量保障框架,结合自动化校验、基于机器学习的异常检测以及与上游团队签订的数据契约(data contracts),确保用于财务报表和战略规划的财务指标准确无误,同时每天处理数百万笔预订交易。

 

这一问题源于一个典型的企业架构模式,Agoda 的数据工程、商业智能(BI)和数据分析团队各自开发了独立的财务数据管道,并使用不同的逻辑和定义。尽管这种做法在初期提供了简单性和清晰的责任边界,却导致了重复计算和全公司范围内指标不一致的问题。正如 Agoda 工程团队的Warot Jongboondee所解释的那样,这些差异“可能对 Agoda 的财务报表产生实质性的影响”。

独立的财务数据管道 (图片来源)

 

为了解决这一挑战,Agoda 推出了名为 Financial Unified Data Pipeline(FINUDP)的统一财务数据管道,作为销售、成本、收入和利润率等关键财务数据的单一事实来源(single source of truth)。该系统基于Apache Spark构建,每小时向下游团队提供更新,用于对账和财务规划。整合过程耗费了大量的精力:协调产品、财务和工程等多个利益相关方就统一的数据定义达成共识耗费了很长的时间;初始版本的运行时间长达五小时,后通过查询优化和基础设施调整,最终缩短至约 30 分钟。

财务统一数据管道(FINUDP)的架构(图片来源)

 

Agoda 的质量保障框架采用了多重防御机制。自动化校验会检查数据表中的空值、数值范围约束和数据完整性。一旦关键业务规则校验失败,管道会自动暂停,以防处理可能错误的数据。团队使用Quilliup来比对源表与目标表。与上游团队的数据契约(Data Contracts)会明确约定数据格式、内容和质量要求,任何违反契约的行为会立即触发告警。机器学习模型会持续监控数据模式,识别潜在异常。三级告警系统确保通过邮件、Slack 通知以及内部工具实现快速响应,如果数据更新延迟,系统会自动升级至 Agoda 的 7×24 小时网络运营中心(Network Operations Center,NOC)。

 

这一做法契合了行业的整体趋势。根据最新的行业调研,64%的组织将数据质量问题视为最大挑战。Gartner 指出,数据契约正成为“管理、交付和治理数据产品的一种日益流行的方式”。这类生产者与消费者之间的正式协议,明确定义了数据模式(schema)和质量标准。

 

当然,集中化也带来了明确的权衡取舍(trade-offs)包括,开发速度下降,因为任何变更现在都需要对整个管道进行测试。数据依赖,管道必须等待所有上游数据集就绪后才能启动。详尽的文档编写和广泛的干系人共识拖慢了落地进度,却建立了跨团队的信任。Jongboondee 表示,集中化“要求在每个环节都进行更紧密的协作和审慎的变更管理”。

 

目前,该系统已经实现了 95.6%的可用性,并朝着 99.5%的目标迈进。所有变更均需经过影子测试(shadow testing),也就是,在合并请求中,新旧版本的查询会并行运行,并自动比对结果。此外,还有一个与生产环境完全一致的专用 staging 环境,允许团队在正式发布前进行充分的验证。

 

FINUDP 项目表明,当企业处理大规模关键业务数据时,正逐步从零散的、事后补救式的质量检查,转向架构层面强制执行的、端到端的可靠性体系。这种体系优先保障数据的一致性与可审计性,而非单纯的开发速度,这一转变在财务数据日益支撑报表生成、机器学习模型训练和监管合规流程的今天,显得尤为关键。

 

原文链接:

How Agoda Unified Multiple Data Pipelines Into a Single Source of Truth

「一键部署你的专属服务器」——WNMP 一键包,让 Web 环境搭建回归简单

还在为 Nginx + PHP + 数据库 的复杂安装而头疼吗?
WNMP 一键包,让这一切变成——一行命令搞定。

apt install -y curl && curl -fL https://wnmp.org/zh/wnmp.sh -o wnmp.sh && chmod +x wnmp.sh && bash wnmp.sh

一分钟安装完整 Web 环境:

  • Nginx 1.28.0 (支持 HTTP/2 、WebDAV 、Stream )
  • PHP 8.2–8.5
  • MariaDB 10.6 / 10.11 (内置 Mroonga 全文搜索引擎)
  • 自动 SSL 证书( acme.sh
  • WebDAV 云盘支持(拒绝明文 FTP )

系统自动优化:

  • 启用 BBR/FQ 网络加速
  • 关闭 THP ,优化内核参数
  • 全面适配 Debian 12/13 、Ubuntu 22–25 、WSL2
  • 自动生成安全配置,默认防止常见漏洞

安全为先 · 默认即最优:

  • 内置 SSH 密钥登录
  • PHP 默认关闭危险函数
  • phpMyAdmin 启用 BasicAuth 双重防护
  • SSL 证书全自动签发与续期

面向开发者与站长的真正“零阻力”方案:
无论你是独立开发者、云服务商、还是边缘节点运维者,WNMP 让服务器环境部署变得和安装浏览器一样简单。
轻量、稳定、可复制 —— 一次配置,永久受益。

官方网站: https://wnmp.org
社区支持:QQ 群 1075305476 | Telegram @wnmps
Github:[url]https://github.com/lowphpcom/wnmp[/url]
开源协议:GPLv3

WNMP 不仅仅是一个脚本,它是下一代 PHP 运行环境生态的起点 ——
基于 LOWPHP 的常驻内存架构,未来将带来原生级的高性能 PHP 体验。

使用的测试文件 info.php,调用 php.info();
现在网站需要放在其他路径底下,修改了 nginx 中的 root 之后就提示 No input file specified.
但是 index.html 静态文件显示正常

在网上查的和 gpt 问,试过以下几种方式还是不行,求大佬帮忙看下

1 ,php74/etc/php-fpm.d/www.conf 文件中 chroot 和 chdir 参数都是默认注释的,
在 info.php 中,参数显示如下
USER www-data
HOME /var/www

2 ,nginx 中的 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
$document_root 或者修改成绝对路径也不行

3 ,修改 cgi.fix_pathinfo=0

4 ,;cgi.force_redirect=1 取消注释

上述的 4 种方式最多就是某 2 个一起试过。
关于文件权限问题,/var/www 使用的是 777 ,html 和我想放的文件夹 site 的权限也是 777 ,site 和网站文件的属组和属主都是 www-data
php74/etc/php-fpm.d/www.conf 文件中


user = www-data

group = www-data

listen = /run/php74-fpm.sock

listen.owner = www-data

listen.group = www-data

listen.mode = 0660


/run/php74-fpm.sock 的属组和属主是 www-data

求大佬帮忙看下还有什么办法嘛,想放到/var/www/site 文件夹下

Cursor 推出了一种新方法,用于减少发送给大语言模型(LLM)的请求上下文的大小。这种方法名为动态上下文发现(Dynamic Context Discovery),它摒弃了以往在请求开始时就包含大量静态上下文的做法,转而让智能体(agent)按需动态检索所需信息。这种方式不仅显著减少了 token 消耗,也避免了将可能令人困惑或无关的细节混入上下文。

 

为了实现动态上下文发现,Cursor 采用了五种不同的技术。这些技术有一个共同特点,即以文件作为 LLM 工具的主要接口,使内容能够由智能体动态存储和获取,而不是一次性塞满有限的上下文窗口。

随着编码智能体能力的快速提升,文件已成为一种简单而强大的基础原语(primitive)。相比引入另一种尚无法完全适应未来需求的抽象层,使用文件是一种更安全、更务实的选择。

 

Cursor 使用的第一项技术是将大规模输出(比如,shell 命令或其他工具的输出)写入文件,确保关键信息不会因上下文截断而丢失。随后,智能体可根据需要使用tail等命令读取文件末尾的内容。

 

其次,针对上下文过长时被摘要压缩而导致信息丢失的问题,Cursor 会将完整的交互历史保存到文件中,使智能体能在后续需要时检索缺失的细节。同样,领域特定的能力被存放在文件中,智能体可通过Cursor内置的语义搜索工具动态发现相关文件。

 

对于 MCP 工具(Model Context Protocol 工具),传统做法是在请求初始阶段就加载所有 MCP 服务器提供的工具描述,而 Cursor 修改为仅传递工具名称。当任务实际需要某个工具时,智能体才会动态拉取其完整定义。这一策略大幅降低了 token 总量:

智能体现在只接收少量的静态上下文(包括工具名称列表),并在任务需要时主动查询具体工具。在一项 A/B 测试中,对于调用了 MCP 工具的运行实例,该策略平均减少了 46.9%的总 token 使用量(结果具有统计显著性,但方差较大,这取决于所安装 MCP 服务器的数量)。

此外,这种方法还带来一个额外的优势,那就是智能体可以监控每个 MCP 工具的状态。例如,比如某个 MCP 服务器需要重新认证,智能体可以及时通知用户,而不是完全忽略该问题。

 

最后,所有终端会话的输出会同步到文件系统。这使得智能体能更轻松地回答用户关于命令失败原因的问题。同时,通过将输出存入文件,智能体可使用 grep 等工具仅提取相关的信息,进一步压缩上下文规模。

 

在 X 上,用户 @glitchy 指出,虽然减少token是重要目标,但是尚不清楚这种动态机制是否会增加延迟。@NoBanksNearby 则认为,动态上下文发现“在同时运行多个MCP服务器时,对开发效率提升巨大”。@casinokrisa也对此表示赞同:

token 数量几乎减少了一半,既降低了成本,又加快了响应速度,尤其是在多服务器场景下。

 

最后,@anayatkhan09提出了可能的优化方向

下一步应该是向用户开放动态上下文策略,让我们能针对不同代码仓库调整优化的激进程度,而不是对所有工具一视同仁。

 

据 Cursor 官方表示,动态上下文发现功能将在未来几周内向所有用户开放。

原文链接:

AI-Powered Code Editor Cursor Introduces Dynamic Context Discovery to Improve Token-Efficiency