Skip to content

Commit 9b25ef4

Browse files
authored
Merge pull request #12 from CyC2018/master
merge
2 parents f199c4a + 93090ab commit 9b25ef4

27 files changed

+469
-453
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,15 +165,17 @@
165165

166166
#### About
167167

168-
这个仓库是笔者的一个学习笔记,主要总结一些比较重要的知识点,希望对大家有所帮助。
168+
本仓库主要是根据计算机经典书籍以及官方技术文档进行总结的学习笔记,希望对大家有所帮助。
169169

170-
笔记不是从网上到处复制粘贴拼凑而来,虽然有少部分内容会直接引入书上原文或者官方技术文档的原文,但是没有直接摘抄其他人的博客文章,只做了参考,参考的文章会在最后给出链接
170+
学习笔记不是从网上到处拼凑而来,除了少部分引用书上和技术文档的原文,其余都是笔者的原创。在您引用本仓库内容或者对内容进行修改演绎时,请遵循文末的开源协议,谢谢
171171

172-
[BOOKLIST](https://github.com/CyC2018/Interview-Notebook/blob/master/BOOKLIST.md),这个书单是笔者至今看的一些比较好的技术书籍,虽然没有全都看完,但每本书多多少少都看了一部分。
172+
#### BookList
173+
174+
本仓库参考的书目:[BOOKLIST](https://github.com/CyC2018/Interview-Notebook/blob/master/BOOKLIST.md)
173175

174176
#### How To Contribute
175177

176-
笔记内容是笔者一个字一个字打上去的,难免会有一些笔误,如果发现笔误可直接在相应文档进行编辑修改
178+
笔记内容是笔者一个字一个字打上去的,难免会有一些笔误,如果发现笔误可直接对相应文档进行编辑修改
177179

178180
如果想要提交一个仓库现在还没有的全新内容,可以先将相应的文档放到 other 目录下。
179181

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!-- GFM-TOC -->
2+
* [0. 进程内存空间中,堆和栈的区别](#0-进程内存空间中,堆和栈的区别)
3+
<!-- GFM-TOC -->
4+
5+
6+
# 0. 进程内存空间中,堆和栈的区别
7+
8+
> C++
9+
10+
堆:动态、malloc()、new、链式分配、向上生长;栈:函数调用、编译器分配回收、向下生长。
11+
12+
https://www.cnblogs.com/sunziying/p/6510030.html
13+
14+
By @CyC
15+
16+
---

notes/Docker.md

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* [三、优势](#三优势)
55
* [四、使用场景](#四使用场景)
66
* [五、镜像与容器](#五镜像与容器)
7+
* [参考资料](#参考资料)
78
<!-- GFM-TOC -->
89

910

@@ -15,11 +16,6 @@
1516

1617
Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其他机器中。
1718

18-
参考资料:
19-
20-
- [DOCKER 101: INTRODUCTION TO DOCKER WEBINAR RECAP](https://blog.docker.com/2017/08/docker-101-introduction-docker-webinar-recap/)
21-
- [Docker 入门教程](http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html)
22-
2319
# 二、与虚拟机的比较
2420

2521
虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。
@@ -40,30 +36,22 @@ Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程
4036

4137
而 Docker 只是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。
4238

43-
参考资料:
44-
45-
- [Docker container vs Virtual machine](http://www.bogotobogo.com/DevOps/Docker/Docker_Container_vs_Virtual_Machine.php)
46-
4739
# 三、优势
4840

4941
除了启动速度快以及占用资源少之外,Docker 具有以下优势:
5042

5143
## 更容易迁移
5244

53-
Docker 可以提供一致性的运行环境,可以在不同的机器上进行迁移,而不用担心环境变化导致无法运行。
45+
提供一致性的运行环境,可以在不同的机器上进行迁移,而不用担心环境变化导致无法运行。
5446

5547
## 更容易维护
5648

57-
Docker 使用分层技术和镜像,使得应用可以更容易复用重复部分。复用程度越高,维护工作也越容易。
49+
使用分层技术和镜像,使得应用可以更容易复用重复部分。复用程度越高,维护工作也越容易。
5850

5951
## 更容易扩展
6052

6153
可以使用基础镜像进一步扩展得到新的镜像,并且官方和开源社区提供了大量的镜像,通过扩展这些镜像可以非常容易得到我们想要的镜像。
6254

63-
参考资料:
64-
65-
- [为什么要使用 Docker?](https://yeasy.gitbooks.io/docker_practice/introduction/why.html)
66-
6755
# 四、使用场景
6856

6957
## 持续集成
@@ -80,11 +68,6 @@ Docker 具有轻量级以及隔离性的特点,在将代码集成到一个 Doc
8068

8169
Docker 轻量级的特点使得它很适合用于部署、维护、组合微服务。
8270

83-
参考资料:
84-
85-
- [What is Docker](https://www.docker.com/what-docker)
86-
- [持续集成是什么?](http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html)
87-
8871
# 五、镜像与容器
8972

9073
镜像是一种静态的结构,可以看成面向对象里面的类,而容器是镜像的一个实例。
@@ -95,9 +78,14 @@ Docker 轻量级的特点使得它很适合用于部署、维护、组合微服
9578

9679
<div align="center"> <img src="../pics//docker-filesystems-busyboxrw.png"/> </div><br>
9780

98-
参考资料
81+
# 参考资料
9982

83+
- [DOCKER 101: INTRODUCTION TO DOCKER WEBINAR RECAP](https://blog.docker.com/2017/08/docker-101-introduction-docker-webinar-recap/)
84+
- [Docker 入门教程](http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html)
85+
- [Docker container vs Virtual machine](http://www.bogotobogo.com/DevOps/Docker/Docker_Container_vs_Virtual_Machine.php)
10086
- [How to Create Docker Container using Dockerfile](https://linoxide.com/linux-how-to/dockerfile-create-docker-container/)
10187
- [理解 Docker(2):Docker 镜像](http://www.cnblogs.com/sammyliu/p/5877964.html)
102-
88+
- [为什么要使用 Docker?](https://yeasy.gitbooks.io/docker_practice/introduction/why.html)
89+
- [What is Docker](https://www.docker.com/what-docker)
90+
- [持续集成是什么?](http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html)
10391

notes/Git.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
<!-- GFM-TOC -->
2-
* [学习资料](#学习资料)
32
* [集中式与分布式](#集中式与分布式)
4-
* [Git 的中心服务器](#git-的中心服务器)
5-
* [Git 工作流](#git-工作流)
3+
* [中心服务器](#中心服务器)
4+
* [工作流](#工作流)
65
* [分支实现](#分支实现)
76
* [冲突](#冲突)
87
* [Fast forward](#fast-forward)
@@ -11,16 +10,10 @@
1110
* [SSH 传输设置](#ssh-传输设置)
1211
* [.gitignore 文件](#gitignore-文件)
1312
* [Git 命令一览](#git-命令一览)
13+
* [参考资料](#参考资料)
1414
<!-- GFM-TOC -->
1515

1616

17-
# 学习资料
18-
19-
- [Git - 简明指南](http://rogerdudler.github.io/git-guide/index.zh.html)
20-
- [图解 Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)
21-
- [廖雪峰 : Git 教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
22-
- [Learn Git Branching](https://learngitbranching.js.org/)
23-
2417
# 集中式与分布式
2518

2619
Git 属于分布式版本控制系统,而 SVN 属于集中式。
@@ -33,11 +26,13 @@ Git 属于分布式版本控制系统,而 SVN 属于集中式。
3326

3427
分布式版本控制新建分支、合并分支操作速度非常快,而集中式版本控制新建一个分支相当于复制一份完整代码。
3528

36-
# Git 的中心服务器
29+
# 中心服务器
3730

38-
Git 的中心服务器用来交换每个用户的修改。没有中心服务器也能工作,但是中心服务器能够 24 小时保持开机状态,这样就能更方便的交换修改。Github 就是一种 Git 中心服务器
31+
中心服务器用来交换每个用户的修改,没有中心服务器也能工作,但是中心服务器能够 24 小时保持开机状态,这样就能更方便的交换修改。
3932

40-
# Git 工作流
33+
Github 就是一个中心服务器。
34+
35+
# 工作流
4136

4237
<div align="center"> <img src="../pics//a1198642-9159-4d88-8aec-c3b04e7a2563.jpg"/> </div><br>
4338

@@ -54,22 +49,22 @@ Git 版本库有一个称为 stage 的暂存区,还有自动创建的 master
5449

5550
<div align="center"> <img src="../pics//17976404-95f5-480e-9cb4-250e6aa1d55f.png"/> </div><br>
5651

57-
可以跳过暂存区域直接从分支中取出修改或者直接提交修改到分支中
52+
可以跳过暂存区域直接从分支中取出修改,或者直接提交修改到分支中。
5853

5954
- git commit -a 直接把所有文件的修改添加到暂缓区然后执行提交
6055
- git checkout HEAD -- files 取出最后一次修改,可以用来进行回滚操作
6156

6257
# 分支实现
6358

64-
Git 把每次提交都连成一条时间线。分支使用指针来实现,例如 master 分支指针指向时间线的最后一个节点,也就是最后一次提交。HEAD 指针指向的是当前分支
59+
使用指针将每个提交连接成一条时间线,HEAD 指针指向当前分支指针
6560

6661
<div align="center"> <img src="../pics//fb546e12-e1fb-4b72-a1fb-8a7f5000dce6.jpg"/> </div><br>
6762

6863
新建分支是新建一个指针指向时间线的最后一个节点,并让 HEAD 指针指向新分支表示新分支成为当前分支。
6964

7065
<div align="center"> <img src="../pics//bc775758-89ab-4805-9f9c-78b8739cf780.jpg"/> </div><br>
7166

72-
每次提交只会让当前分支向前移动,而其它分支不会移动
67+
每次提交只会让当前分支指针向前移动,而其它分支指针不会移动
7368

7469
<div align="center"> <img src="../pics//5292faa6-0141-4638-bf0f-bb95b081dcba.jpg"/> </div><br>
7570

@@ -155,4 +150,9 @@ $ ssh-keygen -t rsa -C "youremail@example.com"
155150

156151
比较详细的地址:http://www.cheat-sheets.org/saved-copy/git-cheat-sheet.pdf
157152

153+
# 参考资料
158154

155+
- [Git - 简明指南](http://rogerdudler.github.io/git-guide/index.zh.html)
156+
- [图解 Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)
157+
- [廖雪峰 : Git 教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
158+
- [Learn Git Branching](https://learngitbranching.js.org/)

notes/HTTP.md

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
* [实体首部字段](#实体首部字段)
2626
* [五、具体应用](#五具体应用)
2727
* [Cookie](#cookie)
28+
* [6. Secure](#6-secure)
2829
* [缓存](#缓存)
2930
* [连接管理](#连接管理)
3031
* [内容协商](#内容协商)
@@ -310,7 +311,7 @@ HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使
310311

311312
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器之后向同一服务器再次发起请求时被携带上,用于告知服务端两个请求是否来自同一浏览器。由于之后每次请求都会需要携带 Cookie 数据,因此会带来额外的性能开销(尤其是在移动环境下)。
312313

313-
Cookie 曾一度用于客户端数据的存储,因为当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB。
314+
Cookie 曾一度用于客户端数据的存储,因为当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用 Web storage API(本地存储和会话存储)或 IndexedDB。
314315

315316
### 1. 用途
316317

@@ -348,7 +349,17 @@ Cookie: yummy_cookie=choco; tasty_cookie=strawberry
348349
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
349350
```
350351

351-
### 4. JavaScript 获取 Cookie
352+
### 4. 作用域
353+
354+
Domain 标识指定了哪些主机可以接受 Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了 Domain,则一般包含子域名。例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如 developer.mozilla.org)。
355+
356+
Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。例如,设置 Path=/docs,则以下地址都会匹配:
357+
358+
- /docs
359+
- /docs/Web/
360+
- /docs/Web/HTTP
361+
362+
### 5. JavaScript
352363

353364
通过 `Document.cookie` 属性可创建新的 Cookie,也可通过该属性访问非 HttpOnly 标记的 Cookie。
354365

@@ -358,25 +369,17 @@ document.cookie = "tasty_cookie=strawberry";
358369
console.log(document.cookie);
359370
```
360371

361-
### 5. Secure 和 HttpOnly
362-
363-
标记为 Secure 的 Cookie 只能通过被 HTTPS 协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。
372+
### 6. HttpOnly
364373

365374
标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。跨站脚本攻击 (XSS) 常常使用 JavaScript 的 `Document.cookie` API 窃取用户的 Cookie 信息,因此使用 HttpOnly 标记可以在一定程度上避免 XSS 攻击。
366375

367376
```html
368377
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
369378
```
370379

371-
### 6. 作用域
372-
373-
Domain 标识指定了哪些主机可以接受 Cookie。如果不指定,默认为当前文档的主机(不包含子域名)。如果指定了 Domain,则一般包含子域名。例如,如果设置 Domain=mozilla.org,则 Cookie 也包含在子域名中(如 developer.mozilla.org)。
380+
## 6. Secure
374381

375-
Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径必须存在于请求 URL 中)。以字符 %x2F ("/") 作为路径分隔符,子路径也会被匹配。例如,设置 Path=/docs,则以下地址都会匹配:
376-
377-
- /docs
378-
- /docs/Web/
379-
- /docs/Web/HTTP
382+
标记为 Secure 的 Cookie 只能通过被 HTTPS 协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。
380383

381384
### 7. Session
382385

@@ -387,8 +390,7 @@ Session 可以存储在服务器上的文件、数据库或者内存中。也可
387390
使用 Session 维护用户登录状态的过程如下:
388391

389392
- 用户进行登录时,用户提交包含用户名和密码的表单,放入 HTTP 请求报文中;
390-
- 服务器验证该用户名和密码;
391-
- 如果正确则把用户信息存储到 Redis 中,它在 Redis 中的 Key 称为 Session ID;
393+
- 服务器验证该用户名和密码,如果正确则把用户信息存储到 Redis 中,它在 Redis 中的 Key 称为 Session ID;
392394
- 服务器返回的响应报文的 Set-Cookie 首部字段包含了这个 Session ID,客户端收到响应报文之后将该 Cookie 值存入浏览器中;
393395
- 客户端之后对同一个服务器进行请求时会包含该 Cookie 值,服务器收到之后提取出 Session ID,从 Redis 中取出用户信息,继续之前的业务操作。
394396

@@ -462,13 +464,13 @@ Cache-Control: max-age=31536000
462464

463465
Expires 首部字段也可以用于告知缓存服务器该资源什么时候会过期。
464466

465-
- 在 HTTP/1.1 中,会优先处理 max-age 指令;
466-
- 在 HTTP/1.0 中,max-age 指令会被忽略掉。
467-
468467
```html
469468
Expires: Wed, 04 Jul 2012 08:26:05 GMT
470469
```
471470

471+
- 在 HTTP/1.1 中,会优先处理 max-age 指令;
472+
- 在 HTTP/1.0 中,max-age 指令会被忽略掉。
473+
472474
### 4. 缓存验证
473475

474476
需要先了解 ETag 首部字段的含义,它是资源的唯一标识。URL 不能唯一表示资源,例如 `http://www.google.com/` 有中文和英文两个资源,只有 ETag 才能对这两个资源进行唯一标识。
@@ -727,7 +729,7 @@ HTTPs 的报文摘要功能之所以安全,是因为它结合了加密和认
727729

728730
## HTTP/1.x 缺陷
729731

730-
HTTP/1.x 实现简单是以牺牲性能为代价的:
732+
HTTP/1.x 实现简单是以牺牲性能为代价的:
731733

732734
- 客户端需要使用多个连接才能实现并发和缩短延迟;
733735
- 不会压缩请求和响应首部,从而导致不必要的网络流量;
@@ -741,9 +743,9 @@ HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式
741743

742744
在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。
743745

744-
- 一个数据流都有一个唯一标识符和可选的优先级信息,用于承载双向信息。
745-
- 消息(Message)是与逻辑请求或响应消息对应的完整的一系列帧
746-
- 帧(Fram)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。
746+
- 一个数据流(Stream)都有一个唯一标识符和可选的优先级信息,用于承载双向信息。
747+
- 消息(Message)是与逻辑请求或响应对应的完整的一系列帧
748+
- 帧(Frame)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。
747749

748750
<div align="center"> <img src="../pics//af198da1-2480-4043-b07f-a3b91a88b815.png" width="600"/> </div><br>
749751

notes/Java IO.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* [装饰者模式](#装饰者模式)
77
* [四、字符操作](#四字符操作)
88
* [编码与解码](#编码与解码)
9-
* [String](#string)
9+
* [String 的编码方式](#string-的编码方式)
1010
* [Reader 与 Writer](#reader-与-writer)
1111
* [实现逐行输出文本文件的内容](#实现逐行输出文本文件的内容)
1212
* [五、对象操作](#五对象操作)
@@ -121,7 +121,7 @@ UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-
121121

122122
Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。
123123

124-
## String
124+
## String 的编码方式
125125

126126
String 可以看成一个字符序列,可以指定一个编码方式将它编码为字节序列,也可以指定一个编码方式将一个字节序列解码为 String。
127127

@@ -371,7 +371,7 @@ public static void fastCopy(String src, String dist) throws IOException {
371371
/* 获取目标文件的输出字节流 */
372372
FileOutputStream fout = new FileOutputStream(dist);
373373

374-
/* 获取输出字节流的通道 */
374+
/* 获取输出字节流的文件通道 */
375375
FileChannel fcout = fout.getChannel();
376376

377377
/* 为缓冲区分配 1024 个字节 */
@@ -392,7 +392,7 @@ public static void fastCopy(String src, String dist) throws IOException {
392392

393393
/* 把缓冲区的内容写入输出文件中 */
394394
fcout.write(buffer);
395-
395+
396396
/* 清空缓冲区 */
397397
buffer.clear();
398398
}
@@ -407,7 +407,7 @@ NIO 实现了 IO 多路复用中的 Reactor 模型,一个线程 Thread 使用
407407

408408
通过配置监听的通道 Channel 为非阻塞,那么当 Channel 上的 IO 事件还未到达时,就不会进入阻塞状态一直等待,而是继续轮询其它 Channel,找到 IO 事件已经到达的 Channel 执行。
409409

410-
因为创建和切换线程的开销很大,因此使用一个线程来处理多个事件而不是一个线程处理一个事件具有更好的性能
410+
因为创建和切换线程的开销很大,因此使用一个线程来处理多个事件而不是一个线程处理一个事件,对于 IO 密集型的应用具有很好地性能
411411

412412
应该注意的是,只有套接字 Channel 才能配置为非阻塞,而 FileChannel 不能,为 FileChannel 配置非阻塞也没有意义。
413413

@@ -601,8 +601,8 @@ MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
601601

602602
NIO 与普通 I/O 的区别主要有以下两点:
603603

604-
- NIO 是非阻塞的
605-
- NIO 面向块,I/O 面向流
604+
- NIO 是非阻塞的
605+
- NIO 面向块,I/O 面向流
606606

607607
# 八、参考资料
608608

0 commit comments

Comments
 (0)