首页 文章 精选 留言 我的

精选列表

搜索[bug],共10000篇文章
优秀的个人博客,低调大师

Node.js 中 process.nextTick 与 setImmediate 的执行顺序陷阱:一个真实遇到的 bug

在一个订单状态同步服务里,我们用一个内存队列做批量提交,队列的 flush 逻辑依赖 process.nextTick 延迟执行。上线后发现某些情况下同一批订单会被重复提交,日志里两个 flush 几乎同时触发。排查后发现是 process.nextTick 和 setImmediate 在 I/O 回调中的执行顺序被想当然了:在同一个 I/O 周期里,nextTick 队列会在当前操作完成后立刻清空,而 setImmediate 要等到 poll 阶段结束、check 阶段才执行。如果回调里既往 nextTick 塞任务又用 setImmediate 做去重标记,去重标记可能晚于 flush 执行。这篇文章从事件循环各阶段的实际行为出发,用可复现的代码说明两者差异,并给出在批处理、递归调度和资源清理场景下的可靠写法。

优秀的个人博客,低调大师

从一次 Toast 消失 bug 说起

上个月在做后台管理系统的消息通知模块时,遇到一个很典型的 React 问题:用户点击某个消息后,弹出一个自动消失的 Toast 提示,结果快速连续点击几次后,Toast 在预期时间之前就消失了,有的甚至永远不消失。排查下来发现是 useEffect 的清理函数使用不当导致的。这类问题在真实开发中并不少见,尤其是涉及定时器、事件监听、WebSocket 订阅或者异步请求时,开发者容易忽略清理逻辑,或者把清理函数写在了错误的位置。这篇文章会从这个问题出发,讲清楚 useEffect 清理函数的执行时机、依赖数组如何影响清理行为,以及如何为定时器、事件监听和异步请求写出正确的清理逻辑。 先还原一下出问题的代码。当时组件的写法大致是这样的: ```tsx function Toast({ message, duration = 3000, onClose }: ToastProps) { useEffect(() => { const timer = setTimeout(() => { onClose(); }, duration); return () => { // 这里本意是清理定时器 clearTimeout(timer); }; }, []); // 空依赖数组,只在挂载时执行 return {message}; } ``` 看起来没问题:挂载时设置定时器,卸载时清理。但实际场景中,这个 Toast 组件没有被销毁,而是通过改变 message 和 duration 来复用同一个组件实例。空依赖数组意味着 effect 只运行一次,后续 duration 变化不会重新设置定时器,同时旧的定时器可能已经被清理或者被新逻辑覆盖,导致行为混乱。 真正的问题在于:清理函数只跟它所属的那次 effect 运行绑定。每次 effect 重新执行时,React 会先调用上一次 effect 返回的清理函数,再执行新的 effect。所以清理函数不是“组件卸载时才调用”,而是“在下一次 effect 执行前也会调用”。 把上面的例子改成正确依赖: ```tsx useEffect(() => { const timer = setTimeout(() => { onClose(); }, duration); return () => clearTimeout(timer); }, [duration, onClose]); ``` 这样一来,duration 变化时,旧定时器会被清除,新定时器按新的时长启动。onClose 如果每次渲染都是新函数,也会导致 effect 频繁重跑,需要配合 useCallback 或者把 onClose 从依赖里移除并借助 ref 调用。 另一个常见场景是 window resize 监听。很多人会这样写: ```tsx useEffect(() => { const handleResize = () => setWidth(window.innerWidth); window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); }; }, []); ``` 这段代码本身没问题,因为 handleResize 定义在 effect 内部,每次 effect 执行都会生成新的函数,清理时移除的是同一个引用。但如果把 handleResize 提到组件外部或者用 useCallback 包裹后忘了同步更新依赖,就可能出现监听器泄漏或者重复添加。 异步请求的清理更容易被忽略。比如搜索框输入时发请求,后发的请求先返回,旧结果覆盖新结果: ```tsx useEffect(() => { let cancelled = false; fetch(`/api/search?q=${keyword}`) .then(res => res.json()) .then(data => { if (!cancelled) { setResults(data); } }); return () => { cancelled = true; }; }, [keyword]); ``` 这里用 cancelled 标志位防止过期请求更新状态。也可以用 AbortController 真正取消请求: ```tsx useEffect(() => { const controller = new AbortController(); fetch(`/api/search?q=${keyword}`, { signal: controller.signal }) .then(res => res.json()) .then(setResults) .catch(err => { if (err.name !== 'AbortError') throw err; }); return () => controller.abort(); }, [keyword]); ``` 清理函数的本质是“撤销这次 effect 产生的副作用”。判断要不要写清理函数,看 effect 里有没有创建需要在未来某个时刻停止的东西:定时器、事件监听、订阅、请求、动画帧、外部状态修改。有,就必须写;没有,可以不写。 还有一个容易踩的坑是清理函数里使用了闭包变量。清理函数捕获的是它所属那次 effect 运行时的变量值,不是最新的值。比如: ```tsx useEffect(() => { const id = setInterval(() => { console.log(count); }, 1000); return () => clearInterval(id); }, []); ``` 这里的 count 永远是初始值。如果希望 interval 读取最新 count,要么把 count 加进依赖(导致 interval 重建),要么用 ref 保存最新值。这是两个不同的取舍,取决于业务是否允许定时器被重置。 回到最初那个 Toast 的问题。最终的修复是把自动消失的逻辑放到调用方,用每次点击生成新的 key 来强制重新挂载 Toast,或者干脆在 Toast 内部用带依赖的 useEffect 重新计时。选择哪种取决于是否允许同一个 Toast 实例被重复使用。React 的清理机制本身不复杂,复杂的是开发者需要清楚每一次 effect 执行都对应一个独立的副作用生命周期,清理函数负责结束这个生命周期,而不是整个组件的生命周期。 推荐查看天气:http://www.52cha.cn/hanzi/996.html 推荐查看天气:http://www.52cha.cn/hanzi/997.html 推荐查看天气:http://www.52cha.cn/hanzi/998.html 推荐查看天气:http://www.52cha.cn/hanzi/999.html 推荐查看天气:http://www.52cha.cn/hanzi/1000.html 推荐查看天气:http://www.52cha.cn/hanzi/1001.html 推荐查看天气:http://www.52cha.cn/hanzi/1002.html 推荐查看天气:http://www.52cha.cn/hanzi/1003.html 推荐查看天气:http://www.52cha.cn/hanzi/1004.html 推荐查看天气:http://www.52cha.cn/hanzi/1005.html 推荐查看天气:http://www.52cha.cn/hanzi/1006.html 推荐查看天气:http://www.52cha.cn/hanzi/1007.html 推荐查看天气:http://www.52cha.cn/hanzi/1008.html 推荐查看天气:http://www.52cha.cn/hanzi/1009.html 推荐查看天气:http://www.52cha.cn/hanzi/1010.html 推荐查看天气:http://www.52cha.cn/hanzi/1011.html 推荐查看天气:http://www.52cha.cn/hanzi/1012.html 推荐查看天气:http://www.52cha.cn/hanzi/1013.html 推荐查看天气:http://www.52cha.cn/hanzi/1014.html 推荐查看天气:http://www.52cha.cn/hanzi/1015.html 推荐查看天气:http://www.52cha.cn/hanzi/1016.html 推荐查看天气:http://www.52cha.cn/hanzi/1017.html 推荐查看天气:http://www.52cha.cn/hanzi/1018.html 推荐查看天气:http://www.52cha.cn/hanzi/1019.html 推荐查看天气:http://www.52cha.cn/hanzi/1020.html 推荐查看天气:http://www.52cha.cn/hanzi/1021.html 推荐查看天气:http://www.52cha.cn/hanzi/1022.html 推荐查看天气:http://www.52cha.cn/hanzi/1023.html 推荐查看天气:http://www.52cha.cn/hanzi/1024.html 推荐查看天气:http://www.52cha.cn/hanzi/1025.html 推荐查看天气:http://www.52cha.cn/hanzi/1026.html 推荐查看天气:http://www.52cha.cn/hanzi/1027.html 推荐查看天气:http://www.52cha.cn/hanzi/1028.html 推荐查看天气:http://www.52cha.cn/hanzi/1029.html 推荐查看天气:http://www.52cha.cn/hanzi/1030.html 推荐查看天气:http://www.52cha.cn/hanzi/1031.html 推荐查看天气:http://www.52cha.cn/hanzi/1032.html 推荐查看天气:http://www.52cha.cn/hanzi/1033.html 推荐查看天气:http://www.52cha.cn/hanzi/1034.html 推荐查看天气:http://www.52cha.cn/hanzi/1035.html 推荐查看天气:http://www.52cha.cn/hanzi/1036.html 推荐查看天气:http://www.52cha.cn/hanzi/1037.html 推荐查看天气:http://www.52cha.cn/hanzi/1038.html 推荐查看天气:http://www.52cha.cn/hanzi/1039.html 推荐查看天气:http://www.52cha.cn/hanzi/1040.html 推荐查看天气:http://www.52cha.cn/hanzi/1041.html 推荐查看天气:http://www.52cha.cn/hanzi/1042.html 推荐查看天气:http://www.52cha.cn/hanzi/1043.html 推荐查看天气:http://www.52cha.cn/hanzi/1044.html 推荐查看天气:http://www.52cha.cn/hanzi/1045.html 推荐查看天气:http://www.52cha.cn/hanzi/1046.html 推荐查看天气:http://www.52cha.cn/hanzi/1047.html 推荐查看天气:http://www.52cha.cn/hanzi/1048.html 推荐查看天气:http://www.52cha.cn/hanzi/1049.html 推荐查看天气:http://www.52cha.cn/hanzi/1050.html 推荐查看天气:http://www.52cha.cn/hanzi/1051.html 推荐查看天气:http://www.52cha.cn/hanzi/1052.html 推荐查看天气:http://www.52cha.cn/hanzi/1053.html 推荐查看天气:http://www.52cha.cn/hanzi/1054.html 推荐查看天气:http://www.52cha.cn/hanzi/1055.html 推荐查看天气:http://www.52cha.cn/hanzi/1056.html 推荐查看天气:http://www.52cha.cn/hanzi/1057.html 推荐查看天气:http://www.52cha.cn/hanzi/1058.html 推荐查看天气:http://www.52cha.cn/hanzi/1059.html 推荐查看天气:http://www.52cha.cn/hanzi/1060.html 推荐查看天气:http://www.52cha.cn/hanzi/1061.html 推荐查看天气:http://www.52cha.cn/hanzi/1062.html 推荐查看天气:http://www.52cha.cn/hanzi/1063.html 推荐查看天气:http://www.52cha.cn/hanzi/1064.html 推荐查看天气:http://www.52cha.cn/hanzi/1065.html 推荐查看天气:http://www.52cha.cn/hanzi/1066.html 推荐查看天气:http://www.52cha.cn/hanzi/1067.html 推荐查看天气:http://www.52cha.cn/hanzi/1068.html 推荐查看天气:http://www.52cha.cn/hanzi/1069.html 推荐查看天气:http://www.52cha.cn/hanzi/1070.html 推荐查看天气:http://www.52cha.cn/hanzi/1071.html 推荐查看天气:http://www.52cha.cn/hanzi/1072.html 推荐查看天气:http://www.52cha.cn/hanzi/1073.html 推荐查看天气:http://www.52cha.cn/hanzi/1074.html 推荐查看天气:http://www.52cha.cn/hanzi/1075.html 推荐查看天气:http://www.52cha.cn/hanzi/1076.html 推荐查看天气:http://www.52cha.cn/hanzi/1077.html 推荐查看天气:http://www.52cha.cn/hanzi/1078.html 推荐查看天气:http://www.52cha.cn/hanzi/1079.html 推荐查看天气:http://www.52cha.cn/hanzi/1080.html 推荐查看天气:http://www.52cha.cn/hanzi/1081.html 推荐查看天气:http://www.52cha.cn/hanzi/1082.html 推荐查看天气:http://www.52cha.cn/hanzi/1083.html 推荐查看天气:http://www.52cha.cn/hanzi/1084.html 推荐查看天气:http://www.52cha.cn/hanzi/1085.html 推荐查看天气:http://www.52cha.cn/hanzi/1086.html 推荐查看天气:http://www.52cha.cn/hanzi/1087.html 推荐查看天气:http://www.52cha.cn/hanzi/1088.html 推荐查看天气:http://www.52cha.cn/hanzi/1089.html 推荐查看天气:http://www.52cha.cn/hanzi/1090.html 推荐查看天气:http://www.52cha.cn/hanzi/1091.html 推荐查看天气:http://www.52cha.cn/hanzi/1092.html 推荐查看天气:http://www.52cha.cn/hanzi/1093.html 推荐查看天气:http://www.52cha.cn/hanzi/1094.html 推荐查看天气:http://www.52cha.cn/hanzi/1095.html 推荐查看天气:http://www.52cha.cn/hanzi/1096.html 推荐查看天气:http://www.52cha.cn/hanzi/1097.html 推荐查看天气:http://www.52cha.cn/hanzi/1098.html 推荐查看天气:http://www.52cha.cn/hanzi/1099.html 推荐查看天气:http://www.52cha.cn/hanzi/1100.html 推荐查看天气:http://www.52cha.cn/hanzi/1101.html 推荐查看天气:http://www.52cha.cn/hanzi/1102.html 推荐查看天气:http://www.52cha.cn/hanzi/1103.html 推荐查看天气:http://www.52cha.cn/hanzi/1104.html 推荐查看天气:http://www.52cha.cn/hanzi/1105.html 推荐查看天气:http://www.52cha.cn/hanzi/1106.html 推荐查看天气:http://www.52cha.cn/hanzi/1107.html 推荐查看天气:http://www.52cha.cn/hanzi/1108.html 推荐查看天气:http://www.52cha.cn/hanzi/1109.html 推荐查看天气:http://www.52cha.cn/hanzi/1110.html 推荐查看天气:http://www.52cha.cn/hanzi/1111.html 推荐查看天气:http://www.52cha.cn/hanzi/1112.html 推荐查看天气:http://www.52cha.cn/hanzi/1113.html 推荐查看天气:http://www.52cha.cn/hanzi/1114.html 推荐查看天气:http://www.52cha.cn/hanzi/1115.html 推荐查看天气:http://www.52cha.cn/hanzi/1116.html 推荐查看天气:http://www.52cha.cn/hanzi/1117.html 推荐查看天气:http://www.52cha.cn/hanzi/1118.html 推荐查看天气:http://www.52cha.cn/hanzi/1119.html 推荐查看天气:http://www.52cha.cn/hanzi/1120.html 推荐查看天气:http://www.52cha.cn/hanzi/1121.html 推荐查看天气:http://www.52cha.cn/hanzi/1122.html 推荐查看天气:http://www.52cha.cn/hanzi/1123.html 推荐查看天气:http://www.52cha.cn/hanzi/1124.html 推荐查看天气:http://www.52cha.cn/hanzi/1125.html 推荐查看天气:http://www.52cha.cn/hanzi/1126.html 推荐查看天气:http://www.52cha.cn/hanzi/1127.html 推荐查看天气:http://www.52cha.cn/hanzi/1128.html 推荐查看天气:http://www.52cha.cn/hanzi/1129.html 推荐查看天气:http://www.52cha.cn/hanzi/1130.html 推荐查看天气:http://www.52cha.cn/hanzi/1131.html 推荐查看天气:http://www.52cha.cn/hanzi/1132.html 推荐查看天气:http://www.52cha.cn/hanzi/1133.html 推荐查看天气:http://www.52cha.cn/hanzi/1134.html 推荐查看天气:http://www.52cha.cn/hanzi/1135.html 推荐查看天气:http://www.52cha.cn/hanzi/1136.html 推荐查看天气:http://www.52cha.cn/hanzi/1137.html 推荐查看天气:http://www.52cha.cn/hanzi/1138.html 推荐查看天气:http://www.52cha.cn/hanzi/1139.html 推荐查看天气:http://www.52cha.cn/hanzi/1140.html 推荐查看天气:http://www.52cha.cn/hanzi/1141.html 推荐查看天气:http://www.52cha.cn/hanzi/1142.html 推荐查看天气:http://www.52cha.cn/hanzi/1143.html 推荐查看天气:http://www.52cha.cn/hanzi/1144.html 推荐查看天气:http://www.52cha.cn/hanzi/1145.html 推荐查看天气:http://www.52cha.cn/hanzi/1146.html 推荐查看天气:http://www.52cha.cn/hanzi/1147.html 推荐查看天气:http://www.52cha.cn/hanzi/1148.html 推荐查看天气:http://www.52cha.cn/hanzi/1149.html 推荐查看天气:http://www.52cha.cn/hanzi/1150.html 推荐查看天气:http://www.52cha.cn/hanzi/1151.html 推荐查看天气:http://www.52cha.cn/hanzi/1152.html 推荐查看天气:http://www.52cha.cn/hanzi/1153.html 推荐查看天气:http://www.52cha.cn/hanzi/1154.html 推荐查看天气:http://www.52cha.cn/hanzi/1155.html 推荐查看天气:http://www.52cha.cn/hanzi/1156.html 推荐查看天气:http://www.52cha.cn/hanzi/1157.html 推荐查看天气:http://www.52cha.cn/hanzi/1158.html 推荐查看天气:http://www.52cha.cn/hanzi/1159.html 推荐查看天气:http://www.52cha.cn/hanzi/1160.html 推荐查看天气:http://www.52cha.cn/hanzi/1161.html 推荐查看天气:http://www.52cha.cn/hanzi/1162.html 推荐查看天气:http://www.52cha.cn/hanzi/1163.html 推荐查看天气:http://www.52cha.cn/hanzi/1164.html 推荐查看天气:http://www.52cha.cn/hanzi/1165.html 推荐查看天气:http://www.52cha.cn/hanzi/1166.html 推荐查看天气:http://www.52cha.cn/hanzi/1167.html 推荐查看天气:http://www.52cha.cn/hanzi/1168.html 推荐查看天气:http://www.52cha.cn/hanzi/1169.html 推荐查看天气:http://www.52cha.cn/hanzi/1170.html 推荐查看天气:http://www.52cha.cn/hanzi/1171.html 推荐查看天气:http://www.52cha.cn/hanzi/1172.html 推荐查看天气:http://www.52cha.cn/hanzi/1173.html 推荐查看天气:http://www.52cha.cn/hanzi/1174.html 推荐查看天气:http://www.52cha.cn/hanzi/1175.html 推荐查看天气:http://www.52cha.cn/hanzi/1176.html 推荐查看天气:http://www.52cha.cn/hanzi/1177.html 推荐查看天气:http://www.52cha.cn/hanzi/1178.html 推荐查看天气:http://www.52cha.cn/hanzi/1179.html 推荐查看天气:http://www.52cha.cn/hanzi/1180.html 推荐查看天气:http://www.52cha.cn/hanzi/1181.html 推荐查看天气:http://www.52cha.cn/hanzi/1182.html 推荐查看天气:http://www.52cha.cn/hanzi/1183.html 推荐查看天气:http://www.52cha.cn/hanzi/1184.html 推荐查看天气:http://www.52cha.cn/hanzi/1185.html 推荐查看天气:http://www.52cha.cn/hanzi/1186.html 推荐查看天气:http://www.52cha.cn/hanzi/1187.html 推荐查看天气:http://www.52cha.cn/hanzi/1188.html 推荐查看天气:http://www.52cha.cn/hanzi/1189.html 推荐查看天气:http://www.52cha.cn/hanzi/1190.html 推荐查看天气:http://www.52cha.cn/hanzi/1191.html 推荐查看天气:http://www.52cha.cn/hanzi/1192.html 推荐查看天气:http://www.52cha.cn/hanzi/1193.html 推荐查看天气:http://www.52cha.cn/hanzi/1194.html 推荐查看天气:http://www.52cha.cn/hanzi/1195.html

优秀的个人博客,低调大师

开发者反馈 DeepSeek-V3.1 出现严重 bug:返回内容随机插入“极/極/extreme”等字符

近日有开发者反馈DeepSeek V3.1在生成文本时会在完全不可预期的位置插入“极”“極”“extreme”三个token。 开源社区用户给出多组复现场景:在 Go 等语言生成里,模型会把词元「粘」到标识符中,`Second` 前随机插入「极/極/extreme」,即便是 `top_k=1, temperature=1` 的保守解码也躲不过。 问题最早在火山、chutes等第三方API被发现,最初怀疑与IQ1_S高压缩量化、imatrix校准数据异常或部署配置错误有关,但随后测试证实官方网页端在FP8全精度下亦出现同样现象,且官方端出现概率最低,第三方显著升高。 中文简体“极”对应ID 2577,繁体“極”对应ID 16411,英文“extreme”对应ID 15075。 社区推测可能是训练数据清洗残留,或与模型“偷懒”机制相关,但部分案例仍无法解释。一旦触发,后续生成会愈发频繁,已严重影响编程及任何对结构敏感的任务可用性。

优秀的个人博客,低调大师

【一周】CentOS 8与.NET Core 3,Win 10与bug 10,微软Python与谷歌Kotlin教程

回顾一周社区热门资讯 第【四十一】期:20190921-20190927 点击相应标题,跳转阅读全文。 Haiku 操作系统现已支持 Node.js Haiku 操作系统继承自商业操作系统 BeOS,而 BeOS 里面,大量输出信息使用俳句的形式(Haiku 翻译过来就是俳句,俳句是日本的三行诗,以其静谧、优雅、简洁著称,所以这是一款够诗意够文艺的系统)。 JavaScript 引擎 V8 Lite Mode 改造 V8 开发团队发现专门为这个 Lite 模式所做的内存优化其实也可以迁移到原来的V8 上,直接两开花。V8 团队近日发表了一个文章,就详细分享了在构建 V8 Lite 的过程中将一些关键的优化部分带到现有 V8 上的过程,以及在实际工作负载中对 V8 性能表现的影响。 微软推出Python免费在线教程视频 Node.js 后端框架排名(2019 年 9 月) 根据 GitHub Star 数量作了个Node.js 后端框架排名,发布时间以首个版本发布(0.x)为准。 微软开源其 C++ 标准库实现STL 微软近日宣布开源其 MSVC 的 C++ 标准库实现(也就是 STL),该库实现是 MSVC 工具集和 Visual Studio IDE 的一部分。 NPM CEO 宣布离职,为 npm 商业化背锅? Bryan 于今年 1 月开始担任 NPM CEO,这是npm 商业化计划的一部分,NPM 表示,任职期间,Bryan 使公司走上了确保全球最大的软件注册表持续可用的道路,并引入了新的服务和增强功能,满足了其 1100 万用户的需求。 VS Code Python 将支持Jupyter Notebook ReactOS 0.4.12 发布,Windows 系统的开源替代方案 效力微软 15 年的前员工解释 Windows 10 为什么问题如此多 纳德拉在上任时宣布微软进行大规模重组,同时纳德拉提出“移动为先云为先”的口号,即桌面平台不再是重点。在重组过程中纳德拉将操作系统的整个测试团队全部裁撤,接下来还将 Windows 10/Xbox/Windows Phone 合并。 .NET Core 3.0 稳定版发布 数十万 PhpStudy 用户被植入后门,快来检测你是否已沦为“肉鸡”! 从 2016 年起,黑客利用该“后门”犯罪作恶一发不可收拾,大量中招的电脑沦为“肉鸡”执行危险命令,不计其数的用户账号密码、电脑数据、敏感信息被远程抓取和回传。据统计,黑客已控制了超过 67 万台电脑,非法获取账号密码类、聊天数据类、设备码类等数据 10 万余组,而此案也是 2019 年以来,国内影响最为严重的供应链攻击事件。 CentOS 8 正式发布 首批开源 Linux 智能手机 Librem 5 已开始发货,外观神似 iPhone Chromium 内核新款 Edge 浏览器对比评测,微软找回面子全靠它了 新款 Edge 浏览器可能会随 Windows 10 20H1 更新直接登陆 Windows 10 系统,并取代现有的老款 Edge 浏览器。 开源公司抱团取暖,讨论如何在云厂商“寄生”下生存 上周OSS Capital 召集一些开源公司,组织了一场关于如何面对“云厂商给开源带来的危害”的会议。 谷歌推出 Kotlin免费在线课程 Nim 1.0 发布,命令式编程语言 Nim(原名 Nimrod)是一个新型的静态类型、命令式编程语言,支持过程式、函数式、面向对象和泛型编程风格而保持简单和高效。Nim 从 Lisp 继承来的一个特殊特性——抽象语法树(AST)作为语言规范的一部分,可以用作创建领域特定语言的强大宏系统。 TextMate 2.0 正式发布,免费开源的老牌代码编辑器 TextMate 是一款在 macOS 平台拥有 16 年历史的代码编辑器,多语言支持、版本控制、全局搜索等基础功能样样俱全。值得一提的是,TextMate 曾在 2006 年获得过 Apple Design Award 中的最佳开发人员工具奖。 谷歌发布适用于入门级智能机的 Go 版 Android 10 Android 10 Go 版专为运行内存不超过1.5 GB 的手机量身定制。尽管它不具备 Android 10 的所有功能,但新版的 light 操作系统应该能够将应用程序启动速度提高 10%,并使应用程序之间的切换速度更快。 不满公司与反移民政府机构合作,开发人员删库抗议 随着特朗普的反移民政策,成千上万的移民儿童与父母分离,美国移民和海关执法局(ICE)也成为众矢之的。因此,当开源开发者 Seth Vargo 发现 Chef 公司最近与 ICE 签订了合同后,便撤回了他的开源项目 Chef Sugar。 可以将道德条款纳入开源许可证吗? Chrome 更新导致部分 macOS 的文件系统损坏,无法重启 受影响的 macOS 用户可重新启动至恢复模式(Recovery Mode),再输入特定指令以移除该 Chrome 更新,这样就可恢复受损的文件系统。 辞去 FSF 主席的 RMS 仍然是 GNU 项目的负责人 RMS 在邮件列表中发言,表示目前他仍然是 GNU 项目的负责人,即首席 GNUisance。

优秀的个人博客,低调大师

最蛋疼的bug:读取图片缩略图(一定要在相冊查看下形成缓存)

近期的一个连接服务端的应用。须要读取图片,一般供用户公布商品选择上传图片。初始的图片列表应该是缩略图。仅仅有确定了,才上传原图,OK不多说上代码 package edu.buaa.erhuo; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONObject; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.app.AlertDialog.Builder; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import edu.buaa.erhuo.R; import edu.buaa.erhuo.Utils.NetworkUtils; public class PubActivity extends Activity {private EditText et_title,et_des;private Button btn_choose,btn_addSubmit;private Spinner spinner_typeId;private ArrayAdapter<String> adapter;private List<String> allValues = new ArrayList<String>();private List<Integer> allTypeIds = new ArrayList<Integer>();private Handler handler;private ImageView photoImg;private String filePath;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_pub);et_title=(EditText)findViewById(R.id.et_title);et_des=(EditText)findViewById(R.id.et_description);btn_choose=(Button)findViewById(R.id.btn_choose_photo);btn_addSubmit=(Button)findViewById(R.id.btn_add_submit);spinner_typeId=(Spinner)findViewById(R.id.spinner_type);photoImg=(ImageView)findViewById(R.id.img_photo);handler=new Handler(){public void handleMessage(Message msg) {if (msg.what==0) {//有网络且读取到数据adapter=new ArrayAdapter<String>(PubActivity.this, android.R.layout.simple_spinner_item,allValues);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);spinner_typeId.setAdapter(adapter);}else if (msg.what==1) {//提交到后台成功Toast.makeText(PubActivity.this,"加入成功",Toast.LENGTH_SHORT).show();et_title.setText("");et_des.setText("");spinner_typeId.setSelection(0);photoImg.setImageURI(null);filePath=null;}else if (msg.what==2) {//提交到后台失败Toast.makeText(PubActivity.this,"加入失败",Toast.LENGTH_SHORT).show();}}};// 调用工具类。 查询全部的商品分类数据Thread t=new Thread(){public void run() {try {JSONArray array=NetworkUtils.getJSONArrayByUrl(NetworkUtils.GET_ALL_PRODUCT_TYPE_URL);System.out.println(array+"kane...........");// 循环查询到的数据。保存到List集合里for (int i = 0; i < array.length(); i++) {JSONObject obj = array.getJSONObject(i);allValues.add(obj.getString("type_name"));allTypeIds.add(obj.getInt("type_id"));}handler.sendEmptyMessage(0);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}};t.start();btn_addSubmit.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {final ProgressDialog dialog=new ProgressDialog(PubActivity.this);dialog.setTitle("提示");dialog.setMessage("正在提交数据.........");dialog.show();Thread t=new Thread(){public void run() {Map<String,String> params=new HashMap<String, String>();params.put("product.product_name",et_title.getText().toString());params.put("product.description",et_des.getText().toString());params.put("product.type_id", allTypeIds.get(spinner_typeId.getSelectedItemPosition()).toString());if (filePath==null) {try {String result=NetworkUtils.postDataByUrl(NetworkUtils.PRODUCT_INSERT_URL, params);if (result.equals("ok")) {handler.sendEmptyMessage(1);}else {handler.sendEmptyMessage(2);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();handler.sendEmptyMessage(2);}}else {try {String result = NetworkUtils.postFileByUrl(NetworkUtils.PRODUCT_INSERT_URL, params,filePath);if (result.equals("ok")) {handler.sendEmptyMessage(1);} else {handler.sendEmptyMessage(2);}} catch (Exception e) {e.printStackTrace();handler.sendEmptyMessage(2);}}dialog.dismiss();}};t.start();}});btn_choose.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Builder builder=new Builder(PubActivity.this);builder.setTitle("请选择");builder.setItems(new String[]{"拍照","从相冊选择"}, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int which) {switch (which) {case 0:Intent intent=new Intent(PubActivity.this,CameraActivity.class);startActivity(intent);break;case 1:Intent in = new Intent(PubActivity.this,SelectImageActivity.class);startActivityForResult(in, 1);break;}}});builder.setPositiveButton("取消",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialogInterface, int which) {// TODO Auto-generated method stub} });builder.create().show();}});} //请求的activity返回一个结果@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == RESULT_OK) {filePath = data.getStringExtra("filePath");photoImg.setImageURI(Uri.fromFile(new File(filePath)));}} } package edu.buaa.erhuo; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import edu.buaa.erhuo.adapter.PhotoImageAdapter; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.provider.MediaStore.Images.Media; import android.provider.MediaStore.Images.Thumbnails; import android.app.Activity; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; public class SelectImageActivity extends Activity {private GridView gridView;private PhotoImageAdapter adapter;private List<Map<String, Object>> allValues=new ArrayList<Map<String,Object>>(); @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_select_image);gridView=(GridView)findViewById(R.id.grid);//取得数据,Thumbnails缩略图,必须先相冊查看形成缓存,不然没有缩略图Cursor c=getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, null,null,null,null);c.moveToFirst();while (!c.isAfterLast()) {Map<String,Object> map=new HashMap<String, Object>();//相应原图的IDmap.put("imageId",c.getLong(c.getColumnIndex(Thumbnails.IMAGE_ID)));//DATA就是路径名map.put("filepath",c.getString(c.getColumnIndex(Thumbnails.DATA)));allValues.add(map);c.moveToNext();}c.close(); adapter=new PhotoImageAdapter(allValues, this);gridView.setAdapter(adapter);gridView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position,long arg3) {final Map<String,Object> map=allValues.get(position);Builder builder=new Builder(SelectImageActivity.this);builder.setTitle("确定使用这张好照片吗?");ImageView img=new ImageView(SelectImageActivity.this);img.setImageURI(Uri.fromFile(new File(map.get("filepath").toString())));builder.setView(img);builder.setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {//获取图片原始位置//须要关联查询Cursor c=getContentResolver().query(Images.Media.EXTERNAL_CONTENT_URI,null,Media._ID+"= ? ", new String[]{map.get("imageId").toString()}, null);String realPath=null;if (c.moveToFirst()) {realPath=c.getString(c.getColumnIndex(Media.DATA));}c.close();Intent in=new Intent();in.putExtra("filepath",realPath);setResult(RESULT_OK,in);//给调用此activity的源头发给回馈信息finish();}});builder.setNegativeButton("取消",new OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stub}});builder.create().show();}});} } 须要用到的adapter package edu.buaa.erhuo.adapter; import java.io.File; import java.util.List; import java.util.Map; import android.content.Context; import android.net.Uri; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView.LayoutParams; import android.widget.BaseAdapter; import android.widget.ImageView; import edu.buaa.erhuo.R; import edu.buaa.erhuo.Utils.Globals; public class PhotoImageAdapter extends BaseAdapter {private List<Map<String, Object>> allValues;private Context ctx;public PhotoImageAdapter(List<Map<String, Object>> allValues, Context ctx) {this.allValues = allValues;this.ctx = ctx;}@Overridepublic int getCount() {return allValues.size();}@Overridepublic Object getItem(int position) {return allValues.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(ctx).inflate(R.layout.grid_image_line, null);convertView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, Globals.SCREEN_HEIGHT / 6));}Map<String, Object> map = allValues.get(position);ImageView img = (ImageView) convertView.findViewById(R.id.photo_img_line);img.setImageURI(Uri.fromFile(new File(map.get("filePath").toString())));return convertView;} } 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5287369.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

微软连发两波更新紧急修bug

最近这段时间,不少 Windows 笔记本用户都遇到了一桩怪事:明明插着充电器,电脑却突然提示电源断开,瞬间切到电池供电,有的还伴随黑屏闪一下,甚至游戏玩到一半直接重启。一开始很多人以为是适配器老化,或者主板供电出了硬件问题,直到越来越多同症状的反馈出现,大家才把矛头指向了微软 8 月推送的 Win11 累积更新。 ## 一、8 月安全更新后,多品牌笔记本遭遇电源异常 这次出问题的是微软在 8 月补丁星期二推送的**KB5121003**安全更新,安装后 Win11 24H2 版本系统升至 Build 26100.9168,25H2 版本升至 Build 26200.9168。 最早集中爆发的是联想笔记本用户,拯救者系列、Y9000P 等主流机型都有大量反馈。具体表现为系统会错误识别交流电源适配器断开,短暂切换到电池模式,几秒后又自动恢复;部分用户在电源切换的同时会遇到黑屏,只能强制重启才能恢复。在系统事件查看器里,可以看到大量**Kernel-Power 事件 ID 105**的记录,对应电源状态的异常变更。 随后更多品牌的用户也陆续反馈同款问题,包括惠普 Victus 系列、荣耀 MagicBook 系列,甚至部分华硕机型也出现了类似症状。有惠普用户提到,电源切换时还会伴随 GPU 短暂重置,游戏画面直接卡顿闪退。 从社区反馈来看,问题出现的场景完全随机,浏览网页、轻办公、打游戏时都有可能触发,轻负载和重负载下都有发生,没有明显规律。有技术用户做了对照测试:卸载 KB5121003 之后,以每 50ms 一次的频率连续监测 15 小时系统电源状态,没有再出现一次电源断开事件,基本坐实了更新和故障的关联。 ## 二、故障根源:底层电源驱动更新引发兼容性冲突 有技术用户拆解了 KB5121003 的更新内容,发现这版更新替换了多个 Windows 底层电源管理相关的系统驱动组件,包括battc.sys(电池类驱动)、CmBatt.sys、acpi.sys(高级配置与电源接口驱动)、CAD.sys和pdc.sys等,几乎覆盖了 Windows 电源管理的整条核心链路。 目前业内推测,问题出在新版电源驱动和笔记本嵌入式控制器(EC)、厂商自带的电源管理软件之间的通信异常。简单说就是 Windows 更新的通用底层驱动,和各笔记本厂商的定制化硬件控制逻辑不兼容,导致系统对电源接入状态的判断出错,反复在 AC 供电和电池模式之间横跳。 值得注意的是,截至目前微软和联想都没有官方承认这一问题,也没有发布针对性的修复公告。这个故障只存在于用户社区反馈中,还没有进入微软官方的已知问题列表。 ## 三、9 月紧急更新已推送,但没修这个电源问题 就在大家等待官方修复的时候,微软在 9 月 14 日推送了一波**紧急带外更新(Out-of-band)**,包括面向 Win11 26H1 的 KB5129194、25H2/24H2 的 KB5129195,以及 Win10 平台的 KB5129236。 很多用户以为这波更新会解决电源问题,但实际上这波紧急修复针对的是另外三个严重故障: ### **1、远程桌面服务(RDS)异常** 安装 9 月安全更新后,RDP 连接失败、远程桌面配置无响应,甚至文件资源管理器、Windows 更新页面一并卡死; ### **2、Hyper-V 虚拟机共享文件夹失效** 通过 Plan9 协议和 Linux 虚拟机共享主机文件夹时,客户机内无法看到或访问共享目录; ### **3、USB 多声道音频故障** 部分 USB Audio Class 1.0 设备在普通双声道下正常,切换到 8 声道或 3D 音频等多声道模式时直接失效。 除此之外,这波更新还补上了两个本地提权漏洞(CVE-2026-62721、CVE-2026-85921)的防护。但对于大家最关心的笔记本电源异常、随机黑屏问题,更新说明里只字未提,社区也没有用户反馈安装后问题得到解决。 也就是说,8 月更新挖的 “电源坑”,到现在还没填上。 ## 目前可行的临时解决办法 如果你已经遇到了这个问题,目前最稳妥有效的解决方式就是**卸载 KB5121003 更新**,操作步骤如下: - 打开设置 → Windows 更新 → 更新历史记录 → 卸载更新; - 在列表中找到 KB5121003,点击卸载,按提示重启电脑即可。 卸载后建议暂时暂停 Windows 更新,避免系统自动重新安装该补丁。 另外也有用户尝试过更新厂商官方的电源驱动、升级 BIOS,但效果不一,多数人反馈没有明显改善。如果暂时不想卸载更新,可以尝试关闭快速启动、将待机模式从现代待机(S0)切换到 S3 待机,对部分机型有一定缓解作用。 其实这已经不是 Win11 更新第一次出现大面积兼容性问题了。从之前的戴尔设备故障,到这次的联想、惠普电源异常,几乎每个月的补丁星期二之后,都会有不同品牌的设备踩坑。对于普通用户来说,Windows 更新越来越像开盲盒:你永远不知道它是会补上漏洞,还是会搞崩你的电脑。 对于还没安装 8 月更新的用户,建议可以先观望几天,等问题明朗了再更新;已经中招的用户,先卸载补丁临时解决,等待微软后续的官方修复。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

用户登录
用户注册