#1112 国际形势判断:美国与台湾

2026-04-19

美国和中国既是竞争对手,也是合作伙伴。两国在科技、产业、金融、安全和地缘政治领域存在激烈竞争,但又在贸易、供应链、全球市场和国际治理方面深度绑定。

美国面临的问题

美国当前面临的最大风险,不是某一场局部冲突,而是同时陷入多个战略方向的长期消耗。过去几年,美国持续向乌克兰和以色列提供军事援助,在欧洲、中东和印太之间不断调配资源。虽然美国依然拥有全球最强的军事实力,但其武器库存、军工产能、财政压力和政治共识并不是无限的。

如果美国进一步卷入伊朗问题,中东方向将需要投入更多航母、防空系统、远程导弹和后勤保障力量。长期来看,美国可能因为多线作战而逐渐失去集中力量的能力,这意味着其在西太平洋可用于威慑中国的资源会被削弱。

很多人认为美国正在走向衰败,但更准确地说,美国只是从冷战后绝对主导地位转向相对收缩。长期介入欧洲、中东和亚洲事务,再加上财政压力、政治分裂、产业空心化以及军工补充能力下降,使美国越来越难同时维持多个方向的压倒性优势。

中国统一的机会

对中国而言,统一台湾虽然重要,但并不是当前最优先的目标。短期内,中国主动发起全面军事行动的概率并不高,因为跨海登陆成本巨大,更重要的是,战争还可能冲击出口、金融、能源和科技领域,打断经济发展进程。

因此,中国更现实的选择,是采取长期施压和逐步收紧的方式,包括军事威慑、外交孤立、经济影响以及削弱美国地区影响力。与此同时,中国会把重点放在产业链自主、科技突破、军事实力提升、人民币国际化和全球影响力扩张上。

从战略角度看,中国最优选择不是抢时间,而是争取时间。只要美国继续陷入多线消耗,而中国能够保持经济、科技和军力增长,未来在台湾问题上就会拥有更大的主动权和更低的成本。

#1111 一种廉价技术栈方案

2026-04-18

博客文章 Steve Hanov's Blog 《How I run multiple $10K MRR companies on a $20/month tech stack》介绍,他运行多个月收入1万美元公司的技术栈以极简和高性价比为核心,每月总成本控制在20美元左右。在极低成本下实现高可用的创业项目,避免过早引入复杂架构和巨额云账单。
PS:其实没有计算一次性购买 GPU 的费用,以及开发工具 GitHub Copilot 的月费。

以下是其技术栈的详细总结:

类型 选型 价格 说明
服务器 Linode / DigitalOcean $5–$10/月 选用廉价可靠的虚拟私有服务器。单台服务器(1GB RAM)足以支撑初期业务,并通过swap文件扩展内存。
后端语言 Go 免费 静态编译为单一二进制文件,部署简单(直接scp到服务器),性能高、内存占用低,且易于LLM理解和维护。
本地AI推理 VLLM(RTX 3090 GPU) 一次性投资约$900 利用本地GPU进行批量AI任务(如文档分析),配合Ollama快速测试模型,Transformer Lab进行微调。
LLM服务 OpenRouter 按请求付费(未透露) 统一接入Claude、ChatGPT等前沿模型,提供OpenAI兼容接口,并支持自动故障转移(如某服务宕机时切换至其他模型)。
开发工具 GitHub Copilot(VS Code) 约$60/月 按请求计费而非按token,可长时间运行复杂代码重构任务而成本固定(约$0.04/请求),性价比高于专用AI IDE。
数据库 SQLite 免费 单文件数据库,启用WAL(Write-Ahead Logging)后支持高并发读写,性能优于远程PostgreSQL,适合初创业务。
部署方式 scp(安全复制) 免费 将Go编译的二进制文件直接复制到VPS运行,无需容器化或复杂CI/CD,简化运维。
前端建议 htmx 免费 博客评论中推荐使用htmx实现轻量级前端交互,避免重型框架。

PS:需要执行 AI 任务的时候,线上服务调用作者本地机器进行 GPU 计算(可能是搞了一个 VPN)。
PS:开启 WAL 模式之后,SQLite 的并发性能会有很大提升。(SQLite WAL 模式

自研库:

类型 说明
身份验证库 smhanov/auth 自研的轻量级认证库,直接集成SQLite等数据库,支持用户注册、会话管理、密码重置及第三方登录(Google、Facebook、X、SAML)。
AI代理工具 smhanov/laconic 针对受限上下文窗口(如8K)优化的代理研究工具,通过“分页”机制管理LLM上下文,保留关键信息以处理长对话。
LLM抽象层 smhanov/llmhub 将本地或云端的LLM统一抽象为简单的provider/endpoint/apikey组合,简化文本和图像IO的调用。

#1110 新中国的四部宪法

2026-04-10

这几个职务就任时间有偏差,不能完全对齐,差不多看看就行。

时期 党最高领导 军委主席 国家主席 总理
1949–1954 毛泽东(党主席) 毛泽东 毛泽东(中央人民政府主席) 周恩来(政务院)
1954–1959 毛泽东 毛泽东 毛泽东 周恩来
1959–1968 毛泽东 毛泽东 刘少奇 周恩来
1968–1976 毛泽东 毛泽东 无(职位取消) 周恩来
1976–1978 华国锋(党主席) 华国锋 华国锋
1978–1981 华国锋 华国锋 华国锋
1981–1982 胡耀邦(党主席) 邓小平 赵紫阳
1982–1987 胡耀邦(总书记) 邓小平 李先念 赵紫阳
1987–1992 赵紫阳 邓小平 → 江泽民 杨尚昆 李鹏
1992–1997 江泽民 江泽民 江泽民 李鹏
1997–2002 江泽民 江泽民 江泽民 朱镕基
2002–2007 胡锦涛 江泽民 → 胡锦涛 胡锦涛 温家宝
2007–2012 胡锦涛 胡锦涛 胡锦涛 温家宝
2012–2017 习近平 习近平 习近平 李克强
2017–2022 习近平 习近平 习近平 李克强
2022–2027 习近平 习近平 习近平 李强
2027–2032

PS:

  1. 第一部宪法是 1954 年制定,被称之为五四宪法。
    1949 年,依照临时宪法性质文件《中国人民政治协商会议共同纲领》建国。
  2. 第二部宪法是文革后期制定,被称之为七五宪法。
    这部文革宪法撤销了国家主席、副主席职务。不用懂法,也应该猜到这部宪法绝对超烂,不可能有任何法治精神。
  3. 第三部宪法是文革结束之后 1978 年制定,修复部分国家机构功能,比如恢复司法机关。
    应该算是快速结束动乱的一步过渡宪法。
  4. 第四部宪法(现行宪法)是改革开放之后,1982 年制定,恢复了国家主席职务,重建国家治理体系。
    1. 1988年宪法修正案:承认私营经济是公有制经济的补充,允许土地使用权依法转让
    2. 1993年宪法修正案:明确“国家实行社会主义市场经济”(从计划经济转型)
    3. 1999年宪法修正案:依法治国,建设社会主义法治国家 / 确立非公有制经济的重要组成部分地位
    4. 2004年宪法修正案:国家尊重和保障人权 / 产权制度正式入宪
    5. 2018年宪法修正案:取消国家主席任期限制 / 国家监察委员会
  5. 胡耀邦总书记 1987 年辞职之后于 1989/04 年因心脏病去逝,享年 74 岁。
  6. 李克强总理 2023 年 3 月卸任,当年 10 月因心脏病去世,享年 68 岁。

#1109 使用 curl 命令发送邮件

2026-04-05

用 perl 开发的命令行工具 swaks 用来发送邮件挺方便的,但是有些环境不便安装,我问 AI,结果推荐了 curl 命令。

-> % curl --help smtp
smtp: SMTP protocol
     --crlf                       Convert LF to CRLF in upload
 -F, --form <name=content>        Specify multipart MIME data
     --form-string <name=string>  Specify multipart MIME data
 -H, --header <header/@file>      Pass custom header(s) to server
     --login-options <options>    Server login options
     --mail-auth <address>        Originator address of the original email
     --mail-from <address>        Mail from this address
     --mail-rcpt <address>        Mail to this address
     --mail-rcpt-allowfails       Allow RCPT TO command to fail
     --oauth2-bearer <token>      OAuth 2 Bearer Token
 -X, --request <method>           Specify request method to use
     --ssl                        Try enabling TLS
     --ssl-reqd                   Require SSL/TLS

我用 curl 发送了几封邮件,还真的挺好的,满足我的要求。

  • 生成邮件内容:

    export FROM=noreply@example.com
    export RCPT=ninedoors@126.com
    export USER=shanda
    export PASS=6404290f99f75bf182673bcbd012c121
    
    # AI 生成验证码邮件模板
    cat > /tmp/mail.html <<EOF
    From: $FROM
    To: $RCPT
    Subject: Your Verification Code: CODE
    Content-Type: text/html; charset=UTF-8
    
    <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, initial-scale=1.0"><title>Verification Code</title><style>@media only screen and(max-width:600px){.container{width:100%!important}.mobile-padding{padding:10px!important}}</style></head><body style="margin: 0; padding: 10px; background-color: #f4f4f4; font-family: Arial, sans-serif;"><table role="presentation"align="center"border="0"cellpadding="0"cellspacing="0"width="100%"style="max-width: 600px; width: 100%; margin: 0 auto; background-color: #ffffff;"><tr><td class="mobile-padding"style="padding: 40px 20px;"><table role="presentation"width="100%"border="0"cellpadding="0"cellspacing="0"><tr><td style="padding-bottom: 30px;"><h1 style="color: #333333; margin: 0;">Verification Code</h1></td></tr></table><table role="presentation"width="100%"border="0"cellpadding="0"cellspacing="0"><tr><td style="padding: 20px 0;"><p style="color: #666666; line-height: 1.6; font-size: 16px;">Your verification code is:<h2 style="letter-spacing: 2px;">CODE</h2></p></td></tr></table></td></tr></table></body></html>
    EOF
    
    # 替换验证码内容,我不想每次发送相同内容
    # sed "s/CODE/$(printf "%06d" $((RANDOM % 1000000)))/g" /tmp/mail.html > /tmp/mail2.html
    sed s/CODE/$(python -c "import secrets; print('%06d' % secrets.randbelow(10**6))")/g /tmp/mail.html > /tmp/mail2.html
    
  • 邮件发送:

    curl smtp://smtp.engagelab.cc:2525 --mail-from nobody@whatever.com --mail-rcpt $RCPT --user "$USER:$PASS" --upload-file /tmp/mail2.html -vv -s 2>&1 | grep -Fv '] * '
    

遇到一个奇怪的现象:zsh 中 RANDOM 这样使用结果不会变更,没有时间研究,暂时忽略。

-> % echo $(printf "%06d" $((RANDOM % 1000000)))
018840
-> % echo $(printf "%06d" $((RANDOM % 1000000)))
018840
-> % echo $(printf "%06d" $((RANDOM % 1000000)))
018840

如果直接使用却会,不知道为什么:

for i in {1..5}; do echo $RANDOM done

#1108 开源文档工具 MkDocs 项目的崩塌与生态分裂始末

2026-04-02
  • https://www.mkdocs.org/
    • https://github.com/mkdocs/mkdocs
    • BSD-2-Clause license
    • 21.9K stars
    • Python
    • 当前版本:Version 1.6.1 (2024-08-30)
  • https://squidfunk.github.io/mkdocs-material/
    • https://github.com/squidfunk/mkdocs-material
    • MIT license
    • 26.4K stars
    • Python

MkDocs 是一个用 Python 编写的、快速、简洁且功能强大的静态网站生成器专门用于创建项目文档

它的核心设计理念是简单易用,其主要特点包括:

  1. 文档即源码:使用易于编写的 Markdown 格式来撰写内容,通过一个 YAML 配置文件 (mkdocs.yml) 来管理网站导航和设置。
  2. 即时预览:内置开发服务器,支持在编写文档时实时预览更改。
  3. 主题化:拥有丰富的主题系统(如广受欢迎的 Material for MkDocs 主题),可以轻松定制网站外观。
  4. 插件化架构:这是其早期获得成功的关键,允许通过插件扩展其功能(如支持代码文档生成、SEO优化等)。

核心工作流程非常简单:

  1. docs 文件夹中编写 Markdown 文件。
  2. 配置 mkdocs.yml 文件,定义网站结构。
  3. 运行 mkdocs build 命令生成一个完整的静态网站(通常是 HTML、CSS、JS 文件)。
  4. 可以轻松地将生成的站点部署到 GitHub Pages、Netlify 等托管服务。

MkDocs 因其极低的学习成本优雅的输出效果,长期以来是 Python 生态乃至更广技术社区中创建项目文档的首选工具之一

项目的崩塌与生态分裂始末

The Slow Collapse of MkDocs

这篇文章复盘了 Python 静态站点生成器 MkDocs 从 2014 年诞生到 2026 年陷入“慢速崩塌”的全过程。
核心矛盾在于:创始人回归后推行破坏生态的激进重构(v2),与社区长期维护者及插件生态爆发激烈冲突,最终导致项目分裂。

核心冲突:技术路线与社区治理的撕裂

  • v2 激进重构:创始人 @lovelydinosaur 主导的 MkDocs 2.0 计划移除插件系统,改为私有开发模式,被社区视为“开倒车”和背离开源精神。
  • 生态断裂:Material for MkDocs(最受欢迎的主题)因 v2 不兼容宣布进入维护模式,并另起炉灶开发 Zensical。
  • 权力斗争:前核心维护者 @oprypin 因权限被削与创始人产生激烈冲突,甚至上演了短暂的 PyPI 仓库“夺权”闹剧。

时间线:从繁荣到分裂

时间 关键事件 影响
2014-2021 项目诞生,@waylan 长期单核维护 项目成熟但进展缓慢
2021-2024 @oprypin 接手,进入活跃维护期 功能迭代稳定,生态繁荣
2024 创始人回归,@oprypin 被削权出走 核心开发停滞,社区分裂
2025-2026 MkDocs v2 公布(无插件),Material 停更 生态彻底崩塌,替代品涌现

当前格局:三分天下

MkDocs 的生态位已被三个竞品瓜分:

  1. ProperDocs (@oprypin):MkDocs 1.x 的延续,强调向下兼容和插件生态。
    • https://properdocs.org/
    • https://github.com/ProperDocs/properdocs
    • BSD-2-Clause license
    • 80 stars
    • Python
  2. Zensical (@squidfunk):Material 团队重写,性能更强,旨在成为下一代标准。

    • https://zensical.org/
    • https://github.com/zensical/zensical
    • MIT license
    • 4.1K stars
    • Rust

    Zensical is a modern static site generator designed to simplify building and maintaining project documentation. It's built by the creators of Material for MkDocs and shares the same core design principles and philosophy – batteries included, easy to use, with powerful customization options.

  3. MaterialX (@jaywhj):Material for MkDocs 的社区延续版本。

    • https://jaywhj.github.io/mkdocs-materialx/
    • https://github.com/jaywhj/mkdocs-materialx
    • MIT license
    • 87 stars
    • Python

根本原因复盘

  • 治理失败:创始人长期缺席后突然回归“夺权”,无视社区贡献者的历史功绩和现有生态。
  • 技术独裁:在未达成共识的情况下,强行推行破坏性变更,且拒绝公开协作。
  • 生态反噬:当核心工具(Material)与上游(MkDocs)决裂,用户被迫用脚投票,导致项目事实性死亡。

#1106 Golang 类型系统

2026-03-25

看了这篇博客 Go 语言之父亲自下场道歉:藏在 Spec 里的十年“笔误”,终于要修正了!,讲的是 Go 语言规范中对 bool 类型定义的长期笔误被修正,其本质是内建类型(predeclared type)而非自定义类型(defined type)。
重新梳理一下我对 Golang 类型系统的一点认知。

  1. 从实现角度看,Go 类型系统可以抽象为三个核心维度:

    • Type Identity(类型同一性):决定类型是否相等
    • Underlying Type(底层类型):决定类型转换规则
    • Assignability(可赋值性):决定类型之间是否可以直接使用

    大多数类型问题,本质都是这三者的组合。

  2. 类型系统

    Type
    ├── Named Type(命名类型)
    │   ├── Predeclared Type(内建类型)
    │   ├── Defined Type(通过 type 定义的新类型)
    │   └── Type Parameter(泛型参数)
    ├── Unnamed Type(Type Literal)
    └── Alias(类型别名,声明机制,不是类型分类)
    
    • Named Type(命名类型)

      • 具有类型标识(Type Identity)
      • 类型相等 => 是否为同一 Type Identity(即同一声明)
      • Defined Type 支持方法绑定(行为扩展)
      • 用于语义建模
      • 每个类型都有 underlying type,用于决定类型转换和兼容性
    • Unnamed Type(未命名类型,或者叫类型字面量 Type Lit),即 TypeLit,比如:struct{}[]Tmap[K]Vfunc(int) string

      • 无类型名,仅结构定义
      • 类型相等 => 结构一致(Structural Identity:字段、顺序、tag 等完全一致)
      • 不支持方法绑定
      • 用于数据组合
    • Alias

      • 复用原类型的 Type Identify
      • 不创建新类型,和原类型完全等价
      • 不能绑定新的方法(Alias 不能作为 receiver,方法由原类型决定)
      • 应用场景
        • 包结构重构:旧包中给新包类型定义别名,可以不影响旧代码,也可以保障 API 兼容。
        • 在对外暴露的包中定义别名,减少调用方包导入

#1103 生活费用估算

2026-03-19

抖音刷到一个人分享自己的基本消费清单,我来了兴趣,拟定了一个自己的版本,以及一个床车版本(假定开一个新能源汽车,就住在公司附近停车场):

项目 网络版本 自己预估 备注 床车版本 备注
居住 - 1200 房租、水电、天然气、物业费 200 健身房洗澡
理发 25 10 大概两个半月剪一次,每次 20~30 10 -
450 0 - 0 -
汽车 600 300 交通费 900 -
三餐 1800 1200 每天 40 1200 -
零食水果 400 200 每周 50 200 -
买衣服 300 0 - 0 -
话费 80 90 包括宽带 90 -
其他 300 200 生活物资采买、医疗等 200 -
共计 3955 3200 - 2900 -

说明:

  1. 一个人生活的话,公共交通就挺好的,不需要车,没有停车、加油费用。
  2. 如果床车的话,需要考虑停车、充电、保险、保养、罚单等费用。
    1. 停车费用 300/月
    2. 充电费用 200/月
    3. 保险费用 200/月
    4. 保养费用 100/月
    5. 其他费用 100/月