1作者: alielmorsy1910 天前
大家好,HN, 我一直在开发一个 GUI 库,遇到了一个熟悉的问题:我需要一个轻量级、可预测且易于集成的布局引擎。我没能找到完全符合我要求的,所以最终决定自己构建一个。那个项目就是 Masharif。 Masharif 是一个完整的 Flexbox 布局引擎。它支持外边距、内边距、间隙以及全套 flex 属性,其行为与 Flexbox 在 Web 上的工作方式非常接近。 一些技术说明: - 完整的 Flexbox 实现 - 支持外边距、内边距、间隙和嵌套布局 - 设计简单,易于嵌入和理解 性能(使用 10,101 个节点测试): - 初始布局:约 0.87 毫秒 - 单个属性编辑(宽度):约 0.07 毫秒 - 100 次属性编辑(flex-grow 切换):约 0.07 毫秒 - 结构性更改(移除子节点):约 0.75 毫秒 为什么需要另一个布局引擎? Yoga 是显而易见的行业标准,但我想要一些更符合 C++ 习惯用法的东西,而不是 C 风格的 API。但最重要的是,我想通过自己构建一个来迎接挑战,真正理解问题所在。 我很乐意收到反馈、批评或提问。
1作者: bazlightyear10 天前
一种贪婪的基于短语的tokenizer,在压缩方面优于GPT-4和GPT-4o的tokenizer,且词汇量更小。 基准测试 (enwik9, 1 GB): Tokenizer 词汇量 总Token数 压缩比 吞吐量 GreedyPhrase 65,536 222,805,405 4.49x 47 MB/s Tiktoken o200k_base (GPT-4o) 200,019 270,616,861 3.70x 4.35 MB/s Tiktoken cl100k_base (GPT-4) 100,277 273,662,103 3.65x 7.13 MB/s GreedyPhrase: 比GPT-4好1.23倍,比GPT-4o好1.21倍。词汇量小1.5-3倍,编码吞吐量高6-11倍。 工作原理: 1. 短语挖掘 — 分割成原子单元(单词、标点符号、空格)。挖掘二元组/三元组。热门短语占据95%的词汇槽位。 2. BPE回退 — 在剩余的字节序列上训练BPE。填充剩余的5%词汇。 3. 贪婪编码 — 最长匹配优先的Trie树。未知词的字节回退(零OOV)。
1作者: Winsaucerer10 天前
嗨!很高兴分享我的项目 spawn,一个数据库迁移/构建系统。目前,它通过 psql 支持 PostgreSQL,用于创建和应用迁移,以及编写黄金文件测试。我认为它有一些创新之处,与其他我尝试过的选项相比,它非常有用。 GitHub: [https://github.com/saward/spawn](https://github.com/saward/spawn) 文档: [https://docs.spawn.dev/](https://docs.spawn.dev/) 感谢 minijinja ([https://docs.rs/minijinja/latest/minijinja/](https://docs.rs/minijinja/latest/minijinja/)),它让很多精彩成为可能! 一些特性(目前仅支持 PostgreSQL via psql): * 将函数/视图/数据存储在单独的文件中 * Git diff 准确显示新迁移中函数的变化 * 轻松编写函数/视图/触发器的测试 * 特定于环境的变量,因此迁移仅将测试数据应用于开发/本地数据库目标 * 从 JSON 文件生成数据 * 用于轻松生成可重复 SQL 的宏,以及其他很酷的技巧(例如,视图的拆卸和重新创建) 我大约两年前开始了这个项目。终于能够将其打造成我满意的 MVP 状态。我喜欢使用 PostgreSQL 及其所有特性,但目前可用的工具使得利用其中一些特性更具挑战性。 我创建 spawn 是为了解决我个人的痛点。主要问题是,如何管理视图和函数等内容的更新?这存在一些挑战(spawn 并没有解决所有问题),但主要问题是创建和审查迁移。典型的(没有 spawn)方法之一是: 1. 将函数复制到新的迁移中并进行编辑。这使得 PR 审查变得困难,因为你看到的只是一个大的新更改块。 2. 可重复的迁移。如果这些迁移依赖于可重复迁移的 DDL 或 DML,则在从头开始构建时,这会破坏旧的迁移。 3. Sqitch 重构。有效,但总体上使用 DAG 有点麻烦,并且我在 sqitch 的变量支持(和 Perl)方面遇到了限制,无法满足我想做的其他事情。 Spawn 是我尝试解决这个问题的方法,以及一种简单(单个二进制文件)的方式来编写和运行测试。你: * 将视图或函数存储在其自己的单独文件中。 * 使用模板将其包含在你的迁移中(例如,{% include "functions/hello.sql" %}) * 构建迁移以查看最终的 SQL,或将其应用于数据库。 * 将迁移固定以永远将其锁定到当前组件。这与“git commit”非常相似,即使你以后更改 functions/hello.sql,也可以让旧的迁移与首次创建时一样运行。 * 稍后通过在原地编辑 functions/hello.sql 并将其导入到你的新迁移中来更新函数。Git diff 准确显示了 hello.sql 中的更改。 请查看它,让我知道你的想法,希望它对你来说也像对我一样有用。谢谢! (AI 披露:大约 90% 的非测试代码由我编写,在核心架构到位后,AI 更多地用于协助生成文档)
4作者: fdneng10 天前
我从大学毕业后,一直在 Y Combinator 孵化的初创公司工作。现在,我在一家公司开发深度分布式系统产品,周围都是才华横溢的工程师,他们似乎都非常擅长自己的工作。他们对很多事情都有我难以理解的知识和直觉。 最近,我感到力不从心——感觉我更多地是在为产品中那些不那么令人兴奋的部分做贡献,而不是参与“酷炫”或核心的工程挑战。 除此之外,我还是一个移民,我和我的妻子也即将迎来我们的孩子。平衡这一切和一份完全远程的工作非常困难,有时我感觉自己失去了一些能力或敏锐度。我正在采取措施解决这个问题——我很快会和心理医生谈谈——但我真的想知道:在一个高水平的工程团队中工作时,人们如何克服这些感受?