枉自朝朝暮暮
type: channel
link: https://www.smalleyes.wang/
description: 朝升暮落
items: 【花卷面试题】——免费的面试题刷题工具
items: Springboot实现Web项目
items: SpringBoot的两种集成方式
items: MyBatis 中 Integer 判空的一个坑
items: 别让AI偷走了我们的思考能力
items: 基于【sensitive-word】实现敏感词检测
items: Markdown加粗语法失效问题分析
items: Java工程师常用10个Linux命令
items: Linux常用命令
items: 拥抱AI
items: Maven配置文件介绍

【花卷面试题】——免费的面试题刷题工具
type: item
date: 2026-01-23T13:07:00+00:00
description: 大家面试时肯定需要背一背八股文之类的面试题，但是我发现很少有工具能提供免费的八股文刷题功能；要么就是有积分限制，要么就是整理的题目质量很差，一眼就是AI生成的。最近抽了点时间通过Vibe Coding开发了一个“花卷面试题”的小程序，支持H5和微信小程序访问，目前已经成功上线。暂时采用激活码激活模式，激活码只是作为限制服务器资源访问而用；并非付费才能获取；怎么访问目前支持H5和小程序两个入口，H5会提供一些实验性的功能，小程序更加稳定。H5版：https://huajuan.smalleyes.wang[button color="danger" icon="glyphicon glyphicon-send" url="https://huajuan.smalleyes.wang" type=""]点击前往[/button]微信小程序：搜索「花卷面试题」或扫描下方二维码功能概览这个项目主要就是帮你刷面试题的，功能不算复杂，而且当前版本也只是简单支持了题目浏览和记录；[tabs][tab name="题目浏览" active="true"]题目浏览收藏记录浏览记录题目搜索已录入800+面试题[/tab][tab name="答题助手"]流式输出最新前沿MODEL[/tab][tab name="主题切换"]支持亮色/暗色主题切换，晚上刷题不刺眼。[font color="#4D7FFF"]默认蓝[/font] [font color="#FF7D00"]活力橙[/font] [font color="#07C160"]薄荷绿[/font] [font color="#FF69B4"]樱花粉[/font] [font color="#8A2BE2"]紫罗兰[/font] [font color="#FF4757"]朱砂红[/font][/tab][/tabs]版本历史[timeline title="小程序版本" type="small"][item date="2026-01-21 v1.0.1"]1.支持题库、收藏、浏览历史；2.支持暗黑模式、主题色切换；[/item][/timeline][timeline title="H5版本" type="small"][item date="2026-01-21 v1.0.1"]1.支持AI答题助手；支持暗黑模式、主题色切换；[/item][item date="2025-12-31 v1.0.0"]1.支持题库、收藏、浏览历史；[/item][/timeline][goal title="开发目标"][item check="false" progress="30%"]1.整理题库，确保提供优质内容[/item][item check="false"]2.新增练习模式[/item][item check="false"]3.增加统计项，推荐内容[/item][/goal]永久激活码如果你在准备面试，可以用用看，有啥问题或者建议也可以反馈给我，我会持续改进。

Springboot实现Web项目
type: item
date: 2026-01-27T12:55:36+00:00
description: Spring Boot集成Web项目记录一下用 Spring Boot 搭建基础 Web 项目的过程，包含 Maven 配置、代码结构、配置文件、启动测试，以及如何替换默认容器。Maven 配置新建一个 Maven 项目，配置 pom.xml。继承 Spring Boot 父项目，统一管理依赖版本：<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.0</version> </parent> <properties> <java.version>21</java.version> </properties>添加 Web 依赖，这一个就够了：<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>添加打包插件：<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>代码项目结构web-demo/ ├── src/ │ ├── main/ │ │ ├── java/wang/smalleyes/cloud/ │ │ │ ├── WebApplication.java │ │ │ └── controller/ │ │ │ └── HelloController.java │ │ └── resources/ │ │ └── application.yml └── pom.xml启动类放在包根目录，这样组件扫描才能覆盖所有子包。启动类package wang.smalleyes.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class WebApplication { public static void main(String[] args) { SpringApplication.run(WebApplication.class, args); } }控制器package wang.smalleyes.cloud.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; @RestController public class HelloController { @GetMapping("/hello") public Map<String, Object> hello() { Map<String, Object> result = new HashMap<>(); result.put("message", "Hello from Spring Boot!"); result.put("status", "success"); return result; } }配置application.yml 配置基础参数：server: port: 8080 spring: application: name: web-demo logging: level: root: INFO启动测试运行 WebApplication.main() 方法，看到日志输出正常启动后，访问接口测试：curl http://localhost:8080/hello返回结果：{ "message": "Hello from Spring Boot!", "status": "success" }替换默认容器Spring Boot 默认使用 Tomcat 作为 Web 容器。如果要替换成 Jetty 或 Undertow，修改 Mave…

SpringBoot的两种集成方式
type: item
date: 2026-01-27T12:11:00+00:00
description: 在搭建多模块项目的时候，会遇到这个问题：多个子模块都需要用 Spring Boot，怎么统一管理依赖版本呢？Spring Boot 提供了两种集成方式，各有各的使用场景。两种方式对比方式一：继承 spring-boot-starter-parent这是最常见的方式，直接让项目继承 Spring Boot 的父 pom。优点：配置简单，开箱即用自动管理大量依赖版本提供了很多默认配置（插件、资源过滤等）缺点：一个项目只能有一个父 pom如果企业有自己的父 pom，就冲突了不够灵活，受 Spring Boot 父 pom 限制示例：<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>方式二：使用 dependencyManagement 导入这种方式不继承 Spring Boot 父 pom，而是通过 dependencyManagement 导入依赖管理。优点：可以自定义父 pom适合企业多模块项目灵活性高，不受 Spring Boot 父 pom 限制可以同时管理多个框架的依赖版本缺点：需要手动配置一些默认属性（如 Java 版本、编码等）配置相对复杂一些示例：父 pom 配置：<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>3.5.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>子模块使用：<parent> <groupId>wang.smalleyes.cloud</groupId> <artifactId>multi-module-project</artifactId> <version>1.0.0</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>实际应用下面展示如何使用 方式二 搭建多模块项目。父 pom 配置<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>wang.smalleyes.cloud</groupId> <artifactId>multi-module-project</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <properties> <java.version>21</java.version> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-boot.version>3.5.0</sp…

MyBatis 中 Integer 判空的一个坑
type: item
date: 2026-01-26T13:59:32+00:00
description: 最近在写 MyBatis 的 mapper.xml 时遇到一个坑，记录一下。问题是这样的：有个查询条件是状态字段（Integer 类型），当状态为 0 时，这个条件居然没生效。排查了半天，发现问题出在 <if> 标签的判空逻辑上。问题复现mapper.xml 中的写法： SELECT * FROM user <where> <if test="status != null and status != ''"> AND status = #{status} </if> </where> 调用时传入 status = 0，结果这个条件被忽略了，SQL 中没有 AND status = 0。原因分析MyBatis 使用 OGNL 表达式，在 OGNL 中：0 == '' // 结果是 true所以当 status = 0 时：status != null and status != '' // 等价于 true and (0 != '') // 等价于 true and false // 结果是 false条件不成立，<if> 标签里的内容就被跳过了。解决方案方案一：只判断非空（推荐）<if test="status != null"> AND status = #{status} </if>Integer 类型的字段，只需要判断 != null 就行了，不需要判断空字符串。方案二：增加数值判断<if test="status != null and status != '' and status >= 0"> AND status = #{status} </if>这样写也可以，但有点多余，不如方案一简洁。方案三：统一用 1 作为默认值有些团队会约定 Integer 类型字段不用 0，用 1 表示默认状态。// 状态：1-启用，2-禁用 private Integer status;这样就不会有 0 的问题了，但这是规避问题，不是解决问题。其他注意事项字符串字段的判断字符串类型的字段，判空时需要同时判断 null 和空字符串：<if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if>List 判断判断集合是否为空：<if test="ids != null and ids.size() > 0"> AND id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </if>总结这个坑很经典，但很容易踩：Integer 类型字段判空时，只判断 != null 即可不要加 and xxx != '' 的判断，否则 0 会被当成空值字符串类型才需要同时判断 null 和空字符串虽然是个小问题，但排查起来挺费时间的，记录一下以后避免再踩\~扩展阅读除了这个坑，MyBatis 中还有一些常见问题：1. 参数为空时全表查询 <if test="name != null and name != ''"> AND name = #{name} </if>应该明确查询条件，避免参数为空时无条件查询全表。2. ​<where> 标签的使用 SELECT * FROM user <where> <if test="name != null and name != ''"> AND name = #{name} </if> <if test="status != null"> AND status = #{status} </if> </where> <where> 标签会自动处理 AND 前缀，避免 SQL 语法错误。3. ​$ 和 ​# 的区别 AND name = #{name} ORDER BY ${orderBy}能用 #{} 就用 #{}，${} 只在表名、字段名等不能预编译的场景使用。这些细节在写 MyBatis 时都要注意，很容易踩坑\~

别让AI偷走了我们的思考能力
type: item
date: 2026-01-26T12:13:20+00:00
description: 最近写代码、写文档，甚至写个简单的总结，第一反应都是打开 AI 工具，直接让它生成。刚开始觉得挺好，效率确实提升了不少。但时间久了，发现自己有点不对劲：碰到问题不再先思考解决方案，而是直接问 AI写东西的时候，思路经常卡住，等着 AI 给我提示甚至有些基础知识都记不住了，反正"有 AI 呢"不知道大家有没有类似的感觉？一、AI 确实很方便，但也很危险先说说 AI 带来的便利吧。tabs几句话就能生成完整函数复杂的算法不需要自己推导Bug 让 AI 帮你找性能优化直接问建议/tab大纲自动生成内容扩充一键完成润色修改不用自己动手格式规范自动处理/tab概念解释通俗易懂案例分析快速理解学习路径自动规划重点内容直接提取/tab这些确实帮我们省了很多时间。但问题来了：当我们可以轻松获得答案时，还会主动思考吗？[scode type="yellow" size="default"]就像计算器的出现，让很多人的心算能力退化了一样。AI 的普及，也可能让我们的思考能力逐渐减弱。[/scode]二、思维变懒的几个表现2.1 丧失独立思考能力前几天看到一个技术问题，我的第一反应是"问 ChatGPT"，而不是：这个问题的本质是什么？我可以用哪些方法解决？哪种方案更适合当前场景？等到 AI 给出答案后，我发现自己连判断对错的能力都弱化了。2.2 记忆力下降以前记一些重要的 API、配置参数、命令行，用多了自然就记住了。现在呢？"反正可以问 AI，记它干嘛""忘了就问，多方便""不用背这些死记硬背的东西"结果就是：离开 AI，连一些基础操作都做不完整。2.3 缺乏深度思考AI 给的答案通常都是"现成"的，我们直接拿来用就行。但这导致我们：不去追问"为什么是这样"不去思考"有没有更好的方案"不去探究"底层原理是什么"长期下来，知识体系越来越零散，理解也越来越肤浅。三、AI 时代的正确打开方式AI 不是不能用，而是要用对方式。3.1 AI 是助手，不是替代品[scode type="green" size="default"]正确方式：先自己思考，再用 AI 补充[/scode]举个例子：碰到一个技术难题，正确的流程应该是：1. 自己分析问题 ├── 问题是什么？ ├── 可能的原因有哪些？ └── 我能想到哪些解决方案？ ​ 2. 查阅资料 ├── 官方文档怎么说的？ ├── 有没有类似的案例？ └── 社区里怎么讨论的？ ​ 3. 自己尝试解决 ├── 方案 A 试试看 ├── 方案 B 也试试 └── 记录遇到的问题 ​ 4. 最后再用 AI ├── 对比我的思路和 AI 的建议 ├── 问问 AI 有没有我没想到的点 └── 让 AI 帮我优化方案而不是：1. 直接问 AI："这个问题怎么解决？" 2. 复制粘贴 AI 的代码 3. 运行一下，能跑就行 4. 完事[scode type="blue" size="default"]核心区别：前者是你主导思考，AI 辅助决策；后者是 AI 替你思考，你只是执行。[/scode]3.2 把 AI 当作"审稿人"而不是"代笔者"写东西的时候，试试这样的方式：[scode type="yellow" size="default"]错误方式：直接让 AI 生成全文，自己一字不改[/scode]"帮我写一篇关于 XXX 的文章，1000 字" → AI 生成全文 → 复制粘贴发布 → 完成[scode type="green" size="default"]正确方式：自己写，AI 帮你优化[/scode]1. 自己先写初稿 ├── 用自己的语言表达 ├── 按自己的思路组织 └── 把想法完整呈现 ​ 2. 让 AI 帮你优化 ├── "帮我检查逻辑问题" ├── "哪些地方表述不清？" ├── "有没有更好的表达方式？" └── "补充一些我遗漏的观点" ​ 3. 结合 AI 的建议修改 ├── 采纳合理的建议 ├── 保持自己的风格 └── 加入自己的思考区别很明显：前者：没有 AI，你写不出东西后者：没有 AI，你也能写，只是 AI 帮你写得更好3.3 用 AI 拓展思维，而不是限制思维AI 给的答案往往是"标准答案"，但不一定是"最优答案"。[scode type="blue" size="default"]我的做法：问完 AI 后，再多问几个问题[/scode]问题："如何优化这段代码的性能？" ​ AI 回答："可以用缓存减少数据库查询" ​ 继续追问： - "除了缓存，还有其他方案吗？" - "每种方案的优缺点是什么？" - "什么场景下用哪种方案更合适？" - "有没有什么坑需要注意？"通过追问，你获得的不是"一个答案"，而是"多种视角"和"深度理解"。四、一些实用的建议4.1 设定"思考时…

基于【sensitive-word】实现敏感词检测
type: item
date: 2026-01-26T11:52:00+00:00
description: 前言在内容审核、用户评论、社区管理等场景中，敏感词检测是必不可少的功能。本文将介绍如何在 Spring Boot 项目中集成 sensitive-word 库，实现高效的敏感词检测。tabs用户昵称、签名过滤评论、弹幕审核论坛帖子过滤聊天内容监管客服质检/tab🚀 高性能：基于 DFA 算法，14万+ QPS🎯 准确率高：支持数字变体、重复词等检测🔧 易集成：开箱即用，注解驱动📦 功能丰富：内置大量敏感词库🔌 可扩展：支持自定义敏感词和白名单/tabSpring Boot 2.x/3.xsensitive-word 0.18.0DFA 算法（确定有限状态自动机）注解式编程/tab项目地址：https://github.com/houbb/sensitive-word一、快速开始1.1 Maven 依赖<dependency> <groupId>com.github.houbb</groupId> <artifactId>sensitive-word</artifactId> <version>0.18.0</version> </dependency>1.2 基础使用import com.github.houbb.sensitive.word.bs.SensitiveWordBs; import com.github.houbb.sensitive.word.core.SensitiveWordHelper; ​ public class SensitiveWordDemo { public static void main(String[] args) { String text = "五星红旗迎风飘扬，毛主席的画像屹立在天安门前。"; ​ // 1. 检测是否包含敏感词 boolean contains = SensitiveWordHelper.contains(text); System.out.println("是否包含敏感词: " + contains); // true ​ // 2. 查找第一个敏感词 String first = SensitiveWordHelper.findFirst(text); System.out.println("第一个敏感词: " + first); // 五星红旗 ​ // 3. 查找所有敏感词 List<String> all = SensitiveWordHelper.findAll(text); System.out.println("所有敏感词: " + all); // [五星红旗, 毛主席, 天安门] ​ // 4. 替换敏感词 String replaced = SensitiveWordHelper.replace(text, '*'); System.out.println("替换后: " + replaced); // ***迎风飘扬，***的画像屹立在***前。 } }二、核心功能详解2.1 四种检测方法方法参数返回值说明contains(String text)待检测文本boolean是否包含敏感词findFirst(String text)待检测文本String第一个敏感词findAll(String text)待检测文本List所有敏感词replace(String text)待检测文本String替换敏感词为*String text = "这是一个测试，包含不良信息。"; ​ // 快速检测 if (SensitiveWordHelper.contains(text)) { // 包含敏感词，拒绝提交 throw new BusinessException("内容包含敏感词"); } ​ // 查找具体敏感词 String firstWord = SensitiveWordHelper.findFirst(text); List<String> allWords = SensitiveWordHelper.findAll(text); ​ // 替换敏感词 String cleanText = SensitiveWordHelper.replace(text);2.2 数字变体检测这个功能可以检测用户用数字替换字符的变体：String text1 = "法轮功"; String text2 = "法0轮0功"; String text3 = "法O轮O功"; ​ SensitiveWordBs wordBs = SensitiveWordBs.newInstance() .enableNumCheck(true) // 启用数字变体检测 .enableEnglishCheck(true) // 启用英文字母变体检测 .init(); ​ Syste…

Markdown加粗语法失效问题分析
type: item
date: 2026-01-26T11:28:00+00:00
description: 前言你有没有遇到过这种情况：在 Markdown 中写 **加粗文本**，结果并没有被加粗？特别是在中文环境下，比如：……那猹却将身一扭，反从他的胯下逃走了。**这少年便是闰土。**我认识他时，也不过十多岁……你会发现 "这少年便是闰土。" 并没有被渲染成粗体！[scode type="red" size="default"]先说结论：这不是 bug，这是 CommonMark 规范的规定！是由于自然语言之间的差异导致的。[/scode]一、问题复现1.1 失效的场景# ❌ 加粗失效 这是**加粗**。这是中文句号。 ​ # ❌ 加粗失效 这是**加粗**，这是逗号 ​ # ❌ 加粗失效 这是**加粗**！这是感叹号 ​ # ✅ 加粗生效（后面有空格） 这是**加粗** 后面有空格 ​ # ✅ 加粗生效（后面是英文） This is **bold** text.规律：当 ** 后面紧跟中文标点符号时，加粗会失效。二、原因分析2.1 CommonMark 规范Markdown 使用 * 和 _ 作为强调指示符：被单个 * 或 _ 包裹的文本 → 斜体（）被两个 * 或 _ 包裹的文本 → 粗体（）但是，何时被识别为强调，有一套复杂的规则定义在 CommonMark 规范 中。2.2 核心概念：定界符序列（Delimiter Run）定界符类指的是：一个或一串非转义的 *一个或一串非转义的 _左侧定界符序列（left-flanking）一个定界符序列需要同时满足：后面不能是空白当前面没有空白或标点符号时，后面不能是标点符号右侧定界符序列（right-flanking）一个定界符序列需要同时满足：前面不能是空白当后面没有空白或标点符号时，前面不能是标点符号2.3 问题根源以 **这少年便是闰土。**我认识 为例：……闰土。**我认识 ^^ 这里是两个星号 ​ 前面字符：。 后面字符：我判断是否为右侧定界符序列：✅ 前面不是空白（是 。）❌ 后面不是空白或标点符号（是 我）❌ 前面是标点符号（。）结论：** 不满足右侧定界符序列的条件，不会被识别为结束粗体的标识符。2.4 为什么要这样定义？为了支持嵌套分隔符，例如：**one **two two **three** two two** one**应该渲染为：粗体开始one粗体开始two two粗体结束three粗体开始two two粗体结束one粗体结束如果规则不这么严格，就无法正确解析嵌套结构。代价：使用非空格分词语言（如中文）的用户只能默默接受……三、解决方案方案1：手动加空格（不推荐）这是**加粗** 。（在标点前加空格）[scode type="yellow" size="default"]缺点：破坏了中文的书写习惯，格式不统一。[/scode]方案2：使用零宽空格（推荐）⭐零宽空格（Zero-Width Space, ZWSP） 是一种不可打印的 Unicode 字符，编码为 U+200B。它的特殊之处：肉眼看不见：显示时不会占用任何空间不是 Unicode 空格字符：不属于 Zs 类（分隔符-空格），而是属于 Cf 类（其他-格式）可以触发换行：只在需要换行时生效验证：ZWSP 不是空格console.log(' '.charCodeAt(0)); // 32 (普通空格) console.log('\u200b'.charCodeAt(0)); // 8203 (ZWSP) ​ console.log(/\s/.test(' ')); // true console.log(/\s/.test('\u200b')); // false ​ // Java 中也是如此 System.out.println(Character.isWhitespace(' ')); // true System.out.println(Character.isWhitespace('\u200b')); // falseUnicode 类别Unicode 字符按类别区分，主要大类用第一个字母表示，小类用第二个字母表示：Zs 类（分隔符-空格 Separator, Space）：17 个字符，包括：普通空格 U+0020不换行空格 U+00A0其他 15 个空格字符Cf 类（其他-格式 Other, Format）：包括：零宽空格 ZWSP ​U+200B ⭐（本文的主角）零宽非连接符 ZWNJ U+200C零宽连接符 ZWJ U+200D其他格式字符关键点：ZWSP 属于 Cf 类，不属于 Zs 类，因此它不是 Unicode 定义的"空格字符"。这也是它能够绕过 CommonMark 规则限制的原因。方案3：使用下划线（部分场景）这是__加粗__。这是中文句号。[scode type="…

Java工程师常用10个Linux命令
type: item
date: 2026-01-25T11:41:00+00:00
description: 一、ps - 查看进程ps 是最常用的进程查看命令，对于 Java 应用来说尤其重要。常用场景查看 Java 进程：# 查看所有 Java 进程 ps aux | grep java ​ # 或使用 pgrep（更简洁） pgrep -l java ​ # 查看 Tomcat 进程 ps aux | grep tomcat ​ # 查看指定端口的进程 ps aux | grep 8080查看进程详细信息：# 查看指定 PID 的进程 ps -fp 1234 ​ # 查看进程树（查看父子关系） ps axjf | grep java ​ # 按内存使用排序（找内存泄漏） ps aux --sort=-%mem | grep java | head -n 5 ​ # 按 CPU 使用排序（找 CPU 占用高） ps aux --sort=-%cpu | grep java | head -n 5[scode type="blue" size="default"]提示：生产环境的 Java 应用通常以 jar 包或 Tomcat 方式运行，用 ps 找进程时注意应用名称。[/scode]二、top/htop - 系统监控top 和 htop 是实时监控系统资源的重要工具，排查性能问题时必备。top 基本使用# 启动 top top ​ # 只查看指定进程 top -p 1234 ​ # 按 CPU 排序（按 P） # 按内存排序（按 M） # 退出（按 q）htop 推荐htop 界面更友好，支持鼠标操作。# 安装 htop # Ubuntu/Debian sudo apt-get install htop ​ # CentOS/RHEL sudo yum install htop ​ # 启动 htop ​ # F3 搜索进程（输入 java） # F9 杀死进程 # F10 退出Java 应用排查场景：CPU 占用高：找到 Java 进程，看是哪个线程占用高内存泄漏：看 RES/VIRT 列，持续增长可能有问题线程数过多：查看 Java 进程的线程数是否异常三、netstat/ss - 网络排查netstat 和 ss 用于查看网络连接和端口占用，排查端口冲突时很有用。netstat 使用# 查看所有监听端口 sudo netstat -tlnp ​ # 查看 8080 端口被谁占用 sudo netstat -tlnp | grep 8080 ​ # 查看指定进程的网络连接 sudo netstat -anp | grep 1234 ​ # 统计 TCP 连接数 sudo netstat -an | grep ESTABLISHED | wc -lss 推荐（更快）# 查看监听端口 sudo ss -tlnp ​ # 查看端口占用 sudo ss -tlnp | grep 8080 ​ # 查看进程打开的 socket sudo ss -p | grep 1234常见问题场景：启动 Spring Boot 报错 "端口已被占用"查看 Tomcat 默认 8080 端口是否被占用查看数据库连接池是否达到上限四、tail - 查看日志tail 是 Java 工程师使用频率最高的命令之一，实时查看日志必不可少。常用用法# 查看文件最后 100 行 tail -n 100 application.log ​ # 实时跟踪日志（最常用） tail -f application.log ​ # 同时查看多个日志文件 tail -f application.log | grep ERROR ​ # 实时查看并高亮错误 tail -f application.log | grep --color=auto -E "ERROR|WARN" ​ # 查看日志最后 N 行并持续监控 tail -n 100 -f application.log多日志文件监控# 监控多个日志 tail -f application.log system.log ​ # 或使用 multitail（支持多窗口） # 安装 sudo apt-get install multitail ​ # 使用 multitail application.log system.log[scode type="yellow" size="default"]注意：生产环境日志量很大，建议配合 grep 过滤，否则终端会刷爆。[/scode]五、grep - 搜索内容grep 用于在文件中搜索文本，分析日志时必不可少。常用场景# 搜索错误日志 grep ERROR application.log # 忽略大小写搜索 grep -i error application.log # 显示行号 g…

Linux常用命令
type: item
date: 2026-01-25T11:17:00+00:00
description: 整理下热门Linux常用命令一、基础命令sudo 权限提升sudo 是 Linux 系统中用于以超级用户（root）权限执行命令的工具。常用参数：-u 指定用户-i 登录为 root 用户-s 执行 shell-b 在后台执行使用示例：# 以 root 权限执行命令 sudo nginx -t ​ # 以 root 权限打开 shell sudo -i ​ # 以指定用户执行命令 sudo -u nginx nginx -t ​ # 编辑系统文件 sudo vi /etc/nginx/nginx.conf ​ # 查看sudo权限 sudo -l为什么要用 sudo：系统配置文件通常需要 root 权限修改服务管理需要 root 权限日志文件需要 root 权限查看端口 80、443 需要 root 权限绑定chmod 文件权限chmod 用于修改文件或目录的权限。权限说明：r (read)：读权限，数值 4w (write)：写权限，数值 2x (execute)：执行权限，数值 1常用参数：-R 递归修改-v 显示详细信息-c 类似 -v，但只显示修改过的文件使用示例：# 数字方式：755 = rwxr-xr-x chmod 755 /path/to/file ​ # 符号方式：给所有用户添加执行权限 chmod +x /path/to/script.sh ​ # 移除其他用户的写权限 chmod o-w /path/to/file ​ # 给所有者添加写权限 chmod u+w /path/to/file ​ # 递归修改目录权限 chmod -R 755 /var/www/html ​ # 配置文件权限（所有者可读写，其他人只读） chmod 644 /etc/nginx/nginx.conf ​ # 目录权限（可执行） chmod 755 /var/www/html ​ # 脚本文件（可执行） chmod +x deploy.sh常用权限值：644：文件（rw-r--r--），所有者可读写，其他人只读755：目录/脚本（rwxr-xr-x），所有者可读写执行，其他人读执行600：敏感文件（rw-------），只有所有者可读写777：完全开放（不推荐生产环境使用）chown 文件所有者chown 用于修改文件或目录的所有者和所属组。常用参数：-R 递归修改-v 显示详细信息使用示例：# 修改文件所有者 sudo chown nginx:nginx /var/www/html/index.html ​ # 修改目录所有者 sudo chown www-data:www-data /var/www/html ​ # 只修改所有者（不修改组） sudo chown nginx /var/www/html ​ # 只修改组 sudo chown :nginx /var/www/html ​ # 递归修改目录及其内容 sudo chown -R nginx:nginx /var/www/html ​ # 修改为当前用户 sudo chown $USER:$USER /path/to/fileuseradd 用户管理useradd 用于创建新用户。常用参数：-m 创建用户主目录-s 指定 shell-g 指定主组-G 指定附加组-d 指定主目录使用示例：# 创建运行用户 sudo useradd -r -s /sbin/nologin nginx ​ # 创建普通用户 sudo useradd -m -s /bin/bash username ​ # 创建用户并指定主目录 sudo useradd -m -d /home/custom username ​ # 创建用户并添加到多个组 sudo useradd -m -G sudo,docker username ​ # 设置用户密码 sudo passwd username ​ # 删除用户 sudo userdel username ​ # 删除用户及其主目录 sudo userdel -r username ​ # 查看用户信息 id usernamecp 复制文件cp 用于复制文件或目录。常用参数：-r 递归复制目录-p 保留文件属性-v 显示详细信息-i 覆盖前提示-a 归档模式（保留所有属性）使用示例：# 复制文件 cp file1.txt file2.txt ​ # 复制文件到目录 cp file.txt /path/to/directory/ ​ # 复制目录 cp -r /source/dir /destination/dir ​ # 保留文件属性复制 cp -p file.txt file_backup.txt ​ # 覆盖前提示 cp -i file.txt…

拥抱AI
type: item
date: 2026-01-25T09:56:00+00:00
description: 整理下网络热门AI能力供应商一、纯大语言模型（文本对话）国外主流厂商厂商模型对话页面官网特点OpenAIGPT-5 / GPT-4.5https://chatgpt.comhttps://openai.com综合能力强，对话自然，代码生成和调试能力优秀AnthropicClaude Opus 4.5 / Claude 4.5https://claude.aihttps://www.anthropic.com编程能力最强，长文本处理（200K+上下文），安全性好GoogleGemini 3 Pro / Flashhttps://gemini.google.comhttps://deepmind.google推理能力强，上下文超大（100万+tokens），Google生态集成国内主流厂商厂商模型对话页面特点阿里巴巴通义千问 Qwen2.5 / Maxhttps://tongyi.aliyun.com中文理解强，开源程度高，API价格友好DeepSeekDeepSeek-V3 / R1https://chat.deepseek.com代码生成能力强，价格极具竞争力1字节跳动豆包 Doubao-1.5-prohttps://www.doubao.com中文能力强，在国产模型评测中排名前列2百度文心一言 4.0https://yiyan.baidu.com中文理解强，与百度生态集成智谱AIGLM-4.5https://chatglm.cn中英双语，企业级应用成熟月之暗面Kimi k1.5https://kimi.moonshot.cn长文本处理（200万字上下文）零一万物Yi-Largehttps://01.ai开源友好，性能不错二、多模态模型（文本+图像/视频/音频）国外厂商厂商模型对话页面特点OpenAIGPT-4V / GPT-4ohttps://chatgpt.com图像理解生成，实时语音对话，视频分析GoogleGemini 3 Pro / Ultrahttps://gemini.google.com原生多模态，支持音视频图文，连续多图输入AnthropicClaude 3.5 Visionhttps://claude.ai图像理解强，适合图表文档分析，OCR优秀国内厂商厂商模型对话页面特点阿里巴巴通义千问多模态https://tongyi.aliyun.com图像理解，文档解析强，中文优化字节跳动豆包 Doubao-1.5-vision-prohttps://www.doubao.com任意分辨率图像，极端长宽比支持百度文心一言多模态https://yiyan.baidu.com图像生成理解，文图转换三、推理模型（专门用于复杂推理）厂商模型对话页面特点OpenAIo3 / o3-minihttps://chatgpt.com推理能力强，数学竞赛表现优异3DeepSeekDeepSeek-R1https://chat.deepseek.com推理能力强，开源友好GoogleGemini 2.5 Deep Thinkhttps://gemini.google.com思考模型，多思路交叉对比阿里巴巴Qwen-QwQhttps://tongyi.aliyun.com推理模型，数学和逻辑能力强四、编程模型（专门针对代码生成）厂商模型官网特点DeepSeekDeepSeek-Coderhttps://www.deepseek.com代码生成强，HumanEval表现优异OpenAICodexhttps://openai.comGitHub Copilot底层模型Hugging FaceStarCoderhttps://huggingface.co开源代码模型，可本地部署阿里巴巴通义灵码https://tongyi.aliyun.com/lingma与阿里云集成，中文注释支持五、行业模型（特定领域）领域厂商模型对话页面特点医疗百川智能Baichuan-M3 Plus4-循证增强医疗大模型，幻觉率低于3%，HealthBench全球第一5医疗-其他医疗模型-持续更新中法律---持续更新中金融---持续更新中六、编程助手（IDE/插件/命令行）AI-First IDE（独立IDE）工具官网特点定价Cursorhttps://cursor.comAI深度集成，Agent模式，多文件重构个人版免费/专业版付费Windsurfhttps://codeium.com/windsurfAI原生IDE，Flow模式协作免费Traehttps://trae.ai国产AI IDE，完全免费，中文支持好免费IDE插件工具官网特点定价GitHub Copilothttps://github.com/features/copilot行业标准，用户最多，Copil…

Maven配置文件介绍
type: item
date: 2026-01-25T09:39:00+00:00
description: Maven settings.xml 配置详解每次换电脑或者重装系统，都要重新配置Maven的settings.xml文件。里面的配置项不少，很多都不记得是干什么的。这里整理下相关内容。settings.xml 的位置settings.xml文件可以在两个位置：1. 用户级别配置${user.home}/.m2/settings.xml在macOS和Linux上是 ~/.m2/settings.xml，在Windows上是 C:\Users\你的用户名\.m2\settings.xml。2. 全局配置${maven.home}/conf/settings.xml用户级别配置优先级更高，会覆盖全局配置。完整配置示例（带注释）先给你一个完整的settings.xml配置文件，每一项都加了注释说明：<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> ​ <localRepository>${user.home}/.m2/repository</localRepository> ​ <offline>false</offline> ​ <interactiveMode>true</interactiveMode> ​ <pluginGroups> <pluginGroup>org.apache.maven.plugins</pluginGroup> <pluginGroup>org.codehaus.mojo</pluginGroup> </pluginGroups> ​ <proxies> <proxy> <id>my-proxy</id> <active>true</active> <protocol>http</protocol> <host>proxy.example.com</host> <port>8080</port> <username>代理用户名（如果需要）</username> <password>代理密码（如果需要）</password> <nonProxyHosts>localhost|127.0.0.1</nonProxyHosts> </proxy> </proxies> ​ <servers> <server> <id>my-nexus-releases</id> <username>admin</username> <password>admin123</password> </server> <server> <id>my-nexus-snapshots</id> <username>admin</username> <password>admin123</password> </server> </servers> ​ <mirrors> <mirror> <id>aliyun</id> <name>Aliyun Maven</name> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> ​ <profiles> <profile> <id>jdk-17</id> <activation> <activeByDefault>true</activeByDefault> <jdk>17</jdk> </activation> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion> </properties> </profile> ​ <profile> <id>jdk-1.8</id> <activation> <activeByDefault>false</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.c…