Docker Compose
Docker Compose
Compose是一个用于管理多容器的工具,仅用一个yaml文件,一条指令即可创建,开启,停止所有的服务
Docker Compose 文件语法
Compose 文件是一个yaml格式的文件。文件内容包含version,services,networks,volumns,configs,secrets
yaml多行缩进
一种描述数据的标记语言,类似于xml,json等。
数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:
123456789101112131415house: family: name: Doe parents: - John - Jane children: - Paul - Mark - Simone address: number: 34 street: Main Street city: Nowheretown zipc ...
SSH基础
SSH证书通过ssh-keygen生成证书1ssh-keygen -t rsa -b 4096
note:
-t 表述加密方式(dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa)
-b表示输出的密钥的长度
接着会弹出对话框
Enter file in which to save the key (/root/.ssh/id_rsa): ssh-test (输入key文件的名称)
密码(这里不设置)
Enter passphrase (empty for no passphrase):Enter same passphrase again:
当前路径即刻生成了rsa的公钥以及私钥
total 8.0K-rw——- 1 root root 3.4K Feb 3 19:05 ssh-test-rw-r–r– 1 root root 741 Feb 3 19:05 ssh-test.pub
配置ssh1vim ~/.ssh/config
1234Host 别名 HostName ...
CA证书那点事
CA证书
CA证书是https必不可少的东西,它包含了非对称加密的公钥信息,以及证书持有方的基本信息,以及颁发机构的信息。主要还是为了保证公钥的权威性,确保公钥的来源是可信的。
证书类型
der: .DER = DER扩展用于二进制DER编码证书。这些文件也可能承载CER或CRT扩展。
pem:使⽤Base64 ASCII进⾏编码的纯⽂本格式,是以“ - BEGIN …”前缀的ASCII(Base64)数据。
key:.KEY 扩展名用于公钥和私钥,常见使用于私钥。也可以被编码为二进制DER或ASCII PEM。
crs:证书签名请求。CSR文件是申请SSL证书时所需要的一个数据文件。
crt:CRT扩展用于证书。 证书可以被编码为二进制DER或ASCII PEM。 CER和CRT扩展几乎是同义词。 最常见的于Unix 或类Unix系统。通俗来讲,.CRT文件常在Linux系统使用,包含公钥和主体信息。
crt:.CRT的替代形式,您可以在微软系统环境下将.CRT转换为.CER(.both DER编码的.CER,或base64 [PEM]编码的.cer)。通俗来讲,就是.C ...
Java之并发安全
线程安全线程安全问题
即多线程并发出现稀奇古怪无法理解的问题。
如何解决线程安全问题?
只要并发满足如下性质即可
可见性
即一个线程对一个变量修改后其余所有线程能立即知晓这个变量被修改了。
这句描述可能很奇怪?难道我一个线程修改了一个变量,其他线程难道还不知道吗?
不妨运行一下这个代码。
12345678910111213141516public class Visibility { static boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(()->{ while (flag); }).start(); Thread.sleep(1000); flag = false; }}
如果真的满足可见性,那么程序就立即退出了。如果不满足,那么程序就会一直运行下去。
运行结 ...
Kotlin反射
reflection
reflection又叫反射,Kotlin reflection不是对java反射的重写,因为java反射逻辑实现依靠jvm实现的,重写就意味着摒弃.
kotlin reflection是对于java反射的扩展
为什么需要扩展因为kotlin运行在jvm虚拟机上,kotlin真正独特的是它的编译器,它的海量的的语法特性都是通过编译器来提供支持的。
正是由于又有了这些语法特性使得kotlin成为了一门独特的语言,有很多地方他和java是类似的,但是又有很多地方是不相同的.
而jvm并不认识kotlin,对于kotlin的一些如data class,suspend,inline,sealed class显然是不能识别的,但是如果需要对这些类型进行特定的处理,那…显然是困难的
所以就有了kotlin reflection对于java反射的增强
如何引入kotlin reflectionkotlin reflection的支持需要引入一个依赖
123dependencies { implementation("org.jetbrains.k ...
Kotlin ::操作符
::操作符::操作符可以干嘛?或者说是用来干什么的?
它是用于指向一个已经定义的函数或者属性的.
引用函数::可引用的函数分为两类
top-level即顶层函数
成员函数
顶层函数12345678fun main() { val function = ::function function.invoke()}fun function() {}
产物这一看不知道的还以为是lambda(你说他是lambda也没啥问题)
实现原理首先还得是反编译啊
还是看字节码吧
123456789101112131415public final static main()V L0 #获取静态变量TestKt$main$function$1.INSTANCE GETSTATIC TestKt$main$function$1.INSTANCE : LTestKt$main$function$1; ASTORE 0 L1 ALOAD 0 #强转为kotlin的lambda类型接口 CHECKCAST kot ...
Kotlin高阶函数
高阶函数什么是高阶函数,所谓高阶函数。在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
接受一个或多个函数作为输入
输出一个函数
kotlin语言需要在jvm上运行(但不是只能),而java是不支持高阶函数的,java没有高阶函数,只有方法.
kotlin在jvm上运行又是怎么实现的呢?
看下字节码不就会了
12345678fun function(block: (Int) -> Unit) { block(1)}fun main() { function { }}
123456789101112131415161718192021222324252627282930313233343536373839# 高阶函数最后被编译成了一个类也即是Fuction类# FunctionN表示输入参数的个数Function1表示输入参数为1个的函数类型.public final static function(Lkotlin/jvm/functions/Function1;)V # checkNo ...
Kotlin内联
inline我们都知道内联表示的是代码内联这个内联指的就是将代码直接抄过来
即将在调用处把代码copy过去
怎么看?
12345678910inline fun call(block: () -> Unit) { println("==I am Call ==") block()}fun testInline() { call { println("Hello World") }}
123456789101112131415161718192021222324252627282930313233343536373839404142public final static testInline()V L0 LINENUMBER 16 L0 L1 ICONST_0 ISTORE 0 L2 LINENUMBER 34 L2 LDC "==I am Call ==" !!!!!!!!!!!! ...
Kotlin泛型
泛型
泛型又叫参数化类型,可以理解是一种类型参数(一种表征类型的参数类型)
泛型主要起到的是规范作用,其行为主要是在编译期报错来避免一些潜在的类型安全问题
kotlin泛型按种类可分为以下3类
函数泛型
类泛型
接口泛型
真泛型类型reified
函数泛型作为函数参数传入123fun <T> get(t: T) { println(t.toString())}
字节码如下
1234567891011121314151617181920212223public final static get(Ljava/lang/Object;)V #这也就是著名的类型擦除,泛型类型最后会被会被编译成Object而没有真正生成具体的类 // annotable parameter count: 1 (visible) // annotable parameter count: 1 (invisible) L0 LINENUMBER 8 L0 #源代码行号 ALOAD 0 #局部变量表0位置的引用 ...
Kotlin延迟初始化
lateinit实现原理
lateinit就变量定义上于普通变量一致
lateinit是将变量的初始化延后,也就是说可以不立即对变量进行初始化,他具体的实现是通过对方法的get以及调用处进行值类型的判空处理
123456789101112fun main() { val test = Test() test.cur}class Test { lateinit var cur: String fun printCur() { println(cur) }}
就事论事分析main函数
1234567891011121314L0 LINENUMBER 8 L0 #源代码行号标记 NEW Test #new Test类的实例压入操作数栈 DUP #复制栈顶元素,方便后续invoke消耗 INVOKESPECIAL Test.<init> ()V #弹栈顶元素,初始化对象 ASTORE 0 ...