macOS部署Comfy UI

安装Python

brew install python

安装PyTorch

pip install torch torchvision torchaudio
// or
python3 -m pip install torch torchvision torchaudio

克隆Comfy UI仓库

git clone https://github.com/comfyanonymous/ComfyUI
cd ComfyUI

安装依赖

pip install -r requirements.txt

运行Comfy UI

python main.py
// or
python3 main.py

下载模型

liblibhuggingface下载模型后,放在Comfy UI仓库 models/checkpoints 目录下,即可选择模型,运行工作流出图。

离开页面时调接口

场景:当前页面正在执行异步任务,当用户点击导航栏或直接关闭页面时,需调接口取消任务,减少资源浪费。

问题:如果在beforeunload事件中调ajax 请求,则会出现浏览器cancel掉请求的情况。

解决:使用sendBeacon方法,适用于发送少量数据到服务器。

Navigator.sendBeacon()

这个方法主要用于满足统计和诊断代码的需要,这些代码通常尝试在卸载(unload)文档之前向 Web 服务器发送数据。过早的发送数据可能导致错过收集数据的机会。然而,对于开发者来说保证在文档卸载期间发送数据一直是一个困难。因为用户代理通常会忽略在 unload 事件处理器中产生的异步 XMLHttpRequest

Vue 3代码如下

<script setup>
import { onBeforeUnmount, onMounted } from 'vue';

// 取消任务的API函数
function cancelTask() {
  navigator.sendBeacon('/api/cancel-task', JSON.stringify({ task: 'taskId' }));
}

onMounted(() => {
  // 添加 beforeunload 事件监听器
  window.addEventListener('beforeunload', cancelTask);
});

onBeforeUnmount(() => {
  // 组件卸载前移除监听器
  window.removeEventListener('beforeunload', cancelTask);
});
</script>

domain 的自言自语 2404

云原生

Deep dive into Linux Networking and Docker — Bridge, vETH and IPTables | by Farhan Ali Khan | techlog | Medium

开发

十分钟弄懂 k8s Operator 应用的制作流程 – 知乎 (zhihu.com)

Redis——由分布式锁造成的重大事故 – 掘金 (juejin.cn)

记一次因@Async引发的程序bug (qq.com)

仰望大佬

网络

STUN (RFC 3489) vs. STUN (RFC 5389/5780) | NETMANIAS

[译] NAT 穿透是如何工作的:技术原理及企业级实践(Tailscale, 2020) (arthurchiao.art)

吃瓜

【腾讯】云计算史诗级二翻车来了 (qq.com)

对于用户的补偿,也非常迷,即使我拿出带有 RequestId 的截图,客服也认为不受影响,不进行赔付。

A person who creates cute, high-quality logos related to IT such as ‘Bluesky’, ‘Python’, ‘Vim’, ‘404’, and ‘Nurupo’ appears, and the Bluesky and React official sites immediately implement the logos, causing an explosive excitement. – GIGAZINE

domain 的自言自语 2403

开发

Innodb中的事务隔离级别和锁的关系 – 美团技术团队 (meituan.com)

全网都在说一个错误的结论 (qq.com)

X 上的 Alex Xu:“Why is 𝐑𝐞𝐝𝐢𝐬 so 𝐟𝐚𝐬𝐭? There are 3 main reasons: 1. Redis is a RAM-based data store. RAM access is at least 1000 times faster than random disk access. 2. Redis leverages IO multiplexing and single-threaded execution loop for execution efficiency. https://t.co/U1KX1GXFRt” / X (twitter.com)

k8s 还会丢事件?- 1 (qq.com)

网络

Tailscale 的 TLS 证书过期,网站挂了 90 分钟! (qq.com)

尽管 Tailscale 因 TLS 证书过期导致了90分钟的服务中断,但这恰恰凸显了它的一大优势——多数用户几乎没有受到影响。Tailscale 的分布式架构使得用户端的连接不依赖于中心节点始终在线。这种弹性设计是 Tailscale 区别于传统 VPN 的关键所在。短暂的中心服务中断并不能否定 Tailscale 的价值,反而凸显了其良好的容错性。

事实上我也希望未来的智能家居能做成这样,不要云端宕机,家居也瘫痪。

RFC4193 IPv6 Generator (cd34.com)

[ RouterOS 折腾手记 ] 9.RouterOS配置IPv6 – 哔哩哔哩 (bilibili.com)

如果你的 PPPoE 宽带访问部分因特网服务异常或缓慢 – V2EX

请检查 PPPoE 接口的 IPv6 TCP MSS adjust 是否正确。
对于 MTU 1492, IPv6 的 TCP MSS 应为 1432.

对于 RouterOS, PPP profile 中的 change-tcp-mss=yes 可能不会对 IPv6 正确生效。
对于 RouterOS, 可以使用如下命令对 IPv6 的 TCP MSS 做正确的 adjust.
/ipv6 firewall mangle add out-interface=pppoe-out1 protocol=tcp tcp-flags=syn action=change-mss new-mss=1432 chain=forward tcp-mss=1433-65535

最好是在防火墙 mangle 表中对出网流量进行 MSS 钳制。这里作者提到,虽然邻居发现里面可以指定 MTU,但是会影响到内网设备(例如巨帧)。

RA 中宣告的 MTU 应当是 link / 三层口的 MTU, 而不是路由器所有接口 MTU 中最小的那个。直接向下联口宣告最保守的小 MTU 是对 IPv6 相关协议设计的错误理解和 RFC 的错误实现,不然如果我要用 ULA 地址跨三层访问内网 PMTU 9000 的 CIFS 存储,也用 1492 的 MTU 这显然不合理。

按 RFC, 针对中间路径 MTU 比源端小这个场景,应当依靠 PMTUD. 但是现网中大量对 RFC 的错误实现和比相关 RFC 更早出现的屎山,导致了 PMTUD 的可用性与可靠性问题。(其实这就是 ICMP 中 C 的用例之一,但是很多网络工程师乃至所谓架构师只看到了其中的 echo (ping))

没有 IP 路由器高兴在数据面参与 TCP 的事情( IPv6 路由器不参与 fragment 也是对这一“IP 路由尽可能纯粹化”的思想的推广和贯彻),TCP MSS adjust/clamp 的施加是作为 PMTUD 失效时的兜底,IPv4 尚有中间路由器帮忙 fragment 作为兜底,IPv6 的中间路由器就只能通过帮忙 adjust/clamp 照顾 TCP 了。

Automatically re-resolve DNS in Wireguard – Installing and Using OpenWrt / Network and Wireless Configuration – OpenWrt Forum
WireGuard 仅在启动时会解析 Peer Endpoint 域名,如果 IP 变化并且 DDNS 记录刷新后,已启动的接口不会自动刷新 IP 变化的 Peer Endpoint。在 Linux 上 wireguard-tools 提供了 reresolve-dns.sh 脚本来帮助解决这个问题,它会解析 DNS 并使用 wg 命令更新变化的 Endpoint。我们可以定时运行这个脚本,具体可以参考 WireGuard – ArchWiki (archlinux.org)。在 OpenWRT 上,则可以使用 /usr/bin/wireguard_watchdog 脚本,其检测不活动的 Peer 并进行刷新,具体参见 [OpenWrt Wiki] WireGuard extras

安全

liblzma / xz 被植入后门,Jia Tan 是何方神圣 (qq.com)

xz-utils后门漏洞 CVE-2024-3094 分析 (qq.com)

SSL 证书 关于免费 SSL 证书策略调整通知-产品公告-文档中心-腾讯云 (tencent.com)
鹅厂的免费证书也调整成 3 个月有效了。

威联通NAS出现严重安全问题 建议立即断网 (qq.com)

Linux

zypper yzpper question. – English / Applications – openSUSE Forums

Effective Null Pointer Check Elimination Utilizing Hardware Trap

香橙派诚意之作 — 香橙派5 Pro (qq.com)

移动端

https://lineageos.org/Sunsetting-LineageOS-18.1/

仰望大佬

一间木屋 – 家居 – Chiphell – 分享与交流用户体验

使用 FFmpeg 将内嵌字幕文件渲染到视频上

最近有需要在即时通讯软件上传输视频文件,但是多数聊天软件在预览视频时,通常都不支持加载内嵌的字幕文件。考虑到要发给非技术型用户,能让对方直接在移动端预览,而不是跳转使用外部播放器会更方便一下。

一番搜索下来发现官方文档里给出了这种场景下的案例:

ffmpeg -i input.mkv -filter_complex "[0:v][0:s]overlay[v]" -map "[v]" -map 0:a <output options> output.mkv

这里稍加修改,然后加上硬件编解码来加速重编码:

.\ffmpeg-6.1.1-full_build-shared\bin\ffmpeg.exe -hwaccel cuda -i <input-video-path> -filter_complex "[0:v][0:s]overlay[v]" -map "[v]" -map 0:a -c:v hevc_nvenc -preset slow -profile:v main10 -pix_fmt p010le <output-video-path>

引用

HowToBurnSubtitlesIntoVideo – FFmpeg

cuda – Understanding pixel format and profile when encoding 10-bit video in ffmpeg with nvenc – Super User

video – How to use GPU to accelerate the processing speed of ffmpeg filter? – Stack Overflow

Filter complex through CUDA hevc_cuvid with FFMPEG input 4k hevc, help needed – Graphics / Linux / Linux – NVIDIA Developer Forums

GPU-accelerated video processing with ffmpeg – Stack Overflow

audio – FFmpeg error when using –filter-complex with nvenc codec “Filter amerge has an unconnected output” – Super User

openSUSE Leap 下编译安装 Python 所需依赖

使用 pyenv 编译安装 Python 时报错,文档中看起来没有 openSUSE 下的依赖安装指引,而且 Zypper 里也没有等价于 build-dep 的子命令,只好自己安装了。

必选的依赖:

sudo zypper in libopenssl-devel

可选的:

sudo zypper in libbz2-devel libffi-devel readline-devel sqlite3-devel tk-devel xz-devel

如果安装 lzma-devel 会自动转为 xz-devel,具体见引用中的回答。

引用

Setup and building (python.org)

Issue: Installing R on openSUSE Leap 15.0: “liblzma library and headers are required” – Stack Overflow

domain 的自言自语 2402

开发

再有人问你如何实现订单到期关闭,就把这篇文章发给他! (qq.com)

分布式事务,这一篇就够了 | 小米信息部技术团队 (xiaomi-info.github.io)

网络

Windows 11 Insider Preview 26063.1 (24H2) 支持MLO,但 (qq.com)

异数OS 2017 DPDK 峰会观后感-CSDN博客
作者在yds_086 – 博客园 (cnblogs.com)

cloudflare/pingora: A library for building fast, reliable and evolvable network services. (github.com)

如何構建 Pingora 以將 Cloudflare 連線至網際網路代理

Inside NGINX: Designed for Performance & Scalability

家庭影院入门 第3集 困难难度【考拉上校】_哔哩哔哩_bilibili

移动端

介绍 | 存储空间隔离 (rikka.app)

domain 的自言自语 2401

云原生

Kubernetes 基础教程 | 云原生资料库 (jimmysong.io)

序言 · Kubernetes 中文指南——云原生应用架构实战手册 (jimmysong.io)

CKA

CKA.md (github.com)

CKA考试经验总结 – 简书 (jianshu.com)

【助力CKA全球认证】奔走相告!kubernetes管理员实训课火热开启!!!_云容器_华为云论坛 (huaweicloud.com)

华为 kubernetes管理员实训课_哔哩哔哩_bilibili

K8S其实很简单-CKA/CKAD报名和考试技巧 (qq.com)

2023年CKA考试真题及注意事项 – jiayou111 – 博客园 (cnblogs.com)

K8S CKA认证考试经验分享 – 掘金 (juejin.cn)

自考CKA体验总结 – 掘金 (juejin.cn)

【從題目中學習k8s】-【後記】CKA證照 – iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天 (ithome.com.tw)

CKA考题解析-CSDN博客

K8S认证工程师(CKA)考试必过指南 – 知乎 (zhihu.com)

CKAD

yuyicai/cka-ckad-exam-experience: cka and ckad exam experience,cak和ckad考试经验 (github.com)

dgkanatsios/CKAD-exercises: A set of exercises to prepare for Certified Kubernetes Application Developer exam by Cloud Native Computing Foundation (github.com)

CKAD 1. Core Concepts (13%)考题答案_ckad考试内容-CSDN博客

CKS

CKS考试学习笔记 by 2022.12-2023.01 – huss – 博客园 (cnblogs.com)

CKS真题分析-2023年度_cks考题-CSDN博客

Linux

Linux Signal及Golang中的信号处理 (colobu.com)

Graceful restart in Golang – Gregory Trubetskoy (grisha.org)

算法

【数据结构与算法】蓄水池抽样算法(Reservoir Sampling) – gonghr – 博客园 (cnblogs.com)

酷比魔方 iPlay 50 Pro 刷机,安装 Magisk 获取 Root 权限,以及修复串号的经历

最近刷张大妈的时候,看到酷比魔方的平板卖得还挺便宜的,而且还有卖老人关怀软件,可以在微信小程序上面进行一些远程操作。具体功能官方放了个视频:酷比魔方老人关怀系统,加入更多实用功能,你绝对想不到_哔哩哔哩_bilibili。考虑到长期在外面打工,于是乎决定买一个给家里长辈用用,平时还可以微信视频什么的。

到手之后发现系统是刚适配不久的安卓 13,似乎厂家还没有测试好,非常多奇奇怪怪的小问题。而且国内版本的系统没有底部的三大金刚键,只能用手势操作,感觉很难教会老人;国际版本的系统是虚拟按键,但是客服说不支持使用老人关怀守护软件,只能放弃。基于上述原因,只好刷机降级到安卓 12,为了虚拟按钮和让平板更稳定一些。

刷入官方安卓 12

我们可以在官网 iPlay50Pro(T1030M)-Android12-20230815-固件及刷机教程 – 酷比魔方官网 (51cube.com) 找到刷机包和文档,按照压缩包内文档,安装驱动,然后关机刷入固件即可。

这个线刷通常都比较顺利,官方给的文档也比较详细,这里就不展开了。不过要注意的是,除非有特殊需要,不然不要选择 Format All + Download。这个选项会清除串号 SN 和 WLAN MAC 地址,由于我不小心选到这个选项,这就有了后面重新写 SN 的经历。😅

安装 Magisk 获取 Root 权限

由于需要保活远程协助应用和进行其它一些骚操作,所以需要获取 Root 权限。安装 Magisk 以获取 Root 权限的过程,参考 Installation | Magisk (topjohnwu.github.io) 即可。对于酷比魔方这台机器来说,需要先解锁 Bootloader,然后 Patch 一下 boot.img 再刷入。

解锁 BL

首先获取 adb 用来解锁,本人不从事安卓程序开发,所以就不下载完整的 Android Studio 了,从 SDK 平台工具版本说明  |  Android Studio  |  Android Developers 这里获取单独的工具即可。

然后在平板上反复点按关于平板中的版本号来打开开发者模式,并启用其中的 USB 调试。完成设定后即可将平板连接到电脑上。电脑上执行 .\adb.exe devices 后,平板会弹窗询问调试授权,此时点按同意即可。

随后执行 .\adb.exe reboot bootloader 重启到 Bootloader,成功后再执行 .\fastboot.exe flashing unlock 进行解锁,此时平板上会刷出几行字询问是否解锁,要按音量下键确认解锁,重启平板后其将会自动恢复出厂设置。

Patch 并刷入 boot.img

在平板上面安装最新的 Magisk,并从上文中用过的官方刷机包里找到 boot.img 并传到平板上面,然后在 Magisk 界面中进行 Patch。

Patch 完成后,我们将生成的新 boot.img 传到电脑上。还是执行 .\adb.exe reboot bootloader 重启到 Bootloader,进入 Bootloader 后执行 .\fastboot.exe flash boot .\magisk_patched-26400_bQzZo.img 刷入,成功后即可重启,最后在 Magisk 应用中检查成效。

刷写串号(SN)

刷完机之后,可以从 iPlay50 Pro 老人关怀系统软件(安卓13) – 酷比魔方官网 (51cube.com) 安装关怀系统。然后我就发现了一件非常糟糕的事情,由于前面线刷的时候点到了 Format All,平板的串号和 WLAN MAC 地址都被清掉了,没有串号就没法激活花了 100 块钱买的这个关怀系统。可以在电脑上执行 .\adb.exe shell 打开一个平板的终端,然后通过 getprop ro.serialno 来确认串号是否丢失,或者直接使用 getprop 命令再进行过滤。

由于这个平板是 MTK 方案的设备,而且前面用到的官方刷机包里给了 AP Database,那么应该还是可以用 MTK SN Write Tool 写回去的。在关于X的救砖 – 酷比魔方官网 (51cube.com) 这个帖子里,管理员亦确认了修复的可行性。

我们从 Download SN Write Tool (all versions) – Mediatek IMEI Tool (androidmtk.com) 获取到 SN Writer,当前最新版本在 Windows 11 上运行缺少动态链接库,提示缺少 mfc100.dll,安装后还是报错。为了更快解决主要问题,这里用的是 v1.1924 的版本,内含 mfc90.dll 不会有这种问题。

启动 SN Writer 之前,需要先修改配置文件 SN_Setup.ini 中的 Enable Serial No 以允许烧写串号。如下图所示。

此时应该已经可以在设置中看到烧写串号选项了。

还需要在固件包中找到 MDDB 和 APDB。

在配置中选中它们。

点按 Save 保存,然后点按 Start 烧写包装盒上的串号即可。

将普通 App 转为系统 App

这里听同学的建议,本来是想写个 Magisk 模块,然后把 apk 直接挂进 /system/priv-app 和 /system/app 下面的。但是这样其实缺少权限等文件,部分 apk 直接挂进 /system/priv-app 之后平板直接启动不了了。后面发现其实可以直接用现成的模块转换已安装的应用,这里直接放文章,就不赘述了。

聊聊关怀系统OS

仅仅是一些个人观点,随时间推移,状况可能发生变化。

这个系统,更准确地说是一个有较高权限的软件,可以自行从官网上下载安装。划线价 200 元 5 年,现在是 100 元 5 年。价格不贵,但槽点也挺多,还不是非常完善,总感觉这个项目的产品经理像是微信相框一类的业务过来的。

激活并绑定后,在微信小程序上可以操作声音、亮度等设定还是不错的。这些东西看起来没有知名的竞品厂商在做,以往要实现这些东西还得上远控软件。

然而,小问题也不少。首先,首页几乎不可定制,只能固定若干个应用在快捷应用卡片上,而且这些应用的范围也比较迷。系统应用是没法固定到首页的,这也就意味着打电话等操作是要移动到第二屏的,我很难确认是否能教会 80 多岁的老人这么操作。这个电话里面的通讯录可以在小程序上面下发,但是下发之后是跟外面的通讯录不同步的,这就有点难受了。

其次,第二屏的应用没法整理。对于部分预装应用来说,长按会提示移入“日常应用”,确定的话,实际上是移入“更多应用”里面;对于用户安装的应用,甚至包括预装的应用宝、输入法,长按虽然是提示移入“日常应用”,但是一确认就直接没了,原来的桌面直接崩溃了,在哪里都找不到。只能在小程序里面找到隐藏的应用恢复出来,不论是预装的安卓 13 还是后面我自己刷的安卓 12 均是如此,难以想象 QA 是怎么放过这些常见用例的。

还有,刚到手的时候,我点一下关怀系统里的一键加速,过了一小会儿平板竟然自己触发了紧急呼叫,多次尝试均是如此。这些奇奇怪怪的现象让人很难对这个产品有足够的信心。😥

总之,在我看来这个平板从定位、价格、做工和特色功能等方面来看都是算这个档次里面比较有竞争力的,但是这个价位的产品各种小毛病是真的不少,还需要等待厂商慢慢打磨了。

引用

[MODULE][Terminal] App Systemizer v17.3.1 | XDA Forums

[MODULE] App Systemizer for Magisk v9-v14 — DEPRECATED | XDA Forums

How do I systemize apps on Android 11 with root access? : r/AndroidQuestions (reddit.com)

Magisk-Modules-Repo/terminal_systemizer: terminal_systemizer (github.com)

stangri/AppSystemizer: AppSystemizer (github.com)

【iPlay20】国际版/解锁/救砖/Magisk/Xposed – 第 2 页 – 酷比魔方官网 (51cube.com)

获取android SN码 安卓sn码_mob6454cc634aa4的技术博客_51CTO博客

[2021.04.13]给联发科(MediaTek)平台设备写入串号(IMEI)、MAC地址等设备标识信息 – Hiiragiの咖啡厅 (hiirachan.moe)

Developer Guides | Magisk (topjohnwu.github.io)

开发者指南 | Magisk (e7kmbb.github.io)

Magisk 刷入方法及模块推荐 – Ojhdt’s Blog

Android 11 刷入 Magisk 模块后无法开机的解决方法 – 搞机男 (gaojinan.com)

刷了 Magisk 之后装什么?我推荐这 20+ 个模块 – 少数派 (sspai.com)

使用 Docker Registry 自托管一个缓存镜像源

部署

由于是在一个 1C1G 的机器上部署,就不用 K3s 了,直接用 Docker Compose 拉起一个实例。官方文档有提供 docker-compose.yml,这里也给出一份示例:

version: '3'

services:
  registry-docker:
    image: registry:2
    restart: unless-stopped
    environment:
      REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io
      REGISTRY_PROXY_USERNAME: username
      REGISTRY_PROXY_PASSWORD: dckr_pat_value
      # REGISTRY_AUTH: htpasswd
      # REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      # REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    ports:
      - 127.0.0.1:50000:5000
    volumes:
      - ./data/auth:/auth
      - ./data/docker:/var/lib/registry

这里的账密可以提高拉取限频,但是根据官方文档,使用镜像的用户就可以读到该账号下的私有镜像了,最好是一个独立的账号。

服务拉起来之后,Nginx 反代一下就可以使用了。

拉取

有两种方式可以使用,首先是最普遍且最优的做法,在 /etc/docker/daemon.json 中加入 registry-mirrors 选项。例如:

{
  "registry-mirrors": [
    "https://<docker-registry-host>"
  ]
}

然后重启 Docker Engine 即可。

不过此种方式不支持 HTTP Basic 身份验证,这也就意味着无法通过事先 docker login 的方式来拉取私有的镜像源。目前各镜像站通常的做法是使用泛域名,在域名中提供唯一身份信息,显然这种方式并不安全,只是对当下现状的妥协。

这种情况应该在下一个版本的 Docker 中应该可以得到解决,在即将发布的 24.08/25.0 版本中,我们可以在 [24.0 backport] registry: allow mirror path prefix in config by thaJeztah · Pull Request #46944 · moby/moby (github.com) 中看到,可以支持填带路径的镜像源了,这就意味着可以在路径上实现类似的认证,因为 HTTPS 中路径是受保护的,这样的话就不会有问题了。

另一种方式是手动拉取,这需要以 docker pull <docker-registry-host>/library/nginx:stable 的格式进行拉取。这种方式支持 HTTP Basic 认证。

认证

Docker Registry 上支持认证,可以参照上面的 docker-compose.yml 处理;也可以在反代上面认证,其官方文档给出了 Apache/Nginx 上面的配置示例,具体请参考 Authenticate proxy with nginx | CNCF Distribution

引用

Registry as a pull through cache | Docker Docs

Docker daemon won’t start if a registry-mirror is configured in /etc/docker/daemon.json · Issue #36598 · moby/moby (github.com)

registry: allow mirror path prefix in config · thaJeztah/docker@3d8f7d0 (github.com)

Pull-through cache is not working for private registry: Challenge established with upstream · Issue #3081 · distribution/distribution (github.com)

Implement Basic authentication to upstream registry in proxy mode by ArthurMelin · Pull Request #3256 · distribution/distribution (github.com)

Private Docker registry in pull through cache mode return “invalid authorization credential” – Stack Overflow

Private docker registry behind a subpath : r/docker (reddit.com)

Private Docker registry in pull through cache mode return “invalid authorization credential” – Stack Overflow