mise: 按目录切换工具版本

解决什么问题 同一台机器上,不同项目要的工具版本常常不一样:一个项目锁 Node 24,另一个已经升到 Node 26;CI 用 Go 1.27,本机系统包里是别的版本。 常见的几种做法各有问题: 做法 问题 系统包管理器(pacman、Homebrew) 一个工具只有一个版本,全局生效;要 root 或会影响全系统;版本跟着发行版走,不跟项目走 每种语言一个版本管理器(nvm / fnm、pyenv、gvm、SDKMAN) 每个都要单独安装、单独配置 shell,切版本的方式各不相同 手动下载解压,改 PATH 换项目时要记得手动切,很容易用错版本 mise(读作 “meez”,原名 rtx)是一个统一的工具版本管理器,用 Rust 写的。它的核心功能是:在项目目录里写一个 mise.toml 声明要哪些工具、哪个版本,进入这个目录时自动用这些版本,离开就恢复。 一个工具管所有语言和 CLI。 它最早是 asdf 的替代品,兼容 asdf 的 .tool-versions 文件,但更快,也不需要为每个工具单独装插件。 三个功能 mise 现在做三件事,都写在同一个 mise.toml 里: [tools] go = "1.27.0" node = "24.21.0" task = "latest" golangci-lint = "2.14.0" [env] GOPROXY = "https://goproxy.cn,direct" [tasks.test] run = "go test ./..." [tools]:工具版本,这是主要功能。 [env]:进入目录时设置的环境变量,类似 direnv。 [tasks]:项目命令,mise run test 执行,类似 make 或 Task。 后两个是可选的,只用 [tools] 也完全可以。 ...

Created 20206-10-20 · Updated 21216-10-21 · 2 min · 376 words · -

tsrs: 在 ENX 项目里试用 Rust 版 TypeScript 类型检查器

起因 先是在微信公众号上看到一篇介绍 tsrs 的文章,又读了 Cloudflare 的公告 Porting TypeScript to Rust。tsrs 在 Oxc 项目下孵化,Oxc 属于尤雨溪的 VoidZero。我一直关注尤雨溪的动向,早年也用过 Vue,对他团队出的东西比较信任,所以想在自己的项目 ENX 上试一下。 ENX 有两个 TypeScript 前端:enx-ui(Next.js)和 enx-chrome(Chrome 扩展,Vite 构建)。两边现在都用 TypeScript 6.0.3。 tsrs 是什么 把 TypeScript 7 的 Go 版编译器(tsgo)逐个函数移植到 Rust,命令行用法和 tsc 一样,许可证是 Apache-2.0。 由 Owner.com 的 Max Schwenk 发起,Cloudflare 和 VoidZero 参与,和 TypeScript 团队有合作。它不是 fork,语言方向仍由 TypeScript 团队决定。 对齐的是 TypeScript 7.1 开发版(microsoft/TypeScript@b85298b6a81f)。官方一致性测试的 13,462 条错误基线通过了 13,458 条,作者说剩下 4 条是测试工具本身的问题。 Cloudflare 的数据:同样数量的检查线程下,tsrs 比 TypeScript 7.0 快最多 8 倍,内存少约 70%。 仓库 2026-10-01 才建,到我试的时候已经发到 0.18.0。仓库不接受 PR。不支持 --init 和 --showConfig,没有 Intel Mac 二进制,Windows 包还没发布。 试用过程 为了不动项目依赖,我把 tsrs 装在一个临时目录里,再用它的二进制去检查两个前端: ...

Created 21216-10-21 · Updated 21216-10-21 · 2 min · 263 words · -

Dual Boot Windows 11 and Omarchy on Dell XPS 13 9310

目标与前提 在一台 Dell XPS 13 9310 上装 Windows 11(最新版)和 Omarchy 双系统。 关于 Omarchy:它是 DHH(David Heinemeier Hansson)在 2025 年做的一套基于 Arch Linux + Hyprland 的预配置系统,前身是基于 Ubuntu 的 Omakub。底层还是 Arch,用 pacman 和 AUR;桌面用 Hyprland(Wayland 平铺式合成器),配好了 Waybar、walker、终端、hyprlock 等,并带一套可一键切换的主题系统。引导器用 Limine。官网 omarchy.org,代码在 GitHub basecamp/omarchy。 Omarchy 本身的介绍、系统更新和装软件的方法见 Omarchy Linux,本文只讲双系统安装。 本文是一份安装顺序的初稿,实际操作前请再核对当前版本的官方文档(basecamp/omarchy 仓库 manual/50-dual-boot-install.md)。 推荐顺序 先调 BIOS,再装 Windows,最后装 Omarchy。 Windows 每次安装都会重写 EFI 引导项,先装 Linux 会被覆盖;反过来 Omarchy 的 Limine 引导器能扫描并接管已存在的 Windows。所以顺序是固定的:Windows 在前,Omarchy 在后。 同类流程可参考本站已有的 dual boot windows and ubuntu。 阶段 0:准备 备份数据。 在 Windows 里更新 BIOS 到最新版本(或用 Dell 的更新 U 盘)。9310 早期 BIOS 对 NVMe 和电源管理有已知问题。 记快捷键:开机按 F2 进 BIOS 设置,按 F12 进一次性启动菜单。 阶段 1:先改 BIOS 这一步要在装 Windows 之前完成。 ...

Created 4046-09-04 · Updated 20206-10-20 · 4 min · 650 words · -

Omarchy Linux

Omarchy 是什么 Omarchy 是 DHH(David Heinemeier Hansson)在 2025 年做的一套基于 Arch Linux + Hyprland 的预配置系统,前身是基于 Ubuntu 的 Omakub。底层还是 Arch,用 pacman 和 AUR;桌面用 Hyprland(Wayland 平铺式合成器),带一套可一键切换的主题系统,引导器用 Limine。官网 omarchy.org,代码在 GitHub basecamp/omarchy。 我的机器 机器 说明 Dell XPS 13 9310 Windows 11 + Omarchy 双系统,安装过程见 Dual Boot Windows 11 and Omarchy on Dell XPS 13 9310 SER8(AMD CPU) Omarchy 4.0.4,和另一套 Arch + KDE 双系统 版本与脚本位置 查看版本: omarchy-version # e.g. 4.0.4-1 Omarchy 的功能大多是一组 omarchy-* shell 脚本,也可以用总命令 omarchy <子命令> 调用,比如 omarchy update。脚本位置随版本不同: ...

Created 20206-10-20 · Updated 20206-10-20 · 3 min · 563 words · -

Long Polling and HTTP Keep-Alive: 长轮询与连接复用

客户端想"一有新消息就知道",但只能由客户端主动发请求(比如它在内网里,服务端连不进来),常用的办法是长轮询。这篇记录长轮询怎么工作,以及它底下的 HTTP 连接复用(keep-alive)是怎么回事。起因是给 homelab 配 GitHub Actions 自托管 runner 时,想弄清楚 runner 在内网里是怎么及时拿到任务的。 短轮询和长轮询 短轮询:客户端每隔固定时间问一次"有没有新消息",服务端立刻回答,有就给,没有就回空。 间隔设短了,大部分请求都是空跑,浪费流量和服务端资源 间隔设长了,消息要等到下一次轮询才能拿到,延迟最多一个间隔 长轮询:客户端发出请求后,服务端先不回答,把请求挂住: 挂住期间来了消息,立刻在这个请求上返回 一直没有消息,等到约定的时间(比如 50 秒)返回一个空响应 客户端收到响应(不管有没有消息)后马上发下一个请求 client server |---- GET /messages (wait up to 50s) ---->| | | no message yet, hold the request | | ... 12s later a message arrives |<--------- 200 [message] ----------------| |---- GET /messages (wait up to 50s) ---->| sent again immediately | | nothing for 50s |<--------- 200 [] (empty) ---------------| |---- GET /messages (wait up to 50s) ---->| 所以长轮询几乎任何时候都有一个请求挂在服务端,消息一到就能送出去,延迟接近实时;没有消息时每 50 秒才一个请求,空跑也很少。消息在两次请求之间到达也不会丢:服务端先把它放进队列,下一个请求一到就取走。 ...

Created 20206-10-20 · Updated 20206-10-20 · 2 min · 310 words · -

Cloudflare Services: Cloudflare 服务一览、R2 对象存储与 Tunnel

Cloudflare 起家是 CDN 和 DNS,现在的产品线已经覆盖网络、安全、开发者平台和存储。这篇先按用途列一遍常用服务,再单独讲 R2 对象存储和 Tunnel。各服务的额度和价格会调整,以官方文档为准(本文核对于 2026-10)。 服务一览 网络与安全 服务 说明 DNS 权威 DNS,免费。域名的 NS 指到 Cloudflare 以后,其他服务才能接上 CDN / 代理 DNS 记录打开代理(橙色云朵)后,流量先经过 Cloudflare 边缘节点,静态内容在边缘缓存 SSL/TLS 边缘证书自动签发;回源可用 Origin CA 证书(只被 Cloudflare 信任,有效期最长 15 年),模式应选 Full (strict) WAF / DDoS 防护 代理开着时自动生效,免费版有基础规则 Turnstile 人机验证,替代 reCAPTCHA,免费 Registrar 域名注册,按成本价续费,不加价 开发者平台 服务 说明 Pages 静态站点和前端项目托管,连 Git 仓库自动构建,见 Hugo + Cloudflare Pages 搭建个人博客 Workers 边缘 Serverless 运行环境,见 Cloudflare Workers KV 全球分布的键值存储,读多写少,最终一致 D1 基于 SQLite 的关系型数据库 R2 对象存储,兼容 S3 API,没有出口流量费,见下文 Durable Objects 带强一致状态的单实例对象,适合协同编辑、计数、WebSocket Queues 消息队列 Workers AI 在边缘调用推理模型 KV、D1、R2、Durable Objects、Queues 都可以通过 binding 注入 Worker 使用。 ...

Created 14146-10-14 · Updated 20206-10-20 · 4 min · 690 words · -

Markdown Viewer: 轻量 Markdown 预览工具

背景 在 Claude Code 会话里经常会生成一些 Markdown 文档,想快速看一下渲染效果。VS Code、Cursor 能预览,但启动慢,只为看一篇文档不值得。这里记录几个轻量的方案,以 macOS 为主。 Markdown 语法本身见 Markdown 语法。 方案对比 工具 类型 价格 适合场景 QuickLook + QLMarkdown Finder 预览插件 免费 只看不改,按空格即出 MarkEdit 原生 macOS 编辑器 免费 边看边改 glow 终端 TUI 免费 留在终端里读,跨平台 mdcat 终端渲染 免费 kitty / iTerm2 下能显示图片 Typora 所见即所得编辑器 付费 长文写作 Marked 2 预览器 付费 配合任意编辑器实时预览 日常用 QuickLook 看、MarkEdit 改就够了,两个都是原生应用,启动不到一秒。 QuickLook + QLMarkdown QLMarkdown 给 macOS 的 QuickLook 加上 Markdown 渲染,支持 GFM、表格、代码高亮、mermaid。 brew install --cask qlmarkdown 装完后首次需要打开一次 QLMarkdown.app,让系统注册扩展。之后在 Finder 选中 .md 文件按空格就是渲染后的效果。 ...

Created 20206-10-20 · Updated 20206-10-20 · 2 min · 243 words · -

Ansible Vault: 加密 Ansible 仓库里的密钥

解决什么问题 Ansible 仓库里迟早会出现密钥:数据库密码、API token、TLS 私钥。playbook 和变量文件要进 git,密钥如果跟着明文进去,所有能克隆仓库的人和程序就都拿到了它,而且会永远留在历史里。 Ansible Vault 是 Ansible 自带的加密功能(命令是 ansible-vault,不用另外安装)。它解决的是一件事:让密钥以密文的形式和 playbook 放在同一个仓库里,运行 playbook 时自动解密。 它和 HashiCorp Vault 没有关系,只是名字像。HashiCorp Vault(以及它的 fork OpenBao)是一个常驻的密钥服务;Ansible Vault 只是一个文件加密工具,没有服务端。 原理 加密后的文件是这样的: $ANSIBLE_VAULT;1.1;AES256 62313365396662343061393464336163383764373764613633653634306231386433626436623361 6134333665353966363534333632666535333761666131620a663537646436643839616531643561 ... 第一行是头部:格式版本 1.1,算法 AES256。用了 vault ID(见下文)时版本是 1.2,头部末尾多一个标签。 加密过程:从 vault 密码用 PBKDF2-SHA256 加随机盐派生出密钥,用 AES-256(CTR 模式)加密内容,再用 HMAC-SHA256 防篡改,最后转成十六进制文本。 整个仓库通常只用一个 vault 密码。谁有这个密码,谁就能解开所有加密文件。 两种加密粒度 加密整个文件 # Create a new encrypted file and open it in $EDITOR ansible-vault create group_vars/prod/vault.yml # Encrypt an existing plaintext file in place ansible-vault encrypt group_vars/prod/vault.yml # Edit / view without leaving a plaintext copy on disk ansible-vault edit group_vars/prod/vault.yml ansible-vault view group_vars/prod/vault.yml # Change the password ansible-vault rekey group_vars/prod/vault.yml 只加密单个变量 ansible-vault encrypt_string 's3cr3t' --name 'db_password' 输出可以直接贴进普通的变量文件,文件其他部分仍是明文: ...

Created 20206-10-20 · Updated 20206-10-20 · 2 min · 301 words · -

OpenTofu 入门:用 IaC 在 AWS 创建 VPC 和 EC2

什么是 OpenTofu OpenTofu 是 Terraform 的开源分支,用于以声明式的方式管理云基础设施(IaC,Infrastructure as Code)。 与 AWS CLI 的区别: OpenTofu AWS CLI 方式 声明式(描述终态) 命令式(执行具体操作) 状态管理 有 state 文件,追踪资源状态 无状态 典型场景 创建/销毁一整套基础设施 查询、临时操作 OpenTofu 和 AWS CLI 都直接调用 AWS API,不存在封装关系。 核心概念 Provider Provider 是 OpenTofu 操作各家云服务的插件,tofu init 时自动下载。 required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } Resource vs Data Source resource — 创建资源(EC2、VPC、安全组等) data — 查询已有信息,不创建资源 # 查询最新的 Amazon Linux 2023 AMI(不创建资源) data "aws_ami" "al2023" { most_recent = true owners = ["137112412989"] filter { name = "name" values = ["al2023-ami-2023.*-x86_64"] } } # 创建 EC2 实例(使用上面查到的 AMI ID) resource "aws_instance" "server" { ami = data.aws_ami.al2023.id instance_type = "t2.nano" } Variables 变量分两个文件: ...

Created 29296-04-29 · Updated 19196-10-19 · 7 min · 1329 words · -

Resend: 事务邮件发送服务

Resend 是什么 Resend 是一个面向开发者的邮件发送服务(ESP,Email Service Provider)。程序调一个 HTTP API,Resend 负责把邮件真正投递到收件人的邮箱。2023 年上线,主打 API 简单、文档清楚,同一团队还维护了用 React 写邮件模板的 React Email。 它主要用来发事务邮件(transactional email):注册验证、密码重置、账单通知、给管理员的告警。这类邮件是某个事件触发的、一对一的,和营销群发不是一回事(Resend 也有群发功能,叫 Broadcasts,这里不涉及)。 免费档每月 3,000 封、每天 100 封,对个人项目的通知邮件足够。具体额度以官网定价页为准。 为什么不自己发 服务器自己跑 SMTP 往外发信,基本进不了收件箱: 新 IP 没有发信信誉,Gmail、Outlook 会直接扔进垃圾箱或拒收。 云主机通常封了 25 端口出站(AWS EC2 默认就封)。 要自己处理退信、投诉、限速、重试。 ESP 的价值就在这里:它有养好信誉的发信 IP,处理退信和投诉,你只要证明「这个域名是我的,允许你代我发信」。 收信和发信是两件事 以 catglish.com 为例,两个方向用的是两套服务: 方向 服务 地址 作用 收信 Cloudflare Email Routing support@、privacy@ 别人写给这些地址的信,转发到我的 Gmail 发信 Resend no-reply@ enx-api 往外发通知邮件 Cloudflare Email Routing 只能收、不能发;Resend 只管发。两者的 DNS 记录互不冲突:收信的 MX 在根域 catglish.com 上,Resend 的记录在 send.catglish.com 子域和 resend._domainkey 上。 ...

Created 17176-10-17 · Updated 17176-10-17 · 2 min · 320 words · -

systemd linger: 注销后保持用户服务运行

linger 是 systemd-logind 的一个按用户设置的开关。打开后,这个用户的 systemd 用户实例(user@UID.service)在开机时就启动,并且在用户所有会话都退出后也继续运行。它解决的问题是:用 systemctl --user 管理的服务,默认只在用户登录期间存在。 默认行为(没有 linger) 每个用户有一个自己的 systemd 实例 user@UID.service,systemctl --user 操作的就是它。默认情况下: 用户第一次登录(SSH、图形界面、TTY 都算)时,logind 启动 user@UID.service,同时创建 /run/user/UID(即 XDG_RUNTIME_DIR) 用户最后一个会话结束后(默认再等 UserStopDelaySec=10s),logind 停掉 user@UID.service,删除 /run/user/UID 机器重启后,用户不登录,user@UID.service 就不会启动 结果是:systemctl --user enable 的服务,在用户登出后会被停掉,重启后要等用户登录才会起来;用户级的 timer 在没人登录时也不会触发。 打开 linger 之后 开机时就启动 user@UID.service,不等登录 所有会话退出后,user@UID.service 和 /run/user/UID 继续保留 用户级服务、timer、socket 像系统服务一样常驻 linger 只决定用户实例的生命周期,对系统级服务(/etc/systemd/system 下的 unit)没有影响。 命令 # enable linger for the current user (needs sudo or polkit auth) sudo loginctl enable-linger $USER # disable it sudo loginctl disable-linger $USER # check: Linger=yes / no loginctl show-user $USER -p Linger # logind keeps one empty marker file per lingering user ls /var/lib/systemd/linger/ /var/lib/systemd/linger/<user> 这个空文件就是全部的持久化状态,enable-linger 创建它,disable-linger 删掉它。做配置管理时(比如 Ansible),可以用这个文件判断是否已经打开: ...

Created 17176-10-17 · Updated 17176-10-17 · 2 min · 219 words · -

Claude Code 使用笔记

安装 Claude Code # macOS 用 brew 安装(推荐) brew install --cask claude-code # 或安装最新版 brew install --cask claude-code@latest # 用 npm 安装 npm install -g @anthropic-ai/claude-code 安装 cc-switch(多账号切换工具) brew install --cask cc-switch 安装后从 Launchpad 或用以下命令启动: open -a cc-switch 认证冲突处理 cc-switch 会设置 ANTHROPIC_AUTH_TOKEN 环境变量,若同时存在 claude /login 的 key,启动时会出现: ⚠ Auth conflict: Both a token (ANTHROPIC_AUTH_TOKEN) and an API key (/login managed key) are set. 想用 cc-switch 管理的账号: claude /logout 想用 /login 的 key: ...

Created 20206-04-20 · Updated 17176-10-17 · 8 min · 1585 words · -

ntfy: 用 HTTP 请求给手机发推送

ntfy 是什么 ntfy(读作 notify)是一个开源的发布/订阅推送服务。脚本用一个普通的 HTTP PUT/POST 把消息发到某个 topic,订阅了这个 topic 的手机 App、浏览器或其他脚本就会收到通知。 不需要注册账号,topic 第一次被用到时自动创建 服务端是一个 Go 程序,可以用官方的 ntfy.sh,也可以自己部署 客户端:Android(Google Play / F-Droid)、iOS(App Store)、网页(Web Push),都是开源的 典型用途是让无人值守的脚本在出结果时通知人:备份完成、CI 失败、定时任务出错、AI agent 跑完一个任务。 最简单的用法 手机装好 App,订阅一个 topic,比如 wiloon-enx-agent-7f3k9q,然后: # Plain message curl -d "Backup finished" ntfy.sh/wiloon-enx-agent-7f3k9q # Title, priority, tags (emoji shortcodes) and a link opened on tap curl \ -H "Title: enx-agent: #51 merged" \ -H "Priority: default" \ -H "Tags: white_check_mark" \ -H "Click: https://github.com/wiloon/enx/pull/203" \ -d "PR #203 merged, issue #51 closed" \ ntfy.sh/wiloon-enx-agent-7f3k9q 常用的请求头: ...

Created 17176-10-17 · Updated 17176-10-17 · 2 min · 406 words · -

Switching Cursor Pro to The X Subscription: Cursor 老用户的首年折扣

我之前订阅的是 Cursor Pro,每月 20 美元。2026 年 10 月 12 日,X 推出了统一订阅(The X Subscription),把 X Premium、Grok(SuperGrok)和 Cursor 合到了一个订阅里。我把 Cursor Pro 转成了统一订阅的 Premium 档。 同样是 Premium 年付,从 Cursor 那边转过去,首年约 16 美元/月;直接在 X 或 grok.com 上订,是 25 美元/月。这是给 Cursor 老用户的首年折扣,从 X 那边看不到。 为什么要换 我想要 X 的蓝 V(Premium checkmark),用来推广自己的产品 ENX。 写代码我主要用 Claude 的订阅,Cursor 用得不多,所以统一订阅里 Cursor 不包含 Claude 用量这一点,对我影响不大。 原来 Cursor Pro 一年 240 美元,统一订阅 Premium 年付原价 300 美元,多 60 美元,多出来的是 SuperGrok 和 X Premium+ 的权益。 统一订阅的档位 X 页面(x.com/i/premium_sign_up)上的年付价格: ...

Created 16166-10-16 · Updated 16166-10-16 · 2 min · 321 words · -

Token Bucket: 令牌桶限流

令牌桶(token bucket)是最常用的限流算法。它用两个数描述一条规则:令牌补充的速度,和桶最多能存多少个令牌。它要解决的问题是:既把长期的平均速度压住,又允许短时间内的一阵突发。 限流、熔断、降级三者的关系见 限流、熔断与降级,这篇只讲令牌桶。 原理 想象一个桶: 系统以恒定速度 r 往桶里放令牌,比如每秒 5 个; 桶最多装 b 个令牌,比如 60 个,满了再放的令牌直接丢掉; 每个请求进来先从桶里取一个令牌,取到就放行,桶空了就拒绝(或者排队等)。 所以 r 管的是长期平均速度,b 管的是一次最多能连发多少。b 也叫突发容量(burst)。 用 r = 5/s、b = 60 走一遍: 时刻 发生了什么 桶里的令牌 0 秒 用户闲了很久,桶是满的 60 0 秒 一口气发了 40 个请求,全部放行 20 0~4 秒 没有请求,每秒补 5 个 40 4 秒 又连发 50 个:前 40 个放行,后 10 个被拒 0 4 秒之后 每 0.2 秒补 1 个,只能按每秒 5 个的速度继续 0~1 停 12 秒 补满 60 规律: ...

Created 16166-10-16 · Updated 16166-10-16 · 3 min · 595 words · -

Rate Limiting, Circuit Breaker and Degradation 限流、熔断与降级

限流、熔断与降级 限流 Rate Limiting 限流是从系统的流量入口考虑,从进入的流量上进行限制,达到保护系统的作用 是指需要限制并发/请求量的场景 (如秒杀等) ,通过限流保护服务免受雪崩之灾。 计数器 多少次每秒/每分/每天,根据作用范围的不同,计算器可以分为单机计数器即Local Counter (每个机器都有自己的计数器) 和全局计数器也就是分布式计数器即Global Counter (所有机器公有一个计数器阈值) 令牌桶 令牌桶算法是网络流量整形 (Traffic Shaping) 和速率限制 (Rate Limiting) 中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 令牌桶的两个参数、和其他限流算法的比较、适用场景和 Go 示例,见 Token Bucket: 令牌桶限流。 漏桶 漏桶算法思路很简单,水 (请求) 先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。 方法 优点 缺点 计数器 简单方便 存在一下子被刷完计数器的情况 令牌桶 可以处理瞬间突发的流量 ~ 漏桶 限制请求的平均速率 不能处理瞬间流量的情况,当流量把漏桶装满后,大部分的请求都会被丢弃掉 熔断 Circuit Breaker 主调熔断 主调熔断是熔断的主要场景,在微服务中是结合服务注册和发现组件来使用的。主调通过服务发现组件来获取被调的实例,如果主调的失败达到了一个阈值,服务发现组件会熔断被调的实例。 被调熔断 被调熔断,被调实例获取当前的实例负载情况,如果cpu/内存/io 等超过了一定的阈值,那么就会触发熔断,将抛弃进来的请求。此时熔断和限流比较像,一个是基于负载情况,一个是根据配置的阈值情况。 降级 降级,是从系统内部的平级服务或者业务的维度考虑,流量大了,可以干掉一些,保护其他功能正常使用。 降级也就是服务降级,当我们的服务器压力剧增为了保证核心功能的可用性 ,而选择性的降低一些功能的可用性,或者直接关闭该功能。这就是典型的丢车保帅了。当服务暂时不可用或者影响到核心流程时,需要待高峰或者问题解决后再打开。通过降级实现部分可用、有损服务。主流的降级策略有基于RT (响应时间) 、异常比率和异常数的降级。 就比如贴吧类型的网站,当服务器吃不消的时候,可以选择把发帖功能关闭,注册功能关闭,改密码,改头像这些都关了,为了确保登录和浏览帖子这种核心的功能。 降级的手段大致有这么三种 强一致变为最后一致,延迟服务 干掉一些次要功能 简化流程 每个服务都需要制定自己的降级策略,根据服务不同的优先级来设定降级方案。另外降级策略最好是由开关系统或者配置系统统一控制。一般而言都会建立一个独立的降级系统,可以灵活且批量的配置服务器的降级功能。当然也有用代码自动降级的,例如接口超时降级、失败重试多次降级等。具体失败几次,超时设置多久,由你们的业务等其他因素决定。开个小会,定个值,扔线上去看看情况。根据情况再调优。 熔断和限流都可以认为是降级的一种方式 https://xie.infoq.cn/article/2593d1a3b9e1e06cac6502c4f?utm_source=rss&utm_medium=article 维护记录 时间 修改内容 原因 2026-10-16 文件重命名为 rate-limiting-circuit-breaker-degradation.md;补 url、英文标题、lastmod、分类和标签;令牌桶一节链到新文章 Token Bucket;修正表格分隔行 文件名含中文;新增令牌桶专文

Created 16166-10-16 · Updated 16166-10-16 · 1 min · 79 words · -

WCAG: Web 内容无障碍指南

WCAG 全称 Web Content Accessibility Guidelines,中文一般译作「Web 内容无障碍指南」,是 W3C 发布的一套规范,规定网页要做到什么程度,才能让视力、听力、行动或认知有障碍的人也能正常使用。这里的「障碍」范围比想象中宽:色弱、老花、在强光下看手机、手腕受伤只能用键盘,都算在内。 我第一次认真对照它,是给自己的项目调灰色辅助文字的颜色:原来的灰字在白底上对比度 4.7:1,刚好过线;在浅灰背景上只有 4.3:1,没过线。下面是我整理的要点。 版本 版本 发布时间 说明 WCAG 2.0 2008-12 后来被采纳为国际标准 ISO/IEC 40500:2012 WCAG 2.1 2018-06 在 2.0 上增加移动端、低视力、认知相关的条款 WCAG 2.2 2023-10 再增加 9 条(如焦点不能被遮挡、点击目标最小尺寸),删除了过时的 4.1.1 Parsing WCAG 3.0 草案 打算换一套评分模型,还没定稿,不能拿来做合规依据 2.x 各版本向后兼容:满足 2.2 就自动满足 2.1 和 2.0。现在各国法规引用最多的是 2.1 AA,新项目直接按 2.2 AA 做就行。 四个原则:POUR 所有条款归在四个原则下: Perceivable(可感知):信息要能被感知到。图片有替代文字,视频有字幕,文字和背景有足够对比度,不能只靠颜色传达信息。 Operable(可操作):界面要能被操作。所有功能都能用键盘完成,焦点位置看得见,不设置让人来不及反应的时间限制。 Understandable(可理解):内容和操作方式要能看懂。页面声明语言,表单出错时说明错在哪、怎么改,同样的控件在不同页面行为一致。 Robust(健壮):能被各种浏览器和辅助技术(如读屏软件)正确解析。主要靠语义化 HTML 和正确使用 ARIA。 三个等级:A、AA、AAA 每条「成功标准」(success criterion)都标了等级: A:最低要求,做不到会让一部分人完全用不了。例如 2.1.1 键盘可操作。 AA:通行的合规目标,法规和公司规范基本都要求到这一级。例如 1.4.3 文字对比度 4.5:1。 AAA:最高要求,W3C 自己也说不建议把整站 AAA 作为目标,因为有些内容做不到。例如 1.4.6 文字对比度 7:1。 说「符合 WCAG 2.2 AA」,意思是 A 级和 AA 级的条款全部满足。 ...

Created 15156-10-15 · Updated 15156-10-15 · 2 min · 389 words · -

Linux Containers on macOS: Colima, Apple container, OrbStack

macOS 内核不能直接跑 Linux 容器,所有方案都是先起一个 Linux 虚拟机,再在里面跑容器运行时。区别在于虚拟机怎么起、几个容器共用一台虚拟机、对外提供什么 CLI。 分层 层级 例子 作用 容器运行时 containerd、Docker Engine 拉镜像、起容器,跑在 Linux 里 Mac 上的 Linux 环境 Colima(基于 Lima)、Apple container、OrbStack、Docker Desktop 在 macOS 上提供 Linux 虚拟机,并把 CLI 暴露给宿主 CLI nerdctl、docker、container 用户敲的命令 containerd 和 Colima 不是同一类东西:containerd 是引擎,Colima 负责给 containerd 准备一台 Linux 虚拟机。 Colima 基于 Lima,所有容器共用一台 Linux 虚拟机 运行时可选 docker 或 containerd,选 containerd 时用 nerdctl,和 Linux 服务器上的用法一致 支持 compose(nerdctl compose 或 docker compose),可选内置 k3s MIT 协议,商用免费,只有 CLI brew install colima # native arm64 VM, use Rosetta for amd64 images colima start --arch aarch64 --vm-type vz --vz-rosetta --runtime containerd colima nerdctl -- run --rm hello-world colima list colima stop 注意 --arch x86_64 会让整台虚拟机走模拟,在 Apple Silicon 上很慢。需要 amd64 镜像时,用 arm64 虚拟机加 --platform linux/amd64 构建即可。 ...

Created 15156-10-15 · Updated 15156-10-15 · 2 min · 252 words · -

Doubao IME 豆包输入法

豆包输入法 macOS 上的 AI 语音输入法,来自字节跳动。参见 macOS Apps 中的输入法列表。 官网:shurufa.doubao.com 手动安装:官网下载 DoubaoImeInstaller_*.zip,双击安装器按 GUI 引导完成 Homebrew:brew install --cask doubaoime,安装到 /Library/Input Methods/DoubaoIme.app Ansible(w10n-config 仓库,内部同样用 Homebrew Cask;已有官网安装时首次加 --force 接管): cd infra/homelab/workstation task install-doubao-ime brew install --cask doubao 安装的是豆包 AI 聊天客户端,不是输入法。 装好后还需在系统设置中手动完成: 键盘 → 输入法:添加「豆包输入法」 隐私与安全性:为豆包输入法开启辅助功能;使用语音时需允许麦克风 若菜单栏或切换异常,注销或重启后再试 语音输入后自动切回英文输入法 豆包的跨输入法语音输入结束后会停在豆包拼音上,不会切回原来的输入法。我用 Hammerspoon 监听麦克风状态补上了自动切回,见 Doubao IME Voice Input: 语音输入后自动切回英文输入法。 竞品 以下是 macOS 上中文语音输入的几类选择,整理于 2026-10,产品和价格变化快,以各家官网为准。 中文输入法自带语音 和豆包用法一样,都是在一个输入法里带语音输入。 产品 说明 讯飞输入法 Mac 版 中文语音识别做得最久,方言、专业术语、长句的口碑好 微信输入法 Mac 版 免费、轻量,有语音输入 搜狗输入法 Mac 版 有语音输入,Mac 版的语音体验一般不如手机端 百度输入法 Mac 版 同上 豆包的优势在大模型带来的标点、断句和口语整理(去掉「嗯」「那个」等),并且免费。 ...

Created 10106-07-10 · Updated 15156-10-15 · 1 min · 143 words · -

Doubao IME Voice Input: 语音输入后自动切回英文输入法

问题 我平时在 macOS 上停在英文 ABC 输入法。豆包输入法 开了「跨输入法启用语音」后,在任何输入法下都能用快捷键唤起豆包的语音输入,我设置了两个键: 模式 快捷键 用途 按住说话,松开结束 Fn 短句 按一下开始,再按一下结束 右 Option 长段 唤起时豆包会把系统输入法切到豆包拼音,语音结束后不会切回来。接下来打字就是中文,每次都要再按一下切回 ABC。 我想要的效果是:语音输入结束后自动回到唤起前的输入法。豆包当前版本没有这个选项,所以用 Hammerspoon 补上。 第一版:监听按键(不成功) 最直接的思路是监听快捷键:按下时记下当前输入法,结束时切回去。 Fn 模式:松开即结束,不用记状态 右 Option 模式:数按键次数,按单数次记下输入法,按双数次切回 写好后按 Fn 测试,没有切回。在脚本里加了日志才看出两个问题。 Hammerspoon 没有辅助功能权限 日志里 hs.accessibilityState() 一直是 false。权限要在「系统设置 → 隐私与安全性 → 辅助功能」里开,不是左侧栏顶层那个「辅助功能」(那里是 VoiceOver、缩放这类功能)。 开了之后还是 false,原因是 macOS 的这个权限只在进程启动时生效。我在设置里关了再开、删掉再加回来都没用,Hammerspoon 一直是开权限之前启动的那个进程。退出 Hammerspoon 再打开后,权限才变成 true。 豆包把 Fn 吞掉了 权限正常以后,Control、Caps Lock、右 Option 都能在日志里看到,Fn 一次都没有出现。我又用 hs.eventtap.checkKeyboardModifiers() 轮询 Fn 的按下状态,按住 Fn 说话的整个过程中也一直读到未按下。 所以豆包在更底层把 Fn 拦截了,Hammerspoon 拿不到这个键的任何信息,靠按键判断的方案走不通。右 Option 倒是能收到,但切换模式要数按键次数,如果用 Esc 或鼠标结束语音,计数就会错位。 ...

Created 15156-10-15 · Updated 15156-10-15 · 3 min · 455 words · -