开发者工具箱|编程·开发工具·资源
559 subscribers
1.44K photos
776 links
面向开发者的实用工具、库与效率技巧,写代码更快更爽。投稿 @BDHT1
#开发者 #编程工具 #效率 #程序员 · 开源总站 @GitHubTrendingHub
Download Telegram
Laravel 图片上传防 PHP 注入中间件

图片上传存在已知风险:一个有效 JPEG 文件可在 EXIF 注释中隐藏 PHP 代码,却仍能通过 MIME 检查、扩展名检查和 getimagesize()。一旦文件被写入可执行路径,就可能实现远程代码执行。

laravel-image-sanitize 是一个轻量中间件,在上传处理前扫描图片中的 payload 标记(<?php、phar),若有发现则通过 Intervention Image 从头解码并重新编码,仅保留像素数据,丢弃所有附加内容。使用时通过 Composer 安装,挂载到路由即可。

注意这不能替代 Laravel 自身的验证规则,两者应同时使用。默认支持 JPEG、PNG、GIF、BMP、WebP,不包含 SVG。质量默认 100(近无损),可调整。配置可发布并自定义允许类型、扫描模式、驱动等。


GitHub

#开发者 #工具 #Laravel #安全 #文件上传 #PHP #中间件
@DevToolboxHub
CtroEnv:测试与调试环境变量

传统测试环境变量往往需要修改 process.env 并祈祷清理干净。CtroEnv 提供 objectSource(),可将普通对象包装为环境源,无需全局操作。每个测试都能获得独立环境,告别 beforeEach/afterEach 清理。四种错误码精准定位问题,支持格式化输出。

测试时使用 defineEnv 和 objectSource 即可注入任意覆盖值,验证解析结果、缺失变量或类型错误。CtroEnvError 会一次性收集所有错误,避免逐一修复。秘密值可通过 secret() 标记并自动掩码,支持自定义掩码字符串。
调试方面有四个错误码:missing_required(变量缺失)、type_mismatch(类型不匹配)、invalid_value(校验失败,如无效URL)、validation_failed(自定义校验拒绝)。formatErrors 函数可将错误按类型分组并带颜色输出。
CI/CD 集成:CLI 直接解析配置文件,无需导入 schema。支持快速键对比(1秒内完成)、严格值校验、未知键警告(基于 Levenshtein 距离提示)、JSON 输出(可接入 Slack、监控面板)。提供 GitHub Actions 示例,构建阶段通过 Vite/Next.js 插件在失败时终止构建。


GitHub · npm

#开发者 #工具 #CtroEnv #Nodejs #TypeScript #Testing #CICD #DevOps
@DevToolboxHub
gstack:Garry Tan 开源了他的日常开发栈

Y Combinator 总裁 Garry Tan 将其每天使用的工具集 gstack 开源(MIT 许可)。它把 Claude Code 变成一个由 23 名专家组成的虚拟团队——包括 CEO、工程师、设计师、QA 和发布工程师——强制每次变更在发布前经过多视角审查。核心理念不是“写得更快”,而是“审查后再发布”。

gstack 的核心在于审查视角:CEO 视角审视这是否真的是 10 星产品,工程师视角检查架构能否扛住边界情况,设计师视角判断“好”的标准,开发者体验视角关心他人能否顺利接手。最后还包含测试、提交 PR 和部署后的监控步骤。

Garry 在 ETHOS 文件中写道:“工程之墙已倒下,剩下的只有品味、判断力和完成整件事的意愿。” 他声称今年自己写代码的速度比 13 年前快数百倍,但重点不在速度——当写代码成本几乎为零时,决定“构建什么”并拒绝输出垃圾,成了全部工作。他提出“煮海”原则:过去因为工程师时间昂贵,建议不要做完整的事;现在完整版本只要多花几分钟,就应该做完。

另一个关键原则是:“AI 模型推荐,用户决策。”、“两个 AI 模型对同一变更达成一致是强信号,但不是命令。” 每个审查视角的作用都是挑战工作,而不是例行盖章,最终由人决定采纳哪条反馈。


对于产品构建者,可以从中借鉴三点:即使独自工作也要设置审查关卡;在完成成本低的今天,做完整的事情而非粗糙版本;当 AI 显得自信或两个模型一致时,更要保持最终决策权。

GitHub: github.com/garrytan/gstack

#开发者 #工具 #gstack #GarryTan #YC #ClaudeCode #AI编程 #代码审查 #MIT
@DevToolboxHub
Paper 命令注册:用 Brigadier 替代 CommandExecutor

传统 Paper 插件通过 plugin.yml + CommandExecutor 注册命令,存在多个痛点:args[0] 需手动解析、不支持选择器(@a、@p)、Tab 补全须单独维护 TabCompleter 且容易不同步,命令树静态固定,无法根据配置动态改变参数结构。

Paper 内置了 Mojang 的 Brigadier 框架,通过 LifecycleEvents.COMMANDS 生命周期钩子注册命令树,无需 commands 块。权限检查挂在树节点上,Brigadier 在构建 Tab 补全时自动过滤无权限的命令,例如 requires() 确保只有拥有对应权限的玩家才能看到 /punish。命令树可根据配置条件化注册——例如 /report 只在启用 severity 时增加 severity 参数,否则注册简化版,Tab 补全和错误提示始终准确。

ArgumentTypes.player() 返回的不是 Player 对象,而是一个解析器,支持 Steve、@a、@p 等选择器,无需手动实现。解析后通过 resolvePlayer 转换为玩家,同时处理空选择器的情况。整体注册流程比传统方式更清晰、类型安全,且 Tab 补全自动同步。

传统方式的问题:Bukkit.getPlayer(args[0]) 只能精确匹配当前在线玩家,不支持选择器和模糊匹配;Tab补全必须手动同步,易出错;命令树固定,无法动态调整。

Brigadier 方式示例:在 LifecycleEvents.COMMANDS 内注册 /punish 字面量,requires 检查权限,then 追加 target 参数并绑定执行方法。对于 /report,先读取配置,若启用 severity 则注册含 severity 分支,否则注册简单分支。

ArgumentTypes.player() 的使用:在命令上下文中获取 PlayerSelectorArgumentResolver,调用 resolve(ctx.getSource()) 获得玩家列表,取第一个或处理空情况。这样命令处理器就能直接使用解析到的玩家。


迁移到 Brigadier 可大幅简化 Paper 插件命令开发,消除重复劳动和潜在 bug。虽然旧命令映射仍能工作,但 Brigadier 已成为推荐的首选方案。

#开发者 #工具 #Paper #Brigadier #Minecraft #Command
@DevToolboxHub
Symfony Scheduler:将定时任务纳入代码版本

SSH 进服务器看 crontab 时,发现一堆被注释掉的行、指向已删除命令的入口、无人知晓的 3am 任务——这些都在单台机器上,不在 Git,不在部署流程,随自动伸缩消失。Symfony Scheduler 组件让定时任务变为版本化的 PHP 代码,随应用发布、接受代码审查、可单元测试。自 Symfony 6.4 稳定以来持续演进。

核心是一个实现 ScheduleProviderInterface 的类,用 #[AsSchedule] 标记。every() 接受人类可读间隔(如 '1 hour'),cron() 使用标准 cron 表达式。消息是普通 DTO,无基类无接口。调度本身是 Messenger 传输层——到期的消息经同一总线、中间件、重试策略和失败传输处理。运行命令为 php bin/console messenger:consume scheduler_main,生产环境用 Supervisor 或 systemd 管理,无需任何 crontab 行。

注意单进程锁陷阱:如果运行多个消费者,每个都会独立触发调度。安装 symfony/lock 组件并用共享存储(Redis、数据库)加锁,只有锁持有者生成消息。可选 ->stateful() 配合缓存池记录上次运行,让恢复的 worker 能补发错过的触发。

可单元测试调度逻辑:通过 getSchedule()->getRecurringMessages() 获取消息,对 getTrigger()->getNextRunDate() 断言,在 CI 中捕获 cron 变更,而非在工单中调查。调度随部署和回滚同步,锁和状态保持在框架边缘,业务逻辑只关心消息 DTO。


#开发者 #工具 #Symfony #PHP #Cron #Messenger #Scheduler #单元测试
@DevToolboxHub
OpenNG Foundation 与 spartan/ui 1.0

本周 Angular 生态迎来多项更新:OpenNG Foundation 成为 Spectator、Elf 等知名库的新家,spartan/ui 发布 1.0 稳定版。此外还有 Storybook 通过 AnalogJS 实现 Angular 现代化、ng-conf 落幕及新会议 AI Dev Craft 等消息。

OpenNG Foundation 旨在为开源库提供持续维护支持,已托管 Spectator、Elf 等项目。由 Gerome Grignon 宣布,团队成员包括 Dominic Bachmann 等。目前 GitHub 上已有 8 个仓库。

spartan/ui 1.0 正式发布,提供超 55 个组件,基于 Signals、Standalone、zoneless 变更检测和 SSR 构建,可完全自定义样式。被视为 Angular 版的 shadcn/ui,由 Robin Götz 发起并持续活跃维护。

Storybook 的 Angular 集成通过 AnalogJS 实现现代化。AnalogJS 将 Angular 从 CLI 构建管线中解耦,暴露为标准 Vite 插件,使 Storybook、Vitest 等工具无需额外配置即可编译 Angular 组件。

ng-conf(始于 2014 年的首届 Angular 会议)宣告结束,其替代会议 AI Dev Craft 将于今年 10 月在拉斯维加斯举行,演讲者征集已开放。

#开发者 #工具 #OpenNG #SpartanUI #Angular #Spectator #Elf #Storybook #AnalogJS #ngconf #AIDevCraft
@DevToolboxHub
Dory 现已支持 Snowflake

Dory 将 Snowflake 作为一等数据源集成,用户可在 AI 原生 SQL 工作区中查询、探索和协作 Snowflake 数据。本次发布支持创建和测试连接、在控制台中运行 SQL、浏览数据库、模式、表和视图、预览表数据,并利用 Dory 的工作区模型将查询、结果集和上下文组织在同一位置。

支持的核心数据库工作流:
• 创建并测试 Snowflake 连接
• 在 Dory SQL 控制台中运行 SQL
• 浏览数据库、模式、表和视图
• 检查表列并预览表数据
• 使用默认仓库、数据库、模式、角色和会话选项
• 通过密码或密钥对认证

认证方式:
密码认证:提供账户标识符、仓库、默认数据库、模式、用户名、可选默认角色和密码即可快速验证。
密钥对认证:粘贴 PEM 私钥,避免存储普通密码,适用于生产环境。

在工作区中的使用:
连接保存后即可在 SQL 控制台中运行标准 SQL,在资源管理器中浏览对象层次。表预览使用 Snowflake 感知的标识符引用和分页,无需手动编写预览查询。

人机协同工作流:
Dory 不仅是 SQL 编辑器,更是 AI 原生数据工作区。用户可手动探索,也可让 AI 辅助编写或优化 SQL,审核、重跑、调整并继续分析。


本次发布聚焦基础功能,后续可扩展治理元数据、高级认证和更多 Snowflake 专属工作流改进。

#开发者 #工具 #Snowflake #Dory #SQL #AI #数据库 #云数据
@DevToolboxHub
Google 发布 A2UI v0.9:跨平台生成式 UI 标准

Google 正式推出 A2UI v0.9,这是一个框架无关的标准,允许 AI 代理声明用户界面意图,并在 Web、移动端和桌面端原生渲染,无需引入随机代码。该版本着重强调与现有设计系统的对齐。

更新内容包括全新的 Python SDK、改进的错误处理机制,以及多种传输方法。同时提供了迁移指南和演进规范,帮助开发者平滑过渡。

#开发者 #工具 #Google #A2UI #生成式UI #跨平台 #PythonSDK
@DevToolboxHub
Agent RFT:强化学习微调推理模型

OpenAI 推出 Agent RFT 平台,允许通过实时工具交互与自定义奖励信号对推理模型进行微调。该方法利用强化学习解决上下文窗口内的复杂信用分配问题。企业案例表明,Agent RFT 能消除长尾 token 循环,显著提升效率。演讲者为 Wenjie Zi 与 Will Hang。

#开发者 #工具 #AgentRFT #OpenAI #强化学习 #推理模型 #企业应用
@DevToolboxHub
InfoQ 发布《Agentic AI Architecture》电子杂志

InfoQ 推出 Mini book《Agentic AI Architecture》,由行业专家撰稿,全面覆盖智能体 AI 架构的要素与趋势。该电子杂志试图将智能体 AI 架构确立为一种新型软件架构,认为它很可能在未来数年主导行业发展。

#开发者 #工具 #AgenticAI #AgenticAIArchitecture #InfoQ #软件架构
@DevToolboxHub
生成式AI学习路线图:从入门到开发者

一份面向开发者的生成式AI系统学习路线已发布,从零基础到生产级部署,共分八个阶段,强调实践项目构建与真实应用能力。

第一阶段:AI基础(生成式AI概念、Token、嵌入、幻觉、上下文窗口、训练 vs 微调)
第二阶段:提示工程(零样本、少样本、思维链、角色提示、优化技巧)
第三阶段:主流模型对比(GPT、Claude、Gemini、Llama、DeepSeek、Mistral、Qwen)
第四阶段:AI开发(Python、API、SDK、流式响应、函数调用、结构化输出)
第五阶段:RAG(嵌入、向量数据库、文档分块、语义搜索、生产级RAG系统)
第六阶段:AI代理(多代理、规划、记忆、工具调用、MCP协议)
第七阶段:实际项目(AI聊天机器人、简历分析、网站构建、客服、PDF聊天、代码助手等)
第八阶段:部署与生产(安全、鉴权、限流、监控、日志、性能优化、成本控制、扩缩容)


路线面向学生、软件开发者、创业者等零基础学习者,每阶段均附带实践示例,后续文章将从“什么是生成式AI”开始循序讲解。

#开发者 #工具 #生成式AI #学习路线 #PromptEngineering #RAG #AIAgents #LLM #DeepSeek #Mistral
@DevToolboxHub
Cloudflare 内部统一数据平台 Town Lake 详解

Cloudflare 详细介绍了其内部统一数据平台 Town Lake 和 AI 分析代理 Skipper。该平台处理了约 9.1 万次计费查询,其中计费工作负载占全部平台查询的 53%,形成主要使用量。

Town Lake 采用基于 Trino、Iceberg、R2 和 DataHub 的湖仓一体架构,旨在统一访问运营、计费、安全和业务数据,支持治理的跨系统分析和自然语言访问。Skipper 作为 AI 分析代理,进一步简化了数据获取流程。

#开发者 #工具 #Cloudflare #TownLake #Skipper #Trino #Iceberg #R2 #DataHub #数据平台
@DevToolboxHub
用 Conversation ID 追踪 AI Agent 实际工作链

Agent 可观测性常犯一个错:精确记录模型调用、提示词和 token,却在 Agent 真正开始操作软件时失去追踪。这种痕迹看起来很干净,事故却无法定位。Honeycomb 的 Agent Timeline 仪表指南指出,GenAI span 应涵盖 Agent 引发的所有工作:模型调用、工具调用、任务移交、下游服务、数据库查询和后台任务。Conversation ID 是跨 trace、服务、多轮交互的用户级工作单元,它决定了团队拿到的是完整的 trace 还是一堆无法关联的 span。

OpenTelemetry GenAI agent-span 规范要求 gen_ai.conversation.id 仅在真实标识存在时填充,不得回退到 UUID、trace ID 或内容哈希。每个 agent 还需分配唯一的 gen_ai.agent.name,子 agent 不能继承父名称。同时在 collector 层对 prompt 等敏感内容做脱敏,避免数据蔓延。Trace 不应止于遥测收集,而应成为评估、回归检测和发布门禁的控制面。Candidly 的案例显示,trace 特征预测客户对话是否解决的 AUC 达到 0.90。


先从产品会话边界注入真实 conversation ID,贯穿 Agent 运行时、LLM 调用、工具执行、队列和数据库,然后在测试环境主动制造故障来验证链路完整性。Agent 可观测性遵循的是 Agent 引发的实际工作,Conversation ID 是贯穿这根链条的线索。

#开发者 #工具 #AIAgent #ConversationID #OpenTelemetry #Honeycomb #LangSmith #AgentObservability #可观测性
@DevToolboxHub