互联网养育[1]
吉米·米勒在贫困中长大,由于父母的境遇,他一直面临食物短缺的问题。他学会了如何在有限的食物预算下消费,依靠拉面和 Velvetta 奶酪等廉价食物度日。
电脑成为他逃避现实挑战的出口。他买了一台旧电脑,通过在线资源自学 Linux,克服了配置无线连接等技术障碍。
他通过 hackthissite.org 和 projecteuler.net 等网站磨练自己的技能,学习编程语言并构建项目。
米勒将自己的成功归功于开源社区和网上免费提供的知识。他强调了教程、开源软件、科技新闻和博客对他的教育和个人成长的影响。
他向那些无偿分享自己作品的匿名人士表示深切的谢意,这些作品帮助他摆脱贫困,过上了更好的生活。他承认,这些贡献者可能并非有意要激励他,但他强调了他们的行动所产生的深远影响。
技术债务分类[2]
- • 了解技术债务: 技术债务本质上是开发过程中走捷径的成本。它代表着为了更快地发布功能而做出的妥协,但这些决定可能会导致未来的问题。
- • 衡量技术债务:
- • 影响: 债务对用户和开发者的影响有多严重?
- • 修复成本: 解决这个问题需要花费多少时间和精力?
- • 传染: 问题有多容易蔓延到代码库或数据的其他部分?
- • 技术债务的类型:
- • 局部债务: 特定模块内孤立的、混乱的代码。可以将其视为一个可以工作但难以理解或修改的“黑匣子”。
- • MacGyver 债务: 两个或多个系统用胶带粘在一起,具有复杂的转换功能。它虽然实用,但很脆弱,难以维护。
- • 基础债务: 整个系统建立在错误的假设之上,因此本质上不稳定。这种债务是最难解决的。
- • 数据债务: 大量数据受到底层代码问题的影响。修复此问题通常需要人工干预和仔细测试。
- • 解决数据债务:
- • “正确做法复选框”: 引入一个切换按钮,允许创作者在旧(损坏)行为和新(修复)行为之间进行选择。这可以实现逐步过渡,同时最大限度地减少干扰。
- • “修复该死的东西”: 直接解决错误,然后修复所有受影响的数据。grep、正则表达式搜索和有针对性的测试等技术可以帮助降低风险。
- • 传染的力量: 虽然传染通常是一种负面力量,但可以利用它来更有效地传播解决方案而不是问题。让您的解决方案具有传染性!
一些 Go web 开发笔记[3]
Go 的简单性和内置的 Web 服务器使其成为构建小型网站和 API 的理想选择。
- • 作者最初怀疑他们的 Go 应用程序存在内存泄漏,但后来意识到他们需要调整垃圾收集器设置。
- • Go 的默认垃圾收集器允许分配的内存最多为当前堆大小的两倍,这导致作者的应用程序出现内存不足 (OOM) 错误,因为该应用程序的基本堆大小为 170MB,而 VM 内存有限。
- • 他们通过将
GOMEMLIMIT环境变量设置为 250MB 来解决这个问题,当内存使用量接近该限制时就会触发垃圾收集。 - • 作者强调了他们喜欢使用 Go 构建网站的几个原因:
- • 部署简单:单个静态二进制文件可以轻松复制和部署。
- • 内置 Web 服务器:适合生产使用,无需外部 WSGI 配置。
- • 易于安装:Go 的工具链可通过包管理器轻松获取。
- • 直观的 HTTP 处理:该
net/http包提供了用于发送 HTTP 响应的直接函数。
- • 他们欣赏 Go 是一种面向系统的语言,这使得它能够方便地与 ioctls 等低级功能进行交互。
- • 作者对比了他们使用 Go 和 Rails 的经验,发现 Go 项目由于其清晰易懂的代码结构,在较长时间后更容易重新审视。
- • 作者尚未广泛探索的 Go 领域包括:
- • HTML 模板:主要依靠前端的 API 和单页应用程序。
- • 登录系统和安全功能(如 CSRF 保护):由于不熟悉实施,避免需要这些功能的项目。
- • 作者最后表达了对 Go 新功能的兴奋之情,并强调了及时了解发行说明的重要性。
Pagoda:使用 Go 编写的快速、简便的全栈 Web 开发入门套件[4]
- • 简化的表单验证: 该框架通过将验证错误存储在以字段名称为键的映射中,使表单验证更加容易。它还提供了辅助方法,用于根据验证状态应用 CSS 类(绿色表示有效,红色表示无效)并提取错误消息以显示在模板中。
- • 可自定义的错误消息: 验证器包负责处理初始验证,而框架则通过将基于标签的验证失败转换为更易于阅读的消息来增强错误消息传递功能。开发人员可以根据需要扩展此功能以处理其他验证标签。
- • 模板集成验证: 要在模板中实现内联验证:
- 1. 为表单元素添加状态类(例如
{{.Form.GetFieldStatusClass "Email"}})。这将根据验证结果动态应用绿色或红色突出显示。 - 2. 如果验证失败,请使用
{{template "field-errors" (.Form.GetFieldErrors "Email")}}构造显示与特定字段相关的错误消息。
- 1. 为表单元素添加状态类(例如
- • HTTP 标头和状态代码: 框架允许通过 Page 对象和上下文设置 HTTP 标头和状态代码。
- • 元标记管理: Page 对象提供了一种设置基本 HTML 元标记(描述和关键字)的便捷方法。
{{template "metatags" .}}包含一个模板组件 ( ),用于在布局中呈现这些元标记。 - • URL 和链接生成:
- • Echo 的反向功能(
{{url "user_profile" 1}})根据命名路线生成 URL,简化模板内的链接创建。 - • 辅助函数(
{{link (url "user_profile" .AuthUser.ID) "Profile" .Path "extra-class"}})根据当前路径创建具有可选活动类样式的链接。
- • Echo 的反向功能(
- • HTMX 集成: 该框架与 HTMX 无缝集成,HTMX 是一个 JavaScript 库,可直接在 HTML 属性内实现 AJAX 交互和动态 UI 更新。示例包括:
- •
boost用于类似 SPA 的页面转换的导航链接。 - • 利用
boost或hx-post用于 AJAX 提交的表格。
- •
- • 电子邮件功能: 该框架包含由“c.Mail”库支持的内置电子邮件功能。您可以使用模板(位于目录中
templates/emails)撰写电子邮件并使用传递动态数据TemplateData。 - • HTTPS 支持: 入门套件默认使用 HTTP,但提供了一种启用 HTTPS 的简单方法。您需要通过指定证书和密钥文件的路径来配置 TLS 设置。
- • 日志系统:
- • 由于 Echo 的内置记录器的局限性(缺乏结构化日志记录),该框架有意避免依赖它。
- • 它利用 Go 的
log/slog库进行结构化日志记录,从而更容易以更有条理的方式处理变量和记录数据。
- • 上下文日志记录:
- • 该框架提供了一个简单的
pkg/log包,允许您从 Echo 上下文中设置和检索记录器。当与记录器中间件(如下所述)结合使用时,此功能特别有用。
- • 该框架提供了一个简单的
- • 日志记录中间件:
- •
SetLogger()中间件:初始化记录器并将其设置在请求上下文中。建议将此中间件放在 EchoRequestID()中间件之后,以便给定请求的所有日志都包含唯一的请求 ID,从而轻松关联日志条目。 - •
LogRequest()中间件:替换 Echo 的默认Logger()中间件并为每个传入请求生成结构化日志。
- •
NIST 禁止要求特定密码字符组成[5]
NIST 密码指南更新:讨论的焦点是 NIST(美国国家标准与技术研究所)更新其密码指南。关键变化是不再强制定期更改密码,因为这种做法被认为没有以前想象的那么安全。
赞扬这一变化:许多用户对这一更新表示欣慰和支持。他们强调,强制更改密码通常会导致密码强度降低,因为人们会采用可预测的模式或写下密码。
强调强密码:讨论强调使用强而独特的密码而不是短而易猜的密码的重要性。NIST 建议允许使用较长的密码(最多 128 个字符),并鼓励使用各种字符类型(包括 Unicode 字符)。
对最大密码长度的批评:一些用户质疑密码长度是否需要上限。他们认为,限制密码长度没有任何安全优势,而且可能会妨碍那些想要创建非常强密码的用户。
行业抵制:有观点认为,一些组织可能不愿意采用这些新准则,而是出于习惯或控制需要而坚持过时的做法。
现实世界的例子:用户分享了他们在自己的工作场所遇到密码最佳实践抵制的轶事,凸显了有效实施安全措施的持续挑战。
使用我的 C 网络服务器托管我的网站[6]
- • 动机: 作者从头开始创建了这个最小的 Web 服务器来托管他们的博客,并挑战所有软件都需要大量“实战测试”的想法。他们希望构建一个能够处理真实世界流量的强大系统。
- • 特征:
- • 从目录提供静态内容
docroot/。 - • 支持 HTTP/1.1(即使对 HTTP/1.0 客户端也以 HTTP/1.1 形式回复)。
- • 使用 BearSSL 库实现 HTTPS(需要单独编译并启用 HTTPS 标志)。
- • 从目录提供静态内容
- • 建筑学:
- • 用 C 语言编写,以提高性能和控制。
- • 使用简单的请求-响应模型。
- • 该
respond函数处理传入的请求,匹配路径以提供内容或返回适当的错误代码。
- • 测试:
- • 定期在 Valgrind 和 sanitizers(地址,未定义)下运行以进行内存安全检查。
- • 利用
wrk基准测试工具进行性能测试。 - • 采用 Python 中的自动化测试(
tests/test.py)来确保符合 HTTP/1.1 规范。
- • 部署:
- • 作者使用该服务器来托管他们的博客,使其暴露于现实世界的流量和潜在的漏洞。
- • 他们利用机器人扫描互联网寻找易受攻击的网站,作为一种无意的模糊测试。
- • 已知问题:
- • 即使收到 HTTP/1.0 请求,服务器也始终以 HTTP/1.1 进行响应。
- • 构建过程:
- • 用于
make构建可执行文件:(serve发布)、serve_cov(覆盖)和serve_debug(调试)。 - • HTTPS 支持需要克隆 BearSSL、构建它并在编译期间启用 HTTPS 标志。
- • 用于
- • 定制:
- • 开发人员可以通过修改
respond功能和处理不同的请求路径来添加自定义端点。
- • 开发人员可以通过修改
为什么大多数已发表的研究结果都是错误的 (2005)[7]
- • 假阳性问题: 伊奥尼迪斯认为,大量已发表的研究结果可能是错误的,这并不是因为不诚实,而是因为研究的进行和理解方式存在缺陷。
- • 研究为何出错:
- • 样本小: 参与者少的研究很容易受到随机机会的影响,从而导致误导性的结果。
- • 测试过多: 当研究人员同时检查大量想法时,他们更有可能偶然发现一些看起来很重要的东西(“多重测试问题”)。
- • 出版偏见: 期刊更喜欢令人兴奋的发现,因此那些无聊或负面结果的研究常常被忽略,从而扭曲了我们对事实的看法。
- • 普罗透斯现象: 即使使用类似的方法,对某个主题的早期研究也可能出现各种各样的结果。这表明从初步研究中得出确切结论有多么困难,并强调了重复实验(复制)的必要性。
- • 统计意义与现实世界意义: 仅仅因为某事具有统计意义(不太可能是随机的)并不意味着它在实践中实际上很重要。
- • 解决问题:
- • 更大规模的研究: 更多的参与者意味着更可靠的结果。
- • 预注册: 在收集数据之前公开概述您的研究计划有助于防止研究人员只挑选好的部分。
- • 复制是关键: 独立研究人员应该尝试重复以前的发现以确认它们是真实的。
- • 批判性思考: 始终考虑证据的质量、潜在的偏见以及发现是否真的会对现实世界产生影响。
引用链接
[1] 互联网养育: jimmyhmiller.github.io/raised
[2] 技术债务分类: technology.riotgames.com/news/taxono…
[3] 一些 Go web 开发笔记: jvns.ca/blog/2024/0…
[4] Pagoda:使用 Go 编写的快速、简便的全栈 Web 开发入门套件: github.com/mikestefane…
[5] NIST 禁止要求特定密码字符组成: mastodon.social/@LukaszOlej…
[6] 使用我的 C 网络服务器托管我的网站: github.com/cozis/blogt…
[7] 为什么大多数已发表的研究结果都是错误的 (2005): journals.plos.org/plosmedicin…