From f04af8ccf0775d36a27ac2f150bbca3eab896039 Mon Sep 17 00:00:00 2001 From: kwongtai Date: Fri, 13 Apr 2018 18:55:05 +0800 Subject: [PATCH 01/28] fix mispell, strongest compulsively --- notes/数据库系统原理.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 6ebc72a8..3554533a 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -227,13 +227,13 @@ MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 事务遵循两段锁协议是保证并发操作可串行化调度的充分条件。例如以下操作满足两段锁协议,它是可串行化调度。 ```html -lock-x(A)...lock-s(B)...lock-s(c)...unlock(A)...unlock(C)...unlock(B) +lock-x(A)...lock-s(B)...lock-s(C)...unlock(A)...unlock(C)...unlock(B) ``` 但不是必要条件,例如以下操作不满足两段锁协议,但是它还是可串行化调度。 ```html -lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(c)...unlock(C)... +lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(C)...unlock(C)... ``` # 四、隔离级别 @@ -331,7 +331,7 @@ select * from table ....; select * from table where ? lock in share mode; select * from table where ? for update; insert; -update ; +update; delete; ``` From 7f6fefe08255ec4a78cd10d0354969e645782470 Mon Sep 17 00:00:00 2001 From: kwongtai Date: Fri, 13 Apr 2018 20:05:07 +0800 Subject: [PATCH 02/28] fix mispell --- notes/SQL.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/notes/SQL.md b/notes/SQL.md index d582dca2..a87cdd7f 100644 --- a/notes/SQL.md +++ b/notes/SQL.md @@ -251,7 +251,7 @@ FROM mytable | LOWER() UPPER() | 转换为小写或者大写 | | LTRIM() RTIM() | 去除左边或者右边的空格 | | LENGTH() | 长度 | -| SUNDEX() | 转换为语音值 | +| SOUNDEX() | 转换为语音值 | 其中, **SOUNDEX()** 是将一个字符串转换为描述其语音表示的字母数字模式的算法,它是根据发音而不是字母比较。 @@ -347,7 +347,7 @@ GROUP BY col ORDER BY num; ``` -WHERE 过滤行,HAVING 过滤分组。行过滤应当先与分组过滤; +WHERE 过滤行,HAVING 过滤分组。行过滤应当先于分组过滤; ```sql SELECT col, COUNT(*) AS num @@ -464,7 +464,7 @@ from employee natural join department; ```sql select Customers.cust_id, Orders.order_num from Customers left outer join Orders -on Customers.cust_id = Orders.curt_id; +on Customers.cust_id = Orders.cust_id; ``` 如果需要统计顾客的订单数,使用聚集函数。 @@ -473,7 +473,7 @@ on Customers.cust_id = Orders.curt_id; select Customers.cust_id, COUNT(Orders.order_num) as num_ord from Customers left outer join Orders -on Customers.cust_id = Orders.curt_id +on Customers.cust_id = Orders.cust_id group by Customers.cust_id; ``` From 95cb69fadd55bfe10124357efdf4f70536537238 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 14 Apr 2018 15:10:47 +0800 Subject: [PATCH 03/28] auto commit --- notes/HTTP.md | 10 ++-- notes/Linux.md | 51 ++++++++++++++---- notes/正则表达式.md | 26 ++++----- pics/600e9c75-5033-4dad-ae2b-930957db638e.png | Bin 0 -> 12288 bytes 4 files changed, 63 insertions(+), 24 deletions(-) create mode 100644 pics/600e9c75-5033-4dad-ae2b-930957db638e.png diff --git a/notes/HTTP.md b/notes/HTTP.md index 7238542e..97f361c9 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -507,7 +507,7 @@ HTTP/1.1 使用虚拟主机技术,使得一台服务器拥有多个域名, ### 3. 隧道 -使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。隧道本身不去解析 HTTP 请求。 +使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。 # 六、HTTPs @@ -810,9 +810,11 @@ DELETE /idX/delete HTTP/1.1 -> Returns 404 ## HTTP/1.1 与 HTTP/2.0 的区别 +> [HTTP/2 简介](https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn) + ### 1. 多路复用 -HTTP/2.0 使用多路复用技术,使用同一个 TCP 连接来处理多个请求。 +HTTP/2.0 使用多路复用技术,同一个 TCP 连接可以处理多个请求。 ### 2. 首部压缩 @@ -820,7 +822,7 @@ HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 ### 3. 服务端推送 -在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。 +HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。 ### 4. 二进制格式 @@ -848,3 +850,5 @@ HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。 - [XMLHttpRequest](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest) - [XMLHttpRequest (XHR) Uses Multiple Packets for HTTP POST?](https://blog.josephscott.org/2009/08/27/xmlhttprequest-xhr-uses-multiple-packets-for-http-post/) - [Symmetric vs. Asymmetric Encryption – What are differences?](https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences) +- [Web 性能优化与 HTTP/2](https://www.kancloud.cn/digest/web-performance-http2) +- [HTTP/2 简介](https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn) diff --git a/notes/Linux.md b/notes/Linux.md index dbeddf16..6c38a0fb 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -50,8 +50,11 @@ * [九、进程管理](#九进程管理) * [查看进程](#查看进程) * [进程状态](#进程状态) - * [SIGCHILD](#sigchild) - * [孤儿进程和僵死进程](#孤儿进程和僵死进程) + * [SIGCHLD](#sigchld) + * [wait()](#wait) + * [waitpid()](#waitpid) + * [孤儿进程](#孤儿进程) + * [僵死进程](#僵死进程) * [十、I/O 复用](#十io-复用) * [概念理解](#概念理解) * [I/O 模型](#io-模型) @@ -1061,7 +1064,6 @@ daemon 2

- | 状态 | 说明 | | :---: | --- | | R | running or runnable (on run queue) | @@ -1070,26 +1072,56 @@ daemon 2 | Z | defunct/zombie, terminated but not reaped by its parent | | T | stopped, either by a job control signal or because it is being traced| -## SIGCHILD +## SIGCHLD 当一个子进程改变了它的状态时:停止运行,继续运行或者退出,有两件事会发生在父进程中: - 得到 SIGCHLD 信号; -- 阻塞的 waitpid(2)(或者 wait)调用会返回。 +- waitpid() 或者 wait() 调用会返回。

-## 孤儿进程和僵死进程 +其中子进程发送的 SIGCHLD 信号包含了子进程的信息,包含了进程 ID、进程状态、进程使用 CPU 的时间等。 -### 1. 孤儿进程 +在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息。父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。 + +## wait() + +```c +pid_t wait(int *status) +``` + +父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回。 + +如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 - 1,同时 errno 被置为 ECHILD。 + +参数 status 用来保存被收集进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,我们就可以设定这个参数为 NULL: + +```c +pid = wait(NULL); +``` + +## waitpid() + +```c +pid_t waitpid(pid_t pid,int *status,int options) +``` + +作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。 + +pid 参数指示一个子进程的 ID,表示只关心这个子进程的退出 SIGCHLD 信号。如果 pid=-1 时,那么贺 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。 + +options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。 + +## 孤儿进程 一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。 由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。 -### 2. 僵死进程 +## 僵死进程 -一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait 或 waitpid 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait 或 waitpid,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。 +一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。 僵死进程通过 ps 命令显示出来的状态为 Z。 @@ -1397,3 +1429,4 @@ poll 没有最大描述符数量的限制,如果平台支持应该采用 poll - [Linux 之守护进程、僵死进程与孤儿进程](http://liubigbin.github.io/2016/03/11/Linux-%E4%B9%8B%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E3%80%81%E5%83%B5%E6%AD%BB%E8%BF%9B%E7%A8%8B%E4%B8%8E%E5%AD%A4%E5%84%BF%E8%BF%9B%E7%A8%8B/) - [Linux process states](https://idea.popcount.org/2012-12-11-linux-process-states/) - [GUID Partition Table](https://en.wikipedia.org/wiki/GUID_Partition_Table) +- [详解 wait 和 waitpid 函数](https://blog.csdn.net/kevinhg/article/details/7001719) diff --git a/notes/正则表达式.md b/notes/正则表达式.md index bd38a392..1252be08 100644 --- a/notes/正则表达式.md +++ b/notes/正则表达式.md @@ -19,7 +19,7 @@ 正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或者软件。 -[正则表达式在线工具](http://tool.oschina.net/regex/) +[正则表达式在线工具](https://regexr.com/) # 二、匹配单个字符 @@ -164,7 +164,7 @@ a.+c ^ 元字符在字符集合中用作求非,在字符集合外用作匹配字符串的开头。 -使用 (?m) 来打开分行匹配模式,在该模式下,换行被当做字符串的边界。 +分行匹配模式(multiline)下,换行被当做字符串的边界。 **应用** @@ -173,10 +173,10 @@ a.+c **正则表达式** ``` -(?m)^\s*//.*$ +^\s*\/\/.*$ ``` -如果没用 (?m),则只会匹配 // 注释 1 以及之后的所有内容。用了分行匹配模式之后,换行符被当成是字符串分隔符,因此能正确匹配出两个注释内容。 +

**匹配结果** @@ -197,7 +197,7 @@ a.+c **正则表达式** ``` -(ab) {2,} +(ab){2,} ``` **匹配结果** @@ -222,21 +222,23 @@ a.+c 匹配 IP 地址。IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下情况是合法的: -1. 一位或者两位的数字 -2. 1 开头的三位数 -3. 2 开头,第 2 位是 0-4 的三位数 -4. 25 开头,第 3 位是 0-5 的三位数 +1. 一位数字 +2. 不以 0 开头的两位数字 +3. 1 开头的三位数 +4. 2 开头,第 2 位是 0-4 的三位数 +5. 25 开头,第 3 位是 0-5 的三位数 **正则表达式** ``` -(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.) {3}(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))) +(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))) ``` **匹配结果** 1. **192.168.0.1** -2. 555.555.555.555 +2. 00.00.00.00 +3. 555.555.555.555 # 八、回溯引用 @@ -251,7 +253,7 @@ a.+c \1 将回溯引用子表达式 (h[1-6]) 匹配的内容,也就是说必须和子表达式匹配的内容一致。 ``` -<(h[1-6])>\w*? +<(h[1-6])>\w*?<\/\1> ``` **匹配结果** diff --git a/pics/600e9c75-5033-4dad-ae2b-930957db638e.png b/pics/600e9c75-5033-4dad-ae2b-930957db638e.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0834d5386fbcb585abb4c22bc4490c460abef6 GIT binary patch literal 12288 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 literal 0 HcmV?d00001 From f8ca395296ccb2a2e5eeb494c2012d5ecce0191d Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 14 Apr 2018 15:17:17 +0800 Subject: [PATCH 04/28] auto commit --- notes/计算机网络.md | 2 +- pics/5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg | Bin 0 -> 58368 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 pics/5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg diff --git a/notes/计算机网络.md b/notes/计算机网络.md index 56623655..d775d73b 100644 --- a/notes/计算机网络.md +++ b/notes/计算机网络.md @@ -86,7 +86,7 @@ ## 电路交换与分组交换 -

+

(以上分别为:电路交换、报文交换以及分组交换) diff --git a/pics/5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg b/pics/5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8d0adf8ca024d6d3133b1cb62bd89eab64533a6 GIT binary patch literal 58368 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 w95hN$GuIH`@2l)Za<6HT&IyPx# literal 0 HcmV?d00001 From 8edbeacff79ab7e998659fa3d004130c5c30c0e0 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 14 Apr 2018 16:02:13 +0800 Subject: [PATCH 05/28] auto commit --- notes/设计模式.md | 20 +++++++++--------- pics/14cfe8d4-e31b-49e0-ac6a-6f4f7aa06ab6.png | Bin 0 -> 51200 bytes 2 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 pics/14cfe8d4-e31b-49e0-ac6a-6f4f7aa06ab6.png diff --git a/notes/设计模式.md b/notes/设计模式.md index b7e6c76a..93cdd0da 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -128,13 +128,13 @@ if (uniqueInstance == null) { uniqueInstance 采用 volatile 关键字修饰也是很有必要的。 -`uniqueInstance = new Singleton();` 这段代码其实是分为三步执行。 +uniqueInstance = new Singleton(); 这段代码其实是分为三步执行。 1. 分配内存空间。 2. 初始化对象。 3. 将 uniqueInstance 指向分配的内存地址。 -但是由于 JVM 具有指令重排的特性,有可能执行顺序变为了 `1>3>2`,这在单线程情况下自然是没有问题。但如果是多线程就有可能 B 线程获得是一个还没有被初始化的对象以致于程序出错。 +但是由于 JVM 具有指令重排的特性,有可能执行顺序变为了 1>3>2,这在单线程情况下自然是没有问题。但如果是多线程就有可能 B 线程获得是一个还没有被初始化的对象以致于程序出错。 所以使用 volatile 修饰的目的是禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。 @@ -178,17 +178,17 @@ public interface Product { ``` ```java -public class ConcreteProduct implements Product{ +public class ConcreteProduct implements Product { } ``` ```java -public class ConcreteProduct1 implements Product{ +public class ConcreteProduct1 implements Product { } ``` ```java -public class ConcreteProduct2 implements Product{ +public class ConcreteProduct2 implements Product { } ``` @@ -249,7 +249,7 @@ public class ConcreteFactory extends Factory { ``` ```java -public class ConcreteFactory1 extends Factory{ +public class ConcreteFactory1 extends Factory { public Product factoryMethod() { return new ConcreteProduct1(); } @@ -272,7 +272,7 @@ public class ConcreteFactory2 extends Factory { ## 类图 -

+

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 @@ -305,12 +305,12 @@ public class ProductA2 extends AbstractProductA { ``` ```java -public class ProductB1 extends AbstractProductB{ +public class ProductB1 extends AbstractProductB { } ``` ```java -public class ProductB2 extends AbstractProductB{ +public class ProductB2 extends AbstractProductB { } ``` @@ -322,7 +322,7 @@ public abstract class AbstractFactory { ``` ```java -public class ConcreteFactory1 extends AbstractFactory{ +public class ConcreteFactory1 extends AbstractFactory { AbstractProductA createProductA() { return new ProductA1(); } diff --git a/pics/14cfe8d4-e31b-49e0-ac6a-6f4f7aa06ab6.png b/pics/14cfe8d4-e31b-49e0-ac6a-6f4f7aa06ab6.png new file mode 100644 index 0000000000000000000000000000000000000000..54a1f45845778a58af0e777be73148b0952ef700 GIT binary patch literal 51200 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 Date: Sat, 14 Apr 2018 19:49:27 +0800 Subject: [PATCH 06/28] auto commit --- notes/数据库系统原理.md | 2 +- notes/面向对象思想.md | 2 +- pics/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png | Bin 0 -> 13312 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 pics/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 3554533a..d10a130a 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -94,7 +94,7 @@ T2 读取一个数据,T1 对该数据做了修改。如 T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。 -

+

## 解决方法 diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md index 5ab84adf..8cd324cb 100644 --- a/notes/面向对象思想.md +++ b/notes/面向对象思想.md @@ -115,7 +115,7 @@ - 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块 - 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能 - 提高软件的可重用性 -- 减低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的 +- 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的 以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。 diff --git a/pics/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png b/pics/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png new file mode 100644 index 0000000000000000000000000000000000000000..748980c42e969b67d0018a26f9d5134ac47c8e6b GIT binary patch literal 13312 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 literal 0 HcmV?d00001 From fa72a1fd784e0272271110692500e70d1f2b12ef Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 14 Apr 2018 20:09:42 +0800 Subject: [PATCH 07/28] auto commit --- notes/数据库系统原理.md | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index d10a130a..19a76d1a 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -110,11 +110,13 @@ T1 读取某个范围的数据,T2 在这个范围内插

+MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 + 应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。 -但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查锁是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。需要在锁开销以及数据安全性之间做一个权衡。 +但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查锁是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。 -MySQL 中提供了两种封锁粒度:行级锁以及表级锁。 +在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。 ## 封锁类型 @@ -289,33 +291,31 @@ InnoDB 的 MVCC 使用到的快照存储在 Undo 日志中,该日志通过回 ### 1. SELECT -该操作必须保证多个事务读取到同一个数据行的快照,这个快照是最近的一个有效快照。但是也有例外,如果有一个事务正在修改该数据行,那么它可以读取事务本身所做的修改,而不用和其它事务的读取结果一致。 - 当开始新一个事务时,该事务的版本号肯定会大于当前所有数据行快照的创建版本号,理解这一点很关键。 +多个事务必须读取到同一个数据行的快照,并且这个快照是距离现在最近的一个有效快照。但是也有例外,如果有一个事务正在修改该数据行,那么它可以读取事务本身所做的修改,而不用和其它事务的读取结果一致。 + 把没对一个数据行做修改的事务称为 T,T 所要读取的数据行快照的创建版本号必须小于 T 的版本号,因为如果大于或者等于 T 的版本号,那么表示该数据行快照是其它事务的最新修改,因此不能去读取它。 除了上面的要求,T 所要读取的数据行快照的删除版本号必须大于 T 的版本号,因为如果小于等于 T 的版本号,那么表示该数据行快照是已经被删除的,不应该去读取它。 ### 2. INSERT -将系统版本号作为数据行快照的创建版本号。 +将当前系统版本号作为数据行快照的创建版本号。 ### 3. DELETE -将系统版本号作为数据行快照的删除版本号。 +将当前系统版本号作为数据行快照的删除版本号。 ### 4. UPDATE -将系统版本号作为更新后的数据行快照的创建版本号,同时将系统版本号作为更新前的数据行快照的删除版本号。可以理解为先执行 DELETE 后执行 INSERT。 +将当前系统版本号作为更新后的数据行快照的创建版本号,同时将当前系统版本号作为更新前的数据行快照的删除版本号。可以理解为先执行 DELETE 后执行 INSERT。 ## 快照读与当前读 ### 1. 快照读 -读取快照中的数据。 - -引入快照读的目的主要是为了免去加锁操作带来的性能开销,但是当前读需要加锁。 +读取快照中的数据,可以减少加锁所带来的开销。 ```sql select * from table ....; @@ -323,9 +323,7 @@ select * from table ....; ### 2. 当前读 -读取最新的数据。 - -需要加锁,以下第一个语句加 S 锁,其它都加 X 锁。 +读取最新的数据,需要加锁。以下第一个语句需要加 S 锁,其它都需要加 X 锁。 ```sql select * from table where ? lock in share mode; @@ -337,7 +335,7 @@ delete; # 六、Next-Key Locks -Next-Key Locks 也是 MySQL 的 InnoDB 存储引擎的一种锁实现。MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读隔离级别下,MVCC + Next-Key Locks,就可以防止幻读的出现。 +Next-Key Locks 也是 MySQL 的 InnoDB 存储引擎的一种锁实现。MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读隔离级别下,使用 MVCC + Next-Key Locks 可以解决幻读问题。 ## Record Locks @@ -383,7 +381,7 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE; 记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。 -如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。 +如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。 对于 W->A,如果能找到 W 的真子集 W',使得 W'-> A,那么 W->A 就是部分函数依赖,否则就是完全函数依赖; @@ -399,9 +397,9 @@ SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE; 不符合范式的关系,会产生很多异常,主要有以下四种异常: -1. 冗余数据,例如学生-2 出现了两次。 -2. 修改异常,修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。 -3. 删除异常,删除一个信息,那么也会丢失其它信息。例如如果删除了课程-1,需要删除第一行和第三行,那么学生-1 的信息就会丢失。 +1. 冗余数据:例如 学生-2 出现了两次。 +2. 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。 +3. 删除异常:删除一个信息,那么也会丢失其它信息。例如如果删除了 课程-1,需要删除第一行和第三行,那么 学生-1 的信息就会丢失。 4. 插入异常,例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。 ## 范式 @@ -470,7 +468,7 @@ Sname, Sdept 和 Mname 都函数依赖于 Sno,而部分依赖于键码。当 非主属性不传递依赖于键码。 -上面的关系-1 中存在以下传递依赖:Sno -> Sdept -> Mname,可以进行以下分解: +上面的 关系-1 中存在以下传递依赖:Sno -> Sdept -> Mname,可以进行以下分解: 关系-11 From 4739fe5fc3c27f7c3d93a5b32dccbae14e2594b5 Mon Sep 17 00:00:00 2001 From: j4it Date: Sat, 14 Apr 2018 20:29:56 +0800 Subject: [PATCH 08/28] =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit envicition 的正确拼写为 eviction --- notes/Redis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Redis.md b/notes/Redis.md index 08b1f54f..6bf4f828 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -427,7 +427,7 @@ Redis 这种内存数据库能支持计数器频繁的读写操作。 |volatile-random | 从已设置过期时间的数据集中任意选择数据淘汰 | | allkeys-lru | 从所有数据集中挑选最近最少使用的数据淘汰 | | allkeys-random | 从所有数据集中任意选择数据进行淘汰 | -| no-envicition | 禁止驱逐数据 | +| no-eviction | 禁止驱逐数据 | 如果使用 Redis 来缓存数据时,要保证所有数据都是热点数据,可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。 From 26dfacde8f9ea6fb1aada8852357c7824bd94d77 Mon Sep 17 00:00:00 2001 From: j4it Date: Sat, 14 Apr 2018 20:40:13 +0800 Subject: [PATCH 09/28] =?UTF-8?q?=E8=A7=84=E8=8C=83=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E7=94=A8noeviction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Redis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Redis.md b/notes/Redis.md index 6bf4f828..d33d6f04 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -427,7 +427,7 @@ Redis 这种内存数据库能支持计数器频繁的读写操作。 |volatile-random | 从已设置过期时间的数据集中任意选择数据淘汰 | | allkeys-lru | 从所有数据集中挑选最近最少使用的数据淘汰 | | allkeys-random | 从所有数据集中任意选择数据进行淘汰 | -| no-eviction | 禁止驱逐数据 | +| noeviction | 禁止驱逐数据 | 如果使用 Redis 来缓存数据时,要保证所有数据都是热点数据,可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。 From 48eb74263d26f6b1e6d075035464b747d19b51f8 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 14 Apr 2018 20:41:18 +0800 Subject: [PATCH 10/28] auto commit --- notes/SQL.md | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/notes/SQL.md b/notes/SQL.md index a87cdd7f..2eb67e58 100644 --- a/notes/SQL.md +++ b/notes/SQL.md @@ -196,7 +196,7 @@ WHERE col IS NULL; 应该注意到,NULL 与 0 、空字符串都不同。 -**AND OR** 用于连接多个过滤条件。优先处理 AND,因此当一个过滤表达式涉及到多个 AND 和 OR 时,应当使用 () 来决定优先级。 +**AND OR** 用于连接多个过滤条件,优先处理 AND,当一个过滤表达式涉及到多个 AND 和 OR 时,可以使用 () 来决定优先级,使得优先级关系更清晰。 **IN** 操作符用于匹配一组值,其后也可以接一个 SELECT 子句,从而匹配子查询得到的一组值。 @@ -246,14 +246,14 @@ FROM mytable ## 文本处理 | 函数 | 说明 | -| ------------ | ------------ | +| :---: | :---: | | LEFT() RIGHT() | 左边或者右边的字符 | | LOWER() UPPER() | 转换为小写或者大写 | | LTRIM() RTIM() | 去除左边或者右边的空格 | | LENGTH() | 长度 | | SOUNDEX() | 转换为语音值 | -其中, **SOUNDEX()** 是将一个字符串转换为描述其语音表示的字母数字模式的算法,它是根据发音而不是字母比较。 +其中, **SOUNDEX()** 可以将一个字符串转换为描述其语音表示的字母数字模式。 ```sql SELECT * @@ -267,7 +267,7 @@ WHERE SOUNDEX(col1) = SOUNDEX('apple') - 时间格式:HH:MM:SS |函 数 | 说 明| -| --- | --- | +| :---: | :---: | | AddDate() | 增加一个日期(天、周等)| | AddTime() | 增加一个时间(时、分等)| | CurDate() | 返回当前日期 | @@ -288,13 +288,16 @@ WHERE SOUNDEX(col1) = SOUNDEX('apple') ```sql mysql> SELECT NOW(); - -> '2017-06-28 14:01:52' +``` + +``` +2018-4-14 20:25:11 ``` ## 数值处理 | 函数 | 说明 | -| --- | --- | +| :---: | :---: | | SIN() | 正弦 | | COS() | 余弦 | | TAN() | 正切 | @@ -308,7 +311,7 @@ mysql> SELECT NOW(); ## 汇总 |函 数 |说 明| -| --- | --- | +| :---: | :---: | | AVG() | 返回某列的平均值 | | COUNT() | 返回某列的行数 | | MAX() | 返回某列的最大值 | @@ -330,7 +333,7 @@ FROM mytable 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。 -指定的分组字段除了能按该字段进行分组,也可以按该字段进行排序,例如按 col 字段排序并分组数据: +指定的分组字段除了能按该字段进行分组,也会自动按按该字段进行排序。 ```sql SELECT col, COUNT(*) AS num @@ -338,7 +341,7 @@ FROM mytable GROUP BY col; ``` -GROUP BY 是按照分组字段进行排序,ORDER BY 也可以以汇总字段来进行排序。 +GROUP BY 按分组字段进行排序,ORDER BY 也可以以汇总字段来进行排序。 ```sql SELECT col, COUNT(*) AS num @@ -347,14 +350,14 @@ GROUP BY col ORDER BY num; ``` -WHERE 过滤行,HAVING 过滤分组。行过滤应当先于分组过滤; +WHERE 过滤行,HAVING 过滤分组,行过滤应当先于分组过滤。 ```sql SELECT col, COUNT(*) AS num FROM mytable WHERE col > 2 GROUP BY col -HAVING COUNT(*) >= 2; +HAVING num >= 2; ``` 分组规定: @@ -436,10 +439,10 @@ where department = ( 自连接版本 ```sql -select e2.name +select e1.name from employee as e1, employee as e2 where e1.department = e2.department - and e1.name = "Jim"; + and e2.name = "Jim"; ``` 连接一般比子查询的效率高。 @@ -479,9 +482,9 @@ group by Customers.cust_id; # 十六、组合查询 -使用 **UNION** 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果为 M+N 行。 +使用 **UNION** 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行。 -每个查询必须包含相同的列、表达式或者聚集函数。 +每个查询必须包含相同的列、表达式和聚集函数。 默认会去除相同行,如果需要保留相同行,使用 UNION ALL。 @@ -622,7 +625,7 @@ MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储 不能回退 SELECT 语句,回退 SELECT 语句也没意义;也不能回退 CREATE 和 DROP 语句。 -MySQL 的事务提交默认是隐式提交,也就是每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。 +MySQL 的事务提交默认是隐式提交,每执行一条语句就把这条语句当成一个事务然后进行提交。当出现 START TRANSACTION 语句时,会关闭隐式提交;当 COMMIT 或 ROLLBACK 语句执行后,事务会自动关闭,重新恢复隐式提交。 通过设置 autocommit 为 0 可以取消自动提交,直到 autocommit 被设置为 1 才会提交;autocommit 标记是针对每个连接而不是针对服务器的。 From ed06cbad5554fdb4c3136f54de3d691932a6f6fb Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 14 Apr 2018 21:06:30 +0800 Subject: [PATCH 11/28] auto commit --- notes/MySQL.md | 20 ++++++++------------ notes/Redis.md | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/notes/MySQL.md b/notes/MySQL.md index 5cc1fd69..176a1d88 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -30,31 +30,27 @@ InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支持的特性时,才考虑使用其它存储引擎。 -采用 MVCC 来支持高并发,并且实现了四个标准的隔离级别,默认级别是可重复读。 +采用 MVCC 来支持高并发,并且实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得 InnoDB 不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。 表是基于聚簇索引建立的,它对主键的查询性能有很高的提升。 内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够自动在内存中创建哈希索引以加速读操作的自适应哈希索引、能够加速插入操作的插入缓冲区等。 -通过一些机制和工具支持真正的热备份。 +通过一些机制和工具支持真正的热备份,其它存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。 ## MyISAM -MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等。但 MyISAM 不支持事务和行级锁,而且崩溃后无法安全恢复。应该注意的是,MySQL5.6.4 添加了对 InnoDB 引擎的全文索引支持。 +提供了大量的特性,包括全文索引、压缩表、空间函数(GIS)等。应该注意的是,MySQL 5.6.4 添加了对 InnoDB 引擎的全文索引支持。 -只能对整张表加锁,而不是针对行。 +不支持事务。 + +不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取查询的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。 可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。 -可以包含动态或者静态的行。 - 如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。 -如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表适合采用 MyISAM 压缩表。 - -对于只读数据,或者表比较小、可以容忍修复操作,则依然可以继续使用 MyISAM。 - -MyISAM 设计简单,数据以紧密格式存储,所以在某些场景下性能很好。 +MyISAM 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以继续使用 MyISAM。 ## 比较 @@ -62,7 +58,7 @@ MyISAM 设计简单,数据以紧密格式存储,所以在某些场景下性 2. 备份:InnoDB 支持在线热备份。 3. 崩溃恢复:MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。 4. 并发:MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。 -5. 其它特性:MyISAM 支持,地理空间索引。 +5. 其它特性:MyISAM 支持压缩表和地理空间索引。 # 二、数据类型 diff --git a/notes/Redis.md b/notes/Redis.md index 6bf4f828..d33d6f04 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -427,7 +427,7 @@ Redis 这种内存数据库能支持计数器频繁的读写操作。 |volatile-random | 从已设置过期时间的数据集中任意选择数据淘汰 | | allkeys-lru | 从所有数据集中挑选最近最少使用的数据淘汰 | | allkeys-random | 从所有数据集中任意选择数据进行淘汰 | -| no-eviction | 禁止驱逐数据 | +| noeviction | 禁止驱逐数据 | 如果使用 Redis 来缓存数据时,要保证所有数据都是热点数据,可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。 From bae615251348a91f48844796811c514ff555b042 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 14 Apr 2018 21:49:39 +0800 Subject: [PATCH 12/28] auto commit --- notes/MySQL.md | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/notes/MySQL.md b/notes/MySQL.md index 176a1d88..56335138 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -40,7 +40,7 @@ InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支 ## MyISAM -提供了大量的特性,包括全文索引、压缩表、空间函数(GIS)等。应该注意的是,MySQL 5.6.4 添加了对 InnoDB 引擎的全文索引支持。 +提供了大量的特性,包括全文索引、压缩表、空间数据索引等。应该注意的是,MySQL 5.6.4 添加了对 InnoDB 引擎的全文索引支持。 不支持事务。 @@ -58,7 +58,7 @@ MyISAM 设计简单,数据以紧密格式存储。对于只读数据,或者 2. 备份:InnoDB 支持在线热备份。 3. 崩溃恢复:MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。 4. 并发:MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。 -5. 其它特性:MyISAM 支持压缩表和地理空间索引。 +5. 其它特性:MyISAM 支持压缩表和空间数据索引。 # 二、数据类型 @@ -142,12 +142,14 @@ InnoDB 引擎有一个特殊的功能叫“自适应哈希索引”,当某个 限制:哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能影响并不明显;无法用于分组与排序;只支持精确查找,无法用于部分查找和范围查找;如果哈希冲突很多,查找速度会变得很慢。 -### 3. 空间索引(R-Tree) +### 3. 空间数据索引(R-Tree) MyISAM 存储引擎支持空间索引,可以用于地理数据存储。 空间索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。 +必须使用 GIS 相关的函数来维护数据。 + ### 4. 全文索引 MyISAM 存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较索引中的值。 @@ -158,9 +160,9 @@ MyISAM 存储引擎支持全文索引,用于查找文本中的关键词,而 - 大大减少了服务器需要扫描的数据量; -- 帮助服务器避免进行排序和创建临时表; +- 帮助服务器避免进行排序和创建临时表(B+Tree 索引是有序的,可以用来做 ORDER BY 和 GROUP BY 操作); -- 将随机 I/O 变为顺序 I/O。 +- 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,也就将相关的列值都存储在一起)。 ## 索引优化 @@ -212,14 +214,14 @@ customer_id_selectivity: 0.0373 聚簇索引并不是一种索引类型,而是一种数据存储方式。 -术语“聚簇”表示数据行和相邻的键值紧密地存储在一起,InnoDB 的聚簇索引的数据行存放在 B+Tree 的叶子页中。 +术语“聚簇”表示数据行和相邻的键值紧密地存储在一起,InnoDB 的聚簇索引在同一个结构中保存了 B+Tree 索引和数据行。 因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。 **优点** -1. 可以把相关数据保存在一起,减少 I/O 操作; -2. 因为数据保存在 B+Tree 中,因此数据访问更快。 +1. 可以把相关数据保存在一起,减少 I/O 操作。例如电子邮件表可以根据用户 ID 来聚集数据,这样只需要从磁盘读取少数的数据也就能获取某个用户的全部邮件,如果没有使用聚聚簇索引,则每封邮件都可能导致一次磁盘 I/O。 +2. 数据访问更快。 **缺点** @@ -245,15 +247,15 @@ customer_id_selectivity: 0.0373

-为了描述 B-Tree,首先定义一条数据记录为一个二元组 [key, data],key 为记录的键,data 为数据记录除 key 外的数据。 +为了描述 B-Tree,首先定义一条数据记录为一个二元组 [key, data]。 B-Tree 是满足下列条件的数据结构: - 所有叶节点具有相同的深度,也就是说 B-Tree 是平衡的; - 一个节点中的 key 从左到右非递减排列; -- 如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于 keyi 且小于 keyi+1。 +- 如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。 -在 B-Tree 中按 key 检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的 data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到 null 指针,前者查找成功,后者查找失败。 +在 B-Tree 中按 key 检索数据的算法非常直观:首先在根节点进行二分查找,如果找到则返回对应节点的 data,否则在相应区间的指针指向的节点递归进行查找。 由于插入删除新的数据记录会破坏 B-Tree 的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持 B-Tree 性质。 @@ -278,7 +280,9 @@ B-Tree 是满足下列条件的数据结构: 页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页的大小通常为 4k),主存和磁盘以页为单位交换数据。 -一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。为了减少磁盘 I/O,磁盘往往不是严格按需读取,而是每次都会预读。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次 I/O 就可以完全载入。B-Tree 中一次检索最多需要 h-1 次 I/O(根节点常驻内存),渐进复杂度为 O(h)=O(logdN)。一般实际应用中,出度 d 是非常大的数字,通常超过 100,因此 h 非常小(通常不超过 3)。而红黑树这种结构,h 明显要深的多。并且于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,效率明显比 B-Tree 差很多。 +一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。为了减少磁盘 I/O,磁盘往往不是严格按需读取,而是每次都会预读。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次 I/O 就可以完全载入。 + +B-Tree 中一次检索最多需要 h-1 次 I/O(根节点常驻内存),渐进复杂度为 O(h)=O(logdN)。一般实际应用中,出度 d 是非常大的数字,通常超过 100,因此 h 非常小(通常不超过 3)。而红黑树这种结构,h 明显要深的多。并且于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,效率明显比 B-Tree 差很多。 B+Tree 更适合外存索引,原因和内节点出度 d 有关。由于 B+Tree 内节点去掉了 data 域,因此可以拥有更大的出度,拥有更好的性能。 From ef7b05befc5f77eddd798cdba73cfebdafa05e44 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 11:06:44 +0800 Subject: [PATCH 13/28] auto commit --- notes/Java 基础.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index aa33ce32..06100520 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -324,7 +324,7 @@ public class CloneExample { ```java CloneExample e1 = new CloneExample(); -CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object' +// CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object' ``` 接下来覆盖 Object 的 clone() 得到以下实现: @@ -510,7 +510,7 @@ protected 用于修饰成员,表示在继承体系中成员对于子类可见 如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里式替换原则。 -字段决不能是公有的,因为这么做的话就失去了对这个实例域修改行为的控制,客户端可以对其随意修改。可以使用共有的 getter 和 setter 方法来替换共有字段。 +字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。可以使用共有的 getter 和 setter 方法来替换共有字段。 ```java public class AccessExample { @@ -634,9 +634,9 @@ System.out.println(InterfaceExample.x); **3. 比较** -- 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求子类和父类具有 IS-A 关系; +- 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。 - 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。 -- 接口的字段只能是 static 和 final 类型的,而抽象类的域可以有多种访问权限。 +- 接口的字段只能是 static 和 final 类型的,而抽象类的字段可以有多种访问权限。 - 接口的方法只能是 public 的,而抽象类的方法可以由多种访问权限。 **4. 使用选择** @@ -652,7 +652,7 @@ System.out.println(InterfaceExample.x); - 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法; - 需要使用多重继承。 -在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次接口要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。 +在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。 > [深入理解 abstract class 和 interface](https://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/)
[When to Use Abstract Class and Interface](https://dzone.com/articles/when-to-use-abstract-class-and-intreface) @@ -773,7 +773,7 @@ String s5 = "bbb"; System.out.println(s4 == s5); // true ``` -Java 虚拟机将堆划分成新生代、老年代和永久代(PermGen Space)。在 Java 7 之前,字符串常量池被放在永久代中,而在 Java 7,它被放在堆的其它位置。这是因为永久代的空间有限,如果大量使用字符串的场景下会导致 OutOfMemoryError 错误。 +Java 虚拟机将堆划分成新生代、老年代和永久代(PermGen Space)。在 Java 7 之前,字符串常量池被放在永久代中,而在 Java 7,它被放在堆的其它位置。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。 > [What is String interning?](https://stackoverflow.com/questions/10578984/what-is-string-interning)
[深入解析 String#intern](https://tech.meituan.com/in_depth_understanding_string_intern.html) From bdb10bfe508c84e15c1905cbef3a958b588e6087 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 13:22:54 +0800 Subject: [PATCH 14/28] auto commit --- notes/Java 容器.md | 43 ++++++++++-------- notes/Leetcode 题解.md | 2 +- notes/正则表达式.md | 2 +- pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png | Bin 0 -> 19456 bytes 4 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 1cb19fe6..2e10a401 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -9,9 +9,9 @@ * [ArrayList](#arraylist) * [Vector](#vector) * [LinkedList](#linkedlist) + * [LinkedHashMap](#linkedhashmap) * [TreeMap](#treemap) * [HashMap](#hashmap) - * [LinkedHashMap](#linkedhashmap) * [ConcurrentHashMap - JDK 1.7](#concurrenthashmap---jdk-17) * [ConcurrentHashMap - JDK 1.8](#concurrenthashmap---jdk-18) * [参考资料](#参考资料) @@ -40,13 +40,13 @@ - Vector:和 ArrayList 类似,但它是线程安全的; -- LinkedList:基于双向循环链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双端队列。 +- LinkedList:基于双向循环链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 ### 3. Queue - LinkedList:可以用它来支持双向队列; -- PriorityQueue:基于堆结构实现,可以用它来实现优先级队列。 +- PriorityQueue:基于堆结构实现,可以用它来实现优先队列。 ## Map @@ -111,7 +111,7 @@ List list = Arrays.asList(1,2,3); ## ArrayList -[ArraList.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/ArrayList.java) +[ArrayList.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/ArrayList.java) ### 1. 概览 @@ -224,6 +224,10 @@ private void writeObject(java.io.ObjectOutputStream s) [LinkedList.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/LinkedList.java) +## LinkedHashMap + +[LinkedHashMap.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/HashMap.java) + ## TreeMap [TreeMap.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/TreeMap.java) @@ -302,7 +306,7 @@ map.put("K3", "V3"); - 插入 <K2,V2> 键值对,先计算 K2 的 hashCode 为 118,使用除留余数法得到所在的桶下标 118%16=6。 - 插入 <K3,V3> 键值对,先计算 K3 的 hashCode 为 118,使用除留余数法得到所在的桶下标 118%16=6,插在 <K2,V2> 后面。 -

+

查找需要分成两步进行: @@ -317,7 +321,7 @@ map.put("K3", "V3"); 因为从 JDK 1.8 开始引入了红黑树,因此扩容操作较为复杂,为了便于理解,以下内容使用 JDK 1.7 的内容。 -设 HashMap 的 table 长度为 M,需要存储的键值对数量为 N,如果哈希函数满足均匀性的要求,那么每条链表的长度大约为 N/M,因此平均查找次数的数量级为 O(N/M)。 +设 HashMap 的 table 长度为 M,需要存储的键值对数量为 N,如果哈希函数满足均匀性的要求,那么每条链表的长度大约为 N/M,因此平均查找次数的复杂度为 O(N/M)。 为了让查找的成本降低,应该尽可能使得 N/M 尽可能小,因此需要保证 M 尽可能大,也就是说 table 要尽可能大。HashMap 采用动态扩容来根据当前的 N 值来调整 M 值,使得空间效率和时间效率都能得到保证。 @@ -397,11 +401,9 @@ void transfer(Entry[] newTable) { ### 5. 确定桶下标 -很多操作都需要先确定一个键值对所在的桶下标,需要分三步进行。 +很多操作都需要先确定一个键值对所在的桶下标,这个操作需要分三步进行。 -(一)hashCode() - -调用 Key 的 hashCode() 方法得到 hashCode。 +(一)调用 hashCode() ```java public final int hashCode() { @@ -420,7 +422,7 @@ static final int hash(Object key) { } ``` -(三)除留余数法 +(三)除留余数 令 x = 1<<4,即 x 为 2 的 4 次方,它具有以下性质: @@ -429,7 +431,7 @@ x : 00010000 x-1 : 00001111 ``` -令一个数 y 与 x-1 做与运算,可以去除 y 位级表示的第 4 位及以上数: +令一个数 y 与 x-1 做与运算,可以去除 y 位级表示的第 4 位以上数: ``` y : 10110010 @@ -449,7 +451,7 @@ y%x : 00000010 拉链法需要使用除留余数法来得到桶下标,也就是需要进行以下计算:hash%capacity,如果能保证 capacity 为 2 的幂次方,那么就可以将这个操作转换位位运算。 -以下操作在 Java 8 中没有,但是原理上相同。 +以下操作在 JDK 1.8 中没有,但是原理上相同。 ```java static int indexFor(int h, int length) { @@ -472,7 +474,7 @@ new capacity : 00100000 ### 7. 扩容-计算数组容量 -先考虑如何求一个数的补码,对于 10010000,它的掩码为 11111111,可以使用以下方法得到: +先考虑如何求一个数的掩码,对于 10010000,它的掩码为 11111111,可以使用以下方法得到: ``` mask |= mask >> 1 11011000 @@ -480,9 +482,14 @@ mask |= mask >> 2 11111100 mask |= mask >> 4 11111111 ``` -如果最后令 mask+1,得到就是大于原始数字的最小的 2 次方。 +mask+1 是大于原始数字的最小的 2 次方。 -以下是 HashMap 中计算一个大小所需要的数组容量的代码: +``` +num 10010000 +mask+1 100000000 +``` + +以下是 HashMap 中计算数组容量的代码: ```java static final int tableSizeFor(int cap) { @@ -508,10 +515,6 @@ HashMap 允许有一个 Node 的 Key 为 null,该 Node 一定会放在第 0 - 由于 Hashtable 是线程安全的也是 synchronized,所以在单线程环境下它比 HashMap 要慢。 - HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。 -## LinkedHashMap - -[LinkedHashMap.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/HashMap.java) - ## ConcurrentHashMap - JDK 1.7 [ConcurrentHashMap.java](https://github.com/CyC2018/JDK-Source-Code/blob/master/src/1.7/ConcurrentHashMap.java) diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index f3f229d8..0cee7066 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -190,7 +190,7 @@ You have 3 cookies and their sizes are big enough to gratify all of the children You need to output 2. ``` -题目描述:每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。 +题目描述:每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。 因为最小的孩子最容易得到满足,因此先满足最小孩子。给一个孩子的饼干应当尽量小又能满足该孩子,这样大饼干就能拿来给满足度比较大的孩子。 diff --git a/notes/正则表达式.md b/notes/正则表达式.md index 1252be08..e21a85c5 100644 --- a/notes/正则表达式.md +++ b/notes/正则表达式.md @@ -231,7 +231,7 @@ a.+c **正则表达式** ``` -(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))) +((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d)) ``` **匹配结果** diff --git a/pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png b/pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png new file mode 100644 index 0000000000000000000000000000000000000000..df5be529a879d4e795cbf18ae00ca2dddb3c17b4 GIT binary patch literal 19456 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 literal 0 HcmV?d00001 From d7bbeab6c627ae14118fc1d3280da2fce68129e5 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 14:28:57 +0800 Subject: [PATCH 15/28] auto commit --- notes/Java 容器.md | 68 +++++++++++----------------------------------- 1 file changed, 16 insertions(+), 52 deletions(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 2e10a401..9893ee27 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -474,6 +474,8 @@ new capacity : 00100000 ### 7. 扩容-计算数组容量 +HashMap 构造函数允许用户传入的容量不是 2 的幂次方,因为它可以自动地将传入的容量转换为 2 的幂次方。 + 先考虑如何求一个数的掩码,对于 10010000,它的掩码为 11111111,可以使用以下方法得到: ``` @@ -482,7 +484,7 @@ mask |= mask >> 2 11111100 mask |= mask >> 4 11111111 ``` -mask+1 是大于原始数字的最小的 2 次方。 +mask+1 是大于原始数字的最小的 2 幂次方。 ``` num 10010000 @@ -519,7 +521,7 @@ HashMap 允许有一个 Node 的 Key 为 null,该 Node 一定会放在第 0 [ConcurrentHashMap.java](https://github.com/CyC2018/JDK-Source-Code/blob/master/src/1.7/ConcurrentHashMap.java) -ConcurrentHashMap 和 HashMap 实现上类似,最主要的差别是 ConcurrentHashMap 采用了了分段锁,每个分段锁维护着几个桶,多个线程可以同时访问不同分段锁上的桶。 +ConcurrentHashMap 和 HashMap 实现上类似,最主要的差别是 ConcurrentHashMap 采用了分段锁,每个分段锁维护着几个桶,多个线程可以同时访问不同分段锁上的桶。 相比于 HashTable 和用同步包装器包装的 HashMap(Collections.synchronizedMap(new HashMap())),ConcurrentHashMap 拥有更高的并发性。在 HashTable 和由同步包装器包装的 HashMap 中,使用一个全局的锁来同步不同线程间的并发访问。同一时间点,只能有一个线程持有锁,也就是说在同一时间点,只能有一个线程能访问容器。这虽然保证多线程间的安全并发访问,但同时也导致对容器的访问变成串行化的了。 @@ -536,7 +538,7 @@ static final class HashEntry { } ``` -继承自 ReentrantLock,每个 Segment 维护着多个 HashEntry。 +Segment 继承自 ReentrantLock,每个 Segment 维护着多个 HashEntry。 ```java static final class Segment extends ReentrantLock implements Serializable { @@ -572,46 +574,17 @@ static final int DEFAULT_CONCURRENCY_LEVEL = 16; ### 2. HashEntry 的不可变性 -HashEntry 中的 key,hash,next 都声明为 final 型。这意味着,不能把节点添加到链接的中间和尾部,也不能在链接的中间和尾部删除节点。这个特性可以保证:在访问某个节点时,这个节点之后的链接不会被改变。这个特性可以大大降低处理链表时的复杂性。 +HashEntry 类的 value 域被声明为 Volatile 型,Java 的内存模型可以保证:某个写线程对 value 域的写入马上可以被后续的某个读线程 “看” 到。在 ConcurrentHashMap 中,不允许用 null 作为键和值,当读线程读到某个 HashEntry 的 value 域的值为 null 时,便知道产生了冲突——发生了重排序现象,需要加锁后重新读入这个 value 值。这些特性互相配合,使得读线程即使在不加锁状态下,也能正确访问 ConcurrentHashMap。 -同时,HashEntry 类的 value 域被声明为 Volatile 型,Java 的内存模型可以保证:某个写线程对 value 域的写入马上可以被后续的某个读线程 “看” 到。在 ConcurrentHashMap 中,不允许用 null 作为键和值,当读线程读到某个 HashEntry 的 value 域的值为 null 时,便知道产生了冲突——发生了重排序现象,需要加锁后重新读入这个 value 值。这些特性互相配合,使得读线程即使在不加锁状态下,也能正确访问 ConcurrentHashMap。 +非结构性修改操作只是更改某个 HashEntry 的 value 域的值。由于对 Volatile 变量的写入操作将与随后对这个变量的读操作进行同步。当一个写线程修改了某个 HashEntry 的 value 域后,另一个读线程读这个值域,Java 内存模型能够保证读线程读取的一定是更新后的值。所以,写线程对链表的非结构性修改能够被后续不加锁的读线程 “看到”。 -```java -final V remove(Object key, int hash, Object value) { - if (!tryLock()) - scanAndLock(key, hash); - V oldValue = null; - try { - HashEntry[] tab = table; - int index = (tab.length - 1) & hash; - HashEntry e = entryAt(tab, index); - HashEntry pred = null; - while (e != null) { - K k; - HashEntry next = e.next; - if ((k = e.key) == key || - (e.hash == hash && key.equals(k))) { - V v = e.value; - if (value == null || value == v || value.equals(v)) { - if (pred == null) - setEntryAt(tab, index, next); - else - pred.setNext(next); - ++modCount; - --count; - oldValue = v; - } - break; - } - pred = e; - e = next; - } - } finally { - unlock(); - } - return oldValue; -} -``` +对 ConcurrentHashMap 做结构性修改,实质上是对某个桶指向的链表做结构性修改。如果能够确保:在读线程遍历一个链表期间,写线程对这个链表所做的结构性修改不影响读线程继续正常遍历这个链表。那么读 / 写线程之间就可以安全并发访问这个 ConcurrentHashMap。 + +结构性修改操作包括 put,remove,clear。下面我们分别分析这三个操作。 + +clear 操作只是把 ConcurrentHashMap 中所有的桶 “置空”,每个桶之前引用的链表依然存在,只是桶不再引用到这些链表(所有链表的结构并没有被修改)。正在遍历某个链表的读线程依然可以正常执行对该链表的遍历。 + +put 操作如果需要插入一个新节点到链表中时 , 会在链表头部插入这个新节点。此时,链表中的原有节点的链接并没有被修改。也就是说:插入新健 / 值对到链表中的操作不会影响读线程正常遍历这个链表。 在以下链表中删除 C 节点,C 节点之后的所有节点都原样保留,C 节点之前的所有节点都被克隆到新的链表中,并且顺序被反转。可以注意到,在执行 remove 操作时,原始链表并没有被修改,也就是说,读线程不会受到执行 remove 操作的并发写线程的干扰。 @@ -619,19 +592,10 @@ final V remove(Object key, int hash, Object value) {

-除了 remove 操作,其它操作也类似。可以得出一个结论:写线程对某个链表的结构性修改不会影响其他的并发读线程对这个链表的遍历访问。 +综上,可以得出一个结论:写线程对某个链表的结构性修改不会影响其他的并发读线程对这个链表的遍历访问。 ### 3. Volatile 变量 -```java -static final class HashEntry { - final int hash; - final K key; - volatile V value; - volatile HashEntry next; -} -``` - 由于内存可见性问题,未正确同步的情况下,写线程写入的值可能并不为后续的读线程可见。 下面以写线程 M 和读线程 N 来说明 ConcurrentHashMap 如何协调读 / 写线程间的内存可见性问题。 @@ -677,7 +641,7 @@ V get(Object key, int hash) { 在 ConcurrentHashMap 中,所有执行写操作的方法(put, remove, clear),在对链表做结构性修改之后,在退出写方法前都会去写这个 count 变量。所有未加锁的读操作(get, contains, containsKey)在读方法中,都会首先去读取这个 count 变量。 -根据 Java 内存模型,对 同一个 volatile 变量的写 / 读操作可以确保:写线程写入的值,能够被之后未加锁的读线程 “看到”。 +根据 Java 内存模型,对同一个 volatile 变量的写 / 读操作可以确保:写线程写入的值,能够被之后未加锁的读线程 “看到”。 这个特性和前面介绍的 HashEntry 对象的不变性相结合,使得在 ConcurrentHashMap 中,读线程在读取散列表时,基本不需要加锁就能成功获得需要的值。这两个特性相配合,不仅减少了请求同一个锁的频率(读操作一般不需要加锁就能够成功获得值),也减少了持有同一个锁的时间(只有读到 value 域的值为 null 时 ,读线程才需要加锁后重读)。 From 0fd9229f482a0a1dfca1eb744a700284eb5fa8e2 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 15:41:54 +0800 Subject: [PATCH 16/28] auto commit --- README.md | 44 +++++++++++++++++++++++--------------------- notes/Java 并发.md | 10 +++++----- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 0493e185..27ae89a9 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ | Ⅰ | Ⅱ | Ⅲ | Ⅳ | Ⅴ | Ⅵ | Ⅶ | Ⅷ | Ⅸ | Ⅹ | | :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:| -|网络[:cloud:](#网络-cloud) |操作系统[:computer:](#操作系统-computer)| 算法[:pencil2:](#数据结构与算法-pencil2)| 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) | +| 算法[:pencil2:](#数据结构与算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
:loudspeaker: 本仓库不参与商业行为,不向读者收取任何费用。 @@ -9,26 +9,6 @@ :loudspeaker: This repository is not engaging in business activities, and does not charge readers any fee.

-## 网络 :cloud: - -> [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md) - -整理自《计算机网络 第七版》,重点内容会在标题后面加 \*。 - -> [HTTP](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/HTTP.md) - -整理自《图解 HTTP》 - -## 操作系统 :computer: - -> [计算机操作系统](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机操作系统.md) - -整理自《现代操作系统》和《计算机操作系统》 - -> [Linux](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Linux.md) - -整理自《鸟哥的 Linux 私房菜》 - ## 数据结构与算法 :pencil2: > [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md) @@ -43,6 +23,28 @@ 对题目做了一个分类,并对每种题型的解题思路做了总结。 +## 操作系统 :computer: + +> [计算机操作系统](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机操作系统.md) + +整理自《现代操作系统》和《计算机操作系统》 + +> [Linux](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Linux.md) + +整理自《鸟哥的 Linux 私房菜》 + + +## 网络 :cloud: + +> [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md) + +整理自《计算机网络 第七版》,重点内容会在标题后面加 \*。 + +> [HTTP](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/HTTP.md) + +整理自《图解 HTTP》 + + ## 面向对象 :couple: > [设计模式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/设计模式.md) diff --git a/notes/Java 并发.md b/notes/Java 并发.md index a1131c9c..0f6d95c2 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -1027,13 +1027,13 @@ public class ThreadUnsafeExample { # 十、Java 内存模型 -Java 内存模型视图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 +Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 ## 主内存与工作内存 处理器上的寄存器的读写的速度比内存快几个数量级,为了解决这种速度矛盾,在它们之间加入了高速缓存。 -加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致。CPU 使用一致性协议来解决一致性问题。 +加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。

@@ -1153,7 +1153,7 @@ public class AtomicSynchronizedExample { 可见性指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。 -volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一般的对象),那么其它线程就能看见 final 字段的值。 +volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一半的对象),那么其它线程就能看见 final 字段的值。 对前面的线程不安全示例中的 cnt 变量用 volatile 修饰,不能解决线程不安全问题。因为 volatile 并不能保证操作的原子性。 @@ -1203,7 +1203,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 > Thread Start Rule -Thread 对象的 start() 方法先行发生于此线程的每一个动作。 +Thread 对象的 start() 方法调用先行发生于此线程的每一个动作。

@@ -1276,7 +1276,7 @@ public V put(K key, V value) { } ``` -多线程环境下,应当尽量使对象称为不可变,来满足线程安全。 +多线程环境下,应当尽量使对象成为不可变,来满足线程安全。 ### 2. 绝对线程安全 From f7e200db56568033347cc49180d4727f7eeec125 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 15:43:20 +0800 Subject: [PATCH 17/28] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 27ae89a9..ea88d5e5 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ :loudspeaker: This repository is not engaging in business activities, and does not charge readers any fee.

-## 数据结构与算法 :pencil2: +## 算法 :pencil2: > [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md) From 7a7f26150f6009b3158c8a89ef5b934cf1cca0b3 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 15:43:54 +0800 Subject: [PATCH 18/28] auto commit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ea88d5e5..ecaed023 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ | Ⅰ | Ⅱ | Ⅲ | Ⅳ | Ⅴ | Ⅵ | Ⅶ | Ⅷ | Ⅸ | Ⅹ | | :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:| -| 算法[:pencil2:](#数据结构与算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) | +| 数据结构与算法[:pencil2:](#数据结构与算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
:loudspeaker: 本仓库不参与商业行为,不向读者收取任何费用。 @@ -9,7 +9,7 @@ :loudspeaker: This repository is not engaging in business activities, and does not charge readers any fee.

-## 算法 :pencil2: +## 数据结构与算法 :pencil2: > [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md) From c3f35a7f97ce17659b064274414bbe6d0ac2b18a Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 15:56:15 +0800 Subject: [PATCH 19/28] auto commit --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ecaed023..4c2d1c28 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ | Ⅰ | Ⅱ | Ⅲ | Ⅳ | Ⅴ | Ⅵ | Ⅶ | Ⅷ | Ⅸ | Ⅹ | | :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:| -| 数据结构与算法[:pencil2:](#数据结构与算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) | +| 算法[:pencil2:](#算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
:loudspeaker: 本仓库不参与商业行为,不向读者收取任何费用。 @@ -9,11 +9,8 @@ :loudspeaker: This repository is not engaging in business activities, and does not charge readers any fee.

-## 数据结构与算法 :pencil2: +## 算法 :pencil2: -> [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md) - -整理自《算法 第四版》 > [剑指 Offer 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/剑指%20offer%20题解.md) @@ -23,6 +20,10 @@ 对题目做了一个分类,并对每种题型的解题思路做了总结。 +> [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md) + +整理自《算法 第四版》 + ## 操作系统 :computer: > [计算机操作系统](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机操作系统.md) From 6a744d859f74520f2fca1558f7cd03108b4490e2 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 16:23:38 +0800 Subject: [PATCH 20/28] auto commit --- notes/Java 并发.md | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 0f6d95c2..40f0de20 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -58,7 +58,7 @@ # 一、线程状态转换 -

+

## 新建(New) @@ -709,7 +709,7 @@ java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J. 维护了一个计数器 cnt,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。 -

+

```java public class CountdownLatchExample { @@ -743,7 +743,7 @@ run..run..run..run..run..run..run..run..run..run..end 下图应该从下往上看才正确。 -

+

```java public class CyclicBarrierExample { @@ -778,7 +778,7 @@ before..before..before..before..before..before..before..before..before..before.. Semaphore 就是操作系统中的信号量,可以控制对互斥资源的访问线程数。 -

+

以下代码模拟了对某个服务的并发请求,每次只能有 3 个客户端同时访问,请求总数为 10。 @@ -982,7 +982,7 @@ public class ForkJoinPool extends AbstractExecutorService ForkJoinPool 实现了工作窃取算法来提高 CPU 的利用率。每个线程都维护了一个双端队列,用来存储需要执行的任务。工作窃取算法允许空闲的线程从其它线程的双端队列中窃取一个任务来执行。窃取的任务必须是最晚的任务,避免和队列所属线程发生竞争。例如下图中,Thread2 从 Thread1 的队列中拿出最晚的 Task1 任务,Thread1 会拿出 Task2 来执行,这样就避免发生竞争。但是如果队列中只有一个任务时还是会发生竞争。 -

+

# 九、线程不安全示例 @@ -1035,19 +1035,19 @@ Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异, 加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。 -

+

所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存或者寄存器中,保存了该线程使用的变量的主内存副本拷贝。 线程只能直接操作工作内存中的变量,不同线程之间的变量值传递需要通过主内存来完成。 -

+

## 内存间交互操作 Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。 -

+

- read:把一个变量的值从主内存传输到工作内存中 - load:在 read 之后执行,把 read 得到的值放入工作内存的变量副本中 @@ -1070,11 +1070,11 @@ Java 内存模型保证了 read、load、use、assign、store、write、lock 和 下图演示了两个线程同时对 cnt 变量进行操作,load、assign、store 这一系列操作整体上看不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存,T2 依然可以读入该变量的值。可以看出,这两个线程虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 load、assign、store 这些单个操作具备原子性。 -

+

AtomicInteger 能保证多个线程修改的原子性。 -

+

使用 AtomicInteger 重写之前线程不安全的代码之后得到以下线程安全实现: @@ -1181,7 +1181,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 在一个线程内,在程序前面的操作先行发生于后面的操作。 -

+

### 2. 管程锁定规则 @@ -1189,7 +1189,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 一个 unlock 操作先行发生于后面对同一个锁的 lock 操作。 -

+

### 3. volatile 变量规则 @@ -1197,7 +1197,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作。 -

+

### 4. 线程启动规则 @@ -1205,7 +1205,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即 Thread 对象的 start() 方法调用先行发生于此线程的每一个动作。 -

+

### 5. 线程加入规则 @@ -1213,7 +1213,7 @@ Thread 对象的 start() 方法调用先行发生于此线程的每一个动作 join() 方法返回先行发生于 Thread 对象的结束。 -

+

### 6. 线程中断规则 @@ -1505,7 +1505,7 @@ public class ThreadLocalExample1 { 它所对应的底层结构图为: -

+

每个 Thread 都有一个 TreadLocal.ThreadLocalMap 对象,Thread 类中就定义了 ThreadLocal.ThreadLocalMap 成员。 @@ -1601,7 +1601,7 @@ public static String concatString(String s1, String s2, String s3) { 简单地介绍了对象的内存布局后,我们把话题返回到轻量级锁的执行过程上。在代码进入同步块的时候,如果此同步对象没有被锁定(锁标志位为 “01” 状态)虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的 Mark Word 的拷贝(官方把这份拷贝加上了一个 Displaced 前缀,即 Displaced Mark Word)。然后,虚拟机将使用 CAS 操作尝试将对象的 Mark Word 更新为指向 Lock Record 的指针。如果这个更新动作成功了,那么这个线程就拥有了该对象的锁,并且对象 Mark Word 的锁标志位(Mark Word 的最后 2bit)将转变为 “00”,即表示此对象处于轻量级锁定状态。 -

+

如果这个更新操作失败了,虚拟机首先会检查对象的 Mark Word 是否指向当前线程的栈帧,如果是的话只说明当前线程已经拥有了这个对象的锁,那就可以直接进入同步块继续执行,否则说明这个锁对象已经被其他线程线程抢占了。如果有两条以上的线程争用同一个锁,那轻量级锁就不再有效,要膨胀为重量级锁,所标志的状态变为“10”,Mark Word 中存储的就是指向重量级锁(互斥量)的指针,后面等待锁的线程也要进入阻塞状态。 @@ -1619,20 +1619,19 @@ public static String concatString(String s1, String s2, String s3) { 当有另外一个线程去尝试获取这个锁时,偏向模式就宣告结束。根据锁对象目前是否处于被锁定的状态,撤销偏向(Revoke Bias)后恢复到未锁定(标志位为“01”)或轻量级锁定(标志位为“00”)的状态,后续的同步操作就如上面介绍的轻量级锁那样执行。偏向锁、轻量级锁的状态转换及对象 Mark Word 的关系如图 13-5 所示。 -

+

偏向锁可以提高带有同步但无竞争的程序性能。它同样是一个带有效益权衡(Trade Off)性质的优化,也就是说,它并不一定总是对程序运行有利,如果程序中大多数的锁总是被多个不同的线程访问,那偏向模式就是多余的。在具体问题具体分析的前提下,有时候使用参数 -XX:-UseBiasedLocking 来禁止偏向锁优化反而可以提升性能。 - # 十三、多线程开发良好的实践 - 给线程起个有意义的名字,这样可以方便找 Bug。 -- 缩小同步范围,例如 对于 synchronized,应该尽量使用同步块而不是同步方法。 +- 缩小同步范围,例如对于 synchronized,应该尽量使用同步块而不是同步方法。 -- 多用同步类少用 wait 和 notify。首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编码操作,而用 wait 和 notify 很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护在后续的 JDK 中它们还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。 +- 多用同步类少用 wait() 和 notify()。首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编码操作,而用 wait() 和 notify() 很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护,在后续的 JDK 中它们还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。 -- 多用并发集合少用同步集合。并发集合比同步集合的可扩展性更好,例如应该使用 ConcurrentHashMap 而不是 Hashttable。 +- 多用并发集合少用同步集合。并发集合比同步集合的可扩展性更好,例如应该使用 ConcurrentHashMap 而不是 Hashtable。 - 使用本地变量和不可变类来保证线程安全。 From ee032c539eba6ec15b1ea43cb5dbccd0ca2b288f Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 17:09:15 +0800 Subject: [PATCH 21/28] auto commit --- notes/Java 虚拟机.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 6fc0432f..cf9a8bbc 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -154,7 +154,7 @@ Object obj = new Object(); 用来描述一些还有用但是并非必需的对象。 -在系统将要发生内存溢出异常之前,将会对这些对象列进回收范围之中进行第二次回收。 +在系统将要发生内存溢出异常之前,会将这些对象列进回收范围之中进行第二次回收。 软引用主要用来实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源获取数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源获取这些数据。 @@ -224,7 +224,13 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。 1. 标记和清除过程效率都不高; 2. 会产生大量碎片,内存碎片过多可能导致无法给大对象分配内存。 -### 2. 复制 +### 2. 标记 - 整理 + +

+ +让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 + +### 3. 复制

@@ -234,12 +240,6 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。 现在的商业虚拟机都采用这种收集算法来回收新生代,但是并不是将内存划分为大小相等的两块,而是分为一块较大的 Eden 空间和两块较小的 Survior 空间,每次使用 Eden 空间和其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象一次性复制到另一块 Survivor 空间上,最后清理 Eden 和 使用过的那一块 Survivor。HotSpot 虚拟机的 Eden 和 Survivor 的大小比例默认为 8:1,保证了内存的利用率达到 90 %。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 空间就不够用了,此时需要依赖于老年代进行分配担保,也就是借用老年代的空间。 -### 3. 标记 - 整理 - -

- -让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 - ### 4. 分代收集 现在的商业虚拟机采用分代收集算法,它根据对象存活周期将内存划分为几块,不同块采用适当的收集算法。 From e9eb5d431a90f7ecd45ac19f4620fc0c7cdfbc9e Mon Sep 17 00:00:00 2001 From: Chijun Sima Date: Sun, 15 Apr 2018 19:40:53 +0800 Subject: [PATCH 22/28] =?UTF-8?q?=20[FIX]=20=E4=BF=AE=E5=A4=8D=E4=BA=86lin?= =?UTF-8?q?ux.md=E4=B8=AD=E5=85=B3=E4=BA=8Eselect/poll/epoll/=E5=BC=82?= =?UTF-8?q?=E6=AD=A5I/O=E7=9A=84=E9=94=99=E8=AF=AF=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Linux.md | 10 ++-------- pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png | Bin 8192 -> 19909 bytes pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg | Bin 38912 -> 0 bytes 3 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg diff --git a/notes/Linux.md b/notes/Linux.md index 6c38a0fb..5db6d33d 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -1168,13 +1168,7 @@ I/O Multiplexing 又被称为 Event Driven I/O,它可以让单个进程具有

-### 3. 异步-阻塞 - -这是 I/O 复用使用的一种模式,通过使用 select,它可以监听多个 I/O 事件,当这些事件至少有一个发生时,用户程序会收到通知。 - -

- -### 4. 异步-非阻塞 +### 3. 异步 该模式下,I/O 操作会立即返回,之后可以处理其它操作,并且在 I/O 完成时会收到一个通知,此时会中断正在处理的操作,然后继续之前的操作。 @@ -1380,7 +1374,7 @@ poll 和 select 在速度上都很慢。 几乎所有的系统都支持 select,但是只有比较新的系统支持 poll。 -## eopll 工作模式 +## epoll 工作模式 epoll_event 有两种触发模式:LT(level trigger)和 ET(edge trigger)。 diff --git a/pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png b/pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png index 3a69d2ce8cfcd5040e42fa444a499ab0e8d2af40..cabb668545bb098c3c9267443381e389b5b32fdd 100644 GIT binary patch literal 19909 zcmb@ucQ{;O_coeHQKQ5ldWc~361_zW(YsMbA4G}XqD8MEVsxStjNYR6-bEKg^cIZH z;MB^Ihkh>+C<~QfBXY_IlR3SGn&!VJb>8Pq4_a?%lih|M1lK!cId-tB-dn+Zb;hwse=81rIx!l&in8WbLEPYMD{^OZ0JXl-O<6*Y!=kabZaR;?tkHjoqHzq*-q3DTI!7cl=pjAie|!&EFTP zd@rL3(*OB2Ffm+qi}rv1J@!DY{y%R7{&w8TyG$|=&pL2()pF|z@*wzo5tCh=G9&TR zIqOo`*@D~Bw@To26P)vd5V6!W*SU9NOXh)5&KAR|Nw#xU?-)r5|D9A(?y%BrGg+uP z`?JnTCXEPKjcM!dY-Qy}y07SEN(~9-zxCaH>_<4;f0rAGFY-J$;(wMah4+70?f=Kq zT6wdFTRC)^y*y6)lzq57ul8yyhf??~O|;9-6m0%|gDo3(%gL19Y!`{)&#jXne3Saoq;c4As=%yvGcwL* zZ?1Ya#jbg_kH>AnWqS8l0N$`zx)-vqxKw6QNpLI2CIRZ&x9GXwv|Et>)yiA(pGA`G zfBB)WSG*(1aNhcoVDJGf^ym8ua)i+^$DTkU)Z97GS>Sk7@<=?p$S)gw^{2tEW<>N# z3jJ{@j&7Y}?qj^aSK)kVNjqI(8Sc1dA$B#Z)zSpKF<@i~wa%xvriek4$DMZJ+$LPX z{?+&9V%4-f)MGV9rh-+kW;LMe5sCh&Uh_W}+4LvnHlI*(F9 zV_usX{Azc<4m`0&mG|B0I2A1@IxHHgRPdhc*_aG9D}`{BFtS&eXv}r(_1`@R)kua| ztXStVV{oW;l3Jw3rG4_jcWAqisg5 zv6JXl*c(beB$5a<$vZyH%KPciLzzA7|JN%M-~4)33$Ee8WIjTta(}K@V>3JIMQEiL zgD(O9kutuPY+cf)PN*pK03Fx9Xplv~9B=|c3GqsvK8&=r_-n1e)PTR9A1eA>pS!|b z@3T6qd#CHXZ9N?|$UHA*qyip=|oL`N1}uJXfuT=X%`KPor?uhEAPI zZ3uFZ{kIbZXz>hr&IRH4a4d=2vKnIGE@X}5TTkchqAz5#%@BIE?++G`YXcp6a5Wc^ zbhhum{8{h3)A5Fw-9UKR0K74r!e=*-D&Rzx5ccIi$M}RCIp6!Aj!WKWE{?2bYkW&y zmGO-f0oDkECPAhpB&DNMnwJCX%36YUK_eZkXWW$l_%HT=rwv}Pw-#y!WP*Y}l`02%hwt)xi;9AeFDbAOKzGmOO zJWx#XqE(fUxp z2sQ~DLipyehkAsq1%=c)lX7S$&cE}!Uy*#B=*1k6Z)QTEjYA!byO1E^B9rd>#J9+Q zP91%4_onfWRnA-EZ5EHyJ8*?q<^kC7?92b>lLin_CdXx7IS_kF=VHX1y)r8-g6rQ` zq6UiVizwzQRNncRg?|>N)K3 z^FG|6(yh!@bP^29a?`t4bWmu&ZsV%~68tw{@~A_oK3F!FSqwW3$cFJc1HiFf5XzN{ z9si01>OA)AmgBc7DI_-AhV!e(deYAB7<-ve8imLl{JTLPzguHzxxzIWQtaIC*#AFVQJH-t< zjQZ_Ca;eu}fwc8@1B<59IoB;WV#!SxhBo^U{$gjkbOcv$Geh4&jn}@cWip^0c9*{l zJok9cqmIHLbpHVi4QYZorxB5(7Dnzl6=ytRdczM}x%yj30Lj;|;Iwrl)T~q>HXx6Z zvuHTp0H!MnlA{Uymf@B=fGe~+dd6D8JtEBAaJJ}K3Ajs>^K;YB<+5)f3&Izxu@7$9 zTVKNqw@Cg%W)^dq5@*nx=@^kGAUghruJi#(JQ0m;4wAZA{_Eo(=-8=`v7WJN01%3% zhgP%XbH(blKu5YWRZQ;12V`Vn&9sL7=BxJ}zGZ#4@z7G+-t3en+xN) zOslD?u=lgX3bgEv2kpgG$BAzMgH^w!$qo7!dt?;z$>~Hj#GmGnWb)6vx}NiSV(|Ly zOX_?F++5IhUE)!+>`8a^#t2^xn+`I&aRC@`H7u3i>?vd54ae4MQ*uR?P8D{Sw zp724dmex#fn+&CkhTU0L{ne~R`X^mqPnD|Y+_%5b#hzX8G5|<|^`A_Rp6&+ZpEuJP zPBL5V22-_5K0;^7%_d#pYKH8A?#+MdcaS4EPsw?0dc~an6qPn77wc5!X&Z9>OR72T z5-&27?OLu++uZIzp6XL2n=xdA3*y{qwU!gB)PKw8LH^bAPo2K2LA6yJOIr|rmZ|wK z#c5wor}aUbA9;$|{n3AS3g2|7`xCj-qb{IeBR71oQ71#;Amw^GYcV}nFKHioakR0K zt_trZlg6NVgXd$G4pa`CcKU0J@BaOL`S4oq zU)bKoZYb5~ao}?Q`EM3_j`P2g^X}x$`~SDojBMiANc8Q+-@LMxk04>Ea*4%S%DH|ge1BJ9<97FImxc|z4!iUnjw;iy5&H=9W(>RU%fY*-qmdCYZW`wB z$+Y&9X+!Gkn<+iJp_Py60Q~5QP!rM*XS3kr@4WV)cK_u!3#0|Z4-~PL^wZJeO;lb7 zZL@t0=|3-ZVWY%%*`m=_`0S_CEYGxltoQBJlCofeMXpHOU7?U^@coabHZ;z5ri^C3 z(ZlH!$UHdPEqIB-KY_$_u>s%=djn9uA8l-t(J$SB-23{iyne?I7i$TX>8MqPS-$4O zPpe#tK^xE-8=aa3*ZH+u^_wYCkCwT3p6QmAC?VuX)lRIEAox~cmJL$&{ML4@Kh7iN z@JwRN%0q51J-OZU%{;9`X?B!g;gKg!5%d#z)k4$h9P{n&)gNPVp)7-~gmZaAS!y33 zS>Vp)S}IMS$fr92#(Q#ei%e+I=U0j-7y+EGQnN@4=Cm

7oVrMCAR!k%;x1dBB_A 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 B`nLc8 literal 8192 zcmeI1e_WDhyTEOkX;Uk$si8vanQX1;&=M_@QB83tb!WA#rSg_ex1|!AApx?~H?t53 zTWV^|wSH`w&fHY|#Y*D|QCW3L4TTbn3Xy;WkzeO2TYJy>?|jbt$NAA8e0ZMwbKlo} z-`9O#*Y&-wr}WeK7>`9O7CAXNdBozkeCFiz2H@m0kKpP8wG`Ngw9wzY+|Ob*IW-LW zKZahMGjMS@C#NR%o7O!Gpm(?Z_+7b9PM$r_fAc`%#WW`;m?d@#ZhL-;W>j*#_VIVa zI&;yzS@;`Qzc>x}Vpc!G1;J7`-2c1x)sNm{edt#?{KM5FRYBGFgRqm|XZoLC=~;)W zT6xb`7!4Cwe@n()`u_8a`}^q17@|NWYrl0_g*i7%yZ`;q7Dbn72i8RIZs*P>1kZCi z?dIk5eJx_1)4l(l4-r?(kqN=tu?~}vHv9NOg^!O9p$(%NY0luuEyu^(+XieFQwX6m zUuQn|bRl1MCW?M&nr>Yo2Pbwn73>X|Xg^MQ_UPsWl1I}Ezf|;2H>PyWT3w09#ERLr zF`42j-_0umS5p}lnA3a%QA#oECseIgMY`8b)S1zQs?9JLtsrUh1?SkL3IZF)1zi=> zP2Hi)gxbwb9v8fT{e=-DU@0cP*Kei3GNx?^04UWY174v~gp+pTa$1!uh6ls(E#4;B z&~{mHL4Y9sbB;1=+?PZj4bCL;z-2&9IpVOlvUGjaa#1-$*i(n_o0upG%AU{P5xOkY z*?1T91yFv=C_GH`uuF8GI5%J_F3@K%j`O>lehUv?#O9@ECX7Z>1;_o->}7<+R#kT2 zI?^W`Oo4S~_1YF*`s6@3{<8*yI~#K_j~cNM_XhHY_jJ+1#SQU~NLK_?NPzS<+k3Wc zrT+?~qXT)jPxi&Ii|F8ZfuBcHxMC=Y{bJ@fnNON7Egh_>hSr+KQNl-hV;$=mC28-Y zi`(MXAD~X1Px6)`{D$II4E%EBCh8DFj#H};SAbZe7x-d zkU`x#bqclST3!(#U`>0gbDwWc_!Ez%WP-)yckuU}NmnEY(ZI^0H0qVXk%DnlcIZ-A zYQO)z{cTj?Z(g34*(kg)?>pQTv@`)Dtk!-l=Zx!!=&M;mZ&IQ{z1d+>iI zCfN0Q5NmHjePDQW^Q^dJF}(ZCOo8^Gu)i__o|EhBc8*{j_o*Pv-l|}tgtRD9iZb2R z>l59E!Y=fWDBP4#(exUs?j>LIT5`*Y9G~Z{qZ?#J@YTIuPHo}L6e~5uf8HoC2d960ftT{}$FwdqDS0%g z`z-)1e$_qOh6F-VI@>xK4*MO`g{`B=sek!Pn5-Im<$*QR73?}R{X~EBY)qn>WJHou znFJL*SGtn{?qcLZbDnbNTF;*9Dpg-Xl%iD%kWFCdn|vbezN%ShY=Cr$P%WX~dJEV& z*V~h;^Eg#;eHx{k_65vj{J1`Uz7R%&0Te+OI+&2QIbv$~2xnjLkTR}AQW$;$s`u0g31qJ*GOP^aZ*w9-Q?+%wz7JGqFxXQ8BMF5ovHVTw5v~_1ev;u zoe5-Vc(HDk(mM2of??97`86kpQPtVhx8;F~@`R}O(8aVUbHtsPQGUE4!rU=T3nnEO z1b`yOp0`@*cB>f%icQxe6lyrSQIq%n6??tlxt6mBkiglb84|B=MtGUkv!|7^`G%-m zCd)%9&U5zd-$2nfuue25XYg6MwJfBvQ_~i2;Imp`^2Lgp_LZ6FE1GFYmi@!K1T3^K zE-q(lH?D>Fy9Q=l5B_kl8eJT*M_9U!i5$j6mL%m$^G@c}PSEv6MeG5L8yggPKQ$It zgZ(NW6I+VOe|rCkekMv=UH!Q%!{Vz@5BwH&W(J(*N$6I7CPDs9JyuOzUYN$(?F}f# z;XcM0mxu$5crr8#DIjy`#zB3tuj!|T#_;cSdRf5 z!X4|d!{jru;OvIlX>!<0KmK5?dBg8I^4~i*sFef*vQb>queBh zPBrt#J9h~U*CRr5!kpdS!R=ii^VjOPs-Ru2#6MgDoOCXI?2o(ll7SGY+Est<%L_OU z5!y?`FYGd3oz~$C%lsDKQQE-N z6tZ(EqK^F{cC=r@ajOr}PA}zs!>q`fj|gHf-*!D(*z;bP3k$IncsA!<$?Nd?c9g6B z3hJ|*y$ZI|MV60ug=3mv7hkey15#_4>@Ea<3d-5wFTneNPZ8ia6GQ7;!V70sXvU(D zMGrpBWP<#`$pxaBnW&YApYsJo_Q~$tt}=#uDauP2`3~N5EGUS*F6yq#;01hGGPk^a zI4@X!rc!ZX6)KgJIX_5s5>YBm&VV+s$K!?FK5keblDWXk>%4|E3&4E(@->lu?j&h` zXP0y`&P9|L!};C(;`*NJcnhG6q`aF}Kbd8u2sFs|rIG7a3ls2qlu%6D^u}}ig3P#M z8NfdQpIudvibDyn9Tb96%c}2D`7L|GWChH3aR1QF4_5NS+v!^EVgF;5-{^Iwbc=r| zrlszR4?wLLySo$sH&XP<>Gsmb)|AeC62)P+T`Fyifhq~@G^nv zP*L_XqV$pPkocf+{9&*+kh{hkkfMj`MlRVlCh(%V+UeH5$5WqhlowV>J><_=h{!c( z$FCMGOjPyG9I`wXrf`_5ds)58$S@(rz=jqB0dn2&4Ysc-yW9kq|4mW7uSQeNp+gyV z|LIkDPcgQk)R0urWlKv9!RtGB*6uUxBsG-f1{bEC+OQP(#G!G0?lgXE@hG$YnnukY zm1SG0t3Kbq9c+i-+`rYx&J4sBScR}?P7UvcNBV}6Exzb0;VH~hpK`V{61H$?ClFPN z9rR71$I#nG?TLcfJ9p^g9tZmJn*)$|$h&drpKqVE{i_(Ndl1oH00F>1+!=%yqWg>? z=~-WPZYRDwxS8|ZjafoN$CLQzRD5O;kk+>SYLibmx%LHWxq-5;6q8+5;{)D|lg)HR z*9nEKeo7bA=8t)-J&7dGi`)9m_?Gx|5EOQ(Z$(TUOzX6BNxKy;+;i zYy%Aw`DX$gM>iDD#l z8KEiYeVz-TIuy3KmBK1i9v5C1sV?v*uN(v|r1U2o&{abex4hA-it}m}sVGk_M9jsA zQvTWekVeLEltJBNYr(Sjk?3D4M|*RG1NDoz8dPq1zq-{_R@%rg zVC}cnU#-aKIGpaUG>m3<^CQ8@jYi|T>)Rz*_}N9=ne{wFKC@CsVS+0fkAoClt7Bps zG6bKnsOUi>)OuVcFs;x>=$ctPhRifP7y6!Ghi{LL*!>>n6{cBY#j=>wN%F`-09{XN zhM_N$^x+hqCJh1kqwuvkIcMux)G>reg~|T;j{1flTKi<(b){M+?T3m&LmRrgbw;U3 z5pXCFWj0`*-4lZSiit0&je9!B@<*EHVrA2I&ht3lz35mM=VBocA}K%T8p$JjaCPKi zg?3z_Zp-Yb5>8%^&d%|hFO@RcVbNQ%2b%>?-5(+ADFGCAb7{2GQ|X`A4)FdF1<#x(x&H6b{(mt zU6z6y*Zv6!=b&3yNmBIr_0*kiv;Ps@jn=LJD00n&LLto3>oo?kg~;$MNr}mRNX2m_ zxv)1WW|=ZIv5`cp$q&@+qY3CtjX|WCkmPCC^(yy`MNQScqLHyQ4l^v9t20H88%w5| z$8H!%E!BU^NA>Kt5mj7ygrgO?__xs7YsnMeFRg<@G$!tAy0Qu z$on`jBt%N}P-ui=R@tAR1%VkC_NXmVd%Y*0-Y*kYRga`_GD9RI*`rbgt9oC*ucvOh zuI#`ljiEoQ6)c@E9rA8AwSy`FG@U^-bVANHNe5?E$WbEUTK&!dTuyC5o-z7Q<~-1VD2;64%Y{_|fU0r? z$3^MG9b*grd3ynvGhb^}k_y|Szd1*bi|IyE6Y5I>ig-MW<67|fWx%}cSdey+zaeW3VDId`=Ui*e`OG<=ne)l>1pteo zu7NIqjEoHMnDhfUp9b6pP>_@V`6j(6NpC6|Dk@4!DmrTF3p5OL3=H&i^z@8OY%GjS ztW5OuEL<$C>>Qk&oD9s|7r8htvT<;7{CN>F3esmNsc5OFXgL_^89Dx^U*}%|tTbeu z8QDc?|0z5R!duAaVu;r#~>%`F~TS~)y*eCFir;_B_=>*o&%2n>&ijEatljY~~? zot}~T=55x8g2JMY#U-VmzEs!L*3~yOHg$A%b@%js>-#=3IyOFmoSZ_TF^fyfE30ek z8@OM4`v-?d_~Vm5WaR#&LBUE%by@ZTo31T{SR^Cfd4}Vd0T#owTs{VIXhE<+H!F_gQCZu;#5P_A)#H}3`4r# zQ>N3_1|?)EN^YsL+u@4V{j#KUJsj-aIN!f-qQQhw(!>Q6P z`ogME10Ehb7`2Qv;7&f={$n4nF`u4LSpj)@xg3p#HV0WYI+w%6PHxz(Hkj)~K+mMn zcG%{Y7c(B{V3oet7Ee-DNA%eTDTVhcgj_28#?_)|Q{YBJNpcB zm;+#@^N$V(d}p^6>?J|w6ZoX?10SR2g@*Lx4@u!;X`$3!IsmYNP*=iEJFBjd>{s$H z)7>bxRHoYE@HKbRv+-iJn4!uzt!)8*J2CvrGFMgQh@I%{j}TL%#-LmFT7E{c4w9Fj z@ozJR(k!Y}j%ZD3p`p&7)Ngc=CDd+r0=qI-LN$OywlivCc%VO#s+Xt$>j34Q1BN_I z&H-N=&H+6wn?xQXbo3cL>{vzX9Kfwdkjw03KH)kC{PKbkr9(Bi|9|{(rGC3n#jEPg z8oDDJCe8NmZHPC=PjCX>huT=GgDTYrf$*qWjunC12IKBeQm<@zuDE#=kZXLZ?}Q0L z3edY<^d3>UEbixk+U3^B)u9%BGlx^J%Vg-+;&h_6-yjs18`hjDX4gK%0mT1-f!$^% znw)m&Aqc`Lur*I)1M($4?o6HR)XF(4>O+T=Ot+On({padj*2A@zQR8arFacH&rnC- z0g{WksOZIqId5@BTf>k-=MnssImQR5X#2y)x5I@ok@sl8&t5U)T#P&ASf!?>o@m)? zhf(^-&`)n7-1Q0CK^34GyV*I=*T_lzEpwS8vqzT>$wSq5dqBJ`9vB%Q1k|a;gdQ>1 z0PFB}x>{wdb8)UNPs%pryw@{aszIP+Fv&?R_w(_RohXxd2h4qNX=RnK&$b8`lFQ=y z*R43fwepb#h6E>#s=EWH3ixatd^@_?lo3+@a9CkmMz0}`(N*nH(WFS0-gP) za&DG-z@7Y&rDV*4z>sC`p`J(i5;MYyyL&QP%2t2{ zqEg6Mjue)2W?8019{q82zrmwuRFOhzwtK0EGaY>^j`A_vUD=r=_ zNyf*gCs9QxqkukH7X@H{d%5816Ikh762C!n=64cj6aqjXDkm zFUMYSCk4!=7dx!h)wLz>D2QJ{yH!F$y*{2{-0izAz~qCz`0Q zVQ|^YdoEN}E22#~4WriyV}@i|+dD}YxmLH(O@}GzU*c!@C0SVsMkB&5;XM{?`8t)5 za(3DuwUcmDet}5Qh=;HdEq@Qtj4>~Uq@xnwt?pHDyagcbW9w!zBy{Rr%?jlTNm((yk z)MCNMY}EI;P$ll)G7t%{g@7Z-92|~fdpXxL5%f?U`H#o$zWVSz)*|A7K1eC`9Plv9=s{cNsr2+ut|3i7gR9?AOw91x_aVSV zYJwP$vsQ}FGy}EQSyo`Zkzw&F{Ouq4G%EX-H&<*O4qb4W(NF{L5_mM!0z>1QD1n;I z$0Fmc4Y|_tUi7QRE?TlPUAOQ&9p5?!R1dZXJE36-<2wp9qx)}K_-cp;YvH`sv z%A|*ase-BgT($(6!HXnFD~RJhJ30qUnwfm%-1d#K~cJP>$?5;DZK6=5+TQ@VS7{w{!G%nZ9bn_;fQNBgRK(DPlZn+1 zU|4+!$AksfWh0tv&`sE8L8GXi04-SC(;QP{Ux z>@>0GqSpK1W*dBr?z?SvLoctyNi!YJAFlt~sF&ZP8y2VP-yuVn=zp)e6%kwMP?I!m zsuNI{dh1pw&uhPfO1%zPOb#2d@JU-%5W#1-dFFhZIP;R+ql^ zU-r&=o+C2yWGvG(_+FpP^h;MHji?ruVRaw=6G(mzaGt@Zb>e35*&SIPNtxaGm3fK2 zwCXp%+P&`+39$!>rcsD0QK~F>TjsK>dph}?) zwX>z;?5O?ycc%`DdxM=SmCw$SeD}PYmy&Ih_}>xH?mOoEK>_x%+cz)TG2t)c*ie64i?sIb}_^f_)m{B{no#f}m?*9jw~59gS*&_3@Cn|IY#%F=(qxqvu1t@srQ2Y zHu)Y~Qa;V|{Tp!4?88@8^>xklZmPE{+cC1}_Tmf2IlAV)uYfz8dY4G>&L*S^dmH1Q zv_DJVkt01uP!2|)No>%XG;+4&qP+Fkqikf=%x?jxLizU|1#)*bK%GuqHUx!6HBstX z`7SuolR-&6xE5z{(lh zzR`t)J>Cn#M|b)<$xUc(RNimbs?Ch4K}2#{<;MDC2SAO=z!s_@ZyCEW*6k9yU%3M= zqB*_DHiF42n&+oLU0JJLr;I@lCKTA6?91v(naUg#e8S?{U zu`c%bZjb68%lg-ukDc4B3)rRuQ<5b0I!K}TPJJ;xzWro*dp=5GIuY1aY}@b|yOUby z*9Mw&ugDPZD0$-T#k5ZUqIjZK(POIY{#c77j@rQX*|-Q!sa3FwA?iw(c-0@-d}Awe zUK-96!)@1~cjM8yVQE%L9k%AbHk`MgKNq@eg>fO1cq>K`+Li0NcRH9nCy!l?^bJa8 zfvTtW+g3M)p)P)CO_;hPDnXg!oqpK@Hjw_U{j0iDJ-!*+wusSsxwYRcrQAysOUgEp#yEl_8diHkRr#J9r z_i+|4Yr(Tm4vqTINMCy2jAwn13f_FG3)R@j;hRL68}`{^mzMV7e)!wipB~Y6tYiDuna^Mx zTTC0~XaF#zS{DT&!iZdWC-nBfLC?$L;3(_SCcnM+NAFhgvAvqQJ4o+;hOV;3wCQE(Bb*w4_V#bEJCtxM5YO*=T+W zakl|~f6MJ1!ZDISAYP~C`f~*f zC z(~~ykxVe5$iQD|veYTZ?H~A6(w3Ns~=pDSBrZ7~h0h>L?rxq2(%7~GMmO4m$pVZK` zD9(pV<7B>?#)8XG*vhMZtP`y)a_~mJ}?49fUkKd8qWZ9Un z{aCu-Cg1fLKiYoZMN@dhO$ZU!Gl6~<_lt+;^>gp=Mni$Gp(+=zltLB{({L;C1^9V` zW~}KUckC8H>q>LslXXYSJj)M}{rjl3XVetJ;o+t@;1*(0CKiZIaV1{INvFxgD$$uBUG-xJ&IeLfl7A#a)Xe32S5rb669CFd z;16ks->_#n@p+rbCdXMsbnTh)ww2>XDADbkgy#2KX|c5Ks$rZ-x{`0kw4M&KW)CP^ zN2*hofwv1fi(Cybj69Xw-c05yd9#`3Q=eH(X5fZnNW@d4d0rP@rg%6$4!GsPJW2L( zdfl)88MhfFtIsCyCqlE~rxFULDe5@DIF`A4R{)ZEnACusD@Bt6UIa6&L+wKTa!pyhcZq4#Jpc5YJval`OS$9$~l|>aDc-DlqGG?Gxccg=@5xy!!5Oc^bxlKUh|~w?kdAOh;Cjx zFr_~SxIo}{af&^eg^#YGSw4{euth|&i1Ps6HDKOjOq1u?U}$wb%)w)!Y+A#814A6y z)dm-FjlPc3HGs}6^<3vu^X@gAPCk5w^Gnz0K1{<1Tw$~@#WA2JV$~;p$sK!NWo!46 z|8^R|(S96=yp7fh3sEAeJS`70+D(-BGQPXz)RbXuta7=o*!K5FwrZi-1tjcLjAYM(2f-sPBallGoK=JPXKWLJn}!m z**`F7R_f!HZw;^+e!30VprQ0pKPt?c;EPHuic;ZKnu#1^t4Men$j^Q}R&$q%b7+6O z?ey{Jw$3W3hQ{ItDPdEUl}J!7G{c+vou;PKJ1Dop zdf*;PpEEb{T7eUUoGj`PpdNhTi=Ra2_ce z!Zv>>g@-xOb$WPKw$ov&dQ0pd1d`Qdcudx#w}*5ZGp(CqZJ+-7h?q%u5GJQ|^3v`= zN9{|1!(`OY2{k@_seHaCkz5LbaTln6m6m)+(HqFE%bJ;9Z=)Q`|J;nI|2&Zjj;xOV z;d=*u11{Qpmanei5CC@Z{J8mQW|r+zZ25~3RwPg{c-oE=S4K3dZ=XLoX(Ck=?=@XT zri(sxlyG(5I?n8w(`v(6#6UTq%4iMm2W?doLQP5|)&bh-frP0WgtGN{ye)!FYb|L* z3(t=r=me#6zBf!NY50j9P?rSyulEIok)wk;F5_IEp8Ytob z9e8g{BDgyTXteF$=?$?vPF9ltE@F>gu!tj)z=lgpGWsx6;A}RsmIzq6I_$M#Oly>q~E| zq>#F^!uM!SC)Un|{DR-*huRu_m&j(as%}zo-jlNGaS_qqbz6eWfA_U~kPh3)foP7M zYTQEJwE$bcaW_{IU*VyMv>)U5(HtXt5|?DK82QRTC_kkx@5zP5goVI&6vq!<|10f7 z`1(VUcVvB6Lb>89z@=7psO++!5~sR;X4R_{V&C=MwR!$q z$fU)eAgR7J&gw9ThK4x#Hs=5cdIuYoSs|SmfN5nLwRlF?1U*T(`odt1(y`tNTltFR zD~p#nne+by7eKP3O%c}ThgUlXfGj{KbQVp>NT@4`_Op%kC$?20_BryHeg7`Es?GVV ztc5hAG=oVY0_*j2vJ+5&JXd*}`2P2t&s=QE+2j~*m3O&6+_pXk&_dnNZtU%I;yA|4 zrSx6vZAwC0pp4C49N;KUa)mh*D4+-~ff}|+jOUNbtc+-(C97-W zo_f2{+KyTalzT2We_(dacPMbRlf;9$yJUEw);R7+Y2Rl7gO?+mB6!G+;H9x>hauYHEUC@^<)ew!uXcK0gC;B1Qe?E&LW;5{>tINoVdEFLOz zst=ivVFA^yb~e`f4lm3>Mk*=IzOWO!a_lJ&r*`ccPqpyb_i?)Ei!O>rjWU9RJ*oqd z&HCQU?VO_`&Kl`A$wM^^<8ZrSMCoxt5RL+4UZlA71>)Cv-&oS9UhK&69!-`3HR8=L z8N!7YI;~hz8n!tr&X9*^vN z9NtRcGG(pQ0u{jC-!&xpG1IUrWaD& zR_}F=^}hHNtS{CI2nOpwEP8kO!6DqZqp+=-)>~jT>wY)w)g+}$D*7*Pg+w(2r*^w| zqvJvt@TL#PrJuHpNtZjMx-6+UJt+{$0_+<~E+Ha9XmRz)nhcNd8!~ZrBK61}^NnTu zh6a}kvZR2A54x4qGfO9~QMhV5l8a%57TnGt2 zbZfy5#$IayV}Kma^{DQo9`_4>IRm=kb{VecmEkgb`xkY3=)DG;`cCGQ=MIHto67a_?6}x zL()?fKHuJvto2M`jBs%1i)pWcHDxdGl$KKi)TkWd*kX@?v5=yOS$u@ljB0RMnp1Iy zULS`;GeGm%*W*}$5{mJ^a*e8ePBnDr?;)}_?^!pi7-oa*-G#4{y$f4-f4o>CAWmV} z=6?2BYe@!MPwdPk=mZOcltU(gzqs)vn_xdk6sjr4^^U!TUMsTmKD`O+QzXGac(%tG zZ|&Ons#Xm(A!>dMyL&fu`qt!vhNv?_Mg^}lVc}s=4PWP1eImqb zLtB$~vZMNZX&jzVS6*B=R7B5R!AIjvi7dH5f=(?i!rV`j4e3}L{)e@W?CjSZeMw0{ z@6(@3DG7qL2c)$_RS4A|dH!6{mlW#Q>W)5){+4FHSMkx{gNlIezD*M5vwIsA-fHhF z@e1~Jimd>!%fd7O`oW9;+o^mlX|ZlYPKK!aK`e@Jc6=G;W2}dLd1X9fZWndUv_I(ThDbJb4n74NxpJzQN^J#Mx$*0 z05R3v!Ml_;aCxl4y=c6rPP#&d_o_o9505UzGNnAZT9}R#DCBz^V^h>5Y7UIjIcOb2 zrfdX0E5zECegE`@`8vb)<8Yx+O$R}B90}nZGS#y-LYA{l zZx`42p1T)$Ce(R$yR2)~_;&+Yz)oE#$K*J81q^*TSjER0#@OuQ<{~isauDU6EAN^y z`|iRGlqX1g9ri`okywR65%R1{|7hink;@Be_sRfJsm(qBSGxR9^8C;*8y@s;* zE|y$t`r(%t(v-bcwZYKjld0X61J+I~icjo1*}F--Er5Y@xM*@?ZHps)sfKDjSRqM+ z`az9P_83_E`OCYm5-)$YcnO)t%y-Qy_vDCS=Q2M*n$2J|)*UG`E`t20uCB_AEU&VQ zZK&>fUC%dR@&-MIz`r(GBxGx=CU^n2j12{>e*AGtKFHgYuUQuDE}4Kk+FC?=#Aph& zPE>j*R$Mu{8|ikyyyd1{agQiUcFW|GrsvB9!7(yY27*OX88Y2vL4sgW@X9sb!axq? zdMlY|h1&uCoc#(f6Tdz`_I&l}=2!I`W3jLhNvQ7G2X&2ny<$j)4E47hws5PqRQksQ zzMgXA+$&1 z9vCYG(CtXC_Su#^^D$Yov48v2pHKk99M=6i)b&sHadD0 zB@#+Q!8sSwANVsL4yD1i&J|xvn{{i59?0BP_nhhHe|oaas;E9Pvn{g0V?1w3cw|>pY{-#fDRZXIO)Wsf74hDcY z`N6-b1OE#h%iM7_PQgvnfpMb3!A*RVA1R)oMea;t68G~nPB87$z|xd!hJWg!rfqA7 zngbFrk@$BD;J@=eBr>Ozl@6{c8XsMxH}Np z1LuNtb`USWSC{AP2^UGd&AW?Q{z|Qt4(7d|)ndlvnUt98Jq(hCO5nF~eE0C(g%G{& zLn}Fyt5TXtnoD>6RUL=$+#~RerYO{CgvhlfW-(r|Tj};v*fB!T=Uvd#2ZqwpKMF@J z^sIG4AkbUqfUs(p5y+?kw*DmnSSnIqZ@`e1(MlWI)p#7&`ExH}afKh#_P+kCf*|r) zx7uaya_ZeYwaT|O@(!sNh$^K#I}a>kNJ%;yyc+Rkj?g)v-QyhKs7Fv73`eZ-U}OlS zK;ZBJ+4k5!@2nzRJi0!C#DM@^z!$d%Mn!{5)|geUZw?KJ$d!L?aXPzCPBWj=S_bUO zWgvZQ>@sg}!IxAc>W6vt@7Z~5+ptp!f&63hSfnN?otEbmgTRtp z)f5SsGkP!Vo?L*$p9826XXyZWyR!^}8W`ijxM|1ud9+1Y@%4yKsUE+MIk89osb0Ms zVp~pYoa%`cR1{yj(8^>=>#Ur^iX>dC)}LU5B>gmS`jYtW^DU0Z7ez^Pv|l+}f4>9p zw@0{3Ex({OId3}Rp+M7O=?liZ=hGfR{p{#*zFwwKUZGyzK+5@D8{8)u;a4m~(mP`IU{vnn-zE8BgS0ZJ*y~z;P4lVW$#W z=*mBdNjC>sVGH%75?3B0A1KuCC=n+&ZaoIl6(u!oAgN17`C3g%)AF5KO_4@ns*K>0#o0XDVKFcw9v^QvZU4D{o zFOeJF+am+moRih$99L&nN~{DUt;USXt>zTFblnt}QGW$a@fp06_ykq5b)h-cs0E`bN3YX)O(H$l>DdN&JINGTx_hw?YY{eHtTl76N!piWX5B$S|m7?N($sF*h@ z;S=z>>OW~J$@Qwo!I6qqWLu^8BIXltD%q?SOPe%m8)holhG33enUMZ)g%kf7U58EP&gkf}_nkPoQjm(rf&3{LtI{julV87XxoBVFbtEVm?1f1#bOEmenB}`tJOHULcm?3Mp@hL%h)6S}*TmGBH&a(Z) zY)@8Z_HR$0b(DSjOhGLne6Pt@)q=d~Zh}v9+=|&b_9YzQNv6^kH!2%=H}dOtB|Y>Xg?3%TUP7h4C`yucP*PATgdBr3!TU)2TNK)e3q4L7UYMVIWrYRr(?%Ii6cxCH$ z_jp^oXvR3^p-5V;;i1z#CYk$DvYB#2Cwc~W8193yL|;BWt+<>1RwT=MiDBjN%Oeem zd4lA8B4Yo(!Y+YJjFg|Y>&w?2b`A`@f$I0Tc^$@CS317ULc7I8rHy-V;jE~QrHrAZW}J_DjL!xLSKRR->%=QB zcyuD71M|lSQVSl;5Pvgq2W2a}w~Q^#rVnT0m?RtiO~y;|C4LzvXBwf!c%a4JX@6F% zSUGNFJMCZ1PnI)2ZxJ0bHUH~oE&ODggi8vj#6C2<9ne0#3AJj7Qn5f6B_Z#260ckx zN;n6ERJRzAcz}l3kPOsEICf=3K=rDyL1EIFA}B$2+)V}mB-Ytq|6}))8}CHrk+4c2tsF74 zh2+xgN2MdN&+P6?|ymppfJzf?&cb}u|C4Oo!`(hLy?YWvYMaaY1-K7*lP>fl7GB= z?eBKIk)eSXwU#iNq-;ZL010T(9R*^O6M(-wfi$qWmOmr;pw_<&qyHZHkrRy|g`a~l z2%5Z_F{nJ6lqU%{XvmUOu)X~-2erP#U&m_p*tdt{T?XgQ!=-aT&GJe#b;s0p?SPP* z56D)>#nHh{CCpMf+cWujXjp`O5~+n~X+Jk%o=X7~A3~2UPJ;5F-DHe#!lwLzQ7ILs zUh5(+43smgwnyLT2K2UmyVJC3v1nVQ8Ky20`hzXoKis<<|f5Iy%FtM2gR@d6^OTEeISl9YRUwsa! zyh_q;+}XjYFXeDe#x+DWsMi#* z&U<@P_zsSJR$`je?qC}1$u<|9V_B4H6E(B42LG4w>#G($`xaYhd)V$2&xJg z5)3=LC^-Y}L_FU;zGQ_w^CJZ(!(kt-Wi=v4U`yOi=K!1gBvv}-YHm$5Ayo=QY$6G> zwhzDkA0ACEBIuvwFlZ`n1Z$wRjyY>QPJTuI$>lGzv?JNk6l-0QpyDu6*{JqVukH5$ zUUC-vTkYg7b<;oC-SVF;o`0^nTmsczsdX$OT+Nx-)2Ty(%$ws)>S|k_J^Ev?p{)5T z0{|632@E_yVb1}mTZ>)(O;Rf)x+_h{OE~`4BZ^s@P1ORcfalC--j8K_n4Bs4i5z%p zGdw-6tRqA7YTeMmDV#m{!=TBy!eDLebDqno&u&%E82x&k7=;c`mE5Ak_a53ODl*4$ zAyd`@b(TJNix`&-V0hq_<%=jtq)6lqF}fFl>>#JV89eGJ!UNLQdxIyLAG<&}F%oRI zY{!SYPc(5rGoJ-)AWk?dg3|wHN;!M#I}o(4f|pt*WPF-~t?#`h`nPEY_7cAru$AE% zkdAh47!r))g~cdZ9s~&`-aR2kv26W! z8-Bggx>HYLb zteA7N=5L0^q90Zh9St=T>z*f9O2OUlI^jU2_jkMHuXCA?2uZwLxntBZW%io-$2Xpf zy^05-(1TMOTW3^oa7u;ik(%a!auRGH>$0G}AT>phnrU)c?=0nCR7hLq(Ipg67+ zOzuTUZdco-`r(%~#7Uz^6^_;NSDwX673j?HM~c3*PnBE?JdQrJoKQfpKpMcR>BPn| zNWT?!Ag7dZr}9(PdsTb(tq6**7LJTLg}f($p>+Ru&-^dhGx5ZU!NPuQ$fD`^bLj)E zZMARDE8MQ_+6@#oxOGz)CeXpZ8?1hYJHrLeKFDl)s9*l%!aEohRq^pg#Pl~`(Ha*q z(a)@L@5>wbk7jQQ-o_%@Rgc;ciGmEH1Siijlapy1?IMlb1YeC?Lw872-{C>3{%x&h zy-VAdSX2grUxI|8z!4|xZucN#9|pm+Nqw(H-fBHCI)>CW*;j8*-+WD0kIwx`+}E^J zGR1=d0Ce%xl$7Q!Ta+>!ypQ#WD^{gydUDiph?KHd9NJx;(Y<{^GvVvQ+$oqD-r+g2 z$s)Q%m9%}Ge<|9knaA_KPEf7BGczLt47Q9?Lk`uF_+7l3v{q1~s^oj4Vs6wuP5!$+ z6@Fu6*Y3$kz|Zh~3#D5ovNr|ubpndNg5tPAY)~<;tbxy?g!><6m9opGe15Io)O^g0 z{d_68r&ao2V9&AXVJ@-&$5q8yTN#UKRkj)WF^t+oxy23ACOxDVV(A4-+6SHkd@RP( z_h8$}#jcrI{?W@>gAc}_Jj^JQGLJ%Tw&NbzLw~mj8jv*K?(HyZ!X$M7ehuH@2%&PBW8(YfEyRQg}h7U*dZ`gbm1>qLv>q6Hz- zBOGyX;7bZUiU2_s|E@Ii&uMNH{Ea0Fr@^tsUy-&4%{-OAEGF%4WhkXTk@EESfDM z*R*~??4-{DRUV|Q=x`?I&cE=QEPAzA+T_4Z0`TtUJ&alePCf7&cAm8BzHI-Iuzl4_ zXz<4mUeh;B>P@G-jm^7JM9wjS0dWKGuH&UAM!_?j<_n3;rU_)|{K#@+s>NY95 z5s4>7HPk+u#Lw|3`HsHsPad2Z{DuKemkAe@=p)%}8H#Qc-8{-Z?;nYHMesBZ-2EKI^FK zZK*qa+!Kn{H&(4Lg8UpiOMlKVX{=FvI|n?Q?tc_=&4rZlpsA0#xA8PXbnF8zqA7j0 ziDs&cWgOBG1%|aX?heQNtrXPYWVOwm^0Z-;~ zN#I&qa#pfqA9$=T!ws9PFD6Bi{c%TzfBAZy|7$k?#q9pq%_cP|j;~!!F2)*Q8Kf5J z;gsvD8O7JQPu{;#>!7I@N1Nh;EV!}Bi+95@wkT%=D_m0qLXI?OXqr%zoMa{#RSI8S z*8Ku)l;-)>44G6}Y2C$Wb!N}=LOQ<&w$_fZ+(vI6yRRnMP8V6ka(>ev`rR<>TWXzhWyuJ63Gl*8`KxvSyxD9JMrD zGssGUed7 zPf(S{5p~HDXHr`OQ!Bqx)8co&ZNC+sH`h`Ymu73OA1BYko$v#=xIJ{@ZsdNeSf@9> zz!t~(V`9Sm#SbByZq}5y)6@WQjl=+r+^uDt<_#hc;P$Sl0Rg&I zr%#m9N?e~qMMl<8BAC%ft+v{fuZ(*R;)LYIZTr*GH?6Yjw;xe=H9{5h@Xw6>I>u1( zWox@!DtiEzpVqw z{zrJUXXc1vcOq_%A2>U)9%~rUjJoX6g&IArl(o}d&>|UkHmD02=iT9_+LP(Dunn>c zvYt-7r4lm7zE!ue&BRjX4)E#?V+=GY!cz3+2&8qZ%7iJtXF_(^i9JCU++#bd9BL4{ z&om}6{Ze>E{Vs*#?(_v;4^A7r(^ur2@NkPfW9>>oiPYDa;4EwX%5Yt!_dkVSLmLHD z$Kk9YNP6(1Q82wWwj712h-@qH7q%^DEBEH2yL_v7z`kb5-Nw_rMgCNgBx^f}OI^jK z6xE7|E8pI#LB5!JDKwH-b-_+`C!)SThq=NN#HRHW!HJ(xqh}*BkGa`@sjG{>KPHu< zp?3$;cWq*%m**OvaJ2nMs2Wf(WWo#r>O##XWuki~d=@#TyecZ9h*a8)B1f%kvUW_dr)kM4zjT9_(P{Ec3JlQ?~B%Lc5Tn zMXBqyAk;S&$v)O!?^GNzI^R7-j%)G^TXePwjQZ5DL{``9!#vr#1s~oNHM>bCKY91U z`#;ejlMN#(K=;X@+l{Xh(?9uhMYfP&TQOA=y@qeaccQMFtf-<}~g5czcaeV7P zJ$X%jG9q%B?WwGwnK*mOc(mf-mA4KqA6>9klimDWp3;*A@jIVR=QuCa=0P0^~UicaPsZBZp9HOCmOqBRyRtyw8G*Ia}k#+t`e z3=x!~NLu2lke+Al_x+r+R@dI|I(vW4-shb6v;Rxt`ABl-e(w9auj}{wUd>YIarqE7 zK(sCM_;C4#_sZ6atoi)zyg_fLj$q?mY|LKCWT!d~Z_N{405}`ej8qq&_uf|<*Z3fp zZCA*@OZVy8!CeryqM>jROn$YI{q~~+P_&p2<=*9g-mm`1zWis1dbo+un#g#c!24pwJ%xvwKv5TcmS2 zt_t2OeJN^sZ$f>4kIl(LL@!_c^ED<%N$*caIZxDHC;*Zu1x-oVhJh>(;@T!7kZ3GzY-$L9&ExdpnOLmt z@_o9<)U4Bkvt_7j`^i3=(ftcerXAKM;d4_NCKzrGA06JyVK%q1pJBm zn#Gb>Xhm7ogVd5(P$3u@!db6&HPr__D;#GiUhj*X>Pysn#_Dh+>!prkoxK$OumI&< zlHusxs3|NjP0CI3N(~yf&0=*xt|DR>*swI{6j9T(vlwxQ z{cW&Zm>bXV6-(*;(FW6m$}k3xHG7?T!l$HbDYi|ZaxW`%&q|`S0B>XJGmld0AI*=N zJmnnuz;vll+6KT+9L5^tJZBmuBs#urvktW$sp(fTiJRZ+Uh#EbfAj6xH_G}a;_E8R$xuZ* zpRQH{`wVhl6uT%`4|LQr z-;R0bd=LN7bAkTE_Z52!k{9I_S)z)R-)m7%nkbmJL){|t)VLhX0ySw)k6EU|VWI# zdaYt650&;y-CWv`E?rz7XlsFh{(?Xfj$%dL#HK;nj9tL!x!o`IUei06=G(kVteaqI zpLx$yGLK(Q=-vm&qL*zc;j6_$@A|!u@MvMi8JIQvy6ahF(+h0pq&p&;x zgjE$41T*_oKo@;X-Hn~&mfRvZ7 zcC%hG3N*fW{)d>i{z+D@9aHOXP{xohn&`+L3t8PL6^9i%(MYDBw7XxsOK(UC)m}){dgp) zQOG@jr;R*ERtid=s~yu&D(RT#_zLe=R=c7>kh7K1BD`k4)7=%Y=tGz^?Jy#N5^7@% z1vFx-+g(~VCo?7$+w~&u6i(Zw_%>twqi_rnOCQmwx9(TtfVNlhY@EZWssoJu(MeNlenZuRhL6w*AZCn z?Wqp+)TTeNRHdSTZ?u>|Taf0L+cJg5RPOtH*k*P|L-`J`X&ijMndE{m>dpAHV!KgD z6#-_H3G6maS>ZtrE)LvdH}B)uzml!G#1a{8!dX~0eIT)Ubl-(sX!QH9K(NH=$d;X1 zAr$jqAu_~HyZ4S<`;c|7AXbq%=6!{BPQ^~(H74g^>ec>YWL2x@r8+I)N?uh;11$v^ z*8kY@h}H8%b?3*5sVhO;)az5oT-cDC4+o1YKV!nY2v%?0J&!d7cFIS#@nU>HOqt<; zeyIlwRT7A|#Z-*d?CTpR(ssXJYo5@p(&~UeF}oEht$Og}H{Yeo5Vnvm)n+vne#_U;Dbz<2x$e>-D&x%pl+B||(Z^K_MMHIq!+y~D> ztko?qy`J<`OjweHSaJgrjn-KB5pk04QEQv;4Coi)st zJE(ls@lhyN4M$Oz2U{!U%4xCLS#k&l(LU(c@`Rop?vJ3p`c5O+xiw1=P`{OCn!IdH zHr{zEyAzSfmIw>ZKmVD5z3AL~zD^S*ZGlvU^$T3`jc)V8hgJg^tMXS0%;Sw&<;5E7 zeqhF*=PJCoZNYcENX>NJ363bUU(u2y)oec5SQv4da7%V+2eln_u?zZNa^dc&r|Pnr z>>b{QbTy0F(RZ|UVQB{eA8;A5pakb4Zy9u&|EN>0sy65@Iewt1G{&!FlZDnkE1K5D zwTh36o!ew~sRBGV^^*zMq<-bfX+zEGLX9|5KF#gN;8k+^5R)gS8uv`0Sr(}_0@is0 z>cY2JO4X>h5>LOlg18+wVt7+nO8Un&U!VCJ1k@G2VjnDXofHm6!J8^<=azO18tOBg zl>9IHF&gJO1g&acShJn2ASo=E#;cSHx%rusW~13--w<4Uaca7KBc`&I_#RfTjA40f z3g0!83#}?WNCZWNTv{HjTxwShr3c_&1A@n2w&RWazE2Z0av-Tz{0tX9a@D0ff_q6y z8v&2CoY3M!nwTC#!fy?`Z}0QPrIpXneTLb+E$%bv&%O6K_LHYq)GP_Je)`=MQnk(8 z@C|ro=u~?dy~=y$qI64zwq&wO!gL|M#5ssVMolkpli~@yEdoqiX1U2Vn-Qb>B)2s2 zyxm*h&~>B1iAIj!x!+vpe{@QNXF$yy6@_uoH2J1*$Q47115~^CK^OhGc&~gQW6|i^ z<9U~4gFMTOuzPoz@k)?(de)C=T1yPn` z*?LKkz9%?k{nEvTo(F9r#4;7kvy_8ASw8=`BdK*X5u3oeM2(X7S)g8-c{i(0>ZEb;d$N zLzn^e;1biheI7Y>HnaA+bLQD{wd6e`p)(wqriX$|r$LG0Bhn5nz%>hijG?f%gEYYp zpIShJs05l$-T@yg{)7-j;w!-gS;GM|=7Rvoy1jEuSi+B$BGeqcMP3jT2+!NQI%H!p ze0BX^l`_-%k>gXIp{7iAeKI*zStv+}q%PhZ=TT{Ucl`^a6y4bGcz62T=xc~?xduD6 zOZaSet%9+!7r!K^y@bvJaANsW9-4i9p3STQudCg`Ne@uzbJq-8u*VR!@+F(&IN(gx zn%O%+zG*~6al?cU&Dt7!1?RY0evr^-^~>vHeOve3WLa}<^2^_FjQ`3R;XvxXh78q_ zE=c1Y+L*W)_3<9j+Q@}{Yd1k{;R~GbFJg}W3C#cVf#Ev}&r2M5OSU1}7ZdwM<^|mJ z=5n#(E$Z|#&gnM-ax~*$|DXU}ZWD9?*l|M~6G0tH;Addk$%v4V>=b4ItuWtpf_ZPC zNoXFWUaqU8$XRYj^Yc6N&7PTutMBFEZhnjtdXwlp_G`7kNVn2WRllOzlW%=4P6V4H zo$b6;T(cEf0{R6J@j~K&*Fr24R)`ObzN-8Rt(!(w7CTk6-$pR?K^yHA78Ha)hp1ni z#;JJ;Qd~4WGQ`T!Qg`|2=HW9TC$G%7fU?x3ybF1rV}(*5 zyGH;Asvek&fN@u2n1I~2-H;az;nj6VY^|pGm_Oys#deLd~_Em@ADC22AQ621X}3!_6l7Db9dR5;cID8s!!5$eM5Xh1~H^-Sx;g7 z&5CQuezPo1RU=!`_Yi=-cjH~$gQ;P;(bR z9qN5h9Gx(M`SJo;1@eOje?qwIKZExYVox~^6gFJW?Z^VyQ9vq`nCDZzD=s7p;uO3< zHyN%T1YrL6r}~$%x(W&r&5M1w^i|tTxs3#T4CRdI0q(;8H-^k~PuZk+nGZv}4ipcF zB3@HqX+p23Zv1Hq{*8L^$N3`s$EgDUJ3`}^`J(^JRQWr7;*axX_?HO`ayx#bGW>BC z&+%Fh#^wVZ;68OMKAa{-WiNRyE3+twy*sxYMeU6GU_6>~R^s{%bLTeelukB;{=`JuP`rRaoy|=j64mZV?3>+Pqi%_mnZ)z8VO!;hH=*YTBP)Y0 zp=wcWK1>mJs2I@j^CSTNObO@v6LNu9up;W~-}egeGyZ{>qhwA15g`nl+Ci9o{9FBCGm(6i*td6w?DrzLMcB^GReIJMwYx8grDY>TTL!>?Dft50mkVqE0}z$|P#1#j0` zEFM?I^XO>T$;%(m-hQXikB>>kCk=wj4o){{czzHM?>IBFcfm%1!Bx!*9x&bDwqM#Z zZFU{@Y8rApsIkuB?Soa}nx^pB{q0Yr&K%XS2lCAwe)GD|{XKd*myWFWiYylsh3ApdiJ1RMVCC^tcWSTyEXNl@geVpg@mM8&XU zoS?<^$_H|d^`fr%qf1BPv_(&t`^95i^+}qP94V4XVIXlvk!Z7Sm&f_E{gI(#OySvs zYy-?+?$ggol_z^+VrgRI=Rk#lyDiZ3WB^TMU>CM+6|>tCW~ z&u24Tw>P8e0K1z+T%?9fp*0~t<6u|RRy0e`Vke=p-}~7av8{uKOBG`KMc#q&%&0cq z{4c2yxz53b@+mnbC>ht0m%cN?CnPvCra_j&VVUKA9ZK{2p)J9S+pxo{=9%J^nA%a; zMg5}&-=@#Xil30@v+RETz$44m5v&f~D^f8w)vE=ZN@kH^S1KZ}k9h+HOkal$M(9!| zdqY;@roFU&>q@7HM&eYHM`cEo>A*sZVwE`9L+M(q9!x_&cZF}#ZkBJZ~>o+Eb_w!0#NU?}1~ zeQQHO^oDmaa-+sd*2WdDFX7A4;8$^Y`F_`oO2WJ_{ALG9DycVuzHu(uh-u z7L+i)vea;&=vQljN6ijfL8hqoRr8VY5Lb7>EKv}JNWd?2CP$#e(&ga>tz zO?YPjV%JC)IIpi*Q4#v9W)VU93{8b<FykDqE1bf^`pz?pEZJP z%{BgCR=)oF-% zV_$EKB-`%K=6TsVm z%inFv%GF3+w(uRAxqSS5oFjYVqwe#Xt%WUz!S-*VTKc5;uT=|Rr=&pa4VRJo9XCPg8( zn|Q?-2Tdx@e{M5kHzks$h{SdHaoK2PmFl}ElRNtyZ$!~eGqUMpFO{><`kTdv5wiK2-;M8Z#O9Jk znHRliakakhU-Fq^8ko+nJibuw07R0qE&}PbIyN@>Jcwq6ssV>(f*`ySEDU8WEVrI- zJ_9gmlU_$n1WSzCj4CL&ZN6Gh9hh};ahN+%p{+g0uq}el>V#F$-WCILL6UCl;YENS zcDLO+D`IQrb|ZH2Yl8iV$NTk*^;ar4G?Cof;m7E{34;=NM@`p3W2-x)oyS1}$k~&l zH4>wHYUPV>o6y7Rg|FI6MTKRb9}Yc451vA+5#iQlS!CF}iYu}?tsm70p0SSxfp zGPZMm!5y-{y1=ldvI@3Szz&CC`8#8Yn+KHuc+2dC3Gbf}R;w@8PlUw$&6)2#7Q3j@ z_|)!IP{C*E`axF;;V~4l%@H1=SUqNYpR)Tvi#tr0C-tht@r4gIYsD#(LT9*mA@u2q zhfZ2FfZIFQ{AMKdXplO{qX`iK{LY1`)IBTBj@T7+^}iEnD8kNjKT3}}AclCceu5qT zx)~59gIRS_(kH;#Y)C~0%8S?GDGe^_l~uw|vp7C>$aNc-OJj)YO{$cV>GPjlbn)>WkT9PXSV3)oi`(uRIQ zlD)JKWIf+__|fCjci46C1G~%-n1C|eoLow{%Ds^i4I@M@%1O31250`-0R3)y^Oh|0 zVJnYLgXL1B#UrRgle_vLcZO>(w)xm-P3-CFAIb#QX(REb#r8$p?)an3pE%Fk&6uiC z4j!W;cZES6IJhT)T+kFfF9Fa9a9F)uVzp4IO%+Mcw~34l&X## z7<1i?OVEn-DpHMg+cR}W_Wg{doKu6x!;Cl?d>P{AP9MOrH-qFs`97tElmQgkH4GHMytr-bx*}o z`cP7>LS=O&*JPVp_2uw+EGQs2&Cocise=zK#uLc4e)A9_p;f<gnA3J#8gxjK`-6=bh748YMQ!k2&=E6D;LIN!I&O$+q#%U0v!H1$K zXOVieSf_cZ7VYZs7x&)|(!%V8;Z#FpC60)BncO-vYp)7;XTxqfE zSlabR7d)9v)W-$0&hN|F@Oa5)hRk~Ey73WpzBC(|o`~We?Og=?JK<{A84dqUd_+eE> z?7AT{u%|$ELRMLiZW?k#c(qK|IX#mHx&4l;9YwdkAedU>juX{ne=U zsBpw(@#c?yMe94f`!cjr7jn9uv>5PUqUCwiMzmsZ{q*6mn7N&NWH}{|T#mJYaUmUS z&~+FxcQOW%JGJJU>X;NBWqId$w;M6`_3NPd14ZfU$LQ7wzl`OG>er;XZk${Z5UyW1 zRsq64aB-h#f4)Zl~{+aTOxw@vg+_`i0 z4cGJlfSrr}WO^KO)7Ct!9Jxcx%vmsIF=-wy(NH9uq`xdmK4#b6@_04?~uYZC4~s zA;^Wyki{;>Kl=XMO>i1Jn`PUix_cm1jx2{q7 zp3*T0NQi*=5DdI%8kxCvnUtL6UeR8B`a^TQTYLR?Etsr>JEK5TFxYJhx!eNsbe!9= zAjA5R+j0Rw(K?vQ26M)EDCN4nCYh@f#<_QqywHJXk6y4sYv!#eUi^HK?L$zqZK4Sg zcGse_4s0yym30)emQfB`ao;?-RU|H|7TYP8n>C>&3{dUKJn?1rLB>r<*GG)f3`4rL zjInHcX81ipGAh1$Fg_I;0lwRD<9SVKs!1v_H3V>-tOH{zp6bzwtNFy?L}*GDtgqK@AXYb;eE%cja~z z_Is3eh$h+_-gI40fG%gPnE=7mOQs0th3=43%_(=h=2l8aHgAkfr&+bP)-v2^k39I$ z!sBzeYidCUa0^v2HxahIF0U+)(x%l{>iAQ*4uV@BX2# zSC8WR>RSdsY?o)2f=v~6six#OOb!6=Ojc`8y=v{vwqWe8J~jEmz}j+7*H`!Wy-yuo zeg5>No?bx*f!KvXUczj7#GakAYmlbwk!fV_t*CiJck}xvbZW#r_|ND~Jr3}SlcHZi z9H5QiE!r_Lwf3Atw_m#n8wOwULb(qOu#-67NxpD8xh%Lgq(XRlbP6ou?Fr}SdCu5s z@8C91N_N*Vv9yS$oNAGz7L@w)KFT9w;xR64G99THY=(YogGyxN;^=JfB?A^ib%W#K zN4g1;wp=~OySc}^5E5ZjTYG}tW4WM<#6TMv9;jb`P3DrJ_Rf@sH{GWo1K<%9J7a|P ztG!p21hOWI75>JWPyoQw z=Be@s4CSoNPl(z!8|cF^hyBf?10yfcbYN_#ua0#zpVcvd@B4Ywg8tZUS(H?{*sj;- zEIb#@M86eEVFdN=ml8|NP`|ujQ58<(YqePb>pb8N+%tw0rM1?fcIk1r@oyZU>UD8d z0}RS;Phs}y*49?Plc62XW(to$R+?>R&L6CzU|iV=rs!a#Vhs<{;Ce$kzeS{q%*;g} ztFrS#x732ZD`+(i2Y3dUn^#aRT+Ho{g9kAfE8K#Yb~4#%WUKxOXTQfW8$Z+UAGsZV zbgFW8jf84WGzZn}KX<4YmEVG+qO>lAVO3RmRXK7xJnq#l48C4Upl3mxIqf10d>^zn zgg%I6cjMAaG9fiL76D9fm z$eb+<%f||26t%bR+tyFWbYA&Sh+HMrtX2IYr61zmECFH()r(wHeJJ5&Yaxe|2Tl2H z3O5$ORHB9!^7+cy-`dd z61G7)TkDrzshA7AapVNV*!RfyTUS#*)u zI2`zPrOwNS1@4vp;_&lACyn5FQ$hHc&t^me;wjpPxXEp6?3o(zv{DZ3QTcQ#;JM#{ zvjG$l^tbPnHx=>oZuFWciHBk(&^ZNPLenyNgQ9?_Mu zbX&-Gv#Z8A$Z)^Bnh+Tf_x>C5rgbxE<5~5p^O4y2ik>?IVfratgcHjjWcd~l&xVkchgfOwOF7)fKo{O&Y~pOC!f zCa?Q){ER;57MMl9A6QWT$W{+J+WS^umCXscaPyHVWL0|)aShBNFhv|3yVQ2!nOMTp zy=lj!>Ylg&bNwjj0}MM7)z1HfXIG-2=nMa?3T)w8a{mGBgRgW@(e6sl*FWB)-P}Kv zB~cQA*1|nGK+&l$o`&<#?;|L^8<p?5jUUVlPgf~2(IQS0WZ^e?ipP;a#iSR zud=7aBJ{lX%>jKu>E+mF4J4{1d_P@!swVUm5=)^Hs@~*duQeLKB{`)I41rVtNBK65ZnC zw73aKE{ie5#sh^19qBt$&uuFovwsbrYJ9YJo>HJsD$up_>fB8S`yY{m&Rl#q)rajp zbWDPi3v%S8LweHSRf|L$8lEOxF|ys8#R(uRhsu=K6>FZBioyLI(X}_|zU|dpy7Spa zhzf)U5JHIMV1V2o8?|SbcXg=D0LgT87Xt zniuA@aUmJHy|r9TY8zU4x4@uNtK!gg>GRW;vPgY^Df@mF=`pkX<`j+di@gBbw^QG_ zLz()1_-pufcw}yU9#%5rDzm~IZ2>|O3_kk3Jqj&CXo7--#k`TEf1djc=KyO^TD zhU8Me<3IiO7&NJal;8`4&tTgFxZj8#6tf^W3QS;JAj{C|@t~{gK*M`Nhn`soqtDC8 zIn)oe-#Wv65?KQ?2#Iwv9AJ$4&F41;$a`HJElfPXGK;8`n9>D<5G_*M~0V zI$@fvr%)GdkAwR`moYS4;Dtr^tOf}CNDC4sZD8(XBM~5{FIVu(e5D$F#)* z_fg<2yQR89*qK6wLjvTumtiC@`^pARDa0sdvle7ZK#4gtP~$R0C_oY1XvgTjR9j@A zusVCHVBQR40*cP2_N2g5e8?4NkmoA-*9c$xbpV7<0kG|?#5Wd8nQ#Vh$q_OS$=!mnonEWoZufFam(w_Qjv`SV;L*ud^x zsYd8Ax0=zMT0{z<_a%-gU&e;UFHFSjv+errQwT&*QS!T=Dpcd;#+>^v(iO8cag(FJn_^3%VN0^GK zuq!QiueEvHJ%Nytpv@K`YXO;?I!@FLMTmVN|=3$!x_lgJO-Szhg$&zB}>;)5{ zT6RD^l^^&C>DWcYE8CcjY=78($}gyDHC|pI=gcuVq4MnZcLvv%LM%hq13!o_3WB;dSc$hrh-z^QMKI9uRq3qSfqzt3~~h=z)odz z!JAL2{pD~sc`EeXodoXQ(}pk&oiHQ(akdNpI?*BD`gMq?4mT|XuYPuGj(AqwNsf0c zUH6iVG8Sac^_>$8@s+_nSGVw6D1WR3HoJ0f0Ne^-U2L0_^Y0_RIf=8r(Lmh!Vw28c z{pl~ilo;X(iW}`f7QI4Nc*=#{bqqj+`v@MMWqEiHcFy1JgmP3zm<)@j;?%b?1*84w zJ)LrpQYtqc8z=+51-7_(vu(Uw%UV>P!BpU7+ZY z@6{8_k81BqMxvqq^3n1saLR?xua^_`E{*Uc>M?(ad8mlX9H)fjFr-)q_nqk$Ni}$V zRPS1=&+sic%|8kM|ey)ak0Vu~pNeMva>YyQMkte`Dmon*X^UPcm))!mLQ#b2y zNiFI9i6k2+8;xhr1Slloh}&f~!Fl)bl95E(&?v&2L~yCE|0W(Gaoh0lfqn@jlbFNX zz^$xmUaVoRV^T+hLoO@#J+UKS^rYe`j{z4}_=ym?QBmFFhfB1DBfz?3JS(l+{%lfv z=Ft?(QRPOsoyO}tkC9kTseTQY`SMNUVz zlH~L*k*~(+vK)9GH@+3}M|r)a}s z>mKE#Rk6#%h0GgmXN?%4QY(*e+}rE_b&K+wVS6w^`}^Aq6i5DU$y{_8E`*T|z8 zlqmdh^|$E35xDn62-W)Sg4*!f&W}s#cUXTy&f(fv=jIz8;%`};EhZ^V{3$MRRP97C z6ia6vnT&7`t?1c59l`}v8Iob^#>Cgk(O)(fA`R+~Dr*xBt<=c&aUzDJzRq%DKjN#w zc!g|2`d7QUME%iC_>ZnBYDi9TE}86cM#0(EOTswV+L-i&=18vN$LP92i$M+vx__8o zk_G{5JniGLP-4mx@8a&VuV}?QyluOm*wCb2T)`OU`Lfige~I6^aA@HiWX>Bm2mOk1 zRvl)9+=v~ND2vGF%> zb$N05{y{1F@hunxfMfkot|QfKs>b!51ht8A(Vzgw!*%6IX9KcXLe+$Kudz9fhMc`r zS+Lj=H3}9VT>x4ff5;%(%*!K8%=Bp`usJhxO8o6K9!vE3df703+lSNzbvrXhQVrSzW zr{xuE9ow|2cop7{v)KwCEtQ;w+t>p7|F`kK;9>Ott7}m|C;tieg#W((|4{q*U%2M~ SGX2o+*M>hYc>jg>|Nj8f^yQlX From a36e26932856156dfd644b624343ad5faac21d26 Mon Sep 17 00:00:00 2001 From: Emitor <13625519991@126.com> Date: Mon, 16 Apr 2018 00:53:48 +0800 Subject: [PATCH 23/28] fix a mistake --- notes/剑指 offer 题解.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 4a6c375c..79a656f5 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -101,13 +101,15 @@ ```html position-0 : (2,3,1,0,2,5) // 2 <-> 1 (1,3,2,0,2,5) // 1 <-> 3 - (3,1,1,0,2,5) // 3 <-> 0 - (0,1,1,3,2,5) // already in position -position-1 : (0,1,1,3,2,5) // already in position -position-2 : (0,1,1,3,2,5) // nums[i] == nums[nums[i]], exit + (3,1,2,0,2,5) // 3 <-> 0 +             (0,1,2,3,2,5) // already in position +position-1 : (0,1,2,3,2,5) // already in position +position-2 : (0,1,2,3,2,5) // already in position +position-3 : (0,1,2,3,2,5) // already in position +position-4 : (0,1,2,3,2,5) // nums[i] == nums[nums[i]], exit ``` -遍历到位置 2 时,该位置上的数为 1,但是第 1 个位置上已经有一个 1 的值了,因此可以知道 1 重复。 +遍历到位置 4 时,该位置上的数为 2,但是第 2 个位置上已经有一个 2 的值了,因此可以知道 2 重复。 复杂度:O(N) + O(1) From 8b0d9452e7ea04e29cb7e51a4f5908254c819f11 Mon Sep 17 00:00:00 2001 From: Hasaki Date: Wed, 18 Apr 2018 06:52:39 +0800 Subject: [PATCH 24/28] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Leetcode 题解.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index 0cee7066..05faf7a6 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -127,7 +127,7 @@ public int arrangeCoins(int n) { int l = 0, h = n; while(l <= h){ int m = l + (h - l) / 2; - long x = m * (m + 1L) / 2; + long x = m * (m + 1) / 2; if(x == n) return m; else if(x < n) l = m + 1; else h = m - 1; From beef4997a3b916d8d708cc08953d6576e494b5f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=BF=B5=E5=90=9B?= Date: Wed, 18 Apr 2018 12:02:06 +0800 Subject: [PATCH 25/28] =?UTF-8?q?Update=20Java=20=E5=B9=B6=E5=8F=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix a spelling mistake --- notes/Java 并发.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 40f0de20..edc9dc0f 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -192,7 +192,7 @@ Executor 管理多个异步任务的执行,而无需程序员显示地管理 主要有三种 Executor: -1. CachedTreadPool:一个任务创建一个线程; +1. CachedThreadPool:一个任务创建一个线程; 2. FixedThreadPool:所有任务只能使用固定大小的线程; 3. SingleThreadExecutor:相当于大小为 1 的 FixedThreadPool。 From 089dfb1d86c4f369ef4af3e2ad6352904a40d3e6 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 18 Apr 2018 13:46:04 +0800 Subject: [PATCH 26/28] auto commit --- notes/Java 基础.md | 38 +++++++++--------- notes/Java 并发.md | 2 +- notes/Leetcode 题解.md | 2 +- notes/Linux.md | 11 ++--- notes/剑指 offer 题解.md | 14 ++++--- notes/算法.md | 2 +- pics/1a231f2a-5c2f-4231-8e0f-915aa5894347.jpg | Bin 0 -> 27648 bytes 7 files changed, 32 insertions(+), 37 deletions(-) create mode 100644 pics/1a231f2a-5c2f-4231-8e0f-915aa5894347.jpg diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 06100520..ed94785c 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -65,7 +65,7 @@ private 方法隐式地被指定为 final,如果在子类中定义的方法和 **1. 静态变量** -静态变量在内存中只存在一份,只在类第一次实例化时初始化一次。 +静态变量在内存中只存在一份,只在类初始化时赋值一次。 - 静态变量:类所有的实例都共享静态变量,可以直接通过类名来访问它; - 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。 @@ -83,11 +83,23 @@ public class A { **3. 静态语句块** -静态语句块和静态变量一样在类第一次实例化时运行一次。 +静态语句块在类初始化时运行一次。 -**4. 初始化顺序** +**4. 静态内部类** -静态数据优先于其它数据的初始化,静态变量和静态语句块哪个先运行取决于它们在代码中的顺序。 +内部类的一种,静态内部类不依赖外部类,且不能访问外部类的非 static 变量和方法。 + +**5. 静态导包** + +```source-java +import static com.xxx.ClassName.* +``` + +在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。 + +**6. 变量赋值顺序** + +静态变量的赋值和静态语句块的运行优先于实例变量的赋值和普通语句块的运行,静态变量的赋值和静态语句块的运行哪个先执行取决于它们在代码中的顺序。 ```java public static String staticField = "静态变量"; @@ -99,8 +111,6 @@ static { } ``` -实例变量和普通语句块的初始化在静态变量和静态语句块初始化结束之后。 - ```java public String field = "实例变量"; ``` @@ -111,7 +121,7 @@ public String field = "实例变量"; } ``` -最后才是构造函数中的数据进行初始化 +最后才运行构造函数 ```java public InitialOrderTest() { @@ -121,25 +131,13 @@ public InitialOrderTest() { 存在继承的情况下,初始化顺序为: -1. 父类(静态变量、静态语句块块) +1. 父类(静态变量、静态语句块) 2. 子类(静态变量、静态语句块) 3. 父类(实例变量、普通语句块) 4. 父类(构造函数) 5. 子类(实例变量、普通语句块) 6. 子类(构造函数) -**5. 静态内部类** - -内部类的一种,静态内部类不依赖外部类,且不能访问外部类的非 static 变量和方法。 - -**6. 静态导包** - -```source-java -import static com.xxx.ClassName.* -``` - -在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。 - # 二、Object 通用方法 ## 概览 diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 40f0de20..edc9dc0f 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -192,7 +192,7 @@ Executor 管理多个异步任务的执行,而无需程序员显示地管理 主要有三种 Executor: -1. CachedTreadPool:一个任务创建一个线程; +1. CachedThreadPool:一个任务创建一个线程; 2. FixedThreadPool:所有任务只能使用固定大小的线程; 3. SingleThreadExecutor:相当于大小为 1 的 FixedThreadPool。 diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index 0cee7066..73f19098 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -638,7 +638,7 @@ public int findKthLargest(int[] nums, int k) { } ``` -**堆排序** :时间复杂度 O(OlogK),空间复杂度 O(K)。 +**堆排序** :时间复杂度 O(NlogK),空间复杂度 O(K)。 ```java public int findKthLargest(int[] nums, int k) { diff --git a/notes/Linux.md b/notes/Linux.md index 6c38a0fb..135467a7 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -1150,7 +1150,8 @@ I/O Multiplexing 又被称为 Event Driven I/O,它可以让单个进程具有 同步异步是获知 I/O 完成的方式,同步需要时刻关心 I/O 是否已经完成,异步无需主动关心,在 I/O 完成时它会收到通知。 -


+

+ ### 1. 同步-阻塞 @@ -1168,13 +1169,7 @@ I/O Multiplexing 又被称为 Event Driven I/O,它可以让单个进程具有

-### 3. 异步-阻塞 - -这是 I/O 复用使用的一种模式,通过使用 select,它可以监听多个 I/O 事件,当这些事件至少有一个发生时,用户程序会收到通知。 - -

- -### 4. 异步-非阻塞 +### 3. 异步 该模式下,I/O 操作会立即返回,之后可以处理其它操作,并且在 I/O 完成时会收到一个通知,此时会中断正在处理的操作,然后继续之前的操作。 diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 4a6c375c..4f6bd9ad 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -98,16 +98,18 @@ 以 (2, 3, 1, 0, 2, 5) 为例: -```html +```text-html-basic position-0 : (2,3,1,0,2,5) // 2 <-> 1 (1,3,2,0,2,5) // 1 <-> 3 - (3,1,1,0,2,5) // 3 <-> 0 - (0,1,1,3,2,5) // already in position -position-1 : (0,1,1,3,2,5) // already in position -position-2 : (0,1,1,3,2,5) // nums[i] == nums[nums[i]], exit + (3,1,2,0,2,5) // 3 <-> 0 + (0,1,2,3,2,5) // already in position +position-1 : (0,1,2,3,2,5) // already in position +position-2 : (0,1,2,3,2,5) // already in position +position-3 : (0,1,2,3,2,5) // already in position +position-4 : (0,1,2,3,2,5) // nums[i] == nums[nums[i]], exit ``` -遍历到位置 2 时,该位置上的数为 1,但是第 1 个位置上已经有一个 1 的值了,因此可以知道 1 重复。 +遍历到位置 4 时,该位置上的数为 2,但是第 2 个位置上已经有一个 2 的值了,因此可以知道 2 重复。 复杂度:O(N) + O(1) diff --git a/notes/算法.md b/notes/算法.md index 997dc245..b6faef12 100644 --- a/notes/算法.md +++ b/notes/算法.md @@ -581,7 +581,7 @@ public class MergeSort { for (int k = lo; k <= hi; k++) { if (i > mid) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; - else if (aux[i].compareTo(a[j]) < 0) a[k] = aux[i++]; // 先进行这一步,保证稳定性 + else if (aux[i].compareTo(a[j]) <= 0) a[k] = aux[i++]; // 先进行这一步,保证稳定性 else a[k] = aux[j++]; } } diff --git a/pics/1a231f2a-5c2f-4231-8e0f-915aa5894347.jpg b/pics/1a231f2a-5c2f-4231-8e0f-915aa5894347.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f43e0f25000103cbc99f142d330b3d373019c6c7 GIT binary patch literal 27648 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 literal 0 HcmV?d00001 From 533ea8040f70e1235e86664cc93d394236c0c6b1 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 18 Apr 2018 13:50:12 +0800 Subject: [PATCH 27/28] auto commit --- notes/Leetcode 题解.md | 2 +- notes/Linux.md | 2 +- notes/剑指 offer 题解.md | 4 ---- pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png | Bin 19909 -> 8192 bytes pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg | Bin 0 -> 38912 bytes 5 files changed, 2 insertions(+), 6 deletions(-) create mode 100644 pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index d10cf347..73f19098 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -127,7 +127,7 @@ public int arrangeCoins(int n) { int l = 0, h = n; while(l <= h){ int m = l + (h - l) / 2; - long x = m * (m + 1) / 2; + long x = m * (m + 1L) / 2; if(x == n) return m; else if(x < n) l = m + 1; else h = m - 1; diff --git a/notes/Linux.md b/notes/Linux.md index d6aa8c98..135467a7 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -1375,7 +1375,7 @@ poll 和 select 在速度上都很慢。 几乎所有的系统都支持 select,但是只有比较新的系统支持 poll。 -## epoll 工作模式 +## eopll 工作模式 epoll_event 有两种触发模式:LT(level trigger)和 ET(edge trigger)。 diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index c32cef34..4f6bd9ad 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -102,11 +102,7 @@ position-0 : (2,3,1,0,2,5) // 2 <-> 1 (1,3,2,0,2,5) // 1 <-> 3 (3,1,2,0,2,5) // 3 <-> 0 -<<<<<<< HEAD (0,1,2,3,2,5) // already in position -======= -             (0,1,2,3,2,5) // already in position ->>>>>>> d1687d819fdd50d1b3323cfb327b355e2b5eca35 position-1 : (0,1,2,3,2,5) // already in position position-2 : (0,1,2,3,2,5) // already in position position-3 : (0,1,2,3,2,5) // already in position diff --git a/pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png b/pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png index cabb668545bb098c3c9267443381e389b5b32fdd..3a69d2ce8cfcd5040e42fa444a499ab0e8d2af40 100644 GIT binary patch literal 8192 zcmeI1e_WDhyTEOkX;Uk$si8vanQX1;&=M_@QB83tb!WA#rSg_ex1|!AApx?~H?t53 zTWV^|wSH`w&fHY|#Y*D|QCW3L4TTbn3Xy;WkzeO2TYJy>?|jbt$NAA8e0ZMwbKlo} z-`9O#*Y&-wr}WeK7>`9O7CAXNdBozkeCFiz2H@m0kKpP8wG`Ngw9wzY+|Ob*IW-LW zKZahMGjMS@C#NR%o7O!Gpm(?Z_+7b9PM$r_fAc`%#WW`;m?d@#ZhL-;W>j*#_VIVa zI&;yzS@;`Qzc>x}Vpc!G1;J7`-2c1x)sNm{edt#?{KM5FRYBGFgRqm|XZoLC=~;)W zT6xb`7!4Cwe@n()`u_8a`}^q17@|NWYrl0_g*i7%yZ`;q7Dbn72i8RIZs*P>1kZCi z?dIk5eJx_1)4l(l4-r?(kqN=tu?~}vHv9NOg^!O9p$(%NY0luuEyu^(+XieFQwX6m zUuQn|bRl1MCW?M&nr>Yo2Pbwn73>X|Xg^MQ_UPsWl1I}Ezf|;2H>PyWT3w09#ERLr zF`42j-_0umS5p}lnA3a%QA#oECseIgMY`8b)S1zQs?9JLtsrUh1?SkL3IZF)1zi=> zP2Hi)gxbwb9v8fT{e=-DU@0cP*Kei3GNx?^04UWY174v~gp+pTa$1!uh6ls(E#4;B z&~{mHL4Y9sbB;1=+?PZj4bCL;z-2&9IpVOlvUGjaa#1-$*i(n_o0upG%AU{P5xOkY z*?1T91yFv=C_GH`uuF8GI5%J_F3@K%j`O>lehUv?#O9@ECX7Z>1;_o->}7<+R#kT2 zI?^W`Oo4S~_1YF*`s6@3{<8*yI~#K_j~cNM_XhHY_jJ+1#SQU~NLK_?NPzS<+k3Wc zrT+?~qXT)jPxi&Ii|F8ZfuBcHxMC=Y{bJ@fnNON7Egh_>hSr+KQNl-hV;$=mC28-Y zi`(MXAD~X1Px6)`{D$II4E%EBCh8DFj#H};SAbZe7x-d zkU`x#bqclST3!(#U`>0gbDwWc_!Ez%WP-)yckuU}NmnEY(ZI^0H0qVXk%DnlcIZ-A zYQO)z{cTj?Z(g34*(kg)?>pQTv@`)Dtk!-l=Zx!!=&M;mZ&IQ{z1d+>iI zCfN0Q5NmHjePDQW^Q^dJF}(ZCOo8^Gu)i__o|EhBc8*{j_o*Pv-l|}tgtRD9iZb2R z>l59E!Y=fWDBP4#(exUs?j>LIT5`*Y9G~Z{qZ?#J@YTIuPHo}L6e~5uf8HoC2d960ftT{}$FwdqDS0%g z`z-)1e$_qOh6F-VI@>xK4*MO`g{`B=sek!Pn5-Im<$*QR73?}R{X~EBY)qn>WJHou znFJL*SGtn{?qcLZbDnbNTF;*9Dpg-Xl%iD%kWFCdn|vbezN%ShY=Cr$P%WX~dJEV& z*V~h;^Eg#;eHx{k_65vj{J1`Uz7R%&0Te+OI+&2QIbv$~2xnjLkTR}AQW$;$s`u0g31qJ*GOP^aZ*w9-Q?+%wz7JGqFxXQ8BMF5ovHVTw5v~_1ev;u zoe5-Vc(HDk(mM2of??97`86kpQPtVhx8;F~@`R}O(8aVUbHtsPQGUE4!rU=T3nnEO z1b`yOp0`@*cB>f%icQxe6lyrSQIq%n6??tlxt6mBkiglb84|B=MtGUkv!|7^`G%-m zCd)%9&U5zd-$2nfuue25XYg6MwJfBvQ_~i2;Imp`^2Lgp_LZ6FE1GFYmi@!K1T3^K zE-q(lH?D>Fy9Q=l5B_kl8eJT*M_9U!i5$j6mL%m$^G@c}PSEv6MeG5L8yggPKQ$It zgZ(NW6I+VOe|rCkekMv=UH!Q%!{Vz@5BwH&W(J(*N$6I7CPDs9JyuOzUYN$(?F}f# z;XcM0mxu$5crr8#DIjy`#zB3tuj!|T#_;cSdRf5 z!X4|d!{jru;OvIlX>!<0KmK5?dBg8I^4~i*sFef*vQb>queBh zPBrt#J9h~U*CRr5!kpdS!R=ii^VjOPs-Ru2#6MgDoOCXI?2o(ll7SGY+Est<%L_OU z5!y?`FYGd3oz~$C%lsDKQQE-N z6tZ(EqK^F{cC=r@ajOr}PA}zs!>q`fj|gHf-*!D(*z;bP3k$IncsA!<$?Nd?c9g6B z3hJ|*y$ZI|MV60ug=3mv7hkey15#_4>@Ea<3d-5wFTneNPZ8ia6GQ7;!V70sXvU(D zMGrpBWP<#`$pxaBnW&YApYsJo_Q~$tt}=#uDauP2`3~N5EGUS*F6yq#;01hGGPk^a zI4@X!rc!ZX6)KgJIX_5s5>YBm&VV+s$K!?FK5keblDWXk>%4|E3&4E(@->lu?j&h` zXP0y`&P9|L!};C(;`*NJcnhG6q`aF}Kbd8u2sFs|rIG7a3ls2qlu%6D^u}}ig3P#M z8NfdQpIudvibDyn9Tb96%c}2D`7L|GWChH3aR1QF4_5NS+v!^EVgF;5-{^Iwbc=r| zrlszR4?wLLySo$sH&XP<>Gsmb)|AeC62)P+T`Fyifhq~@G^nv zP*L_XqV$pPkocf+{9&*+kh{hkkfMj`MlRVlCh(%V+UeH5$5WqhlowV>J><_=h{!c( z$FCMGOjPyG9I`wXrf`_5ds)58$S@(rz=jqB0dn2&4Ysc-yW9kq|4mW7uSQeNp+gyV z|LIkDPcgQk)R0urWlKv9!RtGB*6uUxBsG-f1{bEC+OQP(#G!G0?lgXE@hG$YnnukY zm1SG0t3Kbq9c+i-+`rYx&J4sBScR}?P7UvcNBV}6Exzb0;VH~hpK`V{61H$?ClFPN z9rR71$I#nG?TLcfJ9p^g9tZmJn*)$|$h&drpKqVE{i_(Ndl1oH00F>1+!=%yqWg>? z=~-WPZYRDwxS8|ZjafoN$CLQzRD5O;kk+>SYLibmx%LHWxq-5;6q8+5;{)D|lg)HR z*9nEKeo7bA=8t)-J&7dGi`)9m_?Gx|5EOQ(Z$(TUOzX6BNxKy;+;i zYy%Aw`DX$gM>iDD#l z8KEiYeVz-TIuy3KmBK1i9v5C1sV?v*uN(v|r1U2o&{abex4hA-it}m}sVGk_M9jsA zQvTWekVeLEltJBNYr(Sjk?3D4M|*RG1NDoz8dPq1zq-{_R@%rg zVC}cnU#-aKIGpaUG>m3<^CQ8@jYi|T>)Rz*_}N9=ne{wFKC@CsVS+0fkAoClt7Bps zG6bKnsOUi>)OuVcFs;x>=$ctPhRifP7y6!Ghi{LL*!>>n6{cBY#j=>wN%F`-09{XN zhM_N$^x+hqCJh1kqwuvkIcMux)G>reg~|T;j{1flTKi<(b){M+?T3m&LmRrgbw;U3 z5pXCFWj0`*-4lZSiit0&je9!B@<*EHVrA2I&ht3lz35mM=VBocA}K%T8p$JjaCPKi zg?3z_Zp-Yb5>8%^&d%|hFO@RcVbNQ%2b%>?-5(+ADFGCAb7{2GQ|X`A4)FdF1<#x(x&H6b{(mt zU6z6y*Zv6!=b&3yNmBIr_0*kiv;Ps@jn=LJD00n&LLto3>oo?kg~;$MNr}mRNX2m_ zxv)1WW|=ZIv5`cp$q&@+qY3CtjX|WCkmPCC^(yy`MNQScqLHyQ4l^v9t20H88%w5| z$8H!%E!BU^NA>Kt5mj7ygrgO?__xs7YsnMeFRg<@G$!tAy0Qu z$on`jBt%N}P-ui=R@tAR1%VkC_NXmVd%Y*0-Y*kYRga`_GD9RI*`rbgt9oC*ucvOh zuI#`ljiEoQ6)c@E9rA8AwSy`FG@U^-bVANHNe5?E$WbEUTK&!dTuyC5o-z7Q<~-1VD2;64%Y{_|fU0r? z$3^MG9b*grd3ynvGhb^}k_y|Szd1*bi|IyE6Y5I>ig-MW<67|fWx%}cSdeyB^Ihkh>+C<~QfBXY_IlR3SGn&!VJb>8Pq4_a?%lih|M1lK!cId-tB-dn+Zb;hwse=81rIx!l&in8WbLEPYMD{^OZ0JXl-O<6*Y!=kabZaR;?tkHjoqHzq*-q3DTI!7cl=pjAie|!&EFTP zd@rL3(*OB2Ffm+qi}rv1J@!DY{y%R7{&w8TyG$|=&pL2()pF|z@*wzo5tCh=G9&TR zIqOo`*@D~Bw@To26P)vd5V6!W*SU9NOXh)5&KAR|Nw#xU?-)r5|D9A(?y%BrGg+uP z`?JnTCXEPKjcM!dY-Qy}y07SEN(~9-zxCaH>_<4;f0rAGFY-J$;(wMah4+70?f=Kq zT6wdFTRC)^y*y6)lzq57ul8yyhf??~O|;9-6m0%|gDo3(%gL19Y!`{)&#jXne3Saoq;c4As=%yvGcwL* zZ?1Ya#jbg_kH>AnWqS8l0N$`zx)-vqxKw6QNpLI2CIRZ&x9GXwv|Et>)yiA(pGA`G zfBB)WSG*(1aNhcoVDJGf^ym8ua)i+^$DTkU)Z97GS>Sk7@<=?p$S)gw^{2tEW<>N# z3jJ{@j&7Y}?qj^aSK)kVNjqI(8Sc1dA$B#Z)zSpKF<@i~wa%xvriek4$DMZJ+$LPX z{?+&9V%4-f)MGV9rh-+kW;LMe5sCh&Uh_W}+4LvnHlI*(F9 zV_usX{Azc<4m`0&mG|B0I2A1@IxHHgRPdhc*_aG9D}`{BFtS&eXv}r(_1`@R)kua| ztXStVV{oW;l3Jw3rG4_jcWAqisg5 zv6JXl*c(beB$5a<$vZyH%KPciLzzA7|JN%M-~4)33$Ee8WIjTta(}K@V>3JIMQEiL zgD(O9kutuPY+cf)PN*pK03Fx9Xplv~9B=|c3GqsvK8&=r_-n1e)PTR9A1eA>pS!|b z@3T6qd#CHXZ9N?|$UHA*qyip=|oL`N1}uJXfuT=X%`KPor?uhEAPI zZ3uFZ{kIbZXz>hr&IRH4a4d=2vKnIGE@X}5TTkchqAz5#%@BIE?++G`YXcp6a5Wc^ zbhhum{8{h3)A5Fw-9UKR0K74r!e=*-D&Rzx5ccIi$M}RCIp6!Aj!WKWE{?2bYkW&y zmGO-f0oDkECPAhpB&DNMnwJCX%36YUK_eZkXWW$l_%HT=rwv}Pw-#y!WP*Y}l`02%hwt)xi;9AeFDbAOKzGmOO zJWx#XqE(fUxp z2sQ~DLipyehkAsq1%=c)lX7S$&cE}!Uy*#B=*1k6Z)QTEjYA!byO1E^B9rd>#J9+Q zP91%4_onfWRnA-EZ5EHyJ8*?q<^kC7?92b>lLin_CdXx7IS_kF=VHX1y)r8-g6rQ` zq6UiVizwzQRNncRg?|>N)K3 z^FG|6(yh!@bP^29a?`t4bWmu&ZsV%~68tw{@~A_oK3F!FSqwW3$cFJc1HiFf5XzN{ z9si01>OA)AmgBc7DI_-AhV!e(deYAB7<-ve8imLl{JTLPzguHzxxzIWQtaIC*#AFVQJH-t< zjQZ_Ca;eu}fwc8@1B<59IoB;WV#!SxhBo^U{$gjkbOcv$Geh4&jn}@cWip^0c9*{l zJok9cqmIHLbpHVi4QYZorxB5(7Dnzl6=ytRdczM}x%yj30Lj;|;Iwrl)T~q>HXx6Z zvuHTp0H!MnlA{Uymf@B=fGe~+dd6D8JtEBAaJJ}K3Ajs>^K;YB<+5)f3&Izxu@7$9 zTVKNqw@Cg%W)^dq5@*nx=@^kGAUghruJi#(JQ0m;4wAZA{_Eo(=-8=`v7WJN01%3% zhgP%XbH(blKu5YWRZQ;12V`Vn&9sL7=BxJ}zGZ#4@z7G+-t3en+xN) zOslD?u=lgX3bgEv2kpgG$BAzMgH^w!$qo7!dt?;z$>~Hj#GmGnWb)6vx}NiSV(|Ly zOX_?F++5IhUE)!+>`8a^#t2^xn+`I&aRC@`H7u3i>?vd54ae4MQ*uR?P8D{Sw zp724dmex#fn+&CkhTU0L{ne~R`X^mqPnD|Y+_%5b#hzX8G5|<|^`A_Rp6&+ZpEuJP zPBL5V22-_5K0;^7%_d#pYKH8A?#+MdcaS4EPsw?0dc~an6qPn77wc5!X&Z9>OR72T z5-&27?OLu++uZIzp6XL2n=xdA3*y{qwU!gB)PKw8LH^bAPo2K2LA6yJOIr|rmZ|wK z#c5wor}aUbA9;$|{n3AS3g2|7`xCj-qb{IeBR71oQ71#;Amw^GYcV}nFKHioakR0K zt_trZlg6NVgXd$G4pa`CcKU0J@BaOL`S4oq zU)bKoZYb5~ao}?Q`EM3_j`P2g^X}x$`~SDojBMiANc8Q+-@LMxk04>Ea*4%S%DH|ge1BJ9<97FImxc|z4!iUnjw;iy5&H=9W(>RU%fY*-qmdCYZW`wB z$+Y&9X+!Gkn<+iJp_Py60Q~5QP!rM*XS3kr@4WV)cK_u!3#0|Z4-~PL^wZJeO;lb7 zZL@t0=|3-ZVWY%%*`m=_`0S_CEYGxltoQBJlCofeMXpHOU7?U^@coabHZ;z5ri^C3 z(ZlH!$UHdPEqIB-KY_$_u>s%=djn9uA8l-t(J$SB-23{iyne?I7i$TX>8MqPS-$4O zPpe#tK^xE-8=aa3*ZH+u^_wYCkCwT3p6QmAC?VuX)lRIEAox~cmJL$&{ML4@Kh7iN z@JwRN%0q51J-OZU%{;9`X?B!g;gKg!5%d#z)k4$h9P{n&)gNPVp)7-~gmZaAS!y33 zS>Vp)S}IMS$fr92#(Q#ei%e+I=U0j-7y+EGQnN@4=Cm

7oVrMCAR!k%;x1dBB_A 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 B`nLc8 diff --git a/pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg b/pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ff8388d8c4eaeeb52cabb96c599d5d90c65f40f GIT binary patch literal 38912 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 SGX2o+*M>hYc>jg>|Nj8f^yQlX literal 0 HcmV?d00001 From 0d2e9b711f35b75e63722e31810d5a47251e0787 Mon Sep 17 00:00:00 2001 From: Weafung Date: Wed, 18 Apr 2018 19:01:32 +0800 Subject: [PATCH 28/28] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix a mistake --- notes/Java 虚拟机.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index cf9a8bbc..5173f2d5 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -142,7 +142,7 @@ Java 对引用的概念进行了扩充,引入四种强度不同的引用类型 **(一)强引用** -只要强引用存在,垃圾回收器永远不会回收调掉被引用的对象。 +只要强引用存在,垃圾回收器永远不会回收掉被引用的对象。 使用 new 一个新对象的方式来创建强引用。