搭建NginxHttps本地测试环境
利用nginx搭建一个https本地可用的域名 环境利用到的工具: mkcert—本地生成浏览器信任的本地 https 证书 Nginx Docker(可选) 本篇教程利用的是docker nginx,安装版也一样的,差不多。 本地环境: 123本机:Arch Linux x86_64 5.2.2-arch1-1-ARCHDocker: Docker version 18.09.8-ce, build 0dd43dd87fNginx:stable-alpine 安装mkcert其他系统的安装方法可以看github上面的介绍,本次按照的是Arch系统的安装方法。 12sudo pacman -S nssyay -S mkcert 生成证书 生成CA(certificate authority,即证书颁发机构),运行下面的命令可以在~/.local/share/mkcert/生成rootCA.pem和rootCA-key.pema两个文件,这个命令只需运行一次,因为生成的CA可以反复使用; 使用mkcert -install命令即可 创建自签名证书,例如要为域名:h...
Java多线程拾遗--start与run--Thread与Runnable
尝试从源码分析start与run的区别,Thread与Runnable的区别 start与run先来看两个程序 12345678910111213141516171819202122232425262728package indi.greenhat.thread;/** * @description: runable与start的区别 * @author: GreenHatHG * @create: 2019-07-23 09:02 **/public class Thread1 { private static void attack(){ System.out.println("attack"); System.out.println("Current Thread is: " + Thread.currentThread().getName()); } public static void main(String[] args) { ...
dfs序
树的dfs dfs序 这棵树的 DFS 序列就是 C 1 A E 7 H B 8 3 4 F 5 6 9 I G 2 D(按照左优先) 定义子树 x表示结点x及其所有的子孙结点,该序列有一个很重要的性质:每棵子树x在 DFS 序列中一定是连续的一段,结点x一定在这段的开头 1234567891011C 1[A E 7 H B 8 3 4 F]5 6 9 I G 2 D 子树AC 1 A[E 7 H B]8 3 4 F 5 6 9 I G 2 D 子树EC 1 A E 7 H B 8 3 4 F[5 6 9 I G 2 D] 子树5C 1 A E 7 H B 8 3 4 F 5[6 9]I G 2 D 子树6 这使得在子树上进行的修改、查询可以转化为区间修改、区间查询。结合树状数组 or 线段树食用均可 所以dfs序的作用是 相当于把树上的问题转化成了序列上的问题 辅以各种数据结构进行计算 比如ST表、树状数组、线段树 子树求和->区间求和 模板1...
Java虚拟机笔记--垃圾回收
垃圾回收算法与 JVM 垃圾回收器 一览 对象被判定为垃圾的标准GC主要是回收Java堆中的对象,即此对象已经没有了价值,就是变成了“垃圾”,那么对象被判定为垃圾的标准是什么呢?——没有被其他对象引用。 判定对象是否为垃圾的算法引用计数算法主要是判断对象的引用数量 通过判断对象的引用数量来决定对象是否可以被回收 每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1 任何引用计数为0的对象实例都可以被当作垃圾收集 下面就是对一个引用计数的举例: 引用计数法有一个致命的缺陷,如下图,就是当两个对象相互引用时,这两个对象实际是不可获得的,但是由于引用计数不为零,所以均不会被回收。 优点:执行效率高,程序被影响小缺点:无法解决循环引用问题 导致内存泄漏,所以在 Java 的垃圾回收器中没有使用这种算法 可达性分析法通过判断对象的引用链遍历(从GC Root开始)是否可达来决定对象是否可以被回收。 如下图,从GC Root不能到达ObjD,ObjF ,ObjE,所以这三个对象是不可用的。 可作为GC Root的对象: 虚拟机栈中引用的对象(栈帧中的本地变量表) 方法区...
主席树
主席树又名可持久化线段树 简介传统意义上的主席树就是可持久化线段树,什么叫可持久化呢?就是这棵树啊,可以记录每一次修改的内容,换句话说,就是可以访问这棵树的历史记录。 常见应用 区间/树上路径第 K 大 区间不同数的个数 很多问题如果用线段树处理的话需要采用离线思想,若用主席树则可直接在线处理。故很多时候离线线段树求解可以转化为在线主席树求解。 注意,主席树本质就是线段树,变化就在其实现可持久化,后一刻可以参考前一刻的状态,二者共同部分很多。一颗线段树的节点维护的是当前节点对应区间的信息,倘若每次区间都不一样,就会给处理带来一些困难。有时可以直接细分区间然后合并,此种情况线段树可以直接搞定;但有时无法通过直接划分区间来求解,如频繁询问区间第k小元素,当然,此问题有比较特殊的数据结构-划分树。其实还有一个叫做归并树,是根据归并排序实现的,每个节点保存的是该区间归并排序后的序列,因此,时间、空间复杂度都及其高, 所以一般不推荐去用。当然,主席树也是可以解决的。 结构由若干棵线段树组成(若是权值线段树通常需先对数据离散化),按照输入顺序,每插入一个数保存一份当前版本的线段树。也就是...
SQL中的EXISTS
SQL中的EXISTS与SQL中的NOT EXISTS 从SQL中基础的WHERE字句开始有一学生信息表 1SELECT Sno, Sname FROM Student WHERE Sdept = 'IS'; 很显然,在执行这条 SQL语句的时候,DBMS会扫描 Student表中的每一条记录,然后把符合 Sdept = 'IS'这个条件的所有记录筛选出来,并放到结果集里面去。也就是说 WHERE关键字的作用就是判断后面的逻辑表达式的值是否为 True。如果为 True,则将当前这条记录(经过SELECT关键字处理后)放到结果集里面去,如果逻辑表达式的值为 False则不放。 使用EXISTS关键字123SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = '1'); 这条SQL语句的作用,就是查找所有选修了 1 号课程的课程的学生,并显示他们的姓名。 我们先不管EXISTS关键字在其中...
Java虚拟机笔记-字节码文件中的常量池
常量池(Constant Pool) 常量池(Constant Pool)12345678910111213package indi.greenhat.bytecode;public class Test1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; }} 123456789101112131415161718192021222324Constant pool: #1 = Methodref #4.#20 // java/lang/Object."<init>":()V #2 = Fieldref #3.#21 // indi/greenhat/bytecode/Test1.a:I #3 = Class ...
莫队算法
莫队算法 简述莫队算法使用分块的思想,可以解决一类离线区间询问问题 莫队算法(mo's algorithm)一般分为两类,一是莫队维护区间答案,二是维护区间内的数据结构。当然也有树上莫队,带修改莫队、二维莫队等等 普通莫队莫队的精髓就在于,离线得到了一堆需要处理的区间后,合理的安排这些区间计算的次序以得到一个较优的复杂度。 我们考虑一个问题,给一个序列,m次询问,每次询问你区间$[l,r]$有多少种不同的颜色。 $n,m\leq 100000n,m≤100000$ 先考虑暴力,对每次询问遍历一遍 $[l,r]$,这样是$O(nm)$的 换种方式暴力,定义ql和qr,表示区间 $[ql,qr]$内有多少颜色,再定义cnt数组, 表示第i种颜色在区间 $[ql,qr]$出现了多少次。那么现在的情况就是已经 $[ql,qr]$的答案,需要我们去转移求$[l,r]$区间的答案 因为这个是莫队算法的基础,所以模拟一下这个过程: 我们的初始在这个状态,假设蓝色为1,红色为2,绿色为3,区间$[ql,qr]$有 那么$cnt_1=3, cnt_2=3, cnt_3=1$,然后我们...
Java虚拟机笔记-字节码格式
.class文件 Java从刚开始的时候就有两套 规范,一个是Java语言规范,另外一个是Java虚拟机规范,Java语言规范只是规定了Java语言相关的约束以及规则,而虚拟机规范则才是真正从跨平台的角度去设计的 Java语言的平台无关性在虚拟机出现之前,程序要想正确运行在计算机上,首先要将代码编译成二进制本地机器码,而这个过程是和电脑的操作系统OS、CPU指令集强相关的,所以可能代码只能在某种特定的平台下运行,而换一个平台或操作系统就无法正确运行了。随着虚拟机的出现,直接将程序编译成机器码,已经不再是唯一的选择了。越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。Java就是这样一种语言。“一次编写,到处运行”于是成立Java的宣传口号。 正是虚拟机和字节码(ByteCode)构成了平台无关性的基石,从而实现“一次编写,到处运行” Java虚拟机将.java文件编译成字节码,而.class字节码文件经过JVM转化为当前平台下的机器码后再进行程序执行。这样,程序猿就无需重复编写代码来适应不同平台了,而是一套代码处处运行,至于字节码怎...
Java虚拟机笔记-JDBC驱动加载机制
通过JDBC驱动加载理解线程上下文加载器 JDBCJDBC提供了独立于数据库的统一API,MySQL,Oracle等数据库公司都可以基于这个标准接口来进行开发。包括java .sql包下的Driver,Connection,Statement,ResultSet是JDBC提供的接口。而DriverManager是用于管理JDBC驱动的服务类,主要用于获取Connection对象(此类中全是静态方法) 下面是一个简单的jdbc连接数据库过程。重点不在能不能连接,而是其加载过程。 12345678910111213package Test;import java.sql.Connection;import java.sql.DriverManager;public class Test { public static void main(String[] args) throws Exception { Class.forName("com.mysql.cj.jdbc.Driver"); String ur...