Unix 常用命令
一般场景 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061# 分屏显示ls|morecat file|more# 制造符号链接ln -s from created# 删除 gradlebrew rm gradle# 寻找 Formulaebrew search gradle# 查看 gradle 最新的信息brew info gradle# 安装 sdkmancurl -s "https://get.sdkman.io" | bash# 搜索 gradlesdk list gradle# 安装特定版本sdk install gradle 5.2# 查看磁盘空间(diskfree)df -lh /usr/local# 强烈推荐直接使用这个命令df -lh ./# 查看已使用空间(diskused)du -h /usrdu -h ./# 压缩一个目录tar -zcvf archive_na...
Spring AOP 笔记
AOP 的基本概念 Aspect: A modularization of a concern that cuts across multiple classes. 方面,横跨多个类的模块化关注点。如果只是简单地横跨多个类,可以考虑使用继承 + 组合 + 设计模式。如果使用某种模式匹配来横跨多个类,才需要考虑使用 Aspect。 Join point: A point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution. 结合点是我们最需要关注的东西,既包括了方法执行过程,也包含了异常处理过程。 Advice: Action taken by an aspect at a particular join point. 方面针对结合点采取的行动。对 Advice 而言,join point 经常是他们的参...
ThreadLocal 的设计模式
基础版本 123456789101112131415161718192021222324252627282930313233// 定义基础的 Context 类型public class ServerContext {}// 为这个基础类型装载一个 threadlocal 容器,然后为这个容器准备一个静态工具类public class Context { // 这个容器如果是泛型的(如存储 dapper 的 trace 或者 span),可以考虑用 T 或者用 Object。 private static final ThreadLocal<Object> SERVER_CONTEXT = new ThreadLocal<Object>(); public static Object getServerContext() { return SERVER_CONTEXT.get(); } public static void setServerContext(Obj...
Java 注解和配置
Java 的原生注解 meta annotation @Inherited @Inherited 是一个元注解(annotations applied to other annotations 注解其他注解的注解),也是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。 **@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。**其查找过程是:反射 API 会在查找 @Inherited 标注的注解的时候,自底向上往继承树上方查找。 12345678910111213141516171819202122@Inherited@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface MyAnnotation { String value() default "Default Value";}@MyA...
Mac 使用技巧
修复文件不能打开的问题 《应用程序不能打开?一条命令就搞定!》 显示隐藏文件 在 macOS Sierra,我们可以使用快捷键: command + shift + . 来快速(在 Finder 中)显示和隐藏隐藏文件。 Mac 出现正在运行安装包脚本或等待其他安装完成的解决办法 Mac 出现正在运行安装包脚本或等待其他安装完成的解决办法 打开 Mac 触控板的三指拖移功能 打开 Mac 触控板的三指拖移功能 macOS 修改 Hosts macOS 修改 Hosts 显示隐藏文件夹 Mac系统如何显示隐藏文件? Command+Shift+. 可以显示隐藏文件、文件夹,再按一次,恢复隐藏; 1234# showdefaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder# hidedefaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder 如何清洁苹果产品 如何清洁 App...
Optional 的正确用法
Optional 的不正确实践 首先,不要直接拿来做if-else的判定条件,这肯定是错的: 123456Optional<User> user = ...... if (user.isPresent()) { return user.getOrders();} else { return Collections.emptyList();} 而且get()要配合isPresent()才安全。 其次,尽量不要用 Optional 拿来做成员变量,特别是 pojo 的成员变量,这很容易让读 pojo 的框架出问题。 再次,不要拿来做方法参数,因为很可能写成 if (user.isPresent()) {}式的代码。 最后,Optional 的关注点在它的 value 的后续处理身上,如果这个 value 只是一个 flag,还是要乖乖地用if-else;如果这个 value 被用在多路返回里,也不能使用 Optional。 正确的用法 选对构造器 Optional.of(T value) 如果需要断言...
缓存的套路
什么时候应该使用缓存? 所有高耗时,需要吞吐量,而不太严格依赖强一致性的场景-不管是计算密集型还是 io 密集型,都可以使用缓存加速。 多级缓存问题 大多数情况下不要使用多级缓存。 多级缓存要严格设计差异化的冷热数据分离策略,还要考虑分布式的缓存失效+更新的问题,很复杂。 勉强可用的多级缓存应该是远端一级缓存,近端二级缓存。 本地多级缓存非常容易出一致性问题-慎用 MyBatis 和 Hibernate 的二级缓存。 外部缓存设计思路 外部缓存通常指的是分布式缓存组件或者中间件。 内文直接参考《缓存更新的套路》 缓存更新的设计模式.xmind Redis 内部缓存的用法 内部缓存通常指的是进程内缓存,in-memory-cache。 Spring Cache 依靠一个 CacheManager SPI 机制,来跟不同的 cache 实现打交道。大多数时候我们应该用 CacheManager 封装好的 wrapper api 来跟缓存打交道,极少数情况下我们应该 getNativeCache 来使用专有 API。 Guava Cache 就是给 ConcurrentHashMa...
5why分析法
所谓5why分析法,又称“5问法”,也就是对一个问题点连续以5个“为什么”来自问,以追究其根本原因。 虽为5个为什么,但使用时不限定只做“5次为什么的探讨”,主要是必须找到根本原因为止,有时可能只要3次,有时也许要10次,如古话所言:打破砂锅问到底。 5why法的关键所在:鼓励解决问题的人要努力避开主观或自负的假设和逻辑陷阱,从结果着手,沿着因果关系链条,顺藤摸瓜,直至找出原有问题的根本原因。 介绍 这种方法最初是由丰田佐吉提出。后来,丰田汽车公司在发展完善其制造方法学的过程之中,也采用了这一方法。 作为丰田生产系统(Toyota Production System)的入门课程的组成部分,这种方法成为其中问题求解培训的一项关键内容。丰田生产系统的设计师大野耐一曾经将五问法描述为:“……丰田科学方法的基础……重复五次,问题的本质及其解决办法随即显而易见。” 目前,该方法在丰田之外已经得到了广泛采用,并且现在持续改善法(Kaizen),精益生产法(lean manufacturing)以及六西格玛法之中也得到了采用。 关键点 5why的”5“并不是问题的数量 5why的”5“指...
认证要素
个人二要素 个人银行卡三要素 个人银行卡四要素 个人运营商三要素 企业二要素 企业三要素 企业四要素 企业验卡二要素
Java Logging
log 历史 阶段 阶段 阶段 阶段 阶段 log4j apache commons logging(JCL) log4j2 JUL simple log logback + slf4j 多个项目使用不同的 logging 库 + 传递依赖等于依赖管理不规范,日志库泛滥以至互斥。 具体框架与门面 所谓的日志框架,指的是日志输出的具体实现,常见的日志框架包括但不仅限于 JUL(Java Util Logging)、Log4j、Log4j2 和 Logback。这些框架的功能不尽相同,比如有些框架支持友好地打印异常,有些不支持,有些框架不支持,不同的框架的日志级别也各有差异。 因此,诞生了日志门面。所谓的门面,就是“使用一个中间层解耦”这一具体思想的应用。使用了门面,可以屏蔽日志使用者对于具体差异的依赖,既让代码变得整洁,而且可以简单地切换实现而不需要修改代码。没有日志门面,不足以统一日志框架的使用。 log facade(定义 interface,早期的 JCL 时代,facade 也被叫做接口)-> log imp...