LLM编程:外骨骼而非替代品
作者使用Claude Code构建了两个应用,体验表明LLM并非取代程序员,而是增强其能力的工具。它极大加快了代码编写速度,但需要程序员持续关注,纠正AI的错误决策,并进行架构设计和整体把控。经验丰富的程序员能更好地驾驭AI工具,而缺乏经验的程序员则可能被AI误导。未来,架构思维、模式识别和技术判断将变得更加重要,程序员需学习与AI协作,而非被AI取代。
作者使用Claude Code构建了两个应用,体验表明LLM并非取代程序员,而是增强其能力的工具。它极大加快了代码编写速度,但需要程序员持续关注,纠正AI的错误决策,并进行架构设计和整体把控。经验丰富的程序员能更好地驾驭AI工具,而缺乏经验的程序员则可能被AI误导。未来,架构思维、模式识别和技术判断将变得更加重要,程序员需学习与AI协作,而非被AI取代。
Nerdlog 是一款快速、远程优先、多主机终端用户界面 (TUI) 日志查看器,它具有时间线直方图,并且无需中心服务器。它受到了 Graylog/Kibana 的启发,但去除了冗余功能。设置简单,几乎无需配置。Nerdlog 专注于高效地同时查询多个远程机器上的日志,按时间范围和模式过滤日志,并绘制时间线直方图以快速直观地了解情况。主要用例是从一个或多个远程主机读取系统日志(/var/log/messages 或 /var/log/syslog),即使在大型日志文件(例如 1GB 或更大)上也能高效运行。它还支持其他一些日志格式,并可以使用任何日志文件,但这是驱动实现的主要用例。Nerdlog 通过 SSH 连接到每个节点,并在后台保持空闲状态。日志分析在远程节点上完成,每次查询只下载少量数据。大部分数据在传输过程中使用 gzip 压缩,从而节省带宽。它支持 Vim 风格的键绑定和命令行界面,提供多种导航和操作方式。
一位独立开发者讲述了他开源项目Spegel被微软复制的经历。Spegel旨在解决Kubernetes集群镜像注册表宕机导致的扩展性问题。在与微软工程师交流后,开发者本期待合作,却发现微软发布了名为Peerd的项目,该项目与Spegel功能高度相似,代码结构、注释甚至测试用例都几乎一致,疑似直接抄袭。这给开发者带来了巨大的打击和困惑,也引发了对大型企业与独立开发者合作模式的反思,以及开源项目许可证和维护的讨论。
Terminology 1.14.0 版本发布了!此版本增加了匈牙利语和斯洛伐克语的翻译,改进了多种语言的翻译,并修复了多个错误,包括启动时的半透明背景问题和轮询事件问题。还添加了通过转义码报告或设置选择的功能,以及对表情符号双倍宽度配置的支持。此外,内部代码也得到了改进,并增加了新的配色方案。
本文探讨了编程语言中管道操作符(如Rust的链式调用、方法链)的优势。作者认为,管道操作符通过将数据处理步骤线性化,显著提升了代码可读性和可维护性。与嵌套函数调用相比,管道操作符使得代码更易于阅读、修改和调试,也更利于IDE代码补全和版本控制。文章以Rust、Haskell、SQL等语言为例,详细阐述了管道操作符在不同编程范式中的应用,并比较了不同风格的优缺点。
本文介绍了一个利用Python无限生成器递归定义数学函数的巧妙技巧。通过递归定义正整数生成器,并结合泰勒级数展开式,作者展示了如何仅通过积分关系,无需预先定义e^x、sin x和cos x的具体表达式,就能递归地生成它们的泰勒级数展开系数。最后,文章还给出了优化方案,利用装饰器memoize提升效率,避免递归深度限制和性能问题。
谷歌在Pixel手机的Android 16 Beta 4版本中,为Linux终端应用去除了16GB的存储空间限制,用户现在可以根据需要调整虚拟机的存储空间大小。未来,谷歌计划采用动态气球技术,自动调整虚拟机的存储空间,无需手动设置。尽管目前该功能尚不支持图形界面和音频输出,但这标志着Pixel手机向强大的便携式电脑迈进了一大步,为在Android系统上运行Linux桌面应用提供了更多可能性。
本文作者认为正则表达式并不像很多人想象的那么复杂。通过聚焦核心概念——字符集、重复、分组和 |、^、$ 运算符——就能轻松掌握正则表达式的强大功能。文章详细解释了这些核心概念,并建议忽略一些不常用的“快捷方式”,以避免不必要的复杂性。作者强调,掌握正则表达式能用极少的代码完成大量文本处理工作,效率远高于传统程序代码。
Joplin是一款功能强大的开源笔记应用,支持Markdown、插件扩展和多媒体内容。最新版本3.2增加了备受期待的多窗口支持、多列布局以及增强的辅助功能和主题检测。它支持多种同步方式,包括端到端加密的云同步和本地存储。尽管基于Electron,资源消耗相对较高,但其丰富的功能和活跃的社区使其成为一个值得尝试的笔记应用。
这个网站令人印象深刻地展示了其强大的多语言支持能力,涵盖了从欧洲到亚洲的多种语言,包括中文、英文、法文、西班牙文、德文等等。这对于希望拓展全球市场的企业或组织来说,无疑是一个非常有价值的资源。
Python 3.14 将引入一项令人兴奋的新特性:模板字符串 (t-strings)。它们是对 f-strings 的改进,解决了 f-strings 在处理用户输入时存在的安全风险,例如 SQL 注入和跨站脚本攻击。t-strings 将字符串格式化与字符串内容分离,允许开发者在格式化之前对动态内容进行安全转义处理。这使得 t-strings 更加灵活,可以用于更复杂的字符串处理场景,例如生成安全的 HTML 代码。开发者可以通过访问 t-strings 的 .strings 和 .values 属性来处理字符串和值,并进行自定义的格式化。t-strings 也支持迭代,方便开发者进行处理。这将大大提高 Python 代码的安全性,并拓展字符串处理的可能性。
本文介绍了一个对TikTok虚拟机(VM)进行逆向工程的项目。TikTok使用自定义虚拟机作为其混淆和安全层的一部分。该项目包含用于反混淆webmssdk.js(其中包含虚拟机)、将TikTok的虚拟机指令反编译成可读形式、注入脚本以用反混淆的VM注入器替换webmssdk.js以及生成可用于执行基于身份验证的请求(例如发布评论)的签名URL的工具。该项目克服了代码混淆的挑战,例如使用括号表示法和函数调用伪装,最终成功地反混淆并反编译了虚拟机,并能够生成用于身份验证请求的签名。
大型语言模型加载速度慢是开发者的痛点。本文介绍了一种PyTorch训练代码热插拔方案,通过后台进程保持模型常驻VRAM,从而实现秒级启动。即使脚本退出,模型也依然加载,下次运行即刻可用。该方案还支持远程调试和Dear ImGui UI集成,极大提升开发效率。只需替换`from_pretrained`调用,即可体验即时运行、轻松调试的开发体验。
本文介绍了如何在 Haskell 中使用测试间谍(test spy)来测试邮件发送功能,而无需实际发送邮件。通过将邮件发送函数替换为一个记录函数调用参数的桩函数,并在测试断言阶段检查记录的信息,可以有效地测试副作用,提高测试速度和可靠性。这种方法避免了依赖真实服务,使测试更加隔离和快速。
一位开发者成功地在运行DOS的古董PC上运行了大型语言模型(LLM)!他利用Andrej Karpathy的llama2.c项目,将Meta的Llama 2模型移植到DOS系统,并在Thinkpad T42(2004)和Toshiba Satellite 315CDT(1996)等老旧电脑上进行了演示。尽管面临着内存映射、浮点运算等挑战,他最终通过Open Watcom编译器和DOS扩展器成功运行了模型,虽然速度较慢,但这项成就令人惊叹,展现了复古计算的魅力。
作者在维护博客软件的过程中,发现单进程架构比CGI架构更易于处理现代Web的复杂性。单进程架构允许轻松访问共享状态,从而简化了诸如检测恶意流量、限制请求频率以及实现缓存等任务。虽然存在内存和CPU使用方面的考量,但单进程架构的易于实现性使其在应对各种滥用行为时更具优势,尤其是在应对未知攻击类型时。作者认为,随着网络滥用行为的持续增加,单进程架构将成为越来越重要的解决方案。
本文循序渐进地讲解了Python装饰器的原理。作者以一个追踪`print()`函数参数的例子入手,引出闭包的概念,逐步构建一个可以记录任意函数参数的装饰器。文章避免了直接使用`@`语法,而是从底层原理出发,详细解释了装饰器的运作机制,最终实现了一个通用的装饰器函数。
现代定理证明器和优化编译器依赖于一种巧妙的技术:E-匹配。它不仅匹配语法,更重要的是匹配语义,通过E-图(E-Graph)和一致闭包实现等价性推理。本文深入探讨了E-匹配的原理,特别是如何利用判别树和一致闭包高效地查找E-图中的匹配模式,避免了传统递归遍历的低效。作者还介绍了其在Zob编译器中的应用,通过编译模式为虚拟机指令,实现了高效的模式匹配,显著提升了优化效率。
TikZJax 是一款强大的 JavaScript 库,可以在浏览器端直接渲染 TikZ 代码生成 SVG 图片。它巧妙地利用 WebAssembly 技术,将 Pascal 编写的 tex 编译成 WebAssembly 代码,并在浏览器中执行,最终将 TikZ 代码转换为 SVG,从而实现无需服务器端渲染的便捷体验。这对于需要在网页中展示数学公式、图表等复杂图形的用户来说,无疑是一个极大的福音。
本文探讨了 TypeScript 中错误处理的现状和改进方法。传统的 try...catch 方法在简单场景下有效,但在复杂应用中存在类型安全和可扩展性问题。文章比较了 Go 风格的返回值元组和基于 Result 类型(如 neverthrow 库)的 Monadic 风格两种现代方法。Go 风格更易于上手,但代码冗余;Monadic 风格更强大,但学习曲线较陡峭。作者建议根据项目复杂度和团队技能选择合适的方法,简单应用可继续使用 try...catch,复杂应用则考虑 Result 类型以提高类型安全和代码可读性。
本文探讨了事务系统的核心组成部分:执行、排序、验证和持久化。这四个步骤的顺序和并发方式决定了数据库的特性。文章以FoundationDB、Spanner、TAPIR、Calvin和CURP为例,分析了不同数据库系统如何巧妙地编排这四个步骤,从而实现不同的性能和一致性权衡。作者还列举了所有可能的步骤组合,为构建新型事务系统提供了无限灵感。
本文介绍了 Falsify,一个 Haskell 的新型属性测试库,它借鉴了 Python Hypothesis 库的思想,实现了内部收缩(internal shrinking),并在 Haskell 的惰性求值特性下,能够高效地处理无限数据结构。不同于 QuickCheck 的手动收缩和 hedgehog 的集成收缩,Falsify 使用样本树(sample tree)而非样本流来表示测试数据,这使得它的收缩过程更可预测,更易于理解,并能更好地处理 monadic bind。
本文详细介绍了Keyhive项目中用于数据同步的新协议Beelay。Beelay是一个基于RPC的协议,旨在解决Automerge现有同步协议在处理大量文档和加密数据方面的不足。它通过Ed25519密钥进行身份验证,并使用RIBLT算法高效地同步Keyhive成员关系图和文档集合。为了防止中间人攻击和重放攻击,Beelay在消息中加入了接收者公钥和时间戳。此外,Beelay还引入了Sedimentree协议,用于高效地同步Automerge文档内容。
arXivLabs是一个框架,允许协作者直接在arXiv网站上开发和分享新功能。参与arXivLabs的个人和组织都认同并遵守arXiv的开放性、社区性、卓越性和用户数据隐私的价值观。arXiv致力于这些价值观,只与遵守这些价值观的合作伙伴合作。如果您有想法可以为arXiv社区增值,请了解更多关于arXivLabs的信息。
Tini是一个极简的容器初始化工具,它能有效防止僵尸进程的产生,确保信号正确处理,从而提高容器的稳定性和可靠性。Tini在Docker 1.13及以上版本中已内置,只需添加`--init`参数即可启用。对于旧版本Docker或其他容器运行环境,可以手动安装Tini并配置为入口点。Tini还支持多种高级选项,例如子进程收割器、退出码重映射和信号转发,以满足各种复杂的容器使用场景。
gh-gfm-preview是一个用Go语言编写的命令行工具,可以让你在本地预览GitHub风格的Markdown文件(GFM)。它无需网络连接,速度快,无依赖,零配置,并支持实时重载、自动打开浏览器等特性。你可以通过`go run github.com/thiagokokada/gh-gfm-preview`运行它,或者作为GitHub CLI扩展安装。该工具还提供多种命令行选项,例如强制暗黑模式、禁用自动打开浏览器等。甚至可以在Neovim中集成,实现一键预览Markdown文件的功能。
作者长期以来热衷于定制Linux桌面主题,尝试过各种面板、插件和主题,但最终因维护成本过高而放弃。后来,他发现了可引导容器技术(bootc),这允许用户将操作系统定义为Containerfile,从而轻松创建、测试和回滚自定义桌面环境。通过bootc,可以轻松创建和管理包含自定义主题、字体和应用程序的容器,避免了传统方法中配置文件漂移和系统损坏的问题。作者甚至创建了自己的基于Fedora的桌面环境Blue95,并将其发布到Hacker News,引发了关于“Linux发行版”定义的讨论。文章最终认为,bootc模糊了传统Linux发行版和可引导容器的界限,带来了一种更灵活、安全和便捷的桌面定制方式。
Zig 语言的编译时 (comptime) 功能强大,支持泛型、条件编译等,但其设计上刻意限制了某些功能,例如不允许动态代码生成、自定义语法扩展、运行时类型信息 (RTTI) 和 I/O 操作。文章深入探讨了这些限制背后的原因,以及 Zig 如何通过部分求值和类型特化等机制,在限制中实现高效且易于理解的元编程。通过一个自定义打印函数的例子,展示了 Zig 如何在不依赖 RTTI 的情况下实现类型安全的运行时反射。最终,文章赞扬了 Zig 在元编程上的独特优雅之处,它虽然功能不如其他语言强大,但在实际应用中却异常高效易用。
大型语言模型(LLM)在辅助编程方面展现出巨大潜力,但其便利性也引发担忧。LLM擅长处理已知问题,快速生成代码,但这可能导致工程师依赖LLM,削弱独立解决问题的能力,特别是面对新颖挑战时。作者认为,LLM与搜索引擎不同,它更倾向于直接提供答案而非探索过程,这不利于培养工程师的深度思考和问题解决能力。盲目依赖LLM可能使工程师失去对算法的掌握,最终阻碍科技进步。
作者尝试使用Perplexity AI的API来追踪他感兴趣的作者的新书。虽然Perplexity AI基于网络搜索,结果不稳定,存在幻觉,但通过一些巧妙的提示工程和代码编写,作者成功地构建了一个系统,可以相对高效地列出特定作者的新书。尽管存在重复和不一致的问题,但这仍然是一个利用LLM解决实际问题的有趣案例,也体现了LLM的潜力与局限性。