国际 政治
2026-04-19
美国和中国既是竞争对手,也是合作伙伴。两国在科技、产业、金融、安全和地缘政治领域存在激烈竞争,但又在贸易、供应链、全球市场和国际治理方面深度绑定。
美国面临的问题
美国当前面临的最大风险,不是某一场局部冲突,而是同时陷入多个战略方向的长期消耗。过去几年,美国持续向乌克兰和以色列提供军事援助,在欧洲、中东和印太之间不断调配资源。虽然美国依然拥有全球最强的军事实力,但其武器库存、军工产能、财政压力和政治共识并不是无限的。
如果美国进一步卷入伊朗问题,中东方向将需要投入更多航母、防空系统、远程导弹和后勤保障力量。长期来看,美国可能因为多线作战而逐渐失去集中力量的能力,这意味着其在西太平洋可用于威慑中国的资源会被削弱。
很多人认为美国正在走向衰败,但更准确地说,美国只是从冷战后绝对主导地位转向相对收缩。长期介入欧洲、中东和亚洲事务,再加上财政压力、政治分裂、产业空心化以及军工补充能力下降,使美国越来越难同时维持多个方向的压倒性优势。
中国统一的机会
对中国而言,统一台湾虽然重要,但并不是当前最优先的目标。短期内,中国主动发起全面军事行动的概率并不高,因为跨海登陆成本巨大,更重要的是,战争还可能冲击出口、金融、能源和科技领域,打断经济发展进程。
因此,中国更现实的选择,是采取长期施压和逐步收紧的方式,包括军事威慑、外交孤立、经济影响以及削弱美国地区影响力。与此同时,中国会把重点放在产业链自主、科技突破、军事实力提升、人民币国际化和全球影响力扩张上。
从战略角度看,中国最优选择不是抢时间,而是争取时间。只要美国继续陷入多线消耗,而中国能够保持经济、科技和军力增长,未来在台湾问题上就会拥有更大的主动权和更低的成本。
开发者
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的调用。 |
历史 法律
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:
- 第一部宪法是 1954 年制定,被称之为五四宪法。
1949 年,依照临时宪法性质文件《中国人民政治协商会议共同纲领》建国。
- 第二部宪法是文革后期制定,被称之为七五宪法。
这部文革宪法撤销了国家主席、副主席职务。不用懂法,也应该猜到这部宪法绝对超烂,不可能有任何法治精神。
- 第三部宪法是文革结束之后 1978 年制定,修复部分国家机构功能,比如恢复司法机关。
应该算是快速结束动乱的一步过渡宪法。
- 第四部宪法(现行宪法)是改革开放之后,1982 年制定,恢复了国家主席职务,重建国家治理体系。
- 1988年宪法修正案:承认私营经济是公有制经济的补充,允许土地使用权依法转让
- 1993年宪法修正案:明确“国家实行社会主义市场经济”(从计划经济转型)
- 1999年宪法修正案:依法治国,建设社会主义法治国家 / 确立非公有制经济的重要组成部分地位
- 2004年宪法修正案:国家尊重和保障人权 / 产权制度正式入宪
- 2018年宪法修正案:取消国家主席任期限制 / 国家监察委员会
- 胡耀邦总书记 1987 年辞职之后于 1989/04 年因心脏病去逝,享年 74 岁。
- 李克强总理 2023 年 3 月卸任,当年 10 月因心脏病去世,享年 68 岁。
开发者工具 Email
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
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 编写的、快速、简洁且功能强大的静态网站生成器,专门用于创建项目文档。
它的核心设计理念是简单易用,其主要特点包括:
- 文档即源码:使用易于编写的 Markdown 格式来撰写内容,通过一个 YAML 配置文件 (
mkdocs.yml) 来管理网站导航和设置。
- 即时预览:内置开发服务器,支持在编写文档时实时预览更改。
- 主题化:拥有丰富的主题系统(如广受欢迎的 Material for MkDocs 主题),可以轻松定制网站外观。
- 插件化架构:这是其早期获得成功的关键,允许通过插件扩展其功能(如支持代码文档生成、SEO优化等)。
核心工作流程非常简单:
- 在
docs 文件夹中编写 Markdown 文件。
- 配置
mkdocs.yml 文件,定义网站结构。
- 运行
mkdocs build 命令生成一个完整的静态网站(通常是 HTML、CSS、JS 文件)。
- 可以轻松地将生成的站点部署到 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 的生态位已被三个竞品瓜分:
- ProperDocs (@oprypin):MkDocs 1.x 的延续,强调向下兼容和插件生态。
- https://properdocs.org/
- https://github.com/ProperDocs/properdocs
- BSD-2-Clause license
- 80 stars
- Python
-
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.
-
MaterialX (@jaywhj):Material for MkDocs 的社区延续版本。
- https://jaywhj.github.io/mkdocs-materialx/
- https://github.com/jaywhj/mkdocs-materialx
- MIT license
- 87 stars
- Python
根本原因复盘
- 治理失败:创始人长期缺席后突然回归“夺权”,无视社区贡献者的历史功绩和现有生态。
- 技术独裁:在未达成共识的情况下,强行推行破坏性变更,且拒绝公开协作。
- 生态反噬:当核心工具(Material)与上游(MkDocs)决裂,用户被迫用脚投票,导致项目事实性死亡。
开发者
2026-04-01
Golang
2026-03-25
看了这篇博客 Go 语言之父亲自下场道歉:藏在 Spec 里的十年“笔误”,终于要修正了!,讲的是 Go 语言规范中对 bool 类型定义的长期笔误被修正,其本质是内建类型(predeclared type)而非自定义类型(defined type)。
重新梳理一下我对 Golang 类型系统的一点认知。
-
从实现角度看,Go 类型系统可以抽象为三个核心维度:
- Type Identity(类型同一性):决定类型是否相等
- Underlying Type(底层类型):决定类型转换规则
- Assignability(可赋值性):决定类型之间是否可以直接使用
大多数类型问题,本质都是这三者的组合。
-
类型系统
Type
├── Named Type(命名类型)
│ ├── Predeclared Type(内建类型)
│ ├── Defined Type(通过 type 定义的新类型)
│ └── Type Parameter(泛型参数)
├── Unnamed Type(Type Literal)
└── Alias(类型别名,声明机制,不是类型分类)
政治
2026-03-24
低代码 Frappe
2026-03-20
个人
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 |
- |
说明:
- 一个人生活的话,公共交通就挺好的,不需要车,没有停车、加油费用。
- 如果床车的话,需要考虑停车、充电、保险、保养、罚单等费用。
- 停车费用 300/月
- 充电费用 200/月
- 保险费用 200/月
- 保养费用 100/月
- 其他费用 100/月