MoreRSS

site iconYeungYeah修改

广东人,精通中文、英文和粤语。喜欢写作和编程。武汉大学本科,南京大学研究生,目前在国内大厂从事后台开发。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

YeungYeah的 RSS 预览

Logseq 移除空白 Journals 页面

2025-08-31 12:38:08

Logseq 在打开的时候,会自动创建当天的 Journal 页面。正常来说,当打开 Logseq 的时候,确实大部分可能都是要记录,这样的 feature 看着没什么问题。然而如果 Logseq 打开后没有彻底退出,也会照常每天创建 Journal 页面。久而久之,打开 Logseq 后你将会看到一堆的空白页,让人非常不爽,而且想要浏览此前的 Journal 记录也非常不方便。

为了避免这种情况,之前都是提醒自己在用完之后,记得 commond + q 完全退出 Logseq,然后偶尔忘掉的情况,再手动删除空白页。但实际上非常容易就忘掉退出,然后又可能因为工作可能过了一周再打开,一次就积累了一堆空白页,手动一个个删除也比较费力。

一开始想的是简单写个脚本,扫一下目录里面空白的 markdown 文件,但是打开本地目录发现,空白的 Journal 页面还不一定会创建空白文件。后面上网搜了一下发现,原来自带就有这个移除功能的,而且移除的范围还不止空白的 Journal,所有的空白 Page 都能扫出来然后移除。

具体入口路径:All pages -> ... -> Remove orphaned pages

自建 Bitwarden 突然不可用

2025-07-19 14:46:50

前言:我的配置

我一直是 Bitwarden 的忠实用户,并且为了数据自由和可控性,以及省钱,选择了自建服务。我的整套配置如下:

  • 服务器:腾讯云服务器
  • 密码服务:Vaultwarden (Bitwarden 的 Rust 实现) Docker 镜像
  • 域名:腾讯云托管的个人域名
  • 客户端:全平台 Bitwarden 客户端
  • 反向代理:Caddy 自动处理 HTTPS

这套组合一直稳定运行,直到今天……

一、问题的发现

今天像往常一样,我打开手机上的 Bitwarden App,想添加一个新的登录项。但奇怪的是,当我点击保存后,在列表里却怎么也找不到刚刚添加的项目。

起初我以为是 App 的 Bug,但为了保险起见,我打开了电脑客户端尝试添加,结果客户端直接提示我保存失败

这时我意识到,问题可能没那么简单,大概率是客户端与我服务器之间的接口通信出了问题。

二、排查之路

1. 初步诊断:证书过期

我首先想到的是检查我的 Vaultwarden 管理页面。我通过域名访问,结果发现了第一个问题:

  • HTTP 访问:直接被腾讯云拦截,提示“该网站未根据工信部相关法律规则进行备案”。
  • HTTPS 访问:可以打开页面,但浏览器地址栏赫然显示着“不安全”的警告——SSL 证书过期了。

浏览器证书过期警告(图:腾讯云因未备案拦截页面)

破案了?看起来八九不离十。证书过期导致 API 接口的 HTTPS 请求失败,客户端自然无法正常保存数据。

2. 深入探究:Caddy 为何没自动续期?

但新的问题也随之而来:我使用 Caddy 就是因为它能自动实现 HTTPS,可以自动申请证书并续签,为什么这次偏偏就失效了?更奇怪的是,我同一台服务器上的其他服务的域名都能正常访问,证书也都是有效的,唯独 Bitwarden 的这个域名出了问题。

我尝试重启 Caddy 服务、重新加载配置,但都无济于事。无奈之下,只能去看 Caddy 的运行日志。

日志中的错误信息揭示了真相:Caddy 在尝试申请新的 HTTPS 证书时,需要通过 HTTP 端口进行验证(HTTP-01 challenge)。然而,这个验证请求被腾讯云的直接拦截并返回了一个未备案提示的页面。

所以,核心原因找到了:腾讯云升级了防火墙策略。以前对于未备案的域名,仅仅是拦截了 80 端口的访问,而现在,它会拦截所有端口的对外服务。

这个策略直接导致了 Caddy 的证书续期 / 申请机制完全失效。

三、挣扎与放弃

尝试迁移域名

既然是腾讯云的问题,我心想,能不能把域名解析迁移到 Cloudflare,利用 Cloudflare 的 DNS 服务来绕过这个限制?

然而,当我尝试在腾讯云后台修改域名的 NS (Name Server) 记录时,发现这个选项是锁定的!想要修改,必须通过一个独立的“DNS 服务器修改”入口,比较隐蔽。

然后迁移后发现其实也没有作用,拦截实际上是发生在服务器上而不是 dns 解析上(也可能是两边都会有拦截)

四、最终的解决方案

最后为了稳定性和省心,选择了付费订阅 Bitwarden 高级会员,$10 一年,不再折腾。这境内的个人云服务器感觉用处越来越小,要不是博客需要备案号需要云服务器,绝对停掉转用境外的云服务器。

Logseq 如何同步

2025-06-13 22:30:09

Logseq 是一个与 Obsidian 类似的双链笔记软件,断断续续地用了应该有几年了,但是同步/备份比较麻烦,尤其是在不同系统类型的设备多个设备上。Logseq 与 Obsidian 都是通过加载一个本地文件夹作为笔记仓库的形式来运行的,因此笔记的同步,本质上还是同步这个文件夹,但是这样的同步,在不同的系统和设备上,达到完美的体验,实际也有点烦的。

总结下来有几个阶段,每个阶段基本都尝试了一些方式,然后都不太好搞。因此最后的我现在还是选择官方的同步功能,每月 $5.

PC 间通过 OneDrive 同步文件夹实现同步

最开始使用的时候只在电脑上面使用,甚至都没想过用手机查看或者记录,因此最开始的时候只有在两台 PC 之间同步笔记的需求。这样就比较简单,选择一个可以实时同步文件夹内容的云盘,比如 OneDrive 或者坚果云都可以。当时用的就是 OneDrive,同步流畅度还可以,再加上基本有不会有同时在两台设备上编辑的情况出现,基本没出过什么问题。

iCloud 同步文件夹实现同步

后面换了 iPhone,需要在 iPhone 和 PC 上同步笔记。iPhone 上很自然就考虑选择使用 iCloud 同步,而且 Windows 实际上也是可以安装 iCloud 进行同步的,最开始的时候我就是使用 iCloud 在 iPhone 和 Windows 上面同步。

然而 iCloud 同步实际上很容易出现问题,尤其是在 Windows 设备上。有些时候文件在正常使用的时候,会因为同步问题而出现多个版本。有时候文件的某个版本因为莫名的原因无法下载,这个时候 logseq 就会一直卡在下载文件阶段,然后阻塞界面,卡死程序。

这种情况需要手动地去 iCloud 的存储位置把多出来的同步不成功的文件删掉才好。Obsidian 也有这个问题,但是这种卡死的情况只会出现在打开软件的时候,在使用过程好像还没见过。而这个在 iCloud 目录找出重复文件并删除的操作,在移动端上基本搞不了,因此如果是在外面手机打开出现了这个问题,基本等于无解。

后面电脑换成了 Mac,这种同步出现冲突多版本的问题基本没有出现过了。但是后面在实际使用的时候也发现了一个另一个问题:文件的同步和拉取可能会有延迟,导致有可能电脑记了今天的日记,然后手机在打开前没有识别到今天实际上是有更新的,在打开软件的时候默认会创建今天的笔记,而这个新创建的笔记日期更新,就会直接把电脑端的笔记给覆盖掉。不过原来logseq里面有个bak文件夹可以做备份,找还是能找回来的,但是就得手动在程序外操作。

Git 同步

在换到 Mac 之前使用,Windows 使用 iCloud 同步容易出问题,当时还尝试了另一个通过 Git 同步的办法:

  • Logseq 原生就带有 Git 版本管理能力,定时(比如每分钟)会自动提交。PC 端可以通过配置 Git Hooks,实现提交的时候自动 push 到一个 remote repo.
  • 移动端的话当时使用 IOS,通过 a-shell 和快捷指令的方式实现文件的拉取和同步。具体是通过快捷指令,在打开 Logseq 的时候先 pull 一把,然后在关闭应用的时候提交并 push 到 remote 上面

这样的方式只能做到笔记文件在不同设备上面同步,但如果真的出现同时修改的情况,感觉会出问题。

流程看着很可行,但实际用下来体验也很差,很多问题

  • remote repo 我是放在 GitHub 上面,移动端拉取很容易有网络问题而拉取失败,导致移动端笔记不能同步到最新
  • 有可能会出现冲突,冲突还必须要 Git 解冲突,这就必须人工介入操作了

Android 与 PC 通过 Google Drive 同步

后面手机换回 Android 了,移动端用不了 iCloud,换到了 Google Drive 上面。这时候才发现各家云服务商在安卓上面原来都没有像 iCloud 这种实现文件夹在本地与云服务上双向同步的能力,需要的话,必须使用第三方的软件(比如 AutoSync)来实现双向同步。而这些服务用下来体验也很一般,首先使用前必须将云端存储的读写权限全部授权给三方软件,这样就已经有点担心了,然后实际的同步也只是通过周期性执行同步任务,调用 Drive 获取最新文件的方式来同步的,同步很慢,也容易失败。试了几次我就删掉,并且撤回授权了。

官方同步功能

上面提到的各种同步方式,本质上还是在程序外通过系统或者软件,同步更新存放笔记的文件夹内容。这样无可避免一个问题:Logseq 本身是感知不到这个同步过程,以及文件内容是否已经同步好了的。每次打开其实都会是当作一个已经同步好的状态来处理,读写文件。这样 logseq 和外部就可能会出现对文件的同时读写,继而出现问题。这也是上面出现各种同步问题的主要原因。

题外话:obsidian 上面有很多内部插件实现同步的能力,logseq 是否可以提供像 obsidian 一样,基于内部插件的方式来进行同步呢?为什么 logseq 上面基本都没有同步的插件?有可能官方对这能力依赖的口子没有打开?

在 Android 上折腾同步实在是折腾不动了,最后选择了氪金。现在 Logseq 提供了同步功能,虽然还是 beta 阶段,但是实际用下来已经非常丝滑,各个设备轻松同步(Android+Mac+iPad)。现在最低只需 donate 5$ 每月,就可以启用,详细的方法可以看官方文档,支持通过银行卡(Visa/Master),Google Pay,或者 PayPal 付款。

官方的同步功能支持最多 10 个 graph 的同步,我看 v2ex 上面也有出合租车位的,只要几块钱。虽然说每个 graph 都有单独的密码加密,但是感觉这种出租空位的方式,还是有点安全问题,因为给别人创建 graph,需要把帐号给别人登陆才能创建,而试了一下,remove 远程的 graph,好像是不需要密码的,可能有数据被恶意删掉的可能性,有点危险。

汇总

同步方法 适用场景 优点 缺点
OneDrive 同步 PC 间同步 • 同步流畅
• 操作简单
• 基本无冲突问题
• 仅限 PC 设备
• 移动端支持有限
iCloud 同步 iPhone + PC/Mac • Mac 环境下相对稳定
• 原生 iOS 支持
• Windows 上容易出现文件冲突
• 同步延迟可能导致数据覆盖
• 移动端难以处理冲突文件
• 程序可能卡死
Git 同步 跨平台技术方案 • 版本控制能力强
• 支持自动提交
• 理论上支持所有平台
• 网络问题导致同步失败
• 需要手动解决冲突
• 配置复杂
• 移动端操作困难
Google Drive + 第三方同步 Android + PC • 支持 Android 平台 • 需要授权第三方软件
• 安全风险较高
• 同步慢且容易失败
• 只能周期性同步
官方同步功能 全设备同步 • 程序内置,体验丝滑
• 支持多设备(Android+Mac+iPad)
• 数据加密安全
• 支持最多 10 个 graph
• 需要付费($5/月)
• 仍处于 beta 阶段
• 合租存在安全风险
  1. 单纯 PC 使用:OneDrive 等云盘同步即可满足需求
  2. Mac + iOS 环境:iCloud 基本可用,但需注意同步延迟问题
  3. 涉及 Android 的跨平台多设备:官方同步功能是最佳选择,虽然需要付费但体验最好
  4. 技术用户:可以试试 Git 方案,但需要有处理冲突的能力

从 IOS 迁移到 Android

2025-04-29 10:17:04

这两年一直有把 iPhone 换成安卓手机的想法,去年尝试过换成小米 14,但坚持了不到一周,就因种种问题和不习惯而放弃,退掉后又换回了 iPhone。这次选择换成 OPPO X8 Pro,已经使用了两周多,逐渐适应,没有感觉有什么问题,算是暂时迁移成功了。这里记录一下迁移相关的一些细节。


替代

  • iCloud -> Google Photos/Drive
    • 需要特殊网络环境
    • Google Photos 后台不能自动同步照片,需手动进入应用才会开始备份
  • Apple Notes -> OPPO Notes
    • 原本就用得很少,OPPO 的体验也不错
  • iCost -> 钱迹
    • 后者支持导入前者导出的数据
    • 没有了自动记账
  • Apple Watch -> OPPO Watch X2
  • Apple Pay -> Google Pay
  • 旅客八达通 -> 安卓八达通
    • 只能用香港手机号注册
  • AirPods -> 附送的不知名耳机
    • 失去了苹果生态中耳机无缝接力的丝滑能力,现在日常带两个耳机上班
  • iMessage -> ❌
    • 原本基本只和堂哥聊天用,现在只能回到微信

有些替代方案算是降级,但还是可以接受。

迁移

  • 通过 O+ 互传可以将 iPhone 上的 live 图传到 OPPO 上
    • 这个功能可以算是促使我选择 OPPO 的最大原因了,之前在 iPhone 拍照基本都开 live 模式,当时换小米的时候就没有办法转移过来
    • 一次最多只能传 1000 张,因此需要手动分批选择传输
    • 手机初始化换机时已经把照片传过去了一遍,后面再传 live 图时会重复
      • 需要手动一张一张删除
  • 健康/健身数据导出的数据,OPPO 的健康软件不支持导入,只能重新开始
  • 软件:手动从软件商店和 Google Play 一个个下载
    • 内外软件分开下载,感觉比之前两个不同区 Apple ID 在 App Store 切换方便多了

其余基本没有什么 loss

一些体验

  • 充电速度真的快
  • 电量明显增大,续航能力提升
  • 所谓的信号变好其实没什么感觉
    • 但 iPhone 的信号确实差,换安卓其中一个重要原因就是在某些地方真的没有一点信号,比如在深圳中心区的网咖里竟然完全没有信号
  • 通知推送有点不给力,可能是安卓通病
    • 通知类型不准确:
      • 系统有分不同的通知类型,但实际应用发来的通知感觉都是一个类型的,导致系统想对不同类型通知设置不同的处理(声音还是震动还是静默)没有效果
      • 比如钉钉通知要么全开声音,来一条消息都要响一下,要么全关声音,电话打过来都听不到也不震动
    • 通知收不到
      • 某些应用的通知收不到或者有延迟,偶尔需要打开应用通知才推送过来

Homebrew 降级安装指定版本应用

2025-03-15 15:21:17

总是习惯性地把所有软件都更新到最新,然后在写博客的时候发现,Hugo 更新后,本地运行出问题了。

ERROR deprecated: site config key paginate was deprecated in Hugo v0.128.0 and subsequently removed. Use pagination.pagerSize instead.
ERROR deprecated: resources.ToCSS was deprecated in Hugo v0.128.0 and subsequently removed. Use css.Sass instead.
ERROR deprecated: .Site.IsMultiLingual was deprecated in Hugo v0.124.0 and subsequently removed. Use hugo.IsMultilingual instead.
ERROR deprecated: .Site.Author was deprecated in Hugo v0.124.0 and subsequently removed. Implement taxonomy 'author' or use .Site.Params.Author instead.

从报错提示来看,就是 Hugo 更新搞出了 breaking changes,升级后直接一些把字段和方法移除掉了。一开始看它的提示,还很贴心地给出替代的字段,然后直接简单替换后发现,跑不起来,并不是那么简单替换就行。于是只能把 Hugo 的版本降回原来的版本。

具体操作如下

  1. brew info hugo. 找出需要降级应用所在的 repo 和路径
    1. 我这里用了镜像,原始的 repo 在 GitHub 上
  2. 到 GitHub 上找到对应 repo 的对应文件
    1. 路径可以参考 https://github.com/Homebrew/homebrew-core/blob/master/Formula/h/hugo.rb
  3. 找这个文件的提交历史,找到需要降级版本的提交 id
    1. 根据 commit 的 id 可以判断出来版本,是由 bot BrewTestBot 提交的
  4. 拿到 commit id 后可以拿到这个安装文件的 url,同时也可以拿到文件的内容
    1. https://github.com/Homebrew/homebrew-core/blob/2fd8dba871a6a5412fa7c00b12ac99b5738cd199/Formula/h/hugo.rb
    2. https://raw.githubusercontent.com/Homebrew/homebrew-core/2fd8dba871a6a5412fa7c00b12ac99b5738cd199/Formula/h/hugo.rb
    3. 把 commit id 和 app 的名字替换一下就可以了
  5. 按照网上看到的办法,可以直接根据 url 来安装 brew install url
    1. 但实际试了一把后发现,会报错 Error: Non-checksummed download of hugo formula file from an arbitrary URL is unsupported! brew extract or brew create and brew tap-new to create a formula file in a tap on GitHub instead.
  6. 于是直接把文件内容 copy 下来保存到本地,然后 brew install ./hugo.rb,安装成功

brew 应用降级成功之后,可以通过 brew pin hugo 锁定版本,避免后续又把它升级了。


在通过 install url 失败之后,又看到一个办法可以降级,看着也很可行,但是构建脚本本地执行的时候出错了,也可以参考下。

1
2
3
4
brew tap-new $USER/local-cmake
brew tap homebrew/core --force
brew extract --version=3.31.1 cmake $USER/local-cmake
brew install $USER/local-cmake/[email protected]

以下是 AI 的解释:

这四条 Homebrew 命令的目的是创建一个本地 tap 并安装特定版本的 CMake。我来逐条解释每个命令的作用:

1. brew tap-new $USER/local-cmake

这条命令创建一个新的 tap(软件仓库)。$USER 是当前用户名的环境变量,所以这个 tap 的名称会是 "你的用户名/local-cmake"。

  • 作用:创建一个新的本地 tap,用于存放自定义的软件包公式
  • 结果:在 $(brew --repo)/Library/Taps/$USER/homebrew-local-cmake 目录下创建一个新的 tap 结构

2. brew tap homebrew/core --force

这条命令强制重新 tap Homebrew 的核心仓库。

  • 作用:确保 homebrew/core 仓库(包含官方软件包公式的主仓库)被正确 tap,--force 参数强制执行,即使该 tap 已经存在
  • 结果:确保可以访问 homebrew/core 中的软件包公式,这是后续提取 CMake 公式所必需的

3. brew extract --version=3.31.1 cmake $USER/local-cmake

这条命令从 homebrew/core 中提取特定版本的 CMake 公式到你的本地 tap 中。

  • 作用:从官方仓库提取 CMake 3.31.1 版本的公式,并将其放入你刚创建的本地 tap 中
  • 结果:在你的本地 tap 中创建一个 [email protected] 公式文件

4. brew install $USER/local-cmake/[email protected]

这条命令安装你本地 tap 中的特定版本 CMake。

  • 作用:使用刚刚提取的公式安装 CMake 3.31.1 版本
  • 结果:在你的系统上安装 CMake 3.31.1 版本

退掉佳明手表

2025-03-15 13:06:54

之前就一直心动想要摆脱苹果生态,尝试使用其他的设备,避免被生态绑架住。首当其冲的,就是电量有点不太行的 Apple Watch。原本想要换一个安卓的手表,但是看了一下各家的安卓手表,基本也需要绑定自家的手机和软件生态。然后现在使用 iPhone 的情况下,支持也不太好,很多功能会缺失掉,因此迟迟没挑好。

既然各家的安卓手表挑不中,干脆挑一个运动手表,不绑定手机厂商,安卓与 IOS 阵营都能通用。于是刷了几天小红书,选中了几乎是最多人用的佳明,挑了一个价格和 Apple Watch 差不多价格的手表下单。

用了几天之后发现,从 Apple Watch 转向运动手表,真的像是从现代社会退化为原始社会,运动手表,可谓是与智能没有一点关系。运动手表,尤其是像佳明这种专业的运动手表,其实是 for 专业运动水平的人和跑者使用。而我对手表更需要的,可能还是因其智能性能在生活当中带来的便利,我更需要的,还是智能性,能够帮我在日常生活在手表上完成一些很方便的操作,而不是在运动上的专业性。尤其是手表不能控制手机闹钟,没有了我才意识到这个对我来说,其实是个刚需。就运动记录上,感觉佳明和我之前的 Apple Watch 差不了多少,该有的,我能看懂的好像大家都有,对我来说好像也没有太大的提升和意义。

看来还是逃离不了苹果生态,逃离不了 Apple Watch,只能乖乖退掉佳明手表,重新戴上 Apple Watch。