Technology
6388 discoveries · Hand-picked discoveries from the open web, newest first.
-
浏览器点2下就能让小爱音箱播放http音乐!
还在被 冈易 QQ 音乐困扰吗,让小爱同学播放NAS上的歌需要几步? https://est.github.io/play2mi/ 装个书签,点两下就行。不需要下载软件,不需要第三方服务器 期间还是碰壁了不少的。也学到不少东西。小米音箱以前应该是openwrt魔改 ubus 控制,后来都改成 Android 了。 这一分裂也导致它内部有两套API接口。一个是 sid=micoapi 一个是 sid=xiaomiio ,前者跑在 小爱云 Mina api2.mina.mi.com ,后者跑在 米家 IoT 云 api.io.mi.com/app 和 api.mijia.tech/app 这次就简单做了 Mina (micoapi) 的支持 能放歌,能 TTS 就行了。要扩展等有缘人吧。 期间搞出来个巨搞笑的插曲,AI 发现浏览器死活登录不上,一度以为是风控了,账号被画像了,IP被标记了,结果是 nonce 计算的时候没用 bigint 精度被截断了。笑死。幸好在去研究 TLS 指纹之前被我拦住了。 这种一般都是低级错误。 然后无聊让AI去扒一下能不能拿到shell,还真有注入漏洞。不过,老固件才行!!气死了!!!!! 算是又填了一个坑吧。对了,这个项目如果想跑在服务器,估计不太行,据说小爱的HTTP对IDC出口有风控。
Est's Blog · ZH
-
HTML里的“宏”
摊牌了,分享两个极少有人知道的技巧。 观察下面的网页 https://lab.est.im/xhtml/ 有没有发现神奇之处 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html [ <!ENTITY my_symbol "★"> <!ENTITY wikipedia '<img height="14" src="https://en.wikipedia.org/favicon.ico" alt="Wikipedia" />'> ]> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Entity test</title> </head> <body> <p>hey &my_symbol; visit &wikipedia; for more!</p> </body> </html> 另外就是刚做的 play2mi 有一个特立独行的想法:不让出现厂牌的关键字,一律用图标 代替。 但是这个 <img height="16" src="https://www.mi.com/favicon.ico" /> 出现得次数太多,就很重复了。有没有 宏/macro 来节约呢? 浑身不舒服。经过一番激烈拷打AI,最终结果: div.wrap param {display: inl
Est's Blog
-
从 Bartender 迁移到 Thaw
我用了很长一段时间的 Bartender。 对于菜单栏里常驻着一大堆应用的 Mac 用户来说,Bartender 确实很好用:不常用的图标可以隐藏,需要时再展开,整个菜单栏看起来清爽很多。尤其是换到带刘海的 MacBook 之后,菜单栏空间更加紧张,这类工具几
唐巧的博客 · ZH
-
OpenConnector:给 AI Agent 加上一道凭据防火墙
过去,我们使用 AI,主要是在对话框里问问题。现在,AI Agent 开始读取邮件、管理日历、查询 Notion、处理 GitHub Issue,甚至操作企业内部系统。 这时,一个绕不开的问题出现了: 怎样把外部账号交给 Agent,又不把账号的
唐巧的博客 · ZH
-
关于渠道的思考
增长遇到瓶颈时,团队很容易把希望寄托在“多开一个渠道”上:找更多达人、进入更多平台、铺更多线下门店,或者接入一个看起来拥有大量用户的合作方。 但渠道越多,生意不一定越好。它可能带来增量,也可能只是把原来的订单重新分配一遍;可能提升收入,也可能因为价格竞争、重复
唐巧的博客 · ZH
-
《估值原理》读书笔记:价格背后的游戏、责任与社会秩序
对我来说,《估值原理》不是一本很容易读懂的书。 这本书的作者是周洛华老师,上海大学经济学院副院长。它和一般讲投资、财务、估值模型的书很不一
唐巧的博客 · ZH
-
404 Not Found
今天早上在机场候机时,我看到一架飞机停在“404”前。 太阳刚刚升起,金色的晨光穿过云层,落在银白色的机身上。机场正在苏醒,而那个醒目的数字,让我这个程
唐巧的博客 · ZH
-
对抗衰老 - 读《抗衰大脑》
最近读完了《抗衰大脑》,作者马克·米尔斯坦(Marc Milstein)是美国生物化学博士,拥有分子生物学、癌症生物学和神经科学相关研究背景,现主要从事脑健康的科学传播。 以下是一些总结。 <a href="
唐巧的博客 · ZH
-
读《信号与噪声》
最近读完了《信号与噪声》,作者纳特·西尔弗是一位统计学家。他毕业于芝加哥大学经济学专业,早期从事棒球数据分析,开发了预测球员表现的 PECOTA 系统,后来创办数据分析网站 FiveThirtyEight(538),因对美国总统选举的预测而广受关注。 <str
唐巧的博客 · ZH
-
Flyer:基于FastAPI的轻量级API开发框架
概述 我们经常会听到“不会开发的运维不是个好运维”,确实在运维工作当中,娴熟的开发经验能让运维工作如鱼得水,事半功倍!高级的运维除了需要精通 Shell 脚本编程之外,最好还需要掌握一门高级语言,比如 Python、Golang、PHP、Lua 等。高级语言除了可以解决一些更复杂的运维场景,还可以帮助我们更好的理解业务,做好业务运维,毕竟知己知彼才能百战不殆。 经常看到很多运维同学写接口通常是基于 Flask,只用一个脚本一撸到底,完全没有框架的概念,总体给人的感觉比较粗糙简陋。本文分享一个我个人基于 FastAPI 框架设计的轻量级 API 开发框架,能够应付绝大部分的业务运维的后台 API 场景,这个框架我取名为 Flyer,意味着轻量且快速。 Flyer API 开发框架 框架特性 继承 FastAPI 所有特性,包括高性能、自带 Swagger/ReDoc 文档、易开发等,详见:( FastAPI (tiangolo.com) ) 拥抱云原生,所有参数都可以通过七彩石/环境变量来自定义,代码中也可以非常方便的获取指定环境变量的值 鹅厂内部版本集成了七彩石、智研日志汇、监控宝等各种研效库(外部版本已剥离) MySQL/Redis/Kafka 等开源组件已默认对接,可以开箱即用 支持记录全局请求/被请求流水日志及耗时等监控特性 可以快速开启简单的 BasicAuth 鉴权等 更
张戈博客 · ZH
-
SQLAlchemy因密码含有@符号连接MySQL失败
最近新来的实习生在重构一个我入职时开发的老系统。这个系统之前用的是 Python twisted 框架,这次希望换成 FastAPI,也就是我上一篇文章分享的 Flyer 开发框架 。 小伙子很给力,自学了几天 FastAPI 和 Flyer 就开工了,结果用 Flyer 连接 MySQL 时报错: 问题现象 1 sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'xxxx@x.x.x.x' ([Errno -2] Name or service not known 报错原因一眼就能看出来: 密码里有一个 @ 符号 ,导致 @ 之后的内容被当成了数据库主机地址。 解决办法:密码做 URL 转义 用 urllib.parse.quote_plus 对密码转义即可: 1 2 3 4 from urllib.parse import quote_plus password = quote_plus ( "your_p@ssw0rd" ) # 再把转义后的密码拼进连接串 为什么我的老项目没这个问题 奇怪的是,我之前有个基于 Flyer 的项目复用了同一个数据库、同样的账号密码,却从没出现过这个问题,所以我一度笃定是 SQLAlche
张戈博客 · ZH
-
gRPC开发过程中遇到的问题记录
最近我在改造手头负责的一个 HTTP Restful API 服务,集成对 gRPC 协议(在鹅厂叫 tRPC,是 gRPC 的本土衍生版本)的支持。由于是从 0 学习这个协议,因此也踩了不少坑,这里用一篇文章来记录下,希望可以帮助到同样从 0 学习 gRPC 的朋友。 列表参数赋值 老的 Rest 接口中,大量用到了列表参数,看了下 pb 协议,给这个参数定义如下: 1 2 3 message Foo { repeated string Bar = 1 ; } 在 Python RPC 客户端调用测试时,按照经验,传参如下: 1 2 req = pb . Foo () req . Bar = [ "a" , "b" ] 结果赋值就报错了: 1 AttributeError: Assignment not allowed to repeated field "Bar" in protocol message object. 经过一番搜索,最终发现 Python 客户端应该如下赋值列表参数: 1 2 3 req = pb . Foo () bar_list = [ "a" , "b" ] req . Bar . extend ( bar_list ) 这样就可以正常赋值了,但是总觉得这个设计太绕了,直接赋值不行么?总体来说,gRPC 还是偏编译型语言的设计的,在 Python 这种解
张戈博客 · ZH
-
FastTTS:支持私有化部署和源阅读无缝对接的语音合成服务
概述 长话短说,最近发现微软的语音服务莫名扣费了,然后看着国内云服务动辄几千上万的语音合成服务资源包,一阵苦涩。搜了下,发现挺多基于 edge-tts 的白嫖项目,试用了下确实能用,就是和源阅读对接的体验有待提高。 因此决定自己封装一个更适合源阅读 APP 的语音合成服务,以下是介绍,有需要的直接拿。 项目介绍 本项目基于 Edge-TTS 和 FastFlyer 开发框架,可以直接私有化部署提供语音合成服务,支持和源阅读 APP 无缝对接。 体验地址(账号密码:guest / guest): 在线合成 在线调试 项目地址: FastTTS 框架介绍 FastFlyer 是基于 FastAPI 设计的轻量级 API 开发框架。在 FastAPI 优异特性的基础上集成了一系列开箱即用的组件,包括 Redis、MySQL、Kafka 等。采用 SDK 接入方式,内置脚手架代码生成等辅助工具,让研发人员只需要专注于业务逻辑的实现,真正开箱即用! 注:更多框架介绍请阅读: FastFlyer 快速部署 1 docker run --name fasttts -d -p 8080:8080 jagerzhang/fast-tts 成功启动后,访问: http://<host>:8080/speech/docs 可以看到 Swagger 工具页面。 简单鉴权 如果需要外网访问,建议开启接口鉴权
张戈博客 · ZH
-
FastFlyer:基于FastAPI的轻量级API开发框架
概述 很早前分享过一个开发框架 Flyer,这些年一直在用,也攒了不少痛点:框架代码和业务代码耦合在一起,想升个级就得挨个项目改一遍,非常痛苦。 所以这次重写了一版,取名 FastFlyer ——基于 FastAPI 的轻量级 API 开发框架。最大的变化是把框架做成了 SDK ,和业务代码彻底隔离,装个包就能用,升级也只是换个版本号的事。 项目地址: https://github.com/jagerzhang/fastflyer 主要特性 SDK 即装即用 :框架以 SDK 形式提供,与业务代码隔离,不再有「框架版本难以升级」的问题 自动生成项目骨架 :一条命令生成标准目录结构和演示应用,开箱即用 自动加载应用 :自动加载 app/ 目录下符合规范的应用,只需暴露名为 router 的路由对象 自带接口文档 :启动即有 SwaggerUI 和 Redoc 性能足够用 :单核单进程空载 9000+ QPS ,基本能覆盖绝大部分运维场景 快速开始 安装 SDK 1 pip3 install --upgrade fastflyer 这一步是可选的,主要为了让 IDE 能正常提示。 创建项目 1 2 3 4 5 export new_project = myproject mkdir -p /data/ ${ new_project } && cd /data/ ${ new_proje
张戈博客 · ZH
-
Beggar:让 CodeBuddy 多 Agent 协作研发成本直降 90% 的开源套件
一套可复用的多 Agent 配置方案,通过模型差异化分工 + 双 Reviewer 交叉审查 + Review Gate 自动升级,在保证质量的前提下大幅降低 AI 编程成本。 为什么需要 Beggar 如果你正在用 CodeBuddy Code 做 AI 辅助开发,大概率遇到过这样的困境: 成本焦虑 :所有任务都用最强模型?太贵。都用便宜模型?质量没保障。 单模型盲区 :同一个模型写代码又审代码,自己的 bug 自己审不出来。 编排混乱 :Agent 之间职责不清,Leader 直接下场写代码,角色边界形同虚设。 缺乏质量兜底 :审查不过怎么办?升级谁?几轮后还不过呢?Beggar 的解决思路很直接—— 把"用哪个模型做哪件事"这件事工程化 。 核心设计:四层成本优化 1. 模型分层——不是所有任务都需要最强模型 Beggar 把研发流程拆成 9 个角色,每个角色匹配能力够用的最便宜模型: 角色类型 代表 Agent balanced 预设模型 倍率 编排调度 Leader deepseek-v4-pro x0.16 方案设计 Architect glm-5.2 x0.79 复杂编码 Coder-Senior deepseek-v4-pro x0.16 常规编码 Coder-Standard deepseek-v4-flash x0.06 简单编码 Coder-Lite hy3
张戈博客 · ZH
-
博客重构手记:从 WordPress 到 Hugo 静态化
起因:其实挺惭愧的 这个博客荒废挺久了。 工作越来越忙,更新从一周一篇变成一月一篇,再到后来大半年都想不起来登录。偶尔上去看一眼,后台堆着一堆插件更新提示,我一般直接关掉——不是不想管,是真抽不出时间,而且心里清楚,一个没人维护的 WordPress 本身就是个隐患。 真正让我下决心的是前阵子 PHP 又爆了个漏洞。看到消息的时候我第一反应不是“赶紧升级”,而是“算了,换个不需要 PHP 的方案吧”。 为什么不直接升级 也不是没想过就地升级。但盘了一下现状就放弃了: WordPress 版本落后不少,主题是好几年前改过的,插件一堆 PHP 环境也要跟着升,升完还得一个个测兼容性 服务器上的 MySQL、Nginx 配置都是当年手动调的,动一个地方心里没底 最关键的是,就算全部升级完,得到的还是一个需要我一直维护的动态站。而我恰恰最缺的就是“一直维护”这四个字。 静态化就很对症:没有 PHP、没有数据库、没有后台,生成完就是一堆 HTML。攻击者连个入口都找不到。平时我只管写 Markdown,剩下的交给 Git。 文章迁移:467 篇 数据库里躺着的家当比我以为的多不少: 1 2 3 4 5 6 post publish 467 篇(另有 8 篇草稿) page 8 个 attachment 1745 个 comment 20309 条(13.8MB,全库最大的一张表) 分类 13
张戈博客 · ZH
-
把 Waline 迁到 EdgeOne KV,折腾了几轮才算完
博客最近刚做完 静态化 ,全站搬到 EdgeOne 之后,唯一还需要服务端的就剩评论了:后端跑在 Vercel 上,数据存在 Neon。 等于站子在一个平台、评论在另一个平台。没出过什么事,也没什么非搬不可的理由,主要是想着既然都上 EdgeOne 了,干脆一并挪过来,监控、日志、部署、账单收在一处,比跨两个平台来回切省心。函数用 Hono 写,数据落在 EdgeOne KV,对外域名继续用 api.zhangge.net 。 最终 14,675 条评论、474 条 Counter、1 个用户都搬过来了。过程比预想的麻烦,麻烦的地方基本都不是“不会配”,而是“看起来已经好了”。 接口返回 200,浏览器却不让你读;后台能登录,评论列表却是空的;数据导进去了,时间全是 1970 年;批量导入把批次改小了还是写不完;类型检查过了、部署也过了,接口却是 404。 本文纯属折腾记录,中间有大量试错过程,只想抄作业的可以直接跳到文末的「回头看」。 起因:站子都搬过来了,评论别单独留在外面 念头其实很简单:站子已经全静态跑在 EdgeOne 上,评论却还挂在另一个平台的另一个数据库里,等于每次要看点什么都得切一次地方,没什么必要。正好 EdgeOne 有 KV 存储,Waline 的服务端又能跑在 Edge Function 上,看着是个顺手的事。 当时我评估下来只剩两个不确定项:一是 Wal
张戈博客 · ZH
-
Memory Machines: The Evolution of Hypertext
— 摘自 Belinda Barnet 《Memory Machines: The Evolution of Hypertext》, 来自 Dynamicland 的推荐书单 这些页面提出了一个愿景,既简单又统一,气势宏大:这是一个关于相互连接的
夜行人 · EN
-
Mr. Wilson's Cabinet Of Wonder
— 摘自 Lawrence Weschler 《Mr. Wilson’s Cabinet Of Wonder》, 来自 Dynamicland 的推荐书单 看见就是忘记所见之物的名字 对桑纳本而言,记忆是一种幻觉。遗忘,而非记得,是所有经验的
夜行人 · EN
-
荒野中的认知
— 摘自 Edwin Hutchins 《Cognition in the Wild (荒野中的认知)》, 来自 Dynamicland 的推荐书单 在环境中个体所遇到的问题和解决办法都是由⽂化建构的,⽽且没有⼈能够独
夜行人 · EN
-
From Memex to Hypertext
— 摘自 James M Nyce, Paul Kahn 《From Memex to Hypertext》, 来自 Dynamicland 的推荐书单 在论述 Memex 时,布什主张计算机器和机器智能将会在人的智力生活中占有重要地位。
夜行人 · EN
-
Bootstrapping
— 摘自 Thierry Bardini 《Bootstrapping》, 来自 Dynamicland 的推荐书单 与其从技术对象的个体性出发,甚至从其非常不稳定的特殊性出发,试图在这种个体性或特殊
夜行人 · EN
-
孩子是如何学习的
— 摘自 John Holt 《How-Children-Learn (孩子是如何学习的)》, 来自 Bret Victor 的推荐书单 正是在他们上学之前,孩子们最有可能做到最佳的学习。
夜行人 · EN