Jola

RSS: https://jola.dev/rss.xml
Johanna Larsson 是一名软件工程师、技术领导者、作家和演讲者。

AI 与学习是对立的

作者从日常使用 LLM 编程的体验出发,指出这些工具的设计正在悄然让使用者脱离理解:你问它怎么查 DNS 记录,它直接给你结果而不是命令;它总在你刚想深入时替你执行下一步。 长期来看,开发者逐渐丧失独立编辑代码、理解底层过程的能力,变成“代理管理者”而非工程师。文章把这归因于商业激励——AI 公司需要工程师全面依赖其产品才能支撑估值和利润——而非 LLM 技术本身。 整体是一篇有明确立场、有具体场景、能引发“AI 编程到底在替你学还是在替你替代”争论的观点文。
评论点赞收藏8 天前

把 Bluesky 账号迁到自建服务器,没那么难

把 Bluesky 账号从官方 PDS 迁到自建服务器,过程比想象中简单。作者 @jola.dev 的 PDS 曾宕机几小时,决定迁移到 上运行的 tranquil-pds。 迁移工具是 goat CLI,参考 @bnewbold.net 去年的指南,另有 PDS Moover 等托管服务可选。迁移前需要新 PDS 地址,部分需要邀请码。 建议提前设置 rotation key。
评论点赞收藏22 天前

cove.town:用 Docker Compose 自建完整 atproto 生态

Jola 在 Hetzner 服务器上搭建了一套完整的 atproto 自托管方案,包含 PDS、knot、spindle 和 hold 四个组件,分别负责账号、仓库、镜像构建和 Docker 注册表。 因 Hetzner 不提供 /dev/kvm 访问,无法使用 microvm 引擎,改用 nixery + kaniko 构建镜像。spindle 设有访问控制,非成员创建 PR 不会触发工作流。
评论点赞收藏33 天前

用 CDN 加速 Phoenix LiveView 应用

用 CDN 缓存 Phoenix LiveView 应用的静态资源,源站负载大幅降低。Plug.Static 配合 assets pipeline 自动为 CSS/JS/图片添加版本哈希,可永久缓存。 静态文件通过独立域名分发,动态内容和 WebSocket 仍走源站。配置在 runtime.exs 的 prod 区块完成,改动量小但收益高。
评论点赞收藏35 天前

自建 atproto 容器镜像仓库

自建 atproto 容器镜像仓库(hold),用 Garage 替代 MinIO 做对象存储,Caddy 做反向代理。需要两个域名分别指向 hold 和 Garage,配置.env 文件填入 AWS 兼容的密钥。 Garage 用 SQLite 做元数据,单副本部署,适合已有服务器资源的场景。
评论点赞收藏36 天前

迁移到Tangled的knot2:Docker实战记录

Tangled项目正在从knot迁移到knot2,作者分享了基于Docker的迁移实战经验。迁移前需要重新生成KNOT_MASTER_KEY,并准备旧仓库路径。 作者遇到的第一个问题是官方Containerfile锁定了amd64架构的runner镜像,需要手动去掉sha256 pin才能本地构建。
评论点赞收藏38 天前

在 atproto 上自建 Tangled:代码托管不再孤岛

<p>关注博客文章,账户存在于自己的服务器上,同时还能与诸如以及我想写一点关于如何为.</p><p>注意:《魔发奇缘》团队正在开发新一代组件,包括,,以及基于.会有某种形式的迁移路径,但目前都在积极开发中。</p><p>《魔发奇缘》基本上就是Atproto上的Github。换句话说,《魔发奇缘》提供了仓库托管、配置项操作和社交编码功能。它们的不同之处在于,《魔发奇缘》还没有私人仓库(我们都屏息以待而《魔发奇谈》允许你在参与社交功能的同时,自托管基础设施。如果你正在举办一个或比如,或者说一直在想,这真的是致命功能。其他自托管的 Github 替代品有个副作用,就是“隔离”你,因为没有共享位置能找到所有自托管实例,而且要与仓库交互、创建问题或 PR,用户必须为每个实例创建新账户。在 Tangled 中,你可以运行自己的结和纺锤,但用户可以在共享的应用视图中查找并与它们互动。</p><p>那么,让我们来看看如何自托管当前的两个 Tangled 组件:knot 和 spindle。注意这份指南只列出了一种运行方式,你需要调整一些内容使其更适合自己。</p><h2>Knot,仓库服务器</h2><p>要按照本指南操作,你需要一个可以指向应用的域名,以及一个拥有公共IP的服务器。我会用 Docker Compose,但</p><p>就像PD…</p>
评论点赞收藏41 天前

把 atproto 账号的控制权夺回来

用 rotation key 和 adversarial migration 把 atproto/Bluesky 账号的控制权从服务商手里夺回来。目前已有 6000+ 个 PDS 服务器在运行,每个 handle 通过 DID 文档映射到你的 PDS。 rotation key 解决的是账号被服务商恶意删除或关停的风险,但数据本身仍需自行备份。作者实测使用 goat CLI 工具生成密钥对,将公钥写入 DID 文档即可完成设置,整个过程快速直接。
评论点赞收藏45 天前

没有成本,就没有价值

Johanna Larsson认为LLM生成代码太容易,反而剥夺了创造过程中的价值——价值不仅来自产出物的效用,也来自投入的努力。GitHub上大量vibe-coded项目"出生即死亡",因为没有人为其投入。 她建议开发者在某些项目上选择"难路":手写代码、花一周写规格文档,通过 toil 获得成长和意义。
评论点赞收藏50 天前

Latch - an Elixir atproto OAuth library

As part of building a service for automatically publishing blog posts from RSS feeds into atproto's lexicon, I implemented atproto OAuth for logging in and getting access tokens to publish for the use...
评论点赞收藏55 天前

Limited output is a feature

aka the LLM agent productivity boost is a trap As the tech startup scene continues to find more and more advanced ways to use LLM agents to build software, complete tasks, do research and marketing, a...
评论点赞收藏57 天前

使用 HRW 在 Elixir 中构建分布式限流器

Elixir 开发者提出用 HRW(最高随机权重哈希)替代 Redis 实现跨节点分布式限流,在 10 节点以内集群中性能更优且一致性更好。文章对比了传统一致哈希方案,强调 HRW 在节点增减时仅影响极小比例键映射,适合自动扩缩容场景。 附带 Hammer 框架的 ETS 后端配置与 GenServer 限流模块代码示例,可直接参考落地。
评论点赞收藏63 天前

电脑永远无法被追究责任。

<blockquote>IBM1979年培训手册</blockquote><p>当大型语言模型真正进入状态时,我开始像许多人一样尝试它们,看看它们能帮到我什么。我想看看如何在工作和空闲时间利用它们。从那以后我学到了很多,但我特别记得我开始做的一件事,也看到别人做过:把责任推给LLM。</p><p>我会说“这是克劳德做的一些研究”或者“代理添加了这个功能”之类的话。还有类似的变体:“免责声明,这是克劳德写的”,或者“不是我找到解答,是克劳德找到的”。</p><p>回头看,这真的很吸引人。这就像说“哦,不是我烤面包,是烤面包机烤的”。我擦地板了吗?不,是吸尘器。哦,这段代码我不能负责,我只是写了高级代码,编译器做了所有工作。<br><br>LLM只是我们用来做事的另一种工具(尽管很少有编译器开发者需要付费).但工具本身并不负责它所做的事情。电脑不能被追究责任。<br><br>警察不会因为犯罪逮捕克洛德,他们会逮捕使用该药的人。因为它是一种工具。</p><p><em>顺便说一句,这也是原因之一<code>Co-authored-by: Claude</code>我觉得怪怪的。Claude并没有比VSCode或Node运行时更直接地参与你的代码。也许这只是语义问题,但<code>Assisted-by</code>标签,比如我觉得更合理。</em></p><p>部分原因确实是对代理人所做的工作给予认可,因为代理人让我们只需提供最少的输入就能获得一些东西,<em>看起来</em>努力结束。<br><br>这其中有点羞愧。也许是我的北欧背景,也许是普遍现象。部分原因是我们都在与一…</p>
评论点赞收藏64 天前

Elixir集群101

<p>Elixir(以及其他BEAM语言)的主要优势之一是内置的节点聚类功能, 并实现集群间透明通信。任何分布式系统通常都会附带严肃的免责声明。 要在集群中正确同步状态非常困难,避免网络分裂时的状态损坏或网络不稳定,有效应对滚动部署和代码版本不匹配。</p><p>但这不应该让我们气馁。分布式Elixir(也称为disterl)有广泛的应用场景(以及其他很多东西, 我们真的需要一个统一的名称)。你只需要符合几个基本条件的设备:</p><p>如果有些数据丢失也没关系</p><p>如果有些数据有误也没关系</p><p>只要这些条件符合,分布式灵药和分布式系统其实并不那么可怕。因为它大多数时候都能成功,对于符合这些条件的用例来说,它通常是一个非常好、低成本且性能优良的选择。</p><p>从哪里开始</p><p>首先,你需要确保你的节点是用集群支持的配置启动的。如果你用的是Phoenix和Releases,这可能只是编辑问题env.sh.eex 以添加类似的内容</p><p>导出 RELEASE_DISTRIBUTION = 名称</p><p>export RELEASE_NODE = app @$ ( hostname - i | awk '{print $1}' )</p><p>并确保已配置。</p><p>或者如果你在本地尝试,可以先开几个节点</p><p>第一个终端标签</p><p>国际经济学——先说名字 @ 127.0。0.1</p><p>第二个终端标签页</p><p>IEX —— Name Second @ 127.0。0.1</p><p>它们以分布式模式启动,但仍然没有连…</p>
评论点赞收藏71 天前

如何阻止 Claude 总是说“承重”

<p>看到克劳德把所有东西都称为“诚实的拍摄”和“承重的接缝”,简直抓狂了?.但如果我告诉你, 有办法把这个巨大的挫败感变成荒谬到让你忍不住笑出来,你会怎么想? 或者干脆修正克劳德的词汇。我向大家介绍MessageDisplay钩子。</p><p>首先你需要一个小脚本,并设置一些替换内容:</p><p>#!/USR/bin/env python3</p><p>import json, re, sys</p><p>替换 = {</p><p>“缝隙”:“什么来着”,</p><p>“你说得完全正确”:“我简直是个彻头彻尾的小丑”,</p><p>“诚实观点”:“辣味小玩意儿”</p><p>“承载”:“烹饪”</p><p>}</p><p>data = json.负载(系统标准)</p><p>文本 = 数据。取得(“delta”)或“”</p><p>用短语来说,替换中的替代品。物品():</p><p>模式 = r “\b ” + re。逃脱(短语)+ r “\b ”</p><p>文本 = re。sub ( 模式、替换、文本、旗帜 = re.忽略 :)</p><p>print (json. dumps ( {</p><p>“hookParticularOutput”: {</p><p>“hookEventName”: “MessageDisplay”,</p><p>“displayContent”:文本,</p><p>}</p><p>} ) )</p><p>把它放到 ~/.claude/hooks/wordswap.sh,并用 chmod +x ~/.claude/hooks/wordswap.sh 可执行。然后要连接它,就把它添加到你的 ~/.claude/settings…</p>
评论点赞收藏78 天前

让库保持库的样子

针对 Elixir 应用中将库作为应用运行的反模式提出批评。文章主张库应保持纯粹,避免引入应用层的副作用和生命周期管理。这对设计可复用、低耦合的 Elixir 库具有直接的指导意义,有助于开发者规避常见的架构陷阱。
评论点赞收藏85 天前

在 Tangled 上配置 Elixir CI 工作流

介绍了如何在 Tangled 平台上为 Elixir 项目设置 CI 工作流,包括指定具体的 Elixir 和 Erlang 版本以及配置 PostgreSQL 服务。对于使用 Tangled 的 Elixir 开发者来说,这是一篇实用的操作指南,解决了环境配置的具体问题。
评论点赞收藏88 天前

Appreciation for the Small Web

I’ve increasingly been introducing the small web to my daily reading. The small web is a loosely defined concept, partly an attempt to refocus the internet on old school technology, on text websites w...
评论点赞收藏105 天前

Generating OG Images in Elixir

I recently added per-page OG images to this blog and it was less complicated than I expected. On top of that, I was able to completely stay within the Elixir ecosystem! If you’re not familiar, OpenGra...
评论点赞收藏112 天前

The Social Contract of Writing

LLMs are making inroads into just about every industry on the planet, they’re everywhere now. AI for X, AI for Y, if there’s a thing that somebody is willing to pay for, there’s another person looking...
评论点赞收藏112 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。