2024-04-18
32 篇热帖
2. Short Stack: World’s smallest Nintendo Wii (github.com)
Short Stack:世界最小的任天堂Wii
核心特点
- 全球最小 的“按比例”Wii游戏机(1:2.38比例),尺寸如同一副扑克牌,体积仅为原版Wii的7.4%。
- 采用 USB-C 供电,支持 HDMI 无损数字音视频输出(由GCVideo驱动)。
- 支持 蓝牙,可连接Wii遥控器及配件。
- 使用 MicroSD卡 存储游戏和存档,替代光驱和记忆卡。
- 保留 4个GameCube手柄接口、电源/重置/同步按钮、电源指示灯及标志性的蓝色光碟槽。
- 支持通过Wii遥控器实现软关机及开关机。
尺寸与比例
- 体积为原版Wii的7.4%,相当于13.5个本设备才能塞满一个原版Wii。
- 目前被认为是最小的功能性比例模型Wii,但理论上通过更极致的裁剪(如采用52x52mm的“最终目的地”裁剪方案)还可再缩小25-30%的体积,不过组装难度极高。
核心组件
1. 模块化主板
- 通过裁剪Wii主板至62x62mm,仅保留CPU、GPU、内存及闪存核心部件。
- 使用两个定制模块直接焊接在主板上:
- Wii Power Strip:通过Molex Pico-Lock接口供电,并辅助重定位电容。
- Periphlex:柔性PCB,通过14针FFC连接器统一引出蓝牙、USB、GameCube数据线及GPIO信号,替代多根磁导线。
- 主板背面使用开源方案 fujiflex(提供数字AV输出)和 nandFlex(重定位NAND闪存芯片以适配裁剪)。
2. 定制PCB电路板
- 主板PCB:集成电源稳压、USB转MicroSD逻辑、HDMI接口、GameCube接口及电源管理微控制器,通过FFC线缆与Periphlex连接。
- 前面板PCB:承载电源、重置、同步按钮及LED指示灯,通过8针FFC线连接主板。
- 手柄接口:采用TRRS耳机接口替代原生GameCube接口,与GC Nano方案兼容。
3. 散热系统
- 定制低矮散热器:铝或铜材质,设计有与主板对齐的安装孔。
- 微型鼓风机风扇(Pelonis AGB208N,20x20x8mm),通过散热鳍片将热量从侧面排出。
4. 外壳
- 3D打印外壳,使用M2.5螺丝和垫片固定堆叠结构,M1.2螺丝组装其余部分。
- 设计亮点:
- 磁吸式SD卡访问面板(无需拆机即可插拔存储卡)。
- 滑动式GameCube手柄端口盖板(替代原版翻盖设计)。
- 1.5mm厚亚克力光扩散器重现经典碟槽灯光,配合可编程LED。
- 3D打印按钮,电源键内置导光管。
构建指南(摘要)
- 警告:非新手项目,需掌握主板裁剪、精细焊接及PCB组装技能。
- 关键步骤:
- 组装主板与前面板PCB(建议使用锡膏与热板/回流焊)。
- 刷写主板固件。
- 准备并裁剪Wii主板(需先重定位NAND、无线U10、安装fujiflex并测试)。
- 安装Power Strip与Periphlex模块。
- 通过FFC线缆与电源线连接各板卡,涂抹导热膏,堆叠散热器-主板-垫片-主板并安装至外壳。
- 组装外壳,安装磁吸盖板与滑动面板。
致谢与开源
- 项目基于 BitBuilt社区 的贡献,特别感谢Wesk、Aurelio、YveltalGriffin、CrazyGadget等人在设计、固件与PCB方面的支持。
- 项目遵循 Solderpad Hardware License v2.1 开源许可。
3. Embeddings are a good starting point for the AI curious app developer (bawolf.substack.com)
4. Halo 2 in HD: Pushing the Original Xbox to the Limit (icode4.coffee)
这篇文章详细记录了作者为初代Xbox版《光环2》添加高清分辨率支持(720p/1080p)的完整技术过程。项目始于朋友“doom”对Xbox硬件的改装,包括CPU和GPU超频以及RAM升级至128MB。作者的目标是充分利用这些改装,将游戏原生480p分辨率提升。
主要技术挑战与解决方案:
渲染分辨率修改:通过逆向工程游戏引擎,修改了
_rasterizer_detect_video_mode、_rasterizer_init_screen_bounds和rasterizer_device_initialize等关键函数,使D3D设备的后缓冲、视图区域等参数能正确设置为720p或1080p。原版游戏虽声称支持480p,但实际仅渲染640x480分辨率。修复渲染错误:分辨率提升导致菜单渲染异常(如蓝色滤镜消失、几何体截断、条纹图案)。根本原因是游戏手动创建的渲染目标(如
texaccum纹理累积层)尺寸被硬编码为640x480,与新的后缓冲尺寸不匹配。通过钩取相关初始化函数,将其尺寸更新为当前分辨率,并正确计算平铺内存的步距,解决了这些问题。内存管理与内核补丁:提高分辨率导致内存需求激增,原版64MB RAM不足。作者的策略是:
- 内存分配迁移:将游戏内的纹理缓存、几何缓存等大规模分配从受限的低64MB区域迁移至上64MB“调试”内存区域。
- 突破物理内存限制:Xbox内核原限制物理连续内存分配只能在低64MB区域。作者通过运行时热补丁内核函数
MmAllocateContiguousMemoryEx中的最大页帧号检查,解除了此限制,使GPU能访问上64MB的物理内存。 - 可视化工具:开发了内存分析工具来可视化内存使用情况,指导缓存大小调整。
性能优化:
- 三重缓冲:发现游戏受双重缓冲下交换链满导致的GPU停顿限制。将交换链改为三重缓冲,消除了停顿,GPU利用率提升,帧率提高。
- GPU超频:通过写入GPU的时钟寄存器动态超频,从默认233MHz提升至约300MHz,带来额外性能提升。
- 缓存扩容:大幅增加纹理缓存和几何缓存大小(例如从19MB增至30MB),并配合提升HDD传输速度(UDMA模式),显著减少了纹理和几何体加载时的“弹出”现象。
最终结果: 项目在搭载128MB RAM、超频CPU/GPU的改装Xbox(“神机”)上成功实现。
- 720p:游戏大部分时间能以30FPS流畅运行,体验良好。
- 1080p:可渲染原生1080p画面(输出1080i信号),但受性能限制,主要用于截图。 作者将整个项目的代码和补丁开源在GitHub上,并发布了对比视频。该项目展示了通过深度硬件与软件协同优化,在经典游戏主机上实现远超原始设计能力的视觉效果。
5. The invisible seafaring industry that keeps the internet afloat (www.theverge.com)
摘要:支撑互联网的隐形海运业
这篇文章通过2011年日本大地震和海啸后,海底电缆维修船“Ocean Link”号及其船员的亲身经历,揭示了维持全球互联网运行的隐形海运行业。
核心事件:地震中的维修与危机
- 突发灾难:2011年3月11日,当“Ocean Link”号在日本海岸完成一次常规电缆维修时,遭遇9.1级地震。船员们迅速驶向深海避开了海啸。
- 巨大破坏:地震及引发的海啸摧毁了日本东部大片区域,并严重破坏了连接日本与世界的海底光缆。七条跨太平洋电缆断裂,将日本推向了“网络孤岛”的边缘。
- 紧急抢修:“Ocean Link”号成为附近唯一能作业的维修船。船员们在福岛核辐射威胁下,返回作业海域。维修过程极其艰难,电缆被水下滑坡严重损毁和掩埋,他们甚至不得不临时拼接碎片电缆、铺设新分支单元来绕过严重损坏区。整个维修工作持续了154天。
行业的重要性与现状
- 关键基础设施:全球约80万英里的海底光缆承载着99%的洲际数据,是金融交易、政府通信和日常互联网服务的基础。若全部中断,现代文明将陷入瘫痪。
- 隐形与高风险:该行业如同“精密工程与神经外科”的结合,工作环境恶劣且危险。但因行业高度保密和高效运作,公众对其几乎一无所知,甚至误以为互联网全靠卫星。
- 维修工作原理:自19世纪以来,核心维修方法几乎未变——维修船在深海用巨型抓钩(抓斗)钩住断裂电缆,打捞至船上进行拼接修复。工作依赖经验,例如通过张力计读数判断海底情况。
面临的挑战与未来
- 船队与人才老化:全球仅有约22艘专业维修船,且船龄老旧,缺乏资金建造新船。同时,行业面临严重的“人才荒”,老员工退休,年轻一代因行业隐蔽和工作生活流动性大而缺乏了解与兴趣。
- 需求激增与地缘政治:谷歌、Meta等科技巨头大量投资建设新光缆,导致维修需求增加。与此同时,地缘政治紧张(如南海、红海)和人为活动(如渔船拖网、船只抛锚)对光缆构成持续威胁。
- 政府关注度提升:近年来,NATO、欧盟、英国等开始关注海底基础设施安全,探讨直接投资维修船队的可能性,但这可能引发保护走廊与冗余性之间的权衡。
结论
“Ocean Link”号的故事凸显了这样一个悖论:现代社会极度依赖这些深海中的“玻璃细丝”,但其维护行业却隐秘、承压且后继乏力。正如一位工程师所想,他们完成工作后,回归日常的人们对此毫无察觉。这个支撑着数字世界的物理基础,正面临着可持续性的考验。
6. Randar: A Minecraft exploit that uses LLL lattice reduction to crack server RNG (github.com)
Randar:利用LLL格基规约破解《我的世界》服务器随机数生成器的漏洞
概述
Randar是针对《我的世界》版本Beta 1.8至1.12.2的一个漏洞,它利用服务器中java.util.Random随机数生成器(RNG)的不当重复使用,通过LLL格基规约算法破解其内部状态,从而定位其他玩家的位置。该漏洞揭示了服务器在区块加载时重置随机种子的操作(用于检查林地府邸生成)与玩家挖掘方块时物品掉落坐标之间的关联,使得攻击者能够通过三次连续的nextFloat()调用反推出RNG状态,并回溯找到最近加载的区块,进而推断其他玩家的位置。
漏洞原理
《我的世界》服务器在加载区块时,会检查是否生成林地府邸,此过程会重置全局随机数生成器World.rand的种子为区块坐标的函数。当玩家挖掘方块时,掉落物品的精确坐标由三个连续的nextFloat()调用决定,这些调用泄露了RNG的当前状态。由于java.util.Random使用线性同余生成器(LCG),状态更新公式为seed = (seed * 25214903917 + 11) mod 2^48,且输出为24位整数除以2^24,因此三个连续输出可以约束种子状态。通过格基规约,将寻找满足约束的种子转化为在格中寻找最近点的问题,从而快速恢复48位种子。
实施步骤
- 数据收集:记录其他玩家挖掘方块时掉落物品的精确坐标(X, Y, Z)。
- 测量转换:从坐标中反推出三个连续的
nextFloat()值(即三个24位整数)。 - 状态破解:利用LLL算法将这三个测量值映射到由LCG状态构成的3维格中,通过基规约和舍入操作直接计算出原始种子。
- 回溯定位:将破解出的种子向后迭代,直到找到一个与林地府邸检查相关的种子,从而确定最近加载的区块位置(即其他玩家所在的区域)。
技术细节
- LCG参数:乘数=25214903917,增量=11,模数=2^48。
- 格构造:每个种子对应一个点(种子,nextSeed(种子),nextSeed(nextSeed(种子))),这些点构成一个3维格。测量值定义一个立方体区域,寻找格中落在该区域内的点。
- LLL算法应用:通过基规约得到更短、更正交的基向量,将立方体转换到规约空间后,只需对中心点坐标舍入到最近整数即可找到有效格点,从而高效恢复种子。
- 效率:在现代硬件上,破解一个种子仅需约10纳秒。
漏洞影响
- 实时利用:在版本1.12.2及更早的服务器上,攻击者可实时定位任何加载过区块的玩家,破坏游戏平衡(如在2b2t无政府服务器上暴露基地位置)。
- 追溯利用:即使服务器已更新或修补了RNG漏洞,只要曾有ReplayMod等模组记录过数据,就可能被反向分析,暴露历史位置信息。
- 末地维度:虽然末地的区块仅首次生成时影响RNG,但通过跟踪新区块生成轨迹(如玩家前往基地的路径)仍可定位玩家。
修补方法
修改World类中的setRandomSeed方法,避免重用全局Random实例:
- 方案1:每次返回新的
Random实例(性能较低)。 - 方案2:使用独立的
Random实例仅用于世界生成(性能更优)。
示例代码:
private final Random separateRandForWorldGen = new Random();
public Random setRandomSeed(int seedX, int seedY, int seedZ) {
this.separateRandForWorldGen.setSeed(seedX * 341873128712L + seedY * 132897987541L + seedZ + this.getWorldInfo().getSeed());
return this.separateRandForWorldGen;
}
附加说明
- 漏洞在版本1.13及之后已修复(更改了结构生成代码)。
- 在1.9之前,物品坐标精度较低(5位小数),需多次测量或其他策略。
- 作者n0pf0x补充了实际应用中的优化,如使用缓存加速坐标查找,以及在末地中通过“占用跟踪器”推断玩家身份。
该漏洞展示了游戏实现中不经意的安全风险,并凸显了密码学技术在游戏漏洞利用中的应用。
7. Show HN: Speeding up LLM inference 2x times (possibly) (asciinema.org)
这篇文章通过一个asciinema终端录屏演示,介绍了将大型语言模型(LLM)推理速度提升约2倍的可能技术方案。录屏环境为macOS上的xterm-256color终端与zsh shell。文章核心内容是展示该技术的演示效果,并提供了多种将该录屏嵌入和分享的方法。
主要技术细节与分享方式如下:
- 演示链接:提供了asciinema录屏的直接链接
https://asciinema.org/a/654503,用户可在线观看终端操作演示。 - 嵌入方式:
- 图片链接:可将预览图链接嵌入不支持脚本的场合(如项目README),提供HTML和Markdown代码片段。
- 完整播放器:支持在允许脚本的网页中通过
<script>标签嵌入交互式播放器。
- 本地使用:
- 可下载
.cast格式的录屏文件。 - 使用asciinema命令行工具在本地终端回放。
- 可集成独立的asciinema播放器(需下载.js和.css文件)到网站中。
- 可下载
- GIF转换:虽然该网站不直接提供GIF转换,但用户可使用命令行工具
agg将录屏转换为GIF,并自定义字体、主题、速度等参数。
文章内容聚焦于技术演示的呈现与分享工具的使用指南,旨在方便读者查看和复现所声称的LLM推理加速效果。
8. CFPB Takes Action Against Coding Boot Camp BloomTech and CEO Austen Allred (www.consumerfinance.gov)
美国消费者金融保护局(CFPB)近期新闻公告摘要
以下是CFPB新闻室发布的一系列近期动态,主要涉及监管重点调整、执法行动、规则更新及内部事务。
一、 监管与执法重点调整
- 聚焦重点威胁:CFPB宣布将集中执法和监管资源于对消费者构成迫切威胁的领域,特别是对军人和退伍军人的保护。因此,将不会优先依据2024年5月生效的“先买后付”贷款相关规则采取执法行动。
- 给予监管宽限:为小型贷款提供者提供监管救济,将不会优先对未在规定截止日期前提交“非银行受监管机构登记册”相关信息的实体采取行动。
- 调整监督方式:监督部门发布了新的“谦逊承诺”,改变了检查方式,与此前被描述为“武器化”的做法形成对比。
二、 具体执法与和解案例
- 军事贷款法和解:就FirstCash公司及其子公司涉嫌违反《军事贷款法》的诉讼达成和解。
- 汇款业务命令修订:修订了对国际汇款公司Wise的同意令,涉及广告不准确费用及未充分披露汇率等成本的问题。
三、 规则制定与数据更新
- 公布贷款门槛:与美联储等机构联合宣布2026年消费者信贷和租赁交易中适用《贷款真相法》和《消费者租赁规则》的美元门槛。
- 调整评估门槛:宣布2026年受特殊评估要求约束的高成本抵押贷款门槛将从33,500美元上调至34,200美元。
- 发布抵押贷款数据:2024年《住房抵押贷款披露法》数据已公布,包含经隐私处理的贷款级信息。
四、 内部事务与法律状态
- 领导层变动:财政部长斯科特·贝森特被指定为CFPB代理局长。
- 资金来源受限:CFPB已通知法院,根据司法部法律咨询办公室的意见,其目前无法合法地根据《多德-弗兰克法案》向美联储申请资金。
- 外部诉讼影响:声明将不会优先对不受德克萨斯银行家协会诉CFPB案中所施加禁令约束的实体采取执法或监管行动。
五、 消费者救济
- 正在开展工作,确保受Bilt公司更换银行合作伙伴影响的消费者得到适当补偿。
9. VASA-1: Lifelike audio-driven talking faces generated in real time (www.microsoft.com)
VASA-1:实时音频驱动的逼真人脸动画生成技术
核心技术目标
VASA-1 是一项创新的人工智能技术,其核心目标是实现根据音频输入实时生成高度逼真、自然且富有表现力的说话人脸视频。该技术旨在突破传统面部动画在实时性、真实感和驱动效率上的限制。
关键技术特点
- 音频驱动:系统能够直接以语音或音频信号作为输入,驱动虚拟人脸模型的面部动作、唇形同步以及细腻的表情变化。
- 实时生成:与许多需要长时间离线渲染的方案不同,VASA-1 强调在实时或接近实时的条件下完成从音频到高质量视觉输出的转换,使其适用于直播、实时交互等场景。
- 高度逼真:生成的面部动画在视觉真实感上力求达到“以假乱真”的效果,能够模拟自然的说话节奏、微妙的肌肉运动和情感表达,显著提升虚拟角色或数字化身的沉浸感和可信度。
潜在应用前景
该技术在虚拟助手、数字化身、远程通讯、游戏娱乐、虚拟主播以及无障碍交流等多个领域具有广阔的应用潜力,能够为人机交互提供更自然、更生动的视觉界面。
总结
VASA-1 代表了人工智能在生成式模型与计算机视觉交叉领域的一项重要进展,其核心价值在于将实时性与高保真度相结合,高效地将音频信息转化为栩栩如生的视觉人脸动画。
10. Inside Amazon’s Secret Operation to Gather Intel on Rivals (www.wsj.com)
11. Reddit is taking over Google (www.businessinsider.com)
12. My mother declared my bedroom a disaster area (1984) (news.lettersofnote.com)
1984年4月18日,美国南卡罗来纳州13岁少年安迪·史密斯给总统罗纳德·里根写了一封半开玩笑的求助信。他称母亲已将他的卧室宣布为“灾区”,因此申请联邦资金聘请清洁队。他承诺自己提供初始资金,希望政府提供配套资金。
里根总统于5月11日回信。他首先为延迟回复致歉(因当时访华),接着以典型的幽默官僚口吻指出了两个“技术问题”:一是按程序应由宣布灾区的母亲本人提出申请;二是当年灾害频发(提及飓风、洪水、干旱、地震等),救灾资金已严重短缺。他随后建议安迪借鉴政府倡导的“私营部门倡议计划”,自己发起一个志愿清洁项目,并恭喜他加入了全国已有的3000多个志愿项目行列。最后,他向安迪的母亲致以问候。
这封回信收录于《Letters of Note》第二卷,经里根图书馆授权转载。原文指出,里根总统每周会从数以千计的来信中挑选约30封亲自阅读和回复,而这封来自少年的信件是其中一则展现其幽默与沟通风格的典型例子。
13. Goldene: A single atom layer of gold (liu.se)
金烯:单原子层厚度的黄金材料
研究突破:瑞典林雪平大学科学家首次成功制备出仅一个原子层厚度的金片材料,命名为“金烯”。这一成果于2024年4月16日发表在《自然·合成》期刊上。
关键特性:与常规三维金晶体中每个金原子拥有12个相邻原子不同,金烯中每个金原子仅与6个相邻原子结合。这种结构变化使得金通常的金属特性转变为半导体特性,展现出全新的物理化学性质。
制备过程:
- 偶然发现基础材料:研究人员最初在开发导电陶瓷(钛硅碳化物)时,意外发现在高温下硅层被金取代,形成了“钛金碳化物”。
- 借鉴传统日本锻造技术:为从钛金碳化物中剥离出单原子金层,研究团队采用了拥有百年历史的日本“村上试剂”蚀刻法,但对其进行了关键修改:
- 使用低浓度试剂进行长时间蚀刻(从一天到数月不等)。
- 必须在黑暗环境中操作,因为光照会产生溶解金的氰化物。
- 添加表面活性剂以稳定剥离出的二维金烯薄片,防止其卷曲。最终,金烯薄片悬浮在溶液中,可通过“筛分”方法收集并验证。
应用前景:
- 催化领域:可用于二氧化碳转化、制氢催化、选择性生产增值化学品。
- 环境与能源:在净水、氢气生产方面具有潜力。
- 其他领域:包括通信技术等。
- 效率提升:能显著减少实际应用中的黄金用量。
研究展望:林雪平大学研究团队的下一步计划是探索是否能用类似方法制备其他贵金属的单原子层材料,并进一步发掘金烯的更多应用可能。
研究资助:该研究获得了瑞典研究委员会、瑞典战略研究基金会、克努特和爱丽丝·瓦伦贝里基金会等多个机构的资助。
14. The forgotten war on beepers (newsletter.pessimistsarchive.org)
1980年代,寻呼机(beeper/pager)在青少年中越来越受欢迎,也广泛被毒品交易者使用,引发了社会和媒体的道德恐慌。1988年《华盛顿邮报》报道寻呼机在毒品交易中的盛行,将其与青少年毒品问题联系,并在全国范围内传播。此后,寻呼机被视为不仅仅是课堂的干扰,更是青少年接触毒品的象征。校方官员公开表示,允许学生佩戴寻呼机等同于认可毒品交易标志物。
由于这种担忧,多个州和城市对寻呼机实施严格禁令。例如,新泽西州对未满18岁的青少年持有寻呼机全面禁止,违反者最高可判六个月监禁。密歇根州规定儿童在校持有寻呼机可判三个月监禁,芝加哥则认为禁令还能减少青少年卖淫。其他惩罚措施包括社会服务、罚款以及吊销驾照一年。数千名青少年因此成为严厉法律的受害者,甚至出现警方将学生铐走、起诉的案例。芝加哥执法尤为严厉,1994年之前在学校有700起寻呼机相关逮捕,前一年则达1000起。
寻呼机禁令影响不仅限于学生,大学也要求学生向校警注册寻呼机,尽管事实上并未有寻呼机促进毒品交易的证据。受这一危机影响最深的是摩托罗拉公司,其占据80%寻呼机市场。公司为保护自身利益,1994年发起反禁令运动,发动员工子女设计宣传、举办活动、推出“Pages for All Ages”等口号,并联合百事公司向年轻人低价提供寻呼机,强调寻呼机作为亲子沟通工具的重要性。
这些举措引发支持和反对力量的博弈。多名立法者呼吁修改或撤销禁令,部分主因是对单纯持有寻呼机而被惩罚(如5岁学生被停学)的愤怒。新泽西州1996年修改了相关法律但未废除,之后三十年该禁令仍存在。法案起草者Ronald Rice于2017年提出废除,表示“已不再是问题”,但禁令依旧未取消。
回顾寻呼机禁令的初衷,实际上未有证据显示其与青少年毒品接触有直接关联。反而,随着手机在校园的普及,青少年吸毒率显著下降,一定程度上否定了移动通讯设备助长毒品交易的观点。2023年,Ronald Rice去世,禁令尚未废除。同年《华盛顿邮报》社论再次呼吁全面禁止校园手机,延续着有关数字设备的新一轮道德恐慌,而许多父母曾因携带寻呼机被禁止进入学校。
15. Guy Callendar, the engineer who discovered human-caused global warming (nautil.us)
16. Wayfair fired a bunch of people again today, after using them to train AI
17. Flying Aircraft Carriers (2019) (neverwasmag.com)
18. The Illustrated Word2Vec (2019) (jalammar.github.io)
文章核心摘要:词向量与Word2Vec原理图解
本文通过类比和图示,系统讲解了词向量(Word Embedding)的概念及其代表性方法Word2Vec的原理与训练过程。
一、词向量的概念
词向量是将词语映射为实数向量的技术,其核心思想是用一组数字(向量)表示一个词的语义信息。文章以“人格向量”为例,说明如何将人的性格特质(如外向性)数值化,并通过余弦相似度衡量不同人之间的相似性。将此思想应用于词语,即得到词向量。例如,单词“king”的词向量是一个50维的浮点数列表。通过可视化向量的颜色分布,可以直观比较不同词向量的相似性(如“man”与“woman”相似,“king”与“queen”相似)。
词向量最引人注目的特性是能够通过向量运算进行语义类比,最经典的例子是:king - man + woman ≈ queen。这表明词向量空间能够编码词之间的关系。
二、Word2Vec的训练原理
Word2Vec的目标是从大量文本语料中高效学习出高质量的词向量。其核心思想是“一个词的含义由其上下文决定”。
训练数据生成:通过滑动窗口在文本语料上移动,生成“上下文-目标词”对。例如,对于句子“Thou shalt not...”,窗口大小为3时,可生成训练样本如(
[Thou, shalt]->not)。两种架构:
- 连续词袋模型:根据上下文词(周围词)预测中间词。
- 跳字模型:根据中心词预测其上下文词(每个窗口位置可生成多个样本)。Word2Vec主要采用后者,即Skip-gram。
训练效率优化:负采样 原始的Skip-gram模型在预测时需要计算整个词汇表的概率分布,计算量巨大。负采样 将问题简化为一系列二分类任务:
- 正样本:真实的(中心词,上下文词)对,标签为1。
- 负样本:为每个正样本随机采样一些噪声词(非真实上下文词),与中心词组成(中心词,噪声词)对,标签为0。 模型的目标变为区分真实上下文词和随机噪声词。这极大降低了计算复杂度,使大规模语料训练变得可行。此组合方法称为Skip-gram with Negative Sampling (SGNS)。
模型训练过程:
- 初始化两个矩阵:Embedding矩阵(存储词向量)和Context矩阵(存储上下文向量)。
- 对于每个训练样本(含一个正样本和多个负样本):
- 从矩阵中查找中心词和所有上下文词/噪声词的向量。
- 计算中心词向量与每个上下文词/噪声词向量的点积,并通过sigmoid函数转换为概率。
- 将模型预测的概率与真实标签(正样本为1,负样本为0)比较,计算误差。
- 根据误差更新相关的词向量,使正样本对的得分趋近1,负样本对的得分趋近0。
- 遍历整个语料多轮后,训练完成。最终通常只保留Embedding矩阵作为词向量。
三、关键超参数
- 窗口大小:较小的窗口(如2-15)倾向于学习语法和可替换关系;较大的窗口(如15-50)更能捕获主题和语义相关性。
- 负样本数量:原始论文推荐5-20个,对于大语料,2-5个可能已足够。
四、应用价值
Word2Vec不仅是一种有效的词向量生成方法,其核心思想(如使用向量表示事物、基于上下文学习、负采样技术)已被广泛应用于推荐系统(如Airbnb、Spotify)和序列数据建模等领域。
19. Cloudflare CEO Matthew Prince buys local paper, feuds over mansion build (archive.ph)
20. AltStore PAL, the first alternative app marketplace on iPhone, is available now (mastodon.social)
AltStore PAL已在欧盟地区上线,成为首个面向iPhone的替代性应用市场。
该商店采用年度订阅制,价格低于2欧元,用于覆盖苹果的核心技术费用。订阅用户可直接获取由Riley Testut开发的Delta模拟器,该应用支持运行NES、SNES、GB/GBC/GBA、DS、N64及世嘉Genesis等平台的游戏。
目前AltStore PAL尚未完全向第三方开发者开放,但未来将提供更多功能。开发者届时可通过托管JSON文件并指向已公证的IPA文件来分发自己的应用。
主要特点:
- 目标地区:欧盟
- 定价模式:年度订阅(<€2/年)
- 包含应用:Delta模拟器(支持多款经典游戏主机)
- 当前状态:初步上线,第三方开发者接入功能尚未完全开放
- 未来展望:将简化第三方应用分发流程
官方信息:https://altstore.io/
21. Effort – a possibly new algorithm for LLM Inference (kolinko.github.io)
Effort算法:一种可能的LLM推理新算法
核心思想
Effort是一种新算法,旨在实时动态调整大型语言模型推理过程中执行的计算量。用户可以通过设定"努力程度"(effort level)来平衡推理速度与输出质量。
关键特性与优势
- 可调节性能:在Apple Silicon芯片上,50% effort时性能与常规矩阵乘法相当;25% effort时速度提升至两倍,同时仍能保持大部分输出质量。
- 选择性权重加载:可选择在模型加载时跳过最不重要的权重(例如10-20-30%),无需转换步骤,类似于临时蒸馏。
- 模型兼容性:目前已为Mistral模型实现,理论上适用于所有其他模型,且无需重新训练——仅需转换格式和进行一些预计算。
- 实现状态:目前仅支持FP16格式。核心乘法运算速度较快,但softmax、注意力求和等非核心操作仍需优化。Mixtral和Q8量化版本正在开发中。
当前性能与限制
- 实现开销:受当前实现的非核心部分(如范数计算、注意力分数计算)效率限制,整体推理速度存在瓶颈。即使在0% effort下,生成单个token在我的机器上也需要15毫秒,在M1 Air上则需数秒。相比之下,Llama.cpp/Ollama中类似操作耗时少于1毫秒。项目急需经验丰富的Swift/Metal工程师帮助优化此问题。
- 质量评估:算法通过将示例输入状态向量与权重矩阵(如wq、w1)相乘来评估近似质量。部分矩阵更易近似,整体输出表现如文末示例所示。模型级别的性能评估采用生成500个token的文本后,再比较这些token的预测结果。目前KL散度跟踪功能正在开发中,尚无法计算困惑度分数。基础QA测试(BasicQ,由GPT-4设计的一系列复杂问题)展示了其潜力,但在进行HumanEval和HellaSWAG等标准测试前,仍需修复实现中的问题。
未来展望与资源
- 初步结果(以及与Mixtral的未文档实验)表明该算法足够稳健,值得发布。
- 文章末尾包含了算法的技术深入剖析(基础、bucketMul介绍、GPU实现、MoE/量化等)、作者信息、下载链接(Github)以及相关参考资源。
- 项目急需Metal/Swift领域的专家协助,以解决实现开销问题并完善测试。
22. Hermit is a hermetic and reproducible sandbox for running programs (github.com)
Hermit:一个可复现的沙箱容器
Hermit 是一个强制程序确定性执行的可复现容器。它通过**隔离程序与各种不确定性来源(如时间、线程交错、随机数生成等)**来确保每次运行结果完全一致。这种确定性是许多应用的基础,包括并发压力测试、记录/回放、可复现构建和并发错误自动诊断。
核心限制:
- Hermit 无法隔离来自文件系统更改或外部网络响应的不确定性。为获得完全确定性,需提供固定文件系统基础镜像(如Docker镜像)并禁用外部网络。
- 项目状态:Hermit 已停止积极开发,进入维护模式。存在一长串未支持的系统调用可能导致程序失败,且当前团队无力处理问题、修复重大错误或添加新功能。欢迎社区通过提交拉取请求进行贡献。
工作原理: Hermit 位于客户进程和操作系统之间,拦截客户程序发出的系统调用。
- 对于某些调用,它能完全替代内核功能并抑制原始调用。
- 对于其他调用,它将调用转发给内核并清理响应,使其变为确定性。
- 示例:当程序读取
/dev/urandom时,Hermit 会拦截该读取,并使用具有固定种子的确定性伪随机数生成器填充缓冲区,确保每次运行内容相同。 - 处理线程调度:为调度的确定性,Hermit 将线程执行序列化(如同仅有一个CPU),并确定性地选择下一个运行的线程。它利用CPU的性能监控单元 在执行固定数量的条件分支指令后暂停线程,以实现对线程运行时间的精确控制。
构建与使用:
- 构建:使用标准的 Rust
cargo工具构建。生成的二进制文件位于target目录。 - 基本运行:
hermit run <prog> - 高级用法:
- 混沌模式(用于并发压力测试):
hermit run --chaos --sched-seed=3 <prog> - 记录与回放:可记录非确定性执行(
hermit record start <prog>),或反复运行受控的确定性执行(hermit replay)。 - 诊断并发错误:
hermit analyze --search -- <prog>可搜索失败和通过的执行,并诊断导致崩溃的竞态条件。
- 混沌模式(用于并发压力测试):
应用场景:
- 并发压力测试(混沌模式):可控地暴露并发错误。
- 记录/回放调试:方便地重放程序执行。
- 可复现构建:确保构建过程和结果的一致性。
- 探索性调试:通过显式改变输入(如调度种子)来研究执行结果的变化,从而搜索或定位错误。
其他信息:
- 测试状态:在Meta内部有超过700个集成测试,但尚未移植到外部构建系统。
- 许可证:采用 BSD-3 条款许可证。
- 平台支持:目前仅支持 x86_64 Linux,aarch64 支持仍在开发中。
23. Cyc: History's Forgotten AI Project (outsiderart.substack.com)
24. Cosmic Desktop: Hammering Out New Cosmic Features (blog.system76.com)
COSMIC 桌面环境:新功能开发进展
本文介绍了基于 Rust 语言开发的新桌面环境 COSMIC 的最新进展,涵盖 Pop!_OS 系统更新、COSMIC 预测试版的新功能、社区贡献、合成器优化以及初步性能测试结果。
一、Pop!_OS 系统更新
- 内核升级:Pop!_OS 22.04 LTS 已更新至 Linux 内核 6.8.0,增加了对 Intel Xe/Arc 显卡、未来 AMD Zen 5 芯片组的支持,并优化了网络性能。新版内核使 Lemur Pro 等设备能支持 Intel Core Ultra 系列处理器。Thelio Major 的基准测试显示,相较于 6.6.6 内核,新内核性能有显著提升。
- 驱动与软件包:内核 6.8.2 与 Mesa 24.0.3 正在测试中。新版 Mesa 驱动实现了新的 Vulkan 和 OpenGL API,确保 Pop!_OS 能提供最佳的 Linux 游戏体验。
二、COSMIC 预测试版更新
1. 主题支持
- GTK 应用主题化:已为 GTK 3、GTK 4 以及 Flatpak 打包的应用添加主题支持。用户可在“外观”设置中启用全局主题选项,自定义主题将动态应用到这些应用中。
- 自定义图标主题:图标主题功能已实现,同时适用于 COSMIC 和 GTK 应用。
- 明暗模式切换:支持根据时间自动在明暗模式间切换。
2. 新版 COSMIC 应用商店
正在构建的新应用商店采用 COSMIC 应用设计风格,设有侧边栏,可用于探索精选应用、按类别浏览、管理已安装应用和执行更新。
3. 简化的窗口移动
不再需要精确点击标题栏移动窗口。现在,按住 Super 键并点击窗口的任意区域即可拖动窗口,提升了操作便捷性。
4. COSMIC 设置
- 键盘设置:新增键盘设置页面,支持添加和管理键盘输入源(如不同语言或布局),并通过备用字符键或组合键输入特殊字符。
- 设备名称编辑:在“关于”设置页面中,系统设备名称现在可编辑。
- Dock 与面板设置重置:新增将 Dock 和面板设置重置为默认值的功能。
- 电源状态提醒:为低电量、电量危急状态以及充电器插拔添加了声音和通知。
- 屏幕显示(OSD):亮度、音量和飞行模式的调节 OSD 显示已实现。
5. COSMIC 核心应用
COSMIC Edit(编辑器)、COSMIC Terminal(终端)和 COSMIC Files(文件管理器)仍在持续开发中,用于测试开发体验并优化 libcosmic 组件库。
三、社区贡献
- 窗口管理增强:社区成员 Ryanabx 开发了用于切换工作区的触控板手势、Dock 中打开窗口的缩略图预览,以及将窗口拖动到屏幕边缘时的快速吸附分屏功能(支持半屏和四分之一屏)。
- 新应用开发:
- Edfloreshz 创建了 COSMIC Tasks 应用,用于创建待办事项列表,该开发过程为 libcosmic 组件库添加了重要组件。
- 社区已开始开发多个第三方项目,包括剪贴板管理器、风扇控制 GUI 和表情符号选择器。
四、合成器 (cosmic-comp) 更新
- 修复了多个与 Xwayland 相关的问题。
- 通过新增
linux-drm-syncobj-v1Wayland 协议改善了 NVIDIA 显卡兼容性(需配合即将推出的 NVIDIA 555 驱动)。 - 实现了更可靠的屏幕捕获功能(cosmic-screencopy-v2)。
- 添加了对键盘 LED(如大写锁定指示灯)的支持。
- 改进了触摸屏体验,支持通过触摸拖动和调整窗口大小。
五、其他修复与优化
- COSMIC 面板组件(applets)现编译为单一二进制文件,提升了性能并减少了 115 MB 的磁盘占用。
- 在 iced、libcosmic 和 COSMIC Files 中实现了拖放支持。
- 在应用列表中点击应用的中键现在会打开一个新窗口。
六、初步性能对比
在 Unigine Superposition 和《赛博朋克2077》的基准测试中,使用 AMD 和 NVIDIA 显卡的机器上,COSMIC 预测试版与 Pop!_OS 22.04 LTS(使用 GNOME 桌面)的游戏帧率差异在 1% 以内。虽然优化工作尚未完成,但初步结果表明 COSMIC 的游戏性能与现有成熟桌面环境相当。
七、活动预告
System76 CEO Carl Richell 和 UX 架构师 Maria Komarova 将出席 LinuxFest Northwest(4月27日),现场展示 COSMIC 桌面环境。
25. Implementing Natural Conversational Agents with Elixir (seanmoriarity.com)
文章主要介绍了作者使用Elixir语言及其生态系统(Phoenix、Nx、Bumblebee等)构建名为Nero的自然对话代理的实践过程,包括实现原理、技术优化与遇到的挑战。
项目背景与目标
作者此前构建的Nero助手依赖浏览器交互,无法进行自然对话且无记忆。受Retell公司高质、低延迟的对话代理演示启发,作者旨在利用Elixir实现一个具有“始终在线”录音、低延迟、支持中断等自然对话特性的代理。
核心技术实现
始终在线录音:
- 改用
getUserMediaAPI和AnalyserNode实时监测麦克风音量。 - 通过设定音量阈值触发录音开始,引入静默超时(
SILENCE_TIMEOUT)检测语音结束。 - 加入预录音缓冲区以解决语音起始截断问题。
- 后期改进:采用Silero VAD模型(1ms推理时间)在服务器端进行更精准的语音活动检测。
- 改用
端到端对话流程:
- 语音转文本(STT):客户端预处理音频后上传,服务器使用Nx.Serving运行Whisper模型进行转录。
- 语言模型生成:将对话历史发送至GPT-3.5流式获取回应。
- 文本转语音(TTS):通过ElevenLabs WebSocket API流式合成语音并播放。
- 智能功能:利用Instructor库实现会话结束判断、通话挂断及信息提取(如预约详情)。
延迟优化:
- 调整静默超时时间。
- 使用ElevenLabs的Turbo模型和流式延迟优化。
- 保持WebSocket连接以减少握手开销。
- 切换至GPU加速Whisper推理,使用半精度浮点(F16)。
- 设置16kHz音频采样率以平衡质量与传输开销。
- 使用预设语音并优化生产环境配置。
- 最终将本地GPU上的响应延迟优化至约1秒。
对话体验改进:
- 中断支持:客户端检测到新语音时,向服务器发送事件以中断当前播放并开始新录音。
- 声音过滤:应用浏览器原生音频处理选项(回声消除、噪声抑制),并使用双二阶滤波器限制语音频率范围。
- 静默提示与挂断:在用户静默超时后发送“还在吗?”提示,再次超时则自动结束通话。
关键挑战与见解
- VAD的复杂性:简单的音量阈值易受环境噪声、键盘声等干扰,工程化的VAD方案虽有改善但仍有局限,最终采用机器学习模型。
- 延迟瓶颈:整个流程涉及多个网络调用和推理步骤,优化后仍与Retell的演示存在差距。
- 技术栈优势:Elixir/Phoenix的并发模型、LiveView的实时交互及Nx的机器学习集成非常适合构建此类系统。
- 未来方向:作者认为端到端的联合语音/文本模型(如语音直接到语音)是趋势,并期待本地部署大型模型(如Mistral)以进一步降低延迟。
开源与总结
作者将最终实现为开源WebSocket服务器,可供多种语言集成。尽管未达到商业级体验,但项目展示了Elixir在构建实时对话代理方面的潜力,为后续开发提供了坚实基础。
26. Math Puzzles (jrmf.org)
数学谜题游戏集锦
这是一份面向不同年龄段(从幼儿到高中生)的数学谜题游戏列表,主要分为逻辑、数字和形状三大类别。游戏旨在通过趣味方式培养逻辑推理、数学计算和空间想象能力。
主要游戏类别与示例
1. 逻辑类游戏
这类游戏侧重于策略、推理和模式识别。
- 通用游戏(如“苹果采摘”、“桥梁”、“巧克力盒子”等)通常需要玩家根据规则完成特定任务,例如构建连接、破解密码或避免不利选择。
- 中高年级游戏(如“3-in-a-Row”、“Chomp”、“星战”、“河内塔”等)通常更具竞争性或挑战性,要求玩家运用更复杂的逻辑来获胜或解谜。
2. 数字类游戏
这类游戏围绕数字运算、模式和关系展开。
- 通用游戏(如“捕获”、“宾果骰子”等)可能涉及简单的数字操作或概率。
- 中高年级游戏(如“算术谜题”、“猫咪、狗狗和老鼠魔术”、“质数立方”等)需要更深入的数学知识,如找规律、解方程或运用质数概念。
3. 形状类游戏
这类游戏关注几何、空间推理和图形变换。
- 通用游戏(如“颜色三角”、“五格拼板”等)可能涉及拼图、着色或识别对称性。
- 中高年级游戏(如“台球几何”、“地图着色”、“微笑脸谱”等)则要求玩家运用几何定理解决实际问题或进行图形构造。
共同特点
所有游戏均设计为互动性强、寓教于乐,旨在通过具体谜题激发玩家对数学和逻辑的兴趣。
27. How Antithesis finds bugs (antithesis.com)
Antithesis是一款能够高效探索复杂系统状态空间并快速发现漏洞的平台。其核心技术是确定性虚拟机(deterministic hypervisor),不仅能精准复现找到的漏洞,也大幅提升发现漏洞的能力。Antithesis团队曾通过自动化运行和破解《超级马里奥兄弟》游戏,展示了该平台的强大能力。仅提供马里奥的坐标和关卡信息等少量提示,平台即可自主找到通关方案,并在普通2018年CPU上约45分钟完成。平台还能够生成游戏过程中活动热图,显示其主要探索区域,并通过精确配置在高难度ROM修改版本(如Kaizo hack)中自动运行,不需任何参数调整或人为干预,即可首次运行时表现优异并找到漏洞。
平台甚至能够到达《超级马里奥兄弟》中的隐藏“Minus World”,证明其自动系统能高效探索并破解游戏庞大状态空间。从游戏验证可见,Antithesis探索能力并非仅限于传统软件测试,游戏状态空间更复杂、更难以遍历,这也进一步证明其在实际软件工程中的广泛应用潜力。Antithesis能为客户高效发现系统漏洞和故障、提升软件质量和开发效率。
28. OpenMCT: A web based mission control framework (github.com)
Open MCT(Open Mission Control Technologies)是由美国宇航局(NASA)艾姆斯研究中心开发的下一代任务控制框架,可在桌面和移动设备上实现数据可视化。NASA已将其应用于航天器数据分析、实验性探测车系统的规划与操作。作为开源、通用的框架,Open MCT适用于任何产生遥测数据的系统的规划、操作和分析应用开发。
本地开发与运行流程包括:安装Git和Node.js,克隆源码(git clone https://github.com/nasa/openmct.git),建议使用nvm管理Node版本后,安装开发依赖并启动本地开发服务器。Open MCT采用npm和webpack构建。
文档和教程:所有文档和开发教程可在官网获取,主要帮助开发者学习插件开发和应用构建。
兼容性与环境支持:项目快速迭代,支持广泛的浏览器、操作系统和NodeJS API。建议使用prebuilt的npm仓库作为依赖,更易构建和维护。若作为Git依赖进行构建,需手动执行npm run build,以应对供应链攻击风险。
插件机制:Open MCT通过插件扩展功能,插件是可添加或移除的一组软件组件,包括源码和资源(如图片、HTML模板)。核心代码库也以插件形式构建。插件开发相关信息见API文档。
测试体系:自动化测试覆盖单元、端到端(e2e)、视觉、性能和安全领域。
- 单元测试使用Jasmine和Karma,测试脚本以Spec.js命名,配置见karma.conf.js。
- e2e、视觉和性能测试基于Playwright,在
e2e/tests/目录下,文件名以*.e2e.spec.js模式,具体执行命令可参考README。 - 每次提交会进行CodeQL安全测试,报告生成至CircleCI和codecov.io,测试覆盖详情汇总于Circle CI仪表盘。
术语表:主要术语定义如下
- plugin:可移除、可复用的软件元素组合,应用由插件组成。
- composition:一个领域对象组成的对象集合,描述其子对象层级。
- description:对象属性,为用户提供可读描述。
- domain object:用户有意义的对象,左侧树状结构内每个项目均为领域对象。
- identifier:用于唯一标识领域对象的命名空间和键组合。
- model:领域对象的持久状态,能转换为JSON。
- name:对象属性,为用户提供可读名称。
- navigation:应用当前导航状态。
- namespace:用于标识持久化存储的名称。
Open MCT 2.0.0已移除对传统bundle API和Angular 1.x的支持。若需兼容旧代码,可使用过渡性插件,但该插件未来不会长期维护。识别旧API方法包括检查文件名和调用legacy相关方法。如果仍在使用旧API,请参考现代API,或在GitHub讨论区提问。
相关仓库:
- openmct-tutorial:初学者插件开发与扩展教程。
- openmct-quickstart:Open MCT与Apache、YAMCS遥测、Couch DB集成示例。
- Open MCT YAMCS Plugin:YAMCS遥测与命令服务器集成插件。
- openmct-performance:性能测试资源。
- openmct-as-a-dependency:高级构建与测试指南。
Open MCT主要作为用户自定义插件和打包的依赖,被建议配合HTTP服务器(如Apache/Nginx)部署,实现数据的可视化与实时控制。
29. Chinchilla Scaling: A replication attempt (arxiv.org)
文章摘要:Chinchilla Scaling 的复制尝试
本文是对Hoffmann等人(2022)提出的计算最优缩放定律的复制尝试研究。作者重点评估了原研究中的第三种估算方法,该方法涉及从原论文图表中重建数据并拟合参数化损失函数。研究发现原报告的估计存在多个问题,而作者的重新推导则与原始研究中的其他方法一致。
主要发现:
- 不一致性:原报告的第三种估算方法与Hoffmann等人提出的第一和第二种方法不一致。
- 拟合失败:该方法无法有效拟合从图表中提取的数据。
- 置信区间问题:报告了不合理的窄置信区间,理论上需要超过600,000次实验才能达到如此精度,但原研究很可能仅运行了不到500次实验,这使结果缺乏可信度。
作者贡献:
- 通过重新推导第三种方法,作者获得了与Hoffmann等人第一和第二种估算方法兼容的结果,验证了缩放定律的一致性。
- 这凸显了在科学复制中严格验证估算方法的重要性,避免因数据重建或统计问题导致误导性结论。
研究背景:
- 原研究(Hoffmann et al., 2022)旨在为大型语言模型训练确定计算资源最优分配的缩放定律,提出三种独立估算方法。
- 本文聚焦于第三种方法,旨在通过复制来检验其稳健性,从而确保缩放定律在实际应用中的可靠性。
总结: 本研究通过复制尝试揭示了原估算方法的缺陷,并提供了一种更可靠的替代推导,增强了计算最优缩放定律的实证基础。
30. Hardest Problem in Computer Science: Centering Things (tonsky.me)
文章核心观点
尽管现代CSS(如Flexbox和Grid)提供了简单的居中方法,但在实际应用中,从大型科技公司到小型产品,垂直和水平对齐问题依然普遍且棘手。这主要源于字体度量、行高、图标处理等技术细节的复杂性,以及开发者与设计师对“居中”理解的实践落差。
主要问题与原因分析
字体度量是主要元凶
- 许多流行字体的内部度量(如上升部、下降部、大写字母高度)比例不平衡。
- 设计工具和浏览器默认使用字体的完整边界框(从上升部到下降部)进行居中计算,这导致文本视觉重心偏离,产生明显的错位。
- 例如,Segoe UI字体度量偏移约10%,在特定字号和缩放下会造成明显的像素级错位。
行高复杂性
- 行高 (
line-height) 的计算涉及字体度量、默认值继承等多个因素,不同元素(如输入框、按钮、文本)的默认行高不同。 - 跨不同容器对齐不同行高的元素极其困难,往往需要手动覆盖大量默认样式。
- 行高 (
图标与图标字体的困境
- 图标对齐:图标作为内联元素,其边界框与文本的边界框对齐规则复杂,
vertical-align属性的值无法完美对齐图标与文本。 - 图标字体的弊端:将图标放入字体文件带来了灾难性的后果:
- 尺寸和间距无法像图片一样精确控制,不同图标在同一字号下表现不一。
- 导致渲染模糊、对齐失准(如macOS计算器按钮、系统运算符)。
- 本质上是用处理复杂文本对齐的工具去处理简单矩形,本末倒置。
- 图标对齐:图标作为内联元素,其边界框与文本的边界框对齐规则复杂,
其他挑战
- 形状不规则:如三角形等非矩形图标,需要视觉补偿而非严格的数学居中。
- 水平居中:水平方向同样存在因边距、内边距处理不当导致的对齐问题,常源于设计或实现的疏忽。
- 工具与实践脱节:理论知识充足,但在实践中,设计师可能交付未考虑对齐细节的设计稿,开发者也可能因项目压力或惯性而忽略精细调整。
解决方案与建议
对字体设计师
- 调整字体度量,理想情况下满足:
上升部 - 大写字母高度 ≈ |下降部|。 - 这能让文本块的实际视觉中心与其边界框中心重合,简化居中计算。
- 推荐使用已优化此问题的字体,如 SF Pro Text、Inter。
- 调整字体度量,理想情况下满足:
对开发者(Web端)
- 针对特定字体:若字体已知,可通过查询其OpenType度量(
ascender,descender,sCapHeight),计算并添加补偿性的padding-bottom。 - 图标对齐:使用
vertical-align: baseline,然后根据(图标高度 - 大写字母高度) / 2的计算值进行偏移。 - 彻底弃用图标字体:改用具有明确宽高的SVG或图像格式。决策流程应优先考虑图片格式。
- 视觉补偿:对于需要光学调整的不规则形状,将其包裹在足够大的矩形内,在其中心视觉平衡图标。
- 针对特定字体:若字体已知,可通过查询其OpenType度量(
对所有人(设计师与开发者)
- 提高意识与关注度:居中虽是小问题,但糟糕的对齐会破坏优秀的UI设计,而精确的对齐能显著提升产品质感。
- 协作与严谨:在设计到开发的交付流程中,应明确并重视对齐细节,共同追求高质量的实现。
结论
“居中”问题本质上是字体渲染、布局计算与视觉感知之间复杂交互的体现。解决它需要字体设计师、开发者和设计师共同努力:优化字体度量、理解工具局限、弃用不合理的实践(如图标字体),并始终对细节保持专注。最终目标是创造视觉上平衡、舒适、美观的用户界面。
31. Multi-tenant queues in Postgres (docs.hatchet.run)
本文探讨了在基于Postgres的任务队列中实现公平排队策略,以防止某个用户(例如Bob)的大量任务挤占其他用户(例如Alice)资源的问题。作者以文件上传处理为场景,指出当引入任务队列后,默认的按ID排序仍可能导致不公平,并介绍了他们提出的确定性轮询队列解决方案。
核心问题:传统的任务队列(如默认按任务ID排序)无法保证多租户环境下的公平性。一个租户的大量任务可能阻塞其他租户的小任务。
首次尝试与瓶颈:作者首先尝试使用Postgres的PARTITION BY窗口函数为每个租户的任务分配行号,以实现轮询取出。但这种方法存在两个严重问题:
- 并发锁冲突:由于
FOR UPDATE不能与窗口函数直接结合使用,引入CTE后可能导致在并发工作进程中仅有一个进程能有效获取任务,降低吞吐量。 - 性能衰减:窗口函数需要扫描所有
QUEUED状态的行来计算分区,随着队列积压(如1万条以上任务),查询时间显著增长,最终可能超过轮询间隔,导致任务丢失和系统性能不可恢复地下降。
解决方案:写入时分配序列号:为解决性能问题,核心思想改为在任务写入时就分配一个能保证轮询公平性的ID,而非在读取时计算。算法如下:
- 将BigInt ID空间划分为固定长度(
blockLength,如1048576)的区块。 - 为每个租户组维护一个指针
p(i),指向该组最后入队任务所在的区块。 - 维护一个全局指针
p_max_assigned,指向当前最大已分配任务ID所在的区块。 - 新任务入队时,根据组指针和
p_max_assigned计算其所在区块,并分配一个形如组ID + blockLength * 区块号的唯一ID。
这种方法确保了不同租户的任务ID在序列上交错分布,因此默认的ORDER BY id查询自然实现了轮询效果。
性能优势与权衡:
- 读取高效:查询性能接近常数时间(仅需扫描有限数量的行),解决了大规模队列下的性能退化问题。
- 写入开销:写入操作变慢,因为需要更新租户组和地址指针表,但仍是常数时间操作。若对写入吞吐量要求极高,可结合窗口函数与溢出队列机制。
扩展:并发限制:通过限制每个租户组的任务ID搜索范围(例如min_id到min_id + blockLength * concurrency),可以轻松实现每组的任务并发数限制,进一步防止资源挤占。
总结:本文提出了在Postgres中实现多租户公平队列的确定性轮询方案,通过精心设计的任务ID分配算法,将公平性保障从“读取时计算”转变为“写入时预设”,从而保证了高并发下的读取性能与队列的公平性。该方案已在Hatchet项目中实现。