分类: 随笔

  • 当一位拥有 root 权限的安卓用户升级到了 ColorOS 15

    大版本号的系统更新往往意味着 A Lot of BREAKING CHANGES!

    LSPosed

    需要安装一个第三方修改版的 LSPosed 以支持 Android 15。
    https://github.com/JingMatrix/LSPosed/releases/tag/v1.10.1

    或者申请加入 LSPosed 内测版本

    允许后台应用访问粘贴板

    https://github.com/Kr328/Riru-ClipboardWhitelist
    这个模块其实在 Android 14 时就已经无法正常工作了,升级到 Android 15 后完全可以卸载了。

    为了能够让 KDE Connect 可以正常访问剪贴板,需要用搭配一个 Magisk 模块跟一个 XPosed 模块使用。

    draumaz/kdeconnectbidirectionalclipboard 模块允许 KDE Connect 在开机后自动获取剪贴板相关的权限。

    entr0pia/xposed-clipboard-whitelist 则允许 KDE Connect 在后台读取剪贴板内容。

    让后台应用能够接收 FCM 通知

    允许 GMS 熄屏后继续运行

    参考酷安网友(丛雨不是粽子精)的帖子,需要在开机后以 root 权限运行这条命令:

    settings put secure google_restric_info 0

    或者你可以直接使用我制作的 Magisk 模块

    使用 fcmfix 启动未运行的应用

    kooritea/fcmfix: [xposed]让fcm唤醒已完全停止的应用 模块允许在国行系统上收到 fcm 推送后唤醒未启动的应用。

    推荐选择如下作用域:

    为了允许被唤醒的应用能够被启动,需要手动在 ColorOS 的 Settings/Apps/Auto launch 中授予自启动权限。否则当消息推送到手机上时,由于目标应用无法自启动,fcmfix 会代为生成一条仅包含应用包名的消息。

    fcmfix 支持有选择性的唤醒应用,我建议为了方便,可以勾选全部的包含 fcm 的应用,因为在 ColorOS 上,如果你不单独地为各个应用配置自启动权限,应用是无法在后台启动的。

    让 NoActive 支持 fcm

    如果你像我一样使用 NoActive 模块来严格地管理后台,你还需要参考 NoActive 的文档,启用全局 fcm 支持

    分享菜单清理

    每个应用都很想占据用户的分享菜单,但是 Android 的分享菜单管理功能又过于弱鸡,一个比较简单的方案是在分享菜单页面长按图标,将最常用的应用置顶。

    如果非常想要清理分享菜单而且不嫌麻烦的话,可以使用爱玩机工具箱提供的组件状态管理功能,禁用掉分享、批量发送之类的活动。

  • Obsidian 数据同步方案:从 Git 到 Syncthing 的平滑切换

    Obsidian 作为一款本地优先的笔记软件,数据安全始终是用户关注的重点。我之前选择 Git 来进行版本控制,但随着 Obsidian 插件的不断增加,有些插件会生成大量二进制文件,这些文件如果直接存储在 Git 仓库中,会快速消耗 Git LFS 的免费存储额度。

    我最初考虑使用 Remotely Save 插件的 WebDAV 功能将数据备份到 NAS,但在 QNAP 上频繁遇到 403 错误,最终决定采用更稳定的 Syncthing 方案。

    Syncthing 在 QNAP 上的部署要点

    在 QNAP 上安装 Syncthing 需要通过第三方软件源 MyQNAP.org,该源提供了两个 Syncthing 安装包:

    • Syncthing:以普通用户权限运行
    • Syncthing Run As Root:以 root 用户权限运行

    建议选择 Syncthing,原因如下:

    1. 权限管控更安全:避免 root 权限带来的安全隐患
    2. 多用户兼容性更好:非管理员用户也能正常访问 Syncthing 同步的文件

    :安装后系统会自动创建 syncthing 用户,默认属于 everyone 用户组

    配置优化建议

    1. 文件夹权限设置: 同步文件夹的权限配置需要特别注意,建议设置为 <user>:everyone 模式,确保 Syncthing 有完整的读写权限。
    2. Ignore Permissions 选项:在 Syncthing 中启用该选项,因为普通用户权限的 Syncthing 无法修改其他 NAS 用户的文件权限。
    3. Linux 桌面端推荐:建议使用 Syncthing GTK,它提供了更友好的图形界面,并支持后台运行。
    4. QNAP 共享文件夹的位置:在 QNAP 中,用户创建的共享文件夹都位于 /share/ 目录下。

    Web UI 访问优化

    如果通过 Nginx Proxy Manager 反向代理 Syncthing 的 Web UI,请务必执行以下设置:

    • 取消 Cache Assets 选项
    • 原因:Syncthing 依赖 /meta.js 文件验证登录状态,缓存 Assets 会导致登录功能异常

    这种同步方案既解决了 Git LFS 的存储限制,又避免了 Remotely Save 的 403 问题,是目前我认为比较理想的 Obsidian 数据同步方案。建议在切换前做好数据备份,确保万无一失。

  • 划词翻译插件的 Prompt

    沉浸式翻译固然好用,但是不利于学习单词,当遇到不认识的单词时,我更倾向于使用划词翻译插件。

    下面就是我用来执行翻译任务的 Prompt:

    你是一名优秀的翻译人员,熟练掌握各种语言,拥有母语般的掌握程度。
    
    在翻译任务中,你需要将「原文语言」翻译成「目标语言」,任务要求如下:
    
    1. **单词或词组的翻译**
       - 直接给出音标、词性跟含义。
       - 用「原文语言」给出简单易懂的解释,确保初学者能够理解。
       - 示例:
         - 翻译:
           - 音标:/ˈæp.əl/
           - 词性:名词
           - 含义:苹果
           - 原文语言解释:A round fruit with red, green, or yellow skin and white flesh.
    
    2. **句子或段落的翻译**:把握原文的精髓,用「目标语言」复述,而不是机械的翻译。
    
    3. **输出格式**:纯文本,不要使用 markdown 标记。
    
    现在,翻译的「目标语言」是 {{target}},以「原文语言」编写的待翻译文本如下:
    
    {{text}}

    上面的 prompt 使用了一些 prompt 技巧,使得 gpt-4o-mini 级别的模型也能够很好的完成翻译目标,这些技巧包括:

    • 结构化地组织语言,使得任务目标更加清晰,减少 LLM 的阅读障碍
    • 提供样例,就算是弱智一些的 LLM 也会严格按照样例输出。
    • 定义变量,由于翻译场景的限制,Prompt 阶段我们不可能得知待翻译文本的书写语言,通过定义「原文语言」跟「目标语言」并明确它们之间的关系,使得我们可以在 prompt 中通过这些「变量」来指代它们。
  • 密码保护:西昌之旅

    此内容受密码保护。如需查阅,请在下列字段中输入您的密码。

  • 2024 家庭网络设备大升级 网络篇

    搭建自己的 homelab ,在局域网尽情冲浪~

    2 / 2 of homelab 历险记

    网络设备硬件到齐之后,就需要重新配置网络了,在我的使用场景中,家庭网络除了基本的上网之外需要承担两个额外的功能:

    • 全局透明代理
    • 允许电脑、手机远程访问本地网络服务

    我选择的方案是使用 N100 小主机运行一个 OpenWRT 虚拟机,并将两个物理网卡分配给它,以实现更加高级的网络配置。

    怎么连网线

    因为家宽的下行带宽只有 300M,所以就用开发商自带的超五类网线连接光猫跟 N100 小主机的千兆 WAN 口。

    N100 小主机的 2.5G LAN 口跟一台 TP-Link 路由器连接,路由器设置有线 AP 模式,这样全屋所有的流量都由虚拟机软路由处理,用 openwrt-passwall2 实现全局透明代理功能。

    QNAP NAS 通过网线连接到 TP-Link 路由器,不过由于路由器只有千兆网口,所以 QNAP 的2.5G 网口完全是性能过剩的。

    N100 上再用一个有线网卡连接到 TP-Link 路由器,给宿主机联网使用,这个有线网卡配置了一个静态 IP,方便在软路由挂掉的时候访问管理面板排查故障。

    其他的设备都用无线网络连接,因为户型小,所以单个 TP-Link 路由器的 5GHz WiFi 完全可以覆盖主要的视频消费设备。至于厨房、阳台等犄角旮旯的物联网设备,2.4GHz WiFi 也能提供足够的覆盖度。

    怎么从任意的外部网络访问家里的局域网

    很多 homelab 玩家会选择公网 IP 搭配 DDNS 的方案,但对我来说,这种方案会显著提高局域网的安全风险 —— 我并不是一个 OpenWRT 的运维高手,也完全不会使用 iptables/nft ,如果有人通过公网 IP 侵入了局域网,我大概率很难及时地发现问题。

    我的方案是 zerotier + 拥有公网 IP 的 VPS + singbox。外网设备通过 singbox 客户端连接 VPS 上的 singbox 服务端,然后通过路由规则将发往局域网的流量通过 zerotier 转发到家庭网络的 OpenWRT 上,以此实现远程访问。

    首先,将局域网中的 OpenWRT 跟 VPS 都加入同一个 zerotier 网络。OpenWRT 加入 zerotier 比较复杂,建议参考 openwrt 的文档配置。

    在 OpenWRT 上成功加入 zerotier 网络后,就可以看到下面的接口以及防火墙配置:

    然后在 VPS 上添加一条路由规则:

    ip route add 192.168.100.0/24 via 10.2.2.233
    # 10.2.2.233 就是 OpenWRT 在 zerotier 网段中的 IP

    接着其他设备在外部网络下通过 singbox 连接到 VPS,并且添加下面的 singbox 路由规则:

    "route": {
      "rules": [
        {
          // 家庭局域网网段
          "ip_cidr": [
            "192.168.100.0/24"
          ],
          "outbound": "vps"
        },
        {
          // 局域网服务专属域名,在公网设置解析到家庭局域网的 Web 网关
          "domain_suffix": [
            ".n.zeeko.dev"
          ],
          "outbound": "vps"
        },
      ]
    }

    这样不仅可以减少家庭局域网在公网上暴露面,还方便各种设备(笔记本电脑、手机、平板)在各种网络条件下访问家里的局域网设备 —— 只要能连接上部署了 singbox 的 VPS,就可以访问家里的局域网。至于远程访问时的网络连接速度,实测在联通 5G 网络下满足远程播放 20Mbps 码率视频的场景比哔哩哔哩大会员的 4K 视频要强

  • 2024 家庭网络设备大升级 硬件篇

    搭建自己的 homelab ,在局域网尽情冲浪~

    1 / 2 of homelab 历险记

    趁着双十一,给家里的网络设备做了一个全面的升级。之前家里的网络生态全靠一台单点的旧笔记本电脑支撑,这台笔记本运行着免费版的 PVE,跑着下面三台虚拟机:

    • 软路由
    • Docker Host:运行 Self-host 服务
    • NAS:OpenMyVault

    这次大出血,买了一台双网口的 N100 小主机跟 QNAP TS-464C。由这两台设备来分担之前一台笔记本电脑的全部工作:

    功能设备
    软路由N100 小主机
    Docker HostN100 小主机
    NASQNAP
    多媒体服务N100 小主机

    QNAP 也算得上是老牌网络存储设备提供商了,所以我对存储、备份、同步相关的全部需求都计划由 QNAP 来提供,这样可以尽可能保证数据安全。

    N100 小主机有多个网口,且出厂没有安装操作系统,用来折腾软路由跟一些 self-host 服务最合适不过了。

    除了这些电脑之外,我还买了一台瓦力 UPS,120W 的输出功率给 N100 跟 QNAP 供电完绰绰有余。

    性能够用吗?

    之前笔记本的配置为 16G 内存搭配 6 代移动平台低压 i7 处理器,在 PVE 的面板上经常看到设备满负载运行。新的 N100 跟 QNAP 虽然只有 8G 内存,但是运行相当数量的服务却都只会占用到一半的资源,CPU 利用率也低了很多。

    N100:安装了 FNOS 并通过虚拟机运行软路由
    QNAP:正在对 NAS 上文件建立搜索索引

    目前体验下来,硬件性能完全够用,甚至还有一些富余。原先非常消耗资源的相册应用 (Photo Prism) 替换成 QNAP 提供的 QuMagie 相册后,不仅图片导入速度变快了,而且也不再是 CPU、内存的消耗大户了。

    存储空间够用吗?

    之前的笔记本上主要用一块使用 ZFS 的 2T NVME 硬盘作为 PVE 的存储空间。但因为几次意外的断电事故,导致 ZFS 出现一些不可挽回的数据错误,为此我折腾了很久也没能修复错误,这也让我下定了决心要搭建一个简单易维护的数据存储系统。

    这次在配置 QNAP NAS 的时候,我选择用两块 4T HDD 组成 Raid1 ,用来保存比较重要的数据:

    在我的配置下,总共 8T 的 HDD 实际可用空间大概就 1.2 T,略大于 OneDrive 上 1T 的云存储空间。

    而 N100 小主机则继续使用之前笔记本拆下来的 2T 固态硬盘作为不重要数据的存储空间,用来存存放一些影片也很足够了。

  • 有多少「黄牛」在抢四川消费券?

    2024年9月,四川省财政厅投入了 3 亿资金用来向市民发放家装消费券

    在9月27日消费券被领取完后的 30 分钟,我在闲鱼上找到了跟四川家装消费券相关的87条搜索结果:

    补贴金额数量小计
    4k416k
    2k48k
    1.5k1319.5k
    0.9k1715.3k
    0.6k148.4k
    总计5267.2k

    在领取完后的一小时,相关搜索结果有 158 条。据此粗略估计,每天在闲鱼上被转卖的消费券大概价值 20 万元。

    根据官方的消费券发放安排,价值 3 亿的消费券会在 9 月 26 日到 10 月 31 日中的 31 天发放,假设能够全部发完,每天应该发放价值 967 万元的消费券。

    如果只有闲鱼上有黄牛,那么 9 月 27 日这天的黄牛含量大概在 2% (20/967≈2.07%)。

  • 如何选购冰箱

    冰箱是柜子,冰柜是箱子

    影响冰箱摆放位置的产品参数

    作为家中体积最大的电器,找个合适的位置放冰箱很关键。影响冰箱摆放空间的参数有两个:

    • 散热方式
    • 开门方式

    两侧散热的冰箱需要预留更多的空间帮助全年无修的冰箱散热,通常需要在冰箱的左右两侧以及后侧各预留 10cm 左右的空间。

    底部散热或者顶部散热的冰箱对空间的需求比较小,适合摆放在比较狭小的空间。

    开门方式也会影响冰箱的摆放,虽然冰箱叫「箱」,但是开门方式跟柜子类似,主要使用抽屉跟平开门。所以在摆放冰箱的时候也应该像摆放柜子一样,考虑门板、抽屉跟其他家具的冲突。如果空间比较狭小,可以选择 90° 的平开门。

    另一个节省冰箱摆放空间的技巧是把冰箱插座的位置调整到冰箱的侧面,或者使用内嵌式插座。这样可以为冰箱节省 3 ~ 4cm 的深度空间。

    影响收纳能力的产品参数

    作为柜子,冰箱当然越能装越好,商家往往只会商品详情页上写明容量,例如,500L,但是我们往冰箱中存放的只会是固体。所以容量只能作为参考,真正影响使用体验的是冰箱的收纳方式,对应的产品参数是门款式。

    门款式通常对冷冻区的格局影响比较大,大家可以按照自己最常屯的物品选择适合的冷冻区格局。

    影响使用体验的产品参数

    串味是影响冰箱使用体验的一个常见问题,从冰箱的角度解决这个问题有两种方式:

    • 双循环风道
    • 净味系统

    现在多数冰箱采用风冷降温,冷空气会在冷藏区、冷冻区之间流动,只有单循环风道的冰箱会有跨区窜味的问题。一些冰箱通过引入双循环风道,将冷藏、冷冻区之间物理隔离开,从而避免串味的问题。

    净味系统则是引入了类似空气净化器的模块,也能在一定程度上减少冰箱的异味,异味浓度低了,串味的影响也会降低。

    影响保鲜功能的产品参数

    保鲜可以从两个层面理解 —— 防止腐败、防止风干

    为了防止腐败,我们应该尽量选择带有杀菌能力检测证书的冰箱 只声称可以杀菌但不提供证书的都看作没有杀菌能力,通过抑菌、灭菌来降低食物污染风险。

    为了防止冷风将新鲜蔬果吹干,可以选择带有湿度调节区域的冰箱,减少干冷空气对果蔬的影响。

    不过防止腐败跟防止风干是有些冲突的两个功能,潮湿的有氧环境有利于微生物繁殖,所以, 最好还是减少新鲜蔬果的存放时间,或者将蔬果单独分区存放。

    产品关键参数速查表

    • 摆放位置
      • 长宽高
      • 散热方式
      • 开门方式
      • 插座位置
    • 收纳能力
      • 容量
      • 门款式
    • 防串味
      • 是否双循环
      • 净味系统
    • 保鲜
      • 杀菌、抑菌能力证书
      • 果蔬保鲜区

  • 如何为博文自动生成可读的 Permalink

    WordPress 默认提供了一个比较适合英语文章的 Permalink 生成机制,如果你跟我一样使用中文标题,那自动生成的 Permalink 中就会包含汉字,这对 URL 而言并不友好。之前我都会手动给每篇博文翻译一个英文标题,再将其 slugify,做得多了就会觉得繁琐,于是我开发了一个 API,可以用来帮助自动化地完成这个过程。

    API 的调用方式如下,大家可以免费使用。

    GET https://blogkit.apps.gianthard.rocks/api/v1/slugify?t=如何科学饲养母猪
    
    HTTP/2 200 OK
    server: nginx
    date: Mon, 19 Aug 2024 10:01:06 GMT
    content-type: application/json; charset=utf-8
    age: 189318
    cache-control: public,max-age=31536000
    content-length: 24
    x-http2-stream-id: 3
    
    "scientific-sow-rearing"

    要在 WordPress 中自动调用的话,需要在 WordPress 管理页面添加一些代码:

    function suggest_slug_from_api( $slug, $post_id, $post_status, $post_type, $post_parent, $original_slug ) {
        // Only apply for new posts or when the slug is empty
        if ( empty($slug) ) {
            $post = get_post($post_id);
            $title = $post ? $post->post_title : '';
    
            if ( empty($title) ) {
                return $slug; // Return original slug if no title
            }
    
            $api_url = 'https://blogkit.apps.gianthard.rocks/api/v1/slugify';
    
            // Encode the title for use in URL
            $query = http_build_query(array('t' => $title));
            $url = $api_url . '?' . $query;
    
            // Make the API request
            $response = wp_remote_get($url);
    
            // Check if the request was successful
            if ( !is_wp_error($response) && wp_remote_retrieve_response_code($response) == 200 ) {
                $body = wp_remote_retrieve_body($response);
                $suggested_slug = json_decode($body, true);
    
                // If we got a valid slug, use it
                if ( $suggested_slug && is_string($suggested_slug) ) {
                    return $suggested_slug;
                }
            }
        }
    
        // If anything goes wrong or if the post already has a custom slug, return the original slug
        return $slug;
    }
    add_filter( 'wp_unique_post_slug', 'suggest_slug_from_api', 10, 6 );
    

    我使用的是 WP Code 插件,用这个插件管理 PHP 代码片段非常方便,免费版也很够用。

    注意只在 Admin 页面上启用这个片段

    上面的代码工作完成后,WordPress 就会在草稿保存后自动生成 URL slug 。需要注意的是,编辑页面的前端可能不会及时更新 URL slug 预览,但是发布后就会使用通过 API 生成的 URL Slug。

  • 等一个后续

    像个鸵鸟一样,把头埋进沙子里。

    2024-07-09 五问煤制油罐车混装食用油:流向哪里?有何危害?谁该负责?

    https://web.archive.org/web/20240809024444/https://www.thepaper.cn/newsDetail_forward_28010047

    2024-08-27 国务院食安办通报“罐车运输食用植物油乱象问题”调查处置情况(简讯)

    https://web.archive.org/web/20240829090033/http://paper.people.com.cn/jksb/html/2024-08/27/content_26077451.htm

    2024-08-27 关于征求《食用植物油散装运输卫生要求》拟立项强制性国家标准项目意见的通知

    https://web.archive.org/web/20240829090629/https://www.samr.gov.cn/bzjss/zqyj/art/2024/art_94a628a1632644a2862d4f2ba8f6fc43.html

    2024-08-08 披露“75人涉嫌盗尸4000具”案律师:我甘愿受处罚,希望推进法律完善

    https://web.archive.org/web/20240809024851/https://news.sina.com.cn/s/2024-08-08/doc-inchxvay1591238.shtml

Index