阅读视图

说说:#1754403236

新主题Tulip计划8月8日发售,定价的话最终决定还是低一些,按照老用户首发和MyDiary价格一致为69元,非老用户就是和MyLife首发的99元一致。新主题刚出炉,还有许多计划中的功能没有做,慢慢来吧!还要写一篇宣传文hhhh。

主题功能和之前的主题有一半以上都是不一样的,都是全新设计的功能,也有许多之前主题有的功能在这里精简掉了。而且可以支持最新版的Typecho开发版。这里是演示地址,适合日常使用。https://store.mmbkz.cn/demo/tulip/

写主题是真的累啊,以后再也不写这种复杂主题了。

  •  

正在开发中的 DNS-Response-Replacer-JS

域名解析结果替换JS DNS-Response-Replacer-JS 是我正在开发的一个用来替换DNS解析结果的工具。目前用于将使用 Cloudflare CDN 的网站域名解析结果替换为使用 Cloudflarespeedtest 优选结果。

本文写一些开发过程中的碎碎念。


Cloudflare 优选IP那些事

Cloudflare 这玩意不用我介绍了。我只能说这是我目前已知的能在网站受到攻击后不会以优先抛弃用户为操作准则的免费CDN。阿里腾讯那些狗屎CDN基本是只要用户被黑产瞄准后就优先抛弃用户。

唯一的问题是 Cloudflare 默认分配的IP在中国基本上很难用,速度很差,经常连接超时,甚至会被干扰(比如Cloudflare 流量遭大规模斗地主)。

在这种环境下,社区诞生了 Cloudflare IP优选工具 XIU2/CloudflareSpeedTest 。只不过这个工具只负责进行IP优选,具体使用则或是需要用户自己修改 Hosts,或者使用 iptables 这种复杂的网络工具,或者使用 3Proxy 配置代理或 mosdns 这种很难配置的DNS服务器,无论哪一个都很麻烦。

为此我想到的是,只是替换一个DNS解析结果,既不至于一个一个抠草莓籽,也不至于非要用麻烦复杂的工具大牛拉小车,不如自己造个轮子。


选型实现

首先是要选使用什么编程语言做这件事。

我个人目前能流畅使用的编程语言有 PHP、Javascript、bash 。这种复杂的本地应用,PHP 和 bash 都不适合,那能用的就只有 Javascript 了 。

我在使用 Javascript 和 Python 之间也纠结过一阵子,毕竟现在 Python 因为AI的原因实在是火得离谱了,前几年是个人就要吹自己会 Java,现在是个人就要吹自己会H5,马上过几年就得吹 Python 了。

图片来源:《震惊!开源项目Phobos开发者竟被大主播冒名顶替》

不过 再不学 Python 你就要被淘汰了 这个梗都过时了。

当然我是没完全用 Python 做过开发的,但是这种单一需求,现学现用应该也不是很难。

但是最终几个因素还是让我选择了js而不是py。

  1. Python 本地化应用我不知道最终部署后有多大的库依赖性,毕竟本身 Python 这玩意开发过程中装库的时侯就乱七八糟,又有全局安装又有虚拟环境。Node 这边我是知道只要 Node 能跑起来后所有乱七八糟的包和库都能打包
  2. 用AI问了一下,基本所有AI给得结论都是: Node 的性能比 Python 高的。这个有点反直觉,毕竟我骂了 Node 的服务端性能这么多年(毕竟我是写PHP的,且PHP也是免编译的解释性语言),突然冒出来个比 Node 还有历史的语言,热度远高于 Node,性能却比 Node 差
  3. 我没有做过纯 Node 开发,也没有做过 Python 开发。这两点生疏程度是一样的。但是 Javascript 的前端开发我是很熟悉的,大部分语言特性大坑我还是知道的,使用 Javascript 能避免摔很多跟头
  4. 最主要的还是,这种场景下,选择使用 Python 基本不会对自己的行业能力有多大提升。毕竟我是从通信网络测试自己转到软件开发的,这一块的区别我是亲身体验过的。学生阶段的自己写着玩和职业编程的差距就是天壤地别。这个时候用 Python 写程序的话基本就是闹着玩的级别,没什么学习价值,毕竟代码量工程量太小了。

使用AI起基本框架

这一块我偷懒了。

原本的开发流程,应该是先找个用 Node 实现的DNS服务器的开源项目,或者找对应的 Node DNS 解析库,然后照葫芦“切”瓢,一边研究DNS库怎么用,一边把对应的域名解析替换结果实现。

有了AI之后,直接让AI生成一个用 Node 实现的DNS服务器就得了,省去了到处翻开源项目然后被根本就跑不起来的不靠谱项目坑的过程。

其实也没多少代码量。也都说了,本身就是把拿到上游的解析结果中属于 Cloudflare CDN 的结果替换成指定的IP地址。唯一的难点也只在于,如何在没有 ipset 的场景下,判定一个 IPv4/IPv6 属于一个CIDR块。

基本功能一个下午就实现了。我其实也就是判定 A 记录和 AAAA 记录中有没有 Cloudflare 地址,其他类型一律不改动直接转发。

本质上这就是一个域名解析服务器。

把本机的DNS地址改成127.0.0.1,用了一天,没出问题。Cloudflare 的 IP 能正常更改成优选IP,非 Cloudflare 能够正常转发。

直接访问使用 Cloudflare CDN 的网站,速度快到起飞。爽!


我哪知道 DNS over TCP 是标配功能啊

不出意外的话,就要出意外了。

第二天也继续用自己写的服务做域名解析。

然后在我尝试使用淘宝的时侯,解析失败了……

用nslookup和dig测试对应的域名,100%复现。用对应的域名请求上游服务器,无问题。

“为啥?”我十分困惑。

检查了一下日志发现我写的服务根本没收到DNS请求。而当我直接向上游做DNS查询的时候,系统却是发了一个 TCP 请求。

啥? DNS over TCP ?这玩意是系统标配?我一直以为 DNS over TCP 就和 DoT DoH 一样只是个进阶的可选方案,没想到这玩意是标配。

(突然感觉自己老了)

简单来讲,传统的 DNS over UDP 包太小(512字节限制),超了这个限制,麻烦就不断。UDP当然能支持大于512字节的包(已存在对应的DNS扩展协议),但是连路上可能又会有其他设备把这一个包分片或者其他的处理错误。反正这破事光靠UDP是解决不了。

赶紧又写了一段 TCP 监听的代码。这玩意卡了我半天,因为 Node 的 UDP 库 和 TCP 库,风格完全不一样,而我 DNS 解析的那段代码写得太耦合了,半天扣不出来。最后没办法,不想抠了,直接写了段独立的完全仅代理DNS over TCP 的代码。我也是没发现用 Cloudflare CDN 有用到 DNS over TCP,Cloudflare 的结果基本都是一个域名对应两个IP,没有那么大,不会超过需要 DNS over TCP 才能处理的情况。

我也说了,这玩意基本是个人用,没必要做到企业级产品化的完成度。


UNKNOWN_65又是啥

调试的时候优化了一下日志输出,然后就看到一大堆 UNKNOWN TYPE 65 日志。

SCVB HTTPS。https://datatracker.ietf.org/doc/rfc9460/?include_text=1

DNS如今已经变得这么复杂了吗?

(顿时觉得自己快被淘汰了)


本地化部署那些事

这玩意自用也就是这么回事,但是如果想开源发布的话,就得考虑其他人如何安装这玩意。

打包

前文也说了,我没做过 Node 的本地化应用。打包这事情我是不知道怎么做的。

Linux 端目前我就是 sudo node dns-response-replacer-js.js 就跑起来了。确切的说还不是 sudo node 而是 sudo [全路径]/node,因为 node 官方给的安装方案把 node 安装到了当前用户目录下了(~/nvm/versions/node/v22.17.1/bin/node)。够傻的。

Windows 端我更是不知道怎么搞才是正确的。全局安装 Node 这事情放在菜鸟用户端不可能。我现在就直接把整个 node 官网提供的二进制文件都扔到项目文件夹里,然后 node 跑起来。Windows 端监听 53 端口不需要管理员权限这事情我也不知道该说啥好,但是弹出来的一次性防火墙设置要是选错了,我也不知道该去哪里改。

网络配置

前文也多次提到了,这玩意本质上是一个DNS服务器,而且严重依赖上游服务器。

我本机是 Linux Mint 22.1,基于 Ubuntu 24.04。Linux平台的resolv.conf的问题我就不多说了,对Linux网络配置熟悉的人基本都知道这玩意的恩怨情仇,不了解的朋友也只要知道:“这个保存着DNS服务器IP的resolv.conf文件在最近十多年间一直被各个阵营乱七八糟的应用接管,但一直就没个定数,更没有官方的简单的正规的清晰的明确的文档和配置指南”。

而Windows那边就更别提了,Win10/Win11就是Win7的套皮。Win10的网络配置套皮更是根本就没做完。

当然,与其说是没做完,到不如说是照搬照抄的 Android。 但是!原生 Android 的网络配置本身就是个残疾!

DHCP网络配置可以单独修改DNS这个设置自Win9x就是个功能项,但是因为Win10完全是照抄的安卓设计风格,所以直接把错误答案抄上去了。(就这操作,微软应该聘请姜萍)

Win11 倒是重新设计成 IP 和 DHCP 可以分开配置了。但是 Win11 是同时照抄了 MacOS 和 Android,设计更是混乱。好在 Win11 提供的配置页面藏得比 Win7 还深,所以大部分人配置网络配置会直接点开 Win7 的经典网络配置选项卡。(微软你自己也知道自己做的这玩意就是一坨屎啊)

不过当然,把DNS配置成 127.0.0.1 之后,不论是Win7还是Win10还是Win11,DNS配置在属性状态页都不显示。

(要是2030年微软再出个操作系统然后还继续用Win7的功能界面,那就是2010年的Bug一直带到2030年,满20年)

仅是操作系统这么烂就已经导致指导用户操作会变成一个巨大的障碍。

我想实现的是,依靠一些脚本,能实现把用户当前的DNS配置备份到文件,然后将本机DNS设置成127.0.0.1。等有需要时再通过备份文件把配置恢复。

这一块,Linux目前我只会操作 resolv.conf。理论上只要网络环境不变化(不重启,不断网,不DHCP续期),这个文件就不会变化,那我每次开机后手动把 nameserver 127.0.0.1 覆盖到 resolv.conf 应该就可以?但实际上 resolv.conf 的内容总是毫无规律的恢复成默认配置。至于 Windows,我更是懒得去弄。

懒。不想弄。目前的功能上我够用了,一下子就没动力继续开发了。


开源

我得说我没少给开源项目提过 Pull request,但是几乎没有收到过 Pull request。

虽然一方面我做的项目,小而精的基本都是拿来即用且完全没有修改的必要,大而肿的基本没人用。

当然最讨厌的一点,还是国内很多人拿了就用,有新功能新特性自己偷摸改了之后直接改了名字说是自己原创的,或者干脆像某为这种流氓公司一样直接就拿开源项目说自己做的,然后背地里还在你的issue提一堆乱七八糟的新需求,但是一点贡献都没有。

本身开源项目就是希望有相同需求的开发者能合作解决同一个痛点,但是现状就是很残酷的一个开发者给一堆白眼狼打工。

目前还有的可以填的坑:

  • 支持 DNS over TCP 时的结果替换
  • 更好的上游DNS查询方式(目前严重依赖配置文件中的第一条DNS服务器)
  • 更好的本地缓存方式(目前使用的是同步保存到json文件)
  • 支持 DNS over TLS
  • 支持 DNS over HTTPS
  • 支持 SVCB/HTTPS
  • 热重载配置文件
  • 支持其他 CDN 的解析替换
  • 实现 Docker 部署
  • 实现 Windows 服务
  • 实现 Linux 服务
  • 实现 Openwrt 服务
  • 实现域名黑名单功能
  • 实现IP黑名单功能

尤其是后两个,问题很严重。

第一个,目前 Cloudflare 官方提供的 [IP地址范围/IP Ranges] 并不是 100% 正确的,有很多IP地址并不属于 Cloudflare,而是由其他公司或组织在使用。如果遇到解析结果包含在 Cloudflare 官方提供的地址范围但实际所属并不是 Cloudflare CDN,会导致对应的域名无法访问。

第二个,部分 Cloudflare 的高级客户可能有自己独立的IP段,这些网站无法使用其他IP进行访问。以前单纯只用 Cloudflare IP 优选的时候就遇到过,明明网站请求头有 Cloudflare 的信息,页面也调用了 Cloudflare 验证码,但是使用优选IP就是会导致网站无法访问。


现状

反正我自己够用了,继续开发的动力一下子就没那么强烈了。

谁要是有一样的痛点那就自己写代码自己弄去,能发 Pull request 提交新功能更好,反正我也强求不了。我也没啥动力,反正又没人给我钱。

无名无利的,谁愿意费那么多劲。

The post 正在开发中的 DNS-Response-Replacer-JS first appeared on 石樱灯笼博客.
  •  

使用 LiteLLM 自建 Claude Code 中转服务

最近 A 站大规模封号,导致之前的号商的中转大都歇菜了,另外加上国内用户在使用 Claude Code 时常常面临网络限制、账号注册门槛等难题。如何绕过这些障碍,稳定、高效地使用 Claude Code?答案是:自建 Claude Code 中转服务!

今天,我们将介绍如何利用开源工具 LiteLLM 自建 Claude Code 中转服务,不仅能规避官方限制,还能灵活调用多种语言模型(如 OpenAI、Vertex AI、xAI 等),实现成本优化和高效开发。无论你是个人开发者还是团队用户,这篇保姆级教程都能帮你快速上手。

LiteLLM 是什么

LiteLLM 是一个轻量级的开源代理工具,支持将 Claude Code 的 API 请求转换为多种语言模型的格式,兼容 Anthropic、OpenAI、Vertex AI 等主流模型。通过 LiteLLM,你可以:

  • 绕过地域限制:无需海外账号,国内也能流畅使用 Claude Code
  • 灵活切换模型:支持多种模型(如 Claude Sonnet、GPT-4o、Gemini),按需分配任务以优化成本
  • 本地部署:数据隐私更有保障,适合对安全性要求高的项目
  • 开源免费:完全开源,社区活跃,易于扩展和维护

实操

litellm 主要使用 python 编写,部署途径有两种,我这里方便操作使用镜像方式

  • ghcr.io/berriai/litellm:main-latest
  • 国内镜像 ccr.ccs.tencentyun.com/k7scn/litellm:main-latest

使用 compose 部署

  • docker-compose.yaml
services:
  litellm:
    image: ccr.ccs.tencentyun.com/k7scn/litellm:main-latest
    container_name: litellm
    command: --config /app/config.yaml --detailed_debug
    environment:
      - OPENAI_API_KEY=sk-PpJVj1N7Btoken
      - OPENAI_API_URL=https://api.example.ai
      - LITELLM_MASTER_KEY=sk-nb666
    volumes:
      - '/data/litellm/config.yaml:/app/config.yaml'
    ports:
      - '4000:4000'
    restart: always

本文示例使用的是某中转 claude 服务商

  • /data/litellm/config.yaml
litellm_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

model_list:
  # Responses API models
  - model_name: claude-sonnet-4-20250514
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/OPENAI_API_KEY
      api_base: os.environ/OPENAI_API_URL
      cache_control_injection_points:
        - location: message
          role: system

启动完成后,在环境里配置

export ANTHROPIC_BASE_URL=http://127.0.0.1:4000
export ANTHROPIC_AUTH_TOKEN=sk-nb666
claude --model claude-sonnet-4-20250514
# 或者在claude里使用/model设置

一分钱一分货,真是贵的可怕。

后续高级玩法

  • 多模型协同:通过 LiteLLM 的路由功能,为不同任务分配不同模型。例如:
  • 代码生成:Claude-3-5-Sonnet
  • 语法检查:GPT-4o-mini
  • 复杂架构分析:Gemini-1.5-Pro

在配置文件中添加更多模型和提供商

总结

通过 LiteLLM 自建 Claude Code 中转服务,你不仅能绕过地域和账号限制,还能灵活调用多种模型,兼顾性能与 成本。这种方式特别适合国内开发者,既省钱又高效!无论你是想快速生成代码、优化开发流程,还是探索 AI 编程的更多可能,这套方案都能让你事半功倍。

其他

本文主要参考两个文档

  •  

一款简洁、美观的 WordPress 友情链接插件

近日,我开发了一款全新 WordPress 友情链接插件。该插件简洁、美观、易于使用。

可以访问以下链接查看实际展示效果:友情链接展示页

插件特性

  • 响应式布局:在桌面端默认每行展示 3 个链接,并能根据屏幕尺寸自动调整,在平板和手机上也能完美呈现。
  • 信息展示丰富:每个链接均会展示对方网站的 Favicon(头像)和博客名称,一目了然。
  • 灵活的排序方式:支持固定排序和随机排序两种模式。设置为随机排序后,每次刷新页面都会带来全新的链接顺序。
  • 智能头像获取:自动通过 favicon.im 服务抓取网站头像。同时支持手动指定头像链接,或在留空时显示默认头像。
  • 简洁的管理后台:后台管理界面操作直观,美观大方。
  • 纯净无残留:启用时自动创建专属数据表,禁用时彻底删除,不在数据库留下任何冗余数据。
  • 数据轻松迁移:内置导入/导出功能,方便备份和恢复友链数据。

使用方法

1. 下载与安装

可从以下链接下载该插件:点此下载

下载 .zip 压缩包后,在 WordPress 后台的“插件”—>“安装插件”页面上传并启用。

2. 插入短代码 (Shortcode)

在任意页面或文章中插入短代码即可展示友情链接。

如何在编辑器中插入?

  • Gutenberg (区块编辑器):添加“自定义 HTML”区块,将短代码粘贴进去即可。
  • Classic Editor (经典编辑器):直接在文本编辑模式下粘贴短代码。

未来计划

计划将此插件移植到 Typecho 平台。

致谢

在插件的开发过程中,AI 提供了巨大帮助,特此感谢科技的力量。

经过两天的密集调试,目前插件运行稳定,暂未发现明显 Bug。欢迎提出宝贵的意见和建议,或是一同参与改进,让它在保持简洁、美观、易于使用的同时可以变得更好。

  •  

MovieRecord

MovieRecord

一款typecho影视记录插件(插件运行在php7.4、Typecho1.2.1版本上没有问题。部分主题可能不兼容)

使用

在文章或者页面填写封面、名称、链接使用。

[movie img="https://img1.baidu.com/it/u=3042287271,1241422176&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=701" name="仙逆" url="https://example.com/movie1"]

下载

截图展示

一款typecho影视记录插件.webp
  •  

GameRecord

GameRecord

一款typecho游戏记录插件(插件运行在php7.4、Typecho1.2.1版本上没有问题。部分主题可能不兼容)

使用

在文章或者页面填写logo、角色名、时间使用。

[game logo="图标地址" name="游戏名称" nickname="游戏昵称" time="游戏时间"]

下载

截图展示

typecho游戏记录插件GameRecord.webp
  •  

LinkShow

LinkShow

typecho友情链接显示插件(插件运行在php7.4、Typecho1.2.1版本上没有问题。部分主题可能不兼容)

使用

在文章或者页面内填写logo、名称、地址、介绍使用。

[linkshow]
[link logo="图片地址" name="网站名称" nickname="网站昵称" url="链接地址" intro="网站介绍"]
[link logo="图片地址2" name="网站名称2" nickname="网站昵称2" url="链接地址2" intro="网站介绍2"]
[/linkshow]
其中,nickname="网站昵称2"可以删除使用非必用

下载

截图展示

typecho友情链接显示插件LinkShow.webp
  •  

BlogSubscribe

BlogSubscribe

一款博客订阅插件(插件运行在php7.4、Typecho1.2.1版本上没有问题。部分主题可能不兼容。)

使用

通过在插件后台输入订阅地址,通过短代码调用,在你需要放的位置使用下方短代码

[blog_subscribe]

插件下载

效果截图

typecho博客订阅插件BlogSubscribe.webp
  •  

2025年7月阅读书摘

✇Dennis
作者Domon

7月阅读记录

  • 《在中国大地上》Done
  • 《如何找到想做的事》Done

7月阅读书摘

《在中国大地上》

第三章 开往北京的90次夜车

  • 我问这是什么战争,春歌的丈夫答道:“这不是战争,只是一段过渡期而已。如果足够了解中国历史,你就会明白的。在我们四千六百年的历史中,每逢改朝换代,都会有一段动荡不安的时期,短则六十年,长则一百年。

第四章 上海快线

  • 2025年7月阅读书摘

    在中国,一直有个难题。如果有什么地方风景特别好看,人们就会蜂拥而至,然后美景就被人群毁了。

  • 由于一整天都在人群中钻来钻去,我问道:“你觉得中国人以后会有私家车吗?” “极少数人会有的,但不是为了图享受,而是为了做生意。我们想要做的,是生产汽车,然后卖到国外去。出口市场才是我们的兴趣所在。”

  • 然后我眼前就浮现出一堆红卫兵,他们手里拿着长剪子,脸上露出狰狞的笑容,沿着南京路一路往前,边走边寻觅哪里有肥大的衣袖或者飘逸的长发。他们挥起长剪子,开始不停地剪,剪,剪!我意识到,一个狂热的青少年,手里要是握着一把剪子,简直比端着步枪的士兵还可怕。

  • 潘教授在这方面是个典型,但他给人的印象却不会因此而减弱。他轻声笑了笑,说:“美国人没理由惧怕中国人,一点理由都没有。在这世上,中国人只对两样东西感兴趣——权力和金钱。美国是最有权也是最有钱的国家,所以中国人永远都需要跟美国搞好关系。”

第五章 开往广州的快车

  • “我不是在说他们——我讲的是投资者的信心好像正在消退。这就是为什么未来三四年至关重要了。很多公司都已经撤离,他们既不是慈善家也不是空想家。他们想赚钱,如果赚不到钱,他们就走。中国市场正处于大规模扩张阶段,但目前为止还没有得到很多回报——因此没有理由让人寄予厚望或者吸引大规模投资。泡沫是会破裂的,而且一旦破裂,这里就会变成地狱。五年之内我们就会知道这样的事会不会发生。

  • 共同奋斗'是他们经常使用的说法,体现着某种团结一致的思想,而如今这种思想已经销声匿迹。他们不再友善,不再礼貌。我觉得他们已经迷失,他们的结局会很可怕。

第八章 开往西安的104次列车

  • 正午时分,列车停在了处于铁路枢纽位置的宝鸡市。一位先生告诉我:“渭河里没有鱼。”然后,他大声清了清喉咙,往站台上吐了一口痰,随即习惯性地出于礼貌,用鞋底把痰擦了擦。 每个人都会像这样清嗓子、吐痰,他们的痰有时会成滴快速落下,有时则会拉成细条缓缓下流,就像顺着痰盂边缘而下的烛蜡。一般他们都会吐在垃圾篓里或者树干旁边,但就算政府专门发起倡议,也无法阻止一部分人随地乱吐,我见过有人把痰吐在地毯上,并且还记得要礼貌地用鞋底去抹两下。

  • 这对中国人来说再好不过了。或许他们已经认识到,游客的好处就在于他的注意力集中而短暂。对政府而言,游客要是只把观光作为旅行目的就太完美了。他们来访,去各处景点参观,等到把所有地方都转了个遍,就会马上离开。不以观光为目的的人往往会驻足徘徊,他们不看博物馆的介绍,喜欢问尴尬的问题,不是让人感到心惊胆战,就是把人搞得垂头丧气,所以他们最好不要来。

第十六章 开往大连的火车:92次列车

  • 虽然我在中国见过很多胆小鬼,但坚忍不拔却是中国人最大的特点。

第十七章 开往烟台的“天湖号”游轮

  • 我想起了自己身边所有自命不凡的人和自认为无所不知的人,以及那些讨厌的教师、评论家和书评家,我希望他们都被赶上去内蒙古的火车,到那里去铲猪粪,住牲口棚。不过,我当然也会在其中。在中国,不干体力活的人通常都被称作知识分子。这群人太招人烦了,作为惩罚,我们都要在那里挖洞。这样的命运真是悲惨,但很容易就能想到相关政策是怎么来的。每个人在他的一生中,或多或少都希望过自己讨厌的人被车拉到别的地方去铲粪——尤其是那种四体不勤又心高气傲的人。

第十九章 开往上海的山东快线:234次列车

  • 这里的每个人都因农事而筋疲力尽,而且每一寸土地都已被开发利用。既然可以种菠菜,为什么要种花呢?既然阳光可以照耀庄稼生长,为什么要种树将它挡住呢?

第二十二章 开往西藏的列车

  • 外表越是普通,就越像救苦救难的英雄。

《如何找到想做的事》

“可以作为工作的爱好”和“不能作为工作的爱好”之间的区别

  • 全部行动都以“这个有用吗?”为标准筛选,人就会备受阻力,最终会丢失“做‘喜欢的事’且幸福地生活”这一初心,觉得只能做“有用的事”(合理的事)。这就是合理性陷阱。

序 一本让你找到“想做的事”的书

  • 因为对工作没兴趣,也就没有学习动力,所以无法成长。

误区2:找到想做的事时会有命中注定的感觉

  • 实际上大部分情况下即使找到“想做的事”,你开始也只会觉得“嗯?或许挺有趣的”,即仅处在感兴趣的阶段。

误区4:必须多行动才能找到

  • 去服装店可以随便挑选衣服的款式,但是如果没有明确的选择标准会怎么样呢?你也许会被“现在这个很受欢迎”“价格便宜”等与“自己想穿的衣服”不符的信息所影响,进而做了选择。

“如果不知道自己想做的事是什么,就只能试着先行动了”,这种想法中的陷阱

  • 人在选项多的时候往往会“不做选择”

“一直迷茫的人”和“走自己道路的人”之间唯一的区别

  • 不要把自己的判断标准建立在外部的“以他人为中心的坐标轴上”,必须切换到自己内心的“自我中心坐标轴”上。

公式1:喜欢的事×擅长的事=想做的事

  • 技能和知识是为了实现自己想做的事的手段。如果以使用技能为目的,人生当然会变得无趣。正因为如此,才有必要了解自己在任何时代、任何地方都能使用的“擅长的事”。在找到“真正想做的事”之后,如果有需要的话再去掌握“技能和知识”也来得及。

如何找到实现“想做的事”的手段

  • 所谓的色彩浴效应是一种心理学现象,指如果刻意关注一些事物,那么与之相关的事物就会很自然地映入你的眼帘。比如听到“请找出你周围红色的物体”,你就会看见以前没有注意到的红色物体。

  • 色彩浴效应和实现“想做的事”的手段是一样的。确定好“想做的事”之后,色彩浴效应开始发挥作用,实现“想做的事”所需的信息就会源源不断地冒出来。浏览信息时竖起“天线”,关注对自己想做的事有用的信息,从而不断地将它们收集起来。

所谓成功并不是“达成目标”,而是“活出自我的这个瞬间”

  • 那时候我才意识到,真正的幸福并不是得到金钱或名誉。如果对现在这一瞬间所做的事情感到充实才是幸福,才是人生的成功。
  •  

“林海爱折腾”上线

林海爱折腾”这个站点酝酿很久,在2025年7月31日终于正式上线了。

很多次告诉自己不要再折腾了,可是当出现让自己感兴趣的东西时,还是忍不住要动手。比如,遇到一个样式钟意的主题,就必须动手修改一番,直到它成为自己最喜欢的样子;又比如,心血来潮利用 AI 制作了一个样式精美的友情链接展示插件;在折腾 VPS 的过程中,也总会遇到些值得记录和分享的问题。

我的主博客(lhcy.org)是一个非常棒的平台,记录着我的生活与感悟。但我不希望让这些时效性强、略显硬核的技术类文字冲淡它的主题。因此,我建立了“林海爱折腾”这个全新的博客,专门用来记录我在技术世界里的每一次探索、每一次尝试和每一次“折腾”。

至于技术选型,这个新站最终选择了 Typecho。熟悉我的朋友可能知道,我的主博客曾因插件生态等原因从 Typecho 迁移到了 WordPress。但时过境迁,如今 Typecho 的许多问题要么可以绕过,要么得到了解决,它依然是我心中轻量、高效的代表。它现在使用的主题源自 Github,在AI的协助下修复了十几个 Bug 并按我的心意调整后,它重获了新生。

也许你会问,我自己也发布过三个 Typecho 主题,为何不直接用呢?不怕笑话,时过境迁,心境变了,我已经不喜欢当初的样式了。当然,如果你喜欢,它们在 PHP 8.x 环境下依然能稳定运行。

“折腾”不止,探索不息。希望“林海爱折腾”这个小站,能成为我记录技术足迹的专属空间,也希望能在这里遇到同样热爱探索的你。

  •  

散装日常

Photo by Michal Průcha / Unsplash

标题来自 betty 姐的 散装日常 一文

8月进入三伏天的中伏,天气一日炎热过一日。

我是每天早上八点出门,可即便是这个时候,路面都已经开始热气蒸腾,而且这种情况会一直持续到晚上9点,期间路面上即便刮过微风也都是带着热意,吹着风时会让我有种在空气炸锅中的错觉。

博友圈中大家也都是被热的鬼哭狼嚎,期间在某位博友的文章下回道 如今的极端天气已经是一年多过一年了,想来用不了多久地球的气候就要被我们玩坏了

都这么热了,月底恰好因为工作的事情需要做一些费力气的活,但即便在阴凉的房子里稍微干一会,流出的汗液就会打湿衣服,再多一会便会从额头上滴下豆大的汗珠,必须用衣袖或纸巾擦干,不然掉进眼泪要被盐分刺的生疼。此时算是了解那些工人们的苦楚了,只不过我们这体验可不及他们的百分之一吧?

每次做半天休息半天,回去后便要立马喝上一支藿香正气液,缓解中暑症状,但依旧还是感觉浑身乏力,脑袋昏沉。

各位博友们可也要注意防暑了。


因为去年折腾了NAS,后来的图片基本上都存放在那上面了,用博友的香港机器打完洞后外网的访问速度能有10M/s左右,看照片什么几乎都是秒加载,看4k影视基本上也没有什么延迟,这让原来的阿里云、OneDrive变的如同鸡肋,食之无味。

所以这几天整理了一下这两个网盘的照片,准备全部转移到NAS上。OneDrive的我直接挂载到飞牛上,将相册复制粘贴到飞牛就好了,速度慢是慢一点,但是基本上不用怎么管。

阿里云则要麻烦的多。

我是阿里云盘内测的时候便开始使用的用户了,当时网盘是集成在Teambition这个协作软件里的,后来可能是看到用这个的用户挺多的,便被他们提溜了出来,单独做成了阿里云盘,当时打着用不限速的口号可是狠狠抢了一波百度的用户。

不过好景不长,用alist、小雅挂载云盘做媒体影视库的玩法可能也让高层熬不住了,彻底不要脸了,开始限速、限制webdav挂载等。而且相册这种基本的功能也加了很多限制,不能预览高清,加载速度慢等等,这也是我那时候下定决定搭NAS的主要原因之一了。

所以只能通过阿里云盘的客户端将照片全部下载到本地,在上传到NAS上去。

不过被喜闻乐见的限速了,刚开始速度只有300kb左右,后来晚上速度提高到1m左右,之后几乎最高就是这个速度了。

好在一晚上就处理完了所有照片,通过内网上传到我NAS的话大概有30M/s左右,一个小时就搞定了。

终于算是完整完成了网盘的切割,现在只用了OneDrive来同步工作文件。

之后如果飞牛出了随用随下特性的同步功能可能OneDrive也要退了。


手上这部小米12su陪了我两年了,虽然在 vivo x200 pro mini 出来的时候有过那么一点心动,曾几度晚上在电商购物节时下单但是早上又退掉,理性成功战胜了购物欲,它的性能依旧足以支撑我继续使用。

目前主力使用的系统版本一直是miui14的早期版本,期间也试过HyperOS,但是新系统刚出来时刷过一次,体验特别不好,肉眼可见的卡顿让我回退回了miui14。期间也想过刷原生系统玩,但是因为是主力手机,原生系统在工作方面会有很多问题,所以也放弃了。

最近突然心血来潮打开了需求没看的酷安,在12su专区发现大家都在盛传HyperOS2(居然已经HyperOS2了吗?我1都没用过呢...)202这个小版本好特别好用,续航、功耗控制的都非常不错,让我非常心动。

为了确定是不是幸存者偏差,我连刷了好几天,几乎没有差评,所以在慎重考虑之后花了一天时间备份原始数据,并在晚上刷入了新系统。

虽然在恢复备份数据时有一些问题,但是用了个把星期下来,从功耗、发热、系统流畅程度来说都几乎吊打了原来的系统,我非常满意。

  •  

博客知识地图

博客知识地图 无敌的个人博客 tangwudi

1 博客知识地图 · 精选导航 本知识地图仅收录具有体系化、方法论、实战突破价值的文章,帮助新读者快速掌握博客的核心内容。 建议与 站点地图、Cloudflare 学习地图、AI 学习地图 配合阅读。 1.1 🏠 家庭数据中心搭建与优化 家庭数据中心 IPv4/IPv6 双栈网络架构及应用访问流程优化 独立个人博客搭建及避坑指南 WordPress 极速搭建个人博客之零基础新人直升大礼包 从零开始搭建个人博客之完整攻略(最低成本) WordPress 多节点“半自动”、“近乎”实时同步方案 WordPress 多活架构(简版)在个人博客中的落地方案 博客架构的第二次重构:VPS 搬家引发的服务迁移与双活容灾实践 用 Cloudflare Worker 解决 WordPress 多活架构中的评论同步难题 1.2 ☁️ Cloudflare 系列精华选(独立于学习地图) 从 Cloudflar […]

<p>The post 博客知识地图 first appeared on 无敌的个人博客.</p>

  •  

醒脑提升的咖啡压片糖果

拆开这个意外收获的小盒子时,浓郁的咖啡香瞬间钻入鼻腔。这盒精致的"来一口咖啡吧"压片糖果,不知是哪个咖啡订单的赠品,就这样悄悄出现在我的生活里。

作为一个伪咖啡爱好者(其实只懂喝不懂品),平时最抗拒的就是甜食。但武汉39℃的酷暑实在让人嘴里发苦,连最爱的无糖美式都提不起劲。这时候,营养快线、冰绿茶就成了续命神器——当然还得跟家里的小祖宗抢AD钙奶喝,每次都要演一出"这是大人饮料"的戏码,想想也是哭笑不得。

豆子颜色是灰褐色,香味浓郁,让人很想吃一颗的感觉。

今年体检报告上的"血糖偏高"和"脂肪肝"三个字,彻底给我的吃货生涯按下了暂停键。看着灰褐色的小糖豆在掌心滚动,浓郁的香气不断挑衅着我的意志力。第一颗入口时,咖啡的醇苦和糖果的甜味在舌尖打架,意外地和谐。连续几天尝试后,居然还发现了提神效果——这对总在开车时犯困的我简直是救命稻草。

想起老妈总吐槽我喝的黑咖啡像锅底灰,再看看手里这些穿着糖衣的"咖啡豆",突然觉得生活就像这糖果,总要裹着点甜头才能咽下苦涩。就像那瓶15年的五粮液,明明珍贵得很,宿醉后的我却喝得龇牙咧嘴,真是暴殄天物。

现在这盒糖果成了我的办公桌常客,既满足了咖啡瘾,又不会摄入太多糖分。偶尔含一颗,就会想起这个夏天:和媳妇抢奶喝的幼稚,跟孩子斗智斗勇的温馨,还有在健康与口欲间反复横跳的成年人烦恼。原来最美好的滋味,往往就藏在这些平凡的日常里。

  •  

家庭数据中心系列 WordPress 健康检查接口优化:使用 204 响应打造探活插件

家庭数据中心系列 WordPress 健康检查接口优化:使用 204 响应打造探活插件 无敌的个人博客 tangwudi

1 前言 在我之前的多活架构部署实践中(详见:家庭数据中心系列 WordPress多活架构(简版)在个人博客中的落地方案),Cloudflare 的运行状况检查(Health Checks)是实现节点可用性判断的核心机制之一,之前我博客的运行状况检查的内容如下: 上图中使用的检查路径是 “/healthcheck”,这是我专门创建的一个 WordPress 页面,内容非常简单,只输出一段“OK”文本,便于 Cloudflare 定期发起 HTTP 请求来确认站点是否存活: 同时,我也在 Cloudflare 的规则中为该路径设置了绕过缓存、防火墙、安全挑战等策略,以尽可能确保响应结果能真实反映源站状态。 这种方案功能上是可行的,也确实稳定运行了一段时间。但在进一步分析和优化中,我发现这种方式其实存在不少隐藏的结构性问题: 首先,这个路径返回的是 200 状态码,并且 […]

<p>The post 家庭数据中心系列 WordPress 健康检查接口优化:使用 204 响应打造探活插件 first appeared on 无敌的个人博客.</p>

  •  

niRvana轻拟物主题

niRvana轻拟物风格Typecho主题

niRvana

typecho-Theme-niRvana 移植自 WordPressniRvana 主题,轻拟物主题,让设计上不再趋从于现有的扁平化,近日移植版已支持评论功能。

预览

注意:在线预览功能因为服务多个主题,故无法专门为其建立搜索页面,这个不是主题的原因

在线预览

下载

开源地址https://github.com/michaelliunsky/typecho-theme-niRvana

设置教程

搜索页面

按照下方截图的方法设置独立页面,然后将页面网址填写到主题设置里
搜索页面.webp

图标格式

使用区域:猜你喜欢、分类菜单、顶栏菜单

icon font_family icon-表上内容

icon.webp

猜你喜欢

使用区域:后台设置 - 相关文章

<div class="relate-posts clearfix"><div class="post-model"><i class="far fa-star"></i>标题</div><div class="posts clearfix">内容</div></div>
  •  

安利神器:Claude Code Router

在如今的 AI 开发浪潮中,编码辅助工具层出不穷,但能真正提升效率、灵活适配多种模型的却不多。今天,我要给大家强烈安利一个开源项目——Claude Code Router!这个基于 Claude Code 开发的智能路由器*,不仅能让你更灵活地使用 AI 编码能力,还能无缝切换多种模型,堪称开发者的小助手

主要是体验国内大模型不是

什么是 Claude Code Router

Claude Code Router(后续简称 CCR)是一个开源项目,基于 Anthropic 的 Claude Code 打造,旨在为开发者提供一个灵活的编码基础设施。它就像一个智能路由器,可以将你的编码请求分发到不同的 AI 模型(如 DeepSeek、Ollama 等),并支持高度自定义的配置,让你根据任务需求选择最合适的模型。简单来说,CCR 让你在享受 Claude Code 强大编码能力的同时,还能灵活适配其他模型,省时省力又省钱

一句话总结:CCR 是一个让开发者自由掌控 AI 编码能力的超级工具, 你的省钱小能手

为什么需要 Claude Code Router

灵活的模型切换,打破 API 限制

我们都知道,Anthropic 的 Claude 系列模型在编码任务上表现优异,但它的 API 有时会受到限制,比如封号风险或高昂的 Token 费用。CCR 通过启动一个本地服务,将 Claude Code 的 API 请求转发到任何支持 OpenAI 格式的 API 接口,完美规避了这些问题。你可以用 DeepSeek、Gemini 等其他模型的 API 来驱动 Claude Code,灵活又高效!

高度自定义,适配多样化需求

CCR 支持通过 Providers 数组和 Transformer 机制自定义模型和 API 交互方式。你可以为不同模型设置全局或特定的转换器(Transformer),确保请求和响应的兼容性。比如,AnthropicTransformer 可以实现 Claude 与 OpenAI 格式的双向转换,而 GeminiTransformer 则处理 Gemini 与 OpenAI 格式的转换。这种"混搭"能力让多个模型无缝协作,简直是国内开发者的福音

自动化任务,节省成本

CCR 支持通过 GitHub Actions 实现自动化任务。例如,你可以在非高峰时段运行编码任务,降低 API 调用成本。它的配置简单,配合 GitHub Actions 可以轻松实现触发式自动化,比如当 Issue 评论中包含 @claude 时自动启动编码任务。省时又省钱,效率拉满!

开源免费

CCR 是完全开源的,托管在 GitHub,你可以自由下载、修改和贡献代码

项目地址: musistudio/claude-code-router

核心功能

  • 多模型支持
  • Transformer 机制, 核心功能。它能将不同模型的请求和响应统一到 OpenAI 格式,确保兼容性。
  • 支持本地化
  • Tool Mode,智能任务处理。借鉴了 Claude Code 的 Plan Mode,CCR 为 DeepSeek 等模型实现了 Tool Mode。当启用时,模型会主动选择最合适的工具来完成任务,极大提升编码效, 具体可以参考 Tool Mode

快速上手

  • 本地运行(个人推荐)
  • docker 部署(任意地方)

本地运行

本文示例对接魔搭的 qwen3 最新模型。

环境要求

安装依赖:确保 Node.js 版本 ≥18.0.0,使用 bun 或 npm 安装所需包

安装

  1. 安装 Claude Code
npm install -g @anthropic-ai/claude-code
  1. 安装 CCR
npm install -g @musistudio/claude-code-router

配置

默认配置文件 ~/.claude-code-router/config.json

{
  "LOG": true,
  "CLAUDE_PATH": "",
  "HOST": "127.0.0.1",
  "PORT": 3456,
  "APIKEY": "",
  "API_TIMEOUT_MS": "600000",
  "transformers": [],
  "Providers": [
    {
      "name": "modelscope",
      "api_base_url": "https://api-inference.modelscope.cn/v1/chat/completions",
      "api_key": "不要ms-的token",
      "models": [
        "Qwen/Qwen3-Coder-480B-A35B-Instruct"
      ],
      "transformer": {
        "use": [
          [
            "maxtoken",
            {
              "max_tokens": 65536
            }
          ]
        ]
      }
    }
  ],
  "Router": {
    "default": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "background": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "think": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContext": "modelscope,Qwen/Qwen3-Coder-480B-A35B-Instruct",
    "longContextThreshold": 60000,
    "webSearch": ""
  }
}

启动

ccr code

容器版部署(非编译版)

容器部署可以从源码编译,也可以像本地一样 npm 安装

  • Dockerfile
FROM node:lts
WORKDIR /app
RUN npm install -g @musistudio/claude-code-router
CMD ["ccr","start"]

基于上面的构建出一个镜像

  • docker-compose.yaml
version: "3.8"

services:
  ccr:
    build: .
    container_name: ccr
    ports:
      - "3456:3456"
    volumes:
      - ./:/root/.claude-code-router
    restart: unless-stopped

配置 config.json 区别, 仅列出调整的

"APIKEY": "xxxxxx", // 必须要有
"HOST": "0.0.0.0", // 以及这里

在本地的配置~/.claude/settings.json,和配置 Claude Code 一样

{
    "env": {
        "ANTHROPIC_BASE_URL": "https://xxxxxxx",
        "ANTHROPIC_AUTH_TOKEN": "123"
    }
}

然后 claude 开始你的编码

总结

潜力已经显而易见, 未来可期哈哈。如果正在为 Claude 的高成本和限制头疼,国内开发者还是值得试一试,当然如果能直接用 Claude Code,还是推荐用 Claude Code

  •  

[Frightening Dream] 梦见清新秀气与油腻肥头「005」

正常人类在梦里没有嗅觉。

声明:「本故事是做梦梦到的,如有雷同那你脑部有神经类疾病,应尽早就医」


正文

章节一

临近毕业,就差拿证走人了。这阶段学校的屁事最多,学校有任何用人的屁事,就会随便抓一个班过去干杂活,此所谓最后的剩余价值不榨白不榨。

在床上躺着好好的,突然来电话,说让我们班过去收拾机房。时间倒是给得很多,而且是时间内不会再分给我们其他垃圾活。

但是修机房这事情是技术活,全班有能力干这活的基本上就我一个人。

很明显上面的事逼领导就是针对我们这个事逼班分配的任务,时间长难度大没收益没好处,顺带恶心我这个犟种。领导是明显知道这事情就我能干,如果我不干,那就全班一起在机房熬时间,最后或者这活还是我干了,或者所有人一起干耗到毕业领证。活可以不干,但是人不到时间不许走,反正最后毛病都得落在我身上。我干活,大家就能得到自由,我不干活,大家就都坐在这里磨时间。

章节二

大早上全班去机房。景色完全可以想像,一堆人坐在那里玩手机,就是硬磨时间。

没办法,劳者多能,干吧。

一台机器一台机器的开始调。学校的破机器基本都是能亮就行,学校想到找人修机房,那大概就是不亮了。

从早上一直干到临近中午,快到饭点了,同学屁颠屁颠的一个个基本走没了,其实半路就有不少偷偷摸摸溜了。

我人还钻在桌子底下调机器呢,屋子里人都走得差不多了。苦逼一个。

从桌子底下钻出来,身上沾了一身灰,脏兮兮。

还没走的姐们实在看不下去,“下午要拍毕业照的,你衣服脏成这样可不行”。姐们说先去她家把衣服换了,她家就在学校对面。

章节四

到姐们家,直接被姐们拉近卧室。姐们从衣柜里翻出一堆中性的衣服扔到床上,让我挑能穿的衣服换上,她则出卧室去翻别的东西去了,“你衣服换好了就先在屋里歇着,躺床上睡一会,下午指不定还有什么屁事呢”

把脏兮兮的外套换下来,套上姐们给的衣服。衣服上有一股奇妙的清新的气味,既不是沐浴露也不是洗衣液的气味,是从未体验过的清新的香味,很微妙。

床是坚决不能躺的。我就在梳妆台前面的椅子上坐了一会。

姐们回来,手里拿着个照相机。

姐们看着我说:“你这穿得也太秀气了,不拍几张照片都可惜了。”

我:“机会难得,别客气”

姐们:“真的?”

我:“这辈子可能就这一次机会了,错过就再没有了,别留下遗憾。”

姐们:“那我可就不客气啦!”

姐们说罢从梳妆台里拿出一堆化妆品就要开动了。

章节五

姐们电话响了,接电话,是“老师”打过来的,说是学校毕业聚餐,选上我们班凑数了,要马上过去,等会上面领导要出席,还有电视台的记者。

姐们撂下电话。然后我电话也响了,一样的通知。

赶到指定饭店,指定餐厅。姐们从后门进,坐房间那边女生堆里对付一拨领导,我从前门进,坐房间这边男生堆里对付另一拨领导。

进门一看,虽说前面的桌子是预留给领导的,但是所有学生都做到角落去了,完全没有充场面做样子的学生在前排。

勉为其难又他妈的是我来充场面打头阵。我刚坐下,后面一群臭男人就在那喝倒彩:“XXX穿女装!”

章节六

已经到了饭点了,饭菜已经上好了,大鱼大肉,但是电视台的人和大领导们都没来,也没人敢动筷子。

终于领导来了,电视台的人也来了。

电视台立马就架好机位,立刻就上了阵势,先拍领导和学生握手。

但是前排就能抓到我一个学生,其他学生都躲到远远的。老师赶紧示意我先上去跟领导握手,此时电视台的摄影师已经站好位置了,我和大领导都已经在镜头里了。

我立刻整理好衣服,然后毕恭毕敬地从低处伸出右手准备和领导握手。电视台的摄影师也配合着我的动作,移动到我身后,进行着完美的走位运镜。

只见领导上身穿着白衬衫,没扎领带,下身穿着黑色的西服裤子,鼓着大肚子,带着个大手表。

领导突然伸出双手,把我搞得一愣。领导一只手抓住我的手,我以为领导要用双手握手,赶紧伸出左手。

结果领导突然左手搭在我的肩膀上,用力把我向一边猛猛推走,然后径直走到餐桌前,坐下拿起筷子就开吃,根本不在意什么电视台不电视台。

我被突然推出去,没站稳,趔趄出去好远。

回头,只见领导已经开吃了,电视台的人面无表情地放下设备,也坐下开吃,其他桌也开吃了。

只是没给我预留座位,前排的座位被领导老师和电视台的人占满了,后排的座位也没空位。

我就无助地站在空地上。


醒了。

那股奇妙的清新的气味也没有了。

The post [Frightening Dream] 梦见清新秀气与油腻肥头「005」 first appeared on 石樱灯笼博客.
  •  

这应该是资本最内卷的病态产物

“内卷式”竞争,作为一种低效率的不公平竞争,让不少行业、企业深受其害,也影响到经济的高质量发展。

“‘价格战’‘争赛道’‘抢人才’,以税收减免、土地特惠、厂房白送等超乎寻常的优惠条件来吸引企业……这种‘内卷式’竞争,在不少行业和地方招商引资中较为突出。”究其背后原因,既折射出部分行业因需求疲软、产能过剩而导致的供需失衡困境,也凸显了过分追求眼前利益、短期政绩的短视行为,对长远健康发展构成潜在威胁。

地方招商引资存在“内卷”,行业发展也存在“内卷”,打价格战是其突出表现。

视频来源于 https://www.douyin.com/video/7533493769107262739

  •  

Excel单元格做多选下拉框

Photo by Mika Baumeister / Unsplash

最近做数据筛选,有些列是固定的几个选项,并要求可以多选。新版本的excel和wps能不能实现不知道,但是默认情况下2016版的wps没法。

研究了一下,AI给了个解决方案,亲测好用。

一、准备下拉列表源

  1. 在任意空白列(如 Z 列)依次输入:
    • 退货
    • 促销
    • 调拨
    • 冻结
    • 关注
    • 补货
  1. 选中这些单元格 → 公式 → 定义名称 → 名称填 ActionList → 确定。

二、给“处理结果”列加下拉

选中需要多选的单元格区域(如 C2:C1000)→ 数据 → 有效性(或者数据验证) → 允许:序列 → 来源:=ActionList → 确定。

此时依旧只能单选,接下来用 VBA 让它支持多选。

三、插入 VBA 代码

  1. 按 Alt+F11 打开 VBA 编辑器。
  2. 左侧找到对应工作表(如 Sheet1),双击打开。
  3. 把下面代码整段粘进去即可:
'========== 支持多选下拉(逗号分隔) ==========
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngDV As Range
    Dim oldVal As String, newVal As String
    
    '如果改动区域不在“处理结果”列,直接退出
    Set rngDV = Me.Range("C2:C1000")   '←改成你的实际区域
    If Intersect(Target, rngDV) Is Nothing Then Exit Sub
    
    Application.EnableEvents = False
    
    newVal = Target.Value
    Application.Undo
    oldVal = Target.Value
    
    If oldVal = "" Then
        Target.Value = newVal
    ElseIf newVal = "" Then
        Target.Value = ""
    ElseIf InStr(1, oldVal, newVal) = 0 Then
        Target.Value = oldVal & ", " & newVal
    Else
        '已存在则去掉
        Target.Value = Replace(oldVal, ", " & newVal, "")
        Target.Value = Replace(Target.Value, newVal & ", ", "")
        Target.Value = Replace(Target.Value, newVal, "")
        If Left(Target.Value, 2) = ", " Then Target.Value = Mid(Target.Value, 3)
    End If
    
    Application.EnableEvents = True
End Sub
  1. 关闭 VBA 编辑器,保存数据,并将表格另存为.xlsm格式。
  2. 重新打开文件,点击“处理结果”列的下拉箭头,可以连续勾选多个动作,结果自动以“退货, 促销, 调拨”形式写入单元格;再次点击已选项可取消。

注意事项

  • 文件需保存为 .xlsm(启用宏),并重启表格程序。
  • 若区域或列号不同,只需把代码里的 C2:C1000 改成实际范围即可。
  •  

二〇二五年七月总结,点沮丧也有点颓废

又过了一个月,很慢也很快,回头看这个月接触了很多事情,也做了很多事情。摄影、骑车、看书、玩游戏。

说实在的,不想更新,最近有点沮丧也有点颓废。也许是某个岔路口不知道该咋走,无论是哪条路,都没有明确的险阻,中青年不像青年人那样敢拼敢闯。

拍照

自从七月中旬做了一个[每日摄影]的决定,到目前已经获得了300多张照片。当然,这些照片不乏废片。

时常迷茫这种刻意练习的方式,熟悉的场景怎么拍,司空见惯的事物怎么拍,绞尽脑汁找不到好的方法,也许陌生的环境才有拍摄欲望。都说新手先拍风光与人文,光影稍纵即逝,很多时候看到但很难拍到。

7月7日,买了索尼18-105半画幅电动变焦镜头,目前是挂机镜头。

七月的一些照片:

骑车

总里程:424.10km
总时间:21:06:17
月骑行均速:20.10km/h
次数:31

在速度方面已经没有突破了,也许跟心态有很大关系,从内心觉得身体条件不允许,仅能做一些维持健康的运动。

月底尝试一次跑步,2.7公里慢跑大汗淋漓,休息了3天才缓过劲。但之后给我的感觉是更有力量了,可能是需要搭配其他运动才能有所提升。

力量一直是我的弱项,针对力量的训练又是十分痛苦的,正是这样避重就轻才导致不前。

看书

看书这件事没有坚持,月初翻看一本《认知驱动:做成一件对他人很有用的事》。但最终还是没有看完这本书,进度停留在46%,一个月一本书的任务虽败告终。

玩游戏

王者荣耀、和平精英、第五人格,曾经常玩的游戏,现在重回游戏,水平一如既往的菜。

后半月下载了这3款手机游戏,刚开始玩的不亦乐乎。也许是暑假期间小学生太多,有些胜利、吃鸡都莫名其妙的发生了。

把游戏当做调节情绪的工具,当我在游戏中败下阵来也不感到沮丧,时间差不多就收起来,但总体玩游戏的时间还是太多,以后要注意。

  •  

被迫新增一条移动宽带,和电信宽带形成双出口

被迫新增一条移动宽带,和电信宽带形成双出口 无敌的个人博客 tangwudi

上周,电信的师傅又上门,说怀疑我家里有pcdn,怀疑的依据是连续215个小时有大量的上行和下行流量(其实这段时间我都下得很少了,215个小时才不到1T的下载,上传甚至不到300G~),我都无语了,我的transmission上行都限制成1024KB/秒了,还要我怎么办? 随便去看到一下最近网上的那些被运营商以pcdn名义限速或者断网用户的案例,感觉各大运营商都以pcdn这个万金油名义大力打击上传量大(这个”大”是相对一般家庭用户,要知道,一般家庭用户上行可能1天都超不过1G~)的用户,所以我也感觉到了危险:毕竟我是用很低的价格还用着公网IP套餐的老用户,本来就是电信的眼中钉,如果逮着机会说我违规把我公网IP收回就亏大了(虽然我现在也用不上公网IP,但是有便宜不占王八蛋)。 思来想去,再加上去年有被电信断网3天的经历,本来就有危机感,所以干脆就又牵了一条移动的千兆宽带 […]

<p>The post 被迫新增一条移动宽带,和电信宽带形成双出口 first appeared on 无敌的个人博客.</p>

  •  

解密 SSH AI Chat:它是如何运行的

技术深度解析

解密 SSH AI Chat 它是如何运行的

探索一个令人惊叹的创新项目:通过 SSH 协议直接与 AI 对话。无需安装客户端,无需打开浏览器, 只需一条简单的 SSH 命令,就能开启与 AI 的终端对话之旅。

$ ssh username@chat.aigc.ing

大家好,我是面条,今天想和大家分享我最近的一个项目 —— SSH AI Chat。

项目简介

核心理念

SSH AI Chat 是一个可以通过 SSH 直接连接的 AI 聊天应用。使用方式非常简单, 你不需要安装任何客户端,不需要打开浏览器,只需要一个 SSH 客户端,就能和 AI 进行对话。

ssh username@chat.aigc.ing

没错,就这么简单!你不需要安装任何客户端,不需要打开浏览器,只需要一个 SSH 客户端,就能和 AI 进行对话。

作为一个对 TUI 应用有着浓厚兴趣的开发者,我一直觉得在终端里聊天是一件很酷的事情。其实我最初是被 itter.sh 这个网站惊艳到了 - 居然能用 SSH 访问社交网络!这让我意识到,原来 SSH 不只是用来连服务器的,还可以做很多有趣的事情。

于是就有了这个想法:如果能用 SSH 和 AI 聊天,那该多酷啊!不需要安装任何软件,不需要打开浏览器,只要在终端里输入 ssh yourname@chat.aigc.ing 就能开始对话。

项目架构

核心技术栈

  • SSH 服务器:Node.js + ssh2 模块
  • UI 框架:React + Ink(终端渲染)
  • 数据库:PostgreSQL / PGLite
  • 缓存:Redis / ioredis-mock
  • AI 集成:Vercel AI SDK

架构特点

  • • 无客户端安装需求
  • • 跨平台终端支持
  • • GitHub 公钥认证
  • • 实时流式响应
  • • 多模型 AI 支持

系统架构图

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   SSH Client    │    │   SSH Server    │    │   React App     │
│                 │    │                 │    │                 │
│  ssh username@  │───▶│  Node.js +      │───▶│  Ink UI +       │
│  chat.aigc.ing  │    │  ssh2           │    │  React Hooks    │
└─────────────────┘    └─────────────────┘    └─────────────────┘


                       ┌─────────────────┐
                       │   AI Services   │
                       │                 │
                       │  OpenAI API     │
                       │  Gemini API     │
                       │  DeepSeek API   │
                       └─────────────────┘

核心模块解析

1. SSH 服务器模块

这是整个应用的核心,负责处理 SSH 连接和认证。系统会自动处理密钥验证、GitHub 公钥认证、登录限制和速率限制。

2. 认证系统

最巧妙的设计是使用 GitHub 公钥认证。用户不需要注册,直接使用 GitHub SSH 密钥就能登录。

系统会获取用户的 GitHub 公钥进行验证,每 6 小时缓存一次,既安全又高效。

3. 终端 UI 系统

使用 Ink 框架在终端中渲染 React 组件。想象一下,你平时写的 React 组件,现在不是在浏览器里渲染,而是在终端里显示!

多语言界面

实时聊天

历史记录

响应式布局

4. 聊天系统

使用 Vercel AI SDK 处理 AI 对话。当你在终端里输入消息时,系统会接收消息、加载历史对话、选择模型、实时显示流式响应,并保存对话记录。

流式响应多模型支持思维链展示对话历史管理

技术难点和解决方案

核心技术挑战

项目开发过程中遇到的关键技术难点

终端渲染复杂性

React 组件在终端环境的适配

会话状态管理

多用户并发连接的处理

1. 终端渲染的挑战

最大的挑战是在终端中实现复杂的 UI 界面。使用 Ink 框架将 React 组件渲染到终端,实现虚拟 PTY 来处理终端 I/O。在终端里显示 AI 回复的 Markdown 需要用专门的 worker 进程处理转换,才能显示粗体、斜体、代码块。

2. SSH 会话管理

管理多个 SSH 会话和状态需要为每个连接创建独立的 React 应用实例,使用 Context API 管理全局状态,并实现会话生命周期管理。

3. 实时流式响应

AI 的回复是流式的,如果每收到一个字节就刷新界面,终端会直接卡死。使用 Vercel AI SDK 的 streamText 配合节流更新,每 300ms 更新一次,既流畅又不卡。这是性能优化的关键技术点。

4. 数据存储的灵活性

项目支持 PostgreSQL 和 PGLite 两种数据库,以及 Redis 和内存缓存,让项目既能独立运行又能部署到生产环境。

有趣的设计细节

GitHub 认证

最酷的设计!用户不需要注册,直接使用 GitHub SSH 密钥就能登录,既方便又安全。

零注册流程

多模型支持

支持 DeepSeek-V3/DeepSeek-R1、Gemini-2.5-Flash/Gemini-2.5-Pro 等多个 AI 模型,包括思维链展示。

DeepSeekGemini

国际化支持

完整的 i18n 支持,通过 LANG 环境变量自动检测用户语言偏好,支持中英文切换。

自动语言检测

键盘快捷键

Ctrl+C 退出应用,N 新建对话,I 聚焦输入框,? 查看帮助。还有一些小彩蛋功能。

Ctrl+C退出
N新建

开发心得

技术感悟与收获

开发过程中的深度思考与技术洞察

终端应用潜力

现代化终端交互的可能性

SSH 协议创新

跨平台应用的新思路

技术栈融合

现代前端技术的适应性

1. 终端应用的可能性

这个项目让我看到了终端应用的巨大潜力。通过 Ink 框架,我们可以在终端中实现复杂的交互界面。

2. SSH 的妙用

SSH 不仅仅是一个远程管理工具,它还是一个强大的应用平台。通过 SSH,我们可以实现跨平台的客户端应用,用户不需要安装任何额外的软件。

3. 现代化的技术栈

虽然这是一个终端应用,但我们使用了最现代的技术栈:React、TypeScript、Vercel AI SDK 等。这证明了终端应用也可以很”现代化”。

未来展望

发展规划

本地模型支持

计划支持 Ollama 等本地模型

MCP 协议

支持 Model Context Protocol 插件扩展

计划支持更多的 AI 模型,包括 Ollama 等本地模型,以及支持 MCP (Model Context Protocol) 协议让用户可以通过插件扩展功能。

总结

项目价值与意义

终端应用的现代化可能性
SSH 协议的灵活应用
React 在不同平台上的适应性
AI 技术的普及化

SSH AI Chat 是一个融合了多种技术的创新项目。它展示了:

  • 终端应用的现代化可能性
  • SSH 协议的灵活应用
  • React 在不同平台上的适应性
  • AI 技术的普及化

这个项目让我意识到,技术不只是为了解决问题,也可以很有趣。把 SSH 和 AI 结合起来,创造出了意想不到的体验。

希望这个项目能给大家带来一些启发,让我们一起探索技术的边界!

体验地址

立即体验

一条命令即可开始

ssh your-github-username@chat.aigc.ing

如果你对这个项目有任何问题或建议,欢迎在 GitHub 上讨论。也欢迎 Star 这个项目,你的支持是我继续开发的动力!

stat
  •  

八月首夜:忆天河潭与售房

八月夜初,天连日晴好,唯暮气闷热。回首迩来诸事:有陪内子携小女游天河潭之欢;有售房久待之盼与终成之喜;亦有前两月家父车刮蹭后两月忽被起诉之忧,及近因内务疏失遭上官约谈之虑。噫,惟愿八月诸事皆顺,出行之约如期,万物渐入佳境,岁岁安然耳。

天河潭

周末如常,天朗气清,吾与妻携女,将出游以遣怀。目的地于贵阳花溪之天河潭,其地距贵阳二十四里,距花溪十三里,地广十五里,以喀斯特胜景闻名,集黄果树之雄、龙宫之奇、花溪之秀,飞瀑清泉、深潭奇石、怪洞天桥错落其间,农舍水车相映成趣,素有“黔中一绝”之称,亦为国家AAAA级景区。吾幼时曾游,今妻与小女未往,故再访之。

晨起餐毕,整装出发。时暑气蒸腾,骄阳似火,热风扑面,与车中空调之凉,判若两境。然出游之意切,何惧日晒风炎?

车行四十许,抵天河潭。虽酷热难耐,然游人如织,携童嬉戏者众,热闹非凡。至售票处,队列绵长。票分两种:纯门票七十余,含观光车及部分项目者八十五。念及天热携幼,遂选后者。

购票后,往乘观光车处,亦是人山人海。幸有遮阳帐与送风机,稍解暑气。候二十分钟,方得检票登车。此车无窗,仅设护栏,约五六排,每排可坐四众。吾辈携女坐于末排。车动之际,凉意顿生,沿途风光甚好,转瞬至换乘点。

闻商贩言,上行可乘船观溶洞,复步行探之。整理行装,拾级而上。行不远,又见长龙排队,自楼上延至楼下,幸多为室内,可避烈日,吾亦自备伞具。

楼上候船时,问于执事:“航程几何?”执事曰:“小船十许分,竹筏四十许分。”因携幼女,不能乘筏,遂选小船。远观小船晃晃悠悠,似无遮阳,心有惴惴。然既至,必亲验之。

候十许分,登船。船长约十米,宽不及一米,前后五六排,每排二座。妻携小女坐前,吾携长女随后,着救生衣,稳坐启程。水面碧绿,舟行缓缓,渐入溶洞。洞顶彩灯映照,岩色斑斓,虽知为灯影之效,亦叹其美。洞内清凉宜人,舟行十许分即靠岸。

登岸回望,岩壁高耸,绿植繁茂,飞瀑自三四十丈高空垂落,凉气沁人。继而步游溶洞,道为单行,仅容一人,阶途起伏。彩灯照处,石景万千,月牙潭、金龟滩、瑶池、天上石林之景,尽收眼底。洞内人虽多,然美景足以消烦。行千五百步,出洞复遇烈日。

前行有木吊桥,长余二百步,晃摇不定。余有恐高,桥高六丈余,护栏空隙稍阔,心甚忧。然大宝急欲上桥,余遂牵其手,缓步前移。至桥中,摆动最剧,心甚惧。幸桥短,转瞬即过。

复前行,有高空滑索,票虽含此项目,然携幼女不能试,仅远观之。继而下坡,兜转复回观光车换乘处,时至四时半。观景区图,仅游三分之一,尚有二处未及。然小女已寐,烈日仍炽,遂决意返程,待日后再游。

排队乘观光车,抵终点。稍歇,便归。此行虽未竟,然吾与妻虽疲,见二女嬉乐,心亦欣然。

卖房

久有售宅之心,迁延未行。此宅乃吾与内子新婚所置,时未有嗣。购未久,内子有孕,后诞小女,倏忽四五载,房贷亦偿此数。

家中旧宅可居,故早有退售之意,唯迟迟未动。一日,家父言:“此宅空置,月偿房贷,岁纳物业费,暂不入住,不若售之,可得闲钱以宽用度。”吾闻之,与内子议,终决出售。盖因现有居所无忧,此房月供物业费持续支出,且近年不拟入住,细算得不偿失。虽核之,自首付至月供、物业费,亏约二十万,然长远计,此乃无奈之举,总胜空置持续耗损。

既决,便欲探本地中介行情,亦于抖音观售房之视。原计划询线下中介,然除工时外,所知者寥寥,且有一旧识,昔年购房之顾问,今亦转行中介。吾恐杀熟,亦嫌线下奔走低效耗时,遂转至线上,下五八同城、安居客、乐有家等诸般二手房程序。然数日研究,见此等应用皆多收费,发布房源、提高曝光皆需钱,房未售出而费先至,遂弃之。

正无头绪时,偶于抖音见人直播售房,介绍楼盘。吾思:他人可借此传房产知识,吾何不借此寻合适中介?遂搜本地售房相关内容,果见诸多中介,各介房源,琳琅满目。吾择适者信,问可否助售,彼等多愿应之,盖因售出可得提成。一两日间,陆续有七八乃至更多中介加吾联系方式,吾亦告之房屋信息。后有中介问吾:“是否遍投本地中介?今诸中介皆知君售此房。”方知互联网传播之速,竟至于此。

初时,与诸中介相谈甚欢,亦有带客看房、入宅拍视频者。然渐而往来稀疏,看房者亦无动静,终至寂然。吾与内子戏言:“莫非黄矣?无人识此房?”言罢相视而笑。

实则此房地理位置与环境皆佳:处本地大学城区、老城区、城北新区三区交汇之核,周边“两横两纵”交通便达,一公里内多公交站,五分钟可至老城区与城北新区。教育方面,小区内有公立幼儿园,周边有两三所幼儿园、两所中小学、两所高中、两所大学,全龄教育皆可便捷抵达。环境上,百分之三二绿化率之下沉式园林邻江湾,景观甚佳,部分户型大阳台可赏泳池之景。配套而言,自带星悦城商业综合体,五分钟生活圈便利,近有三所医院;智能社区配管家服务,人车分流,居之安全舒适。如此佳宅,今待售之,唯盼识者。

越数日,天朗气清,值周末,吾携妻女出游散心。行于途,忽接一中介来电,遂驻足与之语。其言有客欲购此房,已观宅,意甚满意,且付订金两千,嘱吾与买方一会,互释疑虑,并携房本往登。言毕,吾复问卖方需担之费。中介告曰:“此房得本未满二载,故有增值税,加之中介费,无他费矣。”其言甚详。唯中介与买方议价为每平X元,与吾则为每平X减二十元,然此价吾可受,且较他家中介所出为高,遂欣然应之,约时往中介处会买方。挂电话,吾与妻皆讶异,自决卖房至客付订金,未及半月,速之甚,几不可信。遂喜而续游。

至期,吾家驱车赴中介公司。中介经理迎于门,引吾泊车。观其店,广约三十平方,幸网可查其资历,不然难令人信。入内,见买方二人,皆三十许女子,一携稚子,言词爽朗;一举止沉稳,寡言素衣。初以为亲眷,后知乃友或同事。少坐,略谈,中介与买方验吾房本,复印房本及双方身份证,遂签中介合同。未及二十分钟事毕,买方往银行打征信与流水,吾归待消息,此乃中介买卖双方首会。

越半月,中介传讯,言买方征信与流水已过审,嘱次日往银行签合同、开监管账户。次日,吾早至银行。买方独来,衣仍朴素;中介来二人,一男一女,前曾见于店,盖负责与银行对接者。俄而,银行合同签讫,然中途有小失:买方存首付于监管账户时,卡显为休眠,被限额,有钱而不得动,需往他行处理。待约二十分,中介女与买方匆匆返,乃存首付于监管账户。核金额毕,复归待讯。

又半月,吾问中介进展,答曰:“买方离异,然户口本未显,上次签合同亦未言,审核未过,今需重交资料,尚待时日。”再半月,吾复问,中介曰:“买方月初误以信用卡充话费二百,因其用公积金贷款,名下不得有欠,需处理,再待数日。”

又数日,中介来电,言买方银行面签及资料皆过审,可约期往税务局过户缴税。至期,吾早至政务大厅税务局窗口,不料买方到更早。吾先取号,数分钟后中介方至。幸过户窗口人少,速及吾辈。仍由中介代交资料,待税务局评估、审核,终双方缴费,再待系统审核,约二小时事毕。吾问中介何时放款,答曰:“公积金贷款每月二五统一下放,尚需待。”

倏忽又半月,二五日午后一时,吾问中介:“今已二五时,款未到矣?”中介曰:“午后二时后预问银行执事者。”吾曰:“今日务必到,迁延久矣。”中介言其同事已询银行,午后五时许可到。也罢,既已待久,亦不在乎此时,遂耐之。傍晚归家,启手机视之,房款到账,唯监管账户之款未达。联系中介,言银行已休,次日再放。

此夜,吾告妻房款以故。虽售此房亏约二十万,然及时止损,尚有余资,且此后不负房贷,无债一身轻,快哉!次日午时,尾款亦到。吾遂与中介结清费用。历时三月余,此房终售。看似有亏,然房贷之苦难耐,况今有房可居,无房贷车贷,有存款,家人安康喜乐,是乃至宝,余皆不及也。

  •  

洪绘闪回发布!论坛快捷回复,自动填充随机短语,浏览器插件

这篇文章介绍了作者基于自身体验开发的Chrome插件“洪绘闪回”,旨在解决论坛回帖后可见内容的烦恼。插件支持右键快捷生成预设或自定义回复,并可为不同网站配置不同短语集合,还具备自动填充功能,使回复操作更加高效便捷。文章还附上了Chrome插件商店的下载链接,Edge版本正在审核中。该插件提升了用户在需要频繁回帖环境下的使用体验。

  •  

在Mac上如何测试本机与服务器之间的带宽?使用iperf3测试本地与服务器的连接情况

这篇文章介绍了如何使用 iPerf3 工具排查服务器带宽不稳定问题。通过在本地电脑和服务器上分别安装 iPerf3,并在服务器上启动监听(默认5201端口),可以进行网络速度测试。文章提醒要开放对应端口,并展示了测速示例,指出丢包和带宽偏低等现象可能存在。该方法适用于分析实际带宽与云服务标称带宽之间的差距,是排查网络瓶颈的实用手段。

  •  

TailwindCSS v4 全新颜色系统与主题切换

该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/posts/tech/tailwindcss-v4-color-system-theme-switching-guide

在这之前

在很久的时候我写过一篇文章使用一种便捷的方式去实现 dark mode 的颜色切换,简单来说就是用 CSS 变量实现的,替换了默认的所有的颜色色值。

https://innei.in/posts/programming/tailwind-built-in-colors-dark-mode

这样虽然也可以实现,但是局限性比较多,比如为了让颜色支持 Tailwindcss 的 /<alpha> 的语法,我们在定义颜色的时候得这样写:

module.exports = {
  theme: {
    colors: {
      "material-opaque": "rgb(var(--color-materialOpaque) / <alpha-value>)",
    },
  },
}

此时的 CSS 变量的值并不是一个颜色值,而是一个字符串:

  --color-materialOpaque-light: 246 246 246;

不仅在编辑器中无法直接看到颜色的呈现,修改起来也是难事。

无法直接看到颜色呈现

最大的问题,如果设定的颜色本身带有透明度,那么 /<alpha> 的语法直接失效:

module.exports = {
  theme: {
    colors: {
     "material-ultra-thin-light": "rgba(var(--color-materialUltraThin-light))",
    },
  },
}

/// CSS
 --color-materialUltraThick-light: 246 246 246 / 0.84;

因为 CSS 颜色引用了透明度,将无法应用两次透明度。这直接导致 bg-material-ultra-thin-light/10 失效。

color-mix 是什么

在 TailwindCSS 4 中,不在使用原先的方式去调整透明度,而是改用 color-mix() color-mix() 函数标记接收两个 <color> 值,并返回在指定颜色空间、指定数量混合后的颜色。

它是支持多种颜色进行混合的,那么对于本身是透明的颜色,也可以再进行一次混合。

在 TailwindCSS v4 中是这样调整透明度的。

bg-background-secondary/30
    ↓
color-mix(in oklab, var(--color-background-secondary) /* oklch(0.98 0.0049 230) = #f5f9fb */ 30%, transparent);

通过混色一个 transparent,控制 transparent 的深度来实现最终的透明。

对于本身就存在透明的颜色也是没有问题的:

.bg-material-thin\/20 {
  background-color: color-mix(in oklab, var(--color-material-thin) /* oklch(0.96 0.0049 230 / 0.60) = #eff2f499 */ 20%, transparent);
}

@layer 层级控制场景下的颜色

在 TailwindCSS v4 之前的版本,也已经大量使用 @layer 来控制 className 的优先级问题,但是这个声明都是 polyfill 的,在 PostCSS 中进行转义,实际在应用中并不会出现这个 layer。

在 V4 之后的版本中,已经默认使用 layer 控制层级。v4 和 v3 之前的版本最大的不同,就是 v4 不再需要在 js config 中定义新的颜色或者覆写自带的颜色。而是全部通过 CSS 实现的,这也是得益于 layer 的优势。在 TailwindCSS 所有定义都在 @layer theme 中,我们只需要在不同的时候覆写其变量值就可以了。

那么下面就是一个简单的例子,我们需要自动切换 light/dark,支持当 data-theme='cute' 时切换主题颜色到 cute 的颜色风格。

@import "tailwindcss";

/* Light mode colors (default) */
@theme {
  --color-blue: oklch(0.65 0.18 237);
  --color-pink: oklch(0.68 0.22 350);
  --color-purple: oklch(0.65 0.2 280);
  --color-green: oklch(0.67 0.15 155);
  --color-orange: oklch(0.68 0.15 60);
  --color-yellow: oklch(0.75 0.12 100);
}

首先使用 @theme 定义 TailwindCSS 颜色。@theme 在 浏览器中也是应用在 @layer theme 中,其目的让 TailwindCSS 识别配置。

然后控制在当 dark: 作用下的颜色:

@layer theme {
  * {
    /* Dark mode overrides */
    @variant dark {
      --color-blue: oklch(0.7 0.16 237);
    --color-pink: oklch(0.73 0.2 350);
    --color-purple: oklch(0.7 0.18 280);
    --color-green: oklch(0.72 0.16 155);
    --color-orange: oklch(0.73 0.16 60);
    --color-yellow: oklch(0.78 0.14 100);
    }
  }

这里注意了,写成 @layer theme 而不是 @theme 因为这个是在浏览器中覆写的,而不是 TailwindCSS 的配置。

最后实现另类主题,我们可通过 data-theme 控制:

    
@layer theme {
  [data-theme=cute] * {
      /* Kawaii color overrides */
      --color-blue: oklch(0.85 0.12 237);
      --color-pink: oklch(0.87 0.16 350);
      --color-purple: oklch(0.84 0.14 280);
      --color-green: oklch(0.85 0.12 155);
      --color-orange: oklch(0.86 0.12 60);
      --color-yellow: oklch(0.9 0.1 100);
  }
  
     /* Kawaii dark mode overrides */
      @variant dark {
        --color-blue: oklch(0.65 0.14 237);
        --color-pink: oklch(0.7 0.18 350);
        --color-purple: oklch(0.67 0.16 280);
        --color-green: oklch(0.68 0.14 155);
        --color-orange: oklch(0.69 0.14 60);
        --color-yellow: oklch(0.73 0.12 100);
  }
}

同样另类主题也要适配 dark: 颜色适配。

至此我们实现了四套颜色的无缝切换。效果非常的好,在编辑器中也可以直接查看色值:

对比之前 V3 因为是变量,什么都看不到。而 V4 本身配置下的颜色就是变量,所以可以直接看到颜色了。

结语

什么,你问这么好用的现代的 TailwindCSS V4 的颜色系统库在能哪里找到。那必须是我最新写的 Pastel

https://github.com/Innei/Pastel

还不知道这个的赶快去点 Star,然后替换颜色定义!

看完了?说点什么呢

  •  

七月的最后一个幸运日

"今天早上打开支付宝的时候,突然蹦出来个外卖红包,本来没想点的,结果手一滑就点进去了。仔细一看,嚯!居然领了个将近20块的大红包!这运气,跟中彩票似的!"

"我赶紧翻了下能用的店铺,发现瑞幸咖啡居然能用这个红包,而且叠加优惠后直接0元购!这便宜不占白不占啊,立马下单了一杯冰美式。虽然平时我都自己带饭,总觉得外卖不卫生还油腻,但偶尔放纵一下也挺爽的~"

这几年几乎没点过外卖,美团、饿了么那些APP都快长草了。自己做饭虽然麻烦点,但胜在干净卫生,吃着也放心。特别是夏天,清淡的饭菜比油腻的外卖舒服多了。"

"最近天气还是热,不过能感觉到早晚稍微凉快些了。早上太阳出来得晚了,晚上天黑得也早了。早上躺在床上的时候,透过窗户能看到外面的晨光,特别美。随手拍了张照片,阳光洒在楼宇间,有种说不出的宁静感。"

这世间的美好,总在不经意间悄然绽放。
  •