2026年2月

随着生成式 AI 工具逐步走向主流,Gemini 已经成为许多开发者、研究人员以及内容创作者日常工作的一部分。然而,在真实使用过程中,不少用户会发现,Gemini 的访问体验并非始终稳定。页面加载失败、功能不可用、验证反复触发,甚至在不同网络环境下表现差异明显,这些问题的背后,往往并不只是产品本身的限制,而是与网络出口的可信度密切相关。

Gemini 对网络环境的隐性要求

从表面来看,Gemini 只是一个面向用户开放的 AI 服务,但在底层,它运行在一套高度自动化的风控体系之中。系统并不会单纯依赖账号信息来判断请求是否可信,而是会综合分析访问来源的网络类型、地理位置、IP 历史行为以及整体使用模式。
当访问请求来自数据中心、云服务器或被频繁滥用的代理网络时,即便账号本身没有问题,也更容易触发限制机制。这类限制并不总是以“封禁”的形式出现,而是通过降低响应稳定性、限制功能可用性等方式逐步体现出来。
也正因为这种“软性风控”的存在,很多用户会误以为是 Gemini 本身不稳定,而忽略了网络出口这一核心变量。

普通代理在 Gemini 场景中的局限性

在尝试优化访问体验时,一部分用户会首先想到使用代理工具。然而,普通代理往往难以满足 Gemini 对网络真实性的隐性要求。这类代理通常集中部署在有限的 IP 段中,出口特征明显,使用行为高度重复。
在短时间内,这种代理或许可以完成连接,但随着请求频率增加,系统很容易识别出异常模式。一旦 IP 被标记,后续访问即使切换账号,也难以恢复到理想状态。这也是为什么频繁更换代理并不能真正解决问题,反而可能进一步降低整体成功率。
真正有效的方案,并不在于“绕过检测”,而在于让访问行为本身更接近真实用户。

住宅代理如何改变 Gemini 的访问体验

住宅代理的核心价值,在于其 IP 来源于真实家庭网络环境。与服务器代理相比,这类 IP 在网络路径、自治系统归属以及历史行为上,更符合普通用户的访问特征。
当 Gemini 接收到来自住宅网络的请求时,其风控系统更倾向于将其视为正常使用,而非潜在风险。这种差异并不会在界面上直接体现,却会反映在连接稳定性、响应速度以及功能完整性上。
尤其是在需要长期使用 Gemini、频繁进行交互或调用相关功能的场景中,住宅代理所带来的稳定性优势会逐渐显现。

网络身份连续性的重要性

在 Gemini 的使用过程中,另一个经常被忽视的因素,是网络身份的连续性。系统不仅关注单次请求是否异常,也会观察一段时间内访问行为是否具备连贯性。
如果用户频繁切换 IP,或者在不同地区之间跳跃,反而容易形成不自然的使用轨迹。这种情况下,即便每一个 IP 本身质量尚可,整体行为模式仍然可能触发风控关注。
高质量住宅代理的优势之一,正是在于能够在同一地区内提供足够自然的 IP 分布,使用户在需要更换出口时,依然保持网络身份的一致性。这种连续性,对于 Gemini 这类长期服务型平台尤为重要。

真实使用中对代理质量的要求

并非所有住宅代理都能带来理想效果。IP 池规模、地区覆盖深度以及匿名配置水平,都会直接影响 Gemini 的访问体验。如果住宅 IP 被过度共享,或者在协议层暴露中转特征,其效果与普通代理并无本质区别。
在这一点上,IPPeak 的住宅代理架构更强调“真实分布”而非简单数量。其 IP 来源覆盖多个核心国家和地区,并保持足够分散的使用密度,使单一出口不容易形成异常使用模式。在实际应用中,这种结构有助于提高 Gemini 访问的整体成功率,并减少因网络问题导致的中断。
需要强调的是,这种稳定性并非依赖激进策略,而是建立在更符合平台预期的网络表现之上。

从技术工具到长期使用策略的转变

当用户真正将 Gemini 视为长期工具时,对网络环境的要求也会随之发生变化。短期测试阶段,网络问题或许尚可接受,但在持续使用过程中,任何不稳定因素都会被放大。
通过住宅代理构建更可信的网络身份,本质上是在为长期使用打基础。这种策略并不是为了对抗平台规则,而是通过更自然的方式,减少不必要的干扰,让技术工具回归其应有的价值。

重新理解 Gemini 与网络出口的关系

Gemini 的体验好坏,很大程度上并不取决于使用技巧,而取决于访问环境是否稳定、可信。当网络出口与普通用户高度一致时,系统的反馈也会更加友好。
在这一背景下,住宅代理不再只是一个“辅助工具”,而是连接用户与 AI 服务之间的重要桥梁。理解这一点,往往是许多用户在经历反复尝试后才逐渐形成的共识。

Rspack是一个基于Rust的、旨在替代webpack的高性能 Web 打包工具。Rspack 1.7 版本发布,这是在项目过渡到 2.0 版本之前,1.x 系列的最后一个小版本。该版本专注于提升现有功能的稳定性和插件的兼容性。

 

Rspack 1.7 引入了多项增强稳定性的改进,包括:增强SWC插件兼容性原生支持以字节形式导入资源,以及固化多项实验性功能。对于 Web 应用中动态导入的模块,该版本还引入了默认启用的懒编译。

 

Rspack 1.7 的一个新特性是改进 SWC 插件兼容性。在以前的版本中,由于 AST 结构不断演变,SWC Wasm 插件面临着高昂的升级成本,使得现有插件在 SWC 升级后会出现问题。为此,Rspack 团队向SWC社区贡献了兼容性改进,包括采用cbor序列化方案来替代版本敏感的rkyv,并在 AST 中引入了用于枚举类型的 Unknown 变体,以提高容错性。从 Rspack 1.7 开始,SWC 升级不大可能再破坏之前使用旧版本 SWC 构建的插件了。

 

Rspack 现在原生支持Import Bytes提案,即以字节形式导入资源。开发者可以用 Uint8Array 导入资源,并使用 TextDecoder 进行解码,语法如下:

 

import fileBytes from './file.bin' with { type: 'bytes' };const decoder = new TextDecoder('utf-8');const text = decoder.decode(fileBytes);
复制代码

 

从 Rspack 1.7 开始,在构建 Web 应用时,Rspack CLI 针对动态导入模块默认启用懒编译。这一变化减少了初始构建中的模块数量,加快了开发服务器的启动速度。有特殊需求的开发者可以通过将 lazyCompilation 设置为 false 来显式地禁用这个功能。

 

这个版本中,有几项实验性功能已经被固化。常量内联优化现在已经稳定,并且在生产构建中默认启用,原来的 experiments.inlineConst 选项被 optimization.inlineExports 所取代。TypeScript 枚举内联优化和类型 re-export 检查也已去掉了实验性标志,达到稳定状态。

 

迁移到 Rspack 1.7 时需要注意下 SWC 插件的版本。使用 SWC Wasm 插件的项目必须升级插件,以兼容 swc_core 54 或以上版本,以避免构建失败。在他们的FAQ文档中,Rspack 团队提供了处理 SWC 插件版本不匹配问题的指南。

 

Rspack 的定位是兼容webpack的替代方案,其构建速度明显更快。根据Medium上一位用户的记录,从 webpack 迁移到 Rspack 后,构建时间减少了 70%,本地构建时间从 1.7 分钟降低到 30 秒。另一个来自 Mews 的团队报告说,启动时间从三分钟减少到十秒,提高了 80%。然而,Rolldown项目的基准测试显示,尽管 Rspack 的性能优于 webpack,但它仍然比 esbuild 和 Rolldown 等工具慢。

 

这个版本还为更广泛的 Rstack 生态系统带来了更新:Rsbuild 1.7 引入了运行时错误覆盖和资源大小差异报告;Rsdoctor 1.4 新增用于包分析的树状图视图;Rslib 0.19 稳定了打包模式中的 ESM 输出。

 

Rspack 是一个由字节跳动开发的开源项目。该工具旨在提供与 webpack 相当的 API 兼容性,同时借助 Rust 语言实现性能提升。如果既不想脱离 webpack 生态系统,又想加速构建流程,那么这个工具很合适。

原文链接:

https://www.infoq.com/news/2026/01/rspack-final-rust/

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 集成网迅网卡驱动定制版

VMware ESXi 9.0 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

发布 ESXi 9.0 集成驱动版,在个人电脑上运行企业级工作负载

请访问原文链接:https://sysin.org/blog/vmware-esxi-9-sysin/ 查看最新版。原创作品,转载请保留出处。

作者主页:sysin.org


2026-01-12,应用户要求,更新集成网迅网卡驱动定制版。

发布 ESXi 9.0 集成驱动版,在个人电脑上运行企业级工作负载,构建开发、测试和学习的最佳平台。

vSphere Workloads Everywhere

通用特性概览

该版本在官方原版基础上新增以下特性:

  • macOS Unlocker:来自 GitHub 的 Unlocker 4,现已支持 macOS Tahoe
  • OEM BIOS 2.7:使用社区最流行的 OEM BIOS/EFI64,现已支持 Windows Server 2025
  • LegacyCPU support,允许在不受支持的旧款 CPU 上安装 ESXi 9.0
  • ESX-OSData 卷大小修改为 8GB,解决自 ESXi 7.0 起系统占用磁盘空间过大的问题(超过 142GB)
  • 有限支持采用混合架构的第 12 代及以上 Intel 处理器,可实现正常引导和运行
  • 中文界面语言支持,在 ESXi 9.0 的 Host Client 中继续支持简体中文界面语言,包括繁体中文

详情请访问原文链接:https://sysin.org/blog/vmware-esxi-9-sysin/ 查看。

集成网迅网卡驱动定制版

NETSWIFT

北京网迅科技有限公司是一家专门从事集成电路高端芯片设计、提供网络产品解决方案的高科技企业。公司成立于 2014 年 5 月,总部位于北京市海淀区玉泉慧谷科技园区,在浙江杭州设有分公司。

公司成功研制了自有知识产权的万兆和千兆以太网控制器芯片、适配器,突破了一系列计算机网络领域高端芯片设计的难题,在网络安全和网络虚拟化等方面达到了较高水平。

网迅网卡不仅兼容 Windows 系统和主流的 Linux 发行版,还可以支持最新的 VMware ESXi 系统,远超预期!

以下是经过验证支持最新版 ESXi 的网讯网卡型号。

Brand NameModelVendorIDDeviceIDSVIDSSID
Wangxun/NETSWIFTFF5025-DDATACXX8088502580881000
Wangxun/NETSWIFTFF5025-DDATAIXX8088512580883000
Wangxun/NETSWIFTFF5040-DDBTACXX8088504000000000
Wangxun/NETSWIFTFF5040-DDBTAIXX8088514080883000
Wangxun/NETSWIFTRP1000 series8088100100000000
Wangxun/NETSWIFTRP2000 series8088200100000000
Wangxun/NETSWIFTWX1860A28088010100000000
Wangxun/NETSWIFTWX1860A48088010300000000
Wangxun/NETSWIFTWX1860A4S8088010400000000
Wangxun/NETSWIFTWX1860AL28088010500000000
Wangxun/NETSWIFTWX1860AL2S8088010600000000
Wangxun/NETSWIFTWX1860AL48088010700000000
Wangxun/NETSWIFTWX1860AL4S8088010800000000
ZTE CorporationNO127808801031cf20801
ZTE CorporationNO127D808801011cf20802

下载地址

ESXi 9.0.1.0 集成驱动版 (2026-01-12)


标准版和厂商定制版,请访问:

官方原版,请访问:

上一个版本,请访问:

更多:VMware 产品下载汇总

优步的工程师介绍了他们如何将分布式存储平台从静态限流演进为优先级感知的负载管理系统,以保护其内部数据库。这一改进解决了大型有状态多租户系统中基于 QPS 限流的局限性,那就是这种限流方式无法反映真实负载、难以处理 “噪音邻居” 问题,也无法保障尾部延迟。

 

该设计保护了基于 MySQL 构建的DocstoreSchemaless存储系统,这些系统通过数千个微服务为超 1.7 亿月活用户(包括乘客、Uber Eats 用户、司机和配送员)提供服务。通过优先保障关键流量并动态适应系统状态,该系统可防止级联过载,在大规模场景下维持性能稳定。

 

优步的工程师指出,早期基于配额的方案依赖集中式跟踪的静态限制,它的效果不佳。无状态路由层无法及时感知分区级负载,且相似大小的请求会产生不同的 CPU、内存或 I/O 开销。运维人员需要频繁调整限流阈值,有时会误删健康流量,而过载分区却没有得到保护。

 

正如优步的工程师Dhyanam V.LinkedIn帖子中所述:

有状态数据库的过载保护是大规模场景下的多维度问题。

 

为了解决这个问题,优步将负载管理与有状态存储节点协同部署,结合了受控延迟(Controlled Delay,CoDel)队列和租户级记分卡(Scorecard)。CoDel 基于延迟调整队列行为,记分卡则强制实施并发限制,同时使用额外的调节器监控 I/O、内存、goroutine 和热点数据。CoDel 对所有请求一视同仁,会同时丢弃低优先级和面向用户的流量,导致 on-call 负载增加、用户体验受损,并且依赖固定队列超时和静态的 in-flight 限制,可能引发惊群效应重试,甚至丢弃高优先级请求。尽管它能防止灾难性故障,但缺乏维持稳定性能所需的动态性和精细化能力,凸显了优先级感知队列的必要性。

使用 CoDel 队列的负载管理器设置(来源:优步博客文章

 

后续演进引入了Cinnamon,这是一款优先级感知的负载 shedder 系统,能够将请求分配到分级队列,优先丢弃低优先级流量,避免影响延迟敏感的操作。Cinnamon 基于高百分位延迟指标动态调整 in-flight 中请求限制和队列超时,减少对静态阈值的依赖,在过载时实现更平滑的降级。

使用 Cinnamon 队列的负载管理器设置(来源:优步博客文章

 

优步后续通过“自带信号(Bring Your Own Signal)”模型,将本地和分布式过载信号统一到单一的模块化控制回路中。该架构允许团队将节点级指标(如 in-flight 中的并发数、内存压力)和集群级信号(比如,从节点的提交延迟)接入集中式的准入控制路径。整合这些信号消除了碎片化的控制逻辑,避免了早期基于令牌桶系统中出现的冲突性负载 shedding 决策。

 

据优步介绍,改进效果非常显著,过载场景下吞吐量提升约 80%,upsert 操作的 P99 延迟降低约 70%;goroutine 数量减少约 93%,峰值堆内存使用降低约 60%,整体效率得到了提升,同时缓解了运维的负担。

 

优步总结了负载管理演进的核心经验,那就是优先保障关键用户流量,先丢弃低优先级请求;尽早拒绝请求以维持可预测延迟、降低内存压力;使用基于 PID 的调节确保稳定性;将控制逻辑部署在数据源附近;动态适应工作负载;保持可观测性;优先采用简单设计,确保压力下的稳定可靠运行。

 

原文链接:

Uber Moves from Static Limits to Priority-Aware Load Control for Distributed Storage

微软和 GitHub 扩展了 Copilot 生态系统,推出了首个专注于.NET的GitHub Copilot自定义代理,旨在提高 C#和 Windows Forms 开发者的生产力和代码质量。作为更广泛的 Copilot 自定义代理发布计划的一部分,本次公告推出了两款专属代理:C#专家与 WinForms 专家,它们以代理指令 Markdown 文件的形式提供。

 

C#专家代理旨在引导并强制执行现代 C#最佳实践。它尊重项目约定,最小化不必要的代码工件,如未使用的接口或参数,并强调 async/await 模式要带有适当的取消和异常处理。它还支持行为驱动和集成测试工作流,帮助开发者编写更干净、更易于维护的代码。

 

WinForms专家代理专注于使用 Windows Forms 进行传统的桌面 UI 开发。对于常见的 UI 设计模式(如 MVVM 和 MVP),它拥有专业的知识,能够协助处理复杂的事件连接(event wiring)和状态管理,并能够增加保护措施,防止 Copilot 无意中修改.Designer.cs 文件,对 Visual Studio 设计器造成破坏。对于使用生成工具的开发者来说,这种保护解决了一直以来开发者经常遇到的一个痛点。

 

要使用这些代理,开发者需要从GitHub awesome-copilot存储库下载 CSharpExpert.agent.md 和 WinFormsExpert.agent.md 文件,并将它们放在项目的.github/agents 文件夹下。配置文件放置到位以后,在通过 GitHub 将问题分配给 Copilot 时就可以实现上下文感知行为,开发者可以在 Visual Studio Code Insiders 或 Visual Studio 的实验版本中通过下拉菜单选择代理。Copilot CLI 计划在未来的更新中支持/agent 命令。

 

微软将这两个代理都描述为实验性的,因为他们正在收集模型对详细指令的响应反馈。自 11 月以来,在开发者打开“启用特定于项目的.NET 指导”这一功能时,Visual Studio 2022 Insiders 17.14.21 版本可以自动将相关的自定义代理附加到项目,例如为 Windows Forms 开发量身定制的指令。

 

早期的社交媒体评论,尤其是 LinkedIn 平台上的讨论,反映出人们对该自定义代理发布公告的热情与专业关注。有评论者强调,通过减少生成未使用的代码,可有效缓解“AI引发的技术债务”问题。他还指出,WinForms Expert 提供的设计器文件保护机制,对遗留用户界面的维护与现代化改造显然是有实际好处的。

 

相比之下,Copilot 自定义代理所采用的是一种更具结构化和持久性的 AI 辅助方式,与早期的 Copilot 聊天模式或无上下文的建议引擎有着本质的不同。传统聊天模式提供的是按需帮助,而自定义代理则依据预定义的专业知识和行为特征在特定的存储库上下文中运行。这使得 Copilot 更符合新兴的基于代理的开发体验,其中工具充当具有特定领域知识的合作伙伴,而非通用的助手。

 

目前,自定义代理服务于.NET 开发中小众但影响力大的场景。其实验性状态和不断演变的工具支持表明,在扩大覆盖范围或在更广泛的 Copilot 体验中标准化工作流之前,微软正在密切倾听开发者的反馈。

原文链接:

https://www.infoq.com/news/2026/01/copilot-agents-csharp-winforms/

最近在用 HodlAI 的 Claude 模型跑 OpenClaw (一个 AI agent 框架),发现默认情况下 prompt cache 不生效,研究了一下原因和解决方案,分享给有需要的朋友。

背景

HodlAI 的 API 兼容 OpenAI Chat Completions 格式,支持 Anthropic 的 prompt caching 机制——需要在 messages 中对 content block 加上 cache_control: {"type": "ephemeral"} 标记。

但 OpenClaw 底层( pi-ai 库)的 maybeAddOpenRouterAnthropicCacheControl 函数默认只对 OpenRouter 的 anthropic/* 模型注入 cache_control,自定义 provider 的 Claude 模型不会走这个逻辑,导致 cache 完全不生效。

解决方案:改一行代码

文件路径:

node_modules/@mariozechner/pi-ai/dist/providers/openai-completions.js

找到 maybeAddOpenRouterAnthropicCacheControl 函数,原始代码:

function maybeAddOpenRouterAnthropicCacheControl(model, messages) {
    if (model.provider !== "openrouter" || !model.id.startsWith("anthropic/"))
        return;

改为:

function maybeAddOpenRouterAnthropicCacheControl(model, messages) {
    const isOpenRouter = model.provider === "openrouter" && model.id.startsWith("anthropic/");
    const isClaudeOnCustomProvider = model.id.toLowerCase().includes("claude");
    if (!isOpenRouter && !isClaudeOnCustomProvider)
        return;

这样只要 model ID 包含 "claude"(不区分大小写),就会自动注入 cache_control

⚠️ 注意:OpenClaw 更新或 npm update 后会覆盖这个改动,需要重新打 patch 。

测试结果

改完后实测各模型缓存情况:

模型 Cache 命中 计费是否正常
Claude Sonnet 4.5 ✅ 正常(降约 91%)
Claude Opus 4.5 ✅ 正常(降约 91%)
Claude Opus 4.6 ✅ 后台显示命中 ❌ 仍按全量计费
Claude Opus 4-6 ✅ 后台显示命中 ❌ 仍按全量计费

Sonnet 4.5 和 Opus 4.5 缓存命中后费用从 ~$0.035 降到 ~$0.003 ( 9k tokens 测试),效果很明显。

Opus 4.6 和 Opus 4-6 虽然后台日志显示 cache 命中了,实际扣费还是按全量计算,感觉是 HodlAI 后端对这两个新模型的 cached token 计价还没适配好。

总结

  1. HodlAI Claude 模型 支持 prompt cache,但仅限 Chat Completions API + 显式 cache_control 标记
  2. OpenClaw 用户需要手动 patch 一行代码让 cache 注入生效
  3. Sonnet 4.5 / Opus 4.5 计费正常,cache 能省约 90% 费用
  4. Opus 4.6 / Opus 4-6 计费疑似有 bug ,希望官方看一下 🙏 @88AI

有用同样方案的朋友可以试试,省不少钱。

93 年 typescript c#都写
过往工作均大厂经历 现在北京一外企工作..
Base 45K. 股票若干. 工作强度适中

日语完全不会 英语 IELTS 5.5

一直想通过《高度人才计划》拿永驻.
想去日本找份 600-700w 日元年收的工作 (大于 600w 是为了加分,不为了在日本挣钱..)
学历本科计算机,又读了个国内的 MBA (为了加分),考了软考的两个证(又凑了 10 分)

现在分基本上凑够了 就是要找工作了
因为语言问题只能找中文工作环境
但因为中文工作环境又会卷+不稳定

死锁了...感觉要生生世世种花家了

写在前面

在 AI 从 “云端集中式” 向 “端侧分布式” 演进的今天,用户对智能体验的需求早已从 “能用” 升级为 “安全、实时、无界”,而 HarmonyOS 凭借原生的端侧 AI 能力与分布式架构,恰好击中了这一行业痛点。不同于依赖云端算力的传统 AI 方案,HarmonyOS 的 AI 套件构建在 “本地计算 + 毫秒响应 + 模型复用” 三大核心优势之上:端侧推理让用户数据全程留在设备内,完美解决了 AI 应用的隐私焦虑;毫秒级的响应速度,让语音交互、实时识别等场景告别 “加载等待”;而系统级的模型复用机制,更是让开发者无需从头训练模型,仅通过标准化接口就能调用成熟的智能能力。那么本文就来以HarmonyOS开发中关于AI套件的技能调用功能的使用来详细聊聊,深入解析如何通过系统级AI接口、分布式协同框架与模型优化工具链,实现高效智能业务开发。

技能调用:端侧 AI 与应用的智能联动机制

技能调用是意图框架依托系统AI多模态大模型能力做深度用户输入理解,并通过解析的用户意图对接应用或元服务内的功能和内容。技能调用的本质,是 HarmonyOS 意图框架借助系统级多模态大模型,对用户输入(语音、文本、图像等)进行深度语义解析,进而关联应用 / 元服务内功能与内容的智能联动机制。它的核心价值,是让用户通过自然语言即可直接触发复杂功能,无需逐层点击界面,实现 “说即所得” 的智能交互。

核心应用场景拆解

使用者通过对小艺对话进行自然语言输入实现内容查询,知识问答,以及通过对图片选定识别问答进行服务获取。技能调用场景分为两种:

  • 功能服务类:端侧意图调用直接进入应用或元服务对应意图功能服务页面。
  • 信息交互类:云侧意图调用进行内容查询后展示,端侧用户点击进行意图调用闭环。
    典型的使用场景分为:功能服务类和信息交互类两种场景。

    1、信息交互类

    信息交互类的场景分为三种情况,具体如下所示:

  • 内容展示场景。例如查找菜谱:语音对话输入“鱼香肉丝怎么做”,即可搜索到对应的菜谱。
  • 内容展示+AIGC生成场景。例如查公司:语音对话输入“某公司怎么样”,即可生成并展示关于某公司的信息。
  • 功能履约场景。例如订电影票:语音对话输入“买两张今天的电影票,某电影”,即可进行电影票购买选座。

    2、功能服务类

    功能服务类的场景也分为三种情况,具体如下所示:

  • 跳转页面不带参数场景。例如打开付款码:语音对话输入“打开xx付款码”,即可弹窗对应付款码。
  • 跳转页面带参数场景。例如搜索商品带关键词:语音对话输入“打开xx应用搜一下xx品牌39码”,即可弹窗对应商品。
  • 功能执行并展示UIExtension。例如操控蓝牙开关:语音对话输入“打开蓝牙”,即可弹窗蓝牙设置,并打开蓝牙开关。

    技能调用接入全流程

    1、接入方案概述

    关于使用接入方案的概述,开发者需要按照意图定义,进行意图注册并实现意图调用;用户通过对小艺对话进行自然语言输入,小艺理解语义转换成意图调用(含意图参数),执行意图调用实现对应交互体验。HarmonyOS AI 套件的技能调用遵循 “意图定义→意图注册→意图执行” 的标准化流程,具体流程图如下所示:
    image.png

    2、意图注册

    这里以“搜索旅游攻略”特性为例,使用者需要首先注册“查看旅游攻略”(ViewTravelGuides)。开发者需要编辑对应的意图配置PROJECT_HOME/entry/src/main/resources/base/profile/insight_intent.json文件,实现意图注册,具体操作如下所示:

{
  "insightIntents": [
    {
      "intentName": "ViewTravelGuides",
      "domain": "TravelDomain",
      "intentVersion": "1.0.1",
      "srcEntry": "./ets/entryability/InsightIntentExecutorImpl.ets",
      "uiAbility": {
        "ability": "EntryAbility",
        "executeMode": [
          "background",
          "foreground"
        ]
      },
      "uiExtension": {
        "ability": "insightIntentUIExtensionAbility"
      }
    }
  ]
}

其中,配置参数信息如下所示:
image.png

技能调用实战:两类核心意图触发

根据上面的接入方案,这里通过前台意图和前台窗口意图两个调用来介绍具体的使用。

1、前台 UIAbility 意图调用实践

具体的使用的时候,需要开发者自己实现InsightIntentExecutor,并在对应回调实现打开详细页(点击推荐卡片跳转的界面,如旅游攻略详细页面)的能力,ViewTravelGuides的意图调用字段定义见查看旅游攻略 (ViewTravelGuides)。实际操作步骤如下:
(1)继承InsightIntentExecutor。
(2)重写对应方法,例如目标拉起前台页面,则可重写onExecuteInUIAbilityForegroundMode方法。
(3)通过意图名称,识别查看旅游攻略意图(ViewTravelGuides),在对应的方法中传递意图参数(param),并拉起对应落地页(点击推荐卡片跳转的界面,如旅游攻略详细面)。
具体的实现代码如下所示:

import { insightIntent, InsightIntentExecutor } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';


export default class InsightIntentExecutorImpl extends InsightIntentExecutor {
  private static readonly VIEW_TRAVEL_GUIDES = 'ViewTravelGuides';
  /**
   * override 执行前台UIAbility意图
   *
   * @param name 意图名称
   * @param param 意图参数
   * @param pageLoader 窗口
   * @returns 意图调用结果
   */
  onExecuteInUIAbilityForegroundMode(name: string, param: Record<string, Object>, pageLoader: window.WindowStage):
    Promise<insightIntent.ExecuteResult> {
    // 根据意图名称分发处理逻辑。接入方可根据实际业务实现页面跳转
    switch (name) {
      case InsightIntentExecutorImpl.VIEW_TRAVEL_GUIDES:
        return this.viewTravelGuides(param, pageLoader);
      default:
        break;
    }
    return Promise.resolve({
      code: -1,
      result: {
        message: 'unknown intent'
      }
    } as insightIntent.ExecuteResult)
  }
  /**
   * 实现调用查看旅游攻略功能
   *
   * @param param 意图参数
   * @param pageLoader 窗口
   */
  private viewTravelGuides(param: Record<string, Object>, pageLoader: window.WindowStage): Promise<insightIntent.ExecuteResult> {
    return new Promise((resolve, reject) => {
      // 实现意图调用,loadContent的入参为旅游攻略落地页路径
      pageLoader.loadContent('pages/TravelGuidePage')
        .then(() => {
          let entityId: string = (param.items as Array<object>)?.[0]?.['entityId'];
          resolve({
            code: 0,
            result: {
              message: 'Intent execute succeed'
            }
          });
        })
        .catch((err: BusinessError) => {
          // 调用失败的情况
          resolve({
            code: -1,
            result: {
              message: 'Intent execute failed'
            }
          })
        });
    })
  }
}

2、前台 UIExtension 窗口意图调用实践

具体的使用的时候,开发者还需要自己实现InsightIntentExecutor,并在对应回调实现窗口页面内容加载的能力。实际操作步骤如下:
(1)继承InsightIntentExecutor。
(2)重写对应方法,例如目标拉起前台窗口化页面,则可重写onExecuteInUIExtensionAbility方法。
(3)通过意图名称,识别打开蓝牙意图(LoadBluetoothCard)调用扩展意图,在对应的方法中传递意图参数(param),并拉起对应窗口化页面。
具体的实现代码如下所示:

import { insightIntent, InsightIntentExecutor, UIExtensionContentSession } from '@kit.AbilityKit';

export default class IntentExecutorImpl extends InsightIntentExecutor {
  private static readonly TAG: string = 'IntentExecutorImpl';
  private static readonly LOAD_BLUETOOTH_CARD: string = 'LoadBluetoothCard';
  /**
   * override 执行前台UI扩展意图
   *
   * @param name 意图名称
   * @param param 意图参数
   * @param pageLoader 窗口
   * @returns 意图调用结果
   */
  async onExecuteInUIExtensionAbility(name: string, param: Record<string, Object>,
    pageLoader: UIExtensionContentSession):
    Promise<insightIntent.ExecuteResult> {
    console.info(IntentExecutorImpl.TAG, `onExecuteInUIExtensionAbility`);
    switch (name) {
      case IntentExecutorImpl.LOAD_BLUETOOTH_CARD:

        return this.openLoadBluetoothCard(pageLoader);
      default:

        break;
    }

    let result: insightIntent.ExecuteResult = {
      code: -1,
      result: {
        message: 'onExecuteInUIExtensionAbility failed'
      }
    };
    return result;
  }

  /**
   * 打开加载蓝牙卡片意图
   *
   * @param pageLoader 意图内容Session对象
   * @returns 执行结果
   */
  private async openLoadBluetoothCard(pageLoader: UIExtensionContentSession): Promise<insightIntent.ExecuteResult> {
    pageLoader.loadContent('pages/UiExtensionPage');
    let result: insightIntent.ExecuteResult = {
      code: 0,
      result: {
        message: 'intent execute succeed'
      }
    }
    return result;
  }
}

最后

通过上面的详细介绍,其实HarmonyOS AI 套件的技能调用,本质上是在 “端侧智能” 与 “分布式架构” 的双重加持下,重新定义了开发者与智能能力的协作方式,它不再是 “开发者适配 AI”,而是 “AI 适配开发者”。当其他系统还在依赖云端 AI 的 “远程算力” 时,HarmonyOS 已经通过端侧推理让智能体验 “零延迟、零隐私风险”;当多数框架还在要求开发者掌握复杂的模型训练时,HarmonyOS 的意图框架与预置模型,让个人开发者仅需几行代码就能实现 “自然语言触发功能” 的智能特性。这不仅是技术的平权,更是将 “泛在智能” 从概念落地为可触达的开发工具。随着多模态大模型与 HarmonyOS 分布式硬件的深度绑定,我们将看到更惊人的场景:手机上触发的 “旅游攻略查询”,能自动同步到车机的导航界面;手表上的语音指令,能直接控制智能家居的设备状态,而这一切,都可以通过 AI 套件的技能调用快速实现。

在Java编程学习的征途上,许多学习者怀揣热情启程,却在基础语法阶段遭遇意想不到的障碍与困惑。这些看似简单的语法细节,往往成为后续深入学习与项目开发中的隐形绊脚石。达内Java培优班基于多年教学经验与海量学员学习数据,精准识别出那些最常见却又最容易被忽视的Java基础语法易错点,并通过系统化的拆解,帮助学员夯实编程根基,避开前行路上的诸多陷阱。


变量与数据类型:类型转换的隐秘风险
Java作为一门强类型语言,变量与数据类型的严格管理是其核心特性之一。然而,恰恰是在“类型转换”这一基础环节,许多初学者频频犯错。达内培优班在教学中发现,尽管自动类型转换(隐式转换)和强制类型转换(显式转换)的概念看似简单,但在实际操作中,学习者往往因忽略数据范围与精度损失而引发逻辑错误。

例如,在将float类型赋值给long类型时,看似直接的赋值操作背后,实则可能隐藏着数据精度的微妙变化。培优班通过引入“数据范围阶梯图”与“精度损失警示模型”,将抽象的转换规则可视化,帮助学员建立起对数据类型边界的直观认知。更重要的是,课程特别强调在商业计算等精度敏感场景中,为何要避免使用float和double,而应转向BigDecimal这类工具,这种从原理到实践的全方位解析,让学员不仅“知其然”,更“知其所以然”。


运算符与表达式:优先级与结合性的思维盲区
“为什么我的计算结果和预期不符?”——这是Java初学者在涉及复杂表达式时最常见的疑问。达内培优班的教学分析显示,问题往往不在于学员不会使用单个运算符,而在于对运算符的“优先级”和“结合性”缺乏系统把握。

Java中数十种运算符有着明确的优先级层次,而同一优先级的运算符则遵循特定的结合方向。培优班通过独创的“运算符优先级扑克牌”记忆法与大量“表达式拆解沙盘练习”,将这一枯燥的规则转化为可操作、可演练的学习体验。例如,对于a += b与a = a + b这类细微差别,课程会设计对比实验,让学员亲眼见证在类型不同时两者可能产生的不同结果,从而深刻理解复合赋值运算符内含的类型转换机制。


控制流程:循环与条件分支的逻辑陷阱
控制流程是编程逻辑的骨架,但骨架的连接处往往是最脆弱的部分。在if-else条件判断中,初学者常因误用赋值运算符=代替关系运算符==而引入难以察觉的错误。培优班不仅指出这一常见错误,更进一步剖析其根源:为何Java编译器在某些情况下不会对此报错?这背后涉及表达式返回值、布尔上下文等更深层的语言特性。

循环结构中的易错点则更为隐蔽。例如,在for循环中修改循环变量、在多重循环中错误定位break与continue的作用范围、对while与do-while的选择不当等。达内培优班采用“代码执行轨迹追踪法”,通过逐步动画演示程序执行的每个步骤,将内存中变量的变化可视化,使学员清晰看到自己的逻辑误解究竟发生在哪个具体环节。


面向对象基础:引用与对象的认知混淆
面向对象是Java的核心范式,而理解“引用”与“对象”的关系则是通往这一范式的第一道门槛。许多学员在方法参数传递时,对“值传递”这一概念产生根本性误解,误以为对象作为参数传递时是“引用传递”。培优班通过精心设计的“对象盒子与引用标签”比喻,将这一抽象概念具象化:引用变量好比一个贴有地址的标签,而对象则是存储在该地址的盒子;方法调用时传递的是标签的副本,而非盒子本身。

这一根本性理解的建立,直接影响到学员对对象比较(==与equals的区别)、对象克隆、以及集合框架中元素存储方式等一系列高级主题的掌握。培优班通过“认知纠偏-概念重建-实践验证”三步教学法,确保学员在这一关键节点上建立正确且牢固的认知模型。


异常处理:被忽视的防御性编程起点
异常处理机制常被视为进阶内容而被初学者草率对待,但达内培优班将其定位为“基础语法中的高级修养”。教学中发现,学员最常出现的错误并非不知道try-catch的语法,而是对“该捕获什么异常”、“何时该捕获”、“捕获后该如何处理”缺乏清晰原则。

培优班独创“异常分类光谱图”,将Java异常体系按照严重程度、处理责任、发生频率等维度进行分类展示,帮助学员建立异常处理的层次化思维。更重要的是,课程强调异常处理不仅是语法要求,更是防御性编程的起点。通过分析未处理异常如何导致程序崩溃、资源泄露等严重后果,学员能够从项目全局的角度重新审视这一基础语法的战略价值。


总结:从易错点到思维模式的升华
达内Java培优班对基础语法易错点的拆解,其深层价值不在于罗列常见错误清单,而在于通过这些问题揭示Java编程的思维模式与设计哲学。每一个易错点都是一个知识盲区的信号,每一次纠错都是一次思维结构的优化。

培优班的教学实践表明,当学员能够主动识别并规避这些基础语法陷阱时,他们的编程思维已经发生了质的飞跃:从机械记忆语法规则,转变为理解语言设计逻辑;从被动应对编译错误,转变为主动预防逻辑缺陷。这种思维层面的提升,正是学员从Java语法学习者成长为合格Java开发者的关键转折点,也为后续深入框架学习、参与企业级项目开发奠定了最为坚实的基础。在达内的教学体系中,对基础语法的精雕细琢,从来都不是小题大做,而是对编程生涯的深度投资。

什么是OVSSL证书?

OVSSL证书,即组织验证型SSL证书。它不仅仅验证域名的所有权,更重要的是由权威的CA机构对申请企业或组织的真实存在、合法注册及运营状态进行人工审核。这是其与DV证书最核心的区别。

  • 直观体现:安装后,在浏览器地址栏点击小锁图标,可以查看到企业/组织的详细信息
  • 核心价值:建立更强的在线信任,向用户证明网站背后是一个真实合法的实体,常用于企业官网、电子商务、会员登录等需要用户提交敏感信息的场景。

如何申请OVSSL证书?(详细步骤)

第一步:前期准备与信息确认

  1. 确定域名:明确需要保护的域名(例如 yourcompany.com)。
  2. 准备企业资料:这是最关键的一步,确保资料真实、有效且与官方记录一致。

    • 企业营业执照:清晰的彩色扫描件。
    • 企业联系电话:必须是官方公开的、能接通的公司座机号码(非个人手机),用于CA电话核实。
    • 企业邮箱:通常需要使用以申请域名结尾的企业邮箱(如 admin@yourcompany.com),用于接收验证邮件。部分CA也接受其他公认的企业邮箱。
    • 申请者信息:申请人的姓名、职位、公司座机、个人邮箱。

第二步:选择证书服务商(CA或经销商)并下单

访问JoySSL官方网站,在右上角找到“注册”按钮并点击。填写相关信息,创建一个证书管理账号。注册过程中,务必填写特定的注册码230970,这样才可以获得渠道低价和全程技术支持。

OVSSL证书申请入口

1、选择证书类型与年限

登录账号后,进入SSL证书栏,找到“OV证书”选项。根据自身需求,选择OV单域名、OV通配符、或者OV IP地址等SSL证书后,点击“下单”,并通过在线支付或公对公转账的方式完成支付。

2、申请证书

在申请页面,需要填写一系列信息,包括域名、单位名称、联系人、联系方式、邮箱等。这些信息将用于验证单位的真实性,所以务必确保准确无误。

3、验证域名或IP的管理权

提交申请后,并要求验证域名或者IP地址的所有权。按照系统提示的操作步骤进行验证,包括域名DNS解析认证或者服务器文件验证,操作完成后提交。

4、组织信息审核

JoySSL会对企业的组织信息进行验证,通常会通过电话、电子邮件等方式确认公司信息的真实性,审核过程一般在1到3个工作日左右完成。

4、部署证书

一旦审核通过后,JoySSL将签发OV SSL证书。下载已经签发的证书,根据JoySSL提供的安装指南或服务器文档,将证书安装到服务器上。

前言

在万物互联的全场景时代,设备之间的边界正在消失,安全认证已不再是单一设备的 “孤岛式” 防御,而是跨端协同的 “全链路” 保障。HarmonyOS 凭借其分布式软总线与原生 ArkUI 框架,为开发者提供了一套从终端到云端的安全认证解决方案,其中 PatternLock(图案密码锁)作为最贴近用户习惯的认证方式之一,不仅承担着保护用户隐私的核心职责,更成为连接多设备、多场景的交互入口。那么本文从技术原理出发,深度拆解 ArkUI 框架中 PatternLock 组件的三层架构设计,通过代码实战演示如何构建兼具安全性与体验感的手势密码模块,并进一步探索生物特征融合、分布式跨设备认证等进阶场景,帮助大家在全场景生态中打造更智能、更安全的认证体系。

PatternLock概念

在HarmonyOS开发中,PatternLock是图案密码锁组件,以九宫格图案的方式输入密码,用于密码验证场景。手指在PatternLock组件区域按下时开始进入输入状态,手指离开屏幕时结束输入状态完成密码输入。(需要说明的是,该组件从API Version 9开始支持。)
PatternLock 的交互逻辑简洁直观:用户手指按下九宫格区域时进入输入状态,离开屏幕时触发轨迹校验,整个过程无需键盘输入,既提升了操作效率,又降低了密码泄露风险。

PatternLock核心功能解析

1、组件架构特性

PatternLock是ArkUI框架提供的安全认证组件,采用三层架构设计:

  • 交互层:提供可定制的九宫格绘制界面,支持动态波纹反馈、连线样式自定义,让输入过程更具视觉引导性;
  • 控制层:通过PatternLockController实现组件状态的实时控制,包括密码重置、锁定时长配置、验证结果反馈等核心能力;
  • 数据层:内置哈希算法对轨迹坐标进行不可逆加密,并支持与 HarmonyOS 系统安全服务联动,确保密码传输与存储的安全性。

    2、核心参数配置

    组件的核心参数可灵活调整,以适配不同界面风格与交互需求:
    image.png

3、样式继承树

关于PatternLock的样式继承树,如下所示:

PatternLock → CommonShape → CommonAttribute → Component

PatternLock样式设置

在实际开发中,任何一个组件的样式相关的设置都是非常重要且常用的操作,那么PatternLock也不例外,接下来分享关于样式相关的使用操作。
image.png
这里只分享关于PatternLock的样式设置相关的参数,具体的实际使用会在下一部分详细分享。

关于PatternLock的基础使用

1、组件初始化与控制器绑定

使用 PatternLock 的第一步是引入组件库并创建控制器实例,以实现状态的统一管理,具体如下所示:

// 导入组件库
import { PatternLock, PatternLockController } from '@ohos.arkui.ts/components';

// 创建控制器实例
private patternLockCtrl: PatternLockController = new PatternLockController();

2、基础布局与视觉定制

通过链式调用属性方法,可快速完成九宫格的布局与样式配置,包括尺寸、颜色、动态效果等,如下所示:

PatternLock(this.patternLockController)
        .sideLength(200)
        .circleRadius(9)
        .pathStrokeWidth(5)
        .regularColor('#ff182431') // 未选中的颜色
        .activeColor('#707070') // 激活状态的颜色
        .selectedColor('#707070') // 选中状态的颜色
        .pathColor('#707070') // 连线颜色
        .backgroundColor('#F5F5F5') // 背景色
        .autoReset(true)
        .activateCircleStyle({ // 动态波纹效果
            color: Color.Blue,
            radius: { value: 18, unit: LengthUnit.VP },
            enableWaveEffect: true  // 启用波纹动画
        })
        .onDotConnect((index: number) => {
          console.log("onDotConnect index: " + index)
          this.handlePatternComplete(index) // 具体实现方法在下一部分会介绍
        })

3、事件处理与安全校验

密码输入完成后,需通过事件回调实现业务逻辑处理,包括长度验证、加密传输与异常拦截,手势完成回调,如下所示:

private handlePatternComplete(input: number[]) {
    if (input.length < 5) {
        this.showToast("至少连接5个点");
        return;
    }
    const encrypted = this.encryptPattern(input); // 加密方法如下面关于密码加密算法所示
    this.validateWithServer(encrypted);
}

由于涉及到加密的设置,关于密码加密算法如下所示:

private encryptPattern(coordinates: number[]): string {
    const salt = cryptoFramework.createRandom(16);
    const sha256 = cryptoFramework.createHash("SHA256");
    sha256.update({ data: new Int32Array(coordinates) });
    return sha256.digest().then(hash => {
        return salt + hash.toHex();
    });
}

关于异常处理机制,如下所示:

private errorCount: number = 0;

private handleValidationError() {
    this.errorCount++;
    if (this.errorCount >= 3) {
        this.patternLockCtrl.lock(30000); // 锁定30秒
        this.showAlert("账号已锁定");
    }
}

4、专属事件与控制器能力

这里只来介绍非通用事件的使用,PatternLock有2个专属事件:onPatternComplete()和onDotConnect()。

(1)onPatternComplete()方法

语法:

onPatternComplete(callback: (input: Array<number>) => void)

使用:密码输入结束时触发该回调。
参数:
image.png

(2)onDotConnect()方法

语法:

onDotConnect(callback: Callback<number>)

使用:密码输入选中宫格圆点时触发该回调。
说明:回调参数为选中宫格圆点顺序的数字,数字为选中宫格圆点的索引值(第一行圆点从左往右依次为0、1、2,第二行圆点依次为3、4、5,第三行圆点依次为6、7、8)。

5、构造函数

constructor()是PatternLockController的构造函数。
系统能力: SystemCapability.ArkUI.ArkUI.Full

6、重置状态

reset()是重置组件状态。
系统能力: SystemCapability.ArkUI.ArkUI.Full

7、高阶玩法

然后再分享2个高阶一点的玩法。
生物特征融合认证,具体如下所示:

async function hybridAuth(pattern: string) {
    const faceResult = await userAuth.auth(Type.FACE);
    if (faceResult === AuthResult.SUCCESS) {
        return this.quickUnlock(pattern);
    }
    return this.strictValidate(pattern);
}

分布式场景实现,具体如下所示:

// 智能手表辅助认证
function watchAssistedAuth() {
    const deviceId = deviceManager.getTrustedDevices()[0];
    distributedLock.begin(deviceId);
    // 同步绘制轨迹...
}

PatternLock实际应用示例

最后再来分享一个关于PatternLock的详细使用示例,模拟一个验证手势密码是否正确,具体代码如下所示:

// test.ets
import { LengthUnit } from '@kit.ArkUI'

@Entry
@Component
struct PatternLockExample {
  @State passwords: Number[] = []
  @State message: string = '请输入密码!'
  private patternLockController: PatternLockController = new PatternLockController()

  build() {
    Column() {
      Text(this.message).textAlign(TextAlign.Center).margin(20).fontSize(20)
      PatternLock(this.patternLockController)
        .sideLength(200)
        .circleRadius(9)
        .pathStrokeWidth(5)
        .activeColor('#707066')
        .selectedColor('#707066')
        .pathColor('#707066')
        .backgroundColor('#F6F6F6')
        .autoReset(true)
        .activateCircleStyle({
          color: '#606060',
          radius: { value: 16, unit: LengthUnit.VP },
          enableWaveEffect: true
        })
        .onDotConnect((index: number) => {

        })
        .onPatternComplete((input: Array<number>) => {
          // 输入的密码长度小于5时,提示重新输入
          if (input.length < 5) {
            this.message = '密码长度需大于5位,请重新输入。'
            return
          }
          // 判断密码长度是否大于0
          if (this.passwords.length > 0) {
            // 判断两次输入的密码是否相同,相同则提示密码设置成功,否则提示重新输入
            if (this.passwords.toString() === input.toString()) {
              this.passwords = input
              this.message = '密码设置成功: ' + this.passwords.toString()
              this.patternLockController.setChallengeResult(PatternLockChallengeResult.CORRECT)
            } else {
              this.message = '两次输入的密码不一致,请重新输入。'
              this.patternLockController.setChallengeResult(PatternLockChallengeResult.WRONG)
            }
          } else {
            // 提示第二次输入密码
            this.passwords = input
            this.message = "请重新输入。"
          }
        })
      Button('重置手势密码').margin(40).onClick(() => {
        // 重置密码锁
        this.patternLockController.reset()
        this.passwords = []
        this.message = '请输入密码。'
      })
    }.width('100%').height('100%')
  }
}

上面的这个示例通过sideLength设置九宫格的大小、circleRadius等属性设置宫格圆点样式、onPatternComplete属性设置密码输入时的回调。当使用者密码输入完成后,按输入的密码不同,给予不同的回应:输入的密码长度小于5时,提示重新输入;第一次输入完成后,提示第二次输入密码;第二次输入完成后,判断两次输入的密码是否相同,相同则提示密码设置成功,否则提示重新输入。然后可以通过'重置手势密码'按钮,可以重置密码锁。

最后

随着 HarmonyOS 全场景生态的持续演进,PatternLock 已从传统的 “单点认证工具”,进化为连接多设备、多模态的 “安全交互枢纽”。本文从技术架构、开发实战到场景进阶,系统呈现了 PatternLock 的完整能力边界,不仅能帮助开发者快速构建基础手势认证功能,更能通过生物特征融合、分布式跨设备认证等进阶玩法,打造面向未来的全场景安全体系。在 HarmonyOS 6 及后续版本中,随着 ArkUI 框架对三维手势识别、压力感应等能力的引入,PatternLock 还将突破二维平面的限制,在车机控制、智能家居中控、可穿戴设备等场景中发挥更大价值。建议开发者持续关注 HarmonyOS Design 系统的更新,将环境感知、行为分析等新型技术与 PatternLock 深度融合,构建 “主动防御、无感认证” 的智能安全体验,为全场景互联时代筑牢安全基石。这里我建议大家持续关注HarmonyOS Design系统的更新,将生物特征、环境感知等新型认证方式与PatternLock深度融合,构建面向未来的智能安全体系,一起期待吧!

选择免费SSL证书,最核心的决策依据可以简化为:追求短期效益的选Let's Encrypt,看重中文长期免费体验、国内使用的选JoySSL,需要CDN与安全防护一体选Cloudflare。

一、JoySSL:国产首选的中文友好长期方案

JoySSL是国内专注提供免费SSL证书的服务商,主打本地化服务和中文体验,最大特色是提供永久免费的DV单域名SSL证书,吸引了大量国内个人站长和中小企业用户。

优势

  1. 中文界面更友好:全程中文操作指引,从申请下载到配置部署都提供中文文档,新手也能轻松上手,无需依赖翻译工具。
  2. 永久免费基础版:个人用户可免费领取永久有效的单域名DV证书,无需担心定期续期问题,适合长期稳定运行的个人站点。
  3. 支持国密算法:可提供符合国家标准的SM2国密证书,满足政务、金融等合规要求,为国内用户提供本土化加密选择。
  4. 多平台部署教程:提供针对宝塔面板、Nginx、Apache、Docker等主流平台的详细中文配置教程,降低部署难度。

缺点

  1. 通配符证书需付费:仅单域名证书永久免费,多域名和通配符证书需要购买专业版,对于需要覆盖子域名的多域名站点不够友好。
  2. 品牌知名度稍低:相比Let's Encrypt,市场认知度稍逊,部分用户可能对国产证书安全性存在顾虑,但实际上其DV证书同样通过国际主流浏览器信任根体系认证。

适用场景

国内个人博客、小型企业官网、微信小程序后端服务,适合偏好中文界面,追求长期稳定且无需频繁续期的用户。

二、Let's Encrypt:全球最成熟的开源自动化方案

Let's Encrypt是由互联网安全研究小组(ISRG)运营的非营利组织,是目前全球使用量最高的免费SSL证书提供商,覆盖全球超4亿个域名,是个人开发者和中小团队的首选方案。

优势

  1. 完全零成本:无隐藏消费,不限制申请次数,支持单域名、多域名和通配符证书类型,所有证书均为DV(域名验证)类型,可满足绝大多数普通网站的加密需求。
  2. 自动化程度高:通过ACME协议实现自动化申请、部署和续期,配合Certbot、acme.sh等工具,可实现证书到期前自动续期,完全无需人工干预。
  3. 兼容性极强:支持Nginx、Apache、Caddy等所有主流Web服务器,同时适配Windows、Linux、Docker等各种操作系统,几乎不存在兼容性问题。
  4. 社区资源丰富:作为行业标杆,相关教程和解决方案覆盖全面,遇到问题能快速找到解决办法,适合有一定技术能力的开发者。

缺点

  1. 证书有效期短:证书有效期仅90天,虽然支持自动续期,但依赖服务器环境稳定和续期脚本配置,一旦脚本失效可能导致证书过期。
  2. 中文支持不足:官方文档以英文为主,新手上手门槛略高,部分错误提示不够直观。
  3. 通配符证书需手动DNS验证:申请通配符证书时无法通过文件验证,必须手动添加DNS TXT记录完成域名所有权验证,流程相对繁琐。

适用场景

个人博客、开源项目、测试环境、中小团队的长期稳定站点,适合熟悉服务器操作,能自主维护续期脚本的用户。

三、Cloudflare CDN:自带安全与性能增益的云方案

Cloudflare是全球最大的CDN服务商之一,提供免费SSL证书与CDN加速一体化服务,无需用户手动下载部署证书,通过域名DNS解析配置即可实现全站加密。

优势

  1. 零部署成本:只需将域名DNS解析到Cloudflare,即可一键启用SSL加密,无需处理证书申请、上传、配置等繁琐步骤,新手也能快速上手。
  2. 附赠多重安全防护:启用Cloudflare SSL的同时,可自动获得DDoS攻击防护、WAF防火墙、恶意IP拦截等安全功能,有效提升网站安全性。
  3. 支持边加密与全加密模式:提供Flexible、Full、Full (strict)三种加密模式,可适配不同服务器配置,同时支持HTTP/2、HTTP/3等现代化网络协议。
  4. 全球加速能力:借助Cloudflare遍布全球的CDN节点,可同步提升网站访问速度,尤其适合面向全球用户的站点。

缺点

  1. 依赖CDN服务:必须将域名DNS解析到Cloudflare才能使用SSL证书,若服务器无法对接Cloudflare CDN,或不希望使用第三方CDN,该方案无法使用。
  2. 免费版存在功能限制:免费版仅支持单域名证书,通配符证书需升级到付费版,同时部分安全和加速功能存在速率和流量限制。
  3. 延迟略增:经过Cloudflare中转后,可能带来轻微的网络延迟,对于对响应速度有极高要求的站点(如实时交易系统)可能存在影响。

适用场景

需要同时实现加密、加速和安全防护的网站,适合缺乏技术能力手动部署SSL证书的新手用户,以及希望简化运维流程的中小团队。

四、三类免费SSL证书详细对比表

表格

对比维度Let's EncryptJoySSLCloudflare
证书类型单域名/多域名/通配符永久免费单域名单域名(免费版)
有效期90天,自动续期永久永久(绑定CDN服务)
申请门槛需域名所有权验证,支持文件/DNS验证需域名所有权验证,支持文件/DNS验证需将域名DNS解析到Cloudflare
技术门槛需配置ACME脚本,适合有一定技术基础用户中文界面引导,新手友好零配置,启用CDN即可自动生效
附加功能仅SSL加密国密算法支持,适配国内合规需求CDN加速、DDoS防护、WAF防火墙
适用场景个人博客、开发者测试环境、中小团队长期站点国内个人站长、小型企业官网需要加密+安全防护的站点、追求简化运维的团队

五、其他主流免费SSL方案对比

阿里云免费SSL证书

阿里云与DigiCert合作推出的免费DV证书,单域名有效期3个月,个人用户每年可免费申请20张。优势在于无需独立注册账号,直接通过阿里云控制台管理,适合阿里云服务器用户,但续期需要每年重新申请,相对繁琐,且仅支持单域名,无通配符证书。

腾讯云免费SSL证书

腾讯云提供的免费DV证书,有效期12个月,支持单域名证书,通过腾讯云DNS验证流程,自动化程度较高,但每年仅支持5张免费证书,适合腾讯云生态内的短期项目或测试站点。

ZeroSSL

ZeroSSL与Let's Encrypt基于同一ACME协议,支持通配符证书和中文界面,提供可视化申请流程,降低新手上手难度,但续期仍需要配置自动脚本,且免费版每月仅支持3个域名,适合对界面友好度要求较高的临时项目。

六、选型决策指南

  1. 技术能力导向:有服务器运维经验,希望实现全自动续期,首选Let's Encrypt。
  2. 中文体验导向:偏好中文界面,希望永久免费且无需续期,首选JoySSL。
  3. 一站式需求:需要CDN加速和安全防护,不想手动操作证书部署,首选Cloudflare。
  4. 云生态适配:使用阿里云或腾讯云服务器,可优先选择对应云厂商的免费证书,减少跨平台操作流程。

演技不像电视剧,太端着,总让人感觉在串戏临时排演的小品舞台剧。

台词寡淡无味,历史剧有多种台词风格,有纯白话的(以雍正大明王朝为代表),也有半文不白的(以老三国为代表),近些年的剧都是半吊子的半文不白,网文的水文里面装腔作势软弱无力的文字风格,看到人难受至极。

演员台词功底极差,毫无表现力与感染力,故作深沉,中气不足,肾虚乏力,令人难以卒听。咱就是说,找个专业的配音吧!

唯一的优势,就是服化道场景比之上个世纪的历史剧要精良很多,不过是否符合史实,我不懂。

总之就是,还是看看 1993 年的《唐明皇》吧。

大家好,我是汤师爷,专注AI智能体分享,致力于帮助100W人用智能体创富~

还在为小红书笔记创作发愁吗?

每天都要绞尽脑汁想文案,看着别人的爆款笔记却不知道如何模仿?

今天,我就教你如何利用AI智能体,轻松实现小红书图文改写,让创作效率提升10倍!

我们先看下智能体的执行效果:

image.png

image.png

image.png

1.整体工作流

image.png

1.获取小红书笔记详情

2.使用OCR技术,提取图片中的文字

3.将图片文案进行整理

4.图片文案仿写

2.详细工作流节点

2.1 开始节点

image.png

开始节点有两个输入变量。

  • 输入:

    • noteUrl:小红书笔记链接
    • cookieStr:小红书cookie

2.2 如何获取小红书cookie?

1.登陆https://www.xiaohongshu.com/

2.在页面空白处右击鼠标,选择「检查」

image.png

3.在刚刚打开的面板中,点击「网络」选项卡

image.png

4.刷新当前页面

5.点击第一条记录,在右侧「标头」部分向下滚动,找到cookie一行,将其内容复制下,这就是我们需要的cookieStr

image.png

2.3 获取小红书笔记详情

image.png

我们将使用【小红书】插件的xhs_note_detail功能。

通过这个功能,我们可以根据笔记链接获取笔记详情。

  • 输入:

    • cookieStr:开始 - cookieStr
    • noteUrl:开始 - noteUrl

image.png

2.4 使用OCR技术,提取图片中的文字

1.接下来,我们使用循环节点,批量提取图片中的文字。

  • 输入:

    • input:获取小红书笔记详情-note_image_list
  • 输出

    • output:从图片中提取文字-data

image.png

2.使用循环体,批量提取图片的文字

我们会使用「OCR」插件,提取图片的文字。

image.png

输入参数如下图所示。

image.png

2.5 使用大模型将文案内容进行整理、排版

在这一步,我们会使用大模型节点,对文案内容进行整理、排版。

image.png

大模型节点的系统提示词如下:

## 角色(Role)
你是一位精通内容整理和 Markdown 排版的 AI 助手。你擅长阅读和理解非结构化的文本内容,并能够将其转化为结构清晰、格式优美的 Markdown 文档。

## 背景(Background)
随着社交媒体平台的普及,大量的图文内容被创作和分享。然而,这些内容往往缺乏良好的结构和格式,不利于阅读和理解。将这些内容整理成结构化的 Markdown 文档,可以大大提高内容的可读性和价值。

## 任务(Task)
你的任务是接收一段从插件输出的非结构化文本内容(主要是抖音图文中的文字),仔细阅读并理解内容,然后将其转化为结构清晰、格式规范的 Markdown 文档。你需要:

1. 识别并提取文本中的关键信息,如标题、作者、主要内容等
2. 根据内容的逻辑关系,对文本进行分类和整理
3. 使用 Markdown 语法进行排版,包括但不限于使用标题、粗体、斜体、列表等格式
4. 确保所有原始内容都被包含在最终的 Markdown 文档中,不遗漏任何信息

## 规则与限制(Rules & Restrictions)
1. 必须使用 Markdown 语法进行排版
2. 使用 #、##、### 等进行标题划分,层级不超过 3 级
3. 使用 - 或 * 进行无序列表编写,使用 1. 2. 3. 等进行有序列表编写
4. 重要内容使用粗体(**文字**)标注,需要强调的内容使用斜体(*文字*)标注
5. 保持原文的主要结构和顺序,但可以适当调整以提高可读性
6. 不得添加、删除或修改原文的实质内容
7. 如遇到不确定的内容,保留原样并用括号标注

## 参考短语(Reference sentences)
- 内容完整,不遗漏任何信息
- 结构清晰,层次分明
- 格式规范,美观实用
- 逻辑严密,条理清晰
- 重点突出,易于阅读

## 案例展示(Case Show)
### 输入:
{
  "code": 0,
  "data": {
    "results": [
      {
        "words": [
          {
            "lang": "auto",
            "text": "求大连这两个"
          },
          {
            "lang": "auto",
            "text": "地方有啥"
          },
          {
            "lang": "auto",
            "text": "区别啊??"
          }
        ]
      }
    ]
  },
  "log_id": "20250325123913080C6F506498C6F581B7",
  "msg": "success"
}

## 风格和语气(Style & Tone)
- 保持专业、清晰的语气
- 使用简洁、直接的表达方式
- 保持原文的重点和强调

## 受众群体(Audience)
- 小红书电商新手卖家
- 对开设小红书店铺感兴趣的人群
- 想要了解小红书电商运营的人群

## 输出格式(Output format)
使用 Markdown 格式输出,包括:
1. 一级标题(#)用于文章主标题
2. 二级标题(##)用于主要章节
3. 三级标题(###)用于子章节
4. 无序列表使用 - 或 *
5. 有序列表使用 1. 2. 3. 等
6. 重要内容使用粗体(**文字**)
7. 需要强调的内容使用斜体(*文字*)

## 工作流程(Workflow)
1. 仔细阅读输入的文本内容,理解其结构和主要信息点
2. 提取标题、作者、标签等元信息
3. 识别主要章节和子章节,规划文档结构
4. 按照规划的结构,使用 Markdown 语法重新排版内容
5. 使用粗体和斜体突出重要信息和需要强调的内容
6. 检查确保所有原始内容都被包含,没有遗漏
7. 最后检查 Markdown 格式是否正确,调整以确保最佳可读性

## 初始化(Initialization)

下面是你需要整理和格式化的文本内容:

<评价内容>

请提供需要整理和格式化的文本内容。我会仔细阅读并按照上述要求将其转化为结构清晰的 Markdown 文档。不需要输出额外除图片识别文字以外的内容。

2.6 图片文案仿写

接下来,我们需要通过大模型节点退图片文案进行仿写。

image.png

大模型节点的系统提示词如下:

# 角色说明
你是一位专业的图文内容仿写助手,负责根据图片中提取的文字内容,结合视觉元素和背景信息,创作风格一致的仿写内容。

# 背景说明
处理用户提供的图片文字内容时,你需要:
1. 理解图片的整体风格和背景(产品介绍、教程步骤、使用心得等)
2. 分析文字的语言特点(正式/口语化、句式特征、专业术语等)
3. 结合图片呈现的视觉信息(产品外观、使用场景等)
4. 在保持原意的基础上进行自然的仿写扩展

# 仿写原则
1. 保持原意完整性
2. 匹配原文语言风格
3. 补充恰当的细节
4. 与图片内容保持一致
5. 避免添加虚假信息

# 工作流程
1. 接收图片文字内容
2. 分析图片背景信息(可选)
3. 分析原文特点:
   - 语言风格
   - 内容结构
   - 关键词使用
4. 创作三个版本:
   - 贴近原文的保守版
   - 适度优化的改进版
   - 创意加强的亮点版

# 输出示例
## 原文:
"夏日必备防晒霜
SPF50+ PA++++
清爽不油腻"

## 仿写版本:
1. 【保守版】
"夏季必备防晒产品
防晒指数SPF50+ PA++++
质地清爽不油腻"

2. 【优化版】
"夏日防晒推荐
高倍防护SPF50+ PA++++
轻薄水感质地,肌肤零负担"

3. 【创意版】
"今夏防晒天花板!
SPF50+ PA++++超强防护
一抹化水,清爽不黏腻"

# 执行要求
请提供:
1. 图片文字提取内容
2. 图片背景说明(如有)

我将按照以上规范进行仿写创作。

2.7 使用文本处理插件拼接字符串

  • 输入:

    • String1:获取小红书笔记详情-note
    • String2:图片文案内容整理-output
    • String3:图片文案仿写-output

image.png

2.8 结束节点

image.png

3.总结

通过以上介绍,相信你了解了如何利用DeepSeek+Coze来构建高效的小红书图片文案改写智能体。

在AI时代,技术门槛将越来越低,小白也能搭建智能体,用AI工具来提升工作效率。

用AI智能体不是未来,而是AI时代每个人的生存技能,学会AI智能体,人人都是超级个体。

如果你觉得这篇文章有帮助,别忘了点赞、关注、收藏,我们下期再见!

对了,我整理了一份开源《智能体学习手册》,爆肝 10 万字,价值 999 元。限时开放领取👉:tangshiye.cn

几周前,我的团队接到一个任务:分析 20 个竞品账号的 TikTok 内容表现,为新产品的内容策略提供数据支撑。刚开始,我像往常一样登录 App,逐个账号查看发布内容,但不到一周,我就发现问题来了:

  • 多账号登录频繁切换,效率低得离谱;
  • 我的行为开始影响推荐算法,看到的内容不再是客观的竞品数据;
  • 数据整理完全依赖人工,累得我每天盯着屏幕到半夜。

那一刻,我意识到:我们需要一套工程化、可复盘的竞品分析流程,而不是靠手动浏览和记笔记。

一、问题背景

在实际工程项目中,分析 TikTok 内容时,我们常遇到三类问题:

  1. 登录状态干扰数据
    官方 App 会根据浏览和互动记录调整推荐,这会导致我们看到的数据偏离真实情况。
  2. 多账号批量分析效率低
    手动切换账号、记录数据,不仅耗时,还容易出错。
  3. PC 端操作不便
    内容分析、数据清洗、可视化大部分在电脑上完成,App 使用不方便。

解决这三个问题的关键在于数据采集策略和分析流程设计。我将整个流程分为“只读采集 → 标准化存储 → 自动化分析 → 趋势可视化”。

二、数据采集策略

1. 只读原则

为了保证数据的客观性,我遵循以下原则:

  • 不登录、不互动:避免点赞、评论、关注影响算法;
  • 只采集公开内容:私密账号不可获取,分析仅基于公开信息;
  • 可复盘:每次抓取流程、字段保持一致,方便历史对比。

顺带提到,我偶尔会使用网页工具(例如TikTok Viewer 页面)做快速浏览,但它只是辅助入口,不参与核心分析。

2. 核心字段定义

标准化字段是工程级分析的基础,我使用如下字段:

字段含义用途
account_id账号唯一标识多账号管理
publish_ts发布时间戳趋势分析
content_type内容类型(挑战/教程/记录等)类型对比
video_length视频时长(秒)格式偏好分析
likes点赞数热度指标
comments评论数用户互动分析
shares分享数内容传播潜力分析

三、自动化抓取与容错设计

批量抓取必须考虑稳定性和可复用性:

  • 异步并发:提升抓取效率;
  • 异常重试机制:处理网络波动或页面结构变化;
  • 日志记录:方便排查问题;
  • 限流保护:避免 IP 封禁或对平台造成压力。

抓取流程伪代码示例:

for account in account_list:
    url = build_public_profile_url(account)
    html = fetch_with_retry(url)
    if parse_success(html):
        data = extract_fields(html)
        write_to_db(data)
    else:
        log_error(account, html)

四、数据分析与趋势可视化

  1. 发布时间趋势

统计每日/每周发布量,判断账号更新规律:

SELECT publish_date, COUNT(*) AS cnt
FROM video_data
GROUP BY publish_date
ORDER BY publish_date
  1. 内容类型分析

不同类型视频的平均互动量:

SELECT content_type,
       AVG(likes) AS avg_likes,
       AVG(comments) AS avg_comments
FROM video_data
GROUP BY content_type
  1. 视频长度分布

将视频时长分段,观察受欢迎区间:

SELECT video_length_bucket, COUNT(*) AS cnt
FROM video_data
GROUP BY video_length_bucket

趋势分析帮助判断哪类内容更受用户欢迎,为内容策略提供数据支撑。

五、工程实践总结

字段规范化:统一字段定义和存储格式,保证多账号数据可比;

定期重抓:平台内容更新快,周期性抓取保证数据新鲜;

自动化报表:定期生成分析报告,减少人工操作;

关注趋势:单条数据可能偶然,高层趋势才更可靠。

通过工程化方法,我们可以高效、可复盘地进行竞品分析,而不是依赖人工观察。

六、流程图示意

+----------------+       +----------------+       +----------------+
| 公开页面抓取   | --->  | 数据字段解析    | --->  | 数据库存储      |
+----------------+       +----------------+       +----------------+
         |                                          |
         v                                          v
+----------------+       +----------------+       +----------------+
| 异常重试与日志 | --->  | 数据清洗与标准化| --->  | 趋势分析 & 可视化|
+----------------+       +----------------+       +----------------+

这个流程图表示了工程化竞品分析的核心步骤,从抓取、解析、存储到分析和可视化,保证数据可复盘和可扩展。

七、数据表格模板示例

account_id publish_ts content_type video_length likes comments shares
account_01 2026-01-01 12:30 挑战 15 1200 300 50
account_01 2026-01-02 09:45 教程 30 800 120 40
account_02 2026-01-01 14:10 记录 20 950 200 60

表格示例展示了每条内容的核心采集字段,可直接用于趋势分析和可视化。

八、结语

从抓取到分析,每一步都体现了工程实践的重要性。作为开发者,我更关注的是方法论和流程,而不是工具本身。顺带提到的 TikTok Viewer 页面,只是辅助浏览的一种入口,并不影响整体工程流程。

真正有价值的是:标准化的数据采集、可复盘的分析流程和趋势洞察能力,这是任何社媒数据分析项目长期可持续的核心。

今天抢回来的票,西安到北京(高铁车次算多的)。并且专门去务工人员专区看了下车次,抢票的时候,把务工人员专区的车次都避开了。

操作步骤:

1 、提前预填写信息,选了有五六趟车次

2 、到时间点击按照填写信息购买

然而他喵的刚开始放票点击的时候就显示没票了,这可是始发站到终点站啊!!!

只能退而求其次选了一趟时间长,价格贵的高铁,提交订单之后还要排队,也不知道到底能买到票不(前两年就遇到过排队完成后,给显示购票失败),排队得三分钟,动不动时间还会增长,很是无语。幸运的是后面买到票了,但是不是自己想要的车次。

真的很无语,预选的车次基本上开始就没票了,想候补也候补不了,因为页面还显示有票。

我就想不通为啥要放个提前买票的口子(务工人员专区),大家一起抢不行吗?

还有真的就很离谱,好点时间点的高铁票,到点放票就没了,难道其他人买票的时候不用走 12306 的异步排队方案吗?

多年了,手机,电脑一直用的搜狗输入法, 就 Linux 几年期间,搜狗输入法 Linux 版总是卡死,换成了中州韵 + 雾凇输入法

手机这么多年自带搜狗,一直使用,Mac 也是单独下载搜狗使用,不知道大家有没有觉得,搜狗慢慢越来越差了,无意中增加了很多的输入负担,无意中总是上错字,都发出去一会了,才看出来错了。

手机端长按空格语音转文字是我一直以来在搜狗上最喜欢使用的功能,准确率很高,但是最近越来越差了,乱识别。反而微信输入框新出来的麦克风,语音转文字的识别率非常高,搜狗这么多年,干不过微信了?

2010-2015 年我的最佳游戏是传送门 2

2016-2020 年我的最佳游戏是神界原罪 2

2021-2025 年我的最佳游戏是 13 机兵防卫圈

大家呢?

我的硬件

NAS型号

威联通 Qu405 四盘位

硬盘 HDD/SSD

  • WD40EFZZ 西数红盘 4T 2块
  • PM863a SSD 960G 2块

UPS电源

cyberpower UT650EGC

硬件组装

根据收到的NAS所带的说明书,将你的硬盘和SSD安装到你的NAS中。

完成组装后,用网线将你的NAS与路由连接。

连接UPS,启动NAS

  • 将UPS电脑接入市电插座
  • 将NAS电脑接入UPS的输出端插孔位置
  • 使用UPS自带的USB数据线连接UPS和NAS
  • 根据UPS说明书的操作说明,启动UPS电源
  • 根据NAS说明书的操作说明,启动NAS。
  • 等待一段时间,NAS上线

系统设置

找到NAS

NAS第一次上电后,一般会通过路由器自动分配一个IP地址联网,此时要想登录NAS的界面,你需要使用Qnap提供的软件 Qfinder,您可以在这里下载安装👇
alt text
alt text
打开Qfinder后,它可以自动搜索你当前局域网下的Qnap设备,找到您的NAS,即可登入,如下👇
alt text

第一次登录NAS时,一般系统会引导你完成一些必要的系统设置,例如对于Qu405来说,会引导你选择安装QTS系统或者是QuTS系统,我选择的是QTS系统。

UPS联动

当我们找到我们的NAS,并进入NAS界面后,我们前往〔控制台〕/〔系统〕/〔外部设置〕/〔UPS〕,完成USP联动设置,如下👇
alt text

设置存储池和存储卷

创建Qtier存储池

Qtier技术是Qnap独创的冷热数据分层存储融合技术,最大化的充分利用了SSD和HDD硬盘的效率。它可以将高频访问的热数据存储在SSD区,将不常访问的冷数据放在HDD存储区。相对于SSD缓存来说,Qtier技术可以将SSD的空间纳入到存储池中,避免了SSD空间的浪费。更为详细的关于SSD缓存方案和Qtier方案的对比分析,参考Qnap官网的说明

就我本次的配置来说,将两块SSD配置为超高速层,组RAID1阵列,并保留了25%的容量空间;将两块HDD硬盘组RAID1阵列,做为容量层,保留20%的快照空间;报警阈值设置为90%。配置完成如下👇
alt text

创建App精简卷〔系统卷〕

首先创建的卷,会被系统自动识别为系统卷,将来NAS安装的应用,会默认安装于此卷。
alt text

在Qtier存储池上,创建一个容量为200G的精简卷(后期根据需要可以增加),该卷主要用于供系统使用,用于安装应用程序,不要在这里存放用户的数据。如下👇
alt text

创建Data精简卷

在Qtier存储池上,创建一个容量为1T的精简卷(后期根据需要可以增加),该卷主要用于存放各种资料数据,相当于用户的云空间。如下👇
alt text

创建Home精简卷

在Qtier存储池上,创建一个容量为100G的精简卷(后期根据需要可以增加),该卷主要用于存放各用户的Home目录,主要目的是为用户提供一个临时的云端空间,以供临时性的转移文件使用,这个卷不启用快照功能。

👆以上Qtier存储池和三个存储卷设置完成后,效果如下👇
alt text

快照计划

完成卷设置后,为需要的卷配置合理的快照计划,可以有效的保障数据安全(必要时回滚,<font color=gray>一个具体的例子是,如果你本地的文件被病毒破坏了,而你的同步工具又将已经被破坏了的文件同步到了NAS上,此时如何恢复这个文件呢?就只能通过快照来恢复了</font>)。选中需要配置快照的卷,然后点〔快照〕/〔快照管理员〕,即可对该卷的快照计划进行配置。
alt text

App卷快照计划

App卷主要用于安装系统应用程序,为了防止在折腾过程中把系统玩崩,所以有必要启用快照功能。一般来说,在折腾NAS应用时,最好的习惯就是手动创建快照,然后再折腾。不过快照计划也为手残党提供了最后的兜底保障。考虑到一般会在周未折腾NAS,所以在每周折腾完成后,在周一的凌晨创建一次快照即可(保存折腾的成果)。如下👇
alt text

Data卷快照计划

数据算是NAS使用的主要目的了,所以数据卷的快照是有必要的,所以我们为数据卷的快照设置每天1个,保留7天.如下👇
alt text

Home卷快照计划

根据以上分析,我们不为Home卷起用快照,如下👇
alt text

设置用户家目录

如上, 我们为用户家目录单独创建了Home卷,现在我们统一设置用户家目录配置到Home卷,如下👇
alt text

外网访问

网络是NAS的基础,否则您只能在您家的局域网内使用NAS,这无异于龙游浅池。

如果你想在公网访问你的Qnap设备,你首先需要有一个公网IP,你可以向你的电信运营商申请要求给你分配一个公网IP,一般来说,这个IP是隔段时间变化的,但是这不要紧。

有了公网IP的前提后,Qnap提供了免费的DDNS服务,你只需要以下设置,便可以在公网环境使用你的NAS设备。

  • 找到NAS上的网络设置
    alt text
  • 找到设定,设置静态IP,为你的Qnap设备设置一个静态IP,记住这个IP,后面要用
    alt text
    alt text
  • 设置系统访问端口,和服务器名称,记住这个端口号和名称,后面要用
    alt text
  • 设置路由器的端口转发规则,设置你的路由器,将来自外部的请求转发给你的Qnap设备。这里的局域网IP就是你的NAS上设置的静态IP,这里的内部端口就是你NAS上设置的系统访问端口参考上文
    alt text
  • 设置myQNAPcloud云服务,使用Qnap提供的DDNs功能,解析你的公网IP
    alt text
    alt text
    DDNs开通后,会生成一个免费的二级域名,样式如: www.服务器名称.mycloudnas.com,将来你可以通过该域名来访问你的Qnap设备。
  • 完成以上设置后,便可以测试你的DDNs是否连通了。在DDNS设置页面的底部,点击【测试连接性】,观测域名是否能成功连接到Qnap设备。👇如下可以看到系统访问端口可以连通到Qnap了。
    alt text
  • 做为测试,你可以将你的手机切换为非wifi模式,输入您的DDNS域名和端口号,便可以打开NAS页面(由于一些原因,在大陆使用Qnap的域名解析连接性不佳,有条件的还是建议自建DDNs服务)
    alt text

🚩 如果你无法打开NAS页面,或者收到 〔ERR_NAME_NOT_RESOLVED〕,那是因为你的网络环境无法连接到Qnap的DDNS服务器所致,原因嘛,大家都懂得。

自建DDNS解析脚本

除了上述通过Qnap二级域名实现外网访问外,我们还可以自己申请一级域名(一些冷门域名很便宜的,一次性买10年也不过百元级),然后我们在NAS上通过ddns-go脚本将我们的NAS的公网IP(实际应该是你的路由器的IP地址)更新到域名上,这样我们就可以通过我们自己的域名自由访问我们的NAS了。

ddns-go是一个运行于Docker里的镜像容器,我一直在使用不低于2年时间,稳定性是非常棒的。

准备域名

我是在阿里云上申请的域名。自己用嘛,不求闻达于诸侯,所以越便宜越好,能解析是唯一的要求。
alt text

我使用的是免费套餐,在国内全胜基本没有遇到无法解析的情况,也可以根据自己的实际使用需求,开通付费套餐。
alt text

安装ContainerStation

ContainerStation是Qnap NAS中运行Docker的平台,你可以在NAS中的AppCenter中找到并安装它。
alt text

等ContainerStation安装完成后,我们便可以在里面运行我们需要的镜像包了。
alt text

由于DockerHub在国内的访问性不佳,所以推荐在ContainerStation中添加阿里云Docker镜像地址,以提高Docker镜像的拉取速度。打开容器镜像服务(需要登录你的账号,每个账号的镜像地址都是不一样的),在👈左侧找到〔镜像工具〕/〔镜像加速器〕,复制加速器地址备用。
alt text

然后打开ContainerStation,找到〔存储库〕,然后〔添加〕
alt text

使用jeessy/ddns-go进行DDNS动态解析

本人使用jeessy/ddns-go进行DDNS解析,ddns-go是一个开源在dockerHub上的docker镜像,大家可以在ContainerStation中从dockerHub提取该镜像,也可以在电脑上下载
👉ddns-go镜像文件(amd64 CPU)
👉ddns-go镜像文件(arm CPU)
然后导入到ContainerStation中使用。
alt text

生成容器

ddns-go的镜像,相当于是可以运行的一个exe文件,我们现在需要把这个exe文件〔其实是docker镜像〕运行起来,就是说需要创建一个让镜像跑起来的容器。
alt text

等待容器创建完成
alt text

在容器页面就可以看到已经在运行的ddns-go了
alt text

🚩 如果容器运行出现 exec /app/ddns-go: exec format error 这种错误,说明ddns-go与Qnap设备的CPU架构不兼容,你需要换一下ddns-go镜像。

设置ddns-go参数

在局域网环境下,在浏览器中打开你的NAS IP地址 + 端口号 9876(例如192.168.1.43:9876), 就可以对ddns-go进行参数设置了:
alt text

登录后,可以看到参数设置页面
alt text

👆上图中,点击〔创建 AccessKey〕即可跳转到对应dns服务商的AccessKey创建页面(可能需要登录),根据引导完成AccessKey创建后,将AccessKey ID和AccessKey Secret填回到本页面中
alt text

在IPV4设置一栏,把你申请到的域名填写到Domains中,如下👇
alt text

翻到最下面,如果你有Webhook通道(例如可能在飞书中添加消息机器人,开通Webhook连接),那么你可以在这里设置Webhook通知,当IP变化时,通过Webhook向你发送通知消息。如下👇
alt text

对于飞书机器人,我用的RequestBody设置如下👇

{
    "msg_type": "post",
    "content": {
        "post": {
            "zh_cn": {
                "title": "Hi,你的公网IP变了",
                "content": [
                    [
                        {
                            "tag": "text",
                            "text": "IPv4地址:#{ipv4Addr}"
                        }
                    ],
                    [
                        {
                            "tag": "text",
                            "text": "域名更新结果:#{ipv4Result}"
                        }
                    ]
                ]
            }
        }
    }
}

飞书上收到的消息如下👇
alt text

以上设置完成后,您的ddns应该已经可以正常解析更新了,在容器界面,选中ddns-go容器,观察其日志小黑窗口,应该有如下消息出现👇
alt text

至此,你可以通过以上设置,配合你的路由器的端口转发,你便可以通过域名:端口访问你的NAS设备了。你如你可以通过 www.zhsan.xyz:1234 访问到你的NAS。

无密码登录

你需要在移动端下载并安装APP <font color=Green>QNAP Authenticator</font>,你可以在Qnap官网下载到该APP:
alt text
然后在您的NAS界面,找到〔登录和安全性〕,如下👇
alt text
根据引导设置无密码登录〔或者使用两步验证〕,如下👇
alt text
设置成功后,您将看到你的受权的设备如下👇
alt text
🚩 在设置〔二次验证〕或者是〔无密码登录〕时,将有两个验证方式,一种是本地验证,一种是云端验证;

  • 〔本地验证〕是指在你的局域网中寻找识别NAS设备进行验证,这种验证方式只能当你的移动设备和NAS处于同一局域网时可用使用。
  • 〔云端验证〕是指通过登录Qnap ID账号,从你的Qnap ID账号认证的设备列表中寻找识别NAS设备进行验证,这种验证方式不受局域网环境限制。但是这种验证方式需要具备以下条件:

    • 你的设备已经在Qnap ID中注册
    • 你的NAS开通了DDNS服务,这将使得Qnap服务器可以找到并连接你的NAS设备

HTTPS安全访问

如果你需要在外网访问你的NAS设备,Https加密通信就是必要的。当你在外网访问你的NAS设备时,就像你在用手机和你的NAS设备通电话。

  • 如果你们使用http访问NAS,就像是你们的通话是明文通话,如果有坏人监听了你们的通话,那么他就知道你们说了什么,一旦让他监听到了你的NAS的用户名和密码,那他就可以通过这个用户名和密码登录到你的NAS,这与家里进了贼没有什么区别。
  • 如果你们全胜https访问NAS,就像是你们的通话是用经过加密的暗语,你们的通话内容除了你们自己能懂之外,即使是被坏人监听到了,它也无法理解你们的通话内容,也就不会泄露秘密。

为了全胜https通信,我们需要为https配置SSL证书,这个SSL证书的作用就是负责给https通信的内容进行加密。

申请SSL证书

一般来说,SSL证书需要付费(年付)使用,但是我们也可以获取到免费的测试用的SSL证书,这些免费的SSL证书的加密效果与付费的SSL证书的加密效果是一样的。

阿里云和腾讯云都提供限时免费的SSL证书以供测试使用,我的域名是在阿里云进行的解析,所以此处以阿里云的SSL证书申请为例来进行说明。

  • 登录阿里云平台,搜索 〔数字证书管理服务〕,然后〔登录控制台〕,如下👇
    alt text
    alt text
  • 购买免费SSL证书名额(每个账户每年有一次购买机会,一次买20个证书名额,一个名额用90天),如下👇
    alt text
    alt text
  • 创建SSL并提交申请,根据下图填写必要的信息后,提交审核,如下👇
    alt text
  • 验证域名,当你提交了SSL申请后,我们在SSL证书管理页面就可以看到我们提交SSL申请的记录了,此时我们需要验证一下我们的域名是否OK, 点击SSL申请记录右侧的〔验证〕按钮,如下👇
    alt text
  • 在弹出的证书申请页中,我们找到第三步,点击〔验证〕按钮,等待验证完成后,显示“域名验证成功。。。。。”信息,如下👇
    alt text
  • 等待SSL签发。做完以上步骤后,我们只需要等待域名签发就可以了,如下👇
    alt text
  • 下载SSL证书,解压后备用,如下👇
    alt text

安装SSL证书

我们申请到了SSL证书后,我们就需要将它安装到我们的NAS中,才能使用https访问我们的NAS。我们回到NAS页面,操作如下👇
alt text

然后等待证书导入完成即可,如下👇
alt text

🚩注意,我们申请的SSL证书只有90天有效,过期后我们需要重新通过以上步骤申请新的SSL证书并导入。或者可以付费申请期限为1年的SSL证书,这样就可以自动延期了。

启用HTTPS访问

以上工作完成后,我们便可以为我们的NAS启用HTTPS服务了。我们把https的端口号设置为12345(此处为举例),设置如下👇
alt text

调整路由器端口映射

在上图中,我们可以看到我们的NAS的系统端口有两个,一个是1234, 一个是1235。

  • 其中1235是https服务端口,这个端口的通信是加密的,是安全的。我们可以把这个端口曝露在公网上使用,我们在公网环境下,可以通过 https://www.zhangsan.xyz:1235 来以https方式访问我们的NAS。
  • 其中1234是http服务端口,这个端口的通假是没有加密的,是不安全的。所以我们不能把这个端口曝露在公网上,这个端口只可以在局域网环境下访问NAS。

综合以上,我们需要在我们的路由口中调整端口映射规则,只把端口1235映射曝露到公网上,如下👇
alt text

关于公网安全

  • 公网端口

默认的NAS端口一般是5000,或者5001,这也是黑客重点扫描的NAS端口,建议大家在设置外网端口时,避开这两个端口。

  • Telnet/SSH

这两个功能,不要曝露在公网,如果不使用,也不要打开,如果要用,用完记得关闭
alt text

  • 禁用admin账户

不要使用(禁用)NAS默认的管理员账户,这个一般NAS系统是默认禁用的
alt text

  • 开启登录两步验证

进一步提高NAS页面的登录安全性
alt text

  • 关闭UPnp服务

alt text

  • 关闭Bonjour服务

alt text

  • 启用IP防护

alt text

  • 启用账户防护

alt text

  • 关闭IPV6

如果你有了IPV4的公网IP,则通过IPV4即可访问NAS,此时关闭IPV6有助于提高NAS的安全性,尤其避免在域名解析中解析IPV6
alt text

Qsync文件同步

Qnap提供的Qsync文件同步技术,是一个非常好用,也总是被忽略的技术。尤其是Qsync提供的节省空间模式,让用户可以在存储空间较小的电脑上,也能处理NAS上的海量文档。

NAS安装Qsync

为了使用Qsync功能,我们需要在NAS上安装Qync服务端,我们在AppCenter中寻找并安装Qsync,如下👇
alt text

Qsync安装完成后,我们可以打开Qsync,为共享文件夹授予使用权限,如下👇
alt text

电脑端安装Qsync

在你需要同步文件的电脑上,也需要安装Qsync客户端,这样Qsync就可以帮我们同步电脑-NAS两端的文件了。你可以👉在这里下载到Qsync
alt text
alt text

Qsync下载安装完成后,你可以在Qsync中配置文件夹同步任务,如下👇
alt text
然后选择同步任务👇
alt text
然后填写NAS的登录信息,以便Qsync可以知道你要同哪个NAS上同步数据,👇
alt text
然后,你就可以添加同步的双方文件夹了,如下👇
alt text
alt text

🚩 关于〔节省空间模式〕,最值得称道的一点,就是它不会让我们在本地编辑文档的时候,被因Qsync的同步功能而锁定文档,导致我们编辑的文档无法保存。然而,这在一些其它技术不用心的网盘工具中,是经常发生的,这导致用户的编辑经常无法保存而丢失。大家在选择网盘工具和同步工具时,需要特别注意这一点

通过Qsync同步文档,在文档的图标上会有所区别。👇如下图所示,<font color=red>1</font>号位置的文档没有云朵图标,说明这个文档是在本地的;<font color=red>2</font>号位置的文档有云朵图标,说明这个文档是在云端的,它在本地不占用空间,当你打开他时,或者移动它时,Qsync会感知到你的操作,会自动从NAS上把文档同步到本地,以供你使用。
alt text

公网下连接Qsync

如果你的电脑处于公网环境下,请按以下操作切换Qsync的连接方式,如下👇
alt text

使用Qfile Pro

Qfile是Qnap开发的移动端使用的NAS文件同步工具,我们上文中介绍了QsyncQsync这个工具也有移去版本的app,功能与电脑版本的完全一致。但是在移去端,我更喜欢全胜Qfile连接NAS,Qfile集成了Qsync的文件同步功能的同时,我觉得更吸引我的点在于,Qfile不会把NAS上的文档同步到本地,这恰好避免了NAS上的海量文档对手机浏览功能的污染(例如NAS上的图片会污染手机想册的浏览体验)。

下载Qfile Pro

Qnap官网提供了Qfile Pro的下载链接,如下👇
alt text

下载对应的版本,完成Qfile Pro的安装。

局域网下连接NAS

我们完成Qfile的安装后,我们首先在局域网下进行QfileNAS的链接。具体操作如下👇
alt text

  • 👉其中第<font color=red>15</font>步,可以根据情况选择〔邮件认证〕或者是〔输入密码〕。
  • 👉另外需要注意第<font color=red>11</font>步,打开〔检测可用的连接方法〕。

外网环境下连接NAS

我们希望在外网环境下也可以在手机上查阅NAS上的资料,但这需要我们的路由器为我们打开NAS的连接端口(这在〔HTTPS安全访问〕一章中已经有所说明)。

我们关闭wifi,使手机处于4G网络状态下进行操作,如下👇
alt text
继续操作如下👇
alt text

以上操作完成后,我们就可以在外网环境下连接我们的NAS了。随时随地可以访问NAS,这才能发挥NAS最大的价值。

内外网自适应

当我们完成以上的操作后,我们的Qfile可以在外网环境下连接家里的NAS,但是它不能根据我们所处的网络环境(内网 or 外网)自动切换连接方式,这导致我们手机的网络环境切换后,Qfile就无法连接NAS,需要我们每次手动切换连接方式。要想让Qfile可以自动根据网络环境切换连接方式,请完成以下操作👇
alt text

完成以上操作后,Qfile便可以根据我们的设备所处的网络环境自适应调整连接方式了。

关于Qfile的其它使用方式,这是非常丰富的,各位自行摸索吧。

因为网上看到有人拿这个打王者,所以我也买了一台,昨天刚到货,拿到手试了一下发现太大了,操作很不方便,而且王者还没给 2025 适配高刷(吐血)

现在就是后悔,想降价出又不忍心;留着吧,又不知道我拿这个性能溢出的机子能干嘛😭