Jenkins+SonarQube构建超时根治:FindBugs XML转JSON通用导入
最近在一个大型Java项目的流水线收尾阶段我盯了半天Jenkins日志终于找到了让构建反复失败的真凶FindBugs扫描报告在传给SonarQube时因为文件太大直接超时整个任务被打断。真实现场比想象中来得更直接——报错日志里没有代码错误没有编译失败只有一个刺眼的TimeoutException构建就变成了红色。项目本身跑了两年代码量不小FindBugs生成的XML报告在本地看一下有12MB。这个体量在纯文本里已经算是“大胖子”了用HTTP上传到SonarQube服务器超时几乎是必然的。后来我又在几个同事那边确认他们遇到的情况普遍是5MB、8MB到20MB不等时间点全部卡在SonarQube分析阶段。这个问题不是个例在老旧JenkinsFindBugsSonarQube的组合里尤其常见。如果你也负责Jenkins流水线或者正在折腾Java项目的代码质量门禁这篇文章就是给你准备的。我会把问题拆开从为什么超时、超时卡在哪到怎么根治完整走一遍。1. 问题现场一次被12MB XML卡死的构建1.1 报错长什么样我们先用一个具体例子还原现场。项目名为“某后台管理系统”采用Jenkins Pipeline定义构建流程Java 8、Maven多模块工程质量门禁阶段用FindBugs扫描然后通过SonarQube Scanner把报告上传到服务端分析。流水线里关键的一段代码原本是这样的stage(FindBugs扫描) { steps { sh mvn findbugs:findbugs } } stage(SonarQube分析) { steps { withSonarQubeEnv(SonarQube) { sh mvn sonar:sonar } } }执行到第二阶段的SonarQube分析时构建工具挂了。日志中反复出现[ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:3.9.1.2184:sonar ... [ERROR] ... java.io.IOException: timeout, 10000ms elapsed [ERROR] ... Caused by: org.apache.http.conn.ConnectTimeoutException: Connect to sonar-server:9000 timed out这个报错从字面看像是“连接超时”但实际上Tomcat和SonarQube服务端都活着网络也能通。后来我在服务端同时抓日志才发现HTTP请求实际上已经到达了SonarQube但它一直在处理上传的XML数据迟迟没有返回最终客户端在规定的时间内等不到结果直接抛出异常终止。也就是说问题不是网络不通而是数据传输和处理太慢超出了预设时间窗口。1.2 为什么FindBugs报告能到12MB你可能觉得12MB的XML不算大但在HTTP协议里上传一个12MB的XML还要经过服务端解析、问题匹配、数据库写入时间消耗根本不是“传输”两个字能概括的。先拆一下FindBugs报告的内容。FindBugs的一个bug实例在XML里长这样BugInstance typeDM_DEFAULT_ENCODING priority2 categoryI18N instanceHashabc123 ShortMessageReliance on default encoding/ShortMessage LongMessageFound reliance on default encoding: new String(bytes)/LongMessage Class classnamecom.example.service.UserService primarytrue SourceLine classnamecom.example.service.UserService start42 end42 sourcefileUserService.java/ /Class Method classnamecom.example.service.UserService namedoSomething primarytrue SourceLine classnamecom.example.service.UserService start42 end42 startBytecode29/ /Method SourceLine classnamecom.example.service.UserService sourcefileUserService.java start42 end42/ /BugInstance这样一个bug条目在XML里大概占800字节到2KB。几百个问题加上包路径、方法信息、Message展开很容易到几MB。大型项目的告警数量动辄几千报告自然膨胀。别忘了一件事ImportOutcome——只要项目里有一条规则命中了多个类同一个BugInstance还会带着不同的SourceLine生成多条。我见过更极端的例子一个遗留系统的FindBugs报告里有超过9000条告警XML文件到了30MBSonarQube分析直接死锁。这类问题在旧系统里很常见因为长期没有修、误报又多告警越积越多报告自然越滚越大。2. 逐层拆解timeout到底卡在哪个环节2.1 客户端上传超时与服务端解析超时的区别很多人一开始都会和我一样遇到timeout就想去调网络、调防火墙。但把时间花在这上面往往会错过真正的瓶颈。我们需要把这次上传分成几个独立的阶段第一阶段Jenkins或SonarQube Scanner进程发起HTTP POST把XML报告作为multipart请求体发送到SonarQube服务器。此时如果是网络问题会很快出现Connection refused或ConnectTimeout发生在连接建立阶段。第二阶段数据全部到达服务器后SonarQube后端开始读取请求体保存文件并交给分析引擎解析。这个阶段如果文件大解析时间会指数级增长因为XML DOM模型要加载进内存还要针对每个BugInstance做路径匹配和规则映射。第三阶段解析完以后SonarQube还要把问题数据写入数据库更新项目快照、指标等。数据库慢也会导致整个HTTP请求处理时间变长。我们前文提到的timeout, 10000ms elapsed是HTTP连接器的读取超时客户端连上了服务器也发送了数据但服务器迟迟没有给出完整响应一直读不到结束标记于是时间到了就中断。这显然不是网络问题而是服务端处理时间太长。2.2 参数地图哪些超时参数在起作用既然要治超时首先得搞清楚哪些参数在控制这个时间。我整理了一张对照表直接照着排查就行。超时环节关键参数或配置默认值典型现象SonarQube Scanner HTTP客户端sonar.ws.timeout60秒客户端报IOException: timeoutMaven插件HTTP客户端Maven调度的上面的WS客户端继承同一参数60秒Maven报相同异常SonarQube内置Web服务器TomcatconnectionTimeout60秒服务端日志显示连接被重置反向代理如Nginxproxy_read_timeout60秒502、504错误Jenkins任务自身Jenkins job全局超时配置无整个Stage取消其中最容易忽略的是sonar.ws.timeout很多人根本没听说过。这个参数控制SonarQube Scanner和Web Service之间的请求超时默认值是60秒。如果服务器解析一个大文件需要180秒那么无论你怎么调网络60秒一到照样报错。还有一个藏在深处的参数是sonar.scanner.skip不是超时相关性忽略。真正相关的是sonar.scanner.internal.nio.sleep也不对。实际我们常见的就是sonar.ws.timeout单位是秒但很多版本接受毫秒要特别小心——不同版本单位不一致后面踩坑部分细说。3. 快速止血先把超时窗口拉大一倍3.1 修改sonar-scanner配置文件如果你们当前最紧迫的目标是先让构建恢复绿色最简单的办法就是把超时时间调大。这个操作一行配置就能搞定。我通常在项目的sonar-project.properties文件里加上sonar.ws.timeout600如果你的项目是用Maven执行sonar:sonar那也可以把参数放到Jenkins流水线里用命令行传入mvn sonar:sonar -Dsonar.ws.timeout600这里有一个细节不同SonarQube Scanner版本对sonar.ws.timeout的单位解析不一致。有些版本按秒处理有些版本按毫秒处理。从SonarQube Scanner 3.0左右开始文档明确单位是秒但旧版本可能有偏差。为确保稳妥我建议先在本地用小报告跑一次看能不能成功如果本地报告只有几百KB超时一般是不会触发的所以这个参数的作用不容易察觉。调成600之后12MB报告就能顺利上传了。但这不是终点——如果下个月报告涨到30MB是不是继续调到1200这种“大一点就调大超时”的做法会让流水线越来越慢每个构建在SonarQube分析阶段都要白白等上几分钟。所以快速止血可以但不能当饭吃。3.2 反代和Web服务器的超时也要同步调很多团队在SonarQube前面挂Nginx做HTTPS终结。如果客户端到Nginx这段不超时但Nginx到后端SonarQube这段超时日志上还是显示Nginx返回504。这种情况要把Nginx配置里的proxy_read_timeout、proxy_send_timeout同时调大。例如server { listen 443 ssl; server_name sonar.internal; location / { proxy_pass http://8.7.2.6:9000; proxy_read_timeout 600s; proxy_send_timeout 600s; proxy_connect_timeout 30s; } }服务端用了Tomcat的话conf/server.xml里的Connector标签需要加connectionTimeout和socketTimeout。不过一般用SonarQube自带的内嵌Jetty或官方安装包反代配置占多数。这个阶段的目标是先稳住。如果你只想看一篇“怎么改超时”的帖子到这一步就可以收工了。但后面真正解决这个问题、以后不用再提心吊胆的还是靠方案二。4. 根治方案用通用问题导入替代原始XML上传4.1 理解SonarQube的Generic Issue Import机制老式SonarQube处理FindBugs报告是把完整XML交给服务端由插件一层层解析。这种方式的优点是交互简单缺点是传输内容里夹杂了大量不属于“问题”的噪音。比如前面看到的XML里有Class、Method、SourceLine、requestedEndLine等结构化数据——这些在问题导入阶段根本用不上。SonarQube要的只是“路径、行号、规则key、严重级别、消息”。所以更好的思路是在Jenkins端就把FindBugs报告转换成一个精简的“通用问题”列表再通过SonarQube提供的Generic Issue Import机制导入。这个机制最早是为了多语言、多规则集统一接入设计的现在也是官方推荐的方式。转换后的JSON不需要那么大一个问题的典型结构只有几十个字段{ engineId: findbugs, ruleId: DM_DEFAULT_ENCODING, severity: MAJOR, type: CODE_SMELL, primaryLocation: { message: Found reliance on default encoding: new String(bytes), filePath: src/main/java/com/example/service/UserService.java, textRange: { startLine: 42, endLine: 42 } } }对比一下原始XML里同一个问题占800字节JSON里大约200字节。再加上JSON不用携带一堆Classname、Sourcefile重复路径整体体积能压缩80%到90%。4.2 从FindBugs XML到JSON脚本实操我没有找到特别成熟的一键转换工具所以自己在Jenkins里写了一个小脚本。思路很简单用Python读取FindBugs XML遍历BugInstance抽取必要字段生成JSON数组。假设XML是target/findbugsXml.xml输出是sonar-findbugs-issues.json。脚本核心逻辑如下import xml.etree.ElementTree as ET import json tree ET.parse(target/findbugsXml.xml) root tree.getroot() issues [] for bug in root.findall(BugInstance): # 规则key取 type 属性 rule_id bug.get(type) category bug.get(category) priority bug.get(priority) # 消息LongMessage 的文本内容 long_msg_el bug.find(LongMessage) message long_msg_el.text if long_msg_el is not None else rule_id # 主位置取第一个 SourceLine 节点 source_line bug.find(.//SourceLine) if source_line is None: continue file_path source_line.get(sourcefile) start_line int(source_line.get(start)) end_line int(source_line.get(end)) # 优先级到Severity的映射 severity_map {1: BLOCKER, 2: MAJOR, 3: MINOR} severity severity_map.get(priority, MAJOR) issues.append({ engineId: findbugs, ruleId: rule_id, severity: severity, type: CODE_SMELL, primaryLocation: { message: message, filePath: file_path, textRange: { startLine: start_line, endLine: end_line } } }) with open(sonar-findbugs-issues.json, w, encodingutf-8) as f: json.dump(issues, f, ensure_asciiFalse, indent2) print(fGenerated {len(issues)} issues)注意几个关键的字段映射ruleId要提取BugInstance的type因为SonarQube侧的规则key也是这个。filePath必须是相对sonar.sources根目录的路径。比如sonar.sourcessrc那么sourcefile应该写成main/java/com/example/UserService.java但原始XML中的sourcefile可能只有文件名没有完整包路径。为此还需要从Class classname节点里拼接包路径脚本里做一下处理。这个坑非常典型后面避坑章节会细讲。生成完JSON后还要在sonar-project.properties里配置sonar.genericissue.reportPathssonar-findbugs-issues.json对于老版本SonarQube还要确认安装了sonar-generic-issue-plugin插件新版SonarQube 7.9已经内置了该功能可以直接使用。4.3 流水线改造前后对比改造后的Jenkins流水线不再由Maven自动把报告塞给SonarQube而是主动分两步走先生成JSON再执行sonar:sonar。现在的流水线看起来是这样stage(质量扫描与上报) { steps { script { sh mvn findbugs:findbugs sh python3 convert_findbugs_to_sonar.py sh mvn sonar:sonar -Dsonar.genericissue.reportPathssonar-findbugs-issues.json } } }注意执行sonar:sonar时不能再配置sonar.findbugs.reportPath这个旧参数否则SonarQube还会去找原始XML导致超时重演。我用一个真实的对照数据说明效果改造前FindBugs XML大小12MBSonarQube分析耗时约90秒报告上传阶段经常超时。改造后JSON大小约280KBSonarQube分析总耗时约10秒没有再出现一次timeout。为什么耗时差距这么大一是传输的数据量小了二是服务端不再需要解析复杂的XML直接读取JSON初始化问题即可数据库批量写入也更轻松。4.4 实测效果这个故事其实来源于一个一次构建要跑12分钟的旧系统。原来构建流程里SonarQube分析要占3分钟。改造完以后SonarQube分析缩短到25秒。关键是Jenkins日志里再也看不到timeout了。整个流水线从“勉强能跑完但随时可能挂”变成了“稳定跑完”。团队后来把告警数量从9000条逐步降到2000条报告进SonarQube的速度进一步提升。如果你对Python脚本不熟也可以用Java写个解析程序或者用现成的findbugs2sonar这类小工具。但我个人建议自己写脚本因为字段映射的灵活性比较大后期要接PMD或Checkstyle改几行就能复用。5. 退而求其次不换流程怎么把报告变小5.1 用FindBugs的excludeFilter过滤掉噪声告警如果你暂时不能改架构也不想碰脚本那还有一个笨办法减小报告体积本身。最直接的切入点是用FindBugs的excludeFilter排除掉不关注的规则。在findbugs-exclude.xml里把已知误报规则排除掉FindBugsFilter Match Bug patternEI_EXPOSE_REP/ Class name~.*DTO.*/ /Match /FindBugsFilter如果项目的DTO类大量返回内部数组引用这种告警是设计层面的不打算修那就直接排掉。报告体积随着排除条数线性下降。但这个方法有局限如果告警本来大多数都是“待办”的真问题排除完也没剩多少可排除文件还是大。5.2 裁剪XML内容的意义有限有人会想到直接用工具把XML里的Method节点删掉只保留BugInstance和SourceLine。从理论上讲文件确实能小一些而且字段之间是独立的不影响SonarQube解析。但实操效果有限XML的主要体积来自重复的类名和路径删掉Methods大概能省20%~30%。如果原来10MB变成7MB超时可能依旧存在尤其是SonarQube服务端本身解析速度慢的时候。所以这个方案我明确不推荐除非你只是想临时再挤一点空间出来。5.3 分模块扫描的可行性还有一种思路是把一个大型多模块项目拆成多个模块分别扫描。这种方式在某些场景下确实能降低单次上传的大小。但要留意SonarQube是按“项目”维度聚合的如果你对每个模块执行独立分析SonarQube里会出现多个项目看不到整个仓库的整体视图。除非你用的是SonarQube的“Monorepo”支持配置sonar.modules但每个模块的报告还是要合并不会从根上解决问题。所以这个方法只适合那些“单模块巨大”的项目把报告按不同Package拆成多次分析SonarQube不支持按包拆项目。最终结论不如走通用导入。6. 避坑手册这些坑我都是踩过才记住的6.1 只调大超时可能掩盖了真正的瓶颈第一次遇到这个timeout时我第一反应就是调大sonar.ws.timeout调到600秒后构建倒是绿了。但问题来了同一个项目每周跑一次报告随着时间越积越大后来某个构建又白屏式卡了10分钟最后超时。如果你不从根本上压缩报告体积超时只是被推迟而已。另外一个小坑如果你在旧版本SonarQube上同时配置了sonar.findbugs.reportPath和sonar.genericissue.reportPaths服务端可能先解析XML再解析JSON两遍叠加反而更慢。我见过一个同事配置冲突后报告上传直接变三倍时间。检查一下有没有残留的旧参数。6.2 通用导入的路径映射规则在用JSON导入时报错的最常见原因就是filePath路径对不上。SonarQube会把filePath与sonar.sources配置的路径拼接后到文件系统里找代码。如果配置了sonar.sourcessrc那filePath就应该写main/java/com/example/UserService.java而不是sources/main/java/...。这个拼接逻辑有时会带一层模块名多模块项目尤其混乱。我的建议是先用一个只有一两百行的小小程序跑一遍如果导入后能正常显示问题但代码定位不到就要检查filePath。也可以在SonarQube项目权限里打开“后台任务”强制“刷新”问题路径但根因还是路径不对。6.3 注意重复导入的问题如果你的Jenkins流水线不是每次清空workspace那上一次分析留下的sonar-findbugs-issues.json可能还在下次分析会一起带上导致重复导入。要么在构建开始前清掉旧文件要么配置SonarQube“删除未关联的issues”功能不过后者并不彻底。我在流水线上加了一步sh rm -f sonar-findbugs-issues.json放在扫描之前执行避免上次的分析残留。另外FindBugs XML路径如果被多个模块覆盖脚本读取的时候要排除掉旧模块的target目录否则你会把不同模块的历史报告合并到一起。这个问题在增量构建时很容易出现。6.4 老版本SonarQube的插件坑如果你的SonarQube版本低于7.9Generic Issue Import可能还要额外安装插件而有些老版本SonarQube内置的“FindBugs报告导入”支持很差遇到大文件直接内存溢出。这时最佳选择是把SonarQube升级到LTS版本用新机制配合我们的JSON方案。升级过程中要注意SonarQube的数据库迁移耗时选一个维护窗口来做。还有一个小技巧如果升级暂时做不了至少把SonarQube Scanner升级到较新版本新版本的sonar.ws.timeout处理更稳定能避免很多莫名奇妙的超时。6.5 如何确认问题在哪个环节排查时可以用curl模拟一个大文件上传观察时间消耗time curl -u admin:admin -X POST -F datafindbugsXml.xml http://sonar-server:9000/这里的请求会因为大小直接超时但time能告诉你连接时间和等待时间从而判断瓶颈在后端处理还是网络。如果等待时间远远大于连接时间那问题就在服务端解析和数据库而不是传输带宽。这个判断方法可以帮助你在争论“是不是网络问题”时做到心里有底。顺带说一句在SonarQube的logs/web.log和logs/es.log里能搜到类似PROCESSING的记录判断是否真的在处理请求。别只看客户端报错就下结论。我个人在实际操作中最深的体会是遇到超时问题第一反应不是调超时参数而是先量化“到底是什么数据用了多长时间”。当你知道一份XML里绝大多数内容是重复的结构化装饰时一眼就能看出应该走JSON精简方案。这个思路不仅适用于FindBugsPMD、Checkstyle报告遇到同样问题时也一样处理。如果以后你们也要做多工具质量门禁可以把PMD和Checkstyle都一起转成Generic JSON所有报告汇总成一个文件上传SonarQube端只跑一次分析效率和稳定性都会高很多。

相关新闻

Windows 下 OpenJDK JRE 14 免安装 zip 部署与多版本共存实战

Windows 下 OpenJDK JRE 14 免安装 zip 部署与多版本共存实战

简介:本资源为 Java 14 的 OpenJDK JRE 运行环境安装包,面向需要在 Windows 平台上运行 Java 14 应用的开发者与运维人员,尤其适合 Red Hat 系发行版环境下的部署与测试场景。压缩包共 358 个文件,以 82 个 dll 动态链接库、25 个…

2026/10/18 0:27:59 阅读更多 →
BLE Mesh IV Index更新机制深度解析:从协议到芯片实现

BLE Mesh IV Index更新机制深度解析:从协议到芯片实现

1. 项目概述:为什么IV Index更新是BLE Mesh网络的“心跳校准器”在BLE Mesh实际组网调试中,我见过太多团队卡在“设备突然失联”“消息时有时无”“重启后历史状态全丢”这类看似随机、实则高度规律的问题上。翻日志、换固件、重配节点,折腾一…

2026/10/16 21:30:47 阅读更多 →
AI降重工具实测:论文查重原理与7大平台避坑指南

AI降重工具实测:论文查重原理与7大平台避坑指南

论文写完之后最折磨人的环节,大概就是和重复率较劲了。辛辛苦苦码了几千字,一查重,满屏标红,那种心情我太懂了。这几年我帮人改过的稿子不算少,从课程论文到学位论文都碰过,也和不下十个AI降重工具打过交道…

2026/10/17 21:38:23 阅读更多 →

最新新闻

全球电商数据接口一键接入:技术要点与选型指南

全球电商数据接口一键接入:技术要点与选型指南

上个季度我帮一个做跨境电商的朋友整理运营流程,他手上有5个平台账号,每天早晨雷打不动要花两小时导出各后台的订单和库存,再做一轮手工汇总。有一回因为某个平台库存同步晚了半天,一单爆款直接超卖,赔了运费还被买家差…

2026/10/18 7:28:03 阅读更多 →
Python微信小程序电影院购票系统:从建表到并发锁座的完整实现

Python微信小程序电影院购票系统:从建表到并发锁座的完整实现

1. 先从需求拆起:一套能用的影院购票系统,不只是“电影列表 一张订单表”这几天又有人拿着“python微信小程序的电影院购票售票系统”这个题目来找我,说网上模板很多,但要么是纯前端摆了个样子,要么后端只有一张订单表…

2026/10/18 7:28:03 阅读更多 →
从配置到远程开发:这款免费跨平台编辑器的高效使用指南

从配置到远程开发:这款免费跨平台编辑器的高效使用指南

简介:Microsoft Visual Studio Code 的完整 zip 安装资源,面向开发者与编程学习者。该编辑器免费开源,跨 Windows、macOS、Linux 使用,内置 Git 版本控制、IntelliSense 智能补全、调试器、集成终端与扩展市场,原生支持…

2026/10/18 7:28:03 阅读更多 →
C++ Lambda捕获机制:生命周期、悬空引用与闭包原理详解

C++ Lambda捕获机制:生命周期、悬空引用与闭包原理详解

“这段代码要传到后台异步执行,你确定它捕获的变量还活着吗?”——这是我做代码评审时最常抛给写代码的人的一个问题。C的lambda捕获机制,表面上就是中括号里写几个名字的事儿,但几乎每个经历过大型C项目的开发者,都被…

2026/10/18 7:28:03 阅读更多 →
VS Code 高效配置指南:从插件管理到远程开发避坑

VS Code 高效配置指南:从插件管理到远程开发避坑

简介:微软 VS Code 代码编辑器程序目录资源包,适合需要在离线环境安装、定制或研究其内部结构的前后端开发者与运维人员。资源共有七千零九十四份文件,以 JavaScript 脚本、JSON 配置、Markdown 文档、TypeScript 类型定义和 CSS 样式为主&am…

2026/10/18 7:28:03 阅读更多 →
jieba+TF-IDF+SVM:中文垃圾短信分类实战全流程解析

jieba+TF-IDF+SVM:中文垃圾短信分类实战全流程解析

简介:一份面向本科毕业设计场景的自然语言处理中文文本分类实战资源包,聚焦垃圾短信识别任务。资源基于Python3.6环境,借助jieba分词与Scikit-learn机器学习库完成分词、特征提取和分类模型训练,数据文件采用标签加文本的制表分隔…

2026/10/18 7:27:03 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →