2024-03-24

22 篇热帖

1. Linux Crisis Tools (www.brendangregg.com)

文章标题:Linux危机工具(Linux Crisis Tools)

本文核心内容是推荐一系列应预先安装在Linux服务器(特别是企业版)上的性能诊断工具,以便在发生性能危机时能够立即展开调试,避免因临时安装工具而延误排查时间。

主要内容概要:

  1. 核心主张:在应对性能问题导致的故障时,每一秒都至关重要。因此,作者建议预先安装一套“危机工具”,而非在故障发生时再仓促安装。
  2. 推荐工具列表:文章以表格形式列出了一套最小化的工具集及其对应的Ubuntu软件包。这些工具涵盖了系统状态监控、网络分析、CPU/内存/磁盘I/O诊断以及基于eBPF的高级跟踪等多个方面。主要包括:
    • 基础工具procps(提供ps, top)、util-linux(提供dmesg)、sysstat(提供iostat, mpstat)。
    • 网络工具iproute2tcpdump
    • CPU与NUMAnumactllinux-tools-common(提供perf)、cpuidmsr-tools
    • eBPF工具bpfcc-tools(BCC,功能丰富的预置工具集)和bpftrace(灵活的eBPF脚本环境)。两者性能相同,BCC工具功能更全面,bpftrace则便于即时修改。
    • 其他trace-cmd(Ftrace)、nicstatethtooltiptop等。
  3. 安装的重要性(通过危机场景示例):作者通过一个虚构但基于真实经验的故事,生动地描述了在故障发生时试图临时安装工具所遭遇的一系列障碍:
    • 系统响应缓慢,SSH登录和命令执行极慢。
    • 软件包安装失败,原因包括软件源配置错误、网络连接超时。
    • 外部防火墙规则阻止了软件下载。
    • 平台安全策略使文件系统不可写,导致无法安装可执行程序。
    • 最终,即便通过重启临时恢复服务,根本问题仍未解决,且故障可能复发。整个过程耗时漫长,严重阻碍了故障诊断。
  4. 额外考虑
    • 此列表为最小集合,可根据服务器硬件(如GPU)增加特定分析工具。
    • 这些工具更新不频繁,列表只需数年更新一次。
    • 安装这些工具的磁盘开销很小,对云实例部署时间影响甚微。
  5. 建议与展望:作者建议Linux发行版在企业版中默认包含这些危机工具,使各类公司都能在性能故障发生时快速响应。同时指出,bpfcc-tools未来可能会被更轻量的libbpf-tools二进制包替代。

总结:本文强调性能诊断工具预装的关键性,提供了一套实用的工具清单,并通过一个反面案例警示了临时安装工具在危机中的巨大风险,呼吁将这一实践标准化。

2. TinySSH is a small SSH server using NaCl, TweetNaCl (github.com)

TinySSH 服务器配置与启动指南

TinySSH 是一个基于 NaCl 和 TweetNaCl 加密库的小型 SSH 服务器,旨在提供安全且轻量的远程访问解决方案。文章主要介绍了如何配置和启动 TinySSH 服务器,包括创建目录、生成密钥,以及通过多种方式(如 tcpserver、busybox、inetd 和 systemd)进行服务部署。

配置步骤

  • 首先,创建配置目录:使用 mkdir -p /etc/tinyssh 命令。
  • 然后,生成 SSH 密钥:运行 tinysshd-makekey /etc/tinyssh/sshkeydir 以在指定目录生成密钥文件。

启动方法

文章提供了四种常见的启动配置示例,适用于不同环境:

  1. TCPSERVER 方式
    使用 tcpserver 监听端口 22,并启动 TinySSH 服务器:
    tcpserver -HRDl0 0.0.0.0 22 /usr/sbin/tinysshd -v /etc/tinyssh/sshkeydir &

  2. BUSYBOX 方式
    通过 BusyBox 的 tcpsvd 工具启动:
    busybox tcpsvd 0 22 tinysshd -v /etc/tinyssh/sshkeydir &

  3. INETD 方式
    /etc/inetd.conf 配置文件中添加条目:
    ssh stream tcp nowait root /usr/sbin/tinysshd tinysshd -l -v /etc/tinyssh/sshkeydir

  4. SYSTEMD 方式
    使用 systemd 管理服务,包括两个配置文件:

    • tinysshd.socket:定义套接字单元,监听端口 22,并设置为按需启动。
    • tinysshd@.service:定义服务单元,在启动前生成密钥(如果不存在),并指定执行命令和参数。该服务依赖网络,并通过标准输入连接套接字。

这些方法覆盖了常见的服务器环境,用户可根据系统需求选择适合的启动方式。整体内容聚焦于实用配置,未涉及加密算法细节或安全性讨论。

6. PSChess – A chess engine in PostScript (seriot.ch)

文章标题: PSChess – 一个用PostScript编写的国际象棋引擎
主要内容: 该页面已永久移动,并提供了重定向链接。如果未自动跳转,请点击链接访问新页面以获取完整信息。文章标题表明其主题为PSChess,一个基于PostScript语言的国际象棋引擎,但当前内容未提供具体技术细节、目的或功能。

7. What happens to Google Maps when tectonic plates move? (nautil.us)

本文探讨了地质构造运动如何影响谷歌地图等数字地图服务的准确性。作者从爱因斯坦广义相对论中时空弯曲的类比出发,引出地球表面坐标并非固定不变的观点。地壳板块的持续移动导致任何地点的地理坐标都会随时间发生变化,这给依赖固定坐标的地图应用带来了挑战。

地图误差主要来源于几个方面:消费级GPS设备本身存在数米的位置不确定性;卫星或航空影像在与地理坐标网格对齐时存在偏差;用于校准地图的测绘标记点坐标可能不精确或过时。美国使用两种不同的大地测量基准:NAD 83(绑定于北美板块)和WGS 84(全球基准),两者之间存在系统差异,并随板块运动逐渐偏移。为便于日常使用,NAD 83基准被设计成忽略板块运动,使大多数用户感觉坐标稳定,但这导致北美坐标网格与全球基准日益不同步。

地质活动会直接影响地图准确性。例如,1992年兰德斯地震导致加利福尼亚州地貌出现数米错位,在谷歌地球历史图像中清晰可见。类似地,2011年日本东北地震也引起了显著的地壳位移。专业机构(如美国国家大地测量局)通过GPS网络监测这些变化,并定期更新基准和地图,但更新频率有限(如美国地质调查局地形图每三年更新一次)。

业余地理寻宝爱好者通过重新确认测绘标记点的位置,为保持地图准确性提供了帮助。随着技术进步,未来地图更新可能更接近实时,但当前技术限制和成本问题仍是挑战。文章最终强调,尽管存在误差,这些“过时”的地图也提醒着我们地球的动态本质。

9. Lezer: A parsing system for CodeMirror, inspired by Tree-sitter (marijnhaverbeke.nl)

Lezer: 受 Tree-sitter 启发的 CodeMirror 解析系统

背景与挑战

解析技术常被视为复杂领域,但作者认为小型解析器可很简单。为改进 CodeMirror(一款代码编辑器)的解析能力,作者开发了 Lezer。编辑器解析面临独特约束:

  • 文档持续变化:需高效增量处理。
  • 性能限制:解析延迟会影响编辑体验。
  • 语法容错:输入常含错误,但编辑器功能需正常工作。
  • 多语言混合:如 HTML 中嵌入 JavaScript 和 CSS。

早期解析方案探索

CodeMirror 5 使用可状态化的分词器,通过存储状态避免全文重解析。但声明式状态机(如正则表达式驱动)在复杂语法下难以维护。作者曾尝试基于**解析表达式文法(PEG)**的系统,但 PEG 的回溯机制不适合状态化分词,效率低且处理局部歧义繁琐。

Tree-sitter 的启发

Tree-sitter 为编辑器设计,构建完整准确的语法树,比词法标记提供更精确的语法结构信息。但其用 C 语言编写,不适合 Web 环境,且语法文件较大。Lezer 由此诞生,是一个基于 JavaScript 的系统,受 Tree-sitter 启发但有所改进。

Lezer 的核心设计

Lezer 是一个 LR(含可选 GLR)解析器生成器,特点包括:

  • 增量解析:局部更改后可廉价重用旧解析树部分。
  • 自动错误恢复:无需语法作者手动注解。
  • 紧凑输出:优化解析表大小和语法树大小,适合网络传输。

错误恢复机制

受 Tree-sitter 启发,Lezer 使用 GLR 解析同时尝试多种解释。错误发生后,系统通过搜索解析状态和输入位置寻找可行恢复点,为每个分支计算“坏度”分数。恢复策略包括:

  • 跳过令牌:忽略当前令牌后继续。
  • 插入令牌:尝试插入当前状态允许的任意令牌。
  • 强制结束当前生产式

后序解析输出

解析器先以扁平数组记录节点(后序排列),再通过父节点指针构建树结构。这避免了状态分裂时的节点复制开销,节点分配简化为数组追加。

缓冲树(Buffer Trees)

混合使用传统树结构和扁平数组:粗粒度结构用传统树,小节点(如少于几千字符)用 16 位无符号整数数组存储(每节点 4 个数,共 64 位)。前端迭代时按前序排列,减少开销。重复结构(如 *+ 生成的)存储为平衡子树,利于增量重用。

上下文相关词法分析

Lezer 通过令牌组解决令牌冲突(如 JavaScript 中除法与正则表达式)。冲突令牌被分组,每个解析状态仅允许一个组。词法分析器编译为单一确定性状态机,根据允许组快速匹配。

跳过表达式

将空白和注释等作为语法的一部分处理,优化后不增加解析表大小。每个解析状态关联跳过动作,支持单令牌和复合跳过(如可嵌套注释)。不同子语法可有不同跳过规则。

语法树节点标记

节点具有名称(语言内有意义)和属性(由外部代码定义的标签关联值)。属性存储在共享对象中,节点指向对应类型对象。解析器实例可扩展属性,便于处理混合语言树。

语法嵌套

支持有限形式:若语言 A 区域在语言 B 中可通过扫描特定令牌明确终止,Lezer 可临时切换解析表。语法树包含两个语法的节点,属性直接附加于节点,简化混合树操作。

总结

Lezer 是为 Web 环境设计的解析系统,结合了 Tree-sitter 的语法树优势和 LR/GLR 解析的实用性,在错误恢复、增量解析、内存效率和混合语言支持上做了优化,适用于代码编辑器等需要高效、容错解析的场景。

10. Show HN: Lapdev, a new open-source remote dev environment management software (github.com)

Lapdev 开源远程开发环境管理软件介绍

核心价值

Lapdev 是一款开源软件,旨在为您的 Kubernetes 应用提供无缝的开发环境。它通过直接在您的 Kubernetes 集群中运行,为团队提供与生产环境高度一致的开发环境。

主要功能

  1. 读取生产清单:Lapdev 直接从您的生产环境清单(如 Deployments, StatefulSets, ConfigMaps, Secrets, Services)构建一个应用目录(App Catalog),确保开发环境基于真实配置。
  2. 创建定制化环境:支持启动完全隔离的个人命名空间、共享的团队基线环境,或轻量级的分支环境,并具备智能流量路由能力。
  3. 保持环境同步:监控生产环境的变化,通知开发者,并可在您准备好时自动应用更新,有效防止配置漂移。
  4. 支持本地风格迭代:通过其 Devbox CLI 工具,可以将集群流量路由到开发者的本地笔记本,使得开发者可以在本地进行调试,同时保持与集群内依赖服务的连接。
  5. 发布安全预览URL:无需手动配置 DNS、证书或 Ingress 规则,即可为任意服务生成并分享安全的 HTTPS 端点,便于代码审查和演示。

系统架构

Lapdev 由三个核心组件协同工作:

  1. Lapdev API Server:作为 SaaS 控制平面,负责身份验证、编排调度和安全隧道建立。
  2. Lapdev-Kube-Manager:作为集群内的操作器(Operator),负责将生产环境的工作负载镜像到开发命名空间。
  3. Devbox CLI:面向开发者的命令行工具,用于流量拦截和从本地机器访问集群服务。

快速入门

用户可以通过以下步骤开始使用:

  1. 连接您的 Kubernetes 集群。
  2. 创建应用目录(App Catalog)。
  3. 配置您的第一个开发环境。
  4. 使用 Devbox 进行本地开发。

相关资源

文档提供了关于流量路由架构、分支环境架构、预览 URL 等主题的深入说明。

12. Creating an autopilot in X-Plane using Python (austinsnerdythings.com)

本文介绍了如何使用Python为X-Plane飞行模拟器开发自动驾驶系统,重点在于建立模拟器与Python代码之间的通信连接。

核心目标与背景

  • 目标:通过PID控制器在X-Plane中实现自动驾驶功能。
  • 工具选择:X-Plane因其优秀的飞行模型和丰富的数据接口被选用;NASA开发的XPlaneConnect插件用于连接模拟器与Python代码。
  • 技术基础:使用UDP协议进行数据传输。

环境搭建与验证步骤

  1. 安装X-Plane:推荐X-Plane 10(资源占用少、加载快),X-Plane 11亦可用但飞行模型需调整PID参数。
  2. 安装XPlaneConnect插件
    • 从GitHub下载最新版本(1.3 RC6)。
    • 解压至X-Plane安装目录的Resources/plugins文件夹。
  3. 验证插件激活
    • 在X-Plane菜单中进入“Plugins -> Plugin Admin”,确认X-Plane Connect已启用。
  4. 运行示例代码
    • 从XPlaneConnect的GitHub页面下载Python3示例文件(xpc.pymonitorExample.py)。
    • 运行monitorExample.py,成功后将实时显示飞机的经纬度、高度(米)及操纵面偏转量(副翼、升降舵、方向舵,范围-1至1)。

已实现的功能与后续计划

  • 当前进度:本文仅完成环境搭建与数据连通性测试。
  • 已完成的自动驾驶功能(非本文内容,为作者后续开发成果):
    • 俯仰/滚转姿态保持(-25°至25°范围)。
    • 高度、航向、空速设定与保持。
    • 导航至指定经纬度点。
  • 后续方向
    • 下一篇文章将介绍基础“翼面水平器”自动驾驶的编码实现。
    • 未来会使用Flask、Redis和WebSockets增强功能,并添加沿航线导航(Direct To)与横向偏差计算。

总结

本文提供了将X-Plane与Python连接的完整步骤,通过NASA的XPlaneConnect插件成功实现了模拟器数据的实时读取,为后续自动驾驶算法开发奠定了基础。

13. Scientists have traced human tail loss to a short sequence of genetic code (www.cnn.com)

科学家已追踪到人类尾巴消失的遗传机制,发现其与一段曾被忽视的“垃圾DNA”序列有关。这项发表于《自然》杂志的研究指出,人类和类人猿(包括人类的近亲)在约2500万年前失去了尾巴,而这与一个名为AluY的短序列插入到调控尾巴长度的TBXT基因中密切相关。

研究发现,Alu序列属于“跳跃基因”,能够在基因组中移动位置并触发突变。通过比较六种类人猿与十五种非类人猿灵长类动物的DNA,科学家确认AluY仅存在于类人猿基因组中。利用CRISPR基因编辑技术对小鼠进行的实验(历时约四年)表明,在TBXT基因中插入Alu序列会导致小鼠尾巴长度出现变异,且产生的特定蛋白质越多,尾巴越短。

这一发现首次提出了人类和类人猿失去尾巴的遗传机制,而以往仅有关于尾巴消失与直立行走相关联的假说,缺乏具体的遗传解释。研究同时指出,由于尾巴是脊柱的延伸,该发现可能有助于理解人类胎儿发育中出现的神经管畸形,如脊柱裂。在实验中,因基因编辑而失去尾巴的小鼠出现了类似脊柱裂的神经管缺陷。

然而,研究虽解释了“如何”失去尾巴,但尾巴消失的进化“原因”仍存疑问。古人类化石显示,尾巴的消失早于双足行走的演化。有学者认为,这一突变可能因功能上有益而被保留,也可能仅为中性特征。

此外,Alu元素等跳跃基因曾被长期视为“垃圾DNA”,但这项研究提示它们可能对生理、形态和发育具有重要影响。未来的研究将探索该基因插入对人类胚胎发育和行为的其他潜在影响,以及可能参与尾巴消失的其他遗传因素。即使逆转该突变,尾巴也无法再生,表明进化过程中的复杂变化已永久固化。

14. D2 Playground (play.d2lang.com)

D2 Playground 是一个在线运行器,旨在让用户能够体验、学习和创建使用 D2 语言的图表。D2 是一种现代化的图表脚本语言,它可以将文本代码直接转换为可视化图表。该平台为用户提供了便捷的交互环境,以便实践和探索 D2 语言的功能。

15. Show HN: Rotary Phone Project (github.com)

旋转电话项目摘要

这是一个将老式旋转电话改造为多功能现代设备的项目,旨在为作者四岁的儿子重现博物馆中通过拨号听诗的互动体验。

项目目标与功能

作者设定了五项核心功能:

  1. 拨打预设的家庭联系人电话,让小孩也能自主通话。
  2. 接听来自特定联系人的来电。
  3. 在分机上听随机笑话。
  4. 播放随机K-pop歌曲(但音质较差)。
  5. 查询纽约MTA地铁运营状态并语音播报。

设备与基础设置

  • 硬件:使用eBay上购买的Western Electric Bell 500旋转电话,通过Grandstream GS-HT802适配器(支持旋转拨号)连接至VoIP系统。适配器通过Raspberry Pi桥接Wi-Fi,连接至运行Asterisk的旧服务器。
  • 电话调试:电话直接插入适配器即可工作,但可能需根据型号进行小改装(如解除铃铛锁定或调整线路)。
  • Asterisk配置:在Ubuntu上安装Asterisk,使用sip.conf定义电话分机(rotary)和网络配置(如NAT穿透)。

核心功能实现

1. 音频播放(如K-pop歌曲)

extensions.conf中配置拨号规则,使用Playback()命令播放转换为8kHz WAV格式的音频文件。

2. 语音合成与MTA状态查询

  • 采用轻量级语音合成工具Piper,生成语音后通过Sox转换为Asterisk兼容格式。
  • 编写Bash脚本speak.sh和子程序speak,实现文本到语音的转换并播放。
  • 查询MTA的HTTP API获取地铁状态,但对返回文本进行优化以适应语音播报(如缩写扩展、发音纠正)。
  • 设计交互式菜单,支持数字地铁线路(1-7)和字母线路(通过类似T9的编码输入)查询,并处理特殊线路(如穿梭列车)。

3. 电话通话功能(拨打/接听)

  • 外呼:通过Twilio服务连接公共电话网络。Asterisk配置为通过SIP注册到Twilio域名,使用TwiML Bin实现呼出。
  • 接听:创建Twilio Function,仅允许预设号码来电,再路由至Asterisk的旋转电话分机。
  • 解决了NAT穿透问题(通过SIP OPTIONS保活),并设置了呼叫者ID。

4. 其他功能

  • 讲笑话:从数组中随机选取笑话播放,但存在缺乏语音停顿和重复问题,尚需改进。
  • 听K-pop:功能已实现,但音质不佳。

项目挑战与成果

  • 主要困难包括SIP连接调试、音频格式转换及NAT配置。
  • 项目成功实现了所有目标功能,最终成果是孩子能自主使用旋转电话与家人通话,增强了亲子互动。

该项目展示了如何通过开源工具和创意编程将复古设备融入现代生活,兼具教育性和实用性。

16. The Intel 8088 processor's instruction prefetch circuitry: a look inside (www.righto.com)

Intel 8088 处理器指令预取电路详解

背景与重要性

  • Intel 8088(1979年发布)是8086处理器的8位总线变体。
  • IBM选择8088用于IBM PC(1981年),这一决策奠定了x86架构的长期主导地位。
  • 预取机制是8088和8086提升性能的关键:处理器在需要指令前提前从内存获取,以避免等待缓慢的内存访问。

8088与8086的关键差异

  • 总线宽度:8088采用8位数据总线(8086为16位),牺牲部分性能以换取更低的硬件成本,并兼容现有的8位I/O电路。
  • 预取队列大小:8088的预取队列为4字节(8086为6字节),这是由于8088每次预取1字节(而非2字节),较长的队列会导致更多无效预取风险。
  • 内部结构:除总线接口单元(Bus Interface Unit, BIU)和预取队列相关电路外,两者内部设计基本相同。

预取架构与设计影响

  • 8086/8088是首批采用指令预取的微处理器,以解决CPU速度与内存速度不匹配问题。
  • 处理器被划分为两个独立单元:
    • 总线接口单元(BIU):处理内存访问、地址计算(包含专用加法器Σ)及指令预取。
    • 执行单元(EU):执行指令,包含ALU、通用寄存器和微代码。
  • 预取使得内存操作与指令执行异步进行,这要求处理器采用双单元架构。
  • 预取机制也影响了8086的单芯片设计决策,因为跨芯片同步预取的控制信号过多。

预取队列的实现细节

  • 队列由4个8位寄存器和两个硬件指针(读/写位置计数器)组成。
  • 通过两个2位计数器跟踪读/写位置,并使用一个触发器(MT信号)区分队列空与满状态(当读写指针相同时)。
  • 队列长度计算通过组合逻辑实现(而非标准减法电路),其中低两位通过XOR门(在NMOS逻辑中实现为AND-NOR门)和6输入NOR门生成。
  • 队列电路占用了相当大的芯片面积,体现了预取功能的硬件成本。

指令加载与同步机制

  • 加载器(Loader):使用状态机协调预取队列与指令解码器。
    • 生成First Clock(FC)和Second Clock(SC)时序信号,控制微代码执行。
    • 支持流水线优化:通过Next-to-last(NXT)微操作提前开始加载下一条指令,避免性能损失。
  • 微代码交互:对于额外指令字节(如立即数或地址),微代码可直接从队列中获取字节;队列为空时执行会暂停。

预取对程序执行的影响

  • 跳转或控制流变化时,预取队列会被清空(FLUSH微操作)。
  • 指令指针(IP)指向下一个预取地址,而非当前执行地址,因此子程序调用或相对跳转需要校正。这通过CORR微操作实现,利用BIU中的地址加法器减去队列长度。

队列大小与性能权衡

  • Intel通过仿真确定队列大小,平衡预取收益(减少等待时间)与成本(总线占用、预取浪费)。
  • 8088的8位预取使得总线开销更高,因此采用较短队列(4字节)是合理的选择。
  • 队列长度差异也导致8086和8088的队列控制电路不同(如8086使用3位计数器)。

总结

8088的预取电路是处理器性能优化的重要创新,通过异步预取指令提升了执行效率。其实现涉及队列管理、加载器状态机和微代码协同等多个复杂硬件模块,体现了早期x86架构在平衡性能、成本和兼容性方面的设计智慧。

17. Oxide Cloud Computer. No Cables. No Assembly. Just Cloud (oxide.computer)

传统企业运行计算工作负载通常只有两种选择,但两者都存在显著妥协:

  1. 传统本地部署:拥有硬件所有权,但代价高昂。需要应对来自计算、网络、存储、编排等多个供应商的复杂集成,操作繁琐且脆弱。供应商在支持时容易相互推诿,加上昂贵的许可费用和巨大的运营开销。

  2. 公有云:速度和集成性较好,但代价是失去所有权,仅为长期租赁。账单不可预测,出口费用高昂,对公共部门和敏感工作负载存在治理缺口,并通过专有API和服务导致供应商锁定。

Oxide 云计算机旨在提供一种新选择,首次将云的敏捷性与本地部署的治理能力相结合:

  • 统一集成平台:将计算、存储、网络和软件集成于一体,拥有与公有云类似的基础架构。
  • 拥有与控制:用户拥有自己的基础设施,结合了本地部署的所有权优势与云的弹性、可编程性和统一控制。
  • 面向前沿工作负载:设计用于运行AI、高性能计算(HPC)、关键任务及通用工作负载。
  • 关键特性与优势
    • 统一管理界面:通过单一控制台管理整个云。
    • 真正的多租户:在团队和组织之间提供安全、稳健的隔离。
    • 精细的资源控制:通过配额管理资源利用率。
    • 快速部署:添加电源和网络后,数小时内即可投入使用,无需漫长的规划周期。
    • 零订阅许可:消除定期续费的运营负担。
    • 兼容现有工具:支持如SUSE Rancher、Red Hat OpenShift、Kubernetes、Terraform、OpenTofu等常用工具,并通过API、CLI或控制台提供按需弹性资源。
    • 透明与可支持性:基于开放系统,具备丰富的遥测功能,使支持过程透明,避免责任推诿。
    • 基础设施现代化:旨在提供云原生性能,帮助企业简化和现代化其基础设施。
18. TCP connection timeout mystery (devnonsense.com)

本文描述了一起发生在大学校园有线网络中的异常TCP连接超时问题,具体表现为无法正常访问使用Bunny CDN的IP地址,导致依赖该CDN的多个网站功能失效。

问题现象

  • 受影响服务:多个使用Bunny CDN的网站(如plausible.io, dunnedwards.com, ravelry.com等)出现资源加载失败、超时或完全无法访问。
  • 网络环境:仅发生在校园有线网络中。校园无线网络(如eduroam)及访客网络正常。
  • 设备与连接:问题可在所有设备和操作系统(Linux/Windows/macOS/iOS)上复现,无论是通过WiFi路由器还是直接以太网连接。
  • 协议层面:HTTP和HTTPS连接受影响,但Ping命令正常
  • 稳定性:问题100%可复现。

技术分析 通过抓包分析,观察到TCP三次握手过程出现异常:

  1. 客户端发送SYN包。
  2. 服务器正常回复SYN+ACK包。
  3. 客户端发送ACK包完成握手。
  4. 然而,服务器随后重复发送SYN+ACK,表明它未收到客户端的ACK包
  5. 双方陷入重传循环,最终客户端超时并发送FIN+ACK终止连接。

核心问题:客户端发送的ACK包似乎未能到达Bunny CDN的服务器。

假设与排查 作者推测,可能是校园防火墙的非对称路由导致问题:

  • 客户端SYN正常通过防火墙。
  • 服务器返回的SYN+ACK包路由错误,绕过了防火墙
  • 客户端随后发送的ACK包到达防火墙时,因防火墙此前未见过完整的握手记录,将该包丢弃。

作者曾将该问题上报给校园技术支持(Berkeley Student Tech Services),但被告知这是特定网站的问题,网络本身“按设计工作”,建议检查本地DNS设置。作者对此答复表示怀疑。

结论与更新 该问题持续超过一年。文章发布后,作者获得了新信息,基本解决了这个谜团。具体内容请参阅作者的后续文章。

21. Hyprland Crash Course (xd1.dev)

Hyprland 配置速成课程总结

本文介绍了作者在 Arch Linux 系统上,将 Hyprland 作为日常窗口管理器使用的配置经验与技巧。作者从 KDE/GNOME 等主流桌面环境转向 Hyprland,认为其配置具有一定挑战性,但通过一系列自定义脚本和工具,实现了所需功能。

1. 入门基础

  • 系统环境:以 Arch Linux 为例,官方仓库对 Hyprland 支持良好。
  • 安装与启动:通过 sudo pacman -S hyprland kitty 安装后,可从 GDM 显示管理器启动。
  • 官方教程:推荐先完成 Hyprland 官方主教程,这能解决 90% 的基础问题。
  • 后续配置重点:在基础功能就绪后,通常还需配置屏幕共享、应用启动器、状态栏、剪贴板管理器以及 gnome-keyring 等组件。

2. 自定义脚本

作者创建了多个脚本来扩展功能或解决问题:

  • 带历史的 Rofi 启动器:使用 frecerofi 的命令执行功能添加了频率排序历史记录,并可通过不同快捷键分别调用 shell 命令和终端命令的历史。
  • Waybar 自动重载:通过 inotifywait 监听配置文件变化,自动重启 Waybar,便于主题切换。
  • Dunst 通知声音:为解决蓝牙设备因省电策略导致音频播放不全的问题,在播放通知音前先播放一个静音文件来“预热”设备。同时实现了通过环境变量控制的静音模式。
  • Wayland 锁屏:使用 swaylock-effects 脚本配置美观的锁屏界面(模糊效果、色彩方案等)。
  • 截图工具:结合 grimblastksnip 实现区域截图与编辑,以及全屏截图并保存。
  • 退出时防冻结:提供了一个备用退出脚本,在 Hyprland 退出时可能黑屏冻结的情况下,强制终止进程。

3. 实用技巧

  • 多键盘布局:支持为不同的输入设备(如外接键盘和笔记本键盘)设置独立的键盘布局和变体,实现“设备即布局”的一致性体验。
  • Waybar 点击动作:为状态栏上的不同模块(如音量、CPU、磁盘)配置了左键和右键点击动作,可快速打开系统监控工具(如 gnome-system-monitor, pavucontrol)或终端工具(如 top, ncdu)。
  • gnome-keyring 注意事项:警告若 SSH 密钥密码输入错误,不会提示错误,而是会导致 ssh-add 进程占用 100% CPU 并挂起。需通过 seahorse 工具删除错误的密码记录。同时提醒应只使用 gnome-keyringkeychain 其一。