归档
按时间继续阅读
2026
47 篇
Your Harness. You Define It.
我参考 Creator Mode 视频和 Super-agent 设计文章做了两个插件:Super-agent 展示统一入口、任务派发与执行动态,会话看板汇总真实会话用量和估算成本。
- #DeepSeek
- #Agent
- #插件

程序员项目起名的几大流派
看一眼名字,就能猜到作者想主打什么。
- #程序员
- #项目命名
- #程序员日常

Karpathy:AI 越能干,输出越要看得懂
从 Karpathy 的推文出发,理解文字、图解、交互网页和讲解视频各自解决的问题,并把清晰表达与结果核验用到 Agent 工作中。
- #AI Coding
- #Agent
- #Prompt

Karpathy:让 AI 的输出更好懂
七张白底手绘图说明 Writing、Diagram、HTML、Video,以及人的理解、核验与指令审查。
- #AI Coding
- #Agent
- #Prompt

OpenAI亲自教你优化Skill与AGENTS.md
OpenAI 官方建议:写准 Skill 触发条件,按需加载资料,划清 AGENTS.md 作用范围与完成标准,并提供可复制的更新提示词。
- #GPT-6
- #Codex
- #Skill

AI 研发:我为什么推荐大家使用 SDD
为什么用了 AI,还是频繁返工、不断接管?聊聊 SDD 怎样帮助我们先澄清需求,让实现持续推进,并把历史决策沉淀成项目知识。
- #SDD
- #OpenSpec
- #研发协作

GPT-6 Astra Token 不够用?试试分模型
Codex 子 Agent 按职责、模型和推理强度分工,把明确执行与独立复核交给合适的角色,并合算完整任务用量。
- #Codex
- #Astra
- #ChatGPT

GPT-6 Astra 开启新版上下文,替代传统压缩
GPT-6 Astra 用工作笔记与历史检索接续长任务,保留官方配置、实验状态与验证边界。
- #Codex
- #Astra
- #ChatGPT

GPT-6 Astra:先试低或中等推理强度
Tibo 建议从 Astra 低或中等推理强度开始;保留比较前提,用熟悉任务一起观察质量、耗时、用量与返工。
- #Codex
- #Astra
- #推理强度

GPT-6 Astra来了,升级AGENTS.md和Skills
GPT-6 Astra 发布后,参考官方模型指南审计 AGENTS.md、SKILL.md 与 references,并提供可直接复制的优化提示词。
- #Codex
- #Astra
- #ChatGPT

Anthropic 4D:AI 研发不只是写代码
Anthropic 介绍的 4D AI Fluency Framework,提供了一套理解这些问题的协作框架。
- #Anthropic
- #AI Fluency
- #研发协作

“牛来” Ox Alpha,原来是智谱
关于 GLM-5.3-Flash 的身份揭晓、多模态能力、官方评测与限时价格记录。
- #智谱
- #GLM
- #多模态

Shopify CEO正考虑内部禁用Claude Code
从 Shopify CEO 与 Anthropic 的公开讨论,看多种 AI 编程工具共用项目规则时的配置分歧。
- #ClaudeCode
- #AICoding
- #AGENTSmd

为什么我不推荐使用中转站
从中转站的工作方式、低价来源与数据边界,讨论高权限 Agent 接入不透明中转服务的风险。
- #AI安全
- #Agent安全
- #模型中转

ELI5 Skill 实测:一句指令能讲明白吗?
在 Codex 中用 ELI5 解释 Anthropic 4D:从一句核心指令到可展开的 HTML 页面,记录这次实测的效果与边界。
- #ELI5
- #AgentSkills
- #Codex

A 社新 Skill ELI5:请把我的同事当成 5 岁
ELI5 是 “explain like I’m 5” 的缩写,意思是“像对 5 岁小孩解释那样说明白”。
- #ClaudeCode
- #AgentSkills
- #ELI5

五张图看懂 Loop Engineering
用五张图梳理从 Prompt 到 Loop 的演进、Loop 的 5+1 基础件,以及研发场景中的 Agent 闭环。
- #AI Coding
- #Loop Engineering
- #Agent

为什么要写测试用例
为什么要写测试用例 作为一名开发人员,你可能会发现周围的开发并不太喜欢写测试用例,甚至有些同学根本不写测试用例,认为写测试用例完全是浪费时间,或者是测试用例只是测试的事情。 在开发过程中,往往都是呼啦啦的写完代码,然后用 Postman 或者 Httpclient 等接口工具请求下接口,看着没问题就提测,然后等测试人员反馈问题。 这大概和职业以及所处的环境有关系,有些是公司没有相关的要求,有些是注重敏捷开发(项目和自己总有一个敏捷),不
- #Legacy
- #测试用例

使用 IDEA 快速创建测试用例
使用 IDEA 快速创建测试用例 在写测试用例中,一般要遵循一些规范,像命名规范、注释规范等等。 像测试用例命名规范,一般建议测试类命名为 ClassNameTest,这样能很好的表示当前测试类对应的是哪个类的测试用例。 对于测试方法的命名建议为 testMethodNameWithXXX 或者 methodNameWithXXX,methodName 很好理解,就是被测试方法的名字,后面为什么加 WithXXX 是因为一个方法的测试用
- #Legacy
- #测试用例

工作中的设计模式 —— 门面模式
工作中的设计模式 —— 门面模式 前言 门面模式也叫外观模式,是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。 使用场景 门面模式可以说是在工作中使用非常多的一种设计模式了,比如常用的 slf4j。 下面简单介绍常用的使用场景: 为远程接口设计统一入口 比如需要调用微信支付宝支付,里面一大堆参数,参数什么也不一样,这时候就可以统一封装一个接口,然后小伙伴们使用的时候,只需要调用封装的接口就可以了。 也不用担心同样是
- #Legacy
- #设计模式

Halo 主题基础设置
本章教你如何进行一些基础配置,包括:网站标题、站点 logo、侧栏头像、首页分页、评论功能 以下内容为 Halo 的公共设置,和主题无关,可能会随着 Halo 更新发生变化,如果有所差异,可以留言并 @我,进行修改。 主题在设计之初,会复用一些 Halo 自带的部分设置,不会在主题菜单中,所以有些小伙伴会疑惑找不到 logo、标题设置的地方,那是因为他们设置的地方在系统-设置这里。 基本设置 分页设置 列表数量影响着每夜会展示多少文章,
- #Legacy
- #Hao

服务器 500 错误
服务器 500 错误 不少小伙伴安装,或者升级主题后会遇到这个情况,原因是因为后台部分配置不适配,或者新的配置没有设置属性。 理论上应该保证升级不受到影响,但是没排查到是什么配置没有设置默认值,后续会尝试解决,避免这种情况。 临时解决办法 后台主题设置,都保存一遍!
- #Legacy
- #Hao

Halo 主题安装
在查看本篇文档之前,请确保你已经正确安装 Halo,如果不了解什么是 Halo,可以查看官网:https://halo.run/(https://halo.run/) 下面介绍三种方式安装主题:推荐第三种方式,直接在应用市场插件中安装 下载安装 在 GitHub 直接下载安装 如果小伙伴网络不太好,可以参考下面的方式,从 Halo 应用市场下载 Releases · liuzhihang/halo-theme-hao(https://g
- #Legacy
- #Hao

Halo 主题导航栏设置
本篇文章会教你如何配置导航栏,最终效果参考如下。 感谢 Lanbin、小孙同学 等同学的贡献(语雀参与编辑)。 标题 1. 进入站点后台 2. 点击左侧面板中的主题 3. 点击上方的导航 4. 修改标题字段即可 主菜单 主菜单即网站导航栏中间部分的菜单 1. 进入站点后台 2. 点击左侧面板中的菜单 3. 点击主菜单 4. 点击右上角的新增 5. 可以通过拖拽调整缩进,从而创建子菜单 6. 填写相应表单即可 标题左侧相关链接 1. 进入
- #Legacy
- #Hao

IDEA 自动折叠隐藏 getter setter 小技巧
IDEA 自动折叠隐藏 getter setter 小技巧 lombok 大部分小伙伴会推荐 lombok,当然我也使用,加上 @Data、@Getter、@Setter 注解,确实很方便。 但是总有一些原因,可能在开发中并不能使用 lombok,这时候又习惯了 lombok 的清爽,可以通过对 IDEA 进行如下设置以达到同样的效果。 添加 region 操作很简单,选中自己的 get set 方法,然后使用 Command + Op
- #Legacy
- #IDEA

线程池 ThreadPoolExecutor 原理及源码笔记
线程池 ThreadPoolExecutor 原理及源码笔记 前言 前面在学习 JUC 源码时,很多代码举例中都使用了线程池 ThreadPoolExecutor,并且在工作中也经常用到线程池,所以现在就一步一步看看,线程池的源码,了解其背后的核心原理。 介绍 什么是线程池 线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执
- #Legacy
- #Java

正经人谁写 Junit 啊!
正经人谁写 Junit 啊! 前言 这也太敏捷了 你的单元测试呢? 测了几个功能? 代码覆盖率多少? 哦,你说这些啊,我从来不写单元测试! 惊!你这单元测试的姿势都不对,就和打王者一样,同样是玩游戏,有人躺着,有人跪着…… 来,赶紧过来跟着我看看单元测试! 项目分层 一般开发过程中,都是要对项目进行分层的,先来看看阿里巴巴 Java 开发手册中,是如何对项目进行分层的? 当然实际工作中不可能是这样的,再来看看我一般使用的分层: 单元测试
- #Legacy
- #工作笔记

反转链表
前言 近期小伙伴群里各种反转链表题目,你说这个算法,嗯~ 还挺有意思的! 我也来做一做吧! 1 反转单链表 解题思路 使用两个临时变量,分别标记反转过程中的两个链表的头。 我也就虐虐这种 Easy 的。 2 反转 m 到 n 的链表 解题思路 1. 先定位到 left 和 leftPrev 节点 2. 反转 3. 结束 3 K 个一组翻转链表 还有!一个链表翻来翻去 ……
- #Legacy
- #LeetCode

1. 两数之和
1. 两数之和 题目 题解 暴力枚举 直接遍历出所有的可能性,一一比较。 很显然这种方式不会很快,因为双层遍历,时间复杂度为 $O(n^2)$。 哈希表 只需要将已经遍历过的值放在 Hash 表中。 K:存放 target - 当前值 V:存放当前 index 这样只需要判断是否在 Hash 表中即可。
- #Legacy
- #LeetCode

136. 只出现一次的数字
题目 题解 - 考察的是位运算 —— 异或(^),相同为 0,不同为 1 - 1^0 = 1,1^1 = 0 - 则直接对数据所有元素执行 ^ 操作,最终的就是结果
- #Legacy
- #LeetCode

137. 只出现一次的数字 II
题目 题解 方法一 - 直接用哈希表出现 3 次则从哈希表移除,最后剩下的就是结果 方法二 - 其余元素都出现三次,其中某个元素只出现一次,将每个元素都转化为二进制,则可能的结果为 4 个数都相同或者 3 个数都相同 - 同一位结果可能为 0000、1111、0001、1110 - 通过位运算得出所有该位的和,对 3 进行取模则得出结果数字该位的值
- #Legacy
- #LeetCode

1488. 避免洪水泛滥
题目 题解 - 默认对所有天数填写默认值,即都抽 1 号湖泊 - 用 Map 存储湖泊编号和下雨天的对应关系 - 把所有的空闲日子(不下雨的天数)存起来,注意要使用 TreeSet,因为后面需要进行比较 - 遍历数组 - 不下雨:将 i 天存储到 TreeSet 中,等后面再选择这一天抽哪个湖泊 - 下雨:如果下雨的湖泊已经有水,则判断有水后至今期间有没有空闲日子 - 有空闲:设置那天为抽水,并移除该空闲日子,使用 TreeSet.ce
- #Legacy
- #LeetCode

2512. 奖励最顶尖的 K 名学生
题目 题解 Map + Map Map + 二维数组
- #Legacy
- #LeetCode

2562. 找出数组的串联值
题目 题解 - 直接使用双指针,依次拼接 - 如果指针结束指向同一个数,则再加上该数
- #Legacy
- #LeetCode

260. 只出现一次的数字 III
题目 题解 题解一 - 直接使用 HashSet 判断 题解二 - 对数组所有元素求异或,得到的值为那两个不同元素的异或结果 - 明确那两个数肯定不同,所以肯定有的位数异或后结果为 1 - 假如第 x 位异或的结果为 1,即所有数的 x 位异或结果为 1 - 找到 x 的最小值 - 现在数组中只有两类数:x 位为 0 的,和 x 位为 1 的,并且这两个不同的数的 x 位还不同 - 通过 & 操作,将数组氛围两类 - 最后问题拆解为 1
- #Legacy
- #LeetCode

27. 移除元素
题目 题解 必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 所以只能修改原数组。 题解一: 直接对满足 numsi == val 的值进行依次覆盖即可。 题解二: 元素的顺序可以改变 因为对顺序没有要求,所以可以直接使用数组尾部的值覆盖前面的值。
- #Legacy
- #LeetCode

334. 递增的三元子序列
题目 题解 - i、j、k 可以不连续,所以不能够使用滑动窗口 - $O(n)$ ,空间复杂度为 $O(1)$ 表示只能遍历一次 - 假设 first 和 second 是有序的,且开始 first second 就会满足条件 - first third,则将 first 进行赋值为 third,因为在数组中肯定有比 second 小的数
- #Legacy
- #LeetCode

747. 至少是其他数字两倍的最大数
题目 题解 只要通过遍历获得最大和第二大的数即可。
- #Legacy
- #LeetCode

9. 回文数
题目 题解 - 小于 0 肯定不满足条件 - 大于 0 且尾数为 0,则不满足条件 题解一: 直接转换成字符串,然后 reverse 比较一下。但是题目中有写: 进阶:你能不将整数转为字符串来解决这个问题吗? 所以肯定不能使用这种方式! 题解二: - 对数字进行反转 题解三: - 既然是回文数,那就反转一半的数字即可 - 如何知道反转到一半了 - tmp 不断减少位数,当 tmp 小于 res 时,说明反转到一半或者一半过一位了 - 总
- #Legacy
- #LeetCode

推荐一个 Mac 终端终端工具 Warp
推荐一个 Mac 终端终端工具 Warp 在此之前一直使用 iTerm2 经过各种配置,大概样子如下 Warp 可是号称是 21 世纪的终端,看看我配置之后的样子: 1. OneDark 主题 https://github.com/warpdotdev/themes/tree/main/base16 2. workflow 提前将各种常用命令配置成 workflow,双击即可使用,还可以配置占位符变量,我就先配置了 brew 的常用命令
- #Legacy
- #Mac

依赖 jar 没有传递,导致找不到类文件而启动失败了
依赖 jar 没有传递,导致找不到类文件而启动失败了 前言 最近频繁遇到找不到类文件错误。 Caused by: java.lang.NoClassDefFoundError:xxx 就这个家伙。 但是我本地启动服务是正常的,前前后后经历了 惊讶 - 疑惑 - 烦躁 - 暴躁 - 心塞 - 欣喜 在短短的小半天内,感觉心情像过了一个过山车+大摆锤,结束了,脑袋都是晕的。 ~~关键是本地是正常的!~~ 现在,请跟随我的视角,来看看这个让人
- #Legacy
- #工作笔记

如何开启 MySQL 事务?
如何开启 MySQL 事务? 前言 本文主要介绍 MySQL 是如何开启一个事务的,相关资料也可以查阅官方文档。 https://dev.mysql.com/doc/refman/8.0/en/commit.html 方式 1 START TRANSACTION 或 BEGIN 开始新的事务 COMMIT 提交当前事务 ROLLBACK 回滚当前事务 这是大家熟知的一种方式,其中开启事务的方式 start transaction 和 b
- #Legacy
- #MySQL

为了不写接口文档,我肝了个 IDEA 插件!
为了不写接口文档,我肝了个 IDEA 插件! 前言 写代码的快乐,在于通过一顿猛如虎的操作,实现了自己设计的逻辑流程。~~(也可能并不是很快乐!)~~ 这时候,你以为就可以关机么? 还有接口文档没写呢! 哈? 开始进入无限 CV 模式,各种请求参数、必填非必填、请求返回示例! 几分钟后…… 🤬🤬🤬 我要写个 IDEA 插件,以后再也不想手写文档了! 下面,来看看我肝出来的插件吧! 功能介绍 插件名字必须得先介绍,Doc View,
- #Legacy
- #plugin

IDEA 文档插件 DocView 版本更新:修改 UI 并支持 IDEA 2020.3 !
IDEA 文档插件 DocView 版本更新:修改 UI 并支持 IDEA 2020.3 ! 前言 近期工作开始忙起来,各种忙,连阅读 Spring 源码都暂停了,Doc View 也暂时搁置计划,虽然想有很多功能,但是总是要慢慢来的。 也有几个小伙伴在 github 提了 Issues: - 希望支持 IDEA 2020.3 - 也有 bug 反馈说参数列表显示不全 当然就只有两个 Issues …… 也是没几个人用的原因。 下面看一
- #Legacy
- #plugin

jsDelivr 缓存刷新
https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/wechat.jpg https://purge.jsdelivr.net/gh/liuzhihang/oss/pic/wechat.jpg style="background-image: url('https://cdn.jsdelivr.net/gh/liuzhihang/oss/pic/banner/wallhaven-oxjmy9.j
- #Legacy
- #plugin

Spring 事务执行过程
前言 相信小伙伴一定用过 @Transactional 注解,那 @Transactional 背后的秘密又知道多少呢? Spring 是如何开启事务的?又是如何进行提交事务和关闭事务的呢? 画图猜测 在开始 debug 阅读源码之前,小伙伴们应该已经知道 MySQL 是如何开启事务的(https://mp.weixin.qq.com/s/UgNvOl0RF9v7w7dOLMnglw)。 因此可以得出猜测: 那下面跟着源码一起读一读,S
- #Legacy
- #Spring

什么是 Loop Engineering?AI Coding 正在从 Prompt 走向 Loop
从 Prompt、Context、Harness 到 Loop,解释 AI 如何在可控、可验证、可追踪、可接管的工程系统中持续推进真实研发任务。
- #AI Coding
- #Loop Engineering
- #Agent
2025
1 篇2022
5 篇2021
43 篇
从 Java 锁到分布式锁
围绕锁标志、持有者、重入、等待和释放,对比 synchronized、ReentrantLock、Redisson 与 Curator 的实现。
- #JDK
- #分布式锁

MySQL datetime 时间字段的四舍五入
如果不是踩到坑,我估计到现在还不知道时间字段会四舍五入。
- #工作笔记
- #MySQL

使用 SpringBoot 转换器将前端参数转换为枚举
最近遇到一个小伙伴问前端枚举转换问题,才意识到可以通过转换器(Converter)自动将前端传入的字段值使用枚举接收。
- #工作笔记

MyBatis-Plus 中 Mapper 重载踩坑指南
近期在 Mapper 中写了个方法重载,然后死活查不到正确结果,最终灵机一动,想到是不是因为重载,然后我 `Shift + F6` 把重载方法名字改了一下!结果,显而易见,重载的那个方法也一块改了。再次躺坑!
- #工作笔记

并发场景加锁优化小技巧
在 JDK 中有很多锁,包括 synchronized、ReentrantLock、ReentrantReadWriteLock、锁的使用场景也分很多种,下面看一下对加锁优化的小技巧。
- #工作笔记

ZooKeeper 分布式锁 Curator 源码 05:分布式读写锁和联锁
Curator 同样支持分布式读写锁 和联锁,只需要使用 InterProcessReadWriteLock 即可,来一起看看它的源码以及实现方式。
- #Curator
- #ZooKeeper
- #分布式锁

ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁
分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的。
- #Curator
- #ZooKeeper
- #分布式锁

ZooKeeper 分布式锁 Curator 源码 03:可重入锁并发加锁
在了解了加锁和锁重入之后,最需要了解的还是在分布式场景下或者多线程并发加锁是如何处理的?
- #Curator
- #ZooKeeper
- #分布式锁

ZooKeeper 分布式锁 Curator 源码 02:可重入锁重复加锁和锁释放
加锁逻辑已经介绍完毕,那当一个线程重复加锁是如何处理的呢?
- #Curator
- #ZooKeeper
- #分布式锁

ZooKeeper 分布式锁 Curator 源码 01:可重入锁
一般工作中常用的分布式锁,就是基于 Redis 和 ZooKeeper,前面已经介绍完了 Redisson 锁相关的源码,下面一起看看基于 ZooKeeper 的锁。也就是 Curator 这个框架。
- #Curator
- #ZooKeeper
- #分布式锁

Redisson 分布式锁源码 10:读写锁
Redisson 还支持可重入读写锁,允许在分布式场景下,同时有多个读锁和一个写锁处于加锁状态。
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch
Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch。
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 09:RedLock 红锁的故事
RedLock 红锁,是分布式锁中必须要了解的一个概念。 但是不建议使用 Redisson 实现的 Redis 的红锁。
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 08:MultiLock 加锁与锁释放
基于 Redis 的 Redisson 分布式联锁 RedissonMultiLock 对象可以将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例可以来自于不同的 Redisson 实例。
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 07:公平锁释放
公平锁的释放同样分为主动释放和超时释放。
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 06:公平锁排队加锁
加锁失败被放到等待队列之后,线程是如何处理的?
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 05:公平锁加锁
分布式公平锁是如何实现的?
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 04:可重入锁释放
前面已经了解到了,可重入锁加锁,看门狗以及锁的互斥阻塞。当锁加锁成功之后,锁是如何释放的?
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 03:可重入锁互斥
看过可重入锁的 Lua 脚本,已经可以知道当锁存在时,是会加锁失败的。下面看一下,加锁失败之后是如何处理的呢?
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 02:看门狗
说起 Redisson,比较耳熟能详的就是这个看门狗(Watchdog)机制。本文就一起看看加锁成功之后的看门狗(Watchdog)是如何实现的?
- #redisson
- #redis
- #分布式锁

Redisson 分布式锁源码 01:可重入锁加锁
单系统很容易想到 Java 的各种锁,像 synchronize、ReentrantLock 等等等,那分布式系统如何处理?
- #redisson
- #redis
- #分布式锁

Toolkit Json 转实体也可以支持 lombok 了!
记录 Toolkit 根据使用反馈增加 Lombok 支持的版本更新,并展示 JSON 转实体的操作。
- #plugin

MySQL next-key lock 加锁范围总结
总结主键、非主键唯一索引、普通索引、普通字段四个方面的加锁范围。
- #mysql
- #next-key

MySQL普通索引的加锁
一起看一下普通索引和普通字段的加锁范围是什么?
- #mysql
- #next-key

看来,MySQL next-key lock 的 bug 并没有被修复!
非主键唯一索引的锁范围是什么?
- #mysql
- #next-key

使用 Docker 安装并连接 MySQL
作为开发,在本机捣鼓一下 Docker 还是很有必要的,本篇文章介绍如何使用 Docker 安装 MySQL,并在终端(iTerm2)使用命令连接 MySQL。
- #mysql
- #docker

MySQL next-key lock 加锁范围是什么?
主键索引的锁范围是什么?
- #mysql
- #next-key

Mac 常用软件推荐 —— Java 开发工程师
记录一下自己用的 Mac 软件,如果小伙伴需要,可以下载体验一下。
- #software
- #mac
- #工具册

Toolkit 大更新:UI 更美观,用起来更方便!
一个 IDEA 插件,支持 Json 格式化、Json 转实体、实体转 Json、Base64 等操作!
- #plugin

工作中的设计模式 —— 建造者模式
建造者模式是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。
- #设计模式

工作中的设计模式 —— 策略模式
策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。
- #设计模式

IDEA 文档插件 DocView 版本更新:支持编辑文档注释
介绍 Doc Editor 对接口和实体注释的编辑、字段必填设置、嵌套实体复制 JSON 与预览跳转功能。
- #工具册
- #Doc View

工作中的设计模式 —— 原型模式
原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。
- #设计模式

IDEA 敏捷开发技巧——实时模版
从内置循环模板到自定义注释模板,记录 IDEA Live Templates 的配置和变量设置。
- #工具册
- #Doc View

IDEA 敏捷开发技巧——后缀完成
通过 sout、if 与自定义 jsons 示例,介绍 IDEA 后缀完成的使用及配置方法。
- #工具册
- #Doc View

Spring 事务、异步和循环依赖有什么关系?
通过自注入示例比较事务、异步与循环依赖的代理行为和差异。
- #源码笔记
- #Spring

Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?
逐步分析动态代理场景下的循环依赖,并说明二级缓存不足与三级缓存的作用。
- #源码笔记
- #Spring

Spring 是如何解决循环依赖的?
从循环依赖示例和调试过程,解释 Spring 创建 Bean 时解决循环依赖的步骤。
- #源码笔记
- #Spring

Spring 源码学习 16:单例 Bean 创建
跟踪 getSingleton、createBean、doCreateBean 和 getObjectForBeanInstance,解释单例 Bean 的创建缓存过程。
- #源码笔记
- #Spring

Spring 源码学习 15:finishBeanFactoryInitialization(重点)
围绕 FactoryBean、预实例化单例和 getBean 调用链,分析 finishBeanFactoryInitialization。
- #源码笔记
- #Spring

Spring 源码学习 14:initApplicationEventMulticaster 、onRefresh 和 registerListeners
从事件注册与监听示例出发,说明 initApplicationEventMulticaster、onRefresh 和 registerListeners。
- #源码笔记
- #Spring

Spring 源码学习 13:initMessageSource
通过国际化文件和 MessageSource 示例,说明 initMessageSource 的初始化过程。
- #源码笔记
- #Spring

Spring 源码学习 12:registerBeanPostProcessors
介绍 BeanPostProcessor 的用途,并跟踪 registerBeanPostProcessors 注册处理器的源码流程。
- #源码笔记
- #Spring
2020
52 篇
Spring 源码学习 11:invokeBeanFactoryPostProcessors
从示例和源码出发,梳理 BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor 与 invokeBeanFactoryPostProcessors。
- #源码笔记
- #Spring

Spring 源码学习 10:prepareBeanFactory 和 postProcessBeanFactory
结合调试过程解释 prepareBeanFactory 和 postProcessBeanFactory 在 Spring 容器初始化中的作用。
- #源码笔记
- #Spring

Spring 源码学习 09:refresh 大概流程
概览 Spring refresh 容器刷新流程,重点说明刷新准备和 obtainFreshBeanFactory。
- #源码笔记
- #Spring

Spring 源码学习 08:register 注册配置类
跟踪配置类注册入口 doRegisterBean 的源码和调试结果。
- #源码笔记
- #Spring

Spring 源码学习 07:ClassPathBeanDefinitionScanner
分析 ClassPathBeanDefinitionScanner 的默认过滤器、环境与资源加载器设置。
- #源码笔记
- #Spring

Spring 源码学习 06:AnnotatedBeanDefinitionReader
跟踪 AnnotatedBeanDefinitionReader 注册注解处理器的源码,并用调试验证调用关系。
- #源码笔记
- #Spring

Spring 源码学习 05:BeanDefinition 概念及其实现
介绍 BeanDefinition 的概念、元数据接口、AbstractBeanDefinition 及其实现类。
- #源码笔记
- #Spring

Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory
从入口和构造函数开始,说明 Spring 容器启动时 DefaultListableBeanFactory 的初始化。
- #源码笔记
- #Spring

Spring 源码学习 03:创建 IoC 容器的几种方式
比较 Java、XML、Groovy 和 GenericApplicationContext 创建 Spring IoC 容器的方式。
- #源码笔记
- #Spring

Spring 源码学习 02:关于 Spring IoC 和 Bean 的概念
用 IoC、DI、Container 和 Bean 的概念,建立 Spring 容器与 Bean 管理的基础认识。
- #源码笔记
- #Spring

Spring 源码学习 01:源码阅读环境的搭建
记录 Spring 源码学习环境的准备、源码下载、测试执行与常见编译问题排查。
- #源码笔记
- #Spring

DocView 现在支持自定义 Markdown 模版了!
介绍 Doc View 的 Spring、Dubbo Markdown 模板设置,以及基于 Velocity 的模板变量。
- #工具册
- #Doc View

【工具册】- Dubbo 接口,导出 Markdown ,这些功能 DocView 现在都有了!
记录 DocView 新版本的 Markdown 导出、Dubbo 接口支持、帮助文档地址和后续功能规划。
- #工具册
- #Doc View

Warning: Calling `brew list` to only list formulae is deprecated! Use `brew list --formula` instead.
Warning: Calling `brew list` to only list formulae is deprecated! Use `brew list --formula` instead.
- #issue
- #mac
- #brew

Spring 自调用事务失效,你是怎么解决的?
从一次事务失效排查出发,说明 Spring 代理调用边界,并给出拆分服务、编程式事务与事务组件三种方案。
- #工作笔记

写文档太麻烦,试试这款 IDEA 插件吧!
介绍 Doc View 首版的开发背景、接口文档预览与 Markdown 复制功能,以及注解和参数规则。
- #工具册
- #Doc View

【JDK源码笔记】- 写时复制集合 —— CopyOnWriteArrayList
通过 CopyOnWriteArrayList 的源码,说明写时复制数组、读写锁以及 add、remove、get 的实现取舍。
- #源码笔记
- #JDK

【JDK源码笔记】- 非阻塞的无界线程安全队列 —— ConcurrentLinkedQueue
结合基本使用和源码,梳理 ConcurrentLinkedQueue 的单向节点、CAS 入队出队与无界线程安全特性。
- #源码笔记
- #JDK

APP 莫名崩溃,开始以为是 Header 中 name 大小写的锅,最后发现原来是容器的错!
从一次 APP 登录故障出发,追踪 Spring 请求头解析及 Undertow、Tomcat、Jetty 对大小写的处理差异。
- #工作笔记

几行代码轻松实现跨系统传递 traceId,再也不用担心对不上日志了!
介绍 MDC 日志字段配置、请求拦截与 Feign、Dubbo 的 traceId 传递示例,并补充集中日志采集思路。
- #工作笔记
- #链路追踪

老大问我:“建表为啥还设置个自增 id ?用流水号当主键不正好么?”
围绕业务流水号与自增主键的取舍,记录 InnoDB 聚簇索引、二级索引和数据插入的学习笔记。
- #工作笔记

【JDK源码笔记】- 基于链表的有界阻塞队列 —— LinkedBlockingQueue
对比 ArrayBlockingQueue,分析 LinkedBlockingQueue 的链表节点、双锁结构和阻塞操作。
- #源码笔记
- #JDK

【JDK源码笔记】- AQS 都看完了,Condition 原理可不能少!
在 AQS 和 ReentrantLock 基础上,解释 Condition 条件队列、await、signal 以及锁释放与重新获取过程。
- #源码笔记
- #JDK

【JDK源码笔记】- 基于数组的有界阻塞队列 —— ArrayBlockingQueue
结合生产者消费者示例,梳理 ArrayBlockingQueue 的数组结构、锁、条件队列和阻塞操作。
- #源码笔记
- #JDK

【JDK源码笔记】- 使用递增计数器的线程同步工具 —— 信号量,它的原理是什么样子的?
从许可数量和基本示例出发,说明 Semaphore 基于 AQS 的初始化、acquire、release 与公平策略。
- #源码笔记
- #JDK

你有没有想过为什么交易和退款要拆开不同的表
从业务字段、状态、拆表和开发协作角度,讨论交易与退款分表及统一查询的实现思路。
- #工作笔记

【JDK源码笔记】- CyclicBarrier 不就是比 CountDownLatch 多了个回环么?
介绍 CyclicBarrier 的回环屏障、Runnable、await、reset 和它与 CountDownLatch 的区别。
- #源码笔记
- #JDK

给大家介绍下,这是我的流程图软件 —— draw.io
分享 draw.io 的多平台使用、语言设置和手绘风格流程图配置经验。
- #工具册

【JDK源码笔记】- 快来看看!AQS 和 CountDownLatch 有怎么样的关系?
通过示例和源码说明 CountDownLatch 的计数、countDown、await 以及 AQS 关系。
- #源码笔记
- #JDK

【Elasticsearch 技术分享】—— 十张图带大家看懂 ES 原理 !明白为什么说:ES 是准实时的!
以流程图梳理 Lucene 段、refresh、translog、flush 与段合并,记录 Elasticsearch 准实时搜索的学习过程。
- #工作笔记
- #ELK

【Elasticsearch 技术分享】—— ES 查询检索数据的过程,是什么样子的?
通过流程图说明 Elasticsearch 按 ID 获取文档与分布式搜索的协调过程。
- #工作笔记
- #ELK

【Elasticsearch 技术分享】—— Elasticsearch 存储一条数据, put 过程是什么样子的?
结合 Elasticsearch 7.9 的命令演示,记录索引创建、数据路由与主副分片写入流程。
- #工作笔记
- #ELK

【Elasticsearch 技术分享】—— ES 常用名词及结构
整理 Elasticsearch 的集群、节点、索引、文档及主副分片术语,并说明分片结构。
- #工作笔记
- #ELK

【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
从搜索场景和书籍检索例子出发,介绍 Elasticsearch、倒排索引与 Lucene 的关系。
- #工作笔记
- #ELK

【JDK源码笔记】- 除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
介绍 StampedLock 的写锁、读锁和乐观读三种模式、stamp 生命周期,以及它与 ReentrantReadWriteLock 的区别。
- #源码笔记
- #JDK

IDEA插件开发常用API
整理 IDEA 插件开发中 AnAction、Psi、文件搜索、XML、写文件和通知等常用 API。
- #plugin

【工具册】- IDEA 插件找不到?看这里!那就自己敲一个!
小伙伴你是否想亲手写一个插件,或者你是否有一些插件的想法,但是找不到插件。那就自己实现一个吧
- #工具册
- #IDEA
- #plugin

【JDK源码笔记】- 快进来!花几分钟看一下 ReentrantReadWriteLock 的原理!
解释 ReentrantReadWriteLock 的公平策略、读写重入、锁降级、Condition 及读锁写锁的状态编码。
- #源码笔记
- #JDK

【JDK源码笔记】- 不能再被问住了!ReentrantLock 源码、画图一起看一看!
围绕 AQS、state、可重入、公平与非公平策略,梳理 ReentrantLock 的加锁、tryLock 和解锁源码。
- #源码笔记
- #JDK

老大说新项目的结构和 xxx 项目一样就可以了,我 ……
介绍使用 Maven Archetype 提取多模块项目模板、配置元数据与自定义属性,并在 IDEA 中生成新项目。
- #工作笔记
- #Archetype

别走!这里有个笔记:图文讲解 AQS ,一起看看 AQS 的源码……(图文较长)
结合源码和队列图,梳理 AQS 的 Node 状态、独占与共享模式、入队、取消、唤醒及资源释放流程。
- #源码笔记
- #JDK

【JDK源码笔记】- JUC 包下工具类,它的名字叫 LockSupport !你造么?
从许可模型和验证实验出发,解释 LockSupport 的 park、unpark、阻塞诊断与源码实现。
- #源码笔记
- #JDK

【JDK源码笔记】- JDK 8 新增的 LongAdder,得过来看一下!
结合 Striped64 和 Cell 源码,说明 LongAdder 如何通过分散竞争提升高并发累加性能。
- #源码笔记
- #JDK

【JDK源码笔记】- 请介绍下你了解的ThreadLocal,它的底层原理!
从用户信息保存示例出发,跟踪 ThreadLocal、ThreadLocalMap、弱引用和 remove 的实现。
- #源码笔记
- #JDK

【JDK源码笔记】- 从JUC源码看CAS,我做了个笔记 ......
从乐观锁和 AtomicInteger 的使用出发,结合 JUC 源码解释 CAS、Unsafe 与原子更新的关系。
- #源码笔记
- #JDK

【JDK源码笔记】- HashMap红黑树
先介绍红黑树的性质、旋转和插入,再说明 HashMap 链表转红黑树及相关节点操作。
- #源码笔记
- #JDK

【JDK源码笔记】- HashMap扩容
沿着 HashMap 的 put 流程,说明哈希定位、链表或红黑树处理、容量阈值与 resize 扩容。
- #源码笔记
- #JDK

【JDK源码笔记】- HashMap的初始化
解释 HashMap 初始容量和负载因子、tableSizeFor 的二次幂计算,以及 key 哈希和数组下标定位。
- #源码笔记
- #JDK

markdown代码折叠
在markdown中折叠一部分内容, 点击可以展开.
- #markdown
- #小技巧

雪花算法
雪花算法简单介绍, 以及如何使用雪花算法, 生成流水号. 一个简易的流水号生成器.
- #分布式
- #流水号
- #雪花算法

项目启动失败:java.lang.NoClassDefFoundError
遇到项目启动失败, 报错信息: ... nested exception is java.lang.NoClassDefFoundError: org/apache/shardingsphere/api/config/RuleConfiguration ...
- #error

Mac创建data目录失败
mkdir: cannot create directory ‘data’: Read-only file system
- #issue
- #mac
2019
14 篇
Hexo中插入Bilibili视频
1. 修改matery主题首页显示视频为Bilibili视频. <br> 2. 在Hexo中插入Bilibili视频, 并设置大小.
- #hexo

Redis分布式锁的生产问题解决方案
作业: 自己梳理出来Redis分布式锁的生产问题解决方案
- #分布式

如何落地最终一致性事务
作业: 如果对自己的系统落地最终一致性事务,如何落地实现?
- #分布式

交易系统架构图
8.6 作业:独立画出自己系统的生产部署架构图,梳理系统和服务的QPS以及扩容方案
- #分布式

SpringCloud架构原理图
7.31作业:画出Spring Cloud的架构原理图,RPC框架架构设计图!
- #分布式

Dubbo底层原理架构图
7.30 作业:自己独立画出Dubbo的底层架构原理图.
- #分布式

SpringBoot项目中使用SpringSecurity和JWT做权限认证
背景 前段时间做了一个项目, 因为涉及到权限认证, 所以分别调研了 SpringSecurity 和 Apache Shiro. 最后选择使用了 SpringSecurity + JWT做权限认证, 现在项目已经结束, 总相关笔记. 项目下载地址 jwt-demo(https://github.com/liuzhihang/jwt-demo) 1. 使用JWT生成token 2. token存储在数据库中 3. 使用 applicati
- #JWT
- #SpringSecurity

Gitalk使用MD5生成Id
使用Gitalk作为评论系统, 需要指定文章的id为唯一id, 从而防止多个文章使用同一个issues, 导致互相串的情况.
- #hexo

Toolkit
一个小工具包, 支持通过侧栏箭头在MyBatis XML文件和Mapper文件之间相互跳转, Json字符串格式化等功能.
- #plugin

elasticsearch cat API
Elasticsearch常用cat命令
- #ELK

为什么es集群至少需要三个节点
什么是脑裂? 脑裂后会发生什么? 如何防止脑裂?
- #ELK

Elasticsearch 数据写入流程
Elasticsearch写入流程笔记, 删除和更新时的具体操作.
- #ELK

logstash input多个kafka异常
多个kafka输出到logstash时遇到的问题.
- #ELK

程序无异常中断
1. 程序执行到某一处之后停顿, 不能继续执行, 不抛出异常, 无返回值 <br> 2. 本地测试正常 ...
- #issue
2018
35 篇
skywalking5集群部署
skywalking5集群部署笔记
- #skywalking
- #ELK

logstash时间戳差8个小时
在使用logstash输出内容要es中时, 指定index为系统名称+时间(年月日), 时间会自动匹配'@timestamp'字段并格式化, 但是在实际使用过程中, 发现在上午八点之前的消息会被创建到昨天的索引里面...
- #ELK

获取IP和byte转long遇到的小问题
因为业务需求新项目的流水号系统从 '数据库自增步长+分段式锁' 换成使用'雪花流水号'修改机器标识和数据中心字段为自动获取ip后三位, 人工保证ip后三位不相同
- #ip

基于LinkHashMap的LRU缓存淘汰
LRU缓存淘汰是redis中的一种淘汰策略, 当内存大小不足以存放数据时, 此时存入新数据, 将删除较早存入的数据.
- #Redis
- #cache

ELK常用启动命令
ELK常用启动命令
- #ELK

search-guard-6 配置用户
使用 search-guard-6 配置用户, 为ELK增加安全密码, 并在不重启的情况下, 刷新用户密码.
- #ELK

search-guard-6 安装
ELK安装search-guard-6, 并生成证书, 配置权限.
- #ELK

hexo搭建博客
hexo博客搭建, 并重新更新时的具体操作过程笔记.
- #hexo

服务器cpu占用率高
服务器cpu占用率高, 排查流程.
- #issue

final finally finalize区别
final为java关键字, 可以作用于成员变量、方法、类上...
- #源码学习

线程池原理及源码解析
线程池的处理流程, 常用使用方式, 以及字段含义, 源码学习...
- #线程池

多线程相关
多个线程同时或交替运行, 单核CPU为顺序执行(交替执行), 多核情况下, 每个CPU有自己的运算器, 所以在多个CPU中可以同时运行.
- #多线程

反射和序列化破解单例
通过反射的方式获取单例对象, 验证单例模式的安全性.
- #源码学习
- #反射

反射
java反射可以在运行时获取对象的成员和属性, 并且可以动态的创建对象并调用对象的属性; 反射一般编程中很少使用,但是在很多框架中都使用了反射, 比如配置Spring的Xml配置文件中, 就使用全类名配置方式, 其实就是反射的一种使用方式.
- #反射

LinkList相关学习
LinkList也是工作中常见的集合, 底层使用双向链表结构; 比较适合新增和删除, 查询和修改需要遍历相对ArrayList比较消耗性能.
- #LinkList
- #源码学习

ArrayList相关学习
ArrayList是工作中常用的集合, 基于数组实现, 可以插入空数据, 也支持随机访问. ArrayList比较适合 get/set操作, 因为 add/remove需要移动数据, 相对来说比较消耗性能.
- #源码学习

@Value注入属性的小bug
工作中一些公共属性, 一般通过@Value注入的对象的属性中, 遇到的小问题.
- #issue

使用枚举实现单例
使用枚举的方式创建单例
- #设计模式
- #单例模式

Elasticsearch基本语句
Elasticsearch常用查询语句
- #ELK

logstash配置
logstash配置输入和输出, 同时测试使用filter过滤
- #ELK

filebeat配置
filebeat配置及启动相关脚本
- #ELK

监控系统架构
公司监控系统的架构
- #ELK

线程的生命周期
线程的生命周期: 准备, 就绪, 运行 死亡
- #多线程

synchronized锁的介绍
synchronized可以使用在方法和代码块中, 使用的方式不同锁代表的含义不同...
- #多线程

synchronized同步锁原理
synchronized同步锁是java关键字, 是内置的语言实现.
- #多线程

volatile关键字
在多线程操作共享变量时, 会使用volatile修饰共享变量, 比如单例模式的双重锁检查中, 并且在concurrent包下也大量使用了volatile关键字...
- #volatile

SpringAop代理的选择
Spring动态创建bean过程, 是如何进行选择使用 jdk还是cglib进行代理的, 可以通过源码进行解析
- #Spring
- #aop

cglib动态代理
Spring动态代理可以选择使用jdk动态代理, 或者cglib动态代理, cglib动态代理位于 net.sf.cglib.proxy 包下.
- #Spring
- #动态代理

jdk动态代理及源码解析
Spring动态代理可以选择使用jdk动态代理, 或者cglib动态代理, jdk动态代理位于 java.lang.reflect 包下.
- #Spring
- #动态代理

懒汉单例模式线程安全
一个类中只有一个实例, 且能够自行实例化提供这个实例, 同时提供全局访问的方法.
- #设计模式
- #单例模式

poi读写Excel简单介绍
Apache POI 可以对Microsoft Office 进行操作, 下面是工作中使用的对Excel进行读写操作的常用方式.
- #poi
- #excel

protostuff序列化工具
在很多地方都需要用到序列化, 比如在使用redis缓存对象时, 一般情况是实现java Serializable接口. 简单介绍下在慕课网学习到的一个新的序列化工具 ---- protostuff.
- #utils
- #serialize

Transactional声明式事务
声明式事务管理建立在AOP之上的. 其本质是对方法前后进行拦截, 然后在目标方法开始之前创建或者加入一个事务, 在执行完目标方法之后根据执行情况提交或者回滚事务.
- #transactional
- #Spring

整数包装类型的缓存
部分包装类型存在缓存机制, 会在JVM启动时, 缓存一定数量的对象, 有助于节省内存, 提高性能.
- #源码学习

Interceptor拦截器
Interceptor: 拦截器,作用类似 Filter, 主要作用是拦截用户请求, 在 Action 执行的前后各执行一段代码, 进行相应的业务处理.
- #interceptor
- #Spring
- #servlet








