<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/styles.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>一个人的战争 | 凝霜的成长历程</title><description>凝霜的成长历程</description><link>https://hackers-delight.com/</link><item><title>SCM Breeze 平替与泛化: 打造更灵活的命令行增强工具</title><link>https://hackers-delight.com/blog/202508-scm-breeze-alternative/</link><guid isPermaLink="true">https://hackers-delight.com/blog/202508-scm-breeze-alternative/</guid><description>SCM Breeze 是一个 git 的命令行增强工具, 但是其过于复杂, 且无法应用于 git 命令以外的场景, 因此本文给出了一个轻量级的平替及泛化方案</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/scmbreeze/scm_breeze&quot;&gt;SCM Breeze&lt;/a&gt; 是一个 &lt;code&gt;git&lt;/code&gt; 命令行的增强工具, 其核心功能是给 &lt;code&gt;git status&lt;/code&gt; 返回的文件加上数字编号, 后续的 &lt;code&gt;git  add&lt;/code&gt; 等命令可以直接使用这个编号, 而无需复制/粘贴文件名.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202508-scm-breeze-alternative-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用原生 &lt;code&gt;git&lt;/code&gt; 命令行:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add assets/git_breeze/config* assets/git_breeze/install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 &lt;code&gt;SCM Breeze&lt;/code&gt; 则是 (下面三种都可以):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ga $e2 $e3 $e11
ga 2 3 11
ga 2-3 11
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;为什么要替代 SCM Breeze&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SCM Breeze&lt;/code&gt; 有如下痛点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它预先定义了过多的 &lt;code&gt;alias&lt;/code&gt;, 而如果恰好你用 &lt;code&gt;Oh My Zsh&lt;/code&gt; 这种方案, 会有大量的冲突&lt;/li&gt;
&lt;li&gt;它无法自由地跟系统指令进行组合, 仅限于 &lt;code&gt;git&lt;/code&gt; 一个场景&lt;/li&gt;
&lt;li&gt;其实现过于复杂, 想进行扩展非常困难&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而在看到 &lt;a href=&quot;https://sblask.github.io/blog/tech/2017/04/10/migrating-away-from-scm-breeze.html&quot;&gt;Migrating away from SCM Breeze&lt;/a&gt; 这篇文章以后, 我发现这个博主给的解决方案非常优雅, 而且极具扩展性.&lt;/p&gt;
&lt;h2&gt;开启替代之旅&lt;/h2&gt;
&lt;h3&gt;先睹为快&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;images/202508-scm-breeze-alternative-1.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;定义核心诉求&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;核心框架要足够简单, 并且可以自由扩展&lt;/li&gt;
&lt;li&gt;可以扩展到日常高频的使用场景 (&lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;...)&lt;/li&gt;
&lt;li&gt;所有指令、别名都可以自定义, 符合个人使用习惯&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;原理解析&lt;/h3&gt;
&lt;p&gt;以下面的命令为例:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function l {
    { __print-path-argument $@; eza -lah --time-style=long-iso --color=always $@ } \
        | add-index --input-type eza_list --print-indexables | set-index-variables
}
compdef _ls l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一部分是原始命令的输出 (&lt;code&gt;__print-path-argument&lt;/code&gt; 这个可以先忽略):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202508-scm-breeze-alternative-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二部分则是给原有信息加上类似 &lt;code&gt;[1]&lt;/code&gt; 这种数字序号, 再追加 &lt;code&gt;@@indexables@@&lt;/code&gt; 元信息.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; &lt;code&gt;add-index&lt;/code&gt; 这个适配了 &lt;code&gt;ag&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;eza&lt;/code&gt;, &lt;code&gt;tree&lt;/code&gt; 等专用命令, 以及一个通用的 &lt;code&gt;list&lt;/code&gt; 格式.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202508-scm-breeze-alternative-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第三部分则去掉元信息部分, 并且设置环境变量 (&lt;code&gt;$e1&lt;/code&gt; 这种形式):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202508-scm-breeze-alternative-4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;经过上面的步骤, 在执行特定的指令以后, 环境变量里会设置 &lt;code&gt;e1 ... eN&lt;/code&gt;, 保存的是相应文件的路径.&lt;/p&gt;
&lt;p&gt;接下来是展开部分的魔法:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function expand-indexes-or-expand-or-complete {
    # ...
}
zle -N expand-indexes-or-expand-or-complete
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注册好这个自定义补全方法后, 会自动展示命令行输入的序号等信息.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 输入 ls 1-2 按 Tab 键, 会被自动展开成
ls /Users/mdl/Code/NsLib/blog-code-snippet/scm-breeze-alternative/add-index /Users/mdl/Code/NsLib/blog-code-snippet/scm-breeze-alternative/README.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;完整方案&lt;/h2&gt;
&lt;p&gt;代码见: https://github.com/NsLib/blog-code-snippet/tree/master/scm-breeze-alternative&lt;/p&gt;
&lt;p&gt;这里不是一个开箱即用的完整方案, 而是需要你自行整合进自己现有的 &lt;code&gt;zsh&lt;/code&gt; 配置中:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;add-index&lt;/code&gt; 文件放到自己喜欢的 &lt;code&gt;bin&lt;/code&gt; 目录, 例如:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.local/bin/add-index&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/local/bin/add-index&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;theme.yml&lt;/code&gt; 文件放到 &lt;code&gt;~/.config/eza/theme.yml&lt;/code&gt; (注意: &lt;code&gt;eza&lt;/code&gt; 适配了这个主题的配色, 想用其他的要自行适配)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zshrc&lt;/code&gt; 则整合进自己的 &lt;code&gt;~/.zshrc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;生产力工具这个事情, 最好是自己动手, 这样才能真正适合自己的使用习惯.&lt;/p&gt;
</content:encoded></item><item><title>使用 Obsidian 和 Astro 搭建个人博客</title><link>https://hackers-delight.com/blog/202505-builing-blog-with-obsidian-and-astro/</link><guid isPermaLink="true">https://hackers-delight.com/blog/202505-builing-blog-with-obsidian-and-astro/</guid><description>介绍如何结合 Obsidian 与 Astro 搭建个人博客.</description><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;选型&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;编辑器: &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;静态网站生成器: &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;博客主题: &lt;a href=&quot;https://github.com/manuelernestog/astrofy&quot;&gt;Astrofy&lt;/a&gt; (自行扩充了很多功能)&lt;/li&gt;
&lt;li&gt;部署: &lt;a href=&quot;https://pages.cloudflare.com/&quot;&gt;Cloudflare Pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;博客初始化&lt;/h2&gt;
&lt;p&gt;这里仅给出一些核心命令, 详情可以参考官网或者其他文章.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用 astrofy 主题初始化博客
pnpm create astro@latest --template manuelernestog/astrofy

cd demo
# 安装依赖
pnpm install

# 启动本地开发服务，预览博客
pnpm run dev

# 构建可部署的静态网站
pnpm exec astro build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-builing-blog-with-obsidian-and-astro-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Obsidian 配置&lt;/h2&gt;
&lt;p&gt;博主日常使用 &lt;code&gt;Obsidian&lt;/code&gt; 来维护笔记, 因此在写博客时也希望保持一致的编辑体验.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; 拥有低启动成本非常重要, 博客停更这几年, 有很多次想重新写, 但是因为编辑体验不好直接放弃.&lt;/p&gt;
&lt;h3&gt;插件 - Paste Image Rename&lt;/h3&gt;
&lt;p&gt;这个插件可以在粘贴图片时, 自动命名为 &lt;code&gt;{{fileName}}-{{自增后缀}}&lt;/code&gt; 形式, 省去手动命名的烦恼.&lt;/p&gt;
&lt;p&gt;配置如下图所示:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-builing-blog-with-obsidian-and-astro-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;插件 - Linter&lt;/h3&gt;
&lt;p&gt;用于格式化 &lt;code&gt;Markdown&lt;/code&gt; 并统一风格. 每个人的偏好不一样, 根据实际情况配置即可.&lt;/p&gt;
&lt;h3&gt;Obsidian 目录配置&lt;/h3&gt;
&lt;p&gt;初始化用于图片及附件的目录结构:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 在项目根目录创建 images 文件夹, 用于存放图片及附件
mkdir images

cd public
# 创建符号链接, 用于 `Astro` 导出
ln -s ../images images
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目录说明:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;images&lt;/code&gt;: 存储图片及附件, &lt;code&gt;Obsidian&lt;/code&gt; 内需要配置成此目录.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/images&lt;/code&gt;: 软连接到 &lt;code&gt;images&lt;/code&gt; 目录, 供 &lt;code&gt;Astro&lt;/code&gt; 导出使用.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/content/blog&lt;/code&gt;: 存放博客的 &lt;code&gt;Markdown&lt;/code&gt; 文件 (如果想通过软链接把文章放到项目根目录, 需要修改 &lt;code&gt;Astro&lt;/code&gt; 的解析规则, 让其跟随符号链接)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; 不能直接使用 &lt;code&gt;public/images&lt;/code&gt; 目录作为图片目录, 因为本地贴图时链接为 &lt;code&gt;![xxx](public/images/xxx.jpg)&lt;/code&gt;, 但是发布以后的真实路径是 &lt;code&gt;images/xxx.jpg&lt;/code&gt; (&lt;code&gt;Astro&lt;/code&gt; 规则限制).&lt;/p&gt;
&lt;p&gt;关键配置已在下图中标记, 供参考:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-builing-blog-with-obsidian-and-astro-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;部署博客&lt;/h2&gt;
&lt;p&gt;由于后续还想给博客添加服务端能力, 因此将部署平台从 &lt;code&gt;GitHub Pages&lt;/code&gt; 迁移至 &lt;code&gt;Cloudflare Pages&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;部署操作比较简单, 这里给出官方文档, 按照步骤操作即可:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Astro&lt;/code&gt; 官网: &lt;a href=&quot;https://docs.astro.build/en/guides/deploy/cloudflare/&quot;&gt;Deploy your Astro Site to Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Cloudflare Pages&lt;/code&gt; 官网: &lt;a href=&quot;https://developers.cloudflare.com/pages/framework-guides/deploy-an-astro-site/&quot;&gt;Framework guides - Astro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>我的个人数据备份方案</title><link>https://hackers-delight.com/blog/202505-my-data-backup-plan/</link><guid isPermaLink="true">https://hackers-delight.com/blog/202505-my-data-backup-plan/</guid><description>最近, 我的群晖 `NAS` 中一块刚使用一年的硬盘开始频繁报警, 因此我重新审视了目前的备份策略. 也正因如此, 催生了这篇文章.</description><pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;最近, 我的群晖 &lt;code&gt;NAS&lt;/code&gt; 中一块刚使用一年的硬盘开始频繁报警, 因此我重新审视了目前的备份策略. 也正因如此, 催生了这篇文章.&lt;/p&gt;
&lt;h2&gt;基础知识&lt;/h2&gt;
&lt;h3&gt;3-2-1 备份策略&lt;/h3&gt;
&lt;p&gt;这部分我直接引用 &lt;code&gt;Dropbox&lt;/code&gt; 文章中的定义, 感兴趣的读者可以参考原文: &lt;a href=&quot;https://experience.dropbox.com/zh-cn/resources/3-2-1-backup-strategy&quot;&gt;什么是“3-2-1 备份策略”？如何使用该策略？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;3-2-1&lt;/code&gt; 原则是一种数据备份策略, 旨在确保您的数据可以在数据丢失事件发生后快速得到恢复和还原.&lt;/p&gt;
&lt;p&gt;简而言之, 这种常用的备份策略涉及创建&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;三份&lt;/strong&gt;数据副本&lt;/li&gt;
&lt;li&gt;其中&lt;strong&gt;两份&lt;/strong&gt;副本存储在本地的不同介质上，例如一份存储在电脑的内置硬盘上，一份存储在外置硬盘等可移动存储设备上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一份&lt;/strong&gt;数据副本远程存储在云备份软件等异地解决方案中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实施 &lt;code&gt;3-2-1&lt;/code&gt; 备份策略的目, 的是为了降低『单点故障』可能造成的影响. 这意味着, 如果您的一台设备崩溃并清除了一份数据副本, 那并不是世界末日您手头还有两个选择可以挽救局面!&lt;/p&gt;
&lt;h3&gt;WebDAV&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;WebDAV&lt;/code&gt; 是一种基于 &lt;code&gt;Web&lt;/code&gt; 的文件管理协议, 常被用于文件远程访问和同步, 便于与多种软件集成.&lt;/p&gt;
&lt;p&gt;详细定义请参考: &lt;a href=&quot;https://zh.wikipedia.org/zh-cn/WebDAV&quot;&gt;WebDAV - 维基百科&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;RAID&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;RAID&lt;/code&gt; (&lt;code&gt;Redundant Array of Independent Disks&lt;/code&gt;, 独立冗余磁盘阵列) 是一种将多个硬盘组合成一个逻辑存储单元的技术, 用于提升性能或实现数据冗余, 或两者兼具.&lt;/p&gt;
&lt;p&gt;详细定义请参考: &lt;a href=&quot;https://zh.wikipedia.org/wiki/RAID&quot;&gt;RAID - 维基百科&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;旧备份方案&lt;/h2&gt;
&lt;p&gt;我的群晖是一个双盘位的 &lt;code&gt;NAS&lt;/code&gt;, 而在民用设备上配置 &lt;code&gt;RAID 5&lt;/code&gt; 的做法, 其实很难做到真正的容错, 踩过坑的人都懂.&lt;/p&gt;
&lt;p&gt;数据副本如下:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;群晖 &lt;code&gt;NAS&lt;/code&gt; &lt;code&gt;1&lt;/code&gt; 号盘位&lt;/li&gt;
&lt;li&gt;群晖 &lt;code&gt;NAS&lt;/code&gt; &lt;code&gt;2&lt;/code&gt; 号盘位&lt;/li&gt;
&lt;li&gt;Backblaze B2 (对象存储非常便宜)&lt;/li&gt;
&lt;li&gt;移动硬盘 (冷备)&lt;/li&gt;
&lt;li&gt;百度云&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; 至于为什么需要这么多分副本, 可以参考前文提到的「3-2-1 备份策略」&lt;/p&gt;
&lt;p&gt;其中, &lt;code&gt;1&lt;/code&gt; 号盘位中的 &lt;code&gt;/照片归档/files&lt;/code&gt; 路径是主数据源, 其他备份均由 &lt;code&gt;Cloud Sync&lt;/code&gt; 工具从此路径同步.&lt;/p&gt;
&lt;h3&gt;Backblaze B2 备份&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-my-data-backup-plan-1.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;images/202505-my-data-backup-plan-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;WebDAV 备份&lt;/h3&gt;
&lt;p&gt;这里通过 &lt;code&gt;WebDAV&lt;/code&gt; 协议实现一块磁盘向另一块磁盘备份, 算是一个比较 &lt;code&gt;Tricky&lt;/code&gt; 的做法.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/照片归档本地备份&lt;/code&gt; 位于 &lt;code&gt;2&lt;/code&gt; 号盘位中, 我选用多副本而不是 &lt;code&gt;RAID 5&lt;/code&gt; 来保证数据可靠性.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-my-data-backup-plan-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-my-data-backup-plan-4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;百度云备份&lt;/h3&gt;
&lt;p&gt;他给的实在是太多了.jpg (🐶&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-my-data-backup-plan-5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/202505-my-data-backup-plan-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;日常备份流程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;定期把需要备份的数据上传到 &lt;code&gt;NAS&lt;/code&gt; &lt;code&gt;1&lt;/code&gt; 号盘位中的 &lt;code&gt;/照片归档/files&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;后续由 &lt;code&gt;Cloud Sync&lt;/code&gt; 自动完成同步与备份&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;新备份方案&lt;/h2&gt;
&lt;p&gt;由于我有一套完整的 &lt;code&gt;HomeLab&lt;/code&gt; 环境, 因此我的 &lt;code&gt;NAS&lt;/code&gt; 使用场景其实非常有限, 故我准备完全脱离 &lt;code&gt;NAS&lt;/code&gt; 来构建我长久的数据备份方案 (降本).&lt;/p&gt;
&lt;p&gt;数据副本:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Mac Studio&lt;/code&gt; 内置硬盘: &lt;code&gt;/Users/mdl/HomeLab&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Mac Studio&lt;/code&gt; 外置移动硬盘: &lt;code&gt;/Volumes/NsLib/全量备份&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NUC&lt;/code&gt; 内置硬盘: &lt;code&gt;/home/mdl/HomeLab&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BackBlaze B2&lt;/code&gt;: &lt;code&gt;b2://NsLib-manual-backup/照片归档&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;百度云盘: 全量备份&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google Drive&lt;/code&gt;: 全量备份&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Mac Studio 内置硬盘 (主数据源)&lt;/h3&gt;
&lt;p&gt;这份数据是原始数据, 其他数据源均基于它来做同步.&lt;/p&gt;
&lt;p&gt;我通过 &lt;code&gt;Syncthing&lt;/code&gt; 工具把 &lt;code&gt;/Users/mdl/HomeLab&lt;/code&gt; 与 &lt;code&gt;NUC&lt;/code&gt; 上的 &lt;code&gt;/home/mdl/HomeLab&lt;/code&gt; 做成同步盘, 实时热备.&lt;/p&gt;
&lt;h3&gt;Mac Studio 外置移动硬盘&lt;/h3&gt;
&lt;p&gt;我目前是挂载了一块三星 &lt;code&gt;SSD T5 EVO&lt;/code&gt; 来存储大量的数据 (毕竟苹果家硬盘是金子做的).&lt;/p&gt;
&lt;h3&gt;NUC 内置硬盘&lt;/h3&gt;
&lt;p&gt;与我的 &lt;code&gt;Mac Studio&lt;/code&gt; 数据源实时同步, 确保数据始终有两份副本.&lt;/p&gt;
&lt;h3&gt;BackBlaze B2&lt;/h3&gt;
&lt;p&gt;可以直接通过下面的命令做同步:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;b2 sync &quot;/Volumes/NsLib/全量备份/照片归档&quot; &quot;b2://NsLib-manual-backup/照片归档&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;百度云盘 &amp;amp; Google Drive&lt;/h3&gt;
&lt;p&gt;目前是准备每半年手工上传一次, 不太想依赖工具, 因为长时间跨度下, 工具本身的升级维护成本其实也不小.&lt;/p&gt;
&lt;h3&gt;日常备份流程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;日常的文件直接操作 &lt;code&gt;Mac Studio&lt;/code&gt; 内置硬盘 &lt;code&gt;/Users/mdl/HomeLab&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Mac Studio&lt;/code&gt; 和 &lt;code&gt;NUC&lt;/code&gt; 通过 &lt;code&gt;Syncthing&lt;/code&gt; 实时同步, 因此随时会有两份完整副本 (自动)&lt;/li&gt;
&lt;li&gt;定时任务自动同步到 &lt;code&gt;BackBlaze B2&lt;/code&gt;, &lt;code&gt;Mac Studio&lt;/code&gt; 外置移动硬盘&lt;/li&gt;
&lt;li&gt;每半年手工上传到百度云和 &lt;code&gt;Google Drive&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过这次方案重构, 我成功将核心数据从 &lt;code&gt;NAS&lt;/code&gt; 体系中抽离, 新方案成本更低, 更利于长期维护.&lt;/p&gt;
&lt;p&gt;未来, 我只会将 &lt;code&gt;NAS&lt;/code&gt; 用作普通云盘, 存储一些例如电影这种不需要可靠性的数据.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TODO:&lt;/strong&gt; 寻找 &lt;code&gt;Cloud Sync&lt;/code&gt; 的替代品, 尝试把新方案完全自动化.&lt;/p&gt;
</content:encoded></item><item><title>使用 git-crypt 加密你的笔记</title><link>https://hackers-delight.com/blog/202505-secure-your-notes-with-git-crypt/</link><guid isPermaLink="true">https://hackers-delight.com/blog/202505-secure-your-notes-with-git-crypt/</guid><description>使用 git-crypt 无痛加密你的笔记, 更好的保护个人隐私.</description><pubDate>Wed, 07 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;市面上有很多主打隐私保护、内置加密功能的笔记应用, 但它们往往存在以下问题:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据存储在云端, 用户无法掌控自己的数据&lt;/li&gt;
&lt;li&gt;使用专有格式, 迁移不便&lt;/li&gt;
&lt;li&gt;功能缺失 (例如: &lt;code&gt;Vim&lt;/code&gt; 的键位对我是刚需)&lt;/li&gt;
&lt;li&gt;无法高效与命令行组合使用, 即使支持本地存储, 也通常是加密格式, 难以直接操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;支持任意编辑器/软件 (基于文件系统)&lt;/li&gt;
&lt;li&gt;自动透明加解密
&lt;ul&gt;
&lt;li&gt;本地存储时是明文 (重要)&lt;/li&gt;
&lt;li&gt;推送到 &lt;code&gt;GitHub&lt;/code&gt; 等代码托管平台时自动加密&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;采用成熟可靠的加密方案&lt;/li&gt;
&lt;li&gt;无服务端依赖&lt;/li&gt;
&lt;li&gt;适合团队协作 (可选)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;前置知识&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GnuPG&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPG Suite&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; 推荐使用 &lt;code&gt;GPG Suite&lt;/code&gt; 来创建和管理密钥.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不了解 &lt;code&gt;GnuPG&lt;/code&gt; 的同学强烈建议学习一下, 它是你打开新世界大门的钥匙 (&lt;code&gt;GitHub&lt;/code&gt; 的提交签名了解下). 给几个参考资料供大家自行学习.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://emacsist.github.io/2019/01/01/gnupg2%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/&quot;&gt;GnuPG2使用指北&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.logc.icu/post/2020-08-02_09-39/&quot;&gt;gpg使用介绍与配置说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/zh/authentication/managing-commit-signature-verification/about-commit-signature-verification&quot;&gt;About commit signature verification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ulyc.github.io/2022/09/05/tr-pgp-problem-1/&quot;&gt;「译」PGP的问题（上）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ulyc.github.io/2022/09/07/tr-pgp-problem-2/&quot;&gt;「译」PGP的问题（下）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;实践&lt;/h2&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;https://github.com/AGWA/git-crypt&lt;/li&gt;
&lt;li&gt;https://gpgtools.org/&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;brew install git-crypt gpg-suite
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;p&gt;创建密钥对的过程略.&lt;/p&gt;
&lt;p&gt;准备要用到的 &lt;code&gt;GitHub&lt;/code&gt; 仓库:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone git@github.com:NsLib/dummy-repo.git

cd dummy-repo
git-crypt init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;.gitattributes&lt;/code&gt; 文件, 内容如下:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.md filter=git-crypt diff=git-crypt
KnowledgeBase/** filter=git-crypt diff=git-crypt
Templates/** filter=git-crypt diff=git-crypt
assets/** filter=git-crypt diff=git-crypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;简单解释下上面的内容:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;KnowledgeBase&lt;/code&gt;, &lt;code&gt;Templates&lt;/code&gt;, &lt;code&gt;assets&lt;/code&gt; 目录下的所有目录及文件都加密&lt;/li&gt;
&lt;li&gt;&lt;code&gt;filter=git-crypt diff=git-crypt&lt;/code&gt; 让你的 &lt;code&gt;git diff&lt;/code&gt; 等工具链可以比对明文 (自动解密)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;添加加密用的密钥:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git-crypt add-gpg-user &quot;MDL13412 (personal) &amp;lt;xxx@example.org&amp;gt;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提交本地的所有修改:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add -A
git commit -m &quot;init&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;GitHub&lt;/code&gt; 上查看 &lt;code&gt;README.md&lt;/code&gt; 文件时, 会发现已经无法解析, 如下所示:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载此文件, &lt;code&gt;cat README.md&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看本地仓库内的文件:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;场景演示&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;VSCode&lt;/code&gt; 新建 &lt;code&gt;a.md&lt;/code&gt;, 内容如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;提交此文件:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;本地工具链查看 &lt;code&gt;diff&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;推送到 &lt;code&gt;GitHub&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看 &lt;code&gt;GitHub&lt;/code&gt; 上文件:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/secure-your-notes-with-git-crypt-9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;git-crypt&lt;/code&gt; 可以达成我们前面设定的目标, 但是也会有如下缺点, 请自行参考:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GnuPG&lt;/code&gt; 的上手门槛较高 (但是这东西学会了收益极大, 以后可能会写文章介绍)&lt;/li&gt;
&lt;li&gt;这种方案由于性能问题, 不适合海量/大文件场景 (不过我在公司的工作笔记几百个文件日常使用无感)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>aText教程</title><link>https://hackers-delight.com/blog/201910-mac-app-atext/</link><guid isPermaLink="true">https://hackers-delight.com/blog/201910-mac-app-atext/</guid><description>aText 是一款文字输入效率工具，可以配置常用的文本、代码模板、邮件模板等，并通过短语形式进行触发替换。</description><pubDate>Tue, 29 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.trankynam.com/atext/&quot;&gt;aText&lt;/a&gt; 是一款文字输入效率工具，可以配置常用的文本、代码模板、邮件模板等，并通过短语形式进行触发替换。国内的同学可能听过名气更大的 &lt;code&gt;TextExpander&lt;/code&gt;，但是 &lt;code&gt;TextExpander&lt;/code&gt; 改成订阅制后性价比极低，且很多细节甚至没有 &lt;code&gt;aText&lt;/code&gt; 打磨的精细，所以个人更推荐 &lt;code&gt;aText&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里给大家推荐一个 &lt;a href=&quot;https://www.youtube.com/watch?v=1MRLXfirtsk&quot;&gt;视频&lt;/a&gt;，大家可以通过演示了解 &lt;code&gt;aText&lt;/code&gt; 的基本功能。&lt;/p&gt;
&lt;h2&gt;基本配置&lt;/h2&gt;
&lt;p&gt;在菜单栏中选择 &lt;code&gt;aText&lt;/code&gt; - &lt;code&gt;Show aText...&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/mac-app-atext-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个分组，参数按下图配置即可，注意 &lt;code&gt;Abbreviation prefix&lt;/code&gt; 建议开启，这样可以大幅减少误操作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/mac-app-atext-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个片段：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/mac-app-atext-3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入 &lt;code&gt; `test&lt;/code&gt;，再输入 &lt;code&gt;空格&lt;/code&gt;、&lt;code&gt;Tab&lt;/code&gt;、&lt;code&gt;回车&lt;/code&gt; 等按键即可触发补全：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/mac-app-atext-4.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;使用变量&lt;/h2&gt;
&lt;p&gt;选择 &lt;code&gt;Insert&lt;/code&gt; - &lt;code&gt;Field&lt;/code&gt; 来插入一个简单的变量：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/mac-app-atext-5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里我们使用最简单的 &lt;code&gt;Single-line&lt;/code&gt; 类型，并勾选 &lt;code&gt;Editable&lt;/code&gt; 选项，允许我们补全时进行修改：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/mac-app-atext-6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入 &lt;code&gt; `var&lt;/code&gt; 加 &lt;code&gt;空格&lt;/code&gt; 触发补全：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/mac-app-atext-7.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;一些使用技巧&lt;/h2&gt;
&lt;p&gt;可以通过设置多个相同的触发词来进行补全选择，这种情况下，一般推荐填写 &lt;code&gt;Label&lt;/code&gt; 来进行区分：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;images/mac-app-atext-8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在候选补全列表弹出时，可以使用数字键快速选择；在弹出的补全模板窗口中，可以使用 &lt;code&gt;Tab&lt;/code&gt; 键切换到下一个输入框，&lt;code&gt;Shift + Tab&lt;/code&gt; 切换到前一个输入框。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/mac-app-atext-9.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;本文简单介绍了 &lt;code&gt;aText&lt;/code&gt; 的基本使用方法，但其功能远不止如此，有兴趣的同学可以自行探索。&lt;/p&gt;
&lt;p&gt;另外，如果是购买了 &lt;code&gt;Alfred Powerpack&lt;/code&gt; 的用户，可以看看 &lt;code&gt;Alfred&lt;/code&gt; 的 &lt;code&gt;Snippets&lt;/code&gt; 功能，基本可以达到 &lt;code&gt;aText&lt;/code&gt; 功能的 &lt;code&gt;80%&lt;/code&gt;。&lt;/p&gt;
</content:encoded></item><item><title>分享一些高效的Mac软件 (2019 年版本)</title><link>https://hackers-delight.com/blog/201910-awesome-mac-apps/</link><guid isPermaLink="true">https://hackers-delight.com/blog/201910-awesome-mac-apps/</guid><description>分享一些博主日常工作中常用的 Mac 软件，部分收费软件会给出免费的替代品。</description><pubDate>Sat, 26 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;分享一些博主日常工作中常用的 &lt;code&gt;Mac&lt;/code&gt; 软件，部分收费软件会给出免费的替代品。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; 本文只介绍图形应用，命令行工具会在后续博文中介绍。&lt;/p&gt;
&lt;h2&gt;效率&lt;/h2&gt;
&lt;h3&gt;Alfred&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://www.alfredapp.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：基础功能免费，&lt;code&gt;Alfred Powerpack&lt;/code&gt; 版本买断 €29，终身升级 €39&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Mac&lt;/code&gt; 上鼎鼎大名的效率工具，付费开通 &lt;code&gt;Alfred Powerpack&lt;/code&gt; 后，效率更是大幅提升。&lt;/p&gt;
&lt;p&gt;可以参考少数派的文章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/56175&quot;&gt;一站式文件处理中心：Alfred 文件搜索 &amp;amp; 处理详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/55098&quot;&gt;一切为了让效率更进一步，Alfred 4.0 更新详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/43973&quot;&gt;总是在 Mac 「装机必备」看到的搜索利器 Alfred，究竟是怎么用的？| 新手问号&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/35927&quot;&gt;使用 Alfred 提高你的工作效率 | Matrix 精选&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;aText&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://www.trankynam.com/atext/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：¥30&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;便宜好用的文字效率输入工具，售价 ¥30 的 &lt;code&gt;aText&lt;/code&gt; 丝毫不逊色于一年几百块的 &lt;code&gt;TextExpander&lt;/code&gt;，甚至有些细节做的更好。建议观看官网上的演示视频，并下载试用(21天免费试用)。&lt;/p&gt;
&lt;h3&gt;Hammerspoon&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://www.hammerspoon.org/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：免费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个开放式的自动化框架，可以通过 &lt;code&gt;Lua&lt;/code&gt; 调用众多系统级别 &lt;code&gt;API&lt;/code&gt;，完成诸如窗口管理、快速切换应用、&lt;code&gt;Wifi&lt;/code&gt; 自动切换、控制播放器等功能。这款工具因为需要编写 &lt;code&gt;Lua&lt;/code&gt; 脚本，因此上手难度较高，但是可定制程度极高。&lt;/p&gt;
&lt;h3&gt;Unclutter&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://unclutterapp.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★&lt;/li&gt;
&lt;li&gt;售价：¥140&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可通过快捷键或鼠标快速访问剪贴板、笔记、文件，可参考少数派文章 &lt;a href=&quot;https://sspai.com/post/28798&quot;&gt;在 Mac 上「速记」的正确姿势：Unclutter&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;系统&lt;/h2&gt;
&lt;h3&gt;Bartender&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://www.macbartender.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★&lt;/li&gt;
&lt;li&gt;售价：¥112&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这款应用用来解决菜单栏图标过多的问题，对于喜欢折腾各种工具的群体很实用。如果不想付费，可以考虑开源免费的 &lt;a href=&quot;https://github.com/Mortennn/Dozer&quot;&gt;Dozer&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;iStat Menus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://bjango.com/mac/istatmenus/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★&lt;/li&gt;
&lt;li&gt;售价：¥85&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以很方便的在菜单栏上显示系统的各种状态(&lt;code&gt;CPU&lt;/code&gt; 使用率、内存占用、网速、磁盘 &lt;code&gt;I/O&lt;/code&gt;)，适合程序员群体。此应用的免费替代品品质与其相差甚远，不做推荐。&lt;/p&gt;
&lt;h3&gt;ForkLift&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://binarynights.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★&lt;/li&gt;
&lt;li&gt;售价：¥210&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;非常强大的双窗口管理工具，可参考少数派上的文章 &lt;a href=&quot;https://sspai.com/post/40554&quot;&gt;被忽视的 FTP 与文件管理工具：ForkLift 3 for Mac&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;阅读&lt;/h2&gt;
&lt;h3&gt;PDF Expert&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://binarynights.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★&lt;/li&gt;
&lt;li&gt;售价：¥570&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;快速、稳定、美观的 &lt;code&gt;PDF&lt;/code&gt; 编辑器，不要被其售价吓到，有很多渠道可以以远低于官网售价的价格购买。&lt;/p&gt;
&lt;h3&gt;Reeder&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://reederapp.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★&lt;/li&gt;
&lt;li&gt;售价：¥70&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好用、美观的 &lt;code&gt;RSS&lt;/code&gt; 阅读器，适合 &lt;code&gt;RSS&lt;/code&gt; 重度用户使用。&lt;/p&gt;
&lt;h3&gt;Calibre&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://calibre-ebook.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★&lt;/li&gt;
&lt;li&gt;售价：免费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;电子书的一站式管理工具，非常强大。博主个人只用来做电子书的格式装换，并不用其来管理电子书。&lt;/p&gt;
&lt;h2&gt;媒体&lt;/h2&gt;
&lt;h3&gt;IINA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://iina.io/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：免费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;macOS&lt;/code&gt; 上的现代影音播放器，个人认为是最好用的播放器，没有之一。&lt;/p&gt;
&lt;h3&gt;HandBrake&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://handbrake.fr/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：免费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;视频转换工具，压缩比非常好。&lt;/p&gt;
&lt;h3&gt;Downie&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://software.charliemonroe.net/downie/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：¥240&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以下载各种网站上的视频，别再浪费时间找各种免费工具或者网站了，毕竟时间成本也很高。此软件也可以通过第三方渠道购买，比官网便宜很多。&lt;/p&gt;
&lt;h2&gt;开发&lt;/h2&gt;
&lt;h3&gt;SnippetsLab&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://www.renfei.org/snippets-lab/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★&lt;/li&gt;
&lt;li&gt;售价：¥70&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码片段管理工具，日常工作、学习使用效率会很高。&lt;/p&gt;
&lt;h3&gt;iTerm2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://www.iterm2.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：免费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Mac&lt;/code&gt; 上最好用的免费终端，同样是没有之一。&lt;/p&gt;
&lt;h3&gt;CodeRunner&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://coderunnerapp.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：¥105&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以非常快速的编写一些代码片段验证自己的想法，当然免费的替代品也很多，可以看看 &lt;code&gt;VSCode&lt;/code&gt; 中的 &lt;code&gt;Code Runner&lt;/code&gt; 插件。&lt;/p&gt;
&lt;h3&gt;Paw&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://paw.cloud/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★&lt;/li&gt;
&lt;li&gt;售价：¥350&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;号称 &lt;code&gt;Mac&lt;/code&gt; 上最高级的 &lt;code&gt;API&lt;/code&gt; 工具，测试 &lt;code&gt;HTTP API&lt;/code&gt; 非常方便、强大。如果需求不是很多，可以看看免费的 &lt;code&gt;Chrome&lt;/code&gt; 插件 &lt;a href=&quot;https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm&quot;&gt;Talend API Tester - Free Edition&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;Fork&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://git-fork.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：免费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;非常好用的 &lt;code&gt;Git&lt;/code&gt; 客户端，支持 &lt;code&gt;Mac&lt;/code&gt; 和 &lt;code&gt;Windows&lt;/code&gt; 平台。&lt;/p&gt;
&lt;h3&gt;Sequel Pro&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;官网：https://www.sequelpro.com/&lt;/li&gt;
&lt;li&gt;推荐指数：★★★★★&lt;/li&gt;
&lt;li&gt;售价：免费&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;免费好用的 &lt;code&gt;MySQL&lt;/code&gt; 客户端，喜欢命令行的同学，也可以试试 &lt;a href=&quot;https://www.mycli.net/&quot;&gt;mycli&lt;/a&gt;。&lt;/p&gt;
</content:encoded></item><item><title>旧博客</title><link>https://hackers-delight.com/blog/201910-old-blog/</link><guid isPermaLink="true">https://hackers-delight.com/blog/201910-old-blog/</guid><description>旧博客 https://blog.csdn.net/mdl13412</description><pubDate>Sat, 26 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/mdl13412&quot;&gt;旧博客&lt;/a&gt; https://blog.csdn.net/mdl13412&lt;/p&gt;
</content:encoded></item></channel></rss>