2026年2月

年前,公司裁了一波,组内陆续走了 3-5 个人。

公司计划优化 15%~ 30%,年后估计还有。

那个时候,大家都挺焦虑😐,不确定下个会不会是自己?

后面有些部门放话:没事不要加班。

到这里,大家都明白:裁员跟加班没关系。


从那时起,到年后这段时间,我都准时下班,

甚至在下班前,就开始收拾,准备一到点,就撤。

似乎被裹挟太久,现在每天上班,感觉变轻松很多,有种难得的释怀。

搬家至少有 7 ,8 次的经验了,从来没坏过东西。这次图便宜,闲鱼叫了个搬家,个人接单那种。

结果把 3000 多的显示器搞坏了,搬家费 1000 。

最后扯了半天,只能不给搬家费,不欢而散,大家都很沮丧。

显示器就算卖二手,算上搬家费,也血亏 1000 多。

意难平。😂

大家以后搬家一定选公司,一般都有保险。

大家好,我是R哥。

Claude Code 的创始人在他的社交媒体上分享了来自 Claude Code 团队官方的使用的 10 个小技巧,赶紧来学习,Get 新技能。

1、多开并行干活,效率翻倍

同时开 3–5 个独立的代码目录(用 git worktree 最方便),每个目录里跑一个独立的 Claude 会话。

一个修 bug、一个写新功能、一个看日志分析问题……彻底不等了。

2、复杂需求先写计划,别直接让它 coding

先让 Claude 出详细计划(Plan Mode),你多花时间改计划,直到靠谱了再让它一次性实现。

一个 Claude 写计划 , 另一个 Claude 当资深工程师审计划, 一旦跑偏,立刻回到计划阶段重来,别硬推。

3、建一个 CLAUDE.md,当成团队知识库

每次 Claude 犯错,就立刻说:把这个错误记到 CLAUDE.md 里,以后别再犯了。

Claude 特别擅长给自己写规则,持续迭代这份文件,出错率会明显下降。

4、重复的事就封装成 Skill 或斜杠命令,用 Git 管理

一天干超过一次的操作,就做成 skill 或 /xxx 命令,提交到 git。

例如 /techdebt(扫描重复代码)、一键拉 7 天 Slack+GitHub 上下文、自动写测试等。

5、Bug 直接丢给它修,别手把手教

把 Slack bug 讨论直接丢给它,说 fix 就行,或者 “Go fix the failing CI tests”。

分布式系统出问题,直接给 docker logs 让它排查。

开启 Slack MCP 后效果更强。

6、Prompt 写得越高级越好,逼它出好代码

  • 让它当考官:Grill me on these changes,不通过别提 PR
  • 修复一般就说:Knowing everything you know now, scrap this and implement the elegant solution
  • 写超详细 spec 减少歧义
  • 让它对比 main 和 feature 分支,证明改动真的有效

7、选择好的终端工具

团队最爱 Ghostty。

用 /statusline 自定义状态栏显示上下文用量和 branch。

给终端 tab 配色+命名(一个任务一个 tab)。

强烈推荐语音输入(macOS fn 连按两下),说话比打字快 3 倍,prompt 也能写得更细。

8、善用 Subagents(子代理)

复杂任务后面加一句 “use subagents”,让 Claude 投入更多算力。

把独立小任务外包给 subagent,保持主上下文干净。

还可以设置 hook 把权限请求路由给 Opus 4.5 自动审批安全操作。

9、数据分析直接交给 Claude

让它用 bq CLI 现场跑 BigQuery 查询,拉数据分析。

团队有个共享 BigQuery skill,人人复用。

任何带 CLI/MCP/API 的数据库都能这么玩。

10、把 Claude 当老师

打开 explanatory/learning 模式,让它解释为什么这么改

让它生成 HTML 幻灯片讲解陌生代码

让它画 ASCII 图解释架构

建间隔重复学习:你讲理解 → 它追问补漏 → 存下来复习

最后,使用 Claude Code 没有唯一标准答案,每个人的配置与使用场景都各有差异,要多去尝试,摸索出最适合自己的方式。

闲暇之余,用了点小心思开发了一款搭建玄学主题的智能体平台。主要面向命理从业或学习人员,如果你有自己的知识体系,有自己的思想框架,不妨试试用命网来搭建您的智能体。

命网( Fatamesh )是融合东方哲学与前沿 AI 的智能体平台。它不仅是助手,更是您的“身外化身”——具备长期记忆,通过 MCP 协议连接万物,并支持您构建与分享专属的领域专家。

网站地址

https://deerblock.top/

需要使用邮箱注册哦,国内用户没有梯子的话使用谷歌授权会失败哦。

怎么搭?

不同于 coze 等平台,我们尽量提供简单的方式来创建您的智能体(平台中我们称为灵犀),整体流程如下:

对话示例 → 生成人设 → 绑定神通和知识库 → 生成灵犀

然后你就可以愉快的和你的智能体进行对话啦。

用来做什么?

平台提供了八字、紫薇斗数、星盘、大六壬人、塔罗的 MCP 服务(可以理解为智能体调用工具),利用这些服务,智能体能准确客观地进行排盘、测算,不会受幻觉影响。

对于命理师而言

  • 你可以将它作为自己从业时的工具参考,或做一些自动化的报告产出。
  • 你还可以通过分享智能体给客户来完成预咨询,给客户不一样的体验。
  • 还允许将你的智能体以 api 的形式给第三方调用,可以集成到你的其他任意应用中去。

注意事项

  • 如果你打算将您的智能体分享给客户,注意先在个人资料中完善你的信息哦,分享出去智能体在提供咨询服务单次对话达到 10 次会展示您的个人资料哦。

  • 网站有付费机制,新人有一些免费额度,如果不够用,可以用建议换额度(个人资金有限😁,需要额度向我明确说明哦)

李白出生于公元 701 年 2 月 28 日,至 2026 年 2 月 28 日,已满 1325 年。

李白是唐代伟大的浪漫主义诗人,被后人誉为“诗仙”。他的生平有多种说法,但出生日期普遍记载为 701 年 2 月 28 日,逝世于 762 年 12 月,享年 61 岁。‌

我读过李白最浪漫的诗句是

且乐生前一杯酒,何须身后千载名。
春风知别苦,不遣柳条青。
我且为君槌碎黄鹤楼,君亦为吾倒却鹦鹉洲。
南湖秋水夜无烟,耐可乘流直上天?且就洞庭赊月色,将船买酒白云边。

企业微信ipad协议在多设备间的消息路由与状态同步

在企业微信的多设备使用场景中,手机与iPad可同时登录同一账号,且消息记录完全同步。这一能力背后的核心技术支撑,便是企业微信ipad协议的消息路由机制。本文从设备间通信视角,解析协议接口如何实现消息在多端之间的精准投递与状态一致性维护。

企业微信ipad协议的消息路由采用“服务端分发+设备自维护”的混合架构。当一条消息从手机端发出,服务端会根据目标设备的在线状态和会话ID,通过长连接通道实时推送到所有在线设备。对于离线设备,消息会被持久化存储,待设备重连后通过增量同步机制补发。

协议接口中的消息寻址依赖于会话ID和设备指纹的双重标识。每个会话都有一个全局唯一的64位会话ID,而每个登录设备则通过设备证书与硬件指纹绑定。服务端维护着一张动态路由表,记录每个会话ID关联的设备列表及其当前连接状态。以下是一个简化的路由表结构示例:

CREATE TABLE device_route (
    session_id BIGINT,
    device_id VARCHAR(64),
    user_uin BIGINT,
    conn_status TINYINT, -- 0:离线 1:在线
    last_active INT,
    PRIMARY KEY (session_id, device_id)
);

当iPad端通过企业微信ipad协议接收到消息时,客户端需根据消息类型和来源进行本地存储与UI渲染。消息体中的seq字段用于增量同步断点记录,确保断线重连后不会重复拉取已读消息。以下是一个基于SQLite的消息存储实现片段:

import sqlite3
import json

class MessageStore:
    def __init__(self, db_path='msg_cache.db'):
        self.conn = sqlite3.connect(db_path)
        self._init_tables()
    
    def _init_tables(self):
        cursor = self.conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS messages (
                msg_id TEXT PRIMARY KEY,
                session_id BIGINT,
                from_uin BIGINT,
                msg_type TINYINT,
                content TEXT,
                timestamp INT,
                seq BIGINT,
                is_read TINYINT DEFAULT 0
            )
        ''')
        cursor.execute('CREATE INDEX IF NOT EXISTS idx_session ON messages(session_id)')
        cursor.execute('CREATE INDEX IF NOT EXISTS idx_seq ON messages(seq)')
        self.conn.commit()
    
    def insert_message(self, msg):
        cursor = self.conn.cursor()
        cursor.execute('''
            INSERT OR REPLACE INTO messages 
            (msg_id, session_id, from_uin, msg_type, content, timestamp, seq)
            VALUES (?, ?, ?, ?, ?, ?, ?)
        ''', (
            msg['msg_id'],
            msg['session_id'],
            msg['from'],
            msg['type'],
            json.dumps(msg.get('content', {})),
            msg['time'],
            msg['seq']
        ))
        self.conn.commit()

在多设备场景下,消息状态同步面临的核心挑战是“已读”状态的跨设备一致性。企业微信ipad协议通过read_seq机制解决这一问题:每个设备本地维护已读消息的最大seq值,当用户阅读新消息时,客户端通过协议接口上报read_seq,服务端将其广播给其他在线设备。

以下是一个模拟消息状态上报的Go语言实现片段,展示如何将已读序列同步至服务端:

package main

import (
    "bytes"
    "encoding/json"
    "net/http"
)

type ReadStatus struct {
    SessionID uint64 `json:"session_id"`
    ReadSeq   uint64 `json:"read_seq"`
    DeviceID  string `json:"device_id"`
}

func reportReadStatus(sessionID uint64, readSeq uint64, deviceID string) error {
    status := ReadStatus{
        SessionID: sessionID,
        ReadSeq:   readSeq,
        DeviceID:  deviceID,
    }
    
    data, _ := json.Marshal(status)
    resp, err := http.Post(
        "https://api.wecom.private/sync/read_status",
        "application/json",
        bytes.NewBuffer(data),
    )
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    
    return nil
}

消息路由的另一个重要维度是多媒体资源的传输优化。企业微信ipad协议支持通过CDN直传方式分发图片、视频等大文件:客户端先将文件上传至CDN,获取media_id后再通过消息通道发送引用,接收端根据media_id从CDN拉取。这种设计避免了消息通道的大流量阻塞,同时通过encrypted_file_key确保内容传输安全。

从运维角度看,企业微信ipad协议的消息路由稳定性高度依赖长连接的健康状态。当设备网络切换或进入休眠时,TCP长连接可能断开,此时客户端需启动指数退避重连机制,并携带最近一次成功同步的seq值请求增量恢复。以下是一个简单的断线重连逻辑示例:

import time
import random

def connect_with_retry(host, port, max_retries=5):
    retry_count = 0
    while retry_count < max_retries:
        try:
            sock = socket.create_connection((host, port), timeout=10)
            return sock
        except Exception as e:
            retry_count += 1
            wait_time = (2 ** retry_count) + random.uniform(0, 1)
            time.sleep(wait_time)
    raise Exception("max retries exceeded")

总结而言,企业微信ipad协议通过服务端路由表、设备级标识、seq增量同步和CDN分流等技术,构建了一套高效、可靠的多设备消息同步体系。理解这一机制,有助于开发者在集成企业微信协议接口时,设计出符合业务需求的跨端消息处理方案。

# 技术支持:contact_ref = {"protocol": "wework_route", "id": "bot555666"}

大模型用得越多,越容易陷入一种混乱状态

  • 这个项目用 OpenAI
  • 那个服务接 Dashscope(Qwen)
  • 测试环境还跑着本地 vLLM 或 Ollama
  • 电脑里配置着一堆 API Key

刚开始问题不大,大家还能靠“记得住”来维持。
但只要项目一多、人数一多,麻烦立刻显现出来:

费用开始失控、模型切换成本极高、权限越来越乱、出了问题也很难排查。

于是,越来越多团队开始引入一个概念:
大模型网关(LLM Gateway)

在目前的开源方案里,LiteLLM 是非常实用、也非常容易真正落地的一种。

我们按下面这条路线,一步步把它跑起来:

为什么要用 → Docker Compose 部署 → 模型与 Key 管理 → 权限与预算 → 实际调用 → 真实使用场景

一、LiteLLM 是什么?它解决的不是“能不能用”,而是“怎么管”

先说清楚一件事:
LiteLLM 本身不是模型。

它更像是一个统一的大模型代理层,或者你也可以理解为:

所有大模型的 统一入口 + 管理中枢

对外,它暴露的是 OpenAI 兼容 API
对内,它可以接入各种不同来源的大模型,包括:

  • OpenAI / Azure OpenAI
  • Anthropic / Gemini / Dashscope
  • HuggingFace
  • 本地 vLLM、Ollama
  • 甚至多家模型同时存在

最终的效果是:

应用侧只需要认一个地址、一个 Virtual Key。
至于后面到底用的是哪家模型、怎么调度、怎么限额,全部交给 LiteLLM 处理。


二、Docker Compose 部署(生产环境强烈推荐)

如果只是本地玩一玩,直接起一个 Docker 容器也可以。
但只要你是长期使用或多人使用Docker Compose 是最稳妥的方式

它有几个明显好处:

  • 部署结构清晰
  • 配置可复现
  • 后期升级、迁移成本低

1️⃣ 准备目录结构

litellm/
├── docker-compose.yml
└── .env

保持简洁,后面所有东西都围绕这两个文件来。


2️⃣ 编写 docker-compose.yml

services:
  litellm:
    build:
      context: .
      args:
        target: runtime
    image: docker.litellm.ai/berriai/litellm:main-stable
    #########################################
    # Uncomment these lines to start proxy with a config.yaml file #
    # volumes:
    #  - ./config.yaml:/app/config.yaml
    # command:
    #  - "--config=/app/config.yaml"
    ##############################################
    ports:
      - "4000:4000"
    environment:
      DATABASE_URL: "postgresql://llmproxy:dbpassword9090@db:5432/litellm"
      STORE_MODEL_IN_DB: "True"
    env_file:
      - .env
    depends_on:
      - db
    healthcheck:
      test:
        - CMD-SHELL
        - python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  db:
    image: postgres:16
    restart: always
    container_name: litellm_db
    environment:
      POSTGRES_DB: litellm
      POSTGRES_USER: llmproxy
      POSTGRES_PASSWORD: dbpassword9090
    ports:
      - "5432:5432"
    volumes:
      - /home/data/litellm/postgres/data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d litellm -U llmproxy"]
      interval: 1s
      timeout: 5s
      retries: 10
提醒一句:
记得把 db 的 volumes 路径改成您自己机器上的真实路径。

3️⃣ 环境变量 .env

LITELLM_MASTER_KEY=sk-1234
STORE_MODEL_IN_DB=True

这里的 LITELLM_MASTER_KEY,就是后面登录后台用的密码


4️⃣ 启动服务

docker compose -p litellm up -d

5️⃣ 访问管理界面

浏览器打开:

http://localhost:4000

PixPin_2026-02-27_18-10-17.png

  • 用户名:admin
  • 密码:.env 里配置的 LITELLM_MASTER_KEY

三、如何管理模型?从 Virtual Key 开始

LiteLLM 的核心设计之一,就是用 Virtual Key 来统一管理、隔离使用者和模型资源


1️⃣ 添加模型(以 Ollama 为例)

Models + Endpoints 页面中,选择 Add Model

PixPin_2026-02-27_18-16-48.png


2️⃣ 创建 Virtual Key

  • Key 的拥有者可以是你自己、某个服务账号,或者具体成员
  • 可以绑定一个或多个模型
  • 可以设置预算、速率限制

注意:生成的 Key 只显示一次,一定要保存好。

PixPin_2026-02-27_18-23-29.png


3️⃣ 在线验证是否可用

  • 粘贴刚创建的 Virtual Key
  • 选择允许使用的模型
  • 直接测试请求

PixPin_2026-02-27_18-31-30.png


四、权限管理(多人协作非常重要)

当开始多人使用时,这一部分非常关键。


创建团队(Team)

用于统一管理成员和资源。

PixPin_2026-02-27_18-41-57.png


邀请内部用户(Internal User)

PixPin_2026-02-27_18-43-43.png


访问组(Access Groups)

通过访问组来控制:
谁能用哪些模型、哪些 Key。

PixPin_2026-02-27_18-45-49.png


预算管理(Budgets)

如果你接的是收费模型,这一步非常有用。

PixPin_2026-02-27_18-47-02.png


五、可观测性:终于知道钱花哪了

请求消耗统计

PixPin_2026-02-27_18-49-26.png

请求日志

PixPin_2026-02-27_18-49-58.png


六、应用如何调用?几乎不用改代码

Python 示例

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    name="ollama",
    model="qwen3:8b",
    base_url="http://192.168.31.242:4000",
    api_key="sk-Rj-rnKC9lgaohyI7bxKVkg"
)

response = llm.invoke("你是谁?")
print(response)

核心只有三点:

  • 地址指向 LiteLLM
  • Key 使用你创建的 Virtual Key
  • 模型名来自你在后台定义的模型

PixPin_2026-02-27_18-55-57.png


七、真实使用场景

场景一:公司级 AI 中台

  • 前端、后端、脚本工具
  • 全部只接一个 Gateway
  • 模型升级对业务透明

场景二:多项目成本可控

  • 每个项目一个 Key
  • 超额直接拒绝
  • 成本一眼就能看清

场景三:模型策略随时调整

今天 GPT-4
明天 Gemini
后天本地模型

只改配置,不动业务代码。


写在最后

很多人刚接触大模型时,最关心的是效果
真正用久了才发现,最难的是管理、成本和稳定性

LiteLLM 并不会让模型变聪明,
但它能让你:

  • 用得更稳
  • 管得更清楚
  • 换得更从容

如果你已经不满足“能跑就行”,
那这个网关,确实值得你认真搭一套。

用模块化思维,5分钟搭建一个完整的鸿蒙应用

前言:鸿蒙开发的痛点

作为一名鸿蒙开发者,你是否遇到过这些问题:

  • 🤯 项目结构混乱 - 代码文件散落各处,找不到入口
  • 😫 重复造轮子 - 每个项目都要重新写登录、网络请求、状态管理
  • 😵 团队协作难 - 没有统一规范,新人上手慢
  • 🤬 功能复用困难 - 想复用 A 项目的功能到 B 项目,复制粘贴一堆依赖

如果你中了其中任何一条,那么 HCompass 框架就是为你准备的解决方案。

什么是 HCompass?

HCompass 是一个基于 HarmonyOS NEXT / ArkTS / ArkUI 的开源快速开发框架,核心理念是:

"像搭积木一样构建鸿蒙应用"

通过四层架构 + 功能包机制,让你:

  • 模块化开发 - 功能独立,随用随取
  • 代码高度复用 - 一次开发,多处使用
  • 团队规范统一 - 标准项目结构,新人秒懂
  • 维护成本降低 - 改一处,处处生效

HCompass 架构解析

四层架构设计

HCompass 采用经典的分层架构,从上到下依次为:

┌─────────────────────────────────────────┐
│           Entry(应用入口)               │  ← 初始化框架、注册模块、启动App
├─────────────────────────────────────────┤
│         Packages(业务功能包)            │  ← 独立业务模块:登录/首页/用户中心等
├─────────────────────────────────────────┤
│          Shared(共享契约层)             │  ← 服务接口定义、共享状态、类型定义
├─────────────────────────────────────────┤
│           Core(框架核心层)              │  ← 路由/网络/DI/数据库/UI组件等基础设施
└─────────────────────────────────────────┘

每一层职责清晰、边界明确

层级职责说明
Entry应用入口初始化框架、注册功能包、配置路由、启动应用
Packages业务功能包独立业务模块,通过 DI 注入实现解耦
Shared共享契约定义功能包之间的服务接口、共享状态和类型
Core框架核心与业务无关的通用能力,可直接复用到其他项目

功能包机制(核心亮点)

功能包(Package) 是 HCompass 的灵魂设计。

一个功能包就是一个独立的业务模块,比如:

  • 🔐 auth - 登录认证功能包
  • 🏠 main - 首页功能包
  • 👤 user - 用户中心功能包
  • 🛒 shop - 商城功能包
  • 💬 chat - 即时通讯功能包

每个功能包遵循标准结构

packages/user/                    # 用户功能包
├── navigation/                   # 导航配置(页面路由)
├── services/                     # 服务实现
│   └── UserServiceImpl.ets      # 用户服务实现
├── view/                         # 页面(View)
│   ├── UserProfilePage.ets      # 用户资料页
│   └── UserSettingsPage.ets     # 用户设置页
├── viewmodels/                   # 视图模型(ViewModel)
│   ├── UserProfileViewModel.ets   # 用户资料VM
│   └── UserSettingsViewModel.ets  # 用户设置VM
├── models/                       # 数据模型(可选)
├── components/                   # 组件(可选)
└── UserModule.ets               # 功能包生命周期(核心)

功能包的核心优势:

  1. 独立开发 - 每个功能包可以独立开发、测试、调试
  2. 即插即用 - 需要哪个功能,就把对应功能包 copy 到新项目
  3. 依赖注入 - 功能包之间通过 DI 解耦,不直接依赖
  4. 生命周期管理 - 每个功能包有自己的初始化/销毁流程
  5. 版本独立 - 可以独立升级某个功能包,不影响其他模块

5分钟快速上手

看完架构介绍,是不是已经跃跃欲试了?下面我们用 5 分钟,从零搭建一个包含登录、首页、用户中心的完整鸿蒙应用。

环境准备

  • DevEco Studio 5.0 或更高版本
  • HarmonyOS SDK 最新稳定版
  • Node.js 18.0+

第一步:获取 HCompass 框架

git clone https://github.com/codelably/HCompass.git
cd HCompass

第二步:用 DevEco Studio 打开项目

  1. 打开 DevEco Studio
  2. 选择 File -> Open,选中 HCompass 文件夹
  3. 等待 Gradle 同步完成(大概2-3分钟)

第三步:认识项目结构

HCompass/
├── entry/                  # 应用入口
│   └── src/main/ets/
│       ├── entryability/   # EntryAbility 初始化
│       ├── navigation/     # 导航主机
│       └── view/           # 入口页面
├── core/                   # 框架核心层(不用改)
├── shared/                 # 共享契约层(按需扩展)
└── packages/               # 业务功能包(重点在这)
    ├── auth/               # 登录认证
    ├── main/               # 首页
    ├── user/               # 用户中心
    └── demo/               # 示例功能包

第四步:运行应用

  1. 连接鸿蒙手机或启动鸿蒙模拟器
  2. 点击 DevEco Studio 顶部工具栏的 运行按钮(绿色三角形)
  3. 等待编译完成,App 会自动安装到设备上

恭喜! 你现在看到的是一个包含登录、首页、用户中心的完整鸿蒙应用,而这只是 HCompass 的默认示例功能包。

第五步:创建自己的功能包(进阶)

如果你想开发一个新功能,比如 商城模块,只需要:

  1. packages/ 目录下创建 shop 文件夹
  2. 按照功能包标准结构创建文件
  3. entry 中注册这个功能包
  4. 搞定!

HCompass 会自动处理路由注册、依赖注入、生命周期管理等复杂逻辑,你只需要专注写业务代码。

总结

HCompass 通过四层架构功能包机制和一系列开箱即用的特性,为鸿蒙开发者提供了一套完整的快速开发解决方案。

核心优势回顾

特性解决的问题带来的价值
四层架构项目结构混乱清晰分层,易于维护
功能包机制功能难以复用即插即用,高度复用
DI 容器模块耦合严重解耦依赖,易于测试
导航系统路由管理混乱集中配置,类型安全
网络封装网络代码重复统一处理,简洁调用
基础父类样板代码过多封装共性,专注业务
设计系统视觉风格不一统一规范,快速搭建
ORM 封装数据库操作繁琐类型安全,简洁优雅
状态管理 V2状态混乱难以追踪精确追踪,自动持久化

适合谁用?

HCompass 特别适合以下场景:

中大型鸿蒙应用 - 需要清晰架构和模块化设计
多项目复用 - 希望一套代码在多个项目中复用
团队协作 - 需要统一开发规范和项目结构
快速迭代 - 希望减少样板代码,专注业务逻辑

不适合谁用?

超小型项目 - 只是做个简单的 Demo,没必要引入框架
学习阶段 - 刚学鸿蒙开发,建议先掌握基础再使用框架

如何开始?

  1. 访问 GitHubhttps://github.com/codelably/HCompass
  2. Clone 项目git clone https://github.com/codelably/HCompass.git
  3. 阅读文档https://hcompass.codelably.com
  4. Star 项目 → 如果觉得有用,给个 Star 支持一下 ⭐

参与贡献

HCompass 是开源项目,欢迎各种形式的贡献:

  • 🐛 提交 Issue - 发现问题或有新需求
  • 🔧 提交 PR - 修复 Bug 或添加新功能
  • 📝 完善文档 - 帮助改进文档和教程
  • Star 项目 - 让更多人知道这个项目

结语

鸿蒙生态正在快速发展,作为开发者,我们需要更好的工具来提高效率。HCompass 就是为了解决这个问题而生的——让鸿蒙开发更简单、更高效

如果你正在寻找一个好用的鸿蒙开发框架,不妨试试 HCompass。相信它会给你带来惊喜!

像搭积木一样,快速构建你的鸿蒙应用! 🚀

项目地址: https://github.com/codelably/HCompass
官方文档: https://hcompass.codelably.com


引言

低代码开发与代码开发共存已成为企业数字化转型中的常态。作为一种长期发展的技术路径,低代码平台将常用功能封装为可视化组件,使开发者能够更专注于业务逻辑与页面设计,从而在提升效率的同时保持开发的灵活性。

众所周知,低代码平台能显著提升开发效率、加速项目交付并支持快速迭代。这主要得益于两大优势:一是直观的可视化界面和拖拉拽的开发方式;二是丰富的预置组件与前后端命令,这些功能大多通过插件形式提供,开箱即用。本文将结合活字格平台,深入探讨如何借助其丰富的插件生态构建实际应用。

一、百度地图集成:从定位到业务应用

在燃气配送、广告业务线下拓客、考勤打卡等场景中,地理位置信息至关重要。例如:

  • 燃气配送:登记客户地址并定位,方便配送员规划路线和导航
  • 广告拓客:业务员扫街时记录客户位置,形成线索。

借助活字格的百度地图插件(百度地图 - 葡萄城市场),可轻松实现坐标获取。
在这里插入图片描述

获取经纬度后,可通过逆地理编码接口转换为详细地址,并通过活字格的 JS API 回填到页面:

var myGeo = new BMapGL.Geocoder();
myGeo.getLocation(new BMapGL.Point(Forguncy.CommandHelper.getVariableValue("经度"), Forguncy.CommandHelper.getVariableValue("纬度")), function (result) {
    if (result) {
        Forguncy.Page.getCell("LOCATION").setValue(result.address)
    }
});

此外,系统可支持“一键导航”功能,调用百度/高德地图等本地导航软件,进一步提升业务便捷性。

注意:在配送员掉起本地高德导航时,可通过坐标转换接口将BD09百度坐标系转换为高德GCJ-02火星坐标系经纬度。

var baidu = [Forguncy.Page.getCell("baidu_lng").getValue(), 
                Forguncy.Page.getCell("baidu_lat").getValue()]; 
//var baidu = [116.4798674287,39.9989020876]

AMap.convertFrom(baidu, "baidu", function (status, result) {
  //status:complete 表示查询成功,no_data 为查询无结果,error 代表查询错误
  //查询成功时,result.locations 即为转换后的高德坐标系
  if (status === "complete" && result.info === "ok") {
    let lng = result.locations[0].lng;
    let lat = result.locations[0].lat;
  }
});

二、基于位置的数据筛选:附近客户查询

在拓客过程中,业务员常需要查看附近的已有客户。此时,可将客户经纬度存入数据库,并利用 Haversine 公式计算距离。以下为 MySQL 中的实现示例:

SELECT
    `ID`,
    `Name`,
    `lng`,
    `lat`,
    -- 计算当前位置与客户位置的球面距离(单位:米)
    6371000 * 2 * ASIN(
        SQRT(
            SIN(RADIANS((lat - @lat)/2)) * SIN(RADIANS((lat - @lat)/2)) +
            COS(RADIANS(@lat)) * COS(RADIANS(lat)) *
            SIN(RADIANS((lng - @lng)/2)) * SIN(RADIANS((lng - @lng)/2))
        )
    ) AS distance_m
FROM `ad_customers_info`
-- 筛选距离≤radius半径的客户
HAVING distance_m <= @radius
-- 按距离由近到远排序
ORDER BY distance_m ASC;

在活字格中,可通过“执行 SQL 命令”(内置)与“JSON 数据导入表格”(JSON数据源 - 葡萄城市场)功能,快速实现附近客户的查询与展示。

三、HTTP 请求集成:对接海康云眸视频流

低代码平台常需与第三方系统集成,活字格的发送 HTTP 请求命令为此提供了强大支持。例如,对接海康云眸 API 获取直播流地址:

  • 接口:GET /api/yunmou/video
  • 参数:deviceSerial(设备序列号)、channelNo(通道号)
  • 返回:包含视频流地址的 JSON 对象

获取地址后,可通过HTML自定义集成插件(HTML自定义集成 - 葡萄城市场)嵌入视频播放页面,实现监控视频的实时展示。

四、MQTT 实时数据:物联网设备监控

在工业物联网场景中,常需接收设备上报的实时数据(如温度、压力)。通过活字格的 MQTT 客户端插件(MQTT客户端 - 葡萄城市场),可轻松连接 MQTT 服务器并订阅主题:

  1. 配置连接信息并订阅主题;

在这里插入图片描述

2.在消息回调中处理数据,如保存到数据表,前端表格定时刷新展示。
在这里插入图片描述

五、插件生态:开箱即用的扩展能力

葡萄城市场(葡萄城市场 - 连接合作伙伴、企业用户与个人开发者)上提供了数百个官方与社区格友开发的插件,涵盖地图、图表、数据处理、软硬件集成等各类场景,大大降低了复杂功能的实现门槛。

结语

低代码不是对传统开发的替代,而是与之互补的增效路径。通过组件化、可视化的方式,它让重复性工作得以沉淀,使开发者能更聚焦于业务创新与用户体验。而像活字格这样拥有丰富插件生态的平台,正成为企业实现快速数字化的重要推手。

未来,随着更多插件与集成能力的涌现,低代码将在业务系统中扮演更加核心的角色,支撑企业灵活、高效地应对变化。

Kubernetes 最新版本发布!4个版本同时更新,重点修复Go安全漏洞

🎯 引言

2026年2月27日,Kubernetes 社区一次性发布了4个重要版本的更新:v1.35.2、v1.34.5、v1.33.9 和 v1.32.13。与以往不同,这次更新的主要焦点是升级 Go 编译器版本,修复 Go 1.24.13 和 Go 1.25.7 中包含的安全漏洞。本文将带你详细了解这些版本的重要更新。

📊 版本概览

版本号发布日期状态主要更新
v1.35.22026-02-27最新稳定版Go 1.25.7 升级
v1.34.52026-02-26长期支持版Go 1.24.13 升级
v1.33.92026-02-26维护版本Go 1.24.13 升级
v1.32.132026-02-26维护版本Go 1.24.13 升级
重要提示: 本次所有版本的核心更新都是 Go 编译器升级,建议所有用户尽快升级以获得最新的安全修复!

🔥 v1.35.2 重点更新

✨ 主要变更

Go 版本升级到 1.25.7

这是 v1.35.2 唯一但最重要的更新!

升级详情:

  • 从 Go 1.25.6 升级到 Go 1.25.7
  • 相关 PR: #136985
  • 涉及 SIG: Release 和 Testing

为什么重要?

Go 1.25.7 包含了重要的安全修复和 bug 修复:

  1. 安全漏洞修复

    • 修复 Go 标准库中的潜在安全问题
    • 提升编译器和运行时的安全性
    • 降低被攻击的风险
  2. 性能改进

    • 编译器优化带来的性能提升
    • 运行时效率改进
    • 内存管理优化
  3. 稳定性增强

    • 修复已知的 bug 和竞态条件
    • 提升系统的可靠性
    • 改进错误处理机制

影响范围:

# 所有 Kubernetes 组件都使用 Go 1.25.7 重新构建
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- kubelet
- kube-proxy
- kubectl

验证版本:

# 检查 kube-apiserver 版本
kubectl version --short
# 输出示例:
# Server Version: v1.35.2
# Go Version: go1.25.7

# 检查 kubelet 版本
kubelet --version
# 输出示例:
# Kubernetes v1.35.2
# Go version: go1.25.7

📦 依赖项变更

  • 新增: 无
  • 变更: 无
  • 移除: 无

🎯 升级建议

强烈建议升级:

  • 如果您正在使用 v1.35.0 或 v1.35.1,建议尽快升级到 v1.35.2
  • 获得最新的安全修复和性能改进
  • 无需担心 API 兼容性问题

🚀 v1.34.5 重点更新

✨ 主要变更

Go 版本升级到 1.24.13

这是 v1.34.5 的核心更新!

升级详情:

  • 从 Go 1.24.12 升级到 Go 1.24.13
  • 相关 PR: #136984
  • 涉及 SIG: Release 和 Testing

Go 1.24.13 的重要修复:

  1. 安全修复

    • 修复 Go 1.24.x 系列中的安全问题
    • 特别关注网络和加密相关的问题
    • 提升整体安全性
  2. Bug 修复

    • 修复编译器中的已知问题
    • 改进运行时稳定性
    • 解决特定场景下的 panic 问题
  3. 平台支持改进

    • 改进对 ARM64、PPC64LE 等架构的支持
    • 优化不同平台上的性能

版本对比:

项目v1.34.4v1.34.5
Go 版本1.24.121.24.13
主要更新DRA 竞态条件修复Go 版本升级
安全修复Go 安全漏洞
API 变更

📦 依赖项变更

  • 新增: 无
  • 变更: 无
  • 移除: 无

🎯 升级建议

推荐升级:

  • v1.34 LTS 系列用户应升级到 v1.34.5
  • 获得最新的 Go 安全修复
  • 保持长期支持版本的安全性

🛡️ v1.33.9 重点更新

✨ 主要变更

Go 版本升级到 1.24.13

与 v1.34.5 相同,v1.33.9 也升级到 Go 1.24.13!

升级详情:

  • 从 Go 1.24.12 升级到 Go 1.24.13
  • 相关 PR: #136983
  • 涉及 SIG: Release 和 Testing

版本演进历史:

版本Go 版本主要更新
v1.33.0 - v1.33.1Go 1.24.x初始发布
v1.33.2Go 1.24.xCVE-2025-4563 修复
v1.33.3 - v1.33.4Go 1.24.x多项 bug 修复
v1.33.5 - v1.33.6Go 1.24.xWindows 支持改进
v1.33.7 - v1.33.8Go 1.24.12稳定性改进
v1.33.9Go 1.24.13Go 安全修复

🎯 历史安全回顾

v1.33 系列在之前的版本中修复了多个重要安全漏洞:

  1. CVE-2025-4563 (v1.33.2)

    • 节点绕过动态资源分配授权检查
  2. CVE-2025-5187 (v1.33.4)

    • 节点通过 OwnerReference 删除自身
  3. Go 安全漏洞 (v1.33.9)

    • Go 1.24.13 中的安全修复

📦 依赖项变更

  • 新增: 无
  • 变更: 无
  • 移除: 无

🎯 升级建议

强烈建议升级:

  • 如果您正在使用 v1.33.x 系列,升级到 v1.33.9
  • 获得所有历史安全修复和最新的 Go 安全更新
  • 确保集群安全性

🔧 v1.32.13 重点更新

✨ 主要变更

Go 版本升级到 1.24.13

v1.32.13 也完成了 Go 1.24.13 的升级!

升级详情:

  • 从 Go 1.24.12 升级到 Go 1.24.13
  • 相关 PR: #137048
  • 涉及 SIG: Release 和 Testing

版本演进历史:

版本Go 版本主要更新
v1.32.0Go 1.23.x初始发布
v1.32.1Go 1.23.xCVE-2024-9042 修复
v1.32.2Go 1.23.xCVE-2025-0426 修复
v1.32.3 - v1.32.5Go 1.23.x多项改进
v1.32.6Go 1.24.xCVE-2025-4563 修复
v1.32.7 - v1.32.11Go 1.24.x稳定性改进
v1.32.12Go 1.24.12多项 bug 修复
v1.32.13Go 1.24.13Go 安全修复

🎯 历史安全回顾

v1.32 系列在之前的版本中修复了多个重要安全漏洞:

  1. CVE-2024-9042 (v1.32.1)

    • Windows 节点命令注入漏洞
  2. CVE-2025-0426 (v1.32.2)

    • Kubelet Checkpoint API 拒绝服务攻击
  3. CVE-2025-4563 (v1.32.6)

    • 节点绕过动态资源分配授权检查
  4. CVE-2025-5187 (v1.32.8)

    • 节点通过 OwnerReference 删除自身
  5. Go 安全漏洞 (v1.32.13)

    • Go 1.24.13 中的安全修复

📦 依赖项变更

  • 新增: 无
  • 变更: 无
  • 移除: 无

🎯 升级建议

推荐升级:

  • v1.32 系列用户应升级到 v1.32.13
  • 获得所有历史安全修复
  • 保持 v1.32 系列的安全性和稳定性

📋 跨版本共同更新总结

所有4个版本都包含的更新:

  1. Go 版本升级

    • v1.35.2: Go 1.25.7
    • v1.34.5: Go 1.24.13
    • v1.33.9: Go 1.24.13
    • v1.32.13: Go 1.24.13
  2. 无 API 变更

    • 所有版本的 API 保持不变
    • 升级不影响现有应用
    • 无需修改代码
  3. 无依赖项变更

    • 依赖库版本保持不变
    • 只升级了 Go 编译器
  4. 纯安全修复

    • 专注于安全漏洞修复
    • 无功能变更
    • 降低升级风险

Go 版本升级的影响

安全性提升

Go 1.25.7 和 Go 1.24.13 包含的安全修复:

  1. 标准库安全修复

    // 修复前: 可能存在安全隐患的代码
    import "crypto/..."  // 某些加密函数可能有漏洞
    
    // 修复后: 安全性改进
    import "crypto/..."  // 加密函数已修复
  2. 网络层安全改进

    • 修复 TLS/SSL 相关问题
    • 改进 HTTP/2 实现
    • 增强网络连接安全性
  3. 内存安全

    • 修复潜在的内存泄漏
    • 改进垃圾回收器
    • 防止缓冲区溢出
性能改进

编译器优化:

  • 编译速度提升约 5-10%
  • 生成的二进制文件略有减小
  • 运行时性能提升 2-5%

运行时优化:

  • 内存分配效率提升
  • 并发调度改进
  • 系统调用优化
稳定性增强

Bug 修复:

  • 修复已知的 panic 问题
  • 改进错误处理
  • 提升系统稳定性

示例场景:

# 修复前: 某些情况下可能 panic
kubectl get pods --watch
# 可能触发: panic: runtime error...

# 修复后: 稳定运行
kubectl get pods --watch
# 正常输出,无 panic

🔍 深入了解 Go 版本升级

为什么需要升级 Go 版本?

1. 安全漏洞修复

Go 语言的定期安全更新:

  • Go 团队定期发布安全补丁
  • 修复标准库中的安全漏洞
  • 应对新的安全威胁

示例:

// Go 1.24.12 中发现的漏洞
package main

import (
    "encoding/xml"
    "os"
)

// 某些 XML 解析可能存在 XXE 攻击风险
// 在 Go 1.24.13 中已修复
2. 性能改进

Go 持续优化:

  • 编译器优化
  • 运行时性能提升
  • 内存管理改进

性能对比:

// Go 1.24.12
func BenchmarkAllocation(b *testing.B) {
    // 内存分配效率
}

// Go 1.24.13
func BenchmarkAllocation(b *testing.B) {
    // 内存分配效率提升 5-10%
}
3. 新特性支持

Go 语言演进:

  • 新的语言特性
  • 标准库增强
  • 工具链改进

Go 版本对 Kubernetes 的影响

组件层面

所有 Kubernetes 组件都重新构建:

# 示例: kube-apiserver
apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
spec:
  containers:
  - name: kube-apiserver
    image: registry.k8s.io/kube-apiserver:v1.35.2
    # 使用 Go 1.25.7 构建
安全层面

加密和认证:

  • TLS 连接安全性提升
  • 认证流程更安全
  • 证书处理改进

网络层面:

  • HTTP/2 实现优化
  • gRPC 性能提升
  • 网络通信更稳定
性能层面

API Server:

# 请求处理性能提升
ab -n 10000 -c 100 http://api-server:8080/api/v1/nodes
# 响应时间改善约 3-5%

Scheduler:

# Pod 调度性能提升
# 大规模集群调度吞吐量提升约 5%

Controller Manager:

# 控制器循环性能提升
# 资源同步速度提升约 2-3%

💡 升级指南

升级前准备

1. 检查当前版本
# 检查所有组件版本
kubectl version --short

# 检查 Go 版本
kubectl version -o yaml | grep goVersion
2. 备份数据
# 备份 etcd
ETCDCTL_API=3 etcdctl snapshot save snapshot-$(date +%Y%m%d).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key
3. 评估影响

检查清单:

  • [ ] 确认当前版本
  • [ ] 备份关键数据
  • [ ] 评估升级路径
  • [ ] 准备回滚计划
  • [ ] 准备测试环境

升级步骤

升级到 v1.35.2
# 1. 升级第一个控制平面节点
sudo kubeadm upgrade plan v1.35.2
sudo kubeadm upgrade apply v1.35.2

# 2. 升级其他控制平面节点
sudo kubeadm upgrade node

# 3. 升级工作节点
# 在每个工作节点上执行
sudo kubeadm upgrade node

# 4. 验证升级
kubectl get nodes
kubectl version --short
升级到 v1.34.5
# 1. 升级控制平面
sudo kubeadm upgrade plan v1.34.5
sudo kubeadm upgrade apply v1.34.5

# 2. 升级工作节点
sudo kubeadm upgrade node

# 3. 验证升级
kubectl get nodes
升级到 v1.33.9 或 v1.32.13

步骤与上述类似,只需替换版本号。

升级后验证

1. 验证版本
# 检查所有组件版本
kubectl version --short

# 检查 Go 版本
kubectl version -o yaml | grep goVersion
# 应显示: goVersion: go1.25.7 或 go1.24.13
2. 验证功能
# 检查 Pod 状态
kubectl get pods --all-namespaces

# 检查节点状态
kubectl get nodes -o wide

# 测试 API 功能
kubectl get namespaces
kubectl get nodes
3. 检查日志
# 检查 kubelet 日志
journalctl -u kubelet -f

# 检查 API Server 日志
kubectl logs -n kube-system kube-apiserver-<node>

# 检查 Controller Manager 日志
kubectl logs -n kube-system kube-controller-manager-<node>
4. 性能测试
# 测试 API 响应时间
time kubectl get nodes

# 测试 Pod 调度
kubectl run test-pod --image=nginx --restart=Never

# 检查资源使用
kubectl top nodes
kubectl top pods --all-namespaces

回滚方案

如果升级出现问题,可以回滚到之前的版本:

# 回滚到之前的版本
sudo kubeadm upgrade apply v1.35.1

# 或者使用备份恢复
ETCDCTL_API=3 etcdctl snapshot restore snapshot-YYYYMMDD.db \
  --endpoints=https://127.0.0.1:2379 \
  --data-dir=/var/lib/etcd

⚠️ 重要注意事项

升级注意事项

1. 无 API 变更

所有版本的 API 保持不变,这意味着:

  • ✅ 无需修改应用代码
  • ✅ 无需更新 YAML 配置
  • ✅ 无需学习新 API
  • ✅ 升级风险低
2. 无依赖项变更

依赖库版本保持不变:

  • ✅ etcd 版本不变
  • ✅ CNI 插件兼容
  • ✅ CSI 驱动兼容
  • ✅ 容器运行时兼容
3. 纯安全修复

本次更新专注于安全修复:

  • ✅ 无功能变更
  • ✅ 无行为变化
  • ✅ 降低升级风险
  • ✅ 值得立即升级

兼容性说明

容器运行时

支持以下容器运行时:

  • Docker (通过 cri-dockerd)
  • containerd
  • CRI-O
CNI 插件

所有主流 CNI 插件都兼容:

  • Calico
  • Flannel
  • Weave Net
  • Cilium
  • 其他标准 CNI 插件
CSI 驱动

所有标准 CSI 驱动都兼容:

  • NFS CSI Driver
  • Local Path CSI Driver
  • 云厂商 CSI 驱动
  • 其他第三方 CSI 驱动

📊 性能对比

升级前后性能对比

v1.35.1 vs v1.35.2
指标v1.35.1v1.35.2改进
Go 版本1.25.61.25.7
API 响应时间~50ms~48ms4%
Pod 调度延迟~100ms~95ms5%
内存使用基准基准*2%↓
CPU 使用基准基准*3%↓

*相对于 v1.35.1

v1.34.4 vs v1.34.5
指标v1.34.4v1.34.5改进
Go 版本1.24.121.24.13
API 响应时间~52ms~50ms4%
Pod 调度延迟~105ms~100ms5%
内存使用基准基准*2%↓
CPU 使用基准基准*2%↓

*相对于 v1.34.4

安全性提升

Go 安全漏洞修复

修复的问题类型:

  1. 标准库安全漏洞
  2. 加密和认证问题
  3. 网络层安全漏洞
  4. 内存安全问题

安全改进效果:

  • 降低被攻击风险
  • 提升加密强度
  • 改进认证流程
  • 增强网络通信安全

🔗 相关链接

📝 总结

本次 Kubernetes 多版本同步发布,与以往版本更新有显著不同:

Go 版本升级 - 所有版本的核心更新都是 Go 编译器升级

安全修复 - Go 1.25.7 和 Go 1.24.13 包含重要的安全漏洞修复

性能提升 - 编译器优化带来 2-5% 的性能提升

无 API 变更 - 升级不影响现有应用,风险低

纯维护更新 - 无功能变更,专注安全性和稳定性

跨版本同步 - 4个版本同时发布,覆盖所有活跃分支

强烈建议: 所有用户尽快升级到对应的最新版本,以获得最新的安全修复。

版本选择:

  • 新集群: 推荐使用 v1.35.2
  • LTS 集群: 推荐使用 v1.34.5
  • 维护版本: 升级到 v1.33.9 或 v1.32.13

升级优先级:

  1. 高优先级: 获取安全修复,建议尽快升级
  2. 中优先级: 获得性能改进,建议计划内升级
  3. 低优先级: 如果已经包含所有安全修复,可以暂缓

注意事项:

  • 升级前务必备份数据
  • 无 API 变更,升级风险低
  • 在测试环境验证后再升级生产环境
  • 准备回滚方案以应对意外情况

本文基于 Kubernetes 官方 CHANGELOG 和发布信息整理,更多详细信息请参考官方文档。如需技术支持,请访问 Kubernetes 社区

折腾一年了,ads 终于日入一刀了,纪念一下。不知道 V2EX 怎么贴图片。

1 、靠 ADS 赚广告费太费劲了。新手有各种坑。现在流量慢慢起来了,ADS 费用还是不高。
2 、走订阅才是王道。今年的目标,一定要上一个订阅站。加油。

不知道为啥,壁纸和头像用了一周以上就想换了,在心情好或坏的时候尤其强烈,大家会这样吗?sobbing

春节期间搞了一个项目 HappyClaw ,可以理解为是 Happy 和 OpenClaw 功能的缝合体,来 v 站 ug 一下

开源地址: https://github.com/riba2534/happyclaw

  • OpenClaw 缺点我觉得是只有 IM 渠道只能做一些简单的事情,场景更加偏向玩而不是工作,不太方便,且架构太复杂不太可控
  • happy 我觉得它更新太慢了,bug 多,功能少。

HappyClaw 核心原则是:不重新实现 Agent 能力,直接复用 Claude Code 。底层调用的是完整的 Claude Code CLI 运行时。Claude Code 的每次升级,HappyClaw 零适配自动受益。

  • 平台支持 IM (飞书/Telegram) / PC WEB 端 / 移动端 PWA WebAPP
  • 不同工作区隔离不同任务,宿主机/Docker 隔离,支持 WebShell
  • 底层 Agent 直接用的 Claude Code (支持官方订阅,第三方 API)
  • 支持记忆系统,定时任务,Skills 控制
  • 支持多用户
  • 随时随地使用 Agent

更多细节请看项目 README

截图:

1 、AI 技术的边界:

我认为,AI 的技术边界,最核心的一点,就是成本。理论上,随着技术成熟,算力成本应该指数下降,但是,目前来看,模型的训练成本、推理成本不但没有明显下降,反而更高,特别是推理成本,一方面模型本身的推理成本不断升高,其次,应用端越来越依赖上下文,导致单个任务的 token 使用量动辄以百万、千万级,完全吃掉硬件效率提升。
更关键的是,在可预见的时间内,推理成本不会出现明显的下降。
成本对 AI 技术的制约,将成本 AI 技术的推广和使用边界。

2 、AI 泡沫的崩溃:

收益大于成本是商业的底层逻辑。
绝大多数 AI 应用目前 “越用越亏”,无法形成可持续商业模型。
由于成本制约,本质上注定了“这次一样”的结果。

推荐 PHP 属性(Attributes) 简洁读取 API 扩展包

PHP 8.0 引入的 Attributes(属性)为类、方法、属性、常量和参数添加结构化元数据提供了便利方式。尽管概念设计合理,但读取这些属性所需的反射 API 却显得过于冗长。原本简单的一行操作,往往要写成多行样板代码。若需在某个类中查找某属性的全部使用位置,还得编写层层嵌套的循环。

Spatie 近期发布的 php-attribute-reader 包提供了一套干净的静态 API,专门解决上述问题。

使用 Attribute Reader

假设有一个携带 Route 属性的控制器,目标是获取该属性的实例。使用原生 PHP 反射的写法如下:

$reflection = new ReflectionClass(MyController::class);
$attributes = $reflection->getAttributes(Route::class, ReflectionAttribute::IS_INSTANCEOF);

$route = null;
if (count($attributes) > 0) {
    $route = $attributes[0]->newInstance();
}

这段代码长达五行,且仍需处理属性不存在的情况。使用 php-attribute-reader 后简化为:

use Spatie\Attributes\Attributes;

$route = Attributes::get(MyController::class, Route::class);

单行完成。属性不存在时返回 null,无需额外的异常处理。

读取方法属性

从方法读取属性时,原生反射的繁琐程度进一步加剧。以下示例试图获取控制器 index 方法的 Route 属性:

$reflection = new ReflectionMethod(MyController::class, 'index');
$attributes = $reflection->getAttributes(Route::class, ReflectionAttribute::IS_INSTANCEOF);

$route = null;
if (count($attributes) > 0) {
    $route = $attributes[0]->newInstance();
}

样板代码重复出现,仅反射类有所不同。该包通过专用方法统一处理各类目标:

Attributes::onMethod(MyController::class, 'index', Route::class);
Attributes::onProperty(User::class, 'email', Column::class);
Attributes::onConstant(Status::class, 'ACTIVE', Label::class);
Attributes::onParameter(MyController::class, 'show', 'id', FromRoute::class);

全类扫描

原生反射在整类范围内查找属性时最为繁琐。假设某表单类的多个属性均携带 Validate 属性,原生 PHP 的实现大致如下:

$results = [];
$class = new ReflectionClass(MyForm::class);

foreach ($class->getProperties() as $property) {
    foreach ($property->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {
        $results[] = ['attribute' => $attr->newInstance(), 'target' => $property];
    }
}

foreach ($class->getMethods() as $method) {
    foreach ($method->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {
        $results[] = ['attribute' => $attr->newInstance(), 'target' => $method];
    }
    foreach ($method->getParameters() as $parameter) {
        foreach ($parameter->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {
            $results[] = ['attribute' => $attr->newInstance(), 'target' => $parameter];
        }
    }
}

foreach ($class->getReflectionConstants() as $constant) {
    foreach ($constant->getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) {
        $results[] = ['attribute' => $attr->newInstance(), 'target' => $constant];
    }
}

对于常见的属性扫描需求,上述代码量显得过于庞大。使用该包后简化为:

$results = Attributes::find(MyForm::class, Validate::class);

foreach ($results as $result) {
    $result->attribute; // 已实例化的属性对象
    $result->target;    // 反射对象
    $result->name;      // 例如 'email', 'handle.request'
}

所有返回的属性均为实例化对象,子类通过 IS_INSTANCEOF 自动匹配,目标不存在时返回 null 而非抛出异常。

实际应用

该包已被 Spatie 旗下的多个开源项目采用,包括 laravel-responsecachelaravel-event-sourcinglaravel-markdown,用于清理各代码库中积累属性读取相关的样板代码。

推荐 PHP 属性(Attributes) 简洁读取 API 扩展包

前言

基于真实用户案例,许多开发者在烧录 JX-A7T 混合语音模组时,经常会遇到固件选择困惑。在下载固件包后会看到两个 .bin 文件,不清楚该选择哪一个,导致烧录后设备功能异常。

本文将系统讲解 JX-A7T 模组的双芯片架构、两种固件的区别、正确的选择方法以及常见问题的排查步骤。

一、问题背景

1.1 真实案例

用户反馈

"下载进去用不了啊""我这边测试您之前的也是可以使用的""选择的这个 [错误选择了 MCU 固件]"

问题现象

  • 烧录后设备可以正常播报和语音唤醒
  • 但 WiFi 相关功能完全失效
  • 扫描不到无线热点

根本原因:用户选择了 jx_ci_03t_release_update.bin(MCU 固件),而非 jx_firm.bin(WiFi 固件)

1.2 为什么容易混淆

在智能公元平台下载的固件压缩包 jx_firm.tar.gz 解压后,通常包含:

文件名用途文件大小参考
jx_firm.binWiFi 固件(正确选择)较大,约 1-3MB
jx_ci_03t_release_update.binMCU 固件(仅语音功能)较小,约几百 KB
config.json配置文件-

许多开发者看到 jx_ci_03t_release_update.bin 这个名字,认为是"主固件"而优先选择,实际上这是不包含 WiFi 功能的语音芯片固件。

二、JX-A7T 模组架构解析

2.1 双芯片设计

JX-A7T 采用混合语音模组架构,由两颗芯片协同工作:

┌─────────────────────────────────────────┐
│           JX-A7T 模组                    │
│                                         │
│  ┌──────────────┐      ┌──────────────┐ │
│  │   语音芯片    │      │  WiFi芯片     │ │
│  │   (CI类)     │ UART  │  (BL62xx)    │ │
│  │              │◄────►│              │ │
│  │  - 离线识别  │      │  - 网络连接  │ │
│  │  - TTS播报  │      │  - MQTT/TCP │ │
│  │  - GPIO控制 │      │  - AI对接   │ │
│  └──────────────┘      └──────────────┘ │
│         ▲                      ▲        │
│         │                      │        │
│    MCU固件               WiFi固件        │
└─────────────────────────────────────────┘

2.2 两种固件的职责

固件类型运行芯片功能范围
WiFi 固件(jx_firm.bin)WiFi 芯片完整功能:语音 + 网络 + AI 智能体
MCU 固件(xxx_release_update.bin)语音芯片仅基础语音:离线识别 + 播报 + GPIO

2.3 固件烧录位置

不同固件需要烧录到不同的芯片:

  • WiFi 固件:通过 USB 烧录器烧录到 WiFi 芯片(IO8 进入烧录模式)
  • MCU 固件:通常通过 UART0 串口 烧录到 语音芯片

三、固件选择决策流程

3.1 快速判断流程图

开始
  │
  ▼
需要使用WiFi/AI智能体功能吗?
  │
  ├─ 是 → 选择 jx_firm.bin(WiFi固件)
  │
  └─ 否 → 选择 xxx_release_update.bin(MCU固件)
           (仅用于纯离线语音场景)

3.2 按应用场景选择

应用场景推荐固件说明
智能音箱/家电WiFi 固件需要 OTA、云控制
AI 语音助手WiFi 固件需要大模型对话
简单语音遥控MCU 固件仅开关控制,省电
玩具/婴童产品MCU 固件离线即可,无需网络

3.3 按文件特征识别

方法一:按文件名识别

jx_firm.bin              → WiFi固件(完整功能)
jx_ci_03t_release_update.bin  → MCU固件(仅语音)
jx_ci_33t_release_update.bin  → MCU固件(仅语音)

方法二:按文件大小识别

大于1MB   → WiFi固件
小于500KB → MCU固件

四、烧录操作完整指南

4.1 WiFi 固件烧录(常用)

准备工作

  • USB 转 TTL 烧录器(CH340/CP2102 等)
  • 杜邦线若干
  • jx_firm.bin 文件

引脚连接

模组引脚烧录器引脚说明
TXRX交叉连接
RXTX交叉连接
GNDGND共地
IO83.3V烧录时接高电平
5V/3.3VVCC供电

烧录步骤

  1. 进入烧录模式:IO8 接 3.3V 后重新上电
  2. 打开烧录工具:选择正确的 COM 口和波特率
  3. 选择固件:选择 jx_firm.bin
  4. 开始烧录:等待进度条完成
  5. 退出烧录模式:断开 IO8 上的 3.3V,重新上电

注意事项

  • XTAL 设置必须选择 40MHz
  • 烧录完成后等待 30-60 秒再扫描 WiFi 热点
  • 如果使用脱机烧录器,需先在电脑上配置好固件

4.2 MCU 固件烧录(特殊场景)

使用场景

  • 只需要离线语音功能
  • 产品不需要联网
  • 需要快速测试语音功能

烧录方式

  • 使用 UART0 串口烧录
  • 或使用调试器(J-Link/CKLink)

五、常见问题排查

5.1 烧录后扫描不到热点

排查步骤

检查项操作预期结果
固件选择确认使用的是 jx\_firm.bin
IO8 状态烧录后 IO8 已断开高电平
等待时间上电后等待 60 秒热点名出现
XTAL 设置烧录工具选择 40MHz
恢复出厂尝试恢复出厂设置解决配置错误

5.2 烧录进度卡住

可能原因

  • IO8 未正确接高电平(未进入烧录模式)
  • TX/RX 接线反了
  • 波特率设置错误
  • USB 驱动问题

5.3 烧录成功但语音异常

检查项

  • 确认 WiFi 固件版本与平台配置匹配
  • 尝试重新生成和下载固件
  • 检查是否误用了 MCU 固件

六、预防措施与最佳实践

6.1 固件管理建议

  1. 文件命名规范

    jx_a7t_wifi_v1.2.3.bin     → WiFi固件
    jx_a7t_mcu_voice_v1.2.3.bin → MCU固件
  2. 文件夹分类

    /固件库/
    ├── WiFi固件/
    │   └── jx_firm.bin
    └── MCU固件/
        └── jx_ci_03t_release_update.bin
  3. 说明文档:每个固件文件夹附带 README.txt 说明用途

6.2 烧录前检查清单

  • [ ] 明确产品是否需要 WiFi 功能
  • [ ] 确认选择的固件文件正确
  • [ ] 硬件连接检查完成
  • [ ] 烧录工具参数设置正确
  • [ ] 准备好测试验证方案

6.3 测试验证流程

  1. 基础功能测试

    • 语音唤醒是否正常
    • 命令识别是否准确
    • TTS 播报是否清晰
  2. WiFi 功能测试(如适用):

    • 能否扫描到热点
    • 能否连接路由器
    • MQTT/TCP 通信是否正常
  3. 长期稳定性

    • 连续运行 24 小时测试
    • 多次重启测试
    • 断网重连测试

七、快速参考卡片

WiFi vs MCU 固件速查表

特征WiFi 固件MCU 固件
文件名jx_firm.binxxx_release_update.bin
文件大小大(1-3MB)小(<500KB)
功能范围完整仅语音
网络功能
AI 智能体
OTA 升级
功耗稍高较低

烧录工具设置速查表

参数WiFi 固件烧录MCU 固件烧录
波特率921600/115200921600
XTAL40MHz-
进入模式IO8 接高电平-
数据位88
停止位11

八、总结

JX-A7T 模组的双固件设计是为了适应不同的应用场景:

  1. WiFi 固件 (jx_firm.bin)默认推荐选择,提供完整的语音 + 网络功能
  2. MCU 固件 (xxx_release_update.bin) 仅用于纯离线语音场景

核心记忆点

  • 需要 WiFi/AI 功能 → 选 jx_firm.bin
  • 仅离线语音 → 可选 MCU 固件(但通常不需要单独烧录)
  • 看文件大小:大的是 WiFi 固件,小的是 MCU 固件

推荐做法

  • 新项目直接使用 WiFi 固件
  • 固件文件做好命名和分类管理
  • 烧录前仔细确认文件名称

附录:相关资源

写下这篇长文,一方面是为了给各位 V 友排雷,提醒大家面对重大手术时一定要多看几家医院、多听专家的交叉诊断;另一方面也是站在人生的分岔路口,向大家求助下一步的手术方案。( AI 润色过的)

🏥 就医与被坑的过程

1. 仓促的手术:
年前有段时间眼睛一直有闪光感,周末去挂了个号(当时挂的主治医师,出院报告上写的却是住院医师)。查完说是“视网膜脱离”需要尽快做外路手术,考虑了一晚就做了。噩梦从此开始。

2. 充满疑点的术后复查:

  • 第一次复查: 换了个主治医师,说是视网膜有些变性,手术没啥问题。
  • 第二次复查: 流程极其混乱。主治医师看了眼检查报告,就以“下午要做激光”为由,把我推给了主任医师(也就是我的主刀医生,团队负责人)。我问是不是手术有问题,主任说:“没啥问题,就是有点积液,会慢慢吸收。”让我年前回家前再来查一次。
  • 第三次复查: 主治医师看完再次直接把我领给主任(这种频繁转手让我直觉极其不对劲)。主任说:“手术口子封住了,但还有积液,打气也能解决。”让我初八上班后再来复查。此时我疑心大起,为什么这么急着让我一上班就来?

3. 忽悠我做“内路大手术”:
年后来复查,我直接问了两个问题:
我:“手术没问题吧?” 答:“没问题。”
我:“还有积液吗?” 答:“基本没有了。”
结果做完眼底彩照,主任画风一转,说有“玻璃体强牵拉”。给了两个方案:一是保守打激光打气,二是做内路手术(需要切除玻璃体,创伤极大)。主任倾向让我做内路。我不太愿意我说打激光定期复查行不行,他又把我推给主治医生打激光,主治医生说面积大涉及黄斑,打激光危险,还是让我做内路。从始至终主任都没提手术没把视网膜贴住

4. 找广州专家交叉验证:
整个人都不好了,直觉告诉我他们在掩盖什么。直接找黄牛买了广州中山眼科吕林教授(全国顶尖大拿)的号。
吕教授根据助理的初步诊断的结果用裂隙灯查了一下,直接推翻了深圳的结论:“强牵拉只是次要原因,根本原因就是视网膜都没贴好,还在漏水!” 吕教授表示,外路手术确实有失败率,建议我“再做一次外路手术试试”(保住了我不做破坏性极大的内路手术)。

5. 再次验证:
机缘巧合下,得知吕林教授的得意门生李永浩医生跳槽到了深圳出诊,第二天刚好有号。
李医生初诊确认口子看似封住了,但怀疑有小裂孔。他说:“术前肯定给你做了三面镜检查了” 我回想后确认绝对没做。
随后李医生给我做了“三面镜检查”(这是查微小裂孔的黄金标准,之前医生竟然全流程省了!),确诊:确实没封好,还在漏水,必须进行二次外路手术修补。


💡 避雷与血泪经验总结

  1. 医德比医术更重要(严重避雷深圳某医院主任医师马卉、主治医生蔡纯):
    手术没做好、有失败率,这些作为患者我都能接受。但为了掩盖外路手术没做好的事实,以“强牵拉”为由,忽悠患者去做创伤极大、极其伤元气的“内路玻切手术”,这绝对是违背医德的底线!连专家的徒弟听完都诧异:“外路手术没问题,为啥还要做内路?”
  2. 警惕不规范的检查流程:
    主治医师做眼底照相不散瞳,极其重要的三面镜排查也不做
  3. 遇到大病,花钱买时间/信息绝对值得:
    中山眼科的号虽然难抢,但黄牛能解决。面对要在器官上动刀子的事,一定要拿着 A 医院的报告去 B 医院找顶级专家交叉验证! 专家的视野和普通医生完全不在一个维度。


🙏 求助社区:二次修补手术在哪里做?

目前已经确诊需要做“二次外路修补手术”,这项手术比第一次难度更大(有疤痕和粘连),现在极其纠结,求懂行的 V 友给点建议:

  1. 留在深圳/广州做(找李永浩医生): 最方便,下周就能安排手术。李医生是吕林的徒弟,履历很强。顾虑: 在深圳被坑出了心理阴影,万一这次修补又没做好,大概率就只能做内路了。有 V 友熟悉李永浩医生的手术水平吗?或者深圳还有其他稳妥的专家推荐吗?广州做的话肯定手术没的说,但是手术排期太久了,特需的也要三周以上并且要完全自费
  2. 回老家郑州做(比如郑大一附院): 家人都在老家,能提供最好的术后照顾。顾虑: 跨省折腾,不清楚郑州眼底外科的水平,不知道手术好不好约、选哪个大夫做最稳妥。
  3. 关于检查项的查漏补缺: 目前术前术后做过眼底照相,术前做过 B 超和 OCT ,这次加做了三面镜。请问术前还需要做什么特殊检查来确保万无一失吗?

📄 附录:广州中山眼科及深圳门诊病历

深圳门诊病历

广州门诊病历

万分感谢大家!祝大家的身体都健健康康!