纯情 发布的文章

出来实习毕业,方向是 java 的 ai 应用开发,干了一个月。mt 甩了三个链接,Spring ai alibaba 的框架例子,chatbot、deepresearch、AssistantAgent ,chatbot 完全可以理解 react 的思想,deepresearch 就是多 Agent 协作,assistantAgent 看的就有点头大,跟 mt 反馈后就甩了个 langchian 的连接,又去看,有知道了 RAG 的流程,还有那个图(打不来英文)和 checkpoint,lang 图用条件边进行一个流程编排,回去看 AssistantAgent,就感觉这玩意好像啊,用 Spring 的那个自动装配提前装配钩子跟 tool,注册 Agent,然后就像图那样用户对话框的输入有钩子做一个判断,对比记忆库是否有积累的经验,传给 llm,后面就像 lang 图编排那样,根据传回内容并入提示词,给对应 Agent 执行,对了,还有一个桥接的虚拟机在里面有 Python 的环境可以运行 Python 代码,对 java 也有一个映射,也可以调动 java 程序,后面就是,以及经验总结的功能(不是很清楚)。

我干了什么呢,就在理解这些的基础上,做了个 tool 利用普罗米修斯(会记录 JVM 的内存数据,token 用量还有我看不懂的数据)跟一个 G 开头的东西装了一个可视化的一个仪表盘。最后结束实习交接的话是交了一个自己搭的一个爬虫+本地知识库(纯 RAG)的项目,我觉得自己做的蛮拉的毫无亮点,为什么做的原因,是上个仪表盘做完个 mt,他叫我试试把本地数据库接入 assistantAgent,试试效果,因为我没有本地知识库,就做了个这个。
看 mt 忙的飞起来了,不怎么好意思问他,就自己酷酷问 AI 闷头干。一个月嘛时间慢短,公司业务都没摸到,这段实习经历简历都不知道怎么写。写力竭了 🥱

规则如下:
竞猜隐藏内容里的三位数字
当然您也可以提前查看隐藏内容,查看隐藏内容条件:(条件:属性检定可见、属性:幸运,目标值:25)
竞猜时请同步将竞猜发布到评论里,第一位猜到的小伙伴,等游戏结束后,我额外打赏 500 金币。

长期以来,在 Cloudflare Workers 上运行 Rust 代码,从技术上是可行的——Workers 平台本身支持 WebAssembly,而 Rust 编译到 WebAssembly 是一条相对成熟的路径。

但"技术上可行"和"真正好用"之间,隔着相当大的一段距离。

2021 年 9 月,Cloudflare 发布了 worker crate,把这段距离正式填上了。从那天起,Rust 开发者可以用惯用的 Rust 风格写一个完整的 Worker,不需要懂 JavaScript,不需要手写胶水代码,一行命令创建项目,直接部署到边缘节点。


之前到底哪里不够好

Workers 平台通过 V8 引擎支持 WebAssembly,这意味着任何能编译到 WASM 的语言,理论上都能在上面运行。Rust 对 WebAssembly 的支持是整个语言生态里最成熟的,有 wasm-bindgenwasm-pack 这些工具链,文档和社区也相对完善。

但问题出在边界处理上。

Workers 的运行环境本质上是一个 JavaScript 环境。fetch()RequestResponseHeaders——这些核心 API 都是 JavaScript 的对象和函数。Rust 代码要调用这些 API,必须经过一个"跳板"(trampoline)步骤:先把 Rust 的数据类型转换成 JavaScript 能理解的形式,调用 JS API,再把结果转回 Rust 类型。

这个过程需要大量的模板代码(boilerplate),而且这些胶水代码的编写,要求开发者对宿主 JavaScript 环境有相当深入的了解。对于一个只想用 Rust 写逻辑的开发者来说,这是一道不必要的认知门槛。

更麻烦的是,就算愿意啃这些胶水代码,现成的 wasm-bindgen 绑定也只覆盖了标准的 Web API,Cloudflare 的私有能力——KV 存储、Durable Objects、环境变量、Secrets——统统没有。开发者要么自己写绑定,要么只能放弃这些功能,用纯 JS 来补。

结果就是:Rust 在 Workers 上能跑,但开发体验远谈不上顺畅,离"原生支持"还差得很远。


worker crate 把这些问题一次性解决了

worker crate 的核心思路是:把所有 JavaScript 边界细节封装在库内部,对外暴露完全符合 Rust 习惯的 API。开发者面对的不是一个"能在 JS 环境里运行的 Rust",而是一个"原生的 Rust 开发体验"。

创建一个新的 Rust Worker 项目只需要一条命令:

wrangler generate --type=rust my-project

之后就是标准的 Rust 开发流程:写代码,用 cargo 管理依赖,用 wrangler 部署。不需要 npm,不需要 webpack,不需要任何 JavaScript 工具链的知识。


一个真实的请求处理器长什么样

下面是官方示例中的一个请求处理器,处理一个带文件上传的 POST 表单请求:

use worker::*;

#[event(fetch)]
pub async fn main(req: Request, env: Env) -> Result<Response> {
    // 打印请求方法、路径和地理位置信息
    console_log!(
        "{} {}, located at: {:?}, within: {}",
        req.method().to_string(),
        req.path(),
        req.cf().coordinates().unwrap_or_default(),
        req.cf().region().unwrap_or("unknown region".into())
    );

    // 只接受 POST 请求
    if !matches!(req.method(), Method::Post) {
        return Response::error("Method Not Allowed", 405);
    }

    // 读取表单中的文件字段
    if let Some(file) = req.form_data().await?.get("file") {
        return match file {
            FormEntry::File(buf) => {
                Response::ok(&format!("size = {}", buf.bytes().await?.len()))
            }
            _ => Response::error("`file` part of POST form must be a file", 400),
        };
    }

    Response::error("Bad Request", 400)
}

几个值得关注的细节:

#[event(fetch)] 是一个过程宏,负责把这个 Rust 函数注册为 Worker 的 fetch 事件处理器。背后的 WASM 绑定、事件分发、JS 互操作全部被这个宏处理掉了,对开发者完全透明。

req.cf().coordinates()req.cf().region() 直接返回 Cloudflare 的地理位置信息——这是 Cloudflare 私有的请求元数据,在以前需要手动写 JS 绑定才能访问,现在作为一等公民集成在 API 里。

整段代码的风格是标准的 Rust:模式匹配、? 错误传播、async/await——没有任何 JavaScript 的痕迹,也没有任何 FFI 相关的特殊处理。


worker crate 覆盖了哪些能力

除了基础的 HTTP 请求和响应处理,worker crate 还内置了对以下 Cloudflare 平台能力的封装:

KV 存储:Workers KV 是 Cloudflare 的全球分布式键值存储,在之前的 Rust 方案里完全没有现成的封装,现在可以直接通过 Env 对象访问,API 设计符合 Rust 的惯用风格。

Durable Objects:Cloudflare 的强一致性状态存储,适合需要全局唯一状态的场景。现在也可以在 Rust 里直接定义和使用 Durable Objects。

路由器:内置了一个轻量级的 HTTP 路由框架,支持路径匹配和方法过滤,不需要引入额外的依赖。

环境变量和 Secrets:通过 Env 对象统一访问,类型安全,不需要手动解析 JS 环境。

fetch API:从 Worker 内部发起对外的 HTTP 请求,封装了底层的 JS fetch 调用。


为什么 Rust 是边缘计算的合适选择

Cloudflare 选择 Rust 作为原生支持的第一个非 JS 语言,不是随机的决定。

从技术角度看,Rust 对 WebAssembly 的支持是整个语言生态里最成熟的。wasm-bindgen 解决了 Rust 与 JS 之间的类型桥接问题,web-sys 提供了标准 Web API 的 Rust 绑定,这些都是 worker crate 得以建立的基础。Rust 强大的过程宏系统,让 #[event(fetch)] 这样简洁的 API 设计成为可能,而无需运行时反射或动态分发。

从业务角度看,Cloudflare 内部本身大量使用 Rust。Pingora(代理基础设施)、Saffron(Cron 解析)、Firewall Rules(过滤引擎)都是 Rust 编写的。这意味着 Cloudflare 有足够的 Rust 工程能力来维护和演进这套工具链,而不是把它当成一个实验性项目。

从边缘计算的特殊需求来看,Workers 的执行环境对资源非常敏感:启动时间要快(Cold Start 问题),内存占用要低,执行延迟要可预期。Rust 编译出的 WASM 模块,在这几个维度上都表现良好——没有 GC 停顿,没有运行时开销,WASM 模块体积也相对紧凑。


开发者体验本身是产品竞争力

这次发布背后有一个更值得关注的信号:Cloudflare 把"简化开发者体验"作为一个明确的工程目标,而不只是一句口号。

边缘计算平台之间的技术能力差距正在缩小。在此背景下,谁能让开发者更快上手、更顺畅地把已有代码迁移过来,谁就能在获取开发者心智上占据优势。

对于已经在用 Rust 的工程师来说,之前在 Workers 上写 Rust 的体验,和在原生环境里写 Rust 之间存在明显的摩擦——需要额外学习一套 JS 互操作模式,需要手动处理 Cloudflare 平台能力的绑定,需要维护大量和业务无关的胶水代码。worker crate 把这些摩擦都消除了,让 Rust 开发者可以用已有的习惯和知识直接上手,几乎没有额外的学习成本。

这不只是让 Rust 开发者"多了一个选择",而是让这个选择真正变得实际可用。


小结

worker crate 解决的问题看起来不大:把 Workers 平台 API 封装成 Rust 风格的接口,消除胶水代码。但它代表的是边缘计算平台在语言支持上从"理论可行"到"开发者友好"的一次跨越。

对于已经在用 Rust 的工程师,这是一个直接可用的信号:边缘函数不再是 JavaScript 专属的领地,可以用已有的工具链和习惯,把 Rust 代码直接部署到全球 200 多个 PoP 节点,不需要任何妥协。

项目已完全开源,在 GitHub 和 crates.io 上均可获取。


原文链接:https://blog.cloudflare.com/workers-rust-sdk/
开源仓库:https://github.com/cloudflare/workers-rs

微信三月份发布了 微信 ClawBot ,不想在电脑上部署 ClawBot ,这玩意风险太大了,但是想将 Bot 的对话能力部署在本地,于是就有了本项目。使用了一段时间,感觉还是挺有用的

最大的用处:把其他服务的运行情况直接发到微信 Bot (服务器告警、签到通知、金价推送等),同时自带了一些实用命令,也很方便 WebHook 扩展。

示例

一行部署

macOS / Linux:

curl -fsSL https://raw.githubusercontent.com/yuuouu/WeChat-Bridge/main/scripts/install.sh | bash

Windows (PowerShell):

powershell -c "irm https://raw.githubusercontent.com/yuuouu/WeChat-Bridge/main/scripts/install.ps1 | iex"

浏览器打开 http://localhost:5200,扫码登录即可使用。

curl 发信息

curl "http://localhost:5200/api/send?text=Hello!"

其他能力

  • 🔔 Webhook 转发,收到消息自动 POST 到你的服务( Dify / FastGPT / n8n )
  • 📱 Web 管理面板,扫码登录、消息流、AI 配置一站搞定
  • ⏰ 24h 保活守护 + 10 条限制自动缓存 + /pull 补拉,消息不丢
  • 🐳 Docker / Windows / macOS / Linux 全平台

项目地址

GitHub:https://github.com/yuuouu/WeChat-Bridge

欢迎 Star ⭐ 和反馈

有一类工程问题,乍看不起眼,却会在系统复杂度增长后造成真实的用户伤害。

Cron 表达式解析就是这样一个问题。

Cloudflare 在为 Workers 开发 Cron Triggers 功能时,遇到了一个典型的多语言栈困境:前端、API 层、后端运行时各自使用了不同的解析器,而 Cron 表达式本身没有统一的规范,各个解析器对扩展语法的支持各有不同。最终的结果是:四套解析器,四种行为,用户体验一团糟,甚至出现了一个"差一位"的静默 Bug,让用户填的周一到周五,在后端变成了周日到周四。

这篇文章记录了他们如何用 Rust 和一个叫 Saffron 的自研库,一步步把四个解析器收归为一个。


Cron 表达式:看起来简单,实则是个无主之地

Cron 表达式是一种用于描述定时规则的格式,由若干字段组成,分别表示分钟、小时、月份中的某天、月份、星期几。写法类似这样:

*/5 * * * *     每 5 分钟执行一次
0 9 * * MON-FRI 每个工作日早上 9 点执行
0 0 L * *       每月最后一天午夜执行

基础语法只有几种构造:星号(所有值)、具体数值、范围(0-30)、集合(0,15,30,45)。

但在基础语法之上,各个平台和工具衍生出了大量扩展:

  • L:在月份字段中表示"本月最后一天",在星期字段中表示"本月最后一个某星期X"
  • W:表示"距某日期最近的工作日",如 15W 表示距 15 号最近的工作日
  • /:步长语法,如 */5 表示每隔 5 个单位,30-59/5 表示从 30 到 59 每隔 5 个
  • #:表示"第 N 个星期X",如 5#3 表示本月第 3 个周四

除此之外,还有 Jenkins 的 H(随机化执行时间以分散负载)、部分实现里的 ?(表示启动时间)等。

关键在于,这些扩展没有任何标准化组织来统一规范。每个库爱支持哪些就支持哪些,爱怎么解释就怎么解释。这在单一语言栈里已经够烦了,在多语言栈里会直接变成系统性灾难。


四个解析器是怎么凑在一起的

Cloudflare 的 Cron Triggers 系统横跨三层:

  • 前端 UI:用 JavaScript 编写,需要展示"这个 Cron 表达式是什么意思"的人类可读描述,以及"接下来五次执行时间"
  • API 层:用 Go 编写,负责接收用户提交的 Cron 表达式并验证合法性
  • 后端运行时:用 Rust 编写,实际调度和执行定时任务

在时间压力下,团队对每一层分别找了现成的解决方案:

前端为了显示"描述"和"未来执行时间",用了两个不同的 JavaScript 库,因为没有哪一个库同时把这两件事都做好。API 层用了一个现成的 Go Cron 库做验证。后端因为找不到满足需求的 Rust crate,自己用 nom 写了一个,命名为 Saffron。

结果:四套解析器同时运行在同一个功能上

问题随之而来。两个前端 JS 库各自支持不同的扩展语法,用户有时能在 UI 里成功填写一条表达式,提交后却被 API 拒绝;另一些时候,UI 因为某个库不支持某个扩展而拒绝了用户的输入,但这条表达式其实完全合法,API 和后端都能接受。

API 层使用的 Go 库接受范围比后端运行时更宽,导致部分表达式能成功保存,但调度时静默失败——触发器存在,但从不执行。

为了临时修复,团队做了两件事:在后端运行时增加了一个专门读取 stdin 来验证表达式的入口,API 调用它来确保双方行为一致;同时暴露了一个验证接口给前端调用。

这个方案能用,但代价不小:每次前端验证一条表达式,要在 JavaScript 里解析两次(一次算描述,一次算未来时间),再发一个网络请求到 API,API 再启动一次调度器进程来解析,整个链路又长又贵。


差一位的 Bug:星期几从 0 开始还是从 1 开始

在这团混乱里,还藏着一个更具体的问题。

Saffron 的实现参考了 Quartz 调度器的 Cron 解析规范,Quartz 规定星期几从 1 开始(1 表示周日,7 表示周六)。而前端两个 JS 库遵循的是原始 Unix Cron 的约定,从 0 开始(0 和 7 都表示周日,1 到 6 表示周一到周六)。

用户在 UI 里输入 1-5,按照 JS 库的逻辑,这是周一到周五。界面上也是这么告诉用户的。

但提交到后端之后,Saffron 按照自己的规范来解释,1 表示周日,5 表示周四——实际执行的是周日到周四

这个 Bug 在测试阶段被漏掉了,上线后由论坛里细心的社区成员发现并反馈。

修复起来有些棘手:提供描述功能的 JS 库支持切换星期编号方案,但提供未来时间计算的那个库不支持。恰好此时 Saffron 的开发已经进行了一半,正好可以用来替换掉那个不够灵活的 JS 库——但 Saffron 还没有前端可用的 WebAssembly 绑定,没时间立刻写完整的 wasm-bindgen 封装。


Workers 自己救了自己

这时候,Cloudflare Workers 本身成了解决问题的工具。

团队花了一周时间,把 Saffron 编译为 WebAssembly,加上几个简单的 wasm 入口函数,部署成一个 Worker,前端直接调用。不需要回到遥远的数据中心,最近的 PoP 节点就能响应,延迟极低。

验证逻辑全部写在 Rust 里:

#[wasm_bindgen]
pub fn validate(crons: JsArray) -> ValidationResult {
    // 解析每个 cron 表达式
    // 检测重复项
    // 返回错误信息或成功结果
}

HTTP 请求的处理逻辑写在 JavaScript 里,两部分各司其职,通过 wasm-bindgen 胶水代码连接。

这个方案一周内上线,解决了前端与后端之间的解析行为不一致问题,同时顺带支持了 LW 等之前因为旧 JS 库不支持而无法使用的扩展语法。


目标:全栈只用一个解析器

修完这个问题后,系统里还剩两个解析器:Saffron 覆盖了后端运行时和前端 Worker,另一个 JS 库仍然负责生成人类可读描述。

Cloudflare 的最终目标是把这个数字降到一——整个栈只有 Saffron,一个真正的单一事实来源

实现路径已经清晰:

  • 把 Saffron 编译为 WASM 并通过 wasm-pack 打包,直接在浏览器本地运行,不需要任何网络请求。前端验证、未来时间计算,全部在本地完成。
  • 通过 Rust 的 C FFI 能力,将 Saffron 暴露为一个 C 接口,Go 的 API 层通过 cgo 调用,彻底替换掉原来的 Go Cron 库。
  • 在 Saffron 内部补充 Cron 描述生成功能,替换掉前端剩余的那个 JS 库。

到那时,无论是浏览器里的实时验证、API 层的合法性检查,还是后端的实际调度执行,都由同一份 Rust 代码处理,不可能出现解析行为不一致的情况。


为什么这个问题值得认真对待

Cron 表达式的不一致性问题,在大多数系统里都被低估了。

如果系统规模小,或者用 Cron 的功能只是内部工具,差异往往不会被发现。但当这个功能是用户直接操作的产品入口时——用户写 Cron 表达式,UI 实时反馈,API 验证,调度器执行——每一层的解析行为都必须完全一致,否则用户看到的和实际发生的就会出现偏差,而这种偏差往往以最隐蔽的方式出现:任务静默不执行,或者执行时间和预期不符。

这篇博客真正说明的问题,不只是"如何解析 Cron 表达式",而是在多语言栈里维护同一套业务逻辑的代价。每引入一个新的解析器,就引入了一个潜在的差异源。而 Rust 的跨语言生态——WebAssembly 绑定(面向前端和 Workers)、C FFI(面向 Go 等语言)——提供了一条真正意义上的"写一次,到处复用"的路径,而不是让工程师在不同语言里反复实现同一套逻辑,然后祈祷它们行为一致。


Saffron 已开源

目前 Saffron 已经在 GitHub 开源,支持通过 crates.io 作为 Rust 库使用,也可以通过 npm 使用 WebAssembly 绑定版本。

开源地址:https://github.com/cloudflare/saffron


原文链接:https://blog.cloudflare.com/using-one-cron-parser-everywhere-...

转眼间,做前端已经五年了。回想起这些年的点点滴滴,有为了一个像素对不齐而折腾到凌晨的执着,也有终于解决了一个性能问题后的欣喜若狂。

💻 那些让我抓狂的瞬间
一个padding搞了我一晚上记得刚入行的时候,有个布局问题让我头疼了一整晚。就是两个div之间的间距,怎么调都不对。那时候我还不知道浏览器默认样式这回事,对着Chrome开发者工具一遍遍地试,各种margin、padding组合,结果第二天早上一问资深同事,人家轻描淡写地说:"reset.css加了么?"那一刻我才明白,很多你以为的技术难题,其实只是知识盲区而已。
"这个需求很简单"
背后的深坑产品经理说:"这个需求很简单,就是加个拖拽排序功能。"
我:"好的,应该一天就够了。"
然后我才发现,拖拽排序要考虑:移动端的手势识别PC端的鼠标事件不同浏览器的事件兼容性拖拽过程中的视觉反馈边界处理和碰撞检测性能优化(防止频繁重绘)可访问性支持三天后,我终于交出了"看似简单"的功能。从那以后,我再也不轻易相信"这个需求很简单"这种话了。

编辑🌱 那些让我成长的时刻
第一次重构老项目接手一个三年前的老项目,代码里到处都是document.getElementById,jQuery和原生JS混用,全局变量满天飞。重构过程中,我发现了一些有意思的"黑历史":// 当年的前辈们是怎么写代码的

function getData() {
  if (data1 == null) {
    data1 = [];
    for (var i = 0; i < 100; i++) {
      data1.push(i);
    }
  }
  return data1;
}

// 还有这种神奇的操作
$("#button").click(function() {
  setTimeout(function() {
    location.reload();
  }, 100);
});

重构那段时间,每天都在跟历史代码搏斗,但也正是这个过程,让我真正理解了什么叫"代码可维护性"。学会了说"不"以前刚入行时,产品提什么需求我都说"行"。

直到有一次,为了赶一个不合理的deadline,我熬了好几个通宵,最后上线的版本还出了bug。后来我学聪明了,开始跟产品和沟通:这个需求的技术复杂度是多少需要多少开发时间如果一定要提前,哪些功能可以砍掉当前技术方案的风险点在哪里学会评估和沟通,比学会写代码更重要。

🤔 程序员的日常思考

关于加班的那些事刚开始工作的时候,我觉得加班=努力。
后来慢慢发现:有效的时间管理比长时间工作更重要会写代码不等于会解决问题健康比KPI重要得多我现在尽量不加班,不是因为懒,而是我学会了:提前评估工作量及时沟通风险拒绝不合理的需求保持专注,减少无效加班

关于技术焦虑

前端技术更新太快,Vue还没学完,React又出了新特性,CSS框架层出不穷。
前两年我很焦虑,怕被淘汰。
现在我想通了:基础永远是王道:HTML/CSS/JavaScript的核心不会变学习要讲方法:
不要追着新技术跑,要有选择地学项目
驱动学习:在实际项目中学习新技术效果最好保持输出:写博客、做分享是最好的学习方式
<<<顺便提一嘴,技术大厂在招,前后端和测试,全国都有坑位,待遇及稳定性还不错。

💪 真正的成长是什么
从技术思维到产品思维

刚开始我只关心代码写得爽不爽,后来我开始思考:用户真的需要这个功能吗?这个交互体验够好吗?性能优化能带来什么价值?
我的代码对团队协作友好吗?技术是工具,不是目的。
真正的前端开发,是用技术为用户创造价值。找到了自己的节奏现在的我:不再盲目追新技术,而是选择适合自己的技术栈重视代码质量,但不执着于完美会主动沟通需求,而不是被动接受保持学习的热情

🎯 给自己的一些话

五年下来,我想对自己说:保持好奇,但不要盲目跟风写代码很重要,但解决问题更重要技术要精进,但生活也要平衡多分享,多交流,多思考记住,你首先是一个人,其次才是程序员

✨ 下一个五年

技术这条路很长,但我不急了。慢慢地学习,稳稳地成长,踏实做好每一个项目。毕竟,最好的代码不是最复杂的,而是最合适的。最好的程序员不是最聪明的,而是最懂得平衡的。
愿我们都能在这条路上,找到属于自己的节奏和答案。

你在前端路上有什么难忘的经历?欢迎在评论区分享你的故事。

——转载自:destinying

Taoify 小店支付系统架构:多支付渠道集成与资金安全解决方案

一、跨境电商支付的核心挑战

在跨境电商场景中,支付环节是整个交易链路中最复杂的一环。不同国家和地区的消费者有着截然不同的支付习惯:欧美用户偏好信用卡和 PayPal,东南亚用户习惯电子钱包(GrabPay、ShopeePay),中东地区则大量使用货到付款。据 Statista 数据显示,2025 年全球因支付失败导致的购物车放弃率高达 21%,其中支付选项不足是第三大原因。

Taoify 小店系统作为面向跨境电商的独立站解决方案,在支付系统的设计上采用了多渠道集成 + 智能路由 + 资金安全三位一体的架构,帮助商家覆盖全球主流支付方式,同时保障交易资金的安全与合规。

二、支付系统整体架构

2.1 分层设计

Taoify 小店的支付系统采用四层架构:

┌─────────────────────────────────────────┐
│           前端展示层 (Frontend)          │
│   支付方式选择 → 支付表单 → 结果展示     │
├─────────────────────────────────────────┤
│           网关路由层 (Gateway)           │
│   智能路由 → 故障切换 → 负载均衡         │
├─────────────────────────────────────────┤
│         支付适配层 (Adapter)             │
│   Stripe适配器 │ PayPal适配器 │ 微信适配  │
├─────────────────────────────────────────┤
│         核心服务层 (Core Service)        │
│   订单管理 │ 对账系统 │ 风控引擎 │ 退款   │
└─────────────────────────────────────────┘

这种分层设计使得新增支付方式只需要实现 Adapter 接口,无需改动核心业务逻辑,符合开闭原则

2.2 支付适配器模式

系统通过策略模式(Strategy Pattern)管理多种支付方式:

interface PaymentAdapter {
  createPaymentOrder(params: PaymentParams): Promise<PaymentResult>;
  queryPaymentStatus(orderId: string): Promise<PaymentStatus>;
  refund(orderId: string, amount: number): Promise<RefundResult>;
  handleWebhook(payload: WebhookPayload): Promise<void>;
}

// 各支付渠道独立实现
class StripeAdapter implements PaymentAdapter { ... }
class PayPalAdapter implements PaymentAdapter { ... }
class WechatPayAdapter implements PaymentAdapter { ... }
class AlipayAdapter implements PaymentAdapter { ... }

三、支持的支付方式

3.1 信用卡/借记卡(Stripe / Adyen)

Taoify 小店深度集成了 Stripe 和 Adyen 两大国际支付巨头,支持 Visa、MasterCard、American Express、JCB 等全球主流卡组织。

技术亮点:

  • 支持 3D Secure 2.0 身份验证,降低欺诈风险
  • 自动处理 30+ 种货币结算
  • 内置反欺诈引擎(Stripe Radar),机器学习识别可疑交易
  • 支持订阅式 recurring payment(适合 SaaS 类商品)

3.2 PayPal

作为全球最知名的在线支付平台,PayPal 在欧美市场拥有超过 4 亿活跃用户。Taoify 小店通过 PayPal REST API 实现:

  • PayPal 标准支付(Smart Payment Buttons)
  • 买家保护机制提升消费者信任度
  • 一键支付体验,减少结账流失

3.3 本地化支付方式

针对不同市场的本地化需求,Taoify 小店还支持:

  • 东南亚:GrabPay、ShopeePay、Touch 'n Go
  • 拉美:Mercado Pago
  • 印度:UPI、Paytm
  • 欧洲:iDEAL(荷兰)、Bancontact(比利时)、Klarna(瑞典)
  • 中东:Mada(沙特)、Fawry(埃及)

3.4 中国支付渠道

对于代购场景中的国内供应商付款,系统支持:

  • 微信支付(Native 扫码 + JSAPI)
  • 支付宝(电脑网站支付 + APP 支付)
  • 银联在线支付

四、智能支付路由

4.1 路由策略

Taoify 小店内置智能支付路由引擎,根据以下维度自动选择最优支付渠道:

维度说明权重
用户地理位置自动推荐当地主流支付方式
支付成功率实时统计各渠道成功率,优先高成功率渠道
手续费成本在成功率相近时选择手续费更低的渠道
货币类型匹配币种,减少货币转换损失
交易金额大额交易优先选择风控更强的渠道

4.2 故障自动切换

当某个支付渠道出现故障或超时,系统会自动切换到备用渠道,确保支付链路的高可用性:

主渠道 Stripe 超时 → 自动切换至 Adyen → 仍失败 → 提示用户选择 PayPal

整个过程对用户透明,无需商家手动干预。

五、资金安全与合规

5.1 PCI DSS 合规

Taoify 小店支付系统严格遵循 PCI DSS(支付卡行业数据安全标准):

  • 所有支付数据通过 TLS 1.3 加密传输
  • 敏感卡号不存储于商家服务器,采用 Tokenization 技术
  • 定期安全审计与渗透测试

5.2 风控引擎

系统内置多层风控机制:

第一层:基础规则引擎

  • 单笔交易金额上限
  • 同一 IP/设备短时间多次下单限制
  • 高风险国家/地区黑名单

第二层:行为分析

  • 用户下单行为模式识别(浏览时长、加购路径)
  • 异常收货地址检测
  • 信用卡 BIN 号与国家匹配验证

第三层:机器学习模型

  • 基于历史交易数据训练的反欺诈模型
  • 实时评分,自动拦截高风险订单
  • 支持商家自定义风控阈值

5.3 对账与结算

  • 自动对账:每日定时拉取各支付渠道账单,与系统订单自动对账
  • 差异处理:自动标记长短款异常,生成对账差异报告
  • 结算管理:支持多账户结算配置,灵活分配资金流向

六、退款与争议处理

6.1 退款流程

Taoify 小店提供完整的退款管理功能:

  • 全额退款 / 部分退款
  • 原路退回(自动路由至原支付渠道)
  • 退款状态实时同步
  • 退款原因记录与统计分析

6.2 Chargeback 处理

针对信用卡拒付(Chargeback),系统提供:

  • 实时 Chargeback 通知
  • 证据材料自动收集(物流签收证明、聊天记录)
  • 一键提交申诉至支付渠道
  • Chargeback 率监控与预警

七、实战配置指南

步骤 1:启用支付渠道

进入 Taoify 小店后台 → 设置 → 支付设置 → 选择需要启用的支付方式

步骤 2:配置 API 凭证

以 Stripe 为例:

  1. 登录 Stripe Dashboard,获取 API Key(Publishable Key + Secret Key)
  2. 在 Taoify 后台填入 Key 值
  3. 配置 Webhook Endpoint(用于接收支付回调)
  4. 测试模式验证 → 生产模式上线

步骤 3:设置支付路由规则

根据目标市场配置默认支付渠道:

  • 欧美市场:Stripe(信用卡)+ PayPal
  • 东南亚市场:GrabPay + PayPal
  • 代购场景:微信支付 + 支付宝

步骤 4:测试支付流程

使用各支付渠道的测试卡号/测试账号完成全流程测试,确保支付、回调、订单状态更新正常。

八、总结

Taoify 小店的支付系统通过多渠道集成、智能路由、风控引擎、自动对账四大核心能力,为跨境电商商家提供了一站式的支付解决方案。无论是面向欧美市场的信用卡支付,还是东南亚的电子钱包,亦或是中国国内的微信支付宝,系统都能无缝对接。

目前 Taoify 小店系统完全免费提供使用,商家无需承担额外的系统使用费,即可享受企业级支付能力。对于正在出海或计划出海的跨境电商卖家来说,是一个极具性价比的选择。

前言

梦想网页CAD协同平台,支持在线查看DWG/DXF图纸,图纸的项目管理、图纸版本控制、实时协同编辑CAD图纸、用户权限控制、图库图块管理等在线CAD功能。

在工程设计领域,CAD图纸作为核心生产资料,图纸管理混乱、图纸保密困难、各个专业CAD协同设计冲突时有发生,时常发生图纸数据丢失风险,严重掣肘设计效率与项目推进节奏。为了解决这些问题,梦想云图依托深耕CAD领域的技术积淀与现代Web技术栈,重磅推出一整套在线CAD图纸协同平台。同时,我们提供了源码,方便个性化定制与开发。

这并非简单的绘图工具升级,而是从底层重构CAD交互逻辑的企业级数据协作引擎——以开源、可控为核心,让图纸管理从“数据黑盒”走向“全程透明”,为工程设计行业打造全新的协同工作范式。以下是结合行业真实痛点,深度解析平台核心技术优势与落地价值。

github源码:

产品在线演示:


1. 细致化权限管控:构建安全可追溯的图纸管理体系

图纸数据的安全是企业运行的底线。梦想云图协同平台提供了一套严密的权限管理体系,确保不同角色的人员只能访问和操作被授权的内容,从源头上杜绝数据泄露和误操作。

核心功能:

  • 系统级与项目级双重管控: 平台提供全局的用户管理,同时支持针对具体项目设置独立的访问权限。
  • 角色分级管理: 系统预设了多种角色,包括“项目所有者”(拥有完整管理权)、“项目管理员”(管理成员和设置)、“项目编辑者”(能画图改图)、“项目查看者”(只能看不能改)。
  • 灵活分配: 管理员可以给员工或外部合作方分配特定的角色,精确控制每一个操作按钮的可见性与可用性。

操作演示:


2. 版本化管理体系:像管理代码一样管理图纸,实现极致历史版本回溯

在图纸修改过程中,经常面临“改错了想找回上一版”或者“不知道谁改了哪里”的情况。梦想云图采用独创的CAD图纸版本控制创新技术,实现了极致的压缩版本管理,占用磁盘空间小,又能准确回溯任意时刻的图纸内容。

核心功能:

  • 自动记录: 每次保存图纸,系统都会自动创建一个新的版本,无需手动备份。
  • 历史回溯: 用户可以查看任意时间点的图纸内容,并恢复到指定版本。
  • 版本对比: 系统支持选择两个不同的版本进行对比,通过颜色高亮显示出修改、增加或删除的部分,准确展示图纸差异。

操作演示:


3. 实时协同编辑:告别“文件锁”,实现真正的多人并行设计

传统的CAD协作往往是“接力赛”:你画完发给我,我改完发给他。梦想云图通过独创的实时协同网络算法,实现了高效的多人对同一图纸的编辑,实时合并图纸内容,防止图纸冲突,彻底告别“文件锁”。

核心功能:

  • 打破文件锁: 不用再担心文件被别人占用,支持多人同时在线编辑。
  • 实时同步: 你画一条线,同事那边几乎是同步看到的。
  • 协同会话: 你可以发起一个协同会话,邀请团队成员加入,共同完成设计任务。

操作演示:


4. 轻量化部署体验:拒绝复杂配置,一键部署实现开箱即用

很多企业想用协同平台,但被复杂的服务器安装和配置吓退了。梦想云图充分考虑到了这一点,极致简化部署方式,支持国产信创平台,实现开箱即用。

核心功能:

  • 一键部署: 我们优化了安装流程,不需要你成为服务器专家,直接运行start脚本就能把系统跑起来。
  • 国产信创支持: 平台兼容国产操作系统和硬件环境,支持信创生态。
  • 参数设置简单: 后台管理界面清晰明了,存储路径、访问端口等常用参数,点点鼠标就能改好。

操作演示:

5. AI智能绘图:自然语言驱动,自动调用API操作图纸

传统的CAD操作需要经过繁琐的点击和输入参数过程。梦想云图协同平台集成了先进的AI智能体技术,让CAD图纸具备了“听懂人话”的能力。你只需要输入自然语言,系统就能自动分析意图,调用底层API代码完成绘图。

核心功能:

  • 自然语言操作图纸: 你不需要懂代码,只需要输入类似“画一个10m×8m的矩形”的指令,AI就能自动计算尺寸,生成符合规范的实体。
  • 意图识别与代码生成: 系统内置了专门的建模智能体(ModelingAgent),它能将你的文字指令拆解为具体的几何元素,自动生成精确的MxCAD代码。
  • 安全沙箱预览: AI生成的代码会在一个隔离的“沙箱”环境中先运行预览,你确认效果满意后,点击插入,图纸才会真正添加到文件中。如果效果不对,还可以让AI继续修改,直到满意为止。
  • 操作图纸: 除了绘图,AI还可以帮你操作图纸,比如修改图纸中的元素、删除图纸中的图元、查询图纸中的信息。

操作演示:

结语

梦想云图协同平台不仅仅是一个软件,它是为工程设计行业量身打造的“数字化工作台”。它把复杂的图纸管理变得简单透明,把繁琐的沟通协作变得直观高效。

核心优势如下:

  • 安全可控: 针对图纸外泄和权限混乱的痛点,平台提供了系统级和项目级的双重权限管控。你可以精确地设置谁是项目所有者、谁是查看者,确保核心数据只被授权人员访问。
  • 历史回溯: 为了解决改错无法找回和版本混乱的问题,平台采用了独创的版本控制技术。它能像管理代码一样管理图纸,自动记录每一次修改,让你随时找回任意历史版本,并能通过对比功能准确看到修改差异。
  • 实时协作: 针对传文件慢和沟通成本高的问题,平台实现了真正的多人实时协同编辑。通过独创的网络算法,多人可以同时对同一张图纸进行操作,彻底告别了“文件锁”,大幅提升了设计效率,减少了专业间的冲突。
  • 简单易用: 考虑到安装复杂和上手难的门槛,平台提供了极致简化的部署方式。支持一键部署和国产信创平台,后台参数设置简单明了,让你无需复杂的配置即可开箱即用,全员快速上手。
  • 丰富接口开放: 系统提供完整源码,并基于梦想云图网页CAD(SDK)开发,提供数千个开发API接口。用户可以非常方便地进行专业化的定制开发,满足企业个性化的业务需求。

如果你也厌倦了U盘拷贝图纸、微信传文件、邮件确认版本的低效工作方式,梦想云图协同平台是不错的选择。

产品运行界面:

2026.4.30
周日也约会了带货主播,带回家了,也没拿下,不欢而散,估计没有下次见面了。

这周一把上周六约的女生也再次约到家里吃饭了,也是不欢而散。 这几天都是崩溃的约会。


五一也约了女生来我这个城市找我玩,再说吧。


我的约会水平确实不怎么样,屡战屡败,毕竟几十年的思维方式也不可能短短 1-2 个月去改变,慢慢来吧。而且生活也不可能只有约会,性生活这一件事情,还有很多事情可以去体验。之前说的自媒体已经很久没发视频了,播放量也就几十个,准备重新换个方向练习口播,模仿一些比较好的口播博主,改些文案去练。


一、人生陷阱

1.注意力陷阱

注意力是人最宝贵的资源,可以花在娱乐休息,但是你要清楚为什么花,花了多少,是否影
响个人成长。

人的情绪容易被大众媒体操控,注意力容易被牵引,另外一方面,信息媒体没有谁真正为了
你好,自媒体上面所有的信息都是为了流量,你关注的所有平台上面的博主都是一样,他们
最终的目的就是卖产品卖课,或者得到流量。

包括我录制这个视频也是一样,也是为了得到流量。

你可以娱乐,但别把时间、情绪和判断力,全都交出去。

珍惜自己的注意力,少被割韭菜。

云HIS系统完全基于云端部署,采用B/S架构,并通过软件即服务(SaaS)的形式面向二级医院的可快速交付、便捷运维、云化的医院核心业务平台产品。融合医院HIS和EMR两大主营系统,构建涵盖患者、费用、医嘱、电子病历等核心业务的医院基础信息系统。将HIS与电子病历整合一起形成一体化医护工作站。
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。

技术细节:
前端:Angular+Nginx
后台:Java+Spring,SpringBoot,SpringMVC,SpringSecurity,MyBatisPlus,等
数据库:MySQL + MyCat
缓存:Redis+J2Cache
消息队列:RabbitMQ 
任务调度中心:XxlJob
接口技术:RESTful API + WebSocket + WebService
报表组件:itext + POI + ureport2
数据库监控组件:Canal

一卡通管理:
特点:实现了患者就诊一卡通管理,功能包括患者基本信息,患者来源信息收集,可实现卡充值、续费、退款、挂失、销卡、补卡等操作,并可对卡设置单次最高消费金额。

划价收费:
特点:系统集划价收费功能于一体,费别及收费系数的自定义能力,,与门诊药房的库存关联,无药报警,集中统一的价表管理,支持医院“一卡通”,集成医疗保险收费项目控制,费用自动分比例,费用按医疗保险政策分段统计等。支持有卡与无卡并行。

医生工作站:
门诊医生工作站系统集电子病历、电子处方、电子账单、电子申清单等功能于一体,电子病历实现模板化自定义管理,解放医生电子病历书写,灵活多样的输入方法,电子处方提供多种自定义功能,包括:自定义常用药品和收费项目;自定义医院协定处方;智能统计常用多种收费项目和药品,与药房的库存关联,无药报警提醒,集中统一的价表管理。

药房药库管理系统:
系统通过药品出、入库管理、库存管理、药房盘点、药品盈亏、门诊发药、付药统计、统计查询、发药患者查询统计、对发药、报损、退药、退货任意时间段的动态查询,药品效期、药品数量、药品上、下限控制等实现对药房药品的进、销、存的管理。

出入院管理系统:
系统包括入院首页登记、住院押金管理、出院清单打印、出院票据;提供了两种结算方式:正常出院结算与中途费用结算。中途费用结算是当患者住院有一定的时间后,为了简化管理而对病人费用进行部分结算。医院根据病人要求,可在对病人进行中途费用结算

护士站系统:
特点:住院护士站管理系统是住院护理的中心所在,它可实现病房的床位统一管理、医嘱校对、医嘱的执行、医嘱终止、重整医嘱、医嘱查询、健康日志、患者病历首页查询,转科、出院申请,病人在住院期间的信息管理、病房分类管理、对病房、患者信息、患者费用等相关信息的查询

治疗室管理:
系统集皮试申请、输液申请、治疗申请、皮试结果、输液结果、治疗结果于一体,患者的皮试、输液、治疗可以从医生站提交,也可以在输液治疗室系统提交。然后在输液治疗室系统中将皮试、输液、治疗的结果填写后,反馈到门诊医生站,医生站就可以直接看到结果。

财务查询统计:
特点:财务管理系统是医院经济核算的中心,连接门诊与住院的各个子系统,并对其自动生成各种报表;生成财务明细帐、分类帐,提供日、月、年统计报表;打印平衡表;按部门、科室、医生、收费员进行分别统计等。

后台维护系统:
特点:模块管理系统是对所有的模块的管理。可实现前台对数据库数据的备份、还原等操作。对科室、医生、系统用户、工作人员工作量、收费标准、考勤情况等基本数据的管理。

巡检防止工人不到现场检查,关键是让巡检记录必须在现场生成,而不是事后补填。对不想一开始就上重系统的团队,可以用草料二维码把入口固定在现场点位,再配合仅限微信“扫一扫”填写、定位限制、仅限拍照上传和防作假水印,降低远程补填、代检和不到场记录的风险。

进入 AI 工具普及之后,巡检造假的成本比过去更低。文字说明可以补得更完整,照片可以被处理,异常原因也能写得像一份标准报告。对管理者来说,更大的风险不是“少几条记录”,而是系统里积累了大量看起来完整、实际失真的巡检数据。

这类假数据一旦进入后台,后面的统计、趋势分析、隐患复盘都会被带偏。数据越多,不一定越接近真实;如果源头记录不可信,数据越多,反而越容易形成错误判断。

所以,防止工人不到现场检查,第一步不是加处罚,也不是加字段,而是把巡检记录的生成条件管住。

问题本质:有记录不等于人真实到场

巡检管理里最容易被误判的一点,是把“有记录”当成“已到场”。

实际上,记录只能说明有人提交过内容,不能直接说明这个人到了指定位置。尤其是纸质表、普通在线表单、群里发照片这类方式,最大的漏洞就在于入口不受控:人可以提前填、事后补、让别人代填,也可以不到现场却把记录做得很完整。

这就是不到场问题的本质:不是员工不会填表,而是管理上没有限制“记录必须在哪里产生”。只要记录可以脱离现场生成,后面的审核就会变成猜测。

核心逻辑:让打卡记录必须在现场生成

防不到场,真正要控制的是记录入口。

巡检人员想提交记录,必须先到指定巡检点,通过现场入口进入表单。这个入口要和现场设备、区域、岗位绑定,而不是一个可以随意转发、随时打开的链接。

巡检工具没有绝对优劣,关键看企业的管理半径、现场复杂度和验证强度。大型厂区、高风险场景,或者需要和门禁、设备、排班、监控系统联动的企业,专用巡检 App、NFC、蓝牙信标、定位设备会更适合,它们投入更高,也能承接更复杂的管理规则。

对更多只是想先把“不到现场、远程补填、他人代填”管起来的团队来说,未必一开始就要上重系统。可以用草料二维码先把巡检入口固定到现场:每个设备、区域或岗位贴一个二维码,巡检人员到现场后用微信扫一扫进入表单,再配合仅限微信“扫一扫”填写和定位限制,把记录生成条件收紧到现场扫码和现场提交。

这里的关键不是“用了二维码”,而是把巡检入口固定在现场。员工不再是随便打开一个表单,而是需要先到现场接触对应点位,才能开始生成这条巡检记录。

现场提交要有两层校验

只贴二维码还不够。因为二维码可能被拍照保存,也可能被转发给别人。所以现场提交至少要有两层校验。

第一层,是限制填写入口来源。草料二维码可以设置仅限微信“扫一扫”填写,避免员工通过保存的二维码图片、转发链接、浏览器打开等方式绕过现场扫码。这样做的目的,是让记录入口回到现场二维码本身。

第二层,是结合定位限制。员工扫码进入表单后,提交时校验手机当前位置是否在该点位允许范围内。这样可以进一步降低远程提交、异地代填的可能。

这两层校验解决的是同一个问题:巡检记录不能只看“谁提交了”,还要看“是不是在对应现场提交的”。入口来源和提交位置一起控制,才更接近真实到场。

仅限微信扫一扫打开

照片、水印等作为证据补充

照片、视频、水印、签名这些证据很重要,但它们不能替代现场入口控制。

原因很简单:如果表单入口本身不受控,照片也可能是旧照片,签名也可能是代签,说明文字也可能是事后补写。证据越多,只能让记录看起来更完整,不一定让到场这件事更真实。

更合理的顺序是:先控制记录必须在现场生成,再用证据补强检查过程。

例如,可以要求巡检人员使用仅限拍照上传,避免从相册选择旧图;开启防作假水印,让照片带上记录人、上传时间、定位、二维码等信息;关键岗位可以增加手写签名组件,明确责任人。这样,照片和签名就不是孤立证据,而是和现场扫码、定位提交一起构成一条更可靠的记录链。

防作假水印

先防不到场,再谈检查质量

巡检管理不能把所有问题混在一起。

“人有没有到现场”和“有没有认真检查”,是两个不同层次的问题。前者解决到场真实性,后者解决检查质量。不到场都没有控制住,就直接要求照片、描述、整改建议,很容易变成形式化填报。

比较稳的做法,是先把人员到场管住,确保记录从正确地点产生。再把检查到位管住:表单字段按设备、区域、风险点设计,关键项设置为必填,异常项要求拍照说明,必要时由负责人复核。

这样管理逻辑才清楚。第一步确认人到了,第二步确认查了什么,第三步再看问题有没有处理。

防不到场是巡检数字化的第一道门槛

巡检数字化不是把纸质表搬到手机上,而是把过去靠自觉和抽查维持的流程,变成有条件、有证据、可追溯的记录机制。

对多数企业来说,防止不到现场检查,不一定一开始就上复杂系统。先用草料二维码把巡检点位贴出来,把表单入口绑定到现场,再配合仅限微信“扫一扫”填写、定位限制、仅限拍照上传、防作假水印等设置,就能先解决最基础的到场问题。

只有先守住“记录必须在现场生成”这道门,后面的检查质量、异常整改、责任追溯才有意义。防不到场不是巡检管理的全部,但它是巡检数字化最先要补上的一环。

每天有超过一万亿次 HTTP 请求,在 Cloudflare 的全球网络和各地源站服务器之间流动。

这中间有一层代理,负责接收每一个缓存未命中的请求,转发给对应的源站,再把响应送回来。CDN、Workers、Tunnel、Stream、R2——Cloudflare 的大量核心产品,都依赖这一层代理正常工作。

2022 年,Cloudflare 宣布这层代理已经悄悄换掉了。新的系统叫 Pingora,用 Rust 从零构建,处理同等流量只需要原来三分之一的 CPU 和内存,同时还带来了显著的性能提升。

而替换掉的那个旧系统,叫 NGINX。


NGINX 用了很多年,为什么不够用了

NGINX 是一个经过时间检验的成熟项目,在绝大多数场景里表现出色。Cloudflare 使用它多年,也基于它做了大量的定制和优化。但随着业务规模持续增长,一些根本性的架构问题开始变得无法回避。

进程模型带来的连接池碎片化

NGINX 采用多进程架构,每个 Worker 进程独立处理请求。这个模型有一个内在的问题:连接池是按进程隔离的

当 Cloudflare 的边缘节点要把请求转发给源站时,会复用已有的 TCP 连接,这样可以跳过 TCP 握手和 TLS 握手,大幅减少延迟。但在 NGINX 里,一个请求落在哪个 Worker 进程,就只能复用那个进程自己的连接池。随着 Worker 数量增加,连接被分散在越来越多的独立池子里,整体的连接复用率反而越来越低。

连接复用率低,意味着需要更频繁地建立新连接。TLS 握手的开销相当可观,这个问题在规模足够大的时候,会直接体现为延迟上升和资源浪费。

除此之外,进程间的负载也很难均衡。CPU 密集型任务或者阻塞 IO,会拖慢同一个 Worker 进程里的其他请求,影响范围无法隔离。

复杂功能难以实现

Cloudflare 要做的事情,远不止是一个普通的负载均衡器或网关。当业务需要某些 NGINX 原生不支持的行为时——比如在重试请求时修改请求头,然后发往不同的源站——工程师们不得不在 NGINX 的约束下绕路实现,这消耗了大量工程资源,同时让代码越来越难以维护。

语言本身的限制

NGINX 的核心是 C,内存安全完全依赖开发者的自律。在如此复杂的代码库里,内存问题很难完全规避,Cloudflare 历史上也曾发生过解析器 bug 导致内存泄漏的事故。

为了补充功能,Cloudflare 大量使用了 Lua(通过 OpenResty)。Lua 风险低一些,但性能有明显上限,而且缺乏静态类型,复杂业务逻辑写起来容易出错、难以维护。


三条路,一个不容易的选择

意识到问题之后,Cloudflare 工程团队面临三个选项:

选项一:继续投入 NGINX,甚至 Fork 一个自己的版本。 团队有足够的技术积累,但 NGINX 的进程模型是架构层面的根本限制,在这个基础上做深度改造,工程量巨大,且改造完的结果基本上已经是另一个东西了。

选项二:迁移到现有的第三方代理,比如 Envoy。 Envoy 是一个优秀的项目,Dropbox 就做过类似的迁移。但这条路意味着把自己的核心基础设施的演进节奏,交给另一个社区决定,几年后可能面临同样的问题。

选项三:从零开始,自己构建。 前期工程投入最大,但一旦做成,基础设施完全在自己掌控之下,可以按需演进。

Cloudflare 连续几个季度评估这三个选项,最终在权衡了投入和收益之后,选择了第三条路——从零构建 Pingora。


Pingora 的核心设计决策

为什么选 Rust

Rust 是当时少数几个能在不牺牲性能的前提下提供内存安全保证的语言。相比 C,Rust 的编译器会在编译期拦截大量潜在的内存错误;相比 Go,Rust 没有 GC 暂停,更适合延迟敏感的代理场景。

选 Rust 的决定不只是语言偏好,而是对一个核心工程目标的回应:在互联网规模下安全地、快速地迭代。

为什么自研 HTTP 库

Rust 生态里有成熟的 HTTP 库,比如 hyper。但 Cloudflare 处理的是真实互联网上的全量流量,里面充斥着各种不符合 RFC 规范的边界情况。

一个典型的例子:HTTP 状态码按规范应在 100 到 599 之间,但实际上很多服务器会返回 600 到 999 之间的状态码。对于 hyper 这类严格遵循规范的库来说,这些请求可能直接被拒绝,而 Cloudflare 必须能够处理它们。

类似的边界情况不是少数,而是系统性存在。为了确保对这些情况的完整控制权,团队决定自己实现 HTTP 处理层。

多线程 + work stealing,解决进程模型的根本问题

Pingora 选择多线程模型,而非 NGINX 的多进程模型。所有线程共享同一个连接池,一个线程建立的连接,其他线程可以直接复用,彻底解决了连接池碎片化的问题。

同时引入了 work stealing 调度机制:当一个线程的任务队列空了,可以主动"偷"其他线程的任务来执行,避免负载不均。底层的异步运行时使用了 Tokio,其调度器正好原生支持 work stealing,契合度很高。

类 OpenResty 的事件钩子接口

Pingora 设计了一套基于请求生命周期的可编程接口,开发者可以在请求的不同阶段注入自定义逻辑——比如在收到请求头时执行过滤,在转发前修改请求,在收到响应后做处理。

这个设计思路来自 NGINX/OpenResty,对原来团队里熟悉 OpenResty 的工程师来说几乎没有学习成本。业务逻辑和通用代理逻辑通过钩子分离,让代码结构更清晰,也更容易独立演进。


生产环境的真实表现

延迟:握手时间省出来了

Pingora 上线后,整体流量的 TTFB(首字节时间)中位数降低了 5ms,P95 降低了 80ms。

这个提升不是因为 Pingora 的代码执行更快——原来的系统在请求处理上本来就能做到亚毫秒级。性能改善的核心来源是连接复用率的提升:更少的新连接,意味着更少的 TLS 握手,而 TLS 握手恰恰是延迟的大头。

数字层面:Pingora 建立新连接的频率,只有原来系统的三分之一。对某个主要客户来说,连接复用率从 87.1% 提升到了 99.92%,新建连接数减少了 160 倍。

用一个更直观的说法:每天,Pingora 为 Cloudflare 的客户节省了相当于 434 年的握手等待时间。

资源消耗:同等流量下省了 70% 的 CPU

在生产环境中,处理同等流量,Pingora 比旧系统消耗的 CPU 少约 70%,内存少约 67%。

节省来自多个方向:

Rust 代码本身的运行效率比 Lua 高。以访问 HTTP 头部为例,在 NGINX/OpenResty 里,Lua 代码要读取 NGINX 的 C 结构体,分配一个 Lua 字符串并复制内容,之后还要 GC 回收。在 Pingora 里,直接就是一次字符串引用,没有额外分配和复制。

多线程模型下的共享数据访问也更高效。NGINX 的共享内存需要互斥锁保护,而 Pingora 大多数共享数据通过原子引用计数直接访问,开销小得多。

建立更少的新连接,也直接减少了 TLS 握手的 CPU 开销,这部分节省相当可观。

安全性:数百万亿请求,零次服务代码崩溃

Rust 的内存安全保证,在生产环境里得到了直接验证。Pingora 上线以来,处理了数百万亿次请求,没有一次崩溃是由服务自身代码引起的。

偶发的崩溃反而成了排查其他问题的线索。有一次崩溃事件,最终追踪到了一个 Linux 内核 bug;另外几次,发现了硬件故障。在旧系统里,类似的崩溃很难判断是软件 bug 还是其他原因,调试过程耗时费力。Rust 把软件层面的不确定性消除之后,异常信号变得更纯粹,反而帮助团队更快定位问题根因。


这个案例说明了什么

Pingora 的故事,表面上是一次技术栈的替换,但背后折射出几个值得借鉴的工程判断。

规模会让原来不是问题的东西变成真正的问题。 NGINX 的进程模型在中小规模下运转良好,Cloudflare 在很长一段时间里也通过各种补丁和优化让它继续工作。但连接池碎片化这个问题,不是靠优化能根治的,它是架构层面的结构性缺陷,只有换掉才能解决。

"继续修修补补"和"从零重建"之间,没有一个通用的最优解。 Cloudflare 连续几个季度评估这个决策,最终做出选择的依据是投入产出比在某个时间点翻转了——而不是因为 NGINX 突然变坏,或者某个新技术突然变好。这种基于长周期观察做出的判断,比任何技术潮流的追随都要扎实。

语言选择是一个工程决策,不是品味问题。 选 Rust 的原因不是因为 Rust 时髦,而是因为它在内存安全和性能这两个维度同时满足了需求。生产环境里零次服务代码崩溃,是对这个选择最有说服力的验证。


原文链接:https://blog.cloudflare.com/how-we-built-pingora-the-proxy-th...
Pingora 已于 2024 年开源:https://github.com/cloudflare/pingora

机械组装工厂管理难点
机械组装工厂的管理者,每天都在与各种“不确定性”搏斗。车间里,生产进度如同黑箱,订单是否按时完成,往往要等到最后一刻才能知晓;插单、急单频发,打乱原有生产节奏,导致换线频繁、效率低下。物料管理更是痛点重重,BOM复杂、零部件繁多,错料、漏料、批次混淆等问题屡见不鲜,轻则返工,重则报废。
质量管控依赖人工,标准不一、漏检率高,客户投诉时有发生;设备意外停机更是“定时炸弹”,一条产线的瘫痪可能影响整个交付周期。而新员工培训周期长、工艺执行依赖老师傅经验,让生产一致性难以保证。这些问题交织在一起,让机械组装工厂的管理者疲于奔命,却始终难以从根本上解决问题。
机械组装MES的具体功能和解决方案
万界星空机械组装MES系统,正是为破解这些管理难点而生。它如同一个“数字化工厂管家”,将生产全流程纳入统一管理平台,让每个环节都清晰可见、可控可溯。
在生产计划与调度环节,MES系统支持从ERP同步工单,基于设备实际负荷、人员技能、物料齐套情况,生成可视化甘特图,支持拖拽调整、急单插单,让计划更贴合实际。物料管理方面,系统通过条码/RFID实现“一物一码”,从领料、上料到装配,全程扫码校验,错料自动报警,批次信息完整追溯,彻底杜绝错装漏装。
工艺执行环节,MES自动推送电子作业指导书(eSOP)到工位屏幕,版本实时管控,防止误用旧版;关键工序强制扫码过站,未完成上道工序禁止流转,确保工艺执行无偏差。质量管理模块覆盖从来料检验(IQC)到出货检验(OQC)的全流程,支持SPC统计过程控制,超差自动报警,不合格品自动分流维修,形成质量闭环。
设备管理则实时采集设备状态,计算OEE,自动生成保养计划,故障时自动报警并记录维修履历,让设备管理从“被动维修”转向“主动维护”。人员绩效模块通过技能矩阵匹配工位需求,实时统计产量、良率,为绩效考核提供数据支撑。所有数据通过车间大屏、移动端实时展示,管理者足不出户即可掌握生产全貌。

加上AI MES,机械管理不再难
如果说MES是“数字化工厂管家”,那么万界星空科技AI MES就是“智能化工厂大脑”。它在MES的基础上,深度融合AI技术,让系统具备“感知-分析-决策-优化”的能力,从根本上解决机械组装工厂的管理难点。
面对插单、急单,AI智能排产算法能在数秒内重新计算最优计划,综合考虑交期、换线成本、设备负载等多目标,动态调整生产序列,让计划更灵活、交付更准时。质量管控不再依赖事后检验,AI视觉系统实时识别装配缺陷,准确率超99.5%;AI还能关联分析生产参数,预测质量风险,在缺陷产生前自动调整设备参数,实现“零缺陷”生产。
设备管理从“预防性保养”升级为“预测性维护”,AI通过分析设备振动、电流等数据,提前预判故障,减少非计划停机时间30%以上。新员工培训不再依赖老师傅,AI智能助手通过语音交互,即时解答工艺疑问,推送3D作业指导,让新人快速上岗。
物料追溯从“事后查询”变为“实时防错”,AI结合条码数据,在上料前自动校验物料正确性,从源头杜绝错装。所有数据通过AI分析,自动生成管理报表,为决策提供科学依据。
机械组装工厂的管理,不再是一场与“不确定性”的搏斗。AI MES让生产进度透明、质量可控、设备稳定、人员高效,让机械管理不再难。

Windows

需要的功能除了正常的 crud ,编辑表的时候能显示 alter 语句,最好支持数据迁移
体验上来说不卡就行,能支持简单的自定义 ui

navicat 总是很卡,而且老是黑屏
dbeaver 也卡,而且 ui 也不如 navicat 简洁
Beekeeper 功能有点羸弱了,换字体都不行

  1. 继续打荒野大镖客 2, 之前打到第二章节, 就一年多没有启动了, 五一重新驰骋西部世界
  2. 杀戮尖塔 2, 把猎人和机器人进阶 6 打过去(争取)
  3. 去一趟上海西岸, 听说那边风景挺好, 去吃一次漂亮饭, 正好还有个而意自行车生活节, 试试他们的自行车
  4. 把衬衫拿去修改一下衣长, 个子不高想买一件合身得体的衬衫是一件难事, 看到好看的犹豫很久还是买了, 拿去改一下衣长
  5. 去看一下《寒战 1994》

长久以来,AI 编程助手能写代码,但不能真正"上线"。它生成了完整的项目,然后在部署环节停下来,等你手动去注册账号、复制粘贴 API Token、输入信用卡信息。这个最后几步,始终需要人来完成。

Cloudflare 在 2026 年 4 月 30 日发布的这篇博客,宣告这个局面正在改变。


之前卡在哪里

要把一个应用部署到生产环境,Agent 需要三样东西:

  1. 一个云平台账号
  2. 一种付款方式
  3. 一个有效的 API Token

这三件事,过去都必须由人来处理。即便 Agent 已经把代码写好了,用户还是要跳出对话,去平台控制台完成注册,生成 Token,再粘贴回来。

这个流程看起来不算什么大问题,但它意味着 Agent 的"自主性"存在一个硬边界——到了基础设施层,它就必须停下来等人。


现在变成了什么样

Cloudflare 与 Stripe 合作,推出了一套新协议,以及基于这套协议的产品 Stripe Projects

整个流程如下:

安装 Stripe CLI 并登录 Stripe 账号,执行:

stripe projects init

然后告诉 Agent 要做什么,比如"构建一个新网站并部署到新域名"。

接下来,Agent 会自动完成:

  • 创建一个新的 Cloudflare 账号(如果当前邮箱没有关联账号)
  • 获取 API Token
  • 注册并购买域名
  • 将应用部署到生产环境

如果当前邮箱已有 Cloudflare 账号,则走标准 OAuth 授权流程,Agent 获得对已有账号的操作权限。

整个过程中,除了在 Stripe 账号未绑定支付方式时会提示用户添加,其余步骤无需任何人工介入


协议的三个核心环节

这套机制背后,是 Cloudflare 和 Stripe 共同设计的协议,分为三个层次。

Discovery:Agent 如何知道能用什么服务

Agent 在构建方案之前,首先需要知道哪些服务可以被调用。

通过执行:

stripe projects catalog

Agent 可以拿到一份可用服务的目录,包含 Cloudflare 的域名注册、R2 存储、Workers 沙箱等产品,以及其他服务商提供的资源。

对于人类来说,这份目录可能过于冗长,但对 Agent 来说,这正是它需要的上下文——它会根据用户的需求,自行从中选择合适的服务,用户不需要提前知道有哪些选项,也不需要做任何选择。

Authorization:账号自动创建,不经过注册页面

当 Agent 决定使用某个服务并发起调用时,Cloudflare 需要确认用户身份。

这里的关键设计是:Stripe 作为身份提供方,对用户身份进行背书。Cloudflare 收到请求后,如果该邮箱没有对应账号,就自动为用户创建一个,并把 API Token 安全地返回给 Stripe Projects CLI,由 CLI 存储并提供给 Agent 使用。

用户不需要访问 Cloudflare 的注册页面,不需要设置密码,不需要做任何额外操作。从 Agent 的视角看,它直接拿到了可以使用的凭证。

Payment:给 Agent 一个预算,而非信用卡号

这是这套设计里最值得关注的环节之一。

Agent 在代购域名或开启付费服务时,Stripe 会在请求中附上一个支付 Token,Cloudflare 凭此完成计费。Agent 自始至终看不到真实的信用卡信息。

与此同时,协议默认设置了每个服务商每月 100 美元的消费上限,防止 Agent 失控乱买。如果需要调整上限,用户可以在 Cloudflare 后台手动设置预算警报。


不只是 Stripe,任何平台都可以接入

这套协议的开放性是这次发布中另一个重要信号。

Cloudflare 和 Stripe 把自己的角色分别定义为 Provider(服务提供方)和 Orchestrator(编排方)。理论上,任何拥有已登录用户的平台,都可以扮演 Orchestrator 的角色,以同样的方式接入 Cloudflare 提供的服务。

举个具体场景:如果你在做一款编程 Agent 产品,你希望用户构建完之后能直接部署,而不是把他们推进一堆授权流程。现在你可以让自己的平台作为 Orchestrator,用一次 API 调用,为用户在 Cloudflare 上开通账号,拿回 Token,让 Agent 直接完成部署。

另一个方向是反过来,让 Cloudflare 用户能轻松调用其他服务商的产品。Cloudflare 和 PlanetScale 正在合作,让 Cloudflare 用户可以直接在 Cloudflare 侧创建 PlanetScale 的 Postgres 数据库——资金从用户现有的支付方式扣除,整个过程不需要跳转到 PlanetScale 平台。

Cloudflare 在博客中明确表示,这套协议的目标是把过去各个平台各自为战、定制化对接的方式,标准化成一套可复用的规范。类比 OAuth 对"账号授权"这件事的标准化作用,这套新协议试图把"账号创建 + 支付 + 凭证颁发"打包成一个统一的流程标准。


这背后更大的变化

表面上看,这是 Cloudflare 和 Stripe 的一次联合发布,涉及账号、域名、支付的自动化。但如果往后退一步看,它代表的是一个更深层的转变。

过去,Agent 被定义为"帮助用户完成任务的工具",它的能力边界在于生成内容、写代码、做分析。真正需要与外部系统交互、需要身份和支付的部分,都还是由人来承接。

这套协议把这个边界往外推了一步:Agent 现在可以作为一个独立的操作实体,代表用户完成原本需要人才能完成的基础设施操作。

这不只是"更方便"的问题。它意味着从构建到部署的整个周期,可以在一次对话中完成,而无需用户在多个平台之间来回切换。对于独立开发者和小型团队来说,这个变化缩短的不只是操作步骤,而是真正的决策摩擦——很多想法因为"上线太麻烦"而被搁置,这个门槛正在被系统性地降低。

当然,这也带来了新的问题需要回答:Agent 的操作行为由谁审计?如果 Agent 出错,责任如何界定?支付预算的默认上限是否足够合理?这些问题在协议还处于开放 Beta 阶段时,还没有完整的答案。


小结

Cloudflare 这次和 Stripe 做的事情,本质上是在为 Agent 补全"最后一公里"的基础设施:账号、支付、凭证,这三件事原来是 Agent 能力的边界,现在被系统性地纳入了协议范围。

对开发者来说,这意味着可以用更少的前置设置,让 Agent 做更多原来只有人能做的事。对整个行业来说,这套协议如果能推广开来,可能会成为 Agent 调用第三方服务时的通用接口规范。

目前 Stripe Projects 已进入公开 Beta,无需已有 Cloudflare 账号即可开始体验。


原文链接:https://blog.cloudflare.com/agents-stripe-projects/

五一假期将至,我相信有很多派友们都会抓住难得的长假机会,策划一场期盼许久的旅行。曾几何时,我们出门旅游时要带上相机、纸质地图、旅行攻略(比如说 Lonely Planet)、纸质车票、钱包、现金等一堆东西。随着科技的进步,像我这样出门旅游连包都不想背的人已经可以轻松实现「手机一部、走遍天下」的目标。

今天,我就以 iPhone 为例,分享一下自己如何用 iPhone 搞定旅行前、中、后的大部分事情。

前期规划

地图导航

我相信如今再传统的人都很难会带着纸质地图出门旅行了,手机上地图软件的功能已经深入了人心,不管是路线查找还是导航功能,大家都已经用得非常熟练,毕竟地图软件的便利程度和纸质地图完全不在一个量级。除了这两个人人熟知的基础功能,iOS 系统上的地图 app 其实还隐藏着一些不为人知却非常实用的小功能。

「我的指南」是我出门旅行必用的一个功能。首先,每次去一个地方旅行前我都会在地图 app 中创建一个新指南,然后一一搜索想要去的地方,在「更多」按钮中点击「添加到指南」,最后选择我刚刚创建的新指南即可。

回到主界面后,在「我的指南」中找到相应的指南,就可以看到地图 app 会将指南中所有的目的地都显示在地图中,可以让我对这些地方的地理位置有个大致的了解,方便我规划行程。

另外,「我的指南」也可以让我在旅途中免去反复查找的麻烦,我可以在「我的指南」中快速地定位目的地,然后进行导航或者路线规划。

在地图 app 中,Apple 还与多家国内的公司合作,集成了诸多出行服务,比如说打车、票务、订座等。比如说,五一假期我想去动物园看小熊猫,在地图 app 中先搜索「宁波动物园」,就可以在应用中看到「门票」选项,点击即可跳转到携程从官方渠道直接购买门票。

买好票后,我想打车去动物园,地图 app 中的路线就直接集成了打车信息。不过在使用这个功能前,需要在「设置」>「地图」>「叫车」中启用第三方应用的叫车扩展,然后回到地图 app 中即可看到实时的叫车等待时间。

如果你打算去玩的地方在国家公园、天文台等位置比较偏僻的地方,很有可能会遇到手机信号不好的情况。如果仅仅依赖 GPS 功能,那么几乎无法完成导航的任务。还好,Apple 在自家的地图 app 中支持了「离线地图」功能,可以让我们在没有网络的情况下在预先下载好离线地图的区域内正常使用地图功能。

下载离线地图有两种方式:第一种,直接在地图中找到需要下载离线地图的区域,长按屏幕直到出现「已放置的大头针」,然后点击下载按钮,屏幕上就出现一个四边形框,调整好离线地图的范围后再次点击下载按钮即可保存离线地图。

第二种,点击头像,然后选择「离线地图」>「下载新地图」,在搜索框中输入想要下载离线地图的地点即可前往下载。

使用地图 app 还有一个小技巧,我想有很多人应该都不知道。随着多指触控技术的普及,大家对使用两根手指来缩放这个操作已经非常熟练了。在地图 app 上,除了传统的双指缩放操作,现在还支持了单指缩放,可以让我们在规划行程的时候用一只手就完成操作,增加了不少便利度。

单指缩放的操作方式也很简单,只需在屏幕上连续点击两次,在第二次点击时按住屏幕不要松开,然后向上滑动就是放大,向下滑动就是缩小。

行程规划

在筹划旅行的过程中,我和桃总经常会通过小红书、微博、B 站等渠道收集一些感兴趣的地方。虽然每个平台都有收藏夹功能,但是无法做到聚合功能,因此 iOS 系统自带的备忘录 app 可以让我们方便地实现这个需求,同时通过协作功能,我们也能自由地在同一个笔记中进行编辑操作,免去了频繁互相发送文件的麻烦。

除了协作功能,备忘录 app 对插入链接的解析功能也非常实用,可以让我们不用打开网页就能在笔记中直接掌握一些基本信息,方便我们筛选和排序。

如果你觉得备忘录 app 使用起来有所拘束,那么无边记 app 应该可以满足你的需求。无边记是一款拥有超大画布的白板应用,可以让我们在一块能从 10% 到 400% 之间自由缩放的画布上创作。无边记的工具栏包含了 5 个选项——画笔工具、新增便签、插入图形、插入文本、插入媒体,其中插入媒体包括了图片 / 视频、相机、扫描文档、插入链接和从文件 App 插入。

拓展阅读:深入《无边记》:一种革命性的知识管理体系

除了本地创作,无边记还有一个非常重要的功能,那就是协作。在任意画布的右上角找到分享按钮,就可以通过信息、邮件等方式邀请协作者加入当前的画布中。根据权限的设置,受邀用户或者任何拥有链接的用户都可以查看此画布的内容或者直接在这个画布上再创作,所有参与者都可以在画布上看到实时的更改。

这样一来,我们就可以通过无边记 app 来进行旅行攻略的协作编辑,在无边界的画布上自由地创作,记录路线、打卡点、时间、价格、订座信息、灵感等。

旅途中

翻译交流

出国旅行,特别是在小语种国家,翻译软件是旅途中必不可少的一个工具。如果你不知道哪款第三方应用合适或者不想付费使用,那么不妨试一试 iOS 系统自带的翻译功能。

比如说你去一家当地的餐馆,拿到菜单后如同天书一般,完全不知道如何点菜。这时候,你可以拿出 iPhone 对着菜单拍一张照片,然后打开相机,点击右下角的识别按钮,识别完成后再点击「翻译」即可,系统会将翻译结果直接覆盖在原文上,你可以再次点击「翻译按钮」来恢复显示原文,方便来回对照。

如果你是看不懂网页上显示的内容,先拍照后翻译的方式可能就不太方便了。不用担心,iOS 系统自带的翻译功能 可以帮助你解决这个问题。在任意一个网页中,点击地址栏的扩展按钮,然后选择「翻译网站...」,就可以将当前网页全部翻译成你指定的目标语言了。

不过,我最喜欢也是使用最频繁的还是系统自带的翻译 app,因为它覆盖了出国旅行时最常见的三种外语使用场景,用起来真的很方便。

一是纯粹的翻译功能,当我只是想简单地查询一个单词的时候,我就在「翻译」标签页中解决这个需求;二是相机翻译功能,当我在点菜、买东西的时候,我只想知道价格或者商品名称,那么我只需打开「相机」标签页,然后把手机摄像头对准菜单或者商品标签就行了;三是实时对话翻译功能,当我需要和当地人比如服务员、前台工作人员等交流的时候,我就打开「对话」标签页,选好双方的语言,然后就可以和对方开始自由对话了。

以法语对话为例。它的工作流程是这样的:首先,我用中文说一句话,翻译 app 就可以将我说的话以中、法双语显示在屏幕上,我可以把手机上的法语给对方看,也可以播放翻译出来的法语给对方听;接着,我让对方直接用法语回答,他说的话也会以法、中双语显示在屏幕上,我可以直接看中文翻译,也可以直接听中文语句。这样一来,双方就完成了基本的交流过程。

汇率转换

不管是吃饭还是购物,在国外消费的时候我们难免要计算一下汇率。在 iOS 系统中,无需下载第三方应用,我们就可以通过 4 种方式非常便捷地来进行汇率转换。

第一种,通过 Spotlight。在主屏幕下拉,在 Spotlight 中直接输入金额和需要转换的币种,比如说 1000 日元换算成人民币,Spotlight 会直接显示换算结果。

第二种,通过 Siri。直接问 Siri 金额和需要转换的币种,比如说 50000 日元等于多少人民币,Siri 也会直接告诉你结果。

第三种,通过 Safari,在 Safari 浏览器的地址栏中输入金额和需要转换的币种,比如说 10000 人民币等于多少美元,Safari 也会直接显示汇算结果。

第四种,如果你想看一下实时汇率和汇率走势,那么可以打开股票 app,然后直接搜索需要转换的两种汇率,比如说我想看一下美元对人民币汇率,直接在搜索栏中输入「USD CNY」即可找到 CNY=X 的选项,点击进入就能查看实时汇率和汇率走势了。

安全保护

在旅途中,难免会遇到丢三落四或者遭遇「第三只手」的情况,因此做好自己财产的安全保护非常重要。

对于 iPhone 来说,我们可以通过开启设置中的「失窃设备保护」功能,来提高设备的安全防护等级,万一 iPhone 失窃,也有助于保护账户隐私和个人信息。如果需要使用这个功能,在设置中找到「面容 ID 与密码」,输入密码进入后找到「失窃设备保护」,启用「失窃设备保护」功能。

启用后,iPhone 就可以在离开家或者办公室等熟悉的地点时,要求满足额外的安全认证才能进行重大更改。比如说,当有人在窃取了你的设备和密码后,试图访问储存的密码或者信用卡信息,iOS 系统会要求使用面容 ID 或者触控 ID 进行一次生物识别认证,而且不可使用密码替代或者回退认证。

在设置中还有一个「需要安全延迟」的选项,可以选择「离开熟悉位置时」或者「始终」,设置好后当有人在离开熟悉位置时对 iPhone 进行某些安全相关操作(比如说更换密码),需要等待一小时后才能进行第二次面容 ID 或者触控 ID 的生物认证。如果你选择了「始终」,那么这个设定就会在任意地理位置一直保持。

除了 iPhone 以外的其他苹果设备,我们也可以在查找 app 中为他们添加一些防丢失措施。以 AirPods Pro 为例,我可以在「设备」标签页中找到「遗落时通知」的选项,启用后可以设置白名单位置,当 AirPods Pro 出现在白名单以外的位置时,系统就会及时提醒你。

如果你的 AirPods Pro 不慎丢失,那么还可以在查找 app 中将其标记为丢失,并提供你的联系方式,这样一来捡到你的 AirPods Pro 的人如果试图将其连接到他自己的 Apple 设备上,那么系统将会提醒他这是丢失的设备并告知你的联系方式。

针对非 Apple 设备,我们也有防丢失的方式,那就是通过 AirTag 来实现。将 AirTag 绑定或者收纳在隐蔽的地方,然后在查找 app 中进行添加,在「物品」标签页我们就能看到它了。与「设备」标签页中的 Apple 设备相同,我们也可以对 AirTag 进行播放声音、查找、遗落时通知、启用丢失模式等操作,此处不再赘述。

拍照摄影

从旅游时人手必备的「长枪短炮」,到如今 90% 以上的人只用手机拍照,也就过去了 10 多年时间。随着光学硬件和计算摄影的发展,不少旗舰手机的摄影能力已经可以比肩甚至超越一些卡片相机了。如果我们用好手上这台 iPhone,我相信它的相机表现可以让你心安理得地把沉重的相机放在家里了。

第一步,我们先来设置一下照片格式。如果你是一名摄影爱好者,希望在拍照的时候保留更多细节,方便自己后期修图,那么必须要在「设置」>「相机」>「格式」中开启「ProRAW 与分辨率控制」,然后在默认专业格式中选择 ProRAW Max,这样才能获得最强画质,不过需要牺牲一定的机内储存空间,因为每张照片的体积高达 75 MB。如果你想兼顾画质和照片体积,又不想费精力后期修图,那么在默认专业格式中选择 HEIF Max 即可,每张照片的体积仅 5 MB。

如果你更喜欢拍视频,那么也不妨提前设置好视频格式。在「设置」>「相机」>「录制视频」中,我们可以选择视频的分辨率和帧率,分辨率支持从 720p、1080p 到 4K,帧率则可以选择 24 fps、30 fps 或者 60 fps。如果你只想简单地记录旅途中的美景或者有趣的事情,那么 1080p HD/60 fps 是一个不错的选择,一分钟视频大概占用 100 MB;如果你需要拍摄素材,回家后制作成精美的视频,那么尽量选择 4K/60 fps 格式,这样可以录制更高分辨率和更流畅的视频,不过每分钟需要占用 440 MB。

另外,我还推荐大家打开设置选项中的「增强稳定性」,虽然会裁切一部分画面,但是可以达到更好的防抖效果。「HDR 视频」选项也是必选项,即使只在 iPhone 上回看视频也可以达到更好的观看效果。

对于专业摄影来说,iPhone 还有一个杀手锏,那就是 Apple ProRes,你可以在「设置」>「相机」>「格式」中启用,启用后 iPhone 就可以拍摄 ProRes 格式的视频,方便进行专业视频后期制作,不过 1 分钟 10 bit HDR ProRes 视频将占用高达 1.7 GB 的储存空间。启用该功能后,ProRes 编码还可以在 HDR、SDR、和 Log 之间进行选择。

需要注意的是,当我们在 iPhone 中内录 ProRes 视频时,最高仅支持 30 fps/1080p,只有当连接外部储存设备进行录制时才支持 60fps/4K 格式。

不过,虽然 iOS 系统相机仅支持外接存储设备录制高规格的 ProRes 视频,但目前已经有多款第三方 app 支持了 HEVC 的编码格式,可以让我们使用这些 app 实现这些高规格视频内容的机内录制,我们此前介绍过的 Kino、Blackmagic Camera,以及 Apple 自家出品的 Final Cut Camera 都支持了高规格 ProRes 视频的机内录制功能。

拓展阅读:

我相信很多人都听说过「三等分构图法」,在 iPhone 上我们也可以启用网格线,然后借助网格线来进行拍摄时的构图。在「设置」>「相机」中找到构图部分,点击启用「网格」即可。如果你还想在拍照的时候观察画面是否保持水平,那么也可以在设置选项中启用「水平」。通过这两个选项,使用 iPhone 相机时也可以轻松完成构图辅助了。

iPhone 相机有一个使用小技巧,那就是「自动曝光/自动对焦锁定」,可以通过在取景框中长按屏幕 2 秒左右触发。触发这个模式后,iPhone 相机就会根据你在取景框中触屏的位置来选定对焦目标,同时锁定曝光,这样一来即使你移动 iPhone 或者取景框中出现其它物体也不会改变对焦目标和曝光。退出「自动曝光/自动对焦锁定」模式的方法也很简单,只需单击一次取景框中任意位置即可。

在 支持的设备上,我们现在还可以通过相机控制按钮,通过保持轻按的形式锁定对焦和曝光。

有很多人喜欢用 Live Photo 模式来拍摄照片,这种模式的好处是可以保留按下快门前后的瞬间,捕捉更多美好的画面,同时又比拍视频效率更高。

除了普通的录制,Live Photo 其实还可以在相册中调整成其它形式,只需点击照片左上角的「实况」按钮,就可以在循环播放、回来播放、长曝光之间进行选择,创作出各种各样有意思的「短片」。

旅程后

相片编辑

旅程结束,在回家的路上或者到家后,不少人都会选择修图然后发朋友圈。iOS 系统中的相册在最近几次大版本更新中都不断地加强编辑功能,我们可以在相册 app 中对照片进行曝光、鲜明度、高光、阴影、对比度、亮度、黑点、饱和度、自然饱和度、色温、色调、锐度、清晰度等参数上的调整,也可以给照片添加滤镜或者调整角度和比例。

除了照片编辑功能,相册 app 中的抠图功能也非常强大和实用。最关键的是,Apple 将曾几何时非常具有技术含量的「抠图」操作简化为了一个长按动作,在任意一张照片中只需对准照片主体长按屏幕,系统就会自动完成抠图操作,我直接就可以将抠出来的主体复制出来或者添加为贴纸。

电子手帐

除了朋友圈,如果还想给自己留下更多旅途中的种种回忆,其实手记 app 是一个非常好的选择。正如这篇文章的主题 —— 用一台 iPhone 搞定旅行一样,手记可以将 iPhone 记录的各类信息都汇聚到一篇手记中。我可以在手记 app 中以天为单位来创建手记,然后通过推荐模块来插入定位、体能训练、照片、照片回忆精选、音乐等内容,可以说实现了「全自动电子手帐」的功能。

第三方 app

除了 iOS 系统自带的应用或者功能,App Store 上优秀的第三方应用也让 iPhone 变得更加强大。在这里,我也简单地推荐一些出门旅行用得上的实用向 app,大家如果有其它推荐的 app 也欢迎在评论区进行补充。

如果我们对要去旅行的地方不太熟悉,可能要先做一下攻略或者行程规划。这里我推荐两个 app ,一个是 Tripsy,另一个是 Wanderlog。这两款应用的功能大同小异,就是帮我们搜集旅途中的关键信息,比如说航班、酒店、餐厅、景点等,然后通过一种更加聚合和美观的方式来进行展示。Tripsy 的特点是设计非常在线,不过需要付费订阅才能使用。Wanderlog 的特点是可以免费使用大部分功能,而付费版可以帮助你智能调整路线。

拓展阅读:想去的地方很多?用 Tripsy 轻松制定旅行计划

在海外旅行的时候,高德地图和百度地图可能就没那么好用了,因此 Google Maps 是更好的选择。除了搜索位置、导航和路线规划,Google Maps 还集成了餐厅预订、公共交通班次、打车等功能。

如果你想趁着出门旅行尝试一下记录活动轨迹或者地点打卡,那么可以试试迷雾世界和 Swarm,前者可以帮你记录在世界各地的详细运动轨迹,而后者可以帮你发现和记录餐厅、博物馆、景点等地方的打卡信息。

和朋友或者同事出去旅行,难免要好好算账,把每一笔支出都记录下来,方便旅程结束后支付费用。我这里推荐一下钱迹 app,每次出去玩就新建一个账本,然后邀请朋友们加入。在账本类型中选择「旅行账本」,然后在记录每一笔支出的时候可以详细登记支出类型、商品照片、小票、购买者等信息,所有人都能看到每一笔费用,同时方便日后结算。

你还有哪些出行时使用 iPhone 的小技巧?或者有相关的 app 想要推荐给我们,欢迎在评论区讨论。

> 关注 少数派小红书,找到数字时代更好的生活方式 🎊

> 实用、好用的 正版软件,少数派为你呈现 🚀