与苦难共存,与希望共生

可能并不存在颠簸不破的传统。早在五年前,老家的除夕夜还得在持续不断、直至破晓的爆竹声中度过,但在政府的“大力倡导”下,短短几年间,这一延续了上千年的古老传统,便已经烟消云散了。而此时的我,就在这寂静的除夕夜里,独自回忆业已过去的2021,带着一如往常的“辞旧迎新”的仪式感。 过去的一年,我与世界都活在新冠疫情的余波中,逐渐放弃了“战胜”疫情的幻想,转而思考如何与病毒共生共存。4月中旬 ,我结束了漂泊于深圳、重庆和南京三点之间的律所实习,并在急性中耳炎的痛苦中享受了一个月的闲暇时光。6月的毕业季随风而逝,而我又辗转来到杭州,正式开启了职场社畜的生涯。 作为一个处处与北上广对标的“新一线”城市,杭州早已失去了昔日的中古风情,转而成为一个充斥着铜臭味的暴发户聚集地,在高歌猛进的基建开发与乌烟瘴气的互联网风潮中寻找着自己的方向。在这样一种“淘金热”似的奇特氛围中,就连那些“中”字头的所谓央企,也不得不开始鼓吹“创业精神”。 我向来不喜欢这样的风气,因为一切看似蓬勃发展的景象背后,都是对个体身心的极致剥削,何况高楼之下,衰败的基础早已奠定。对于像我这样初尝过开放与自由滋味的90年代人来说,文明的衰退是肉眼可见的。而与文明衰退相伴而生的,则是深深的不适与悲观。 好在不景气的大背景下总会存在个体的逆势好转。2021年,我终于在父母的帮助下买到了人生的第一套房,并努力用自己的劳动所得支付了装修费用。在不久的将来,我也将与张老师步入婚姻殿堂,努力承担起家庭责任。这可能是在普遍猥琐的大时代里,所谓“天生骄傲”者的最后一丝倔强的念想,即“通过干干净净地挣钱,让人相信干干净净地挣钱是可能的”,尽管当初说这句话的人,现在成了抖音带货主播前三。 我始终相信,对于人类而言,受苦是必修课、幸福是选修课,这就是为什么我会对他人遭受的人生无常缺乏同情,因为从广义来讲,每个人都苟活在无常之中。但我同时又相信,人是可以通过后天努力,将无常之外的苦难消灭殆尽,例如通过个体的团结与努力,排除体制的恶,让暴力与特权无处容身,在无常的世界里创造有限的公平。 壬寅年伊始,冬天确实已经过去,春风也确实即将吹拂。纵然2021充满转机,但请不要忘记这片土地上正在发生的种种苦难,不要忘记那一度令人愤怒、令人愤懑、令人作呕的罪恶与不公。我还是我,还带着是非观、带着常识与敬畏心过着自己的人生,只是因为无处不在的权力倾轧,大声疾呼变成了阴阳怪气。但愿只要荧光不散,世界就还有救。

2022-02-01 · Mason

利用 Portainer 实现 Docker 端 Jellyfin 硬件解码

原理及环境检测 随着版本的不断迭代,Jellyfin 已经逐渐超过 Plex 和自家兄弟 Emby ,成为用户数量最所的个人媒体管理方案,这不仅因为它的所有功能均为免费,更是因为它的源代码完全开源,具有极高的维护与拓展空间。 不论用于运行 Jellyfin 的具体是哪款操作系统,只要该系统是基于 Linux,我们就可以通过 Docker 容器来实现极为简单且方式一致的部署。但相比于原生套件,Docker 有一个显而易见的缺点,即无法直接调用各类系统资源,核显驱动就是其中之一。 要让 Jellyfin 的 Docker 容器实时调用核显驱动(也就是人们常说的开启硬解),要满足两个条件: 拥有支持视频解码的核心显卡,且核心显卡的驱动程序运行正常; 将核显驱动直通给 Docker 容器,并赋予 Docker 容器调用该驱动的权限。 对于系统是否满足上述第一个条件,可以通过以下方式进行检验:首先用 ssh 工具连接到服务器,确保登陆 ssh 的账户拥有系统管理权限,再输入以下命令: ls /dev/dri 如果返回的结果为 card0 renderD128 ,那么恭喜,核显驱动运行正常,硬件系统满足视频解码的基本条件。接下来便是将 renderD128 这个核显驱动直通给 Docker 容器的方法。 为什么必须用 Portainer? 无论是群辉、威联通还是 Unraid ,市场上绝大多数 NAS 系统都提供了图形化的 Docker 容器管理工具。但无论上述哪一个,都不支持核显驱动的直通功能。群辉的 Docker 套件无法编辑容器的系统资源参数,威联通的 Container Station 干脆无法编辑已经创建好的容器。 这里所说的“直通”,其实是将 /dev/dri/renderD128 这个驱动文件映射到 Docker 容器的相同位置。这一点利用命令行可以非常轻松地实现,即在 Jellyfin 容器的拉取命令中加入下列参数: --device=/dev/dri/renderD128 \ 因此,要快速拉取并创建一个开启硬件解码的 Jellyfin 容器,只要在 NAS 的命令行界面输入以下命令即可: sudo docker run -d --name jellyfin \ -v /share/Container/Jellyfin/config:/config \ #冒号左边为存放配置文件的目录 -v /share/Container/Jellyfin/cache:/cache \ #冒号左边为存放媒体缓存的目录 -v /share/Media/:/media \ #冒号左边为存放电影文件的目录 -p 8096:8096 \ #web界面访问端口(http) -p 8920:8920 \ #web界面访问端口(https) --device=/dev/dri/renderD128 \ #映射核显驱动 --restart=always \ #重启策略 jellyfin/jellyfin 但对许多轻度用户来说,命令行不仅不便理解,也断绝了后续对容器进行修改和自定义的空间。因此对于绝大多数日常用户来说,我个人强烈推荐使用 Portainer 。它本身也是一个运行在 Docker 容器里的程序,但它拥有强大的 Docker 管理功能,是目前市面上功能最完善的网页端 Docker 容器管理界面。 ...

2021-09-09 · Mason

利用 Favicon 为 Hugo 静态站点添加图标

我们在使用 Hugo 生成静态站点时,经常会遇到一些虽不致命,但很不爽的小问题,例如没有自定义站点图标的问题。假如我们跟随了所用主题的默认配置,通常情况下生成的站点要么没有图标,要么直接套用主题自带的图标,这显然无法满足我那强烈的 DIY 欲望。 经常访问本博客的读者可能会注意到,我所使用的 Hugo 主题是一个支持自动切换明暗模式的第三方主题——AutoFuji . 今天在阅读这个主题的说明文档时,我发现原来它是支持 Favicon 图标代码的。于是经过一通简单的操作,我的博客终于有了自己的图标。 为 Hugo 站点添加 Favicon 代码的方法非常简单。首先访问这个网站 上传一张图片作为网站图标的母本。其实类似的 Favicon 生成器还有很多,大家可以根据自己的习惯或喜好自由选择,基本功能都是一样的。 图片上传完成后,会自动跳转到参数配置页面。如无特殊需求,保持默认配置即可。点击页面下方的生成按钮生成我们的图标和代码。 生成完成后,点击如图所示按钮下载各类格式的图标包,再将自动生成的 HTML 代码复制到剪贴板。 之后,来到 Hugo 站点的根目录,将刚刚下载的压缩包里的所有文件解压到 /static/ 文件夹下。 用文本编辑器打开 /layouts/partials/favicon.html 文件,清空原有代码,将刚刚复制到代码粘贴进去,保存并退出。 最后,打开 /themes/正在使用的主题名/layouts/partials/head.html 文件(不同主题需要编辑的文件可能不同,例如我所使用的 Fuji 主题就是直接编辑同一目录下的 favicon.html 文件),找到下列代码: <link rel="shortcut icon" href="xxx" /> 将 xxx 替换成 favicon.ico ,保存并退出即可。 此时,我们的 favicon 图标安装工作就宣告完成了。使用 hugo 命令重新生成站点,不出意外的话,就能看到我们刚才上传的站点图标了。

2021-05-27 · Mason

桥接模式下 Openwrt 软路由直接访问光猫后台

光猫开启桥接模式后,软路由作为默认网关进行拨号与 NAT,导致客户端设备无法获取与光猫相同网段的 IP 地址,进而也就无法登陆光猫的后台管理界面。虽然在日常使用的过程中,光猫的配置几乎是一次性的,其后台管理界面的使用频率很低,但是每次登陆光猫后台都要通过有线或无线(若有)的方式将设备直接与光猫相连也着实麻烦。因此需要通过一些简单的配置,实现桥接模式下,连接软路由的同时可以随时访问光猫后台。 实现原理其实很简单,只要在现有 DHCP 服务端正常工作的前提下,为软路由的 WAN 口再行分配一个与光猫网段相同的 IP 地址即可,前提是你的软路由支持多 WAN。 以 Openwrt 系统为例,在“网络—接口”界面点击“添加新接口”,进入新接口创建页面。 接口名称随意填写,接口协议选择“静态地址”,包括的接口选择当前 WAN 口绑定的物理接口。注意,接口协议尽量不要选择 DHCP,因为桥接模式下的光猫基本都会关闭自身的 DHCP 功能,不会给新接口自动分配 IP 地址,所以此时需要通过“静态地址”协议来手动指定新接口的 IP 地址。完成上述配置后,点击“提交”按钮进入新接口的详细配置页面。 IPv4 地址一定要设置成与光猫位于相同网段的地址。例如光猫连接软路由的 LAN 口的地址(即光猫后台地址)为 192.168.1.1,那么这里新接口的静态 IP 地址就要设置为 192.168.1.x。子网掩码设为 255.255.255.0,默认网关就是光猫 LAN 口的 IP 地址。有关 IP 网段和子网掩码的相关知识,可以参考这篇文章 。完成上述设置后,点击“保存&应用”按钮即可完成配置。 新接口配置完成后,DNS 缓存会有一定延迟,导致无法正常浏览网页,此时重启一下软路由即可解决问题。如果软路由之前配置了端口映射,则新接口创建完成后,所有的端口映射都将失效,此时仍需经过一番针对防火墙的额外设置才能恢复正常。 重新进入新接口的详细设置页面,在“防火墙设置”中,将原先 WAN 口的防火墙区域绑定到新接口。 然后进入“网络—防火墙—端口转发”页面,将原有的端口映射配置重新“保存&应用”一下即可。 至此,如果不出意外的话,我们便可在桥接模式下随时随地访问光猫的后台管理界面了。

2021-05-05 · Mason

利用 Parsec 实现远程游戏串流

最近,我终于放弃了 Steam 或 Epic Games 等平台的买断制游戏模式,转而投靠了 Xbox Game Pass (XGP) 这样的订阅制模式。尽管买断制可以极大地满足“喜加一”式的收集欲,但自从开始实习之后,我已经很难抽出整块的时间来通关各类单机游戏,以致于我的游戏库中屯了大量已购买的但未通关的游戏,这不仅降低了我购买和尝试最新游戏的欲望,也在资金上造成了很大的浪费。不知从什么时候起,玩游戏竟也成了一种待完成的“任务”,失去了工作之余放松心情的初衷。 因此,我纠结许久,终于决定以后不再购买任何单机游戏。如果某段时间我不是那么忙了(例如辞职在家的现在),就去订阅一个月的 XGP,体验一下最新的单机游戏。事实上,Xbox 账户是可以随时切换区域的。因此我们可以简单地通过将 Win10 的系统区域切换成香港的方式来享受港区 XGP 79 港元每月(首月10港币)的优惠价格。在一个单机游戏动辄就要三百块以上的当下,XGP 确实是一种非常合算方案。毕竟,一个月的时间,完全够我通关一个中型单机游戏,而买断这款游戏的价格远远不止 79 港币。 开通了 XGP 之后,我又开始琢磨如何在出差的时候利用“零碎的时间”玩游戏。例如驻场期间每天下班以后,住在酒店里的我只有一台性能羸弱的 MacBook,如何利用现有设备在酒店里玩上 XGP 上的单机游戏呢?其实解决方案只有一个:远程桌面。只要在家里的 PC 上开启网络唤醒功能 ,在将某款远程桌面软件设置成开机自动启动,我就可以在任何地方,通过网络唤醒 + 远程操控的方式随时随地游玩家里电脑上的游戏。 思路虽然很简单,但找到合适的远程桌面软件着实费了我一番工夫。经过仔细的搜索,我发现了一款叫做 Parsec 的远程桌面软件。它不仅同时支持 Windows 和 macOS 双平台,还专门针对远程游戏进行了优化。不仅如此,Parsec 还支持 Hevc 编码 。只要客户端设备支持 Hevc 解码,就能大大降低串流数据体积,减少网络带宽和流量的消耗,提升远程游戏的体验。 Parsec 的使用方式非常简单,只要去官网注册一个账号并分别在服务端(用于运行游戏的设备)和客户端(用于远程操控的设备)下载安装 Parsec 客户端即可。在两台设备上同时安装并登陆软件后,软件界面应该是这样的: 此时只要点击相应设备上的 Connect 按钮即可建立远程连接了。但为了提升我们的游戏体验,在正式使用前还需要进行一些简单的设置。点击左侧的齿轮图标进入设置界面,将客户端设备的“硬件解码”和“Hevc 编码”功能打开即可。 连接成功后,软件会自动将被操控的设备调至静音,而将所有系统声音转到操控的设备上播放,这一细节非常人性化。经测试,在局域网(千兆带宽)环境下,两台设备基本可以实现零延迟的远程控制,但在广域网环境下,由于带宽和延迟的限制,远程控制略有延迟和卡顿,但仍能满足一些对操作要求不是那么高的游戏。例如,我最近正在补完的《歧路旅人》。这是一款“高清马赛克”游戏,且所有战斗均为回合制,非常适合远程游玩。 由于 macOS 原生支持 Xbox 和 switch pro 手柄,同时 Parsec 也能直接识别上述两款手柄的所有按键,因此在远程游戏时,可以直接通过将手柄连接客户端设备的方式来操控服务端的游戏。网络状况较好的时候,远程游戏的体验和本地几乎没有区别。 ...

2021-05-02 · Mason