“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
Zig 编译器瘦身:包管理功能全部迁移至构建系统,架构与安全双升级
Zig 将包管理逻辑从编译器移入构建系统,实现瘦身、安全增强与可热修复。
背景:为什么要把包管理从编译器里搬出去?
Zig 语言一直以来都采用“一体化”设计——编译器本身不仅负责代码编译,还内置了包管理、HTTP 客户端、TLS、Git 协议、多种压缩格式(xz、gzip、zstd、flate)解析、ZON 文件处理等能力。这种设计在早期简化了工具链,但随着 Zig 生态发展,其弊端越来越明显:
- 编译器二进制体积膨胀:所有功能都静态编译进 zig 可执行文件,导致体积大、启动慢。
- 无法热修复:任何包管理逻辑的 Bug 都需要重新编译整个编译器才能修复,贡献者难以快速迭代。
- 安全风险集中:网络请求、加密、文件解析等高风险代码运行在编译器进程中,一旦有漏洞可能影响整个构建流程。
- CPU 指令集利用受限:为了兼容性,编译器分发时只能使用最通用的指令集,无法利用本地 CPU 的特殊加密指令(如 AES-NI、SHA 扩展)来加速。
架构演进:从“父子”到“祖孙”
旧的进程树(2026 年 6 月之前)
zig build (zig compiler + package manager)
└─ builder (用户 build.zig 逻辑 + 构建系统实现)
zig build进程同时扮演编译器、包管理器和构建调度器。builder子进程负责执行用户的build.zig脚本。- 如果
build.zig或相关依赖发生变化(比如zig build --watch),zig build需要重启整个流程,包括重新执行包管理逻辑。
第一次分离(configurer/maker)
zig build (zig compiler + package manager)
├─ configurer (用户 build.zig 逻辑)
└─ maker (构建系统)
- 用户脚本执行与构建系统实现被拆分为两个独立进程:
configurer和maker。 - 但问题在于:
maker是configurer的兄弟进程,而非子进程。当配置需要重新运行时(例如build.zig文件变更),maker必须退出,zig build才能重新执行包管理逻辑,然后再次启动新的maker。
最终架构(包管理移入 maker)
zig build (zig compiler)
└─ maker (构建系统 + 包管理器)
└─ configurer (用户 build.zig 逻辑)
zig build现在只负责编译器本身,不再包含包管理。maker进程同时承担构建系统和包管理器的角色。- 当配置需要重新运行时,
maker可以保持存活(因为它是configurer的父进程),只需重新创建configurer子进程即可。 - 对于即将推出的构建服务器(build server),这意味着服务器无需退出、客户端无需重连,只需通知客户端配置已变更即可。
具体迁移了哪些功能?
以下子命令从编译器转移到了 maker 进程:
zig buildzig fetchzig initzig libc
随之迁移的底层模块(以源码形式提供,而非编译进二进制):
- 包获取逻辑
- HTTP 客户端和网络栈
- TLS 及相关加密算法
- Git 协议实现
- xz、gzip、zstd、flate 压缩/解压
- ZIP 文件解析与验证
build.zig.zon文件处理
关键收益
1. 可热修复(无需重新编译编译器)
由于包管理逻辑现在以 Zig 源码形式随标准库分发,用户或贡献者可以直接修改这些源码并测试,无需重建整个 zig 编译器。这大大降低了迭代门槛,也使得紧急安全补丁可以快速部署。
2. 安全增强:ReleaseSafe 模式
maker 进程默认以 ReleaseSafe 模式编译。这意味着所有网络请求、文件解析、加密操作都带有运行时安全检查(如整数溢出检测、边界检查),而编译器本身仍然可以使用 ReleaseFast 模式以获得最佳性能。
3. 利用本地 CPU 指令集(AOT + JIT 兼得)
所有加密和哈希操作(如 SHA-256、AES)现在可以针对运行机器的 CPU 特性进行编译。即使某些指令过于小众(如 Intel SHA Extensions、AMD SM4),无法在分发版本中默认启用,现在也能在本地即时生效。Zig 团队称之为“AOT cake and eat JIT, too”——既有提前编译的确定性,又有即时编译的针对性优化。
4. 编译器体积缩小 4%
在 ReleaseSmall 模式下(不含 LLVM),zig 可执行文件从 14.1 MiB 缩减至 13.5 MiB,缩小了约 4%。虽然绝对值不大,但这只是第一步——未来更多功能可能从编译器迁出。
非兼容性变化(Breaking Changes)
本次重构几乎完全向后兼容,但有以下可观测差异:
| 旧方式 | 新方式 |
|---|---|
--maker-opt 标志 |
ZIG_DEBUG_MAKER 环境变量 |
--zig-lib-dir 标志 |
ZIG_LIB_DIR 环境变量 |
环境变量方式更适合构建服务器的场景,避免命令行参数传递的复杂性。
尚待解决的问题(Zig 0.17.0 的拦路虎)
作者 Andrew Kelley 列出了以下后续任务,预计在 2026 年 8 月初完成:
- 构建服务器协议 MVP:必须实现,以解除 ZLS(Zig Language Server)的阻塞。
- 构建脚本自身路径依赖:支持将
build.zig脚本本身的依赖项(如本地库)作为路径依赖添加到包管理。 zig build --watch对构建脚本的自动重跑:当build.zig文件本身被修改时,自动触发重新配置和构建。- 不同工作目录导致构建脚本缓存未命中:修复因 cwd 变化导致的缓存失效问题。
对 Zig 生态的影响
- ZLS 受益:构建服务器协议将使得 Zig 语言服务器能够更智能地处理项目配置变更,无需频繁重启。
- 贡献门槛降低:包管理相关代码不再是编译器的一部分,贡献者可以单独提交 PR 而不必担心影响编译器核心。
- GPU/Shader 开发:虽然本文重点在包管理,但同一篇 devlog 还介绍了 SPIR-V 后端的巨大进展(
@SpirvType内置函数、执行模式作为调用约定、多线程代码生成、对象文件链接等),表明 Zig 在 GPU 计算和着色器领域的野心。