2024-07-26
30 篇热帖
2. OpenAI Announces SearchGPT (chatgpt.com)
3. AI crawlers need to be more respectful (about.readthedocs.com)
AI爬虫滥用问题及对网站的影响
问题描述
- 最近几个月,AI产品和服务的爬虫滥用行为显著增加,主要表现为无节制地爬取网站内容,对依赖它们的站点造成损害。
- Read the Docs作为开源文档托管平台,虽然通常对机器人友好,但AI爬虫的滥用导致带宽成本激增和服务器负载加重,已不得不采取阻止措施。
- 这种行为类似于新的“AI淘金热”,部分爬虫在匆忙中忽略了基本伦理,可能引发行业反弹。
具体滥用案例
2024年5月案例:
- 一个爬虫下载了73TB的压缩HTML文件,单日峰值接近10TB,导致Read the Docs产生超过5000美元的带宽费用。
- 原因:爬虫存在bug,重复下载相同文件数百次,且未实施带宽限制或支持ETag、Last-Modified头(这些机制可避免下载未更改文件)。
- 结果:公司已联系该爬虫所有者,对方响应并承担了费用。
2024年6月案例:
- 另一个来源(疑似Facebook的内容下载器)下载了10TB数据,主要为压缩HTML和PDF文件。
- 联系信息无效(邮件退回),且Facebook未回复邮件,持续爬取,可能用于AI项目,但用户代理不明确。
问题原因
- AI爬虫缺乏基本滥用检查,如:
- 没有带宽或速率限制。
- 不利用缓存机制(如ETag和Last-Modified头),导致重复下载大文件。
- 爬虫来自大量IP地址,使基于IP的速率限制无效。
- 虽然爬虫使用真实用户代理,但无法简单限制,因为普通用户使用相同代理。
采取的行动
- 临时阻止:通过Cloudflare阻止所有被识别为AI爬虫的流量。
- 监控与优化:更密切监控带宽使用,并制定更激进的速率限制规则。
- CDN改进:重新配置CDN以更好地缓存文件,减少对源服务器的负载。
结果
- 阻止爬虫后,下载文件的带宽使用减少了75%(从约800GB/天降至约200GB/天)。
- 若所有流量直接命中源服务器,预计每月成本约1500美元(50美元/天),但CDN缓存通常处理普通流量。
- AI爬虫滥用消耗了Read the Docs的年度赞助额度(来自AWS和Cloudflare),可能导致额度提前用尽。
下一步呼吁
- 呼吁所有AI公司更尊重地爬取网站,否则可能面临广泛阻止,忽视版权和道德问题。
- Read the Docs愿意合作,例如构建集成以通知内容变化或仅下载更改文件,但目前除滥用报告外无公司主动联系。
- 建议AI爬虫实现基本检查,如采用RFC2616Policy下载器(参考Scrapy),以减少对网站的负担。
- 强调AI公司需改善行为,以维护社区信任,而非破坏关系。
4. Unfashionably secure: why we use isolated VMs (blog.thinkst.com)
5. Jacek Karpińśki, the computer genius the communists couldn't stand (2017) (culture.pl)
6. STS-93: We don’t need any more of those (2014) (waynehale.wordpress.com)
1999年7月23日,哥伦比亚号航天飞机执行STS-93任务,发射钱德拉X射线天文台。此次发射面临一些潜在问题:由于温度等因素,液氧装载量比计划少897磅;且哥伦比亚号作为最老的航天飞机,其机体存在多处微小缺陷,包括一处可能摩擦短路的电线、一个可能松动的传感器以及主发动机压力传感器的偏差。
发射升空后,一系列连锁故障开始发生:
- 右侧主发动机故障:在发动机启动时,一个固定的氧气柱销钉脱落飞出,击穿了发动机喷管延伸段,造成三根冷却管破裂,导致氢气泄漏。这使发动机涡轮温度升高,消耗了安全裕度,并造成液氧消耗增加。
- 电气系统故障:起飞约5秒后,一个交流总线(AC 1)发生短路。这导致了错误的燃料电池氢氧浓度报警(“Fuel Cell PH”),并使得中央和右侧主发动机各失去一个主控制器。中央发动机转为备份控制器运行,而该备份控制器的压力传感器读数偏高,导致其自动下令节流,减少了液氧消耗。
- 其他干扰:地面控制还遇到了一个误报的右侧固体火箭助推器液压压力低的警报,分散了注意力。
关键的转机在于故障的相互影响:右侧发动机因泄漏消耗了额外液氧,而中央发动机因控制器故障节流,意外地减少了液氧消耗。两者效应大部分相互抵消。最终,液氧提前0.15秒耗尽,航天飞机入轨速度仅比预期低了约15英尺/秒,完全在轨道机动系统可弥补的范围内。
飞行控制团队在任务中注意到了一些异常迹象(如发动机参数“偏离标称值”),但因故障特征复杂且临界值未被触发,无法准确定位问题。机组除按指令关闭交流总线传感器保护功能外,对整个危机过程基本不知情。在主发动机关机后,飞行总监得知详情后感叹:“我们再也不需要另一个这样的发射了。”
任务启示在于:航天器极其复杂,可能以意想不到的方式发生故障。必须时刻保持警惕,为各种灾难做好准备,并牢记“墨菲定律”随时可能生效。
7. Ask HN: Best way to learn robotics with a 10 year old?
本文围绕“如何教授10岁孩子机器人技术”这一主题,汇集了众多网友的讨论与建议。以下是主要观点和建议的总结:
1. 避免从零开始学习电子工程
- 多位家长和工程师指出,直接学习电路设计、电阻计算或自己制作PCB板容易让孩子感到沮丧且缺乏趣味性。
- 建议从购买现成套件开始,让孩子专注于构建能移动、有视觉吸引力的项目,快速获得成就感。
2. 推荐的学习路径与工具
- 入门套件:建议从价格亲民、模块化的套件入手,如:
- Arduino套件:结合底盘、颜色传感器等,制作循线机器人。
- LEGO系列:如Mindstorms(已停产但仍可购买二手)或Spike Prime,适合初学者学习编程与机械搭建。
- VEX Robotics:提供模块化零件和每年更新的挑战赛,鼓励创造性设计。
- BBC Micro:Bit:适合低龄儿童,支持图形化编程,易于扩展。
- Crunchlabs订阅服务:定期提供机器人套件和指导,但需注意自动续费问题。
- 竞赛与社区项目:
- FIRST(如FLL):结构化竞赛,培养团队合作、编程和解决问题能力。
- BattleBots:鼓励动手制造和机械设计,但成本较高;可考虑更小规模的“Antweight”战斗机器人。
- 本地创客空间:可提供设备支持和专家指导。
3. 进阶学习建议
- 编程基础:建议先学习Scratch、MicroBlocks或Python等语言,再结合硬件实践。
- 模拟工具:使用RoboMind Academy等模拟平台先练习编程逻辑,再接触实体机器人。
- 扩展项目:从简单任务(如循线、避障)逐步升级到复杂目标(如自主巡逻、抓取物体)。
- 专用工具:学习3D建模(如Fusion)、电路设计(如KiCad)和微控制器编程(如ESP32+MicroPython)。
4. 参与竞赛的价值
- 竞赛不仅能提升技术能力,还能培养团队协作、项目管理和展示技巧。
- 家长可作为导师参与,增强孩子的持续兴趣。
5. 注意事项
- 成本与难度平衡:预组装底盘或集成控制板可节省时间,但DIY能深化理解。
- 分阶段学习:建议先掌握基本电路、编程和机械结构,再整合为机器人项目。
- 资源获取:利用在线教程、二手市场及社区资源(如Instructables、GitHub开源项目)。
6. 具体项目灵感
- 开源项目如Blossom机器人(3D打印+编织外壳)或基于深度学习的机器人臂,适合进一步探索。
- 可尝试现实挑战,如制作一个能自动识别颜色的机器人或家庭巡逻小车。
总之,核心理念是以兴趣为导向,通过项目制学习和适度挑战,让孩子在实践中逐步建立信心与能力。
8. France high-speed rail traffic disrupted by 'malicious acts' on Olympic ceremony (www.lemonde.fr)
9. Startup Finance for Founders – Part I, Accounting (2016) (rein.pk)
这篇文章是初创公司Segment的创始人分享的创业财务经验系列的第一部分,聚焦于会计实务,即如何准确记录公司的财务历史。作者团队缺乏财务背景,随着公司成长,通过实践学习了必要的财务知识。
一、银行账户结构
- 初期问题:公司仅有一个支票账户。融资后,大量现金与用于收取客户付款的账户相同,存在欺诈风险和资金安全顾虑。
- 解决方案:建立了多账户体系以增强安全与管理效率。
- 应收账款账户:只允许存款,用于接收客户ACH付款。
- 应付账款账户:用于日常支出,保持较低余额。
- 货币市场账户:存放大部资金,投资于美国国债,以规避银行倒闭风险(超出FDIC保险额度)。
- 自动化“清扫”:银行每日自动将应收账款余额转入货币市场账户,并补充应付账款。此举简化了现金管理,提高了安全性。
二、信用卡
- 挑战:初创公司获得信用卡额度极低,运营不便。例如,银行曾因其历史收入低而仅批准5000美元额度。
- 应对策略:
- 初期通过强调公司现金余额(而非收入)来与银行谈判,成功获得更高额度。
- 后期因额度需求激增(从每月7.5万升至20万美元),且创始人需承担个人责任,公司转回硅谷银行,采用存入现金作为抵押的方式来获取所需额度。
三、合同与发票
- 背景:随着客户规模扩大,超过2万美元的年合同通常需要正式合同和发票支付,而非信用卡。
- 合同结构:
- 主服务协议:涵盖责任、保密、付款和终止条款等法律框架。
- 订单表:清晰列出销售内容、支付金额和时间等具体信息。这种结构便于客户未来追加服务。
- 关键学习:
- 责任条款争议最大。公司为此购买了商业责任保险,并将合同中的最大责任额限定在投保额度内。
- 发票流程是:根据订单表信息开具发票,并发送给客户的财务联系人。
总结:本文从实践角度分享了初创公司在会计基础操作中的关键教训,重点在于如何设计安全的银行账户结构、应对信用卡额度困境,以及建立标准化的合同与发票流程,为财务管理的规范性打下基础。
10. Small neural network enables realistic rendering of woven fabrics in real-time (techxplore.com)
11. A Clone of Deluxe Paint II Written in Python (github.com)
PyDPainter:Python编写的像素艺术程序
项目概述 PyDPainter(发音为"Pied Painter")是一款使用Python和PyGame编写的像素艺术程序,旨在为现代计算机提供可用的复古风格绘图工具。其设计灵感源自1985年电子艺界发布的Commodore Amiga版Deluxe Paint。该程序致力于在像素艺术复兴的背景下,融合经典设计与现代功能。
主要特性
- 跨平台与开源:支持Windows、Mac和Linux系统,采用GPLv3开源协议。
- 用户界面:提供工具栏、菜单和工具提示,支持左右鼠标按钮分别用于绘制和擦除。
- 兼容性与文件格式:兼容Deluxe Paint III,支持IFF、ANIM、GIF、BMP、PNG等多种格式。
- 绘画功能:包含完整的绘图工具集,支持颜色循环、动画、渐变填充,以及涂抹、混合、平滑等绘制模式。
- 对称与编辑:提供镜像、平铺和循环对称功能,并支持256级撤销。
资源与社区
- 视频演示:包含功能演示、版本预告片及教程播放列表。
- 社区支持:通过Ko-fi接受捐赠,设有Facebook群组和Mastodon社交媒体账号。
- 开发状态:详细进展可查阅项目路线图,完整文档见目录页。
版权信息 该项目版权归属Mark Riale(2019-2026),遵循GPLv3或更高版本许可。
12. How to build highly-debuggable C++ binaries (dhashe.com)
这篇文章详细介绍了如何配置C++工具链,以生成高度可调试的二进制文件,专门用于解决当前面临的特定错误。作者认为,默认的C++交互式调试(如gdb)体验不佳,且许多程序员缺乏改善的知识。文章基于两个关键原则:C++是提前编译的环境,需要事先决定二进制文件中哪些部分需要可调试性、哪些部分需要性能;即使应用了最佳的通用编译更改,C++的调试体验也无法与脚本语言相比,必须结合针对性的源代码更改和自定义调试器扩展。
文章建议围绕四个类别展开,并遵循特定于x86_64 GNU/Linux上使用g++、clang++和gdb的指导。
一、通用编译更改
这些更改应用于项目中的所有代码。
- 启用Sanitizer:在CFLAGS和CXXFLAGS中添加
-fsanitize=address,undefined或-fsanitize=thread(或Clang的-fsanitize=memory)等选项。Sanitizer能立即捕捉未定义行为等“错误”情况,避免调试时陷入因未定义行为导致的“不可能”行为。 - 启用标准库的调试/加固模式:
- 对于libstdc++,添加
-D_GLIBCXX_DEBUG(会改变ABI)或-D_GLIBCXX_ASSERTIONS(保持ABI兼容)。 - 对于libc++,添加
-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG。 这些选项为标准库容器启用了范围检查和断言。
- 对于libstdc++,添加
- 为预处理器宏生成调试信息:添加
-ggdb3选项,以便在gdb中动态评估宏。 - 为所有函数启用帧指针:添加
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer。这能生成更快速、更可靠的回溯信息,即使在优化代码中也能获得良好的回溯。 - 启用异步展开表:添加
-fasynchronous-unwind-tables,确保生成.eh_frame段,为调试器提供精确的栈展开信息。 - 将构建架构设置为基础x86_64:添加
-march=x86-64。这有助于可逆调试,因为基础架构得到了更广泛的支持。 - 确保静态库完全链接到二进制文件:在LDFLAGS中添加
--whole-archive。这确保静态归档文件中的所有对象文件都被包含,从而允许在调试器中调用其中的任何函数。
二、半特定的编译和源代码更改
这些更改针对特定部分的代码。
- 将翻译单元划分为“可调试”和“快速”:
- 将可能需要调试的代码(可调试TU)用
-O0优化级别和-ggdb3编译。 - 将其余代码(快速TU)用
-O3优化级别和-ggdb3编译。 这允许在需要调试的代码区域获得最佳调试体验,同时保持程序整体的可接受性能。可以通过修改构建系统、使用编译数据库脚本,或在源文件中使用#pragma GCC optimize ("O0")(GCC)或#pragma clang optimize off(Clang)来实现。
- 将可能需要调试的代码(可调试TU)用
- 显式实例化重要的模板类:在单个翻译单元中添加如
template class std::vector<Foo>;的代码行。这确保模板类的所有成员函数都被实例化,避免在调试器中尝试调用未实例化的函数时出现“可能被内联”的误导信息。虽然此做法可能不适用于所有情况,但在调试时通常有效。
三、特定的源代码更改
这些是针对具体代码文件的临时修改。
- 评估预处理器#ifdef:使用
unifdef工具和相关的-D定义来就地处理代码文件,评估并简化预处理器条件编译指令,使控制流更易于理解。 - 展开复杂宏:使用
g++ -E预处理器手动展开令人困惑的宏。将展开后的代码复制回源文件,以便在调试器中单步执行。 - 利用x86 INT3技巧设置快速条件断点:
- 在源代码中插入如下代码:
volatile bool breakpoint_1 = false; // ... if (breakpoint_1 && (x_id == 153827)) { __asm("int3\n\tnop"); } - 在gdb中,通过
p breakpoint_1 = true来启用断点。 这种方式创建的条件断点在评估条件时不会产生软件中断的开销,比gdb的内置条件断点快得多。
- 在源代码中插入如下代码:
四、调试器配置更改
这些是针对gdb的配置。
- 避免单步执行不相关代码:在
.gdbinit文件中配置skip命令,使gdb自动跳过标准库、第三方库、项目工具代码和所有“快速”TU。例如:
这可以避免在单步执行时陷入不相关的构造函数或内联函数,减少不必要的skip -gfile bits/*.h skip -gfile include/c++/* skip -function "operator new"step/next/finish操作。 - 启用标准库的漂亮打印器:确保gdb加载了与当前使用标准库版本匹配的漂亮打印器。这可以提高打印标准库容器时的信噪比,减轻调试时的认知负担。
- 为项目的词汇类型编写漂亮打印器:使用gdb Python API为项目中频繁使用且实现复杂的自定义类型编写漂亮打印器。这类似于为Python对象编写
__str__方法,但只在调试器内有效,可以显著改善这些类型的显示效果。
13. Show HN: Wat – Deep inspection of Python objects (github.com)
Wat:Python 对象深度检查工具
Wat 是一个强大的 Python 对象运行时检查工具,旨在帮助开发者探索未知对象、调试代码和理解复杂数据结构。它通过提供对象的详细信息(如类型、值、变量、方法、父类、签名、文档和源代码)来回答“这个东西到底是什么?”的疑问。
核心功能
Wat 能够对任何 Python 对象进行深度检查,输出其类型、格式化值、变量、方法、父类型、函数签名、文档字符串以及源代码。这对于调试和理解动态类型语言中的对象尤为有用。
加载与安装
Wat 提供了多种灵活的加载方式:
- Insta-Load(即时加载):无需安装,可在 Python 解释器会话中直接粘贴一段压缩的 base64 代码来加载。也支持从特定的 Unicode 字符序列加载。这种方式方便临时调试。
- 通过 pip 安装:使用
pip install wat命令安装wat包。该包无外部依赖。 - 加载本地文件:直接将
inspection.py文件的内容粘贴到解释器中,效果与 Insta-Load 相同。
使用方法
主要使用方式为 wat(object) 或利用 Python 的除法运算符实现更简洁的语法 wat / object。
修饰符
Wat 提供了丰富的修饰符来控制输出内容,可以通过点号调用(如 wat.modifier / object),并支持链式调用(如 wat.short.str.gray / 'foo'):
.short/.s:仅显示简要信息(值、类型、父类、签名、文档),隐藏属性列表。.dunder:显示以双下划线开头的特殊属性(dunder attributes)。.long:显示未缩略的值和完整的文档字符串。.code:揭示函数、方法或类的源代码。.nodocs:隐藏函数和类的文档。.caller:显示检查调用的位置(适用于文件,不适用于 REPL)。.public:仅显示公共属性,隐藏私有属性。.all:包含所有可用信息。.ret:在检查后返回被检查的对象本身。.str:返回输出字符串而非直接打印。.gray:禁用控制台的彩色输出。.color:强制使用彩色输出。
其他功能
wat.locals:检查当前作用域的局部变量。wat.globals:检查全局变量。- 等效语法:支持
wat.short('foo')、wat('foo', short=True)以及 Unix 管道风格'foo' | wat.short。
主要应用场景
- 确定对象类型:在动态类型中快速明确对象的准确类型及其继承链。
- 查找方法和属性:列出对象的方法(含签名和文档)及所有属性,帮助理解未知对象的接口。
- 探索模块:检查模块内的函数、类和子模块。
- 查看源代码:使用
.code修饰符直接查看函数或类的实现代码。 - 美化复杂数据:将嵌套的字典、列表等数据结构进行格式化、缩进输出,提升可读性。
- 调试支持:可与 Python 的
breakpoint()调试器结合使用,在断点处导入并检查对象。 - 学习 Python 内置对象:用于探索 Python 内置类型、类型系统(如
type、typing)等内部机制。
高级配置与自定义
- 环境变量:
WAT_COLOR="false"或"true"可以全局控制是否使用彩色输出。WAT_COLORS可用于自定义输出各部分的颜色主题(通过 ANSI 颜色代码)。
- 自省:Wat 工具本身也是一个对象,支持被 Wat 自己检查(如
wat.dunder / wat)。 - 隐藏函数:用户提到存在未被文档记录的
wat.equals()函数。
总结
Wat 是一个功能全面、使用灵活的 Python 对象检查器。它通过简洁的语法和丰富的修饰符,为开发者提供了在运行时深入洞察对象内部状态的强大能力,显著提升了调试、探索和理解代码的效率。
14. Bcachefs, an Introduction/Exploration (blog.asleson.org)
Bcachefs:下一代写时复制文件系统介绍
Bcachefs是由Kent Overstreet开发的下一代写时复制(COW)文件系统,旨在提供类似Btrfs和ZFS的功能,同时追求更好的性能。其设计目标包括:全面的校验和、多设备支持、复制、RAID、缓存、压缩、加密、子卷、快照,并具备可扩展性(已测试50TB以上)。
为何需要另一个文件系统?
作者指出:
- ext4:功能但过时,开发复杂,但fsck工具出色。
- XFS:可靠、健壮,采用传统原地更新(非COW),因此无法支持某些高级特性。
- Btrfs:作为Linux下一代COW文件系统的愿景,但开发匆忙导致设计缺陷和代码臃肿,稳定性问题损害了其声誉。
- ZFS:先驱COW文件系统,但因版权原因无法成为Linux的一等公民,且其基于块的设备设计与现代基于区间(extent)的系统存在差异。
Bcachefs的优势
- 稳定性:基于bcache的稳定基础,进行了广泛测试。
- 速度:性能优异,注重降低尾延迟。
- 代码精简:代码库规模接近ext4,但具备Btrfs的功能,并持续重构以提高可维护性。
- 功能丰富:具备或正在开发所需的关键功能,尤其是数据校验和。
功能对比
以下表格展示了bcachefs与其他文件系统在主要功能上的支持情况:
| 功能 | Bcachefs | ZFS | btrfs | XFS | ext3/4 |
|---|---|---|---|---|---|
| RAID | ✓ | ✓ | ✓ | ✗ | ✗ |
| 加密 | ✓ | ✓ | ✗ | ✗ | ✗ |
| 精简配置 | ✗ | ✓ | ✗ | ✗ | ✗ |
| 重复数据删除 | ✗ | ✓ | ✗ | ✗ | ✗ |
| 缓存 | ✓ | ✓ | ✗ | ✗ | ✗ |
| 压缩 | ✓ | ✓ | ✓ | ✗ | ✗ |
| 快照 | ✓ | ✓ | ✓ | ✗ | ✗ |
| 子卷 | ✓ | ✓ | ✓ | ✗ | ✗ |
| 发送/接收 | 计划中 | ✓ | ✓ | ✗ | ✗ |
| 全局校验和 | ✓ | ✓ | ✓ | ✗ | ✗ |
| Reflink | ✓ | ✓ | ✓ | 较新版本支持 | ✗ |
注:✓表示支持,✗表示不支持。
校验和与数据完整性
- 全局校验和可在数据返回用户空间前检测并可选地修正错误。
- 能防御位腐烂(bit rot),作者以个人经历说明了数据损坏的风险。
- Bcachefs提供内核级的文件系统校验和,支持错误检测与修正。
使用与配置
- 创建与挂载:支持单设备与多设备,并通过fstab实现开机自动挂载。
- 降级模式:提供
-o degraded(数据完整)和-o very_degraded(尝试恢复)等挂载选项。 - 自动化接口:当前主要通过命令行工具、sysfs(可查看和修改选项)和debugfs实现。开发者表示欢迎Rust API。
- RAID配置:
- 目前通过
--replicas参数指定数据/元数据副本数(最大3),支持容忍N-1个磁盘故障。 - RAID 0:使用多设备时默认行为。
- RAID 1:通过
--replicas=2实现,测试表明可容忍单盘故障。 - RAID 10:目前无法直接创建类似传统RAID10的配置。
- RAID 5/6(擦除编码):实验性功能,标记为“请勿使用”,未正式化,且默认Fedora内核模块未编译此功能。
- 目前通过
- 空间预留:约8%的空间用于垃圾回收,可配置。
- 设备管理:支持动态添加/移除设备、修复降级文件系统等,但文档尚不完善。
注意事项与局限
- 仍在开发中:功能未完全实现,但开发者极力确保早期用户不会丢失数据。
- 文档与错误信息:部分文档细节不足,错误信息有时较隐晦,需查看日志。
- 性能影响:在VDO上使用时,随机数据写入可能导致内核错误并进入只读模式。
- 暂不支持:SMR硬盘、原始闪存。
- 未来工作:包括改进多设备启动序列、集成systemd密码输入、数据损坏时的读取恢复等。
Bcachefs是一个积极开发、特性雄心勃勃的COW文件系统,旨在成为Linux生态中一个强大而现代的选择,尤其适合关注数据完整性、性能和高级存储功能的用户。
15. Decline of Indian vultures (www.bbc.com)
16. A User’s Guide to Statistical Inference and Regression (mattblackwell.github.io)
《统计推断与回归用户指南》概要
本书旨在为读者打下统计学基础,使其能够基于知识和信心为特定应用做出方法论选择。主要面向政治科学一年级博士生,但对其他社会科学领域也有参考价值。
核心目标
- 理解评估估计量的基本方法:介绍评估未知世界特征的估计量基础,涵盖偏差、抽样方差、一致性和渐近正态性等核心概念。掌握这些概念后,读者将具备分析未来任何新估计量的语言工具。
- 将统计思想应用于回归模型估计:将上述核心思想应用于社会科学中重要的回归模型。理解回归估计量(如普通最小二乘法)的工作原理,对于进行研究、阅读评审当代学术成果至关重要。
书籍结构
本书分为两大部分:
第一部分:统计推断基础
- 第1章:设计基推断:从设计基视角(从一个固定的、有限总体中抽样,所有不确定性源于样本包含谁的随机性)出发,展示估计和推断的基本概念。
- 第2章:模型基推断:介绍更灵活的模型基推断方法。研究者假设一个数据生成的概率模型,重点关注独立同分布数据模型,并引入基于“插入原理”的估计量。
- 第3章:渐近理论:讨论估计量在大样本下的行为,涵盖大数定律、中心极限定理和Delta方法等核心渐近理论,并说明这些结果对统计推断的重要性。
- 第4章:假设检验:介绍如何构建假设检验并解释其各个层面,涵盖功效分析以及置信区间与假设检验之间的联系。
第二部分:最小二乘估计量
- 第6章:线性回归:阐明“线性模型”所针对的感兴趣量,解释即使变量间关系非线性,总体最佳线性预测值也依然存在,这为线性回归作为潜在非线性函数的线性近似提供了基础。讨论如何解释模型系数。
- 第7章:最小二乘的机制:介绍最小二乘估计量的构造方式、几何解释以及有影响观测值如何影响估计结果。以矩阵形式引入该估计量。
- 第8章:最小二乘的统计性质:描述最小二乘估计量的统计性质,说明建模假设如何影响我们能获得的性质。在最弱的假设下,可推导出在多数情况下依赖的、出乎意料强大的渐近性质。更强的假设(如线性、正态分布误差)能提供更强的结果,但需以潜在模型误设为代价。
本书特色
作者指出,虽然存在许多统计与回归教材,但本书旨在填补针对其他社会科学领域应用和模型的空白,并引入相当高水平的数学严谨性以夯实读者基础。全书内容源自作者的教学实践,并感谢了多位同事和学生的反馈。
17. Ask HN: What are you using to parse PDFs for RAG?
18. Where does the name "algebraic data type" come from? (blog.poisson.chat)
代数数据类型名称的起源
核心结论
“代数数据类型”(Algebraic Data Types, ADT)这一名称源自泛代数(universal algebra) 中的自由代数(free algebra) 概念,而非民间流传的“和与积(sums of products)”解释。这一结论基于对Hope、Miranda、Clear等早期编程语言文献的历史分析。
历史发展脉络
1. Hope(1980年):特征的引入
- Hope语言(由Rod Burstall等人开发)首次引入了我们今天称为“代数数据类型”的编程语言特性,但当时仅称其为**“数据类型”**。
- 特性包括:通过
data声明定义类型及其构造器,支持参数化多态(通过typevar),以及通过多子句函数定义进行模式匹配。 - Hope直接影响了ML语言(OCaml的前身)采纳数据类型。Standard ML的定义文档明确将这一特性归功于Hope。
2. Miranda(1985年):名称的诞生
- David Turner在1985年发表的Miranda语言论文中,首次使用“代数数据类型”这一名称。
- Turner明确将这一机制描述为“声明一个自由代数”,并引用了Landin、Burstall和Hoare的早期工作作为思想基础。
- Miranda是Haskell的直接前身,其特点包括惰性求值和构造器的柯里化。
3. 对“和与积”解释的澄清
- 民间存在一种流行解释,认为“代数”指的是ADT可表示为“和(sum)与积(product)”的组合。这种解释在数学和组合学上很有趣,但并非该术语的历史来源。
- 这种解释可能源于对“代数类型”一词的望文生义,而非其原始的代数理论含义。文章作者在查阅文献后,未找到支持此解释的一手史料。
4. Clear(1979年):理论基础
- 由Rod Burstall和Joseph Goguen开发的规范语言Clear,为“代数数据类型”提供了坚实的理论基础。
- Clear基于泛代数和范畴论,其核心概念是理论(theory) 和代数(algebra)。
- 一个“数据理论”(使用
data关键字标记)通过将其运算符视为构造器,并根据理论中的等式对元素(即构造器树)进行等价,从而唯一确定一个初始代数(initial algebra),这正是自由代数的概念。 - 例如,在Clear中,自然数是
zero和succ运算的初始代数,布尔值是true和false常量的初始代数。这清晰地展示了数据类型的代数本质。
5. CLU(1977年):相关的不同范式
- CLU语言引入了“oneof类型”(即带标签的联合类型),功能上与ADT相似。
- 但其核心是数据抽象和面向对象编程,与基于泛代数的函数式路径不同。它不直接支持递归类型定义。
- 尽管Burstall在Hope和Clear的论文中引用了CLU,但两者之间的直接影响关系难以精确界定。
总结
“代数数据类型”一词的历史轨迹清晰:源于泛代数的自由代数概念,通过Clear语言进行了理论形式化,并由Miranda语言首次命名为“代数数据类型”,随后经由Haskell等语言广为流行。将“代数”理解为“和与积”是一种后起的、有趣的数学解读,但不符合该术语最初在编程语言语境中的代数理论渊源。
19. Zulip 9.0: Organized chat for distributed teams (blog.zulip.com)
Zulip 9.0 发布总结
Zulip Server 9.0 是一次重大版本更新,专为远程和混合办公的分布式团队设计。本次发布合并了超 5300 次代码提交,包含数百项新功能、体验优化与错误修复。
核心功能与体验改进
- UI 与阅读体验:界面重新设计,默认采用更大的字体和行距(保留紧凑模式);支持在全屏下隐藏左右侧边栏以提升专注度;消息和主题加载速度显著提升。
- 消息编写:编写框采用现代化设计,支持自动恢复最近草稿、粘贴时保留富文本格式、自动转换频道与主题链接,并支持选中部分内容进行引用回复。
- 导航与搜索:核心消息视图重命名(如“Combined feed”);搜索栏重构并引入过滤器标签;新增表情回应(Reactions)视图,支持按关注主题和特定联系人过滤消息。
- 术语与用户引导:全局将“Streams”更名为“Channels”;重构新用户引导体验,通过模态框、横幅和介绍性消息更直观地解释按主题组织对话等核心概念。
- 管理功能:合并用户设置面板,提供更灵活的私信权限配置、强制唯一用户名等功能;优化频道创建流程与设置界面。
服务器、集成与生态系统
- 服务器优化:新增对 Ubuntu 24.04 的支持(放弃 20.04);服务端自动生成上传图片的缩略图,大幅降低带宽消耗并提升各端加载速度;进一步优化了大规模组织的运行效率。
- 第三方集成:新增 Patreon 和 GitHub Sponsors 集成,简化了 60 多个现有集成的配置与文档,并大幅扩充了 API 文档。
- 移动端进展:基于 Flutter 构建的下一代 Android 和 iOS 移动应用开发加速,已发布多个社区测试版,计划于年内推出公开测试版。
- 国际化:社区翻译已覆盖 25 种语言的大部分界面字符串。
社区贡献与未来规划
- 社区与认可:连续第九年参与 Google Summer of Code (GSoC);为 1500 多个开源项目、非营利组织和教育机构提供免费云托管;荣获 GetApp 2024 团队通信类别领导者等业界好评。
- 升级与路线图:官方强烈建议升级至 9.0 以获取最新功能与安全更新。未来将持续优化 Web 应用设计并正式推出下一代移动应用,下一个大版本预计于 2024 年底发布。
20. SVG Triangle of Compromise (me.micahrl.com)
SVG权衡三角
在Web上使用SVG时,通常需要考虑三个关键属性:
- 可样式化:可通过CSS着色(包括前景、背景、
:hover状态等) - 可缓存:加载一次后,在其他页面重复使用无需再次下载
- 具有尺寸:具有固有的宽度和高度(尤其适合内联文本,可设置
height:1em使其按比例缩放以适应当前文本大小)
四种主要SVG使用方式的属性支持对比
| 使用方式 | 可样式化 | 可缓存 | 具有尺寸 |
|---|---|---|---|
<iframe> 内嵌 <svg> |
支持 | 支持 | 不支持 |
<img> 标签 |
部分支持 | 支持 | 支持 |
内联 <svg> |
支持 | 不支持 | 支持 |
<svg> 配合 <use> 标签 |
部分支持 | 支持 | 支持 |
使用<use>标签显示外部SVG
这种方法可以同时满足可样式化、可缓存和具有尺寸三个属性。
工作原理:
- 创建一个SVG文件,将每个图标用
<symbol>标签包裹并设置id属性。 - 在HTML中,使用
<svg>标签并配合<use href="文件名.svg#图标ID"/>引用。 - 通过CSS样式化,例如使用
fill:currentColor使图标颜色随文本颜色变化,设置height:1em使图标随文本大小缩放。
示例:
- CSS样式控制颜色、高度和悬停状态。
- SVG文件(如
icons.svg)包含多个<symbol>定义的图标(如Finder图标、勾选图标、叉号图标)。 - HTML中通过
<use>引用特定图标。
注意事项与限制:
- 同域限制:SVG文件必须与页面在同一域名下,CORS策略无效。
- 需要修改SVG文件:SVG文件必须包含
<symbol>标签,可能需要对原始SVG进行编辑。 - RSS支持问题:Web订阅(RSS)阅读器通常不支持此方法,可能导致内容显示异常。
- 阴影DOM限制:SVG被加载到阴影DOM中,无法用JavaScript直接交互,也无法使用CSS选择器选择SVG内部的特定元素(如
<circle>),但允许设置fill、font-family等属性。
其他SVG使用方式简述
<img>标签:- 类似其他图片格式,可缓存。
- 具有固有尺寸,可按比例缩放或适应容器。
- 样式化受限:无法直接使用父文档的CSS选择器控制SVG内部元素。
内联
<svg>:- 可直接在HTML文档中写入SVG元素。
- 完全可样式化和可交互:可通过CSS和JavaScript像操作普通HTML元素一样控制。
- 不可缓存:SVG代码嵌入HTML,无法跨页面缓存。
<iframe>内嵌<svg>:- 创建一个仅包含
<svg>的HTML文件,并通过<iframe>引用。 - 可通过
<style>标签在HTML文件内添加CSS,与站点共享样式。 - 尺寸问题:
<iframe>没有固有尺寸,需用JavaScript动态设置或预先指定。 - 不推荐此方法,无显著优势。
- 创建一个仅包含
其他选项
- 双SVG文件切换:使用两个SVG文件(正常状态和悬停状态),通过
<img>标签引用,并用CSS在悬停时切换。适用于简单两状态场景。 <object>标签:类似<iframe>,用于多媒体对象如SVG。具有相同的尺寸问题,无法从父文档样式化,但可用JavaScript控制。- SMIL动画:可用于SVG动画,与CSS各有不同的能力。
文章最后还提到了一个“错误但改进”的图表版本,以及一些更新记录(主要涉及术语修正和内容结构调整)。
21. Dual action antibiotic could make bacterial resistance nearly impossible (phys.org)
22. U.S. Department of Defense – Detecting Agile BS [pdf] (2018) (media.defense.gov)
23. Switzerland mandates government agencies use open-source software (www.tomshardware.com)
摘要
瑞士通过新法律,强制要求政府机构使用开源软件(OSS),并公开由公共部门开发或为其开发的软件源代码。这项法律名为《联邦法关于使用电子手段完成政府任务》(EMBAG),旨在提高政府操作的透明度、安全性和效率。
法律核心内容:
- 强制使用开源软件,并要求公开源代码,除非涉及第三方权利或安全限制。
- 同时要求公开非个人和非安全敏感的政府数据,称为“开放政府数据”,促进软件和数据的重用。
- 法律基于“公共机构、公共代码”原则,强化治理透明度。
历史背景:
- 瑞士已有开源先例,如2011年联邦最高法院发布开源法律应用Open Justitia,但引发与法律软件公司的长期争议。
欧洲趋势:
- 法国、德国等欧洲国家也在推行类似举措,例如法国使用Linux系统,德国部分州迁移至Linux和LibreOffice。
- 欧盟通过FOSSA项目增强OSS安全性,但面临潜在资金削减风险。
美国对比:
- 美国政府支持开源但较受限,如联邦源代码政策要求公开至少20%新开发代码,但无强制性法律。
- 瑞士的强制性法律可能成为欧美地区的借鉴模式,推动更广泛的开源采用。
24. Secure Boot is broken on 200 models from 5 big device makers (arstechnica.com)
25. SearchGPT Prototype (openai.com)
OpenAI 推出了 SearchGPT 原型,这是一个与出版商合作构建的搜索体验。
- 合作与控制:OpenAI 与出版商合作,并为其提供管理自身内容在 SearchGPT 中展示方式的工具,以增加出版商的选择权。
- 与AI模型训练分离:SearchGPT 是独立的搜索产品,与 OpenAI 生成式 AI 基础模型的训练是分开的。网站可以选择不参与生成式 AI 训练,但仍可能出现在搜索结果中。
- 反馈与学习:OpenAI 听取了出版商和创作者关于如何更好地与 AI 搜索产品互动以及内容表现的反馈。该原型将用于进一步学习并分享发现。
- 反馈渠道:欢迎通过邮箱
publishers-feedback@openai.com提供反馈。
26. Applied Machine Learning for Tabular Data (aml4td.org)
本书《Applied Machine Learning for Tabular Data》旨在为从表格数据开发高质量预测模型提供一份实践指南。它采用整体视角关注预测建模过程,并特别强调通常被类似著作忽略的几个领域,例如特征工程方法与机器学习模型的紧密结合,以及模型确定后的后期活动。
全书明确避免使用“人工智能”一词,认为这更多是营销术语,其核心是统计学。内容撰写过程中未使用AI工具生成文本,仅用于拼写语法检查、图表标题翻译和代码支持。
本书采用 CC BY-NC-SA 4.0 许可协议,允许非商业性的再分发、改编和引用,但要求署名并以相同条款共享衍生作品。
目标读者包括各类数据分析师(统计学家、数据科学家、课程讲师、实验科学家等)。不要求读者是专家,但需要具备基础的建模和统计知识(如回归、方差、相关等)。书中会包含必要的数学符号,但力求精简。对于希望获得更理论化阐述的读者,推荐参考Hastie等人的《统计学习基础》等著作。
本书有意将内容与特定软件解耦,不包含大量代码示例。计算补充材料将单独提供,目前基于R的 tidymodels 框架开发。欢迎社区贡献Python/scikit-learn等补充材料。
书中设有练习部分,相关资源可在线获取。如有问题,建议在公共论坛(如Stack Exchange)提问,或遵循“Yihui规则”在GitHub仓库提交问题。
欢迎社区贡献(如修正错别字、提交拉取请求)。贡献将被视为对项目的捐赠,贡献者需遵守贡献准则,并受许可证条款约束。
本书使用 Quarto 进行编译渲染,主要计算基于R 4.6.0完成,并依赖于众多R包(如tidymodels生态中的parsnip、recipes、ggplot2等)。相关工具版本信息已在文末列出。
27. How to optimize a CUDA matmul kernel for cuBLAS-like performance (2022) (siboehm.com)
CUDA矩阵乘法核优化指南:从朴素实现到接近cuBLAS性能
本文通过逐步优化CUDA矩阵乘法核,深入探讨GPU性能优化的关键技术,目标是达到接近cuBLAS的性能水平。
核心优化步骤与性能提升
1. 朴素实现(Kernel 1)
- 基本思路:每个线程计算结果矩阵C的一个元素,通过行和列的点积计算。
- 性能:309.0 GFLOPs/s,仅为cuBLAS的1.3%。
- 问题:非合并的全局内存访问导致带宽浪费严重。
2. 全局内存合并(Kernel 2)
- 优化策略:调整线程到结果矩阵的映射,使同一warp中的线程访问连续的内存地址。
- 效果:内存吞吐量从15GB/s提升至110GB/s,性能跃升至1986.5 GFLOPs/s(8.5% cuBLAS性能)。
- 关键概念:理解warp(32个线程)和全局内存合并机制。
3. 共享内存缓存(Kernel 3)
- 优化策略:将A和B的块加载到共享内存(SMEM)中重复使用,减少全局内存访问。
- 效果:性能提升至2980.3 GFLOPs/s(12.8%),但受限于占用率(66%)和内存访问延迟。
4. 1D块切片(Kernel 4)
- 优化策略:每个线程计算多个输出元素(TM个),提高算术强度。
- 效果:性能大幅提升至8474.7 GFLOPs/s(36.5%),内存访问次数显著减少。
5. 2D块切片(Kernel 5)
- 优化策略:每个线程计算TM×TN个结果元素(8×8=64个),进一步优化算术强度。
- 效果:性能达15971.7 GFLOPs/s(68.7%),GMEM和SMEM访问次数进一步优化。
6. 向量化内存访问(Kernel 6)
- 优化策略:
- 转置共享内存中的A矩阵,实现向量化SMEM加载(LDS.128)。
- 使用float4进行全局内存加载/存储(LDG.E.128和STG.E.128)。
- 效果:性能提升至18237.3 GFLOPs/s(78.4%)。
7. 自动调优(Kernel 9)
- 优化策略:通过搜索BM、BN、BK、TM、TN等参数的最优组合。
- 效果:性能提升至19721.0 GFLOPs/s(84.8%),最优参数因GPU型号而异。
8. 波前切片(Kernel 10)
- 优化策略:引入warp级切片,明确区分块、warp和线程级并行。
- 效果:性能达21779.3 GFLOPs/s(93.7%),接近cuBLAS的23249.6 GFLOPs/s(100%)。
关键性能指标对比
| 优化阶段 | GFLOPs/s | 相对cuBLAS性能 |
|---|---|---|
| 朴素实现 | 309.0 | 1.3% |
| 全局内存合并 | 1986.5 | 8.5% |
| 共享内存缓存 | 2980.3 | 12.8% |
| 1D块切片 | 8474.7 | 36.5% |
| 2D块切片 | 15971.7 | 68.7% |
| 向量化内存访问 | 18237.3 | 78.4% |
| 自动调优 | 19721.0 | 84.8% |
| 波前切片 | 21779.3 | 93.7% |
| cuBLAS参考 | 23249.6 | 100.0% |
核心优化思想
- 内存层次利用:从全局内存优化到共享内存缓存,再到寄存器缓存。
- 算术强度提升:通过计算更多输出元素减少内存访问次数。
- 访问模式优化:确保内存访问合并和向量化。
- 占用率管理:平衡资源使用以保持较高的活跃warp数。
- 参数自动调优:针对特定硬件搜索最优配置。
未完成的优化方向
- 双缓冲:预取下一迭代数据,隐藏内存延迟。
- 消除共享内存bank冲突:优化SMEM数据布局。
- 直接内存到SMEM加载(Hopper架构新特性)。
通过此迭代优化过程,开发者能够深入理解GPU性能特性,编写出接近硬件极限性能的CUDA内核。所有代码已在GitHub上开源。
28. A hash table by any other name (lwn.net)
29. Alexandre Grothendieck, The New Universal Church (1971) [pdf] (publish.uwo.ca)
亚历山大·格罗滕迪克《新普世教会》摘要
本文是数学家亚历山大·格罗滕迪克于1971年发表的社论,核心论点是:科学主义已演变为一种新的、主导性的普世宗教,其本质是非理性的,并对社会、生态与人类精神构成了深刻威胁。
科学主义的本质与地位
- 科学与科学主义需作区分。科学是实验演绎方法;科学主义则是由科学成功扩张而生的意识形态,具有准宗教特征。
- 科学主义已成为全球主导的“新宗教”,远超传统宗教的影响力,渗透于教育、专业生活和所有社会阶层。其祭司阶层是科学家、技术官僚与专家,其教义语言(各种专业术语)对公众而言永不透明。
- 公众对科学方法的缺乏理解,使其将科学权威视为一种不可知、不容置疑的神秘力量,这赋予了科学主义非理性的、宗教般的心理基础。
科学主义的“信条”
格罗滕迪克剖析了科学主义隐含的六条主要“神话”(信条):
- 唯有科学知识是真知识:只有可量化、形式化或实验室重复的知识才是真知识。情感、伦理等经验被排除在“真知识”之外。
- 科学知识即真理:凡符合科学标准(如可量化、可重复)的,即被接受为有效。战争等现象因可被科学理论容纳而变得“可接受”。
- 机械论自然观:宇宙万物(包括生命、思想、社会)最终可还原为基本粒子的数学定律,世界将化为数学的一个结构。目的论被摒弃。
- 专家的角色:知识被极度细分,只有特定领域的专家意见才被视为相关。面对复杂现实,无人能凭个人理解负责,这为技术官僚的集体权力奠定了基础。
- 科学与技术是问题的唯一解:科学及其衍生技术是解决人类一切问题(包括心理、道德、社会、政治问题)的唯一途径。
- 专家是决策的唯一资格者:决策权最终落入听取各方专家意见的“决策专家”手中。
科学主义的危害
- 对个体(无论专家或外行)产生精神与智力的麻痹,使人远离生命整体,沦为专门化的伺服机制,并削弱道德承诺与个人责任。
- 在社会政治层面,为僵化的社会等级制(尤其是强大的技术官僚阶层)辩护并强化它,该阶层能决定地球未来的命运。
- 科学主义是当前生态危机与文明危机的重要推手,但它本身却无力认识或解决这些危机,因为它无法自我质疑。
对抗科学主义
- 科学主义意识形态在登月事件后达到顶峰,但随后已出现反弹迹象:公众对其“奇迹”的 disillusionment 增加,反文化运动兴起,媒体态度变得谨慎,环保运动日益激进。
- 最有效的斗争方式之一是 “内部抗争”,由意识到其谬误与危险的科学家发起。已存在上百个此类科学家团体(如“生存与生活”、“为人民的科学”等)。
- 预计未来将有更多科学家加入反抗行列,特别是随着科技人员失业或地位预期落差扩大,可能催生一个“科学无产阶级”。他们没有强大的阶级利益包袱,将加速科学主义的衰落。
结论
本文认为,科学主义是最强大、最危险的意识形态,是资本主义和“社会主义”意识形态的共同基础。未来主要的政治分野,将不再是传统的“左”与“右”,而是 “不惜代价推进技术进步”的科学主义信徒与以丰富生命本身为最高价值的反对者之间的对立。当前是公开对抗科学主义、加速其衰退的时机。