WordCount实验全解析:从伪分布式搭建到MapReduce避坑指南
简介一份面向 Hadoop 初学者的完整实验报告围绕大数据框架中的 wordcount 单词统计程序展开从虚拟机安装、环境配置到 Eclipse 与 Hadoop 连接、MapReduce 代码实现均有详细记录。报告以南华大学实验课程为背景适合正在学习大数据平台编程、需要完成类似课设或实训任务的学生参考。资料仅含 1 个 doc 格式文档压缩包大小 758KB内容包含实验目的、运行环境Window11 Hadoop 虚拟机 JDK1.8、12 步操作说明以及可复用的 Wordcount.java 源码其中详细记录了 start-all.sh 启动、端口检查、Eclipse 插件加载、MapReduce 连接配置等关键节点。源码自定义 Mapper 与 Reducer 类清晰展示 split 分词、context 读写和计数归并流程方便对照理解 MapReduce 的编程框架。目前已有 1727 人浏览学习对希望快速搭建 Hadoop 单词统计项目、以报告模板完成实验作业的学生有直接参考价值。1. Hadoop WordCount 实验报告为什么一个单词统计程序成了大数据的入门第一课我见过太多人把这份实验报告写成了环境搭建流水账贴十几张截图、把 WordCount 源码往正文里一放最后总结一句成功运行。老师要的是你对 MapReduce 计算模型的理解一份能体现思路的实验报告比运行截图值钱得多。这篇笔记我按自己带新人时的辅导思路来写把伪分布式环境准备、源码逐段拆解、打包提交到集群、常见报错排查一次讲透。不管你是本科大数据课程还是自学转行照着做能少走两三天弯路。2. Hadoop 实验环境准备伪分布式搭建与最小验证命令2.1 为什么本地机器要搭伪分布式而不是直接跑单机模式WordCount 是 MapReduce 的 Hello World它的核心是分而治之一个文件被拆成多块多进程并行统计最后汇总。如果你只在单机模式跑程序确实能出结果但 Map、Reduce 跑在同一个 JVM 里你根本观察不到分布式调度过程实验报告也没东西可写。伪分布式模式Pseudo-Distributed Mode会用独立进程模拟 DataNode、NameNode 和 ResourceManager虽然都在一台机器上但数据流转路径和真实集群一致。我建议你直接做伪分布式别贪图省事用单机模式凑合。课程设计或实验报告里老师通常要求在 Hadoop 集群上运行你在一台机器上把伪分布式搭出来截图里能清楚看到 NameNode、DataNode、NodeManager 进程都活着这就有了说服力。虚拟机里装 Hadoop 目前仍是主流做法用 VMware 或 VirtualBox 装 Ubuntu Server 20.04 以上版本内存分配 2GB 以上磁盘 20GB 起步。别用 CentOS 6 或 7 的旧镜像JDK 版本和 Hadoop 3.x 的兼容性会给你埋坑。2.2 JDK 与 Hadoop 版本选型先定版本再动手别两头折腾版本选型是最容易被忽略、也最容易翻车的环节。Hadoop 3.3.x 要求 JDK 8 或 JDK 11但很多教材还在讲 Hadoop 2.x 配 JDK 7照着敲就报UnsupportedClassVersionError。我的固定组合是 JDK 8u202 Hadoop 3.3.6这个搭配踩坑最少网上能查到的报错案例也最全。安装 JDK 时注意Ubuntu 的 OpenJDK 默认路径在/usr/lib/jvm/但java命令可能在/usr/bin/java。配环境变量时尽量写死路径不要用update-alternatives的软链接否则后面start-dfs.sh启动脚本在找 JAVA_HOME 时会变得很玄学。下载 Hadoop 安装包后直接解压到/opt/hadoop修改hadoop-env.sh里的JAVA_HOME为绝对路径# 编辑 /opt/hadoop/etc/hadoop/hadoop-env.sh找到 JAVA_HOME 行并改为 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 # 验证 Java 路径有效 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -versionJAVA_HOME 写软链接路径是伪分布式搭建里最常见的坑之一因为 Hadoop 的启动脚本通过$JAVA_HOME/bin/java找解释器软链接有时能解析、有时不能表现为start-dfs.sh报Error: JAVA_HOME is not set and could not be found。另外建议在/etc/profile里追加JAVA_HOME、HADOOP_HOME和PATH导出然后source /etc/profile让配置立即生效。2.3 免密登录与 NameNode 格式化两条命令的顺序不能反伪分布式需要 SSH 本机免密登录因为 Hadoop 守护进程之间通过 SSH 通信。生成密钥、追加公钥后测试ssh localhost是否还要输入密码。这里有个细节如果你之前装过 Hadoop 并格式化过 NameNode再次格式化前必须先删除/tmp/hadoop-*下的数据目录否则 NameNode 和 DataNode 的 clusterID 对不上DataNode 进程会反复启动失败。格式化命令# 生成 SSH 密钥一路回车即可 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 验证免密登录 ssh localhost echo ok # 启动 HDFS 和 YARN /opt/hadoop/sbin/start-dfs.sh /opt/hadoop/sbin/start-yarn.sh # 格式化 NameNode仅在首次安装或清理数据目录后执行 /opt/hadoop/bin/hdfs namenode -format顺序上先改配置文件再格式化格式化只需要一次。如果以后集群启动不了删掉数据目录重新格式化是常见恢复手段但会丢掉已有数据做实验无所谓跑生产别这么干。启动后用jps查看 Java 进程应该能看到 NameNode、DataNode、ResourceManager、NodeManager 四个进程。少了哪一个就去对应日志目录/opt/hadoop/logs/找*.log文件看具体报错。2.4 准备实验数据用系统文本文件快速生成输入目录WordCount 需要输入文件刚搭好的 HDFS 是空的。常见做法是把 Linux 系统自带的文本文件传上去既能快速开始又不用自己编造数据。拿/etc/profile当输入源切几个文件放到一个测试目录里# 在 HDFS 上创建输入目录并上传本地文件 /opt/hadoop/bin/hdfs dfs -mkdir -p /wordcount/input /opt/hadoop/bin/hdfs dfs -put /etc/profile /wordcount/input/ /opt/hadoop/bin/hdfs dfs -put /etc/hosts /wordcount/input/ /opt/hadoop/bin/hdfs dfs -ls /wordcount/input/HDFS 命令的写法和 Linux 命令长得像但实现完全不同-mkdir -p会自动创建多级目录-put是上传。如果dfs命令报Operation category READ is not supported in state standby说明你配了 HA 但没配好伪分布式别用 HA 配置。数据准备好后在浏览器打开http://localhost:9870能看到 NameNode 界面确认 DataNode 已注册、存储容量显示正常。这些截图放进实验报告就是环境可用的直观证明。3. WordCount 源码逐段拆解Map 阶段到底在算哪一步3.1 MapReduce 编程模型先立概念映射、洗牌、归约各管什么写代码之前必须把 MapReduce 三个阶段的职责分清。Map 阶段读入一行文本拆成单词输出单词, 1这样的键值对Shuffle 阶段由框架自动完成把相同 key 的 value 合并到一起比如hello, 1和hello, 1会变成hello, [1, 1]Reduce 阶段接住这些 value 列表累加出总次数。inputsplit这个概念在实验报告里值得专门写一段每个输入分片对应一个 Map 任务分片大小默认等于 HDFS 块大小128MB所以一个小文件也会占一个 Map 槽位大量小文件会拖慢整体效率。WordCount 的源码网上有一堆版本但我见过很多同学抄下来跑不通问题出在泛型类型上。Hadoop 自定义的Text类型等价于 Java 的 UTF-8 字符串IntWritable等价于int可序列化是它们最重要的特性。写代码时不要把Text和String混着用Map 输出的 key 类型必须和 Reducer 输入的 key 类型完全一致框架要做排序和分组类型不一致会在运行时直接抛异常。3.2 Mapper 类实现tokenizer 与上下文写入的完整逻辑下面是完整的 Mapper 内部类关键代码行有注释import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends MapperLongWritable, Text, Text, IntWritable { private final Text word new Text(); private final IntWritable one new IntWritable(1); Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 将当前行转为 String按空格和制表符切分 String line value.toString(); String[] words line.split([\\s,.;!?]); for (String w : words) { if (w.isEmpty()) { continue; // 跳过空串 } word.set(w); context.write(word, one); // 输出 单词, 1 } } }这段代码有三个细节要强调。split的正则我刻意加了多个分隔符只按空格切会在遇到标点时报出奇怪结果比如 hello! 会被统计成 hello! 而不是 hello。word.set(w)是为了复用 Text 对象避免每次 new 一个实例导致内存抖动这是 MapReduce 编程里常见的性能优化点。context.write(word, one)是框架的核心出口所有输出会先写到环形缓冲区等缓冲区达到阈值后溢写到本地磁盘这个机制在实验报告的Map 端详解部分可以展开写。3.3 Mapper 输入 key 的类型LongWritable 不是随便选的很多初学者会问Mapper 输入 key 为什么是LongWritable而不是Text因为 MapReduce 读文件时默认的TextInputFormat会把每行的字节偏移量作为 key第一行偏移量是 0第二行是上一行的长度加换行符。这个偏移量对业务没有意义但框架层必须传。真实场景里你几乎不会用这个 key但面试题常问InputSplit和 key 的关系——每个 Map 任务处理一个 InputSplit而 InputSplit 里的每条记录按行解析偏移量递增就是记录的唯一标识。如果说 Mapper 是 WordCount 的分词车间那 Reducer 就是计数总装线。Map 输出的单词, 1会在框架层自动按单词首字母排序这不是可有可无的参数而是 MapReduce 设计的核心机制。理解了这个排序后面看TotalOrderPartitioner或二次排序题目时就不会乱。4. Reducer 与 Main 方法聚合逻辑、作业提交参数与打包细节4.1 Reducer 类实现Iterable 为什么是累加的关键Reducer 接收的 value 是IterableIntWritable意味着你可以用增强 for 循环遍历这个单词出现的所有1。注意这个 Iterable 对象在框架里可能被重复使用所以不要在循环里把 value 保存到 List只做累加就没问题。实现如下import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends ReducerText, IntWritable, Text, IntWritable { private final IntWritable result new IntWritable(); Override protected void reduce(Text key, IterableIntWritable values, Context context) throws IOException, InterruptedException { int sum 0; for (IntWritable val : values) { sum val.get(); // 累加当前单词出现的次数 } result.set(sum); context.write(key, result); // 输出 单词, 总次数 } }reduce 方法传进来的key已经排好序并分组相同单词的所有计数会被分到同一个 reduce 调用里。val.get()从 IntWritable 里取出 int 值累加完后result.set(sum)再写入输出。这里值得在实验报告里写一句Reducer 的输入输出类型必须和 Mapper 输出类型对齐如果 Mapper 输出 key 是TextReducer 输入 key 也必须写Text泛型对不上会在编译期报错这是新人最容易犯的错。4.2 作业提交入口setCombinerClass与 job 参数的含义Main 方法里要做的三件事创建 Job 实例、设置各类 Class、提交等待完成。这里有一个关键参数setCombinerClass很多教材把它一笔带过但它直接影响运行效率。Combiner 是一种本地 Reducer在 Map 端先做一次合并减少 Shuffle 阶段传输到 Reducer 的数据量。以 WordCount 来说如果把 Reducer 类直接设成 Combiner语法上完全合法但语义只在求和这类场景下正确。你在实验报告的性能优化小节里可以写明对平均值、最大值这类依赖全局状态的场景不能直接套 Reducer 做 Combiner。import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { Configuration conf new Configuration(); Job job Job.getInstance(conf, word count); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); // 本地聚合优化网络开销 job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }参数说明addInputPath接收 HDFS 上的输入目录而不是文件列表目录下所有文件都会被当作分片setOutputPath指定的输出目录必须不存在否则框架会报FileAlreadyExistsException这是故意设计的安全机制。waitForCompletion(true)的布尔参数表示是否打印任务进度实验报告截图里那些 Progress 进度条就是它打出来的。4.3 打包提交到 Hadoopjar 包的参数顺序与输出目录清理编译打包有两种常见方式命令行 javac 加 classpath或直接用 Maven。课程实验用 Maven 更省事在pom.xml里声明 hadoop-client 依赖版本和你集群一致然后mvn clean package。但很多学校机房的 Maven 仓库是空的下载依赖会卡半天所以我一般建议直接用 Hadoop 自带的 classpath 编译# 完整编译并打包依赖 Hadoop 的 lib 目录 mkdir -p build javac -classpath $(/opt/hadoop/bin/hadoop classpath) -d build WordCountMapper.java WordCountReducer.java WordCountDriver.java jar -cvf wordcount.jar -C build . # 提交作业第一个参数是 HDFS 输入目录第二个是输出目录 /opt/hadoop/bin/hadoop jar wordcount.jar WordCountDriver /wordcount/input /wordcount/outputhadoop classpath会输出一长串路径包含了 Hadoop 所有依赖 jar不用自己一个个找。如果本地机没装 Hadoop也可以把集群机器上的 classpath 复制出来但容易出现版本不一致。作业跑完后用hdfs dfs -cat /wordcount/output/part-r-00000 | head -20查看结果输出文件是 Hadoop 自己的 SequenceFile 文本格式多个 Reducer 会产生多个 part-r 文件。这里有个实验报告必写点part-r-00000的r表示 Reduce 阶段产物如果是part-m-开头则是 Map 阶段产物实际作业里这两种文件可能同时存在。5. WordCount 实验避坑5 个让程序白跑的经典问题5.1 输出目录已存在FileAlreadyExistsException 不是代码 Bug现象提交作业后立刻报org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/wordcount/output already exists。原因上几次运行留下的输出目录没删MapReduce 强制要求输出目录必须不存在。解决删掉输出目录再重跑。/opt/hadoop/bin/hdfs dfs -rm -r /wordcount/output /opt/hadoop/bin/hadoop jar wordcount.jar WordCountDriver /wordcount/input /wordcount/output这个坑专治跑第二次就蒙圈的新手。有人图省事在代码里加FileSystem.delete()自动删输出我不建议这么干生产环境里误删数据的风险远大于那点便利。实验报告里可以把这条归到HDFS 文件系统操作规范里写能体现你对分布式文件系统粒度的理解。5.2 ClassNotFoundException主类名的包路径对不上现象java.lang.ClassNotFoundException: WordCountDriver。原因hadoop jar后面跟的类名和 jar 包里实际路径不一致。如果源码在默认包下类名就是WordCountDriver如果源码带com.example包名就必须写全限定名com.example.WordCountDriver。解决# 查看 jar 包内容确认类的完整路径 jar tf wordcount.jar # 按输出的路径提交 /opt/hadoop/bin/hadoop jar wordcount.jar com.example.WordCountDriver /wordcount/input /wordcount/output5.3 权限被拒Permission denied 与 HDFS 根目录所有者是谁现象上传文件或创建目录报Permission denied: userroot, accessWRITE, inode/:hdfs:supergroup:drwxr-xr-x。原因HDFS 默认权限模型和 Linux 类似root 用户不一定有写权限因为 HDFS 的超级用户是启动 NameNode 的用户。解决一是启动 HDFS 的账户统一用同一个用户比如都叫 hadoop二是在 hdfs-site.xml 里临时关权限检查property namedfs.permissions.enabled/name valuefalse/value /property改完配置必须重启 HDFSstop-dfs.sh再start-dfs.sh。dfs.permissions.enabled只在实验环境用真实集群不会关。这条坑在伪分布式里极其常见因为很多人图方便用 root 登录 Linux而 Hadoop 启动用户写死了hdfs。5.4 Container 被 kill内存分配不足导致任务中途失败现象作业跑到一半报Container exited with a non-zero exit code 104或者Container killed by the ApplicationMaster。原因MapReduce 任务的物理内存超了 YARN 容器的上限默认的yarn.nodemanager.vmem-pmem-ratio设成了 2.1而一台 2GB 内存的虚拟机很容易被打爆。解决调大容器内存参数让作业跑得松一点。# mapred-site.xml 中添加 # 每个 Map/Reduce 容器的最大堆内存设为 512MB export HADOOP_OPTS-Xmx512m按我的经验虚拟机上跑 WordCount 不需要这么大内存但如果你同时开了 DataNode、NameNode、ResourceManager 和 NodeManager系统本身占掉 1.5GB留给容器的不剩多少。用free -h确认物理剩余内存如果不足 1GB把JAVA_OPTS调低或者关掉不用的桌面环境。5.5 结果全为 0 或乱码输入数据没传上去或文件编码不对现象作业秒成功打开输出文件全是0或者乱码。原因输入路径写错但 Hadoop 没报错比如传了/wordcount/input这个目录但目录是空的另一个原因是 Windows 上编辑的文件带了 BOM 头或 UTF-16 编码TextInputFormat按 UTF-8 读会出现乱码。解决先用hdfs dfs -ls -R /wordcount/input确认文件大小大于 0再用file命令检查上传文件的编码。Windows 上写好源码传到 Linux 时用dos2unix转换行尾符避免\r被当成单词的一部分。6. 把 WordCount 实验报告写出亮点日志解读、InputSplit 考点与 Combiner 优化这篇实验报告能不能拿高分关键在于你能不能答出框架背后的细节。我在带毕业生做课程设计时发现凡是写了下面这些点的老师给的评语都明显更具体。第一个加分点是把waitForCompletion(true)打印的 Map 进度日志读明白map 100% reduce 67%正常情况下 Map 达到 100% 后 Reduce 才会开始如果你看到map 0% reduce 100%说明作业数据量太小Reduce 在等第一个 Map 的输出这种情况在集群跑大文件时才会被留意。把这段截图放报告里标注出 Shuffle 发生在 reduce 进度从 0 到 100% 之间就展示了你的分布式思维。第二个加分点是专门写一段 InputSplit 的理解。面试和课程考核常问在一个运行的 Hadoop 任务中什么是 InputSplit你至少要说出三层输入分片是 Map 任务处理的数据单元分片边界由 FileInputFormat 计算默认按块大小切分分片大小不等于数据块大小分片可以跨多个块但要记录偏移量。结合 WordCount 来说/wordcount/input里两个小文件会生成两个 InputSplit所以对应两个 Map 任务这个现象可以在 YARN 的 ResourceManager 界面截到。按默认配置128MB 是块大小实验里的文件远小于这个值每个文件单独成一个分片这就是为什么小文件多会导致 Map 数膨胀。第三个加分点是 Combiner 的效果验证。在 Driver 里先不加setCombinerClass跑一遍记录 Shuffle 字节数加上之后再跑一遍对比 Reduce 阶段的输入记录数。Hadoop 作业完成后hadoop job -history或 Web UI 的 Counter 区域能看到Reduce shuffle bytes用表格把两条数据放进实验报告量化说明Map 端聚合降低了多少网络传输。我见过一个学生在 1GB 数据上做对比Shuffle 字节数下降了约 40%老师直接在评语里写了数据翔实。我自己的习惯是写完 WordCount 不急着交而是再写一个词频 Top N的小变体在 Reducer 里用 TreeMap 保留前 N 个单词或者用两个 Job 串起来实现全局排序。做完这两个变体你对 MapReduce 的排序机制、分区机制和作业串联的理解会真正立住。跑通 Hadoop 的 WordCount 只是开始能把实验报告里的每个现象解释清楚才是这只大数据入门拦路虎带给你的最大收获希望帮到你。本文还有配套的精品资源点击获取

相关新闻

缓存与数据库一致性:从Cache Aside到binlog订阅的面试全解

缓存与数据库一致性:从Cache Aside到binlog订阅的面试全解

先声明一下:这个系列写到第18天,已经不再适合用海量题库去堆了。前面十几期把八股、算法、项目细节都过了好几轮,如果现在还在用“背题”的方式准备面试,那对你自己的提升非常有限。今天这期要聊的东西,很多人会误以为…

2026/10/9 4:05:32 阅读更多 →
text-to-cad 实战:从自然语言到 STEP/STL/GLB 三维模型生成

text-to-cad 实战:从自然语言到 STEP/STL/GLB 三维模型生成

1. 从一句话到三维模型:text-to-cad 到底在解决什么问题第一次听到 "text-to-cad" 这个词,很多做机械设计或者工业建模的朋友第一反应是:又来了一个新概念。但如果你真的动手试过把一段文字描述直接变成可用的三维模型,…

2026/10/9 4:05:32 阅读更多 →
JavaWeb蛋糕店实战系统:JSP+Servlet零框架可运行毕设

JavaWeb蛋糕店实战系统:JSP+Servlet零框架可运行毕设

简介:这是一份面向计算机相关专业在校学生、教师及初学者的JavaWeb课程设计与毕业设计实战资源,基于JSPServlet技术栈开发的蛋糕店在线售卖系统,完整覆盖用户注册登录、商品分类展示、热销/新品推荐、购物车管理及订单结算等核心电商功能。资…

2026/10/9 4:05:32 阅读更多 →

最新新闻

可靠性测试别只会跑温箱振动台:失效物理与加速寿命是关键

可靠性测试别只会跑温箱振动台:失效物理与加速寿命是关键

干我们这行的,提起“可靠性测试”,不少人第一反应是:把样品扔进温箱里烤一烤、冻一冻,再放振动台上摇一摇,出来没坏就算通过。要是真这么想,那可靠性测试就白做了。作为一个和温箱、振动台、耐久跑法打了十…

2026/10/9 7:02:48 阅读更多 →
JVM内存模型与调优实战:从Minecraft OOM到HMCL配置

JVM内存模型与调优实战:从Minecraft OOM到HMCL配置

很多朋友第一次真正意识到 JVM 的存在,不是在 Java 课堂上,而是在一个完全不相关的场景里——玩游戏的时候。我用 HMCL 启动器给 Minecraft 装了个整合包,点了启动,等了两分钟,游戏闪退。把日志拉到最底部,…

2026/10/9 7:02:48 阅读更多 →
VS Code AI 语言模型配置全指南:模型切换、思维强度与 BYOK 自有密钥接入

VS Code AI 语言模型配置全指南:模型切换、思维强度与 BYOK 自有密钥接入

文档教程 【免费下载链接】vscode-docs Public documentation for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-docs 点击查看 免费下载 本文基于 Visual Studio Code 官方文档仓库(vscode-docs)中的 docs/agen…

2026/10/9 7:02:48 阅读更多 →
多标签文本分类实战复盘:从Embedding到Transformer的TAAC优化之路

多标签文本分类实战复盘:从Embedding到Transformer的TAAC优化之路

1. 从"vibe coding"说起:一个新手小白的TAAC复盘到底在复盘什么第一次看到"vibe coding"这个词,我脑子里蹦出来的画面是:一个人对着编辑器,凭感觉敲代码,跑通了就欢呼,跑不通就换一种写…

2026/10/9 7:02:48 阅读更多 →
内容团队如何用Qoder构建标准化AI工作流与协作机制

内容团队如何用Qoder构建标准化AI工作流与协作机制

团队里六个人,过去半年试过不下四个AI工具,从网页版问答到各种套壳应用,最后都回到同一个问题:AI确实能干活,但每个人干出来的活参差不齐,提示词散落在各自收藏夹里,换个项目就抓瞎。真正让我下…

2026/10/9 7:02:48 阅读更多 →
日期处理陷阱:从1月25日看时区与历法边界

日期处理陷阱:从1月25日看时区与历法边界

我很少拿一个日期当文章标题,但1月25日这个数字,我记了快一整年。不是因为它特殊——公历里它既不是节日也不算节气,每年对应的星期几、农历日子完全不一样。正因为它"每天都在变、又好像什么都没变",才在交付前一周把我…

2026/10/9 7:01:47 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →