Y

YeungYeah 的乱写地

YeungYeah 的乱写地中记录了作者的所思所想及所为。

注销网站备案

之前为了境内能够流畅地访问博客,给网站做了 ICP 备案,用上了又拍云赠送的 CDN 加速。境内访问非常丝滑,而且因为备案的原因,在微信内分享也可以直接打开,不会提示未知网站,需要多点一次才能访问。 然而备案后还是时不时有问题找过来。备案的要求也非常奇怪,网站备案除了要求域名备案,还需要有一个授权码,而授权码又来自于购买云服务器。导致即使只是部署一个在 GitHub 上的静态页面,还要额外掏钱买个云服务器,基本上就是闲置了。 突然昨天直接网警打电话过来了,因为网站之前只做了 ICP 备案,没有做公安备案。当时没有公安备案也不影响访问,而且做公安备案也比较麻烦,还有说法是甚至还要去派出所面谈做备案,干脆就没有做公安备案。现在籍贯地的网警直接打电话来问网站还用不?用的话要去做公安备案。 原本还想坚持下,把公安备案做了。后面想了想,还是算了,还是放弃备案。申请备案麻烦,各种材料,还要手写申请书,备案材料层层上交审批,搞一次得几天。然而撤销就干脆利落得多了。十一点提交的撤销申请,过十来分钟直接撤销完成了。 放弃备案之后,又拍云的 CDN 加速用不了了,应该基本国内平台的 CDN 都用不了。于是干脆迁到 Cloudflare 上,整个域名都迁到 Cloudflare 上来解析,静态内容都可以走它家的 CDN。 至此,所有域名都迁移到 Cloudflare 这个赛博菩萨上。自己试验了一下,访问速度也还好,不知道看到这边文章的大家感觉如何?

2025/9/12
articleCard.readMore

Logseq 移除空白 Journals 页面

Logseq 在打开的时候,会自动创建当天的 Journal 页面。正常来说,当打开 Logseq 的时候,确实大部分可能都是要记录,这样的 feature 看着没什么问题。然而如果 Logseq 打开后没有彻底退出,也会照常每天创建 Journal 页面。久而久之,打开 Logseq 后你将会看到一堆的空白页,让人非常不爽,而且想要浏览此前的 Journal 记录也非常不方便。 为了避免这种情况,之前都是提醒自己在用完之后,记得 commond + q 完全退出 Logseq,然后偶尔忘掉的情况,再手动删除空白页。但实际上非常容易就忘掉退出,然后又可能因为工作可能过了一周再打开,一次就积累了一堆空白页,手动一个个删除也比较费力。 一开始想的是简单写个脚本,扫一下目录里面空白的 markdown 文件,但是打开本地目录发现,空白的 Journal 页面还不一定会创建空白文件。后面上网搜了一下发现,原来自带就有这个移除功能的,而且移除的范围还不止空白的 Journal,所有的空白 Page 都能扫出来然后移除。 具体入口路径:All pages -> ... -> Remove orphaned pages

2025/8/31
articleCard.readMore

自建 Bitwarden 突然不可用

前言:我的配置 我一直是 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 一年,不再折腾。这境内的个人云服务器感觉用处越来越小,要不是博客需要备案号需要云服务器,绝对停掉转用境外的云服务器。

2025/7/19
articleCard.readMore

Logseq 如何同步

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 阶段 • 合租存在安全风险 单纯 PC 使用:OneDrive 等云盘同步即可满足需求 Mac + iOS 环境:iCloud 基本可用,但需注意同步延迟问题 涉及 Android 的跨平台多设备:官方同步功能是最佳选择,虽然需要付费但体验最好 技术用户:可以试试 Git 方案,但需要有处理冲突的能力

2025/6/13
articleCard.readMore

从 IOS 迁移到 Android

这两年一直有把 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 的健康软件不支持导入,只能重新开始 历史数据可以参考下面的方法导出和查看,但不能导入当前健康软件使用,后续估计也会逐渐废弃遗忘 https://sspai.com/post/66163 https://www.ericwolter.com/projects/apple-health-export/ 软件:手动从软件商店和 Google Play 一个个下载 内外软件分开下载,感觉比之前两个不同区 Apple ID 在 App Store 切换方便多了 其余基本没有什么 loss 一些体验 充电速度真的快 电量明显增大,续航能力提升 所谓的信号变好其实没什么感觉 但 iPhone 的信号确实差,换安卓其中一个重要原因就是在某些地方真的没有一点信号,比如在深圳中心区的网咖里竟然完全没有信号 通知推送有点不给力,可能是安卓通病 通知类型不准确: 系统有分不同的通知类型,但实际应用发来的通知感觉都是一个类型的,导致系统想对不同类型通知设置不同的处理(声音还是震动还是静默)没有效果 比如钉钉通知要么全开声音,来一条消息都要响一下,要么全关声音,电话打过来都听不到也不震动 通知收不到 某些应用的通知收不到或者有延迟,偶尔需要打开应用通知才推送过来

2025/4/29
articleCard.readMore

Homebrew 降级安装指定版本应用

总是习惯性地把所有软件都更新到最新,然后在写博客的时候发现,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 的版本降回原来的版本。 具体操作如下 brew info hugo. 找出需要降级应用所在的 repo 和路径 我这里用了镜像,原始的 repo 在 GitHub 上 到 GitHub 上找到对应 repo 的对应文件 路径可以参考 https://github.com/Homebrew/homebrew-core/blob/master/Formula/h/hugo.rb 找这个文件的提交历史,找到需要降级版本的提交 id 根据 commit 的 id 可以判断出来版本,是由 bot BrewTestBot 提交的 拿到 commit id 后可以拿到这个安装文件的 url,同时也可以拿到文件的内容 https://github.com/Homebrew/homebrew-core/blob/2fd8dba871a6a5412fa7c00b12ac99b5738cd199/Formula/h/hugo.rb https://raw.githubusercontent.com/Homebrew/homebrew-core/2fd8dba871a6a5412fa7c00b12ac99b5738cd199/Formula/h/hugo.rb 把 commit id 和 app 的名字替换一下就可以了 按照网上看到的办法,可以直接根据 url 来安装 brew install url 但实际试了一把后发现,会报错 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. 于是直接把文件内容 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/cmake@3.31.1 以下是 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 中创建一个 cmake@3.31.1.rb 公式文件 4. brew install $USER/local-cmake/cmake@3.31.1 这条命令安装你本地 tap 中的特定版本 CMake。 作用:使用刚刚提取的公式安装 CMake 3.31.1 版本 结果:在你的系统上安装 CMake 3.31.1 版本

2025/3/15
articleCard.readMore

退掉佳明手表

之前就一直心动想要摆脱苹果生态,尝试使用其他的设备,避免被生态绑架住。首当其冲的,就是电量有点不太行的 Apple Watch。原本想要换一个安卓的手表,但是看了一下各家的安卓手表,基本也需要绑定自家的手机和软件生态。然后现在使用 iPhone 的情况下,支持也不太好,很多功能会缺失掉,因此迟迟没挑好。 既然各家的安卓手表挑不中,干脆挑一个运动手表,不绑定手机厂商,安卓与 IOS 阵营都能通用。于是刷了几天小红书,选中了几乎是最多人用的佳明,挑了一个价格和 Apple Watch 差不多价格的手表下单。 用了几天之后发现,从 Apple Watch 转向运动手表,真的像是从现代社会退化为原始社会,运动手表,可谓是与智能没有一点关系。运动手表,尤其是像佳明这种专业的运动手表,其实是 for 专业运动水平的人和跑者使用。而我对手表更需要的,可能还是因其智能性能在生活当中带来的便利,我更需要的,还是智能性,能够帮我在日常生活在手表上完成一些很方便的操作,而不是在运动上的专业性。尤其是手表不能控制手机闹钟,没有了我才意识到这个对我来说,其实是个刚需。就运动记录上,感觉佳明和我之前的 Apple Watch 差不了多少,该有的,我能看懂的好像大家都有,对我来说好像也没有太大的提升和意义。 看来还是逃离不了苹果生态,逃离不了 Apple Watch,只能乖乖退掉佳明手表,重新戴上 Apple Watch。

2025/3/15
articleCard.readMore

2024 年度记录

度过作为纯种打工人完整的一年,简单地写点流水账,记录下今年的一些事情与想法。 一月 终于去香港办银行卡了,虽然遇到了一些预料之外的问题,去到发现电信电话卡在香港漫游无效没信号的问题,不过有惊无险,最后还是顺利办成并当场下卡。 从这刻开始,我也开启了我的美股投资之路。通过美股这个渠道,我对投资和赚钱有了更多的思考。在去年工作之后,我就觉得搞钱才是最重要的事,但具体该怎么搞钱、如何在不工作之外还能有收入,当时还没有太多的想法。如今接触到美股投资后,虽然不可能通过投资马上赚大钱,但起码看到了希望,尤其是看到一些转行当专职 trader 的同行还能养活自己并过得不错之后,更让我觉得这条路有可能性。 核心还是需要:做好准备,等待机会。 多攒钱,积极寻找机会,be open,不局限于某一条路子。 借着办卡的机会,我顺便在香港玩了一天。上次去香港应该还是初中的时候。作为一个广东人,虽然对香港的各种信息接触得比较多,看似很熟悉,但实际上这才是我第二次去香港。不过会粤语、熟悉香港文化,去玩也没遇到什么问题。香港这个城市还是有许多吸引我的地方,让我想起初中时的志愿是到香港大学读书。现在其实有机会拿到 hkid 去香港工作,但各种因素让我迟疑,尤其是“待七年”这个门槛太高。不过,去生活不行,多点去玩还是可以的。第一次去香港之后,回来我就马上把签注更新成了一签多行。 二月 过年,越来越没什么年味和感觉,也可能是年纪大了,对过年也越来越没什么期盼。过年逐渐演化成回乡下吃饭,亲戚间互相探亲吃饭,各种吃饭的模版一般的场景,并不喜欢。 三月 & 四月 own 的一个项目终于要上线了,期间外部合作机构各种幺蛾子,各种出问题,上线后也还有很多手尾需要跟进。不过最终的业务效果还是极好的,上线的这一年带来了极高的 TPV。虽然说技术是为了业务服务,但很现实的一点是,真的拿到了好的业务成果之后,还会 credit to 技术人员上吗?想起内网曾经看到的一个吐槽贴,庆功会上各种人都在,唯独不见技术人员。 再结合年度绩效出来后的年终奖和调薪,更加让人想笑 (我这个新人连这个500都没) 更加意识到打工没什么前途。 女朋友的考研成绩也出了,初试高分,复试准备了两周后也顺利拿下,终于上岸,可喜可贺,算是弥补了当年的遗憾。 五月 打卡汕头。虽然高中时身边有不少潮汕同学,但直到现在才第一次去。对汕头的印象,全是牛肉火锅和甘草水果。 六月 和团队团建去了马来西亚,时隔七年再次出国,而且也还是去马来西亚。海岛的景色确实还可以,浮潜也很有意思。 去东南亚旅行消费确实低,来回的机票全包也才 900+。逐渐开始意识到,其实出国玩并没有想象中那么麻烦,性价比也挺高的。新的一年希望能有更多机会解锁不同的国家(但还得先解锁各国签证)。 九月 - 十一月 三个月参加了三个同学的婚礼,身边的同学和朋友开始逐渐结婚成家了。还是挺多感慨的,见证着身边同龄人进入下一个人生阶段,偶尔也会想:什么时候轮到我呢?我并不恐婚恐育,相反甚至还有点向往婚姻、家庭与小孩。然而结婚也没那么简单,结婚意味着两个家庭的结合,不是两个人领证就完事,还需要考虑方方面面的各种因素。不过麻烦归麻烦,还是需要面对的,也不会去逃避。希望这两年能让这个喜事发生。 十二月 公司的年度体检拖到年底才去做,所幸体检结果没啥大问题。工作以来自我感觉身体没以前好了,以前常常和别人自嘲说,我们这行是拿命换高薪。现在真工作了,发现工作确实会是一种损耗,both 生理上和心理上。如何面对这些损耗并尽可能减少它们带来的影响,这是我工作中最重要的一个课题。 生理上影响最大的一个点是运动时间少了。读书时时间充足,几乎每天都有时间运动,即使没运动,每天的步行量也足够。但工作后很容易一周都没运动(当然也有一部分原因是工作累了自己懒得动)。于是也在寻找一个高效且自己能坚持的运动方式,让自己动起来。之前买了一个壶铃,运动效果确实不错,当成 HIIT 都可以,但坚持了一个月就闲置了。 最近这个月重拾了游泳。其实从小就很喜欢游泳,小时候的夏天一放假家里人就会带我去游泳,也练出了自认为还可以的游泳技能。后面上大学后就基本没怎么接触游泳了。现在重新游泳后,开始在有泳道的专业泳池游(小时候游的泳池真的就是一个大池子)。接触游泳的人多了,再加上用手表开始记录自己的游泳情况,才发现其实我也不是那么会游。 在小城市里,会游泳的人没那么多,泳池也没那么专业,可能大多数人去游泳实际上是在玩水。在这样的环境里游得最好,其实也不代表什么。但处于其中的话,还是会被环境与平台局限着眼光与想法。 以前的自己有点坐井观天了,这不仅是游泳,还有许多方面。被自己的思维、想法,或者各种因素局限了。还是得打开自己,be open and keep exploring.

2025/1/4
articleCard.readMore

被生态绑架的数据

才用了两年多的 Apple Watch,现在电量已经开始撑不住了。目前电池健康度是 85%,晚上充满电后睡前戴上,第二天晚上七八点就会弹出 10% 的低电量警告。如果晚上需要去游泳,还得专门早上起床后给手表补一下电,确实有点顶不住。 打算换一个手表。继续用苹果的话,从 S7 换到 S10 感觉提升也不大;换成 Ultra 又觉得有点太贵了。于是考虑换个安卓厂商出的手表,看上了华为的 GT5 Pro。非华为手机也能用,只需要安装一个华为运动健康的 APP。不过这样一来,记录的数据就得全部存放在华为运动健康当中。这样的话,这些数据还属于我的吗? 其实有点好笑,我用他们的产品产生的属于我自己的数据,却无法对其拥有绝对的掌控权。某种程度上,这些数据存在他们的 APP 中,似乎就成了他们的数据。但这并不是华为一家会这样,几乎所有安卓厂商都有自己的健康 APP和手表,生成的各种监测数据也只能同步到各自的 APP 和生态当中。 不过,现在在用的苹果也一样。如果我不用 iPhone,健康与健身的所有数据,我同样没有办法迁移出来继续使用。这也是一直阻碍我换手机回归安卓的一大原因。 科技越发展,数码生态越完善,反而越建立起了生态上的壁垒。生态之间的迁移太过痛苦,甚至可以说是必然会有成本。迁移必须做出取舍(trade-off),选择任何一方都会有不足之处,无非是看自己能接受哪些问题作为妥协点。但其实这种取舍一直都存在,只是以前生态未完善时积累的数据还不够多。而现在,工作之后,时间和精力也不像以前那样充裕,去适应新的生态变得更加困难。 所以要换啥呢?一直在想,却始终想不出一个结果,这样就一直拖着不换了吧😂。然而,想换的心已经有了,拖着其实并不能打消这个念头。看什么时候彻底忍不了了吧。

2025/1/3
articleCard.readMore

Ahr999 in TradingView

近段时间开始关注 BTC 大饼现货,并且在找机会逐步进场持有。其中我主要是通过 Ahr999 指标来判断入场时机,这个指数来自于《囤比特币》。 具体的定义可参考 Ahr999 = ((比特币价格/200日定投成本) * (比特币价格/指数增长估值) 指数增长估值= 10^[5.84 * log(币龄) - 17.01] 币龄 = 当前日期距离2009年1月3日的天数 200日定投成本 使用几何平均值 通常认为: Ahr999 < 0.45 时,表示市场极度恐慌,是很好的买入机会 Ahr999 > 1.2 时,表示市场可能过热,需要注意风险 0.45 < Ahr999 < 1.2 时,属于相对合理区间 最开始打算是直接写个脚本跑在服务器上,定时计算,进入合适的区间就发 tg 消息提醒。写好调试好发现,我的服务器限于网络环境,无法调用 API 拿到数据,只能放弃。又转念一想,其实也算是个交易指标,干脆拿去 TradingView 上搞一个,写个指标画出来,并且加一个通知,如果指标跌破区间,就通过 TradingView 发邮件提醒。通过这个过程,也学习一下 TradingView 的脚本编写。 具体效果见下图 以下脚本代码主要通过 AI 辅助写出,有需要的话可以自取添加指标。这里指标只能针对日区间数据,需要把变更区间设置成 1d. //@version=6 indicator('BTC AHR999 Index', overlay = false) // 确保在日线图表上使用 if not timeframe.isdaily runtime.error('请在日线图表上使用此指标') // 计算币龄(从2009年1月3日开始) GENESIS_TIMESTAMP = timestamp('2009-01-03') days_since_genesis = (time - GENESIS_TIMESTAMP) / (1000 * 60 * 60 * 24) // 计算指数增长估值 // formula: 10^(5.84 * log(币龄) - 17.01) exp_growth = math.pow(10, 5.84 * math.log10(days_since_genesis) - 17.01) // 计算200日定投成本(简单移动平均) // sma_200 = ta.sma(close, 200) f_gma(src, len) => sum_logs = 0.0 for i = 0 to len - 1 by 1 sum_logs := sum_logs + math.log(src[i]) sum_logs math.exp(sum_logs / len) length = input.int(200, 'Length', minval = 1) gma_200 = f_gma(close, length) // 计算 AHR999 指数 // formula: (比特币价格/200日定投成本) * (比特币价格/指数增长估值) ahr999 = close / gma_200 * (close / exp_growth) // 为了使所有指标在同一个视图中可见,进行数值缩放 scale_factor = 1000 // 可以根据需要调整这个缩放因子 scaled_close = close / scale_factor scaled_gma_200 = gma_200 / scale_factor scaled_exp_growth = exp_growth / scale_factor // 绘制所有指标 plot(ahr999, 'AHR999', color = color.blue, linewidth = 2, precision=3) plot(scaled_close, '当日收盘价', color = color.green, linewidth = 1, precision=3) plot(scaled_gma_200, '200日定投成本', color = color.orange, linewidth = 1, precision=3) plot(scaled_exp_growth, '指数增长估值', color = color.purple, linewidth = 1, precision=3) // 添加 AHR999 的参考线 hline(0.45, '极度抄底区', color = color.green, linestyle = hline.style_dashed) hline(1.2, '中性', color = color.gray) hline(4, '极度卖出区', color = color.red, linestyle = hline.style_dashed) // 添加图例说明 var tbl = table.new(position.top_right, 4, 2, bgcolor = color.new(color.black, 70)) table.cell(tbl, 0, 0, '指标', text_color = color.white) table.cell(tbl, 0, 1, '实际值', text_color = color.white) table.cell(tbl, 1, 0, '收盘价', text_color = color.green) table.cell(tbl, 1, 1, str.tostring(close, format.volume), text_color = color.green) table.cell(tbl, 2, 0, '200MA', text_color = color.orange) table.cell(tbl, 2, 1, str.tostring(gma_200, format.volume), text_color = color.orange) table.cell(tbl, 3, 0, '指数估值', text_color = color.purple) table.cell(tbl, 3, 1, str.tostring(exp_growth, format.volume), text_color = color.purple)

2024/12/31
articleCard.readMore