分治策略
步骤 分解(divide):将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。 解决(conquer):递归地杰出子问题。如果子问题的规模足够小,则停止递归,直接求解。 合并(Combine):将子问题的解组合成原问题的解。 递归式 递归式(recurrence)可以帮我们刻画整个算法的运行时间。 一个常见刻画递归式的方法是画递归树。通过递归树的枝叶来试图把整个算法的步骤勾勒出来。
日志问题
Log4j 的架构设计 http://www.cnblogs.com/Fskjb/archive/2011/01/29/1947592.html https://blog.csdn.net/qq_35246620/article/details/53790350 https://blog.csdn.net/liuxiao723846/article/details/52126936 依赖 123456789101112<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.13.3</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupI...
疑难汉字
字 读音 含义 刳 kū 从中间破开;破开后再挖空。 「刳竹」 剡 yǎn 削;削尖 [sharpen]
scoop 安装
首先要有一个 Powershell 3.0 与 .Net 4.5 以上的环境。 在 PowerShell 中输入: 1iex (new-object net.webclient).downloadstring('https://get.scoop.sh') 如果没有网络问题,则可以直接安装成功(可能需要修改一些与 admin 有关的 policy)。如果安装不成功,则删除C:\Users\LC\scoop再试一次。 12# 安装 curlscoop install curl
MySQL 中的引号
标准的 SQL 中只允许用单引号表达字符串类型。有些 SQL 方言允许使用双引号包裹字符串,如 MySQL,有些则不允许,如 Oracle。 反引号是专门用来表达 identifier 的。
MySQL 字符串和数字隐式转换的 pitfall
Data truncation: Truncated incorrect 不要小看 MySQL,它出 warning 就一定有错误。 不要滥用 MySQL 字符串到decimal,和 decimal 到 string 的转换。这样有时候 MySQL 不只是 warning。
散列算法
散列算法概述 散列函数(Hash Function)是一种将任意长度的输入数据映射为固定长度输出的函数,该输出称为散列值或哈希值。散列算法在计算机科学中具有广泛应用,尤其在密码学和数据完整性校验领域。 核心性质 一个优秀的散列函数应具备以下核心性质: 确定性:相同的输入始终产生相同的输出。这是散列函数的基本要求,确保了散列值的一致性和可验证性。 单向性:从散列值无法反向推导出原始输入。这一性质使散列函数适用于密码存储等场景,即使数据库泄露,攻击者也无法直接获取明文密码。 雪崩效应:输入数据的微小变化会导致输出散列值的剧烈变化。修改输入的任意一位,输出的散列值应有约50%的位发生变化。这一特性保证了散列值对输入的高度敏感性。 抗碰撞性:难以找到两个不同的输入产生相同的散列值。抗碰撞性分为弱抗碰撞性(给定输入,难以找到另一个输入产生相同散列值)和强抗碰撞性(难以找到任意两个不同输入产生相同散列值)。 常见散列算法家族 MD5 MD5(Message Digest Algorithm 5)输出128位散列值,曾广泛应用于文件校验和密码存储。然而,MD5已被证明存在严...
checklist
写代码 checklist 注意位置 注意顺序 注意初始化 注意返回值 注意注释 注意防御性编程 注意数据库性能 上线 checklist 代码变更 check 代码 配置变更 check 配置 系统变更注意上线顺序 依赖中间件变更注意配置中间件 配置中心配了吗 交互所有细节都实现了吗? 配监控和埋点 数据库变更了吗? 安全检查
JDWP 与远程调试
JDWP(Java Debug Wire Protocol),它提供了调试器和目标 JVM (target vm)之间的调试协议。 在 target vm 启动时,增加这个 JAVA_OPTS: 1JAVA_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=26310" 在服务器端,增加 remote debuging 的时候使用如下配置: 12345678# Java 9 以上-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000# Java 5-8-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000# Java 1.4.x -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,addre...
卡表和 RSet
卡表和 RSet 问题定义:为什么需要跨区域引用记录 JVM 垃圾收集器的核心工作之一是确定 live set——哪些对象仍然存活、不可回收。确定 live set 的标准做法是从 GC Roots(栈帧中的局部变量、静态字段等)出发,沿引用链遍历所有可达对象。 问题在于:当堆被划分为多个区域(代、Region)并且只回收其中一部分时,如何高效地找到从"不回收区域"指向"回收区域"的引用? 以 Young GC 为例:只回收新生代,但老年代中可能持有指向新生代对象的引用。如果不处理这些跨代引用,就会错误地回收仍被老年代引用的新生代对象。最朴素的做法是扫描整个老年代来找出这些引用——但老年代通常远大于新生代,这样做的代价过高,违背了分代收集"只回收一部分堆"的初衷。 卡表(Card Table)和 RSet(Remembered Set)正是为解决这个问题而设计的辅助数据结构。二者的关系并非互相替代,而是层次不同、协作互补:卡表是底层的脏标记机制,RSet 是建立在卡表之上的更高层索引结构。 核心概念速览 在深入细节之前,...















