Weekly#17
News | Article
logo.css
CSS 的 logo 确定了,颜色是 rebeccapurple (#663399),这个颜色是以一个人的女儿的名字命名的。
如果君士坦丁堡可以是一座城市,七月可以是一个月份,星期四可以是一天,那么 “丽贝卡紫” 肯定也可以是一种颜色。
在我看来,这就相当于用亲人的名字命名一颗星星。尽管不是每个人都能用自己的名字来命名一种颜色,但在这种情况下,你的伙伴们用这种令人感动和贴心的方式来认可你以及你对 CSS 的重要性。最重要的是,让大家记住丽贝卡。
Hacker News Comments: CSS gets a new logo and it uses the color `rebeccapurple`
Writes and Write-Nots
写作是思考,如今很多写作可以借助 AI 完成,如果都用 AI 完成写作,相当于把思考的过程交给了 AI,长此以往,去思考的人或许会越来越少。
写作就是思考。实际上,有一种思考只能通过写作来完成。你无法比莱斯利·兰普特更好地阐述这一点:
如果你在不写的情况下思考,你只是在认为自己在思考。
所以一个分为写者和不写者的世界比听起来更危险。这将是一个思考者和不思考者的世界。我知道我想要在哪一半,我敢打赌你也是。
这种情况并非前所未有。在工业化之前,大多数人的工作使他们变得强壮。现在,如果你想变强,你就要锻炼。因此,仍然有强壮的人,但只有那些选择这样做的人。
写作也是如此。仍然会有聪明的人,但只有那些选择成为聪明的人。
Bluetooth 1.0 to 6.0 explained: How do Bluetooth versions differ from each other?
蓝牙是一种用于无线连接设备的多功能、低功耗解决方案,最初的设计理念是无线语音通话。
比较让我惊讶的是,原来蓝牙可连接的距离是很远的,蓝牙 5 甚至可以达到 240 米的传输距离。
但是我的手机和音箱经常隔了墙,信号就差很多了,可能是版本比较低?
蓝牙 5.2 还引入了音频广播(audio broadcast / Auracast),可以将同一个蓝牙源广播到多个设备,这样就可以一个手机放歌,几个人一起听了。
像是这些版本对比, 问 ChatGPT 不同蓝牙版本的区别是什么,也能得到一个简洁的答案。
5 Non-LLM Software Trends To Be Excited About
LLM 发展迅猛,很多人都在关注,但除了 LLM,其他一些技术也在进步,文章例举了一部分,并且提供了很多相关链接:
Local-first software
本地优先是用户体验的自然下一步。在本地持久化可以实现近乎零延迟的交互、更好的用户体验以及在低互联网连接或无互联网连接情况下更灵活的客户端。
我预测,随着未来用户对软件的期望不断提高,这一点将变得尤为重要。
WebAssembly
WASM 允许开发人员绕过服务器端处理,在浏览器中运行复杂的应用程序。
SQLite’s Renaissance
Kent Dodds 认为,您或许可以在生产中直接使用 SQLite。Ruby Conf 的 Stephen Margheim 也这么认为。
无论您是否同意,他们提出的支持 SQLite 的观点都很有价值:
- 零延迟
- 简化设置
- 轻松实现多实例复制
- 可处理海量数据库(超乎你的想象)
- 更易于开发和测试。
- Cross-Platform is getting better (React Native, Flutter)
Automated reasoning
自动推理侧重于使用逻辑和数学证明来确保系统按照预期运行。
与验证特定场景下系统行为的传统测试不同,自动推理允许工程师验证所有可能场景下的正确性。
从根本上说,这是从被动测试向主动验证的转变,从而(理想情况下)提高可靠性和安全性。
Tutorial
Exploring the browser rendering process
从输入 URL 到浏览器渲染的过程,交互式的文章,还不错。
Code
Monorepo - Our experience
Ente 将它们的 repo 迁移成了 monorepo 的架构。
如果让我总结一下两者之间的区别的话改用 monorepo 并没有带来太大的变化,但所带来的微小变化却是积极的。
迁移到 monorepo 带来的一些好处:
- 以前一个改动涉及到多个 repo,现在变成了 monorepo 的一次整体的改动,review,merge,revert 都方便了一些
- 减少了子模块 (Submodules) 的使用
- 分散的 star 现在汇聚到了一起,看起来 star 更多了
- 让不同 repo 的维护人员了解其他 repo 的改动和进度,原来只关注产品中自己维护的部分,而现在可以从整体去看待产品,增加了彼此之间的连接性
但随着时间的推移,我发现这些“环境线索”会在潜意识中自动地让我对“周围发生的一切”有一个很好的感知。
有哪些功能正在开发,处于哪个完成阶段,有哪些错误修复,最近发布了哪些版本。
当我打开拉取请求页面,无意间看到其他人正在做的事情时,也会发生类似的偶然信息交流。
最棒的是,所有这些都是自然而然地,毫不费力。每个人都在做自己的事情,只是因为在同一个共享数字空间里做这些事情,就会产生一种意识和连通感。
不过文章中有一点和我对 monorepo 的认识不一样的:
There still are no "repository wide" guidelines, except two:
- There should not be any repository wide guidelines
- Don't touch the root folder
我之前理解可以将一些公用的配置和依赖放到最上层,其他 repo 可以继承和引用,但是当不同 repo 依赖不同的时候,确实是会有点问题。
我想还是取决于 monorepo 的类型,如果是业务相同,但技术栈不同的 monorepo,确实不适合统一的配置。
如果像是组件库这样的 monorepo,技术栈基本一致,只是部分依赖不同,倒是可以考虑统一的配置。
Put business logic in the application, not the database
避免把 SQL 写得太复杂,使得数据库查询压力太大。
相反,应该将复杂的业务逻辑放到业务服务中实现,当查询压力大的时候,业务服务器相比数据库更容易扩展。
…但是,通过尽可能多地删除这些复杂查询,可以减少对稀缺数据库资源的依赖,增加对高可用应用程序级资源的依赖。
因此,下一次当你看到那个使用多重连接和复杂过滤逻辑的又大又长的查询时,不要为它感到骄傲!取而代之的是研究如何用更简单的查询(也许是多个查询)和在应用层中执行的业务逻辑来替代它。
随着应用规模的扩大,灵活性的提高将使您受益匪浅。
JavaScript Import Attributes (ES2025)
核心问题是安全。在网络上,文件扩展名并不能可靠地表示内容。以 .json 结尾的 URL 实际上可能提供的是 JavaScript。
这里虽然 import 的是 json
文件,但里面可能是 JS 代码。
// This looks safe, but could be dangerous import config from './config.json'; // The server could respond with executable code: export default (function(){ // Unexpected code execution })();
通过 import attributes 确保一定是 json
内容。
// Explicitly require JSON import config from './config.json' with { type: "json" }; // Or specify JavaScript import module from './module.js' with { type: "javascript" }; // Works with dynamic imports too const data = await import('./config.json', { with: { type: "json" } });
What's a Single-Page App?
文章讨论了什么是单页面应用,从四个维度:
- SPA(Single Page App)
- MPA(Multi-Page App)
- SSR(Server-side rendering)
- CSR(Client-size rendring)
分析当前的一些 web 框架。
这些都不是什么开创性的观点。
但我同意托马斯的观点,不精确的术语无助于在热热闹闹的互联网争论论坛上进行任何讨论。
希望在我们讨论何时何地适合使用这些架构时,这能作为一个参考点。
Imperative vs Declarative Programming
Imperative programming is how you do something, and declarative programming is more like what you do.
一篇解释命令式编程和声明式编程的文章,还不错。
Cool Bit
MomBoard: E-ink display for a parent with amnesia
作者的母亲有健忘症,没法形成长期的记忆,于是作者用墨水屏做了一个 MomBoard,用来显示家人的留言,缓解母亲记不起事情的焦虑。
实现的技术栈不复杂,虽然简单但是可靠。
ping-clock
把 ping 的时间用实体表盘显示出来。
No GPS required: our app can now locate underground trains
地铁里信号不好,GPS 信号也差,这样就不方便知道现在到了什么站。
作者找到了一种离线的,不需要 GPS 也能定位位置的方法。
原理是用手机记录所有地铁的一些加速度数据,用这些数据训练模型,然后让模型预测当前的位置。
Audio Decomposition
将音乐分离成组成乐器的开源软件。从零开始制作,无需外部乐器分离库。
蛮有趣的,有的音乐不知道有什么乐器组成,可以分解一下看看。
Emoji 的隐藏玩法
一些 Emoji 里的彩蛋。
Tool | Library
pagefind
Pagefind 是一个完全静态的搜索库,其目标是在大型网站上运行良好,同时尽可能少地占用用户带宽,并且无需托管任何基础设施。
我的博客用 pagefind 实现了一个搜索页面,你可以试试看。
我把搭建碰到的一些问题也写了篇文章:使用 pagefind 添加博客搜索功能。
Component party
通过示例展示不同前端框架的语法。
如果你熟悉 Vue,想了解对应的语法在 React,Svelte,Angular 中怎么写,这个网站提供了相关的示例。
许多 JS 开发人员并不了解现有的每个 JS 框架,它们都有自己的语法和功能。
我们该如何解决这个问题呢?开发人员喜欢通过示例了解框架概述。这是在深入了解之前的快速入门。
STAR
A easy to use web app to align your antenna with any satellite using your phone's motion sensors and location.
一个网页应用,可以用来追踪卫星的位置。
lexical
An extensible text editor framework that does things differently
需要集成文本编辑器的时候可以考虑一下。
Animated Art Avatar
又一个头像制作网站,不同的是它还有动画,下载后是带动画的 SVG。
兔子随机头像
另一个头像生成网站。
Napkin
一个 AI 工具,将文字转换成视觉元素,效果看起来不错。
Watermark Anything
可以给任意内容添加水印。
pqoqubbw/icons
beautifully crafted animated icons
iCraft Editor
从二维到三维,iCraft 3D Editor 可帮助您轻松创建直观的三维架构图,让复杂的系统一目了然!
一些话
Proxmox VE Helper-Scripts Project Update (EDIT)
这段经历让我意识到生命是多么短暂而珍贵——所以要珍惜每一刻,珍惜你拥有的时间。
Lessons from my First Exit
一家高效的公司应该拥有一套定义明确的流程和一支知道如何执行这些流程的团队。
Will we care about frameworks in the future?
我相信,软件开发正在进入一个根本性的转变,而这个转变目前是由 Replit 这样的代理驱动的,在这个世界上,人们实际上再也不需要直接操作代码了。
当我在这里或那里向代理发出一些提示,对应用程序的功能进行广泛而彻底的修改时,软件似乎并不在意多个视图中的代码是否重复,也不在意共享逻辑、可扩展性或组件的可继承性……它只是实现它需要做的事情,而且做得越虚无越好。
Get Me Out Of Data Hell
代码归根结底只是屏幕上的字符,软件工程师所做的不过是将代码敲打成能激发快乐和金钱的形状。
Music
世知のバラード
一首我觉得很精彩的爵士乐,一开始是安静的钢琴,慢慢加入了萨克斯,以及后面即兴的萨克斯,交织的声音挺迷人的。
Schoolgirl byebye
这周去听了他们的 live,两人在一起 15 年了,他们的音乐听起来比较浪漫,推荐几首我喜欢的: