Maven 全局配置文件settings.xml
xml 小知识 xmlns:xsi xmlns:即为别名 12345678910<settings <!-- xml 名字空间 -->xmlns="http://maven.apache.org/SETTINGS/1.0.0"<!-- 该文件语法说明 使用了XMLSchema-instance -->xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<!-- schema 的位置 -->xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0http://maven.apache.org/xsd/settings-1.0.0.xsd"<!-- 使用了一个 xsd -->> settings.xml 的功能 settings.xml 是maven的全局配置文件。而pom.xml文件是所在项目的局部配置。 Settings.xml中包含: 本地仓...
Spark SQL 原理
Spark SQL的发展历程 为了给熟悉的 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具,Hive 应运而生,他是当时唯一运行在 Hadoop 上的SQL-On-Hadoop 工具。 但是 MapReduce 计算过程中大量的中间磁盘落地过程消耗了大量的 I/O,降低的运行效率,为了提高 SQL 的执行效率,大量的 SQL-On-Hadoop工具开始产生,而 Shark 是其中一个表现较为突出的项目。 Shark是伯克利实验室 Spark 生态环境的组件之一,它主要修改了内存管理,物理计划和执行三个模块,值得它能运行在 Spark 的引擎上,从而提高 SQL 查询的效率。 但是随着 Spark 的发展,Shark 对 Hive 过多的依赖制约了 Spark 的设计理念和各个组件之间的相互继承,所以 Spark 团队停止了对 Shark 的开发,提出了 SparkSQL 项目。 因为摆脱了Hive 的过度依赖,Spark SQL在数据兼容性,性能优化和组件扩展等各个方面都得到了极大的方便和发展。 提出了 SparkSQL 项目之后,SQL On Spar...
gradle 总结
gradle.xmind 这里的 AIDL 是 Android Interface Definition Language 的意思。Dex 是 Dalvik executable format 的意思。 aapt2编译流程 基本概念 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 脚本里,都...
《枪炮、病菌和钢铁》札记
先发未必先到,关键性的因素可能在中后半段才起作用。 代差很可怕,代差带来的结果是压倒性的,难以逆转和抗拒的。 直接因素是什么,终极因素是什么?点在哪里,面是什么? 地久天长的力量:群体的理解是深刻的,但对更大的事物的理解是盲目的-更地久天长的东西往往更大,而更大的东西越需要接力赛式的理解。这就是得天独厚的意义。 天造地设的差异,往往影响非常深刻。有些东西的潜力很大,有些东西的潜力很小。有些东西的潜力易于发觉,因为盲区很小;而有些东西的潜力难于发觉,需要更长的时间来观察-如果这一过程没有被外来的其他力量所中断的话。 两拨农民,都是文盲。一拨农民的祖先长期和从驯化动物得来的病菌作斗争,带有免疫力和另一拨农民作者,对另一拨农民是灭顶之灾-欧洲的拓殖者就是这样消灭美洲的原住民的,这样的军队才是最可怕的。从这个角度来看,被保护得很好的群体,未必能够在历史长河中获胜,因为他们不知道竞争力差异也许来自一个意想不到的维度。 安娜卡列尼娜法则:关注导致失败的因素更重要,导致失败的因素比想象中多。 熊不可养太大,养到一岁就就可以小心为妙了-俄罗斯人恐怕不同意。 纬度对生物的影响,比经度要大,从最南...
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";}@MyAnnot...
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) 如果需要断言...