跳转至

博客

看奥运会的各种姿势

作为第一次认真观看奥运比赛,觉得有必要记录下我的观看方法。

平台总结

所有平台

官方列出了各个国家观看奥运的平台:Where to watch Paris 2024 Olympic Games live (olympics.com)

以中国和日本为例:

  • TV 平台
    • 中国是 CCTV 5, CCTV 5+, CCTV 1, CCTV 16
    • 日本 NHK
  • 网络平台

各个平台大部分都推出了手机 APP 版本,功能更加丰富,比如咪咕视频支持分屏同时播放 4 条视频流,观看不同的解说。查看比赛项目等也非常方便。

不过我更习惯使用电脑观看,因此主要关注 Web 平台

点评

  • 咪咕视频
    • 优点
      • 多个视频流随时切换。包含平台嘉宾解说版本、央视版本、现场原始画面版本(无广告)、AI 字幕版本(为了听障人士)、各种网络 UP 解说版本(目的是直播带货,但是许昕的直播间分析还是很专业的)。
      • 页面布局还算合理,可以方便按照项目和时间找到直播的比赛。
      • 有弹幕,更有参与感
    • 缺点
      • 延迟高。以奥林匹克官网比分数据为基准,差了有 20-30 s。以乒乓球比赛为例,这个延迟可能相差 2-3 分
      • 1080p 需要会员才能看(但是好像登录就是 vip)
      • 1080p 很糊
  • 央视频 /央视网
    • 优点
      • CCTV 5 视频流比咪咕视频嘉宾解说版本延迟低 5-10 秒左右。
      • 央视解说比较亲切。咪咕视频解说看嘉宾水平,有的喜欢有的不喜欢。
      • 1080p 不需要会员,不需要登录
      • 央视频页面最精简
    • 缺点
      • CCTV 5 视频流,一场比赛一小局结束的 1-2 分钟会插入广告,会错过一些现场画面。
      • 1080p 同样很糊
  • NHK
    • 优点
      • 延迟相对于奥林匹克官网 < 10s 延迟。比 CCTV5 快了近 10 s
      • 1080p 免费,清晰度比国内高一档
      • 可以随时回放
      • 英语解说(主要是乒乓球的英语解说员太经典了,感觉一直是他。推荐同时打开国内解说和英语解说,不同的解说风格)
    • 缺点
      • 网页限制日本 IP 访问

VR 多人观影

VR 比较常见的一个功能便是拿来看看视频,巨大的屏幕以及可以切换的各种拟真场景,都可以带来非常高的沉浸感。而多人观影,则使得这个功能更近一步。在多人观影应用中,玩家可以创建虚拟房间,别人可以加入这个房间观看同一部电影。在虚拟场景中,玩家可以看到对面的虚拟形象做出的各种动作,也可以听到对面带有方位感的立体的声音,让人感觉对方仿佛就在眼前一样。

对我来说,VR 多人观影的最大优点可能是可以突破时间空间的限制,加强人与人之间的连接。毕竟现实中想要和好友特别是异地的好友一起看电影实在太难了,而在 VR 中却可以轻易做到。 我相信,这种加强人与人的链接,必然是 VR 未来发展的很重要的一个方向。(比如在 VRChat 中,玩家能做到的不仅是一起观影,还能一起玩游戏、一起逛图甚至一起陪伴睡觉。确实能瞥见一点元宇宙的影子)

回到正题,由于目前 VR 还处于一个开拓区,许多应用都没有完全明确的形态。针对 VR 多人观影,并没有非常成熟的应用,不同软件侧重的功能不同。以下是我对试过的一些方案的总结

现有方案总结

  • pico 视频多人观影
    • 播放内容
      • pico 视频内的资源
      • 各类支持 tv 投屏的应用。特别的,支持网盘(因此可以投用户下载的资源)
    • 优点
      • 有简易的 avatar
      • 支持若干场景切换:电影院、沙滩等
      • 投屏支持 4K,清晰度比较高
      • 没测:不知道是否支持字幕、音轨切换
      • 头戴端应用,不需要 PC
      • 支持 3d 视频
    • 缺点
      • 只能 DLNA 投屏少数白名单网站:B 站、爱奇艺(目前不支持,之后会支持),百度、阿里、夸克网盘等。并且官方没有将其公布在网上
      • 有内容审查(虽然也算不上缺点,但确实自由度没有那么高)
      • 需要网盘会员才有好体验:网盘投屏方式不充对应软件会员,基本只能 720p 投屏
  • vrchat
    • 播放内容
      • 视频直链(类似于http://something.com/video.mp4
      • 各种流媒体网站(如https://youtube.com/watch?v=VIDEOID,原理是使用 yt-dlp 工具解析出视频直链):包含 B 站、youtube、twitch直播等
    • 优点
      • 不只是看电影;无数的 avatar 和 无数的 world(场景)可以选择,在场景中可以有丰富的交互
      • 直链意味着可以自己使用服务器 host 想要分享的视频
      • 没有审查。默认有白名单机制,非白名单的域名默认不会播放,但是用户可以手动关闭白名单
    • 缺点
      • 观感不太清晰
        • vrchat 本身渲染分辨率的缘故,需要很高端的显卡才能提高分辨率
        • 播放器貌似本身也限制分辨率,只有 480p, 720p, 1080p 可选(感觉可能只是一个外观按钮,毕竟自己服务器 streaming 的内容,码率等都是服务端控制的,播放器端不应该会再转码一次)
      • 播放器不完善
        • 不支持外挂字幕,只支持将字幕烧录到视频中。(有项目支持了,但是我没成功)
        • 不支持切换音轨
        • p.s. VLC 播放器使用同样的 url 是均支持的,说明问题是可以解决的,所以未来可期
      • 目前没有 3d 的播放器,只能分享 2d 视频
  • bigscreen:一个专门用于多人观影的软件Steam 上的 Bigscreen Beta (steampowered.com)
    • 播放内容
      • 电脑屏幕
      • 电脑本地视频
      • youtube,twitch 等内容
    • 优点
      • 播放内容很开放,很容易播放自己下载的内容。甚至分享电脑屏幕
      • 场景很丰富:有付费场景和免费场景(其中一个教室场景观感很不错)
      • 支持 3d 视频
    • 缺点
      • 清晰度还是低了点,最高码率为 5m

其实从原理上,上面应用可以分为两类。

  • 一类是应用厂商提供串流服务器的。bigscreen 就属于这种,它的最大优势是用户可以分享自己的屏幕。过程其实是房主将自己的画面推流到 bigscreen 服务器,其它用户再从 bigscreen 获得画面。这本质上是一种直播。
  • 另一类就是像 pico 视频和 vrchat 这种不提供串流服务器的。它们本身不需要服务器存储视频,用户都是通过视频链接访问已有的视频网站,因此成本更低些。

理论上最方便最强大的肯定是 bigscreen 这种,但是由于串流服务器存储和带宽的高昂成本,免费用户必然会受到许多限制。

因此我觉得更实际的还是后面这种。其实对于观看大部分正规正版资源,pico 视频已经没什么问题。然而因为国内的审查政策,导致很多即使正规的内容国内平台不一定引进,引进了也可能删减。因此 vrchat 更加开放这一点还是不可缺少的。

方案介绍

最后经过研究,围绕 vrchat 确实有许多方案。最简单的,使用 twitch 直播电脑画面,当然同样会遇到码率限制等问题。所以最好的还是利用自己的上传带宽,因此可以在家宽上搭建一个 HLS 的服务器。绑定域名,提供给外网访问。可以使用 OBS 推流将电脑屏幕、视频播放器等画面推流到自己的 HLS 服务器上。

  • 优点
    • 能够播放自己下载的内容,不需要经过网盘
    • 基本不会存在视频兼容性问题,因为推流的是电脑画面
  • 缺点
    • 国内可能有法律问题?相当于在家宽上搭建直播服务器
    • 上传带宽受限(国内家宽目前上行普遍只有20-30M 水平),按照 2.5M 的码率,最多只能 10 人同时观看。想要 8M 码率,就只能 4 人观看了。
    • 没有 cdn 优化,不一定每个地方都有很好的播放体验

便携路由器

背景

很多时候,我们想要出门在外也能方便地连入我们的内网。我最近就遇到了到朋友那玩 VR 结果串流不成功的问题。虽然理论上我可以在那慢慢配置 wireguard 啥的,但是通常一下午并没有这么多时间让我折腾。所以就在想是否可以随身携带一个便携路由器,只需要插上网线,连上 wifi 就能快速接入我的内网呢?这便对路由器提出了一些需求:

  1. 最重要的,需要便携性,能放入书包里
  2. 能刷 openwrt 跑 wireguard
  3. wifi 6
  4. 最好是主线 openwrt
  5. 性能联发科 mt7981 以上

2)和4)主要是我设想的组网方案会用到 wireguard,而一些硬件主线还没有支持(比如 360t7 和 wr30u 都是 23 下半年才支持的,我买的时候还没有)。虽然有一些第三方的 openwrt 魔改版固件,比如 QWRT,XWRT 等等。但这些系统有一些我无法接受的点,比如使用闭源 wifi 驱动,这导致无法和主线的 openwrt 组 mesh 和 fast roaming 等。另外 wireguard 需要内核模块,如果第三方固件没有的话,也没法自己安装。

3)和 5)主要是因为 VR 串流对于带宽要求是比较高的,在一些高端硬件情况下,码率设置成 500 mbps 都是可行的。我的硬件一般 60 - 100 Mbps 就够了。由于 wg 需要加解密是需要吃较多 CPU 资源的,mt7981 能够跑到 350-400 Mbps 左右(见cyyself/wg-bench: WireGuard Benchmark using netns and iperf3 (github.com))。而经典的 mt7261 MIPS SoC 则只能跑到 100 Mbps 左右就明显不够用了。因此为了保障有较好体验,wifi 6 和 mt7981 我觉得是个基准线了。

最终实现的效果

  • 设备通过 wg0 接口连接入我的内网
  • (三层接入)连接 5G wifi SSID1,被分配一个本地局域网地址 192.168.1.x,然后通过 wg0 NAT 后上网
  • (二层接入)连接 5G 160MHz wifi SSID2,通过 vxlan 二层接入我的 op1 内网,获得 op1 的内网地址

最后的接口示例:

台式机升级-硬件篇

随着做种资源原来越多,原本 4T + 2T 的机械硬盘配置不够用了。即使已经做了很多缓解措施,比如将比较大的视频文件转成 av1 编码(4k h264可以达到30G -> 6G的效果),仍然是捉襟见肘。随着最近想要下载一些 VR 游戏资源,硬盘不够用了越来越明显,看来添加硬盘是必须做的了。

同时我也觉得现有的数据管理有点不安全。目前只对一些文档数据做了备份,然而一些虚拟机磁盘镜像,比如主力使用的 windows 虚拟机的磁盘镜像,由于数据量太大,只存了一份。这些都是单点故障点,一旦硬盘坏了,对我的影响是非常大的。

为了解决容量和安全性的问题,决定在台式机上添加一些机械硬盘组 raid10。

为什么是 raid10

有两个原因,一个是 raid 10 重建时更安全。不像 raid 5 重建时存在 URE 问题(指需要读取阵列全部的数据,数据量大,有很大概率遇到 URE 错误导致重建失败),raid 10 只需要读取一个 mirror 中另一块盘的数据,数据量很小。第二是 raid 10 远比其它 raid 灵活。raid 10 两块硬盘为 1 组,只需要保证两块硬盘容量相同即可。而其它 raid 均需要所有盘容量相同,这意味着我得一次性把所有的盘都买来,而一块 14T 的企业盘需要一千多,3-4 块一次购入显然成本太高。另外,raid 10 后续扩容也非常容易,插入即可扩容。而其它 raid 则需要重建整个阵列,非常费时。

这篇文章主要记录下硬件的升级点,以及人生第二次装机总结的一些经验

epilogue

经过 1 周的规划与实践,台式机终于升级完成。现在它真的成了一个 all in one 完全体了

  • AMD 5800x + 96 GB 内存,PVE 系统
  • 拥有 1G, 2.5G 双网卡,搭建了 openwrt 软路由
  • 拥有 zotac GTX 1063, 公版 GTX 1070 双显卡,分别直通给 linux 和 windows 两个虚拟机系统。
  • 插满 8 块机械硬盘,提供 6T + 8T (6 盘 zfs raid 10) 的存储空间

然而也有一些之前没有考虑到的:

  • 没想到换主板、机箱是一件非常费时费力的事情,从下午 3 点搞到了晚上 11 点。遇到问题有:清洗总共 9 把风扇太费时。插电开机没有一次点亮,差点以为主板翻车。进 BIOS 后系统还要修复引导,zfs 作为 root 分区不太熟悉等。
  • 功耗高了 70 w,从 130 w -> 200 w,从每日 3.3 度涨到 4.4 度。购买硬盘时没有考虑到硬盘的功耗,没想到硬盘功耗可以有 1 倍的差距(最低 4.4 w,最高 8.0 w)。当有 8 块硬盘时,总的差距就可以相差 20-30 w。
    • AMD PBO2 的降压功能非常重要,开与不开功耗相差可能 50 w

MTU 的那些坑

背景

背景:串流软件不支持手动添加 ip,导致需要二层隧道连接两个路由器。

通过 mDNS proxy 实现本地发现

之前还研究过这类软件一般是怎么发现server的。发现确实有一些方法可以实现跨网络的发现。比如常见的“发现”协议(不知道术语是什么)有mDNS和upnp。是通过ipv4 multicast实现的,所以只要能proxy多播包,就可以实现在两个网络互相发现。

2024/4/17 update: 今天在搜索 vxlan 时发现了一篇博客也遇到了这个问题。他的解决方案是通过设置 bridge-nf-call-iptables 使得桥接的数据包也通过 iptable,然后再通过 iptable 修正 MSS。因此其方案对于 UDP 仍然存在问题。不过将 bridge 的包进行三层的处理的思路是一样的。在 OpenWrt 设备间使用 VXLAN 创建隧道 – t123yh's Blog 看来这个问题并不是 gre 才会有的。那有没有更加现代的二层隧道协议,能够自动解决这个问题呢?

二层隧道方案

隧道方案如下图所示:

二层隧道拓扑图

  • 两个路由器间通过 WAN 口 IPv4 建立 GRE Tap 隧道
  • op1 上将直接将 tap 接口桥接到到原有 br-lan 上
  • op2 保留了原本自己的 lan,然后创建了一个新的 br-lan2,连接了 gre tap 接口和 eth2 接口。

op2 是 PVE Host 上一个容器

op2是PVE上的一个LXC容器,分配了eth0, eth1, eth2分别对应wan, lan1, lan2

  • op2 侧将一个无线路由器连接到 PVE host(软路由)一个网口,该网口位于 PVE vmbr2 下。op2 eth2 也连接到了 vmbr2。
  • 通过切换无线路由器连接到 PVE host 不同网口(对应 vmbr1 和 vmbr2),可以控制无线路由器位于 lan1 还是 lan2。

VLAN 切换 SSID 方案

刚开始想了一个更复杂不用改动AP网线的方案。将AP通过一根线和软路由连接,然后创建2个vlan。AP上,创建两个不同SSID绑定到不同VLAN接口上。这样就可以通过更改连接的WiFi来切换lan1和lan2了。不过PVE上vlan貌似配置有点复杂:可能需要创建一个vlan awareness的vmbr1,然后op2连接到vmbr1的eth1和eth2指定不同vlan id。但是我没想清楚vmbr1下untagged的接口怎么办?vmbr1设置了awareness后还能连接untagged的端口吗?因为不太了解PVE VLAN awareness bridge的更详细内容,加上路由器就在手边,换条线也很快,因此就没有使用该方案。

遇到的问题

实现上述方案后,确实让一开始的 VR 串流软件可以工作了,但是确遇到了一些意外的问题。

我发现我的手机平板都无法使用 moonlight 串流我位于 op1 下的台式机 KVM-win10 了。

  • moonlight 显示在线(这个需要开启 MSS clamping),但是一连接就报错。报错让检查 UDP 端口 478000 是否开放。
  • 笔记本同样连接的 WiFi,却确能够正常串流

以前也遇到这样能 ping 通,但是一发送数据就出问题的现象。问题一般是哪里的接口 MTU 设置不正确导致的,因此这次也是往 MTU 这方面排查问题。 加上之前遇到的 MSS 问题,于是这次相当于把我知道的都结合起来,看能否解决这个问题。

为设备分配静态 v6 基于 ndppd

背景

学校提供了 ipv6,我的许多服务都可以使用 v6 访问。但是学校提供的 PD 可能会变,虽然使用 ddns 可以将 v6 地址映射到固定的域名,但是 ddns 有延迟性。因此最好的解决办法仍然是给机器设置静态 ip。

p.s. 短期重启网卡 PD 不会变,但是如果长期离线再上线就可能变,类似于 dhcp。

宿舍的 v6 wan 口无法设置静态 ip,因为学校路由器要求设备必须发了 RS 才会路由该包。

信智楼则可以静态设置。当访问外网时,学校路由器不会检查源地址,会直接路由出去。等接收到回包时,学校路由器看到目的地址为设置的静态地址,会在广播域上发送 NS,我自己路由的 wan 口接收到 NS 后响应 NA(v6 版的 ARP 过程)。学校路由器便知道了我路由器 wan 口的 mac 地址,于是将包发送给我的路由器 wan 口。

虽然信智楼可以静态设置 v6,但是仅限于 wan 口。lan 下面的设备如果手动设置了静态 v6,是无法正常上网的。重复上过程会发现学校仍然会正常把包路由出去,但是收到回包后,会像之前一样发送 NS。而我们路由器的 wan 口接收到 NS 后,根本不会响应 NA(因为不是自己的 v6 地址)。LAN 和 WAN 又不是一个广播域,因此收不到 NS。从而导致学校路由器并不会把回包交给我们。

但其实上面的需求是可以实现的,我们需要一个叫做 NDP proxy 的软件。

docker

记录 docker 的使用,包含 docker 常用命令和 Dockerfile 的编写。目前已经成功使用 dockerfile 发布了第一个应用rzero/pal

hexo 迁移到 mkdoc

我比较喜欢 hexo 的 tags 字云的效果,不过由于以下原因,我打算迁移到新的静态博客框架 mkdocs material theme

  • hexo nodejs 的依赖实在是太麻烦了
  • hexo 展示的信息量太少了(也可能是我使用的模板的问题)
    • 我感觉这一点上 mkdoc 效果就很好,在大显示器上能够显示更多信息,查阅博客的效率更高

TODO

参考方案

p.s. 由于我使用的 markdown 编辑器的原因,才发现标准 MD 中 list 前面需要有一个空行。也就是迄今写的博客均踩了这个坑。。。而 mkdocs 不支持这个非标准行为,以后慢慢更正吧

NAS 无法扫描到涉及的网络知识

背景

tsj 的 NAS 插墙上网口,笔记本同样插墙上网口,然后使用 NAS 官方工具扫描不到设备。由于扫描不到设备所以不知道设备 ip,也就无法进一步配置。

那么是什么原因导致扫描不到呢,照理来说,NAS 和笔记本应该接在同一个交换机下,理应是互通的。在研究该问题过程中,查缺补漏了很多网络知识,特记录。

疑问一:学校为何插在相邻墙上的网口的机器分配到不同网段的 ip?比如 114.xxx 和 210.xxx 疑问二:宿舍路由器查看 wan 口邻居表,为何不同 ip 的 mac 地址是相同的?

openwrt x86 升级

我的台式机 pve 充当软路由功能,包含一个 openwrt LXC 容器。该容器使用了很长时间,配置了 wiregurad,以及复杂的防火墙和路由规则。但是在一开始创建 lxc 容器时,rootfs 选择了 x86/generic 版本。该版本实质上是 32 位的系统

Generic is for 32-bit-only hardware (either old hardware or some Atom processors), should be i686 Linux architecture, will work on Pentium 4 and later. Use this only if your hardware can't run the 64-bit version.

虽然不知道会对性能等有多大影响,但是对于有点完美主义的人来说还是无法接受。因此研究如何将其升级到 64 位版本。

本来以为应该是一件很简单的事情,但是阅读 openwrt wiki 后,发现并没有想象中的简单。并且也学习到了一些关于镜像、分区、文件系统的知识。特此记录。

再次理解 Cache 设计

涉及虚拟 cache 导致的同名和重名问题;重名问题 bank 和 L2 两种解决方法;进程切换时 TLB 的操作;什么时候需要显示地控制 cache 等。

捡垃圾-rk3399 DIY KVM

由于我的台式机承载了 NAS,做种,Jellyfin,博客,文件同步等功能,已然成为一台服务器,因此其可靠性非常重要。但是我还是经历过几次由于网络故障导致其无法访问的情形,此时则只能去实验室维护比较麻烦,因此需要一个 IPMI 的管理功能,使得网络出故障情况下也能远程访问。

而家用 PC 主板很少有支持 IPMI 功能的,支持的板子一般都要 2000 元以上。因此需要一个成本低廉的方案,在网上搜索一阵后发现确实有基于树莓派 DIY 的方案,并且有一个比较大的开源项目 PI-KVM。

然而由于树莓派 400-500 昂贵的价格,使得 DIY 的成本仍然很高。直到我看到使用普通 arm 板子的方案。甚至可以使用 40 元的电视盒子。因此价格完全可以保证在 200 元以内,我觉的是一个可以接受的方案。

最后成本

  • king3399 开发板:咸鱼 120
  • ms2130 USB 采集卡,支持 1080p 60 帧:淘宝 60

KVM-bios.jpg

具体数学

具体数学公式小册子

推广一个自己的 github 仓库,期望共同完善。 阅读具体数学电子书籍时,由于经常需要查看某个编号的公式因此产生了这个项目,用于阅读时查阅公式 https://github.com/TheRainstorm/concrete_math_formulas

成套方法

在具体数学 (Concrete Mathematics) 课本中,在解约瑟夫递推方程时,第一次介绍了成套方法 (repertoire method)。之后也使用这种方式求解各种递推方程。相信很多人第一次看到这种方法时都会感觉到不可思议——还能这样?虽然每一步都能看懂,但是就是不知道这种方法是怎么想到的。在查阅了一点资料后,我对该方法有了更多的认识。先说明一点,该方法并不是一种万能方法,实际上要求问题要有线性结构。

参考:linear algebra - Mathematical explanation for the Repertoire Method - Mathematics Stack Exchange

C&C++

  • C++ 语言新机制(如闭包,for_each)
  • C++ STL 使用
    • 容器
    • 算法库
  • 常见算法记录

CUDA 架构

疑问

  • ampere 架构 SM 中有 4 个 process block,process block 对应一个 warp?意思是可以有 4 个 warp 同时执行?
    • Femi 架构没有 process block,SM 就是最小单元?
  • The threads of a thread block execute concurrently on one multiprocessor, and multiple thread blocks can execute concurrently on one multiprocessor.
    • 这样岂不是若干 thread block 抢一个 SM 上的 shared memory?
    • 不同 threadblock 的 warp 并发执行,如何隐藏延迟
  • cuda 分块大小对性能影响很大,那么如何确定分块大小呢?
    • 穷举
    • 分析模型?

记一次 linux 系统无法启动修复过程

背景

我想要把第二张显卡也直通给虚拟机,然后就自己编译了一个打了 acs overide patch 的内核。之后启动也没有问题。但是当我第一次运行虚拟机后,电脑就卡死了。然后我强制关机后,无法进入系统,而进入了 busybox initramfs 交互命令行。提示文件系统错误,让我 fsck 系统盘。我照做后就成功进入系统了。

  • 这里进入系统后一切正常,但是 lxc 的 storage 显示 unavailable,zpool import zfs_lxd.img 显示损坏。

然后我想再试试,结果启动虚拟机后又卡死了。我强制重启后,好像又进入 busybox 进行 fsck 了,但结果还是进不了系统,这次进入了紧急模式。

hexo 使用

记录 hexo 相关内容

tag:关键词 categories:

  • 软件工具:介绍新发现的好用工具
  • 折腾:做的一件事
  • 网络:路由器,openwrt,软路由