MoreRSS

site iconAsyncX修改

面向兴趣编程,养猫,润加拿大。INTJ/P。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

AsyncX的 RSS 预览

第八期-Openclaw实现的运动/睡眠向导(非教程)

2026-03-06 06:30:00

前言

Openclaw不用过多赘述, 是一个可以运行在 NAS 上的自动化工作流平台,类似于自托管版的 n8n,支持通过可视化的节点连接各类服务和 API,实现数据的自动抓取、处理与推送。

本文旨在提供一个借助 Openclaw 来对 Garmin Connect 上的运动/睡眠数据进行简要分析的workflow,并通过定时任务设计了一个向导每日发送出来。当然目前这仅仅算的上一个demo, 由于不懂得一些指标的重要性, 目前只是简单让其结合睡眠和运动指标来进行一些建议.

部署Openclaw时候遇到的问题

网上有很多教程, 这里我简要说一下我在部署时候遇到的一些网上可能没有的问题/思路. 首先就是隔离, 我并不打算直接在本地环境运行Openclaw, 这几天在网上看到了不少Openclaw导致的安全问题, 因此我的选择就是在Docker中运行, 将其他用到内容映射到容器中.

我的服务器系统是飞牛OS, 因此有可视化的Docker, 但直接下载现成的Openclaw后遇到了gateway无限重启的问题, 于是我最后选择去加装了一个1Panel, 通过1Panel里面的一键安装来部署Openclaw.

部署/启动后均没有什么问题, 启动后需要从json文件拿到token输入到面板中来进行双向验证. 我使用的API是Gemini 2.5 Flash(上一年年末的时候Google的学生优惠可以免费使用一年的Google AI Pro, 现在活动已经没有了), 额度目前很够用.

消息发送我选择了Discord, 毕竟人在北美没有网络方面的烦恼, 日常使用Discord居多. 这一系列设置下来也没有任何问题, 都是在openclaw.json中进行设置的. 目前为止openclaw已可以正常运行.

python-garminconnect

这里我本人试图偷懒, 于是和openclaw发生了如下对话: 可以看到openclaw并没有权限使用我的账号密码, 也没有权限进行进一步的操作. 我不知道是不是我的用法不正确, 但ta也的确劝住了我不要进一步对ta下方权限. 于是我的实现思路就变成了用第三方的包来请求garmin官方, 在拿到我的数据后进行本地化存储, 由于实现设置过容器存储映射, openclaw则可以直接读取本地文件进行分析.

之前我搓了一个Astro网页, 用到了garmin-connect, 来统计我进行过的运动, 之前没有NAS, 所以放在了Github上用Action来运行, 后来token到期了懒得更新, 就放在那里了. 这次也用到了garmin-connect, 由于启用心电图必须要开启Oauth2, 这里需要注意一下登录凭证的处理.(vibe coding时候可以提供这一细节来让AI解决).

爬取到的数据是JSON, 但因为我只有一个手表, 很多行都是无效的, 因此需要格式化一下数据, 我选择了用csv进行存储, 这样看起来更直观.

每日计划的执行

扯一句题外话, 前段时间有篇论文专门研究了AI的成瘾性[^1], 说白了和老虎机是一个原理——你发出这段文字并期待AI为你生成更好的结果, 就像在赌博一样, 我遇到的80%的身边人(cs学生)对于prompt都是无所谓, 可以沟通就行, 但Openclaw不行, ta像一张白纸, 但凡没有了约束就会出现问题. 我任务一个具有大量规范性需求的prompt可以降低AI的成瘾性, 因为你在发出这个prompt的时候你就知道你大概率能得到你想要的答案了.

这是关于我的自动任务的prompt, 我深知不够完美, 但这目前是我尝试openclaw进行的一次努力:

1.我需要你阅读/home/node/.openclaw/daily的这3个csv文件.
2.基于我当天进行的运动, 心率, 以及前几天的睡眠质量, 来对我的睡眠时间进行建议.
3.如果最近没有运动数据, 不用声明运动数据缺失.
4.参照下面回答模板回答.

回答模板:
数据洞察:[一段话综述最近的睡眠/运动]
近日睡眠:[最近3天的睡眠细节]
综合建议:[对今日睡眠的规划]

额外补充:
每日理想起床时间为8AM~9AM;
基于睡眠情况和睡眠时间对sleep_need_feedback这一列数据进行解读并输出, 不要输出其原始数据.
如果运行出现错误请输出错误日志;

但似乎是由于我开启了隔离, 每次的输出依旧差别很大,以及sleep_need_feedback还是有一些问题, 需要进一步研究.

每到晚上我都不想睡去...真的需要检查一下心理健康了

总而言之Openclaw对我来说还是一个工具, 目前来看还是一个使用频率远不如cursor等强目的性LLM的弱工具, 不过我期待后续钻研的新用法.

[^1]: The Dark Addiction Patterns of Current AI Chatbot Interfaces, ACM CHI 2025.

Astro-blog记录(9) - 添加Webmention

2026-02-26 01:02:00

什么是Webmention

Webmention 是一种用于网站之间“相互通知”的开放协议。简单说,当你引用别人时,对方可以自动收到通知,并在自己网站上显示你的引用。科普就这么多, 你如果有兴趣可以在网络上找到很多相关的内容.

前言

这段时间又开始在网络上随机游走, 在V站的VXNA发现了很多不错的博客, 在極客死亡計劃下面发现了1年前我在Benji博客下面见到的WebMention. 趁着这段时间没有任何的ddl, 于是打算实施一下.

前期准备和具体流程

由于现在各类LLM过于强大, 我也成为了cursor的拥护者, 因此难以逐步提供信息, 但考虑到我的语言表达能力并没有在人类中属于出类拔萃的程度, 我想这或许是好事, 具体的方式如下:

  1. 通过 SITE_URL + 当前路径 生成标准目标地址,作为Webmention 的 target
  2. 页面加载后, 向https://webmention.io/api/mentions.jf2?target=当前文章URL发送请求,从 webmention.io 拉取所有指向该文章的 Webmention 数据
  3. 在文章底部展示

接下来是你在实施前需要做的准备: 注册webmention.io并验证, 验证的方法因人而异, 我使用了github, 目的是双向确认网页属于你. 到达类似这样的页面就算成功

进入Sites->Get Setup Code, 添加这行code到你网页的header中, 接下来就是在前端进行webmention的GET和渲染了, 就和上述的实施方式一致.

实施过程中遇到的问题

在实际场景中, 例如我所使用的Astro, 会根据自己的设置在访问的网页url后加上一个/, 以及在对webmention.io发送当前文章的url的时候会携带一个.html. 传过去的url和别人复制的url/本地的url等url不一致, 也会导致webmention无法正常显示, 因此值得注意.

(可选)采集Mastodon互动的额外配置

我的主要目的是展示在Mastodon上的互动, 但Mastodon本身并不具备webmention的相关功能, 因此需要引入一个额外的工具Bridgy, 用来拉取所有在联邦宇宙中产生的互动, 并递交给webmention.io. 下面是我的后台展示, 你可以清晰看到各种访问成功和异常(Sent即为发送webmention成功, 你可以通过点击刷新按钮左侧的时间来查看当前条目的日志, 从而进一步确定问题所在):

(可选) 添加手动提交表带

考虑到一些网络友邻没有在webmention.io进行链接提交, 这也意味着没有办法进行双向的信息展示, 即我作为A的文章被B引用了, 但B的博客没有办法告诉A我引用了你的文章, 因此我额外添加了一个手动提交的button. 当B在文章中提及了我的这篇博文, 那么ta可以在我这里手动提交表单给webmention.io, 进而收录. 实际提交的表单


下面则是我简单设计的webmention的展示, 兼顾了日夜模式/分离了点赞和回复

参考

给博客添加 Webmention

透過 webmention 來搜集 blog 的社群迴響

Astro-blog记录(8) - 主题半闭源/细节增加/评论迁移

2026-01-29 05:01:00

主题半闭源

前些天写小结的时候在github的feed页看到我写博文的仓库又多了一个star. 点进用户主页, 发现这位网友也有自己的blog, 本着回访的目的点了进去, 好家伙, 直接套用了我的主题, 当然我并非斥责抵制这一行为, 但这位网友似乎直接用ai生成了readme.md, 其中声明了这个主题是heavily inspired by a web, 这个web页是一个以极简高度出名的blog template, 并不是我的主题, 也不是我二次开发前的miniblog.

这件事中, 令我生气的地方在于这个网友似乎不屑于修改ai定义的readme, 抑或是他觉得这无关紧要, 在他博文的字里行间, 我闻到了一种刻意装出来地看破一切地清高, 然而他却把网络上的自留地完全交给了ai.

鉴于这种情况, 以及在最近添加了未完成博文的的过滤, 我已不能将我的所有博文放在public的仓库中, 于是决定将GitHub repo修改为private, 但主题依然欢迎大家在遵循 CC BY-NC-SA 4.0的前提下使用, 本文发布时, 我已调整了主题页面的详情.

拼图逻辑的实现

时至今日亲手用上cursor才意识到之前用的别的工具有多么笨拙, 下面是拼图逻辑的实现(by cursor): 实现思路本质上是 DOM 重写:

  • 识别候选块:遍历文章 article 的直接子元素,用 isImageContainer() 判断它是不是“图片容器”(p/figure/img),且排除 .db-card。
  • 找连续序列:把连续的图片容器聚成序列 sequences;只处理长度 ≥2≥2 的序列。
  • 扁平化图片列表:把序列里的容器全部展开成 imgs(按 DOM 顺序)。
  • 分组规则:用队列把图片按 每组最多 3 张切块;尾巴只接受 2 张(queue.length === 2 才入组)。
  • 生成拼图 DOM:为每个 group 创建一个 .image-mosaic(grid 容器),每张图包一层 .image-mosaic-item,并用 CSS 变量 --mosaic-cols 控制列数(2 张=2列,3 张=3列)。
  • 替换原内容:把拼图 fragment 插到序列第一个容器前,然后移除旧的 p/figure/img 容器。

此外, 我之前写了一个组件用来显示图片的文字信息, 为了在拼图上能有更好的效果, 我又让cursor生成了一个动画:

  (() => {
    if (window.__imgAltOverlayInstalled) return;
    window.__imgAltOverlayInstalled = true;

    const trimAlt = (s) => (typeof s === "string" ? s.trim() : "");

    const install = (root = document) => {
      // 仅拼图图片:在 item 上挂 data-alt(不改 DOM 结构)
      const items = root.querySelectorAll("article[data-pagefind-body] .image-mosaic-item");
      items.forEach((item) => {
        const img = item.querySelector("img");
        if (!img) return;
        const alt = trimAlt(img.getAttribute("alt"));
        if (!alt) {
          item.removeAttribute("data-alt");
          return;
        }
        item.dataset.alt = alt;
      });
    };

    // 注意:文章页有“图片拼图”脚本会依赖原始 DOM 结构(p/figure 里直接是 img)。
    // 这里稍微延后执行,避免先 wrap 破坏拼图的容器识别逻辑。
    const run = () => {
      setTimeout(() => install(document), 160);
    };
    if (document.readyState === "loading") {
      document.addEventListener("DOMContentLoaded", run);
    } else {
      run();
    }
    document.addEventListener("astro:page-load", run);
    document.addEventListener("astro:after-swap", run);
  })();

效果是这样的:

季度小结-Confused

2026-01-29 00:01:00

前言

距上次写完月度小结已经过了很久, 心路历程是这样的:"快期末了, 考完试再写", "考完试大家计划出去旅游, 旅游完再写", "没旅游成, 太冷了, 等最近发生一些有意思的事情了再写"...久而久之, 这篇11月月度小结就变成了冬季季度小结. 今天痛定思痛决定翻看一下相册, 将最近发生的鸡毛蒜皮小事记录下来.

学业

依旧是学业部分, 迎来了我的最后一个学期, 我现在的状态就是标题, Confused. 对前路, 对未来. 上一学期的课程完美通过, 受益匪浅, 最后一个学期, 我选择了Computer Vision和Big Data Analysis这2门课, 选择前者是对ML方面的拓展, 后者是一个好过的课(因为我本科的实习和毕业设计和这门课很类似).

至于Confused, 则是因为我直到现在为止还是处于焦虑状态, 觉得自己一事无成, 到现在都还没有决定好之后找工作的方向. 因为政策改革, 现在申请PGWP(加拿大留学生的开放式毕业工签)需要CLB7的语言成绩, 我打算在加拿大考出来, 等到毕业后先回国休息几个月, 进而在国内一边申请PGWP一边做两手准备, 国内和加拿大同时找工作.

我不清楚我这样的选择是否正确, 但学业压力真真切切的让我的身体和心理产生了一些情况------从我来这里读Master到现在还没回去过, 我认为回去可以有效的缓解身心问题, 顺便拔掉最后一颗烦人的阻生智齿.

生活

今年蒙特利尔的冬天格外的冷, 前两天的体感温度甚至达到了-49℃, 家里的供暖也是在全功率运行, 实在是太干了, 一个加湿器只能让湿度到20%, 于是: 家门口的雪自制加湿器

前些天去朋友家里聚餐, 本来说好我不做饭最后帮忙打扫卫生, 说着说着就炸了个小酥肉, 第一次做, 很美味, 之后会更新食谱, 等回去做给家人吃.

用了1年3个月的鼠标(ROG龙鳞Ace)中道崩殂了, 本来打算上网买微动修一下的, 但是这边4$4个的微动+25$的运费让我无福消受, 打算带回国再自己修, 于是购入了一个Razer Viper v3pro, 此外顺手测了一下自己的反应速度, 嗯, 我还很年轻.

最后是烧饼, 家里老人回国前手把手教我, 我纪录到了食谱中, 也是非常成功.

食谱url: https://lib.asyncx.top/02-diet/sesame-seed-cake

一些零碎的图片: 朋友们在我家吃潮汕牛肉火锅第二只小猫--黏黏光与影:33号远征队期末考前复习时, 学完出门的夕阳99成稀罕物,创2创1光盘完美煎三文鱼三文鱼again

博客更新

虽然一直没有更新blog, 但是因为要做饭要翻食谱, 还是经常打开Obsidian看笔记的, 跳转到博客后又发现了一些视觉问题, 于是:

  1. 新增了多张图片出现在一起的拼图(2025TODO圆满达成)
  2. 优化了TOC的获取逻辑和样式.

书影音游

++movie/56qwhB3eQxdzWP1kh6SZgo++

++movie/3kKxQBRSQcUI7ad7Y58fIM++

++movie/0mJVzyC1JCtgQzEyS4P99k++

++tv/0gxWeOgJIDF5qSEtTSc0Om++

++tv/4QwLGwPDmlU2QTJdN48z8A++

++tv/2C3YziJ5fZ9uy6dXtWFI9D++

++tv/78m0c31HHnzNTVSsFw6qnX++

++tv/2JZidKGEhSbEO9EFcQ1e6G++

++game/1BUuAewL1tD5JUZ50wCA3U++

++game/2KT0KJiapTFNIy3AWjbrrs++

++game/7Vj6wdeXgXfeJssjAoW9VI++

10月小结-行之有效

2025-10-31 05:10:00

前言

本月也是一如既往的忙碌, 算法课也是迎来了期中考, 得益于朋友发的往届真题, 让考试思路变得有迹可循. 其中有道复杂度为O(n)下进行轮询子数组之和比较的伪码题难倒了很多同学, 好在我做出来了, 但坏消息是其他的题没时间写.....应该能达到Average.....此外的另一门课, 由于期中考试发生在罢工期间, 幸运的取消了:).

为什么本文的标题为行之有效, 1是因为这次考试的复习历程让我觉得复习到了老师考试的关键点, 2则是因为本月也开始上法语班了, 但由于大学课程时间的问题我无法出席, 最后不得以协商进入waitlist, 不过这3周的课程也让我受益匪浅, 最快入门一个0基础知识的方法, 就是有人督促和解惑.

打架的鹿 得闲之余也和朋友们去了Omega Parc野生动物园(实际上算是鹿园), 园区游览是开车进行的, 大概3小时的车程, 期间有可以下车休息的区域. 游览完后感慨被骗了.

之所以说实际算是鹿园, 是因为到处都是鹿, 还拦路抢吃萝卜. 根据官网的宣传, 园中有各种各样的野生动物和鸟类, 但开车游览时候除了鹿, 牛等这些动物, 其余的动物都是被关在一片栅栏里的, 仅供游览, 无法互动.

树梢的乌鸦看镜头的牛

书影音游

++movie/4OE3wVlg1ujFfhIBTT9kxl++

++movie/6bCOihfoK7tVGElGl3HbqY++

++movie/5NAjaDqAgZeZ3ZzzPAkYEW++

++book/57CULf86zMrnoz5Ld7motM++

++game/3BiwZGaz35mNYnLkkc0SQv++

9月小结-什么都干了

2025-10-07 09:09:00

前言

这篇月小结拖更蛮久, 原因在于最近的生活实在是充实, 时值枫叶季, 去了一趟Mont-Tremblant,赏枫, 打算整理照片后在下个月度小结发布. 学期开学1月有余, 课业压力让我又想起了刚出国的日子... 本学期的高压课程是算法, 其次是计算机网络. 这2门课对我来说都是弱项.

算法课程细致入微, 课上课下学起来都颇费功夫. 计网截止到上周讲的还都接触过, 例如DNS解析之类的, 这周开始的可靠数据传输RDT还需要下一番功夫. 算法.......算法.......

消费主义

NAS/三星990pro 1T

第七期-一台NAS

在这里不得不重提一下, 一台NAS真的优化了我的很多场景, 文件夹同步/动下载影视/外网的照片访问等功能对我来说真的很有用, 缺点也有, 外网访问摄制的视频时遇到了速度不够的问题, 接下来打算琢磨一下把视频自动备份到google drive/dropbox方便访问.

之前因为罢工和找了不靠谱的第三方集运, 我从国内寄过来的衣物和键盘丢了, 迫不得已在小红书上收了一个键盘, 这个老哥最近又在出硬盘, 我就花了55$买入了一个1T的990pro.

ROG DELTA II(ROG 棱镜2)

这2年在家里用的最多的耳机是女朋友送的水月雨Aria2, 因为我使用时间过长, 遇到了金属网老化/耳机腔体严重掉漆的情况. 金属网联系售后是10块/5对, 但是腐蚀掉漆问题无能为力, 清掉腐蚀的地方后偶尔会有一点漏电. 看到Bestbuy的棱镜2打折, 就火速购入了. 耳罩式耳机的确对耳朵更友好, 但使用下来音质的确没有有线强, 不过强在有无线和有麦克风, 偶尔和国内外朋友打游戏, 剪视频看视频还是很舒服的.

不出意料的话就要出意外了, 这里讲一下在使用这个耳机的时候遇到的断连问题, 以方便有读者通过关键词搜索到此文:

  • 遇到的情况: 耳机每过几分钟就会遇到一次声音中断的问题, 并伴有应用卡顿和声音丢失的问题.
  • 怀疑的方向: USB3.0导致的2.4G接收干扰/声卡or蓝牙驱动异常/系统问题
  • 猜测问题发生点: 前段时间修改了系统注册表以修改电脑用户的名称, 有几个无法修改项, 当时没有在意, 在检查系统服务进程时候发现了管理无线设备数据传输的服务启动异常, 查看log发现每次重启就伴有卡顿, 于是确定问题为系统问题, 重装系统后解决.

书影音游

++tv/1e1nw4EEXVAwE0bSImEp9y++

++tv/5SFon8PVjPuAIIaKziZToO++

++movie/7haEvPPYBSLlekzDwj8m2i++

++book/6uMu8bCA886NcGxZVd9lAz++

++game/1EZcXj3398L8TKZ4ELPIkW++

++game/2vyzNrQ3s0lDx11arqfZm1++

鼠鼠看日落