gradle 总结
gradle.xmind 这里的 AIDL 是 Android Interface Definition Language 的意思。Dex 是 Dalvik executable format 的意思。 基本概念 gradle 是一个自动化构建工具(build automation,而不是像 maven 一样标榜自己是个 project management 工具),通过组织一系列 task 来最终完成自动化构建,所以 task 是 gradle 里最重要的概念之一, 以打包生成 apk 为例,整个过程要经过资源的处理,javac 编译,dex 打包,apk 打包,签名等等步骤,每个步骤就对应到 gradle 里的一个 task。因为这些 task 是 gradle 的生命周期里特有的,所以 gradle 的插件应该不能移植到其他构建工具里- maven 和 gradle 的插件不互通。 gradle 是事实上的 android/Kotlin 默认构建工具,虽然基于 JVM,但是可以用来构建其他语言。 每一个插件新增在 gradle 脚本里,都会带来新的 tasks。...
《枪炮、病菌和钢铁》札记
先发未必先到,关键性的因素可能在中后半段才起作用。 代差很可怕,代差带来的结果是压倒性的,难以逆转和抗拒的。 直接因素是什么,终极因素是什么?点在哪里,面是什么? 地久天长的力量:群体的理解是深刻的,但对更大的事物的理解是盲目的-更地久天长的东西往往更大,而更大的东西越需要接力赛式的理解。这就是得天独厚的意义。 天造地设的差异,往往影响非常深刻。有些东西的潜力很大,有些东西的潜力很小。有些东西的潜力易于发觉,因为盲区很小;而有些东西的潜力难于发觉,需要更长的时间来观察-如果这一过程没有被外来的其他力量所中断的话。 两拨农民,都是文盲。一拨农民的祖先长期和从驯化动物得来的病菌作斗争,带有免疫力和另一拨农民作者,对另一拨农民是灭顶之灾-欧洲的拓殖者就是这样消灭美洲的原住民的,这样的军队才是最可怕的。从这个角度来看,被保护得很好的群体,未必能够在历史长河中获胜,因为他们不知道竞争力差异也许来自一个意想不到的维度。 安娜卡列尼娜法则:关注导致失败的因素更重要,导致失败的因素比想象中多。 熊不可养太大,养到一岁就就可以小心为妙了-俄罗斯人恐怕不同意。 纬度对生物的影响,比经度要大,从最南...
Unix 常用命令
Unix 常用命令全景指南 本文系统梳理 Unix/Linux 环境下的高频命令,从命令行语法基础到生产环境实战,覆盖文件操作、文本处理、系统监控、开发工具四大场景。 目录 命令行基础 文件与目录操作 文本处理三剑客 系统与资源监控 开发环境工具链 磁盘扩容实战 命令行基础 命令行参数的三元素 Unix 命令行由三种基本元素组成:选项、位置参数和子命令。 基本结构 1command [options] [positional_arguments] 选项(Options) 以 - 或 -- 开头的参数,用于修改命令行为: 类型 格式 示例 短选项 - + 单个字母 -a, -v, -h 长选项 -- + 单词 --help, --verbose 带参数的选项 -n value 或 --name=value -n namespace, --port=8080 短选项支持合并书写:ls -la 等价于 ls -l -a。 位置参数(Positional Arguments) 不带连字符的参数,其含义由出现的位置决定: 123cp source_file...
Spring AOP 笔记
AOP 全景概览 核心问题定义 面向切面编程(Aspect-Oriented Programming,AOP)的核心目标是将横切关注点(Cross-cutting Concerns)从业务逻辑中分离出来。横切关注点是指那些散布在系统多个模块中的通用功能,如日志记录、事务管理、安全检查、性能监控等。在传统的面向对象编程中,这些功能往往需要在多个类中重复实现,导致代码冗余和耦合度增加。AOP 通过将这些横切关注点模块化为切面(Aspect),在不修改原有业务逻辑代码的情况下,实现对目标对象的增强。 核心概念速查表 概念 定义 Aspect 切面,横跨多个类的模块化关注点,通常由多个 Pointcut 和 Advice 组成 JoinPoint 连接点,程序执行过程中的特定位置,在 Spring AOP 中通常指方法执行点 Pointcut 切点,匹配 JoinPoint 的谓词表达式,定义 Advice 在何处执行 Advice 通知,切面在特定 JoinPoint 执行的动作,包括 Before、After、Around、AfterReturning、Af...
ThreadLocal 的设计模式
ThreadLocal 是 Java 并发编程中实现**线程封闭(Thread Confinement)**的核心工具。本文将从原理到实践,系统性地讲解 ThreadLocal 的设计哲学、内部机制、使用模式以及跨线程传递方案。 原理篇:ThreadLocal 的内部机制 核心设计理念:为什么不用 Map<Thread, Value>? 很多人初次设计线程本地存储时,会想到用一个全局的 Map<Thread, Value> 来存储每个线程的数据。但这种设计有致命缺陷:Thread 对象会被 Map 强引用,导致线程无法被 JVM 回收,造成严重的内存泄漏。 ThreadLocal 采用了相反的设计:让 Thread 持有 Map,而不是让 Map 持有 Thread。每个 Thread 内部都有一个 ThreadLocalMap,用于存储该线程的所有线程本地变量。这样设计的好处是: 线程销毁时,ThreadLocalMap 随之销毁,数据自动清理 ThreadLocal 对象可以被显式管理(如声明为静态变量) 线程内部的存储容器是隐式的,由线程自己管理 ...
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) 如果需要断言值不为空,使用这个构...
缓存的套路
缓存的套路 本文探讨缓存设计的通用模式,涵盖从选型决策、更新策略到故障防护的完整体系。 mindmap root((缓存架构)) 何时使用 读多写少 热点集中 可容忍最终一致性 缓存层次 近端缓存 Guava Caffeine EhCache 远端缓存 Redis Memcached 核心挑战 更新策略 Cache Aside Read Through Write Through Write Behind 一致性保障 故障防护 击穿防护 雪崩防护 穿透防护 模式总览 # 模式名称 一句话口诀 适用场景 1 分层降级 本地兜底,远程扩展 多级缓存架构 2 惰性填充 触发加载,按需扩容 冷启动与预热 3 旁路同步 先库后删,读写互斥 Cache Asi...
5why分析法
所谓5why分析法,又称“5问法”,也就是对一个问题点连续以5个“为什么”来自问,以追究其根本原因。 虽为5个为什么,但使用时不限定只做“5次为什么的探讨”,主要是必须找到根本原因为止,有时可能只要3次,有时也许要10次,如古话所言:打破砂锅问到底。 5why法的关键所在:鼓励解决问题的人要努力避开主观或自负的假设和逻辑陷阱,从结果着手,沿着因果关系链条,顺藤摸瓜,直至找出原有问题的根本原因。 介绍 这种方法最初是由丰田佐吉提出。后来,丰田汽车公司在发展完善其制造方法学的过程之中,也采用了这一方法。 作为丰田生产系统(Toyota Production System)的入门课程的组成部分,这种方法成为其中问题求解培训的一项关键内容。丰田生产系统的设计师大野耐一曾经将五问法描述为:“……丰田科学方法的基础……重复五次,问题的本质及其解决办法随即显而易见。” 目前,该方法在丰田之外已经得到了广泛采用,并且现在持续改善法(Kaizen),精益生产法(lean manufacturing)以及六西格玛法之中也得到了采用。 关键点 5why的”5“并不是问题的数量 5why的”5“指...















