2024-05-29

48 篇热帖

1. TTE: Terminal Text Effects (chrisbuilds.github.io)

TTE:终端文本特效 总结

TTE (Terminal Text Effects) 是一个在终端环境中为文本添加丰富动画效果的工具。其内置库包含了大量预定义的动画特效,每个特效都拥有一系列可配置的命令行参数,用于精细调整动画的颜色、速度、方向、符号和过渡效果。

核心功能与使用方式

TTE 主要通过命令行接口调用。用户选择一个特效名称(如 beams, matrix),并附带一系列参数来定制动画。所有特效都遵循类似的参数结构,主要围绕以下方面进行配置:

关键配置参数类型

  1. 颜色参数

    • 支持 XTerm 颜色代码(0-255)或 RGB 十六进制值(如 00D1FF)。
    • 常见参数:--final-gradient-stops(最终文本梯度颜色)、--*-colors(特效特定元素颜色,如 --ball-colors)。
    • 梯度参数通常与 --*-gradient-steps(梯度步数)和 --*-gradient-direction(梯度方向:diagonal, horizontal, vertical, radial)配合使用。
  2. 速度与时间参数

    • --*-speed--*-speed-range:控制动画元素或整体动画的移动速度,通常以每帧为单位。
    • --*-delay:控制动画元素出现或动作的间隔帧数。
    • --*-frames:控制特定动画阶段(如梯度过渡)的持续帧数。
    • --*-duration:控制动画阶段的持续时间(帧数或秒数)。
  3. 方向参数

    • --*-direction:控制动画或梯度的方向,常见选项包括 diagonal, horizontal, vertical, radial
    • 特定特效可能有更专业的方向选项,如激光蚀刻的 etch-direction 或扫除的 wipe-direction
  4. 符号参数

    • --*-symbols:指定动画中使用的字符符号。可以是单个字符或一组字符,用于创建序列动画。
  5. 行为与概率参数

    • 控制动画的触发条件、循环次数或随机事件概率,如 --pop-condition(气泡破裂条件)、--cycles(循环次数)、--smoke-chance(产生烟雾的概率)。
  6. 缓动函数

    • 许多运动相关的参数支持 --*-easing 选项,用于控制动画的加速和减速曲线。
    • 函数名称需加上前缀:IN_(缓入)、OUT_(缓出)、IN_OUT_(缓入缓出),例如 IN_OUT_SINE, OUT_BOUNCE

主要内置特效概览

TTE 内置了数十种特效,主要包括:

  • 光束与光线类Beams(光束划过)、Highlight(高光扫过)、LaserEtch(激光蚀刻)。
  • 粒子与物体类BouncyBalls(弹跳球)、Bubbles(气泡)、Fireworks(烟花)、Rain(雨滴)、Spray(喷射)。
  • 解构与重组类Blackhole(黑洞)、Burn(燃烧)、Crumble(崩塌)、Unstable(不稳定)、ErrorCorrect(纠错)。
  • 显现与书写类Matrix(数字雨)、Decrypt(解密)、Print(打印)、RandomSequence(随机序列)、Wipe(擦除)、Sweep(清扫)。
  • 运动与变形类Slide(滑入)、Expand(扩展)、Pour(倾倒)、Overflow(溢出)、MiddleOut(中间展开)、Scattered(散射)、Slice(切割)、Swarm(蜂群)。
  • 图案与循环类ColorShift(色移)、SynthGrid(合成网格)、Rings(环)、Waves(波浪)、VHSTape(录像带效果)、Thunderstorm(雷暴)。

每个特效都通过其专属的命令行参数提供高度的自定义能力,允许用户创建从细微到夸张的各种终端文本动画。

2. I sold TinyPilot, my first successful business (mtlynch.io)

作者出售首家成功企业 TinyPilot 的经历总结

创业背景与 TinyPilot 的诞生

  • 作者离开谷歌工作后,经历两年创业失败,亏损严重。
  • 2020年中,他为消遣制作了一款可通过浏览器控制家庭服务器的设备,命名为TinyPilot
  • 相关博客文章在 Hacker News 和 Reddit 获得广泛关注,产品需求激增,迅速售罄。

企业发展与出售决定

  • 四年间,作者将 TinyPilot 发展为拥有7名团队成员、年营收100万美元的企业。
  • 出售原因
    • 渴望回归编程工作,减少硬件企业管理带来的压力。
    • 计划与妻子组建家庭,希望降低事业压力。
  • 寻找买家挑战:TinyPilot 是硬件、软件和电商的混合体,难以归类,且只有两个主要产品(SKU)占收入98%,传统经纪人(FE International)认为不符合多数买家偏好。

优化企业与重启销售

  • 为降低运营压力,作者在2023年停止硬件改版外包核心职能(库存、组装、发货),这意外提升了盈利能力和吸引力。
  • 参加 Microconf 会议后,联系到经纪人 Quiet Light,将其定位为电商业务,按2.9倍年利润标价59.9万美元。
  • 最初两个月缺乏优质报价,直到2024年1月出现两位潜在买家。

谈判与交易过程

  • 第一位买家 Scott 初始出价50万美元,被拒绝;第二对买家撤回兴趣。作者一度担心错失机会。
  • 不久后 Scott 提出以标价59.9万美元购买,作者接受。
  • 尽职调查阶段耗时3个月,压力巨大:无定金、需反复提供敏感信息,且作者谈判地位随时间下降。
  • 2024年4月12日交易完成,作者收到尾款。

出售详情

  • 成交价:59.8万美元(约2.4倍年收益)
  • 扣除费用:经纪人佣金8.89万美元、法律费用1.83万美元
  • 作者净收益:49.08万美元
  • 付款方式:全额现金支付
  • 作者义务:提供免费咨询(30天)和付费咨询(45天,180美元/小时)
  • 四年总利润(含出售收入):约92万美元

出售后感受

  • 作者未感到强烈身份丧失或遗憾,视企业为“稳健小生意”。
  • 数周后焦虑逐渐消退,感觉轻松。
  • 买家 Scott 保留全部团队,继续发展产品。

未来计划

  • 妻子怀孕,短期内专注于家庭。
  • 寻求能灵活中断的简单项目。
  • 希望在博客和业务间建立良性循环,通过写作吸引客户、资助写作。

关键时间线

  • 2023年10月:与 Quiet Light 签约并上架
  • 2024年1月:接受意向书
  • 2024年4月3日:贷款获批,确定关闭日期
  • 2024年4月12日:完成交易
3. AI headphones let you listen to a single person in crowd, by looking at them (www.washington.edu)

AI耳机系统:通过注视特定人物实现定向收音

华盛顿大学研究团队开发了一种名为“目标语音聆听”的人工智能系统。该系统允许佩戴搭载麦克风的普通耳机用户,通过注视目标说话人三至五秒进行“注册”,随后耳机将实时过滤掉环境噪音,仅播放该注册对象的声音。即使用户移动或不再面向说话人,系统仍能持续跟踪并播放其语音。

该系统依赖于机器学习软件,在板载嵌入式计算机上运行,通过学习目标说话人的声音特征来锁定其语音。在测试中,21名受试者对注册后语音的清晰度评分比原始环境音平均提高近一倍。系统目前每次仅能注册一名说话人,且无法在目标说话人方向同时有其他大声语音干扰时工作。若音质不理想,用户可重新注册以提升清晰度。

这项研究基于团队此前的“语义听力”技术,未来计划扩展至耳塞和助听器。相关成果已发表于ACM CHI人机交互会议,代码已开源供进一步开发。

5. API Shouldn't Redirect HTTP to HTTPS (jviide.iki.fi)

API 不应将 HTTP 重定向至 HTTPS

背景

用户浏览器访问 HTTP 网址时,服务通常会重定向到 HTTPS 页面。这种方式虽有助于向加密网络过渡,但存在安全隐患:第三方或网络中介可在初始 HTTP 流程中窃取密码等敏感信息,甚至通过中间人攻击进行冒名。后续技术如 HSTS、浏览器预加载列表和仅限 HTTPS 模式进一步增强了安全性,但这些措施主要适用于面向用户的网站。

API 主要由软件程序消费,而非用户浏览器,因此相同的可用性论证并不适用。且多数编程 API 客户端不会像浏览器一样维护 HSTS 等状态。本文指出,鉴于这些因素,应重新考虑 API 从 HTTP 重定向到 HTTPS 的常见做法。

案例:一个拼写错误引发的问题

在一次第三方 API 集成中,基础 URL 被误输入为 http://... 而非 https://...。由于该第三方 API 对所有请求均返回 301 重定向至 HTTPS,Node.js 的 fetch 自动跟随重定向,导致 API 密钥以明文形式在网络上发送了一次,随后才发送至加密端点。这个简单的拼写错误若未在代码审查中发现,可能使 API 密钥长期暴露。

快速失败原则

API 将 HTTP 重定向到 HTTPS 且客户端自动跟随重定向时,容易掩盖 URL 拼写错误,导致敏感数据在开发或生产环境中以明文传输。遵循快速失败原则更为理想:未加密的 API 调用应立即以明显方式失败,让开发者尽早发现并修正错误。

最佳解决方案是完全禁用 API 服务器的 HTTP 接口(例如不响应 80 端口连接)。若无法完全禁用(如 API 路径与网站共用域名),则应对 /api 路径下的未加密 HTTP 请求返回 403 错误及描述性信息,而非重定向。此外,任何通过未加密连接发送的 API 密钥都应被视为已泄露并立即撤销。

调查:知名 API 的实践

作者对多个知名 API 进行了测试,发现部分 API 已采用错误响应而非重定向:

  • 返回错误或断开连接:Stripe、Google Cloud、Shopify、NPM Registry、Fastmail 等。
  • 仍重定向 HTTP 到 HTTPS:ActiveCampaign、Atlassian Jira、Anthropic、Auth0、Cloudflare、GitHub、GitLab、OpenAI、Slack、Twitter 等。
  • 以明文响应(未强制 HTTPS):AWS(部分端点)、Mailchimp Transactional、Mailgun、VirusTotal 等。作者已通过安全渠道向这些提供商报告了问题。

最佳实践需要更新

面向用户的应用重定向 HTTP 到 HTTPS 被广泛视为最佳实践(如 OWASP 推荐),但针对 API 的相关建议较少。作者建议,在推荐重定向的文档中应明确注明 API 不适用此做法,并已就此事向 OWASP 提出修订建议。

结论

将 HTTP 重定向到 HTTPS 对 API 弊大于利,因为 API 客户端通常自动跟随重定向且不维护状态,导致敏感数据可能以明文泄露。应采取以下措施:

  1. 禁用 HTTP 接口对未加密请求返回明确错误
  2. 自动撤销通过未加密连接发送的 API 凭据。
  3. 修订安全最佳实践,明确建议 API 直接拒绝未加密请求。
8. Show HN: Openkoda – Open–source, private, Salesforce alternative (github.com)

Openkoda:开源的Salesforce替代方案

Openkoda是一个开源的、私有化的平台,旨在加速构建企业系统、SaaS应用和内部工具。它提供MIT许可证,无厂商锁定,支持无限用户,并承诺开发速度提升60%

核心优势与定位

  • 企业级基础:内置身份验证、基于角色的安全控制、高级用户管理、多租户支持、多组织支持、SQL报告、REST API、文件管理、完整审计追踪、自动备份及管理后台。
  • 减少开发成本:提供行业特定的应用模板(如嵌入式保险、理赔管理、保单管理、物业管理、时间跟踪),预置功能可直接使用。
  • 灵活可扩展:使用动态实体构建应用,支持多种多租户模型。
  • 开放技术栈:基于Java、Spring Boot、JavaScript、HTML、Hibernate、PostgreSQL等开发者熟悉的技术。
  • 高度可定制:提供无限的自定义和集成选项。

快速开始与安装

最快启动方式:使用Docker Compose脚本。运行命令后,通过本地URL访问Web应用,默认管理员凭据为 admin / admin123

两种安装选项

  1. 作为Docker容器运行:从Docker Hub拉取镜像,需预先配置好PostgreSQL数据库及环境变量。也可使用包含数据库的Docker Compose脚本。
  2. 从源代码构建:需要Git、Java 17、Maven 3.8+、PostgreSQL 14+。通过Maven构建,并使用特定命令初始化数据库和运行应用。

主要功能特性

  • 企业应用基础:用户管理、多租户、管理员面板等开箱即用。
  • 行业模板:提供预定义的数据模型、仪表板和业务功能。
  • 数据模型构建器:通过UI动态创建和自定义数据库表与视图。
  • 仪表板构建器:拖放方式创建自定义数据仪表板。
  • 智能报告:支持SQL报告生成、AI自然语言查询(企业版)及数据可视化。
  • 自动化:邮件发送、应用内通知、文档生成(PDF/Word/Excel)、业务流程自动化、自定义逻辑。
  • 集成:自动更新的REST API、可与Slack、Jira等外部应用集成,支持UI自定义集成(企业版)。
  • 安全与管理:高级用户管理、基于角色的安全模型、自定义权限。
  • 多租户:支持多组织,可进行物理数据分离和集群部署。
  • 文件管理:集中管理文件,支持数据库、本地文件系统或Amazon S3存储(企业版)。
  • 数据导入导出:支持CSV/Excel数据导出,组件可导入导出为ZIP包(企业版可生成Maven项目)。
  • 控制与维护:完整审计追踪、应用与数据自动备份、系统健康与日志监控。

集成与技术栈

  • 集成:支持与多种第三方服务集成。
  • 技术栈:Java 17+、Spring Boot 3.x、Hibernate、PostgreSQL、GraalVM。

示例应用与贡献

提供示例应用模板(如时间跟踪、保险保单管理、天气应用)帮助快速入门。平台鼓励社区贡献,遵循标准的Git工作流(Fork、创建功能分支、Push、创建Pull Request)。

Openkoda持续迭代,定期发布更新以增强功能和修复问题。

9. You can force employees back to the office, but not the good ones (www.rte.ie)

远程办公员工表现出更高的工作效率与满意度,甚至超越传统办公模式。疫情结束后,许多企业推动员工重返办公室,但相关强制政策可能适得其反,导致经验丰富的管理人员和顶尖员工大量流失。这类人才流失可能对组织造成严重负面影响。

疫情期间,员工远离了通勤、办公室政治、繁冗会议等传统办公环境的负担,工作满意度和生产力明显提升。随着疫情结束,企业普遍推行重返办公室政策,但其理由往往含糊,部分可能源于管理层对空置办公空间的担忧。

有证据表明,强制返岗政策可能导致组织失去最有价值的员工。员工在疫情期间已习惯远程工作,逐渐认识到无需严格监督也能高效完成工作,传统雇主与员工间的权力平衡已被打破。

返回办公室的员工主要分为两类:一是认为现场办公有助于职业发展、希望获得晋升者;二是因家庭、社区义务或技能限制而难以转换工作的员工。若企业仅通过强制政策迫使员工返岗,可能最终只留住这两类群体,反而削弱组织整体竞争力。

为鼓励员工重返办公室,企业应阐明其对员工和组织的实际益处,而非仅强调“企业文化”等模糊理由。同时,提供足够激励以补偿员工因返岗增加的时间与经济成本,比单纯施加压力更有效。

管理层需意识到,过去那种自上而下、不顾员工感受的强硬政策已难以推行。拥有技能和经验的优秀员工在就业市场有更多选择,企业若不能适应新的工作模式,可能面临人才被竞争对手吸引的风险。这一趋势也促使企业重新思考管理模式,以适应不断变化的劳动力需求。

10. Show HN: Slipshow – A presentation tool not based on slides (github.com)

Slipshow 是一种创新的演示工具,其核心特点与传统幻灯片不同。它采用称为“滑移”(slip)的单元,内容长度不受限,演示过程中通过“滚动”来逐步展示内容,使呈现更加连续流畅。

主要创新点:

  • 滚动式内容展示:替代传统的切换幻灯片,通过垂直滚动逐步揭示内容。
  • 手绘记录与回放:支持在准备阶段录制手绘内容,并在演示时自动回放。
  • 自定义脚本支持:允许添加脚本以实现动画等效果,增强演示清晰度。

技术特点:

  • 使用扩展 Markdown 语法编写内容,可编译为独立的 HTML 文件,支持在任意浏览器中离线查看。

开发与资源:

  • 完整文档和教程位于 ReadTheDocs。
  • 开发欢迎提交 Pull Request、报告问题、提出功能建议或文档改进。
  • 2025 年由 NLNet 基金会通过欧盟委员会资助的 NGI Commons 基金赞助开发。
  • 采用 GPLv3 许可证,部分代码使用其他开源许可。

更多信息可访问官方网站:https://slipshow.org

12. How Running a Business Changes the Way You Think (2011) (www.kalzumeus.com)

运营企业如何改变你的思维方式

作者 Patrick McKenzie 通过分享个人经历,探讨了创业如何深刻改变个人的认知模式和价值观。

核心动机与自我认知

  • 作者从小是“表扬寻求者”,追求好成绩并非出于对知识的热爱,而是为了获得父母、老师的认可。这种对表扬(多巴胺释放)的驱动也影响了他对写作和参与网络社区的热情。
  • 他认识到金钱本身并非核心动力,而是将其视为优化复杂系统(如商业运营)的记分工具,享受通过优化赢得游戏的过程。

职业选择的转变

  • 作者曾追求稳定的大公司职业生涯,为此学习日语、赴日工作,但在日本大企业担任“工资奴隶”期间(每周工作70-90小时),他意识到这种生活方式并非必然选择。
  • 他发现可以在互联网上自主创办软件企业,且热爱创业的各个方面,这与在大公司的体验形成鲜明对比。
  • 他指出,关于“努力工作就能成功”的叙事并非真理,职业选择是涉及生活地点、幸福感等多维度的复杂空间,而非常见的线性关系。

工作与生活的可协商性

  • 创业让他认识到许多社会规则(如必须每周工作五天、公司忠诚度等)是可协商的。
  • 强调个人应根据自身价值观做出选择,而非盲目接受“标准”安排。例如,工程师可以坚持使用自己喜欢的技术栈,或通过谈判获得更灵活的工作时间。
  • 公司忠诚度被视为一种人造概念,作者选择将忠诚保留给人,而非公司这种法律实体。

对金钱态度的演变

  • 随着收入增长,作者将金钱视为达成目标的工具,而非束缚。例如,搬家时选择付费雇佣他人,以节省时间用于更重要的工作,而非亲自完成。
  • 这种从“节俭生活”到“用钱换时间与价值”的转变,体现了创业带来的优先级重构。

自信的建立

  • 作者曾受自信问题困扰,导致在咨询定价时低估自己的价值。
  • 通过实际尝试(如主动联系他人、逐步提高咨询报价),他发现许多担忧是多余的。例如,Thomas Ptacek 提醒他,他本应为一次咨询收取远高于他最初报价的费用。
  • 创业实践让他学会主动提出需求、进行谈判,并意识到大部分拒绝并不会导致灾难性后果,从而提升了自信。

创业如何重塑个人

  • 作者变得更加自信、健康,姿态也更挺拔。他能够将市政官员、航空公司员工等视为服务提供者,以专业、平等的态度协商解决问题。
  • 在考虑是否接受投资时,他通过反思(“为什么要投资?”)明确了保持现状、做自己热爱之事的价值,避免了为了虚荣或单纯增长而改变生活轨迹的决策。

总结

作者通过创业经历,实现了从被动追求外部认可到主动构建个人价值体系的转变。他重新定义了成功、工作与金钱的关系,认识到生活选择具有高度可协商性,并在此过程中获得了更大的自信与生活满意度。创业不仅改变了他的职业,更深刻重塑了他的思维方式和生活状态。

14. Writing an NVMe Driver in Rust [pdf] (db.in.tum.de)

该论文介绍了在Rust语言中开发一个高性能用户空间NVMe驱动程序(名为vroom)的过程,并通过评估证明其可行性。

核心目标与动机

传统Linux I/O API(如pread/pwritelibaioio_uring)因依赖内核路径而存在开销,难以充分发挥现代NVMe SSD的极限性能。现有的高性能用户空间解决方案如SPDK虽然性能卓越,但其C语言代码库复杂且存在内存安全风险。Rust语言以其内存安全、无垃圾回收和零成本抽象的特性,被认为是开发系统级驱动程序的理想选择。本研究旨在使用Rust创建一个设计简洁、性能可与SPDK媲美的用户空间NVMe驱动,以简化对高性能存储特性和I/O路径优化的探索。

实现关键点

  1. 用户空间架构:驱动完全运行在用户空间,避免了内核上下文切换和中断处理的开销。通过内存映射(MMIO)访问PCIe设备的配置和寄存器,并使用VFIO框架确保安全的DMA访问。
  2. 内存管理:为DMA分配使用2MiB大页内存,因其物理地址在Linux中是固定的,并通过/proc/self/pagemap获取物理地址。这实现了零拷贝I/O操作。
  3. 驱动设计:采用轮询(poll-based)模式。核心结构NvmeDevice封装了设备初始化、管理队列和I/O队列。为实现多线程I/O,定义了NvmeQueuePair,允许每个线程拥有独立的提交和完成队列,从而实现无锁操作。
  4. I/O操作:提供了零拷贝(read/write)和非零拷贝(read_copied/write_copiedbatched_read/batched_write)等方法。非零拷贝方法将数据复制到预分配的DMA缓冲区。

性能评估

在三星970 EVO Plus SSD上,将vroom与SPDK、io_uringlibaiopread/pwrite进行了对比测试。

  • 吞吐量:在随机读写测试中,vroom的IOPS与SPDK非常接近(相差在1%以内),两者均明显优于Linux内核I/O API。例如,在队列深度32、4线程的随机读测试中,vroom达到444 KIOPS。
  • 延迟vroom的平均延迟和尾部延迟(第99、99.99百分位数)与SPDK基本一致,比io_uringlibaio低约8-13微秒。这主要得益于避免了系统调用的开销。

结论与展望

本研究成功证明了使用Rust开发高性能、内存安全的用户空间NVMe驱动是可行的。vroom在保持代码相对简洁的同时,实现了与SPDK相当的性能。未来的工作包括:支持更多NVMe特性(如SGL)、集成IOMMU支持(以去除root权限需求)、优化中断与轮询模式的性能对比,以及扩展块设备和文件系统层以填补当前安全、高性能且易用的I/O引擎的空缺。

15. Training is not the same as chatting: LLMs don’t remember everything you say (simonwillison.net)

LLM训练与交互的常见误解

核心观点: 许多人误以为在聊天中与大型语言模型(如ChatGPT)的每一次对话都会被直接用于模型的“训练”和记忆,但实际上这是一种对技术原理的误解。

一、LLM的工作原理:无状态函数

  • 本质是函数调用:LLM可视为无状态函数,其输入是当前对话的完整上下文(包括用户与模型双方的历史发言)和用户新的提示,输出是接下来最可能的文本序列。
  • 对话独立且短暂:每次开启新聊天,模型的短期记忆即被重置,所有对话相互独立。模型不会在会话间保留或学习特定用户的信息。
  • 上下文长度限制:模型在单次对话中能“记住”的内容受其上下文长度(以token计)限制,超长对话会遗忘开头的细节。

二、澄清“训练”的真正含义

  • 训练发生在部署前:真正的模型训练包含两个阶段:
    1. 预训练:使用海量文本数据(如书籍、网页)通过计算密集型过程学习词语间的统计关系。
    2. 微调:通过指令学习或基于人类反馈的强化学习(RLHF)优化模型,使其生成更符合人类期望的回复。
  • 训练后的模型是静态的:完成训练后,模型的参数(权重)是固定不变的庞大文件,除非供应商发布新版本,否则不会因用户交互而改变。

三、为何人们仍有担忧?

  • 服务条款模糊:许多LLM提供商的条款允许他们利用用户内容“改进服务”,其具体含义不透明,可能导致用户数据被用于未来模型的训练(尽管通常是匿名化和去隐私化处理)。
  • 隐私与安全风险:用户输入通常会被记录用于合规或滥用监控,存在潜在的数据泄露风险。
  • 信任危机:公众对提供商声称的“不使用数据训练”声明普遍持怀疑态度。
  • 本地模型的误解:运行本地模型可确保数据不上传,但它本身也不会通过与用户的聊天来持续学习和进化。

四、“记忆”功能与政策影响

  • 记忆功能是特例:如ChatGPT的“记忆”功能,是通过将特定信息(如用户姓名、偏好)作为上下文注入未来对话来模拟记忆,用户可查看和编辑这些记忆条目。
  • 糟糕的政策基于错误认知:如果企业管理者或立法者基于“LLM会即时记忆并学习用户输入”这一错误前提制定政策(如全面禁止使用),可能导致不必要的限制,或制定出针对虚构风险而非真实风险的法规。

总结: 理解LLM的无状态特性及其训练过程的真相,对于正确使用工具、评估相关隐私风险以及制定合理政策至关重要。

16. DuckDB Doesn't Need Data to Be a Database (www.nikolasgoebel.com)

DuckDB 无需存储数据即可作为数据库

现代数据库的核心优势在于将数据的内部表示(如磁盘存储)与使用方式分离,甚至可以将查询运行与数据存储置于不同硬件上。数据库技术已发展到不再直接存储数据,而是通过结构和访问机制独立于物理磁盘存在。

DuckDB 是为此时代设计的数据库,特别适用于云数据场景。以机器人出租车服务为例,每日行程数据以 Parquet 文件形式存储在对象存储(如 S3)中。若需与分析师共享特定数据集(如异常行程),无需传输全部数据或大量链接,只需通过 DuckDB 创建一个轻量级数据库文件:

  1. 创建虚拟数据库:通过 CREATE VIEW 定义视图,从 S3 中的 Parquet 文件选择特定列并应用过滤条件(如 fare_amount > 100),生成一个不含实际数据的 .db 文件。
  2. 分享与访问:将该文件上传至对象存储,分析师通过单一链接即可附加该数据库,并查询视图。
  3. 按需加载数据:首次查询时,DuckDB 仅下载视图所需的列,并在传输过程中过滤无关数据,实现高效部分读取。

此方式确保了数据访问的稳定性:无论底层数据格式、分区或模式如何变化,用户的视图始终可用。DuckDB 充当了数据云的浏览器,使关系数据集仅需一个超链接即可访问。

17. Elixir and Machine Learning in 2024 so far: MLIR, Arrow, structured LLM, etc. (dashbit.co)

Elixir 机器学习生态2024年进展摘要

Elixir社区自2021年起致力于将Elixir与机器学习结合,截至目前,其核心生态系统(包括Nx、Explorer、Scholar等项目)已取得多项重要更新。

1. Numerical Elixir (Nx) Nx项目在Elixir生态中扮演类似NumPy的角色,支持CPU和GPU的即时编译。

  • 核心更新:Nx v0.7版本将其底层从Google XLA迁移至MLIR。这一转变预计能为Elixir数值计算带来新可能,包括:
    • 对Apple Silicon Metal的支持。
    • 量化技术的支持。
    • 交叉编译至嵌入式设备(如Android和iOS移动设备)的能力。
  • 该项目由Paulo Valente和DockYard主导推进。

2. Explorer Explorer项目为Elixir提供Series和DataFrame功能,其设计受Tidyverse的dplyr启发。

  • 核心更新:Explorer v0.8版本实现了与Arrow数值类型的完全兼容,并新增了列表和结构体数据类型的支持。伴随新类型,项目增加了相应的处理函数,如字符串分割为列表、列表合并为字符串、成员关系检查、长度计算、JSON解码等。
  • 其他改进包括增强了对从S3兼容存储进行流式数据输入/输出的支持(适用于.parquet等多种格式),使其成为更强大的数据分析和工程工具。

3. Scholar Scholar项目专注于传统机器学习算法,功能类似scikit-learn,是对Nx在深度学习之外的补充。

  • 核心更新:Scholar v0.3引入了多项新功能:
    • LargeVis:用于大规模高维数据在低维空间的可视化。
    • KDTree与RandomForestTree:作为k近邻分类与回归的算法。
    • 层次聚类:支持平均、完全、单一和加权链接。
    • 新的降维与流形算法,如TriMap。
    • 对现有算法和度量进行了优化并添加了新函数。
  • 这些功能使开发者能够在Elixir生态系统内,利用Nx及其跨CPU和GPU的分布式模型服务能力,处理更广泛的机器学习问题。

4. 新兴项目与学习资源

  • 新项目:社区成员推出了如instructor_ex这样的项目,它基于Elixir的Ecto数据工具包,为LLM提供结构化提示支持。Elixir的langchain库也持续更新,支持更多第三方API以及通过Bumblebee在Elixir中实现的模型。
  • 学习资源:社区产出了大量内容,例如Andrés Alejos关于Livebook(被称为Elixir的秘密武器)的文章。此外,推荐参考Sean Moriarity的《Machine Learning in Elixir》一书进行深入学习,以及Chris Grainger关于“在BEAM上运行生产环境机器学习一年”的演讲,以了解Elixir机器学习的实际价值。

总体而言,Elixir的机器学习生态系统持续扩展,在数值计算、数据处理和传统/深度学习等多个层面不断增强,逐步覆盖更广泛的问题领域。

18. What We Learned from a Year of Building with LLMs (www.oreilly.com)

本文基于作者团队一年来在构建基于大语言模型(LLM)应用过程中的实践经验,总结了关键教训与方法论,旨在为从业者提供实用指导。文章聚焦于战术层面的核心组件与最佳实践。

核心内容概要

  1. 提示工程是基础,但需谨慎设计

    • 利用基础技术:推荐使用少量样本提示(n-shot,建议n≥5)、思维链(CoT)及提供相关资源(如通过RAG)。CoT建议具体化步骤以减少幻觉。
    • 结构化输入与输出:为输入添加序列化格式(如XML、JSON、Markdown)以提供上下文线索;使用结构化输出简化系统集成。不同模型对格式有偏好(如Claude偏好XML,GPT偏好JSON/Markdown)。
    • 避免“上帝对象”式提示:应将复杂任务分解为多个小而专注的单一功能提示,以便于迭代、评估和维护。
    • 精心构建上下文:仔细审视发送给模型的完整上下文,去除冗余和矛盾信息,并优化其结构以突出关系。
  2. 检索增强生成(RAG)优于微调,但需优化

    • RAG是引入新知识的首选方法,因其在性能、更新成本、安全控制和粒度方面优于微调。
    • 检索质量决定输出质量:需从相关性信息密度细节程度三个维度优化检索文档。
    • 结合关键词搜索与向量搜索:关键词搜索(如BM25)在精确匹配、可解释性和效率上有优势;混合搜索通常效果最佳。
    • 长上下文模型不会淘汰RAG:模型仍需可靠的信息筛选,且超长上下文的推理能力和推理成本仍是挑战。
  3. 优化工作流以提升性能

    • 采用多步骤流程:将复杂任务分解为更小、更简单的步骤(如AlphaCodium案例),可显著提升准确性。
    • 优先确定性工作流:虽然AI代理具有动态性,但其不确定性导致可靠性差。建议让代理生成确定性计划,然后以结构化、可复现的方式执行。
    • 超越温度调节获取多样化输出:除了调高温度,可通过打乱输入顺序、记录近期输出并避免重复、变化提示措辞等方法增加输出多样性。
    • 重视缓存:缓存可节省成本、消除延迟并降低风险,尤其适用于唯一ID标识的输入或可归一化的开放查询。
  4. 评估与监控至关重要

    • 创建基于断言的单元测试:使用生产样本,围绕至少三个标准(如包含/排除特定短语、长度范围)构建测试,并在任何管道更改时触发。
    • 合理使用LLM作为评估者:通过成对比较、控制位置偏见、允许平局、使用思维链等方法,可使其成为有效的初步评估工具,但非万能。
    • 简化标注任务:二元分类(是/否)和成对比较比Likert量表更精确、一致且高效。
    • 警惕过度优化特定评估:如过度强调“大海捞针”测试可能导致模型在提取和总结任务上性能下降(古德哈特定律)。
    • 处理幻觉与输出安全:幻觉是顽固问题(基准率5-10%)。需结合提示工程(如CoT)和下游事实性护栏。同时,LLM常在不该输出时输出,需设置内容审核等护栏。

总结与前瞻

文章强调,构建有效的LLM应用远不止于简单的提示设计,而是一项需要工程化思维的系统工作。作者团队(包括来自亚马逊、Hex、UC伯克利的工程师和研究员)基于各自在顾问、研究、产品开发等不同角色的共同经验,提供了这套实践指南。本文是系列文章的第一部分(战术篇),后续还将探讨运营和战略层面的内容。

19. Qlock – A JavaScript Quine Clock (aem1k.com)

Qlock – JavaScript 自省时钟

Qlock 是一个极简的 JavaScript 程序(仅 321 字节),它同时实现了两个核心功能:

  1. 显示当前时间:采用经典的七段数码管样式(七段显示风格)在页面上呈现时间。
  2. 呈现自身源代码:作为一个自省程序,它的输出结果就是其自身的 JavaScript 源代码。

核心特性与技术要点

  • 本质是自省程序:程序的核心特性是能生成并输出自己的完整源代码。
  • 双重显示:在网页上,它同时展示当前的时间(格式化后的七段数字)和构成这个时钟的、完整的 JavaScript 源代码。
  • 极致精简:整个程序体积极小,压缩后仅 321 字节,体现了代码的高效与精巧。
  • 技术基础:充分利用了 JavaScript 动态执行代码(如 eval)和字符串操作的能力,将表示时间的逻辑和程序自身的代码结构融为一体。

总结

Qlock 是一个有趣的编程艺术作品,它巧妙地将显示时间的功能与程序自述(输出自身代码)结合在一起,通过极简的 JavaScript 代码实现,展示了该语言在表达上的灵活性和紧凑性。

20. ChatTTS-Best open source TTS Model (github.com)

ChatTTS:面向对话场景的开源文本转语音模型

项目概述

ChatTTS 是专为对话场景(如LLM助手)设计的文本转语音模型。项目仓库包含算法基础设施和简单示例,社区维护的扩展产品索引可在 Awesome-ChatTTS 仓库中找到。

支持语言

  • 英文
  • 中文
  • 其他语言(即将推出)

核心亮点

  • 对话优化:针对对话任务优化,支持多说话人交互,实现自然富有表现力的语音合成。
  • 细粒度控制:可预测和控制细微韵律特征,包括笑声、停顿和语气词。
  • 更佳韵律:在韵律表现上超越大多数开源TTS模型,并提供预训练模型以支持进一步研究。

数据集与模型

  • 主模型使用超过10万小时的中文和英文音频数据训练。
  • HuggingFace上发布的开源版本为未经SFT的4万小时预训练模型。
  • 重要提示:发布的模型仅用于学术目的。

路线图

  • 开源40k小时基础模型和说话人统计文件。
  • 流式音频生成。
  • 开源DVAE编码器和零样本推理代码。
  • 多情绪控制。
  • ChatTTS.cpp(欢迎在2noise组织中新建仓库)。

许可证

  • 代码:AGPLv3+ 许可证。
  • 模型:CC BY-NC 4.0 许可证。仅限教育和研究用途,不得用于商业或非法目的。作者不保证信息的准确性、完整性或可靠性。

免责声明

为限制潜在恶意使用,在训练4万小时模型时添加了少量高频噪声,并尽可能使用MP3格式压缩音频质量。内部已训练检测模型,计划未来开源。

安装与使用

安装要求

  • Python 3.11
  • 通过pip或conda安装依赖(requirements.txt
  • 可选安装vLLM(仅限Linux)
  • 注意:TransformerEngine 和 FlashAttention-2 目前不推荐安装,因其适配仍在开发中或可能影响性能。

快速开始

  1. 克隆仓库git clone https://github.com/2noise/ChatTTS
  2. 安装依赖pip install -r requirements.txt
  3. 启动WebUIpython examples/web/webui.py
  4. 命令行推理python examples/cmd/run.py "Your text." (音频保存至./output_audio_n.mp3

基本用法

import ChatTTS
chat = ChatTTS.Chat()
chat.load(compile=False)
texts = ["示例文本"]
wavs = chat.infer(texts)
# 使用torchaudio保存为wav文件

高级控制

  • 说话人采样:从高斯分布采样说话人音色。
  • 推理参数:可设置温度(temperature)、top_P、top_K等解码参数。
  • 文本控制
    • 句级控制:通过提示词(如[oral_2][laugh_0][break_6])控制口语化、笑声、停顿。
    • 词级控制:在文本中插入标记(如[uv_break], [laugh])实现精细控制。

常见问题

  1. 显存需求:生成30秒音频至少需要4GB GPU显存;在4090 GPU上,约每秒生成7个语义token,实时因子(RTF)约为0.3。
  2. 稳定性:自回归模型常见多说话人或音质问题,建议多次采样以获得合适结果。
  3. 控制范围:当前版本仅支持[laugh], [uv_break], [lbreak]词级控制;未来版本可能开源更多情绪控制模型。

致谢

感谢 bark、XTTSv2、valle、fish-speech、vocos 等项目以及 wlu-audio lab 的早期实验贡献。

21. Starlink's disruption of the space industry (www.thespacereview.com)

Starlink 对航天产业的颠覆性影响

自2019年首次专用发射以来,SpaceX的星链(Starlink)计划在五年内迅速发展,已发射超过6500颗卫星,其中6050余颗仍在轨运行,成为迄今规模最大的卫星星座,其数量远超其他所有在轨运行卫星的总和。

对SpaceX自身的变革 星链的成功与SpaceX的火箭复用技术相辅相成。星链对发射的高频需求(2023年96次猎鹰发射中63次为星链任务)迫使SpaceX不断优化流程、缩短发射间隔、提升助推器复用次数(纪录达21次),从而巩固了其在发射市场的领先地位并降低了成本。若无星链,SpaceX将不会是今天的发射巨头。

对卫星行业的冲击 星链以其低延迟、高带宽的宽带服务,冲击了传统的地球静止轨道(GEO)卫星运营商。GEO运营商被迫调整战略,纷纷推出“多轨道”计划以应对竞争:欧卫公司(Eutelsat)收购了OneWeb,SES继续建设其中轨道O3b星座,而SES与Intelsat近期达成的31亿美元收购案,部分动机也是为了优化多轨道投资、降低成本。TeleSat的Lightspeed星座则因融资困难和供应商更换而进展缓慢。

军事与地缘政治影响 星链在乌克兰冲突中发挥了关键作用,保障了通信,但也引发了争议。SpaceX曾限制其在特定区域用于进攻性目的。这凸显了商业公司对军事行动的影响力。SpaceX已推出军事版“星盾”(Starshield)服务,美国国家侦察办公室(NRO)最近的发射任务据信与该计划相关。

太空可持续性措施 面对数千颗卫星可能引发的碰撞风险和天文观测干扰担忧,SpaceX采取了系列措施:卫星具备自动避碰机动能力,与NASA等机构协调操作;同时开发了遮阳板等技术以降低卫星亮度。尽管未完全解决问题,但这些努力得到了天文学界的认可。

财务与商业前景 尽管SpaceX未公开详细财务数据,但第三方分析机构Quilty Space的模型显示,星链可能已实现盈利:预计2024年营收66亿美元,EBITDA为38亿美元,在扣除资本支出后,自由现金流约6亿美元,表明业务已自我维持。分析指出,星链的成功得益于其超高的用户增长(全球用户超300万)、面向支付能力强的“富裕市场”以及显著的卫星成本控制(V2 mini卫星成本约80万美元)。

竞争与未来挑战 亚马逊的“柯伊伯”(Project Kuiper)项目是星链的主要潜在竞争对手,计划发射超3000颗卫星,且依靠自有垂直整合能力,但其发射依赖尚未完全成熟的火箭(如新格伦、阿里安6)。其他公司如Rocket Lab也表达了运营自建星座的意向,强调需拥有自己的火箭和卫星。

星链也面临挑战:俄罗斯在乌克兰对其服务的干扰,以及其长期定价可持续性和服务真正普及至全球“未连接”地区的疑问,仍是其未来需要解决的问题。

22. Researchers cracked an 11-year-old password to a $3M crypto wallet (www.wired.com)

密码破解事件摘要

  • 事件背景:欧洲用户“Michael”在2013年使用RoboForm密码管理器生成了20位密码,保护含有43.6个比特币(当时价值约5300美元)的软件钱包。密码文件因损坏而丢失,导致无法访问资产。
  • 求助过程:Michael多次求助密码破解专家均被告知无法恢复。2023年6月,他成功说服知名硬件黑客Joe Grand参与破解,Grand与德国黑客Bruno合作进行逆向工程。
  • 技术漏洞:他们发现2013至2015年间的RoboForm版本存在严重缺陷——密码生成算法基于系统日期和时间,使得随机数可预测。若已知密码参数和生成时间范围,理论上可重现密码。
  • 破解尝试:由于Michael无法回忆密码生成的具体日期,团队先尝试2013年3月至4月的参数(含特殊字符),未果;后扩展至6月,仍失败。最终根据Michael提供的历史密码样本,将参数调整为不含特殊字符,于2013年5月15日成功匹配密码。
  • 结果与影响:破解成功时比特币单价约3.8万美元,Michael现持有30个比特币(价值约300万美元),并等待升值后出售。他庆幸早期丢失密码避免了低价抛售。
  • 后续风险:RoboForm开发商Siber Systems于2015年修复了该漏洞,但未通知用户更新密码。目前仍有大量用户可能使用2015年前生成的易破解密码,存在安全隐患。
23. California is about to side with PG&E – again – to kill community solar projects (www.sfchronicle.com)

总结内容

提供的文章内容未能加载,显示为错误消息。该错误消息指出网站的必需部分无法加载,可能由浏览器扩展、网络问题或浏览器设置引起。消息建议检查网络连接、禁用广告拦截器或尝试使用其他浏览器来解决问题。由于实际文章内容(关于加州可能再次支持PG&E以终止社区太阳能项目)未加载,无法对其主题进行总结。

24. Tinygrad 0.9.0 (github.com)

Tinygrad 0.9.0 版本摘要

总体状态:

  • 代码行数接近8000行限制(7958行),易用性显著提升。
  • 自0.8.0版本以来,提交了1200余次更新。

核心更新:

  • 文档与依赖: 发布新文档网站,将 gpuctypes 引入代码库,消除外部依赖。
  • 新实验后端: 引入 AMD=1NV=1 后端,无需用户空间运行时组件(如ROCm/CUDA),旨在减少Python执行时间,尤其在多GPU场景下。
  • 渲染与硬件支持:
    • PTX=1 支持直接渲染为PTX。
    • 新增Nvidia张量核心支持。
    • THREEFRY=1 实现无需NumPy的随机数生成。
  • API与多GPU: 多张量API进一步稳定,实现环形全归并以支持多GPU操作。
  • 架构重构: 核心tinygrad重构为4个模块。
  • 内核融合改进:
    • 线性化器和代码生成支持多输出内核。
    • 调度器大幅改进内核融合:融合ReduceOps及其元素操作子节点,减少约20%内核,提升mnist、gpt2训练及llama推理速度。
    • 新增 LoadOps.ASSIGN 融合优化器更新与梯度。
    • 内核按BFS顺序调度,提升resnet和llama速度。
    • 开发中:多个reduce的融合。

模型与示例支持:

  • 支持MLPerf ResNet、BERT及开发中的UNet3D。
  • 新增Llama 3支持,提供兼容OpenAI的API。
  • Llama示例支持NF4量化。
  • sparse_categorical_crossentropy 中添加标签平滑功能。

已知问题:

  • 在macOS的conda环境中使用METAL后端可能导致问题(详见#2226)。

相关资源:

  • 完整更新日志:v0.8.0...v0.9.0
  • 已知问题列表:GitHub Issues标签页
  • 社区支持:Discord频道
25. Simple Speech-to-Text on the '10 Cents' CH32V003 Microcontroller (github.com)

Simple Speech-to-Text on the '10 Cents' CH32V003 Microcontroller 摘要

项目概述

本项目在低成本的CH32V003微控制器上实现了简单的语音转文本功能,能够从模拟麦克风读取音频并识别口头数字“zero”到“nine”,结果通过串行链路记录。使用MAX4466麦克风放大板连接到CH32V003开发板,并通过WCH-LinkE适配器进行编程和UART转USB转换。

硬件与编译

  • 硬件连接:MAX4466麦克风的OUT引脚连接至PD4,VCC和GND对应连接;WCH-LinkE适配器的SWDIO/TMS连接PD1,RX连接PD5。
  • 编译:基于ch32v003fun库编译,将项目目录添加到“examples/”目录中即可。

技术实现与准确性

  • 准确性:当前代码识别口头数字的准确率约为90%,仍有改进空间。
  • 训练与开发:在training/目录中提供了简化的CH32V003程序,用于转储8位原始音频样本;桌面Linux程序用于训练和模拟整数处理管道。misc/目录中的C程序生成关键表格,如FFT twiddles(twiddles_RES13.h)、Mel矩阵(mel_mx.h)、DCT矩阵(dctm_20x8_8bit.h)和代码本(codebook.h)。

资源与挑战

  • 存储与内存:仅16K存储和2K RAM,限制了查找表、代码本和矩阵的大小(当前二进制约10K)。
  • ADC限制:CH32V003的ADC为10位,通过8倍过采样/平均补偿质量。
  • 其他限制:无I2S支持(不能使用数字麦克风);无浮点支持,所有代码使用整数/定点数学;无硬件乘法或除法,需高效音频处理以适应48MHz/100fps约束。

工作原理

  • 音频采样:定时器中断频率约50,000/sec,读取ADC并平均8个样本,生成约6400样本/sec的音频流。
  • 特征提取:每64样本(10ms)进行128点FFT,计算20个Mel频率分箱,转换为log2尺度,并通过DCT生成8个倒谱分箱。
  • 识别逻辑:当帧能量高于阈值时,添加到单词缓冲区;静默帧累积后,将单词长度标准化为16帧,与预存储样本比较,报告最佳匹配。

与常见系统的比较

  • 采样率:使用6400样本/sec(而非16,000样本/sec),足以处理语音形式(最高约3200Hz)。
  • 预处理:重度预加重(1.0)移除直流电平;使用20ms帧(而非25ms),保持10ms步进/100fps;不使用窗口函数,但通过噪声底移除补偿。
  • 特征简化:仅20个Mel分箱(常见为40或80);极端压缩通过DCT至8个倒谱分箱。

应用与未来

  • 应用潜力:可能作为低复杂度、低功耗、低成本的始终开启唤醒词引擎基础。
  • 未来改进:CH32系列新芯片将升级ADC至12位并添加硬件乘法指令,提升FFT和矩阵乘法速度,改进处理准确性。

动机

作者表示,在10美分微控制器上实现传统高端处理是一种挑战性探索。

26. Google Search document leak reveals inner workings of ranking algorithm (searchengineland.com)

谷歌搜索内部文档泄露揭示排名算法运作机制

事件背景

数千份据称来自谷歌内部“内容API仓库”的文档于2024年3月13日在Github上被一个自动化机器人发布。这些文档随后被SparkToro联合创始人Rand Fishkin和iPullRank首席执行官Michael King获得并进行了分析。此次泄露被认为是SEO和谷歌搜索历史上最大的事件之一,提供了对谷歌排名算法前所未有的内部视角。

关键发现

1. 排名系统结构

  • 文档记录了2,596个模块14,014个属性,信息截至2024年3月。
  • 文档未说明各特征的具体权重,仅证实了这些特征的存在。
  • 谷歌使用名为**“Twiddlers”**的重新排序函数,可调整文档的检索分数或改变排名。
  • 内容可能因多种原因被降级,包括链接与目标网站不匹配、用户满意度低、产品评论、地理位置、精确匹配域名、色情内容等。

2. 核心排名因素

  • 链接依然重要:链接多样性和相关性仍是关键,PageRank仍在算法中活跃,尤其首页的PageRank会被评估。
  • 用户点击信号:谷歌使用一系列点击指标(如badClicks, goodClicks, lastLongestClicks)评估内容质量和用户满意度,成功点击对排名至关重要。
  • 品牌影响力:分析者认为,建立强大、知名的品牌比任何单一SEO策略都更重要。
  • 实体与作者权威:谷歌存储内容关联的作者信息,并尝试验证实体是否为文档作者。
  • 网站权威性:存在名为**siteAuthority**的特征。尽管谷歌过去否认有此评分,但2011年曾公开表示“网站上部分低质量内容可能影响整个网站排名”。
  • Chrome浏览器数据:模块ChromeInTotal表明谷歌可能使用Chrome浏览器的数据用于排名。
  • 内容新鲜度:谷歌会检查署名日期、URL中的日期和页面内容中的日期。
  • 页面标题匹配度:存在titlematchScore特征,用于衡量页面标题与查询的匹配程度。

3. 其他细节

  • 白名单机制:存在与选举(isElectionAuthority)和COVID(isCovidLocalAuthority)相关的域名白名单。
  • 小型网站识别:有smallPersonalSite特征用于识别小型个人网站或博客,但如何影响排名尚不明确。
  • 内容处理:长文档可能被截断,短内容会根据原创性获得0-512分;涉及“你的金钱或你的生活”(YMYL)的内容(如健康、新闻)也会被评分。
  • 变更历史:谷歌保留所有索引页面的每个版本副本,但在分析链接时仅使用URL的最后20次变更。
  • 技术指标:谷歌存储域名注册信息,并测量文档中术语的平均加权字体大小。

行业解读与影响

  • 分析者Michael King指出,排名需要驱动更多成功的点击(通过更广泛的查询)并获得更多链接多样性。专注于吸引合格流量至更好的用户体验,将向谷歌发出页面值得排名的信号。
  • 此次泄露证实了谷歌在反垄断审判中使用点击数据(特别是其Navboost系统)进行排名的事实。
  • 谷歌随后发表声明回应,称文档缺乏上下文
  • SEO从业者Dixon Jones创建了一个可搜索14,000个谷歌搜索变量的工具,以帮助理解这些特征的存储和用途。

总结

此次内部文档泄露首次公开证实了谷歌搜索排名算法中长期被推测但未被官方确认的众多因素,尤其是用户交互数据(点击)、品牌建设、链接多样性和网站权威性的重要性。尽管未揭示具体权重,但为SEO从业者提供了优化方向:创建高质量内容、提升用户体验、构建品牌影响力并关注多样化的反向链接。

29. The government is making it more difficult to track private aircraft travel (www.popsci.com)

美国新法案限制追踪私人飞机,引发环境责任争议

法案核心内容

美国联邦航空管理局(FAA)最新授权法案包含一项关键修正案,使公众追踪和监控私人飞机飞行变得更加困难。新法律允许私人飞机所有者仅需通过申请程序声明存在安全或安保需求,即可隐藏包括航班号、呼号在内的所有可识别信息。此前,FAA虽已有数据隐藏计划,但飞机所有者信息仍需通过民航注册处公开,便于外界追踪。

环境问题的紧迫性

  • 碳排放对比:私人飞行仅占全球航空碳排放的4%,但最富有的乘客约贡献其中90%的污染
  • 具体数据:泰勒·斯威夫特2023年乘私人飞机飞行17.8万英里,排放约1200吨二氧化碳,是美国人均排放的83倍;埃隆·马斯克同期飞行约8600英里。
  • 极端案例:私人飞机4小时飞行的碳排放相当于一位普通欧洲公民全年的排放量

社会影响与争议

新法律被批评为主要服务于最富裕的飞行群体,使公众难以追究其过高的碳排放责任。此前,佛罗里达大学学生杰克·斯威因通过公开追踪名人航班数据引发关注,他指出:

  • 法律限制追踪:新法虽未完全禁止追踪,但增加了技术难度。
  • 应对态度:斯威因表示可通过上下文线索继续识别航班,并可能“更加坚定地推进追踪工作”。

现有追踪机制

此前,飞机所有者已可通过以下两种方式部分隐藏信息:

  1. LADD程序:要求FAA指示第三方服务隐藏航班信息。
  2. PIA程序:阻断部分飞行信息的未加密传输。

新法律将进一步扩大隐私保护范围,可能加剧公众监督与富豪隐私权之间的矛盾。

30. Three.js Shading Language (github.com)

Three.js 着色语言 (TSL) 规范概述

TSL 是 Three.js 提出的一种基于节点的着色器创建方法,旨在简化着色器的开发与维护。它将着色器逻辑抽象为可连接的节点,开发者在 JavaScript/TypeScript 中直接编写逻辑,而非传统的 GLSL 字符串操作。

核心目标与优势

  • 提升效率:通过节点图和声明式语法,降低着色器创建门槛,使动态效果开发更直观。
  • 维护性:代码模块化,支持树摇优化,避免了传统 onBeforeCompile 方式带来的代码碎片化与维护难题。
  • 跨平台:底层由 NodeBuilder 驱动,可输出 GLSL (WebGL2) 或 WGSL (WebGPU),实现跨渲染后端。
  • 自动优化:编译器自动处理变量复用、插值优化、类型转换及平台兼容性问题(如 WGSL 中的纹理采样修复)。
  • 深度集成:与 JS 生态无缝融合,支持函数式编程、类型检查、模块导入,并提供事件控制渲染流程。

架构与工作流程

TSL 的所有组件均继承自 Node 类。代码构建基于三个阶段:

  1. 配置 (Setup):使用 TSL 函数定义节点的输出逻辑。
  2. 分析 (Analyze):检查节点图,确定优化策略(如变量缓存)。
  3. 生成 (Generate):输出最终的着色器代码字符串。

核心功能与概念

基础单元

  • 常量与转换:提供 float(), vec3(), color() 等函数进行常量定义和显式类型转换。
  • Uniform:通过 uniform() 创建动态变量,并可用 .onFrameUpdate 等方法控制更新频率。
  • 变量:使用 .toVar()Var() 创建可复用的着色器变量,以优化性能或调试。
  • 数组:支持常量、动态值及 Uniform 数组的创建与索引。
  • Varying:通过 varying() 在顶点与片段阶段间传递插值数据。
  • 函数Fn() 接口支持多行代码、控制流和高级参数传递,也兼容内联箭头函数。
  • 操作与运算:提供完整的算术、比较、逻辑运算符(如 .add(), .mul(), .greaterThan()),以及数学函数(如 sin(), normalize(), mix())。

着色器构建模块

  • 纹理texture(), cubeTexture(), triplanarTexture() 等用于采样各类纹理。
  • 属性:便捷访问几何属性,如 uv(), vertexColor(), positionWorld, normalWorld
  • 摄像头与模型:直接获取 cameraViewMatrix, modelWorldMatrix 等内置矩阵与向量。
  • 屏幕与视口:提供 screenUV, viewportSize, viewportSharedTexture() 等用于屏幕空间操作。
  • 其他工具:包括 UV 工具(旋转、球面化)、随机数、振荡器、混合模式、雾效、颜色调整等。

流程控制

  • 支持 If-Else, Switch-Case, Ternary 条件判断。
  • 提供多种 Loop 循环形式及 Break(), Continue() 控制。

渲染管线与高级应用

  • 渲染管线:通过 RenderPipeline 构建完整的多 Pass 渲染流程。
  • 多渲染目标 (MRT):在单次绘制中输出颜色、法线、速度等多个缓冲区。
  • 后处理:内置 bloom, dof, smaa, ssr 等高级效果节点,可直接组合使用。
  • 计算着色器compute() 节点支持通用 GPU 计算,并提供原子操作和屏障。
  • 存储与结构storage() 用于读写 GPU 缓冲区;struct() 定义自定义数据结构。

节点材质系统

TSL 通过 NodeMaterial 体系极大扩展了标准材质。几乎所有材质属性(如 color, metalness, position, normal)均可被对应的 节点属性(如 .colorNode, .metalnessNode, .positionNode)替换。这允许用户在不改变光照模型的前提下,对材质的任何方面进行深度定制。文档列出了 MeshStandardNodeMaterial, MeshPhysicalNodeMaterial 等的具体可定制节点。

迁移与兼容性

文档末尾提供了从常见 GLSL 属性到 TSL 节点的映射表,例如:

  • positionpositionGeometry
  • vUvuv()
  • gl_FragColormaterial.fragmentNode 这有助于开发者从传统 GLSL 平滑过渡到 TSL。
31. A myopia epidemic is sweeping the globe (www.nature.com)

全球近视流行病正在加剧,尤其是在新冠疫情后,儿童近视率显著上升。户外活动时间是目前预防近视最有效的方法,但科学家们也在探索其他干预和逆转趋势的途径。

主要原因与现状

  • 新冠疫情期间,儿童居家学习、户外活动减少,导致近视发病率快速上升。
  • 亚洲地区,尤其是东亚国家,近视率尤为突出。

核心防护措施

  • 增加户外活动:每天保证足够的户外活动时间(例如2小时)被证明可以有效预防近视发生。

研究中的干预方法

  • 药物干预:使用低浓度阿托品眼药水可以有效减缓儿童近视的进展。
  • 光学干预:特殊设计的多焦点隐形眼镜和眼镜镜片(如离焦镜片)也被证明能控制近视加深。
  • 光疗探索:研究正在探索特定波长的光(如紫光、红光)对预防或逆转近视的潜在作用,相关设备(如特定光照眼镜)处于试验阶段。

未来方向: 科学家们正致力于开发更多安全有效的解决方案,包括上述的光疗、视觉训练以及更普及的早期筛查,以应对这一日益严重的公共卫生问题。

32. First Bioprocessor Powered by Human Brain Organoids (www.tomshardware.com)

瑞士生物计算初创公司FinalSpark推出了名为Neuroplatform的在线平台,提供对16个人类脑类器官的远程访问。该公司称其为全球首个提供体外神经元访问的在线平台,并声称此类生物处理器的功耗比传统数字处理器低百万倍。

该平台的核心创新在于采用“湿件”架构,即硬件、软件与生物学的混合。具体通过四个多电极阵列(MEA)容纳活体组织(类器官),每个MEA可容纳四个类器官,并通过八个电极进行刺激与记录。数据通过模数转换器传输,采样频率为30kHz,分辨率为16位。系统还配有微流体生命支持系统和监控摄像头,以及允许研究人员输入数据变量并读取、解析输出结果的软件堆栈。

FinalSpark表示,Neuroplatform具备学习和处理信息的能力,其低功耗特性有望大幅降低计算对环境的影响。公司举例指出,训练像GPT-3这样的单个大型语言模型需消耗约10吉瓦时能量,相当于欧洲公民年均能源消耗量的6000倍,而生物处理器的部署可显著减少此类能耗。

目前,FinalSpark已向九个研究机构开放其远程计算平台,以促进生物处理领域的研发。公司旨在与这些机构合作,打造全球首个活体处理器。此外,已有三十余所大学表达了对Neuroplatform的访问兴趣。教育机构可通过订阅方式访问该平台,每用户每月费用为500美元。

尽管硅芯片可持续使用数年甚至数十年,但构成生物处理器的神经元结构寿命较短。FinalSpark指出,类器官目前预计寿命约为100天,仅适用于运行数月的实验。早期其MEA仅能持续数小时,但经过系统改进后已延长了使用寿命。

33. Shadama: A particle simulation programming environment for everyone (tinlizzie.org)

Shadama:面向所有人的粒子模拟编程环境

概述

Shadama是一个编程系统原型,用于创建、控制和可视化大量对象。其执行模型基于StarLogo的"海龟与斑块"抽象,该方法已被证明有效且易于使用。主要目标是帮助高中生编写科学模拟程序。

核心特点

  • 即时更新:支持活性编程,程序更改保存后立即生效,无需重启模拟
  • GPU加速:程序通过翻译为OpenGL着色语言在GPU上运行,数据完全存储在GPU中以实现高性能
  • 技术要求:需要WebGL 2支持,性能受显卡浮点精度影响,在AMD Radeon显卡和Chrome/Firefox浏览器上表现较好

目标与设计理念

设计目标包括:

  1. 易学性:基于StarLogo的海龟与斑块模型,对熟悉Scratch的学生友好
  2. 开放性:系统可自行实现复杂行为,用户可查看、修改和理解各部分工作原理
  3. 大规模粒子支持:利用图形硬件处理大量数据,在易用性和高性能间取得平衡
  4. 活性支持:环境立即显示代码更改效果

技术实现

  • 基于Web技术构建,包括WebGL 2.0和OpenGL着色语言3.0
  • 使用Ohm库编写代码翻译器,生成顶点着色器、片段着色器和JavaScript代码
  • 每个品种和属性的值存储在单个OpenGL纹理中,使用R32F类型匹配浮点标量数组
  • 静态函数翻译为JavaScript代码,运行从Shadama方法派生的OpenGL着色器

语言核心概念

品种与属性

  • 使用breed语句声明品种,定义属性(目前仅支持标量浮点数)
  • 示例:breed MyBreed (x, y)创建具有x和y属性的MyBreed品种

方法定义

  • 使用def语句定义方法,指定品种行为
  • 方法只能从静态函数调用,应用于品种中的所有海龟并发执行

内置原语

  • setCount(count): 设置品种中海龟数量
  • fillRandom(name, min, max): 为属性设置随机值
  • fillRandomDir(dxName, dyName): 生成随机2D单位向量
  • fillSpace(xName, yName, xDim, yDim): 在网格上放置海龟
  • fillImage(...): 将图像转换为海龟品种

斑块

  • 二维单元格集合,存储值,默认大小512×512
  • 声明示例:patch Field (nx, ny)
  • 可作为方法参数传递,海龟可访问最近的斑块单元

变量作用域

  • 方法内使用var声明局部变量,作用域为整个方法
  • 静态函数变量在静态函数中声明,所有静态函数可见
  • 提供内置变量:鼠标事件、时间、画布尺寸等

并行性考虑

  • 多个海龟可能写入同一斑块单元,结果不确定
  • 属性更新在方法运行后才可见,需使用局部变量避免混淆

控制结构

  • 目前仅支持if语句,未来可能支持循环

原始函数

  • 提供许多原始函数,多数直接调用GLSL内置函数(如cos、step、abs、fract等)

当前限制

  1. 方法不能以品种作为参数
  2. 单个方法不能同时更新海龟属性和斑块属性
  3. 需要将更新拆分为两个独立方法或等待未来版本改进

结论与展望

Shadama提供了一个交互式图形环境,鼓励探索式编程。虽然存在当前限制,但未来计划支持3D模拟和更多数学概念(向量、矩阵)。该环境旨在通过利用计算设备的力量和普及性,为高中生提供一个引人入胜的开放环境来探索科学概念,从而提高科学素养。

34. Fast Shadow Stacks for Go (blog.felixge.de)

本文探讨了在Go运行时中通过软件影子栈(Shadow Stack)加速栈轨迹捕获的可行性,其灵感来源于Bytehound分析器的技术。

背景与核心思想
栈轨迹捕获需遍历调用栈帧并收集返回地址。在Go 1.21中已引入基于帧指针的链式遍历方式,速度较快。而传统DWARF展开方式依赖复杂的解码表,性能较差。Bytehound的优化方法包括预处理DWARF信息,并通过动态修改栈上返回地址、注入蹦床函数(trampoline)来避免重复遍历未变化的栈帧,从而实现缓存效果,这种缓存结构称为“影子栈”。

Go中的实现方案
作者在Go运行时中实现了ShadowFPCallers函数,结合帧指针展开与影子栈。主要改动包括:

  1. 在goroutine结构中增加shadowStack字段,存储缓存的返回地址列表。
  2. ShadowFPCallers函数在展开栈时,若检测到特定蹦床函数地址,则直接从影子栈复制地址,避免重复遍历;同时根据栈深度变化增量更新影子栈。
  3. 引入汇编实现的蹦床函数shadowTrampolineASM及其Go辅助函数,在返回时从影子栈弹出地址并恢复控制流。
  4. 修改Go的展开器(unwinder),使其能识别蹦床函数并正确处理栈轨迹,确保panic、异常及性能分析等功能正常。

性能评估
测试结果显示:

  • 最佳情况(固定栈深度循环捕获):影子栈方案比纯帧指针展开快约8倍。
  • 最差情况(栈深度动态变化):在浅栈(低于32帧)时性能下降可达4倍;仅在深栈时才表现出优势。

优缺点与结论
优点:

  • 软件影子栈可显著加速栈轨迹捕获,对DWARF展开也可能有效。
  • 实现代码量相对较少。

缺点:

  • 浅栈性能可能恶化。
  • 可能与未来硬件安全特性(如Intel硬件影子栈)冲突。
  • 会干扰外部展开工具(如perf)及依赖特殊控制流的程序。
  • 每个栈帧额外占用8字节内存。
  • 需谨慎处理以确保异常等情况下的展开正确性。

作者认为,鉴于Go执行追踪器等高负载场景中帧指针展开本身开销已极低(仅几个百分点),当前该技术虽有趣但非必需。未来若硬件影子栈能普及到用户空间,有望彻底取代DWARF展开,实现全面加速。

38. A robot will soon try to remove melted nuclear fuel from Fukushima reactor (apnews.com)

东京电力公司计划于今年10月前,首次使用遥控机器人测试清除福岛第一核电站2号反应堆内的熔融核燃料碎片。这款“望远镜式”可伸缩管道机器人已在神户的三菱重工造船厂进行演示,能通过机械爪抓取少量碎片。

此次测试原定于2021年底启动,已延误两年多,凸显了清理工作的复杂性。2011年因9.0级地震和海啸引发的核事故,导致三个受损反应堆内共残留约880吨高放射性熔融燃料。东京电力公司表示,此次测试移除量将少于3克,并强调这是退役工作的关键步骤。

政府与东京电力公司设定的30至40年清理目标被批评为过于乐观,因各反应堆损伤情况不同,需制定针对性方案。此前,该公司已向1号反应堆投放微型无人机,拍摄了机器人无法抵达区域的图像,以进一步了解燃料碎片状况。

40. Three Laws of Software Complexity (maheshba.bitbucket.io)

软件复杂性的三大定律

大多数软件工程师,尤其是从事基础设施系统工作的工程师,往往因三大基本定律而陷入不必要的复杂性困境。

第一定律:设计良好的系统终将退化为设计糟糕的系统

  • 核心定义:设计良好的系统指易于修改的系统;设计糟糕的系统指难以修改的系统。
  • 退化过程:任何对良好系统的修改(即使快速完成)都可能使其进入糟糕的设计状态,从而变得难以进一步修改。例如,一个原本支持多种存储引擎的数据库,一旦添加了依赖特定底层实现的接口,就可能丧失灵活性。
  • 必然结果:良好设计是不稳定的瞬时状态,而糟糕设计是稳定的持续状态。因此,代码的变更能力随时间持续下降。这导致大多数工程师将长期工作于设计糟糕的系统中。

第二定律:复杂性是护城河,由漏洞百出的抽象构成

  • 抽象设计的冲突:良好的抽象需要在提供应用功能与隐藏实现细节之间取得平衡。但在市场竞争中,为吸引应用开发者,系统设计往往倾向于提供更多功能,导致抽象出现“漏洞”。
  • 竞争壁垒:这种设计增加了市场份额,但同时也使底层实现难以替换。例如,ZooKeeper 和 Kafka 的某些语义极难在其他系统中复现。
  • 普遍现象:因此,许多成功且流行的系统本质上是设计糟糕的,其复杂性形成了竞争壁垒。

第三定律:软件复杂性没有上限

  • 复杂性来源:现实系统由多人长期构建,复杂性仅受限于人类的创造力与协作中的偶发因素。系统的设计往往受到开发者个人能力、哲学及组织内复杂激励因素的影响。
  • 无界特性:糟糕设计的系统尤其会积累无上限的复杂性,如同由无数未知开发者埋设的“复杂性炸弹”,对后来者构成持续挑战。

总结与应对思路

  • 工程师的现实:由于第一、第二定律,工程师大多工作于设计糟糕的系统中;而第三定律进一步加剧了此类系统的维护难度。
  • 作者提出的方案:在职业生涯中,作者倾向于从头构建新系统,以规避这三大定律的负面影响,但这具有极高挑战性。
41. USB disk as /dev/sda on a not-rooted smartphone using Termux, QEMU, Alpine Linux (gist.github.com)

本文详细介绍了如何在未获取root权限的Android智能手机上,通过Termux、QEMU和Alpine Linux操作系统,实现将USB存储设备重定向并挂载为虚拟机中的/dev/sda磁盘的完整流程。

核心目标与架构

该方案的目标是在未root的手机上,利用用户空间工具,将物理USB设备(如U盘)接入到运行在QEMU虚拟机内的Linux系统中。主要组件包括:

  • Termux:提供安卓上的终端环境。
  • termux-usb:Termux插件,用于在未root设备上访问USB设备。
  • usbredirect:一个工具,负责将本地USB设备通过网络重定向给QEMU虚拟机。
  • QEMU:创建和运行x86_64架构的虚拟机。
  • Alpine Linux:作为虚拟机中安装的轻量级操作系统。

环境准备与配置

操作环境为一部未root的Android 11手机,具备USB-C 2.0端口、3GB RAM和4核CPU。在Termux中需要创建三个独立会话:

  1. termux会话:用于执行主要命令和管理虚拟机。
  2. usbredirect会话:用于运行USB重定向服务。
  3. qemu会话:用于启动和交互虚拟机。

首先,在termux会话中创建一个用于存储虚拟机磁盘的目录,并生成一个3GB的raw格式虚拟磁盘文件vmtest

编译usbredirect工具

由于Termux仓库可能不提供最新或特定版本的usbredirect,文章指导用户从源码编译:

  1. 下载meson构建系统和usbredir项目源代码。
  2. 使用meson配置和编译usbredir项目,其中包含usbredirect工具。
  3. 需要替换项目中的usbredirect.c源码文件为一个针对Termux环境的修改版本。

安装与配置Alpine Linux虚拟机

  1. 启动与安装:在qemu会话中,使用一条复杂的qemu-system-x86_64命令启动虚拟机。该命令指定了内存、CPU、USB控制器(ICH9 EHCI/UHCI)、虚拟磁盘、网络端口转发(如将宿主机的9022端口映射到虚拟机的22端口用于SSH)以及用于文件共享的9p虚拟文件系统。通过该虚拟机启动Alpine Linux ISO镜像,并使用setup-alpine命令完成系统安装到vmtest虚拟磁盘。
  2. 后续配置:安装完成后,重启虚拟机,通过SSH(ssh root@127.0.0.1 -p 9022)进行配置:
    • 挂载通过9p协议共享的宿主机目录(如Termux内部存储)。
    • 安装大量额外的软件包,以支持文件系统操作、网络服务(如vsftpd)、文档等。
    • 配置vsftpd服务器为被动模式和匿名模式,方便通过FTP协议在宿主机(Termux)和虚拟机之间传输文件。
    • 调整内核参数和模块(如fuse)以支持后续操作。

USB设备重定向与使用

文章展示了两种将USB设备重定向到虚拟机的方法:

方法一:动态连接(运行时添加)

  1. 在usbredirect会话中,使用termux-usb命令获取已连接USB设备的访问权限,并运行编译好的usbredirect,将其监听在本地端口(如10000)。
  2. 在termux会话中,通过QEMU监视器套接字(qemu.socket)发送命令,动态添加USB重定向设备:
    • chardev-add socket,host=127.0.0.1,port=10000,id=c1
    • device_add usb-redir,chardev=c1,id=u1,debug=3
  3. 之后,可在虚拟机内通过lsusblsblk等命令查看设备,并将其挂载使用。

方法二:启动时预配置(在QEMU命令中指定) 在启动虚拟机的QEMU命令中加入-chardev socket-device usb-redir参数,这样虚拟机启动时便会自动等待并连接由usbredirect服务转发的设备。

示例与验证 文章通过一个完整示例,演示了:

  • 将一个1GB的文件从手机内部存储通过lftp客户端上传到虚拟机挂载的USB磁盘中。
  • 在虚拟机内校验文件哈希值,确认数据传输无误。
  • 也演示了同时重定向多个USB设备(通过USB Hub)的场景。

总结

该方案通过用户空间工具链(Termux、QEMU、usbredirect)在未root的Android设备上虚拟化出一个完整的Linux环境,并将物理USB设备安全地重定向给该虚拟机使用。这为在移动设备上进行存储操作、系统测试或运行特定Linux软件提供了强大而灵活的途径。主要步骤包括环境准备、编译关键工具、安装配置Alpine虚拟机,以及通过重定向机制连接USB设备。

44. The obscure intelligence bureau that got Vietnam, Iraq, and Ukraine right (www.vox.com)
45. Productivity Versus Alignment (www.zaxis.page)

生产力与对齐的根本权衡

本文探讨了组织内部 “生产力”与“对齐” 之间存在的根本性权衡。

核心矛盾

  • 促进对齐(如史蒂夫·乔布斯通过设计办公空间增加偶然互动)旨在通过跨团队交流激发创新与统一,但这会增加沟通成本,可能降低执行效率
  • 追求生产力(快速迭代、减少会议)虽能提高执行速度,但可能导致团队间信息不同步、忽略关键输入,从而引发错误或功能不一致。

矛盾产生的原因

  • 随着项目利益相关者数量的增加,沟通渠道的数量会呈指数级增长(公式:关系数 = n(n-1)/2)。
  • 大量沟通带来的组织开销既拖慢了执行速度,也抑制了新想法的产生。
  • 然而,完全切断沟通(如不纳入法务、财务团队)又会导致关键信息遗漏和后期风险。

图表化权衡: 作者用一张图表描绘此权衡:横轴为生产力,纵轴为对齐。两者呈负相关关系。例如,苹果公司因其极致的产品整合体验,选择了高对齐的位置,但这需要耗费大量时间进行内部协调。

核心观点与结论

  1. 权衡不可避免:无论企业是否主动选择,都会处于该权衡曲线的某个位置上。
  2. 主动选择优于被动接受:最坏的情况是让随机性决定公司的位置。企业应有意识地在追求快速迭代(高生产力、低对齐)和追求内部共识(高对齐、低生产力)之间做出战略选择。
  3. 对初创公司的启示:早期公司往往选择“快速迭代”,尽管这会伴随混乱和不一致,但这是为了验证想法而有意承担的风险。

最终落脚点: 文章以幽默引用作结:“会议是限制人类潜力的关键词”,以此强调对每一次沟通(或取消沟通)的决策都应有其明确目的,而非例行公事。

46. Webview: Tiny cross-platform webview library for C/C++ (github.com)

Webview: 跨平台 Webview 库

项目概述

Webview 是一个用于 C/C++ 的轻量级跨平台 Webview 库,旨在为现代跨平台 GUI 构建提供通用的 HTML5 UI 抽象层。其核心特性是支持双向 JavaScript 绑定,允许从 C/C++ 调用 JavaScript,以及从 JavaScript 调用 C/C++。

平台支持

平台 使用的技术
Linux GTK, WebKitGTK
macOS Cocoa, WebKit
Windows Windows API, WebView2

前置条件与依赖

  • 编译器:必须支持 C++11(Windows 上需要 C++14)。
  • 构建系统:推荐使用 CMake 和 Ninja,但非必需。
  • 平台依赖
    • Linux/BSD:需要安装 GTK 和 WebKitGTK 开发库(具体包名因发行版而异)。
    • macOS:需要链接 WebKit 框架和 dl 库。
    • Windows:需要 WebView2 运行时(Windows 11 之前版本需额外安装),并链接多个 Windows 系统库。

核心功能与快速入门

库提供了 C 和 C++ 的 API。

C++ 示例 (main.cc):

#include "webview/webview.h"
int main() {
    webview::webview w(false, nullptr);
    w.set_title("Basic Example");
    w.set_size(480, 320, WEBVIEW_HINT_NONE);
    w.set_html("Thanks for using webview!");
    w.run();
}

C 示例 (main.c):

#include "webview/webview.h"
int main(void) {
    webview_t w = webview_create(0, NULL);
    webview_set_title(w, "Basic Example");
    webview_set_size(w, 480, 320, WEBVIEW_HINT_NONE);
    webview_set_html(w, "Thanks for using webview!");
    webview_run(w);
    webview_destroy(w);
}

构建步骤(使用 CMake):

  1. 创建 CMakeLists.txt 并使用 FetchContent 获取 Webview 库。
  2. 运行构建命令:
    cmake -G Ninja -B build -S . -D CMAKE_BUILD_TYPE=Release
    cmake --build build
    
  3. 可执行文件位于 build/bin 目录。

也可以使用非 CMake 方式,直接调用编译器并链接相应依赖。

自定义与配置

CMake 目标

  • webview::core:C++ 头文件。
  • webview::core_shared:C 语言共享库。
  • webview::core_static:C 语言静态库。

主要 CMake 选项

项目提供了丰富的 CMake 选项,例如:

  • WEBVIEW_BUILD_AMALGAMATION:构建合并的库文件。
  • WEBVIEW_BUILD_SHARED_LIBRARY / WEBVIEW_BUILD_STATIC_LIBRARY:构建共享/静态库。
  • WEBVIEW_WEBKITGTK_API:(Linux)指定使用的 WebKitGTK API 版本。
  • WEBVIEW_USE_BUILTIN_MSWEBVIEW2:(Windows)使用内置的 WebView2 加载器。

编译时宏

可通过预处理器宏进一步定制,例如:

  • WEBVIEW_GTK / WEBVIEW_COCOA / WEBVIEW_EDGE:强制选择特定后端。
  • WEBVIEW_MSWEBVIEW2_BUILTIN_IMPL:控制是否使用内置的 WebView2 实现。

其他信息

  • 线程安全:库函数通常不保证线程安全。应使用 webview_dispatch() / webview::dispatch() 将任务调度到主/GUI 线程执行。
  • 限制:浏览器引擎功能有限,不支持如 alert(), console.log() 等特定浏览器功能。
  • 语言绑定:为多种语言(如 Go, Python, C#, Rust, Java 等)提供了绑定库,并支持使用 SWIG 自行生成。
  • 许可证:代码在 MIT 许可证下分发,可用于商业项目。