Repository: frank-lam/fullstack-tutorial
Branch: master
Commit: 566d7368741e
Files: 234
Total size: 1.9 MB
Directory structure:
gitextract_4faglbb2/
├── .gitattributes
├── .github/
│ └── FUNDING.yml
├── .travis.yml
├── README.md
├── assets/
│ ├── deploy/
│ │ └── deploy.sh
│ └── mind/
│ └── 2019-learning.xmind
├── course/
│ ├── 01 玩转数据结构.md
│ ├── 02 玩转算法面试.md
│ ├── 03 算法与数据结构.md
│ ├── 04 Nginx从入门到实战.md
│ ├── 05 Java并发编程与高并发解决方案.md
│ ├── 06 HTTP协议原理+实践 Web开发工程师必学.md
│ ├── 07 SpringBoot微信点餐.md
│ ├── 08 廖雪峰的Java教程.md
│ ├── 09 Spring学习框架.md
│ ├── 10 Redis.md
│ ├── 11 SpringMVC.md
│ ├── 12 Mybatis.md
│ ├── 13 韩立刚计算机网络.md
│ ├── 14 韩立刚计算机网络2.md
│ ├── 15 咕泡学院-公开课.md
│ ├── 16 咕泡学院-JAVA开发中的热点技术剖析.md
│ ├── 17 咕泡学院-BAT面试课程.md
│ ├── 18 咕泡学院-性能优化.md
│ ├── 19 并发编程原理.md
│ ├── 20 MySQL性能管理及架构设计.md
│ ├── 21 JVM.md
│ ├── 22 白鹤翔_JVM虚拟机优化.md
│ ├── 23 MySQL大型分布式集群.md
│ ├── 24 操作系统(清华大学).md
│ ├── 25 Linux达人养成计划 I.md
│ ├── 26 Linux 达人养成计划 II.md
│ ├── 27 快速上手Linux 玩转典型应用.md
│ ├── 28 系统学习Docker 践行DevOps理念.md
│ ├── 30 Python Flask构建可扩展的RESTful API.md
│ ├── 31 学习Scala 进击大数据Spark生态圈.md
│ ├── 32 10小时入门大数据.md
│ ├── Java 架构师成长之路/
│ │ ├── 01 Java 单体应用.md
│ │ ├── 02 Java 微服务架构.md
│ │ ├── 03 Java 微服务实战.md
│ │ └── 04 Java 微服务架构 Dubbo 篇.md
│ ├── LEARN.md
│ ├── LEARNLIST.md
│ ├── LEARN_FULL.md
│ └── LEARN_RECORD.md
├── notes/
│ ├── DeepLearning/
│ │ ├── README.md
│ │ ├── assets/
│ │ │ └── README.md
│ │ ├── 深度学习入门课程.md
│ │ └── 深度学习初识.md
│ ├── DistributedSystem/
│ │ ├── 03 分布式通信-序列化.md
│ │ └── 04 分布式通信协议-http.md
│ ├── Docker.md
│ ├── Docker基础.md
│ ├── Docker实战.md
│ ├── EalsticSearch/
│ │ └── Untitled.md
│ ├── FastDFS.md
│ ├── Frontend/
│ │ ├── Angular.md
│ │ ├── README.md
│ │ ├── assets/
│ │ │ └── README.md
│ │ └── 前端知识体系.md
│ ├── Git.md
│ ├── Git命令速查.md
│ ├── Git工作流.md
│ ├── JavaArchitecture/
│ │ ├── 01-Java基础.md
│ │ ├── 02-Java集合框架.md
│ │ ├── 03-Java并发编程.md
│ │ ├── 04-Java-IO.md
│ │ ├── 05-Java虚拟机.md
│ │ ├── 06-Java设计模式.md
│ │ ├── 07-JavaWeb.md
│ │ ├── 08-系统架构.md
│ │ ├── Overview.md
│ │ └── assets/
│ │ └── 16002cfab99f86bc
│ ├── JavaWeb/
│ │ ├── Hibernate.md
│ │ ├── Mybatis.md
│ │ ├── Spring.md
│ │ └── 深入浅出IOC.md
│ ├── LEARNLIST.md
│ ├── Leetcode题解.md
│ ├── Linux.md
│ ├── Linux实战.md
│ ├── MachineLearning/
│ │ ├── README.md
│ │ └── assets/
│ │ └── README.md
│ ├── Memcached.md
│ ├── MicroService/
│ │ └── kafka/
│ │ ├── README.md
│ │ ├── kafka-tutorial-1_初识.md
│ │ ├── kafka-tutorial-2_单节点部署.md
│ │ ├── kafka-tutorial-3_集群化部署.md
│ │ ├── kafka-tutorial-4_架构深入.md
│ │ ├── kafka-tutorial-5_kafka-api.md
│ │ ├── kafka-tutorial-6_spring-kafka-api.md
│ │ └── kafka-tutorial-7_监控.md
│ ├── MySQL.md
│ ├── Nginx.md
│ ├── PostgreSQL.md
│ ├── Python/
│ │ ├── Python安装.md
│ │ ├── Python简介及基础语法.md
│ │ └── 流畅的Python/
│ │ ├── README.md
│ │ ├── python命名空间.md
│ │ ├── python字节码-补充内容.md
│ │ ├── python时间模块.md
│ │ ├── 上下文管理器和else块.md
│ │ ├── 使用asyncio包处理并发.md
│ │ ├── 使用future处理并发.md
│ │ ├── 使用一等函数实现设计模式.md
│ │ ├── 函数.md
│ │ ├── 函数装饰器和闭包.md
│ │ ├── 动态属性和特性.md
│ │ ├── 协程-补充内容.md
│ │ ├── 协程.md
│ │ ├── 可迭代的对象-迭代器和生成器.md
│ │ ├── 字典和集合.md
│ │ ├── 对象引用-可变性和垃圾回收.md
│ │ ├── 属性描述符.md
│ │ ├── 常见问题答疑.md
│ │ ├── 序列构成的数组.md
│ │ ├── 序列的修改-散列和切片.md
│ │ ├── 序幕.md
│ │ ├── 扩展内容.md
│ │ ├── 抽象类.md
│ │ ├── 文本和字节序列.md
│ │ ├── 正确重载运算符.md
│ │ ├── 符合Python风格的对象.md
│ │ ├── 类元编程.md
│ │ └── 类继承.md
│ ├── RESTful API.md
│ ├── Redis.md
│ ├── SQL.md
│ ├── SkillTree/
│ │ ├── assets/
│ │ │ ├── backend-skill-from-zero.xmind
│ │ │ └── backend-skill.xmind
│ │ └── backend-skill.md
│ ├── Socket.md
│ ├── SpringBoot/
│ │ └── README.md
│ ├── XP极限编程.md
│ ├── archives/
│ │ ├── 我的秋招之路.md
│ │ └── 手把手教你,搭建内网穿透服务.md
│ ├── assets/
│ │ ├── 20150924172800834
│ │ └── 20150924173757246
│ ├── data-structures-and-algorithms/
│ │ ├── LeetCode.md
│ │ ├── README.md
│ │ ├── leetcode/
│ │ │ └── Leetcode 307. 区域和检索 - 数组可修改.md
│ │ ├── 数据结构.md
│ │ └── 算法思想.md
│ ├── docs/
│ │ └── 如何给我的仓库贡献.md
│ ├── docsify/
│ │ ├── about/
│ │ │ ├── author.md
│ │ │ └── donate.md
│ │ ├── coverpage.md
│ │ ├── css/
│ │ │ └── main.css
│ │ ├── index.html
│ │ ├── js/
│ │ │ ├── .eslintrc.js
│ │ │ └── main.js
│ │ ├── navbar.md
│ │ ├── sidebar.md
│ │ └── unpkg/
│ │ ├── docsify/
│ │ │ └── lib/
│ │ │ └── plugins/
│ │ │ ├── emoji.js
│ │ │ └── search.js
│ │ ├── docsify-themeable/
│ │ │ └── dist/
│ │ │ └── css/
│ │ │ ├── theme-defaults.css
│ │ │ ├── theme-simple-dark.css
│ │ │ └── theme-simple.css
│ │ ├── gitalk/
│ │ │ └── dist/
│ │ │ └── gitalk.css
│ │ └── gotop/
│ │ └── jquery-2.1.0.js
│ ├── git-tutorial.md
│ ├── index.html
│ ├── introduction.md
│ ├── my_linux_cmd.md
│ ├── project/
│ │ └── README.md
│ ├── reference.md
│ ├── somecoolblog.md
│ ├── web应用开发标准流程.md
│ ├── 全栈开发神兵利器.md
│ ├── 分布式/
│ │ └── Zookeeper.md
│ ├── 分布式.md
│ ├── 分布式锁/
│ │ └── 分布式锁.md
│ ├── 分布式锁.md
│ ├── 大数据.md
│ ├── 如何选择自己的技术栈.md
│ ├── 开源贡献.md
│ ├── 微服务.md
│ ├── 技术交流群.md
│ ├── 技术点实践.md
│ ├── 持续集成.md
│ ├── 操作系统.md
│ ├── 数据结构.md
│ ├── 数据结构与算法.md
│ ├── 智力题.md
│ ├── 架构师成长之路.md
│ ├── 正则表达式.md
│ ├── 海量数据处理.md
│ ├── 网络安全.md
│ ├── 计算机网络.md
│ ├── 超简版面试清单.md
│ ├── 软件测试.md
│ ├── 面试话术.md
│ └── 项目实践与技术分析.md
└── others/
├── OVERVIEW.md
├── Overview_ulli.md
├── Skill-Tree.md
├── UPLOG.md
├── blog/
│ ├── 20180606 用别名(alias)创建你自己的命令.md
│ ├── 20180609 Spring Boot热部署.md
│ ├── 20180620 JWT API安全.md
│ ├── 20180621 20小时学会任何技能.md
│ └── 20180701 深入理解快速排序.md
├── book/
│ ├── Java程序员面试笔试宝典.md
│ └── 关键20小时,快速学会任何技能!.epub
├── devdoc/
│ ├── IntelliJ IDEA/
│ │ ├── debug技巧.md
│ │ └── lombok插件使用.md
│ ├── Java/
│ │ ├── HTTPS配置.md
│ │ ├── IDEA使用操作.md
│ │ ├── Java环境搭建.md
│ │ └── Spring Boot热部署.md
│ ├── MySQL/
│ │ └── mysql设置远程连接.md
│ ├── redis/
│ │ └── redis安装.md
│ ├── sublime/
│ │ └── sublime右键菜单设置.md
│ └── tools/
│ ├── 01 Navicat 工具破解说明.md
│ └── 02 Idea破解.md
├── emoji.md
├── interview/
│ ├── InterviewOneDay/
│ │ ├── 20180807 阿里云面经.md
│ │ ├── 20180810 招银网络科技.md
│ │ ├── 20180811 蘑菇街.md
│ │ ├── 20180813 京东.md
│ │ ├── 20180820 Java面试不相信眼泪.md
│ │ ├── 20180823 网易游戏2017暑期实习生面经 Java开发.md
│ │ ├── 20180823 网易考拉 java 凉面面经.md
│ │ ├── 20180823 聊聊C10K问题及解决方案.md
│ │ └── README.md
│ ├── Java面试经验贴.md
│ ├── TODOLIST.md
│ ├── interview-daily/
│ │ ├── 20180901 有道简单面经.md
│ │ ├── 20180902 金山云一二三面.md
│ │ └── 20180913 美团三面.md
│ ├── 秋招面经_重口味AC.md
│ └── 面经资源.md
├── pics_tag.md
└── reference/
└── 参考资料.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
*.js linguist-language=java
*.css linguist-language=java
*.html linguist-language=java
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: https://raw.githubusercontent.com/frank-lam/fullstack-tutorial/master/assets/wechat/wx-green.png
================================================
FILE: .travis.yml
================================================
sudo: required
script: bash ./assets/deploy/deploy.sh
branches:
only:
- master
notifications:
email: true
================================================
FILE: README.md
================================================

| I | II | III | IV | V | VI | VII | VIII | IX | X | XI | XII |
| :--------------------------: | :-------------------: | :----------------------: | :---------------------: | :--------------: | :---------------: | :----------------------: | :----------------------: | :----------------------: | :----------------------: | :----------------------: | :----------------------: |
| 算法
[📝](#一数据结构与算法) | Java
[☕️](#二java) | Python
[🐍](#三python) | 前端
[🔗](#四前端) | 数据库
[💾](#五数据库) | 操作系统
[💻](#六操作系统) | 网络通信
[☁️](#七网络通信) | 分布式
[📃](#八分布式) | 机器学习
[🔍](#九机器学习) |工具
[🔨](#十工具) |Learn
[📖](#learn-) |Talking
[💡](#talking-bulb) |
🔥🔥🔥
欢迎光临 LinTools 开发者的在线导航: https://tools.frankfeekr.cn
如果你有更好的在线工具,[请点击留言](https://github.com/frank-lam/fullstack-tutorial/issues/65),持续更新!
## 前言
- [谈谈技术学习的一些方法论](https://www.frankfeekr.cn/2019/05/09/谈谈技术学习的一些方法论/)
在学习技术这条路上并不是一帆风顺,也一直在探索一条适合自己的学习方法。从一开始的技术小白,到现在还比较上道的老鸟,在这个过程中走了太多的弯路,想在这里和大家分享一些我的经历和学习方法。
- [如何选择自己的技术栈](https://www.frankfeekr.cn/2019/05/27/如何选择自己的技术栈/)
在编程的世界里,该如何选择自己的技术栈呢。学前端?学 APP 开发?对于 Java、C++、C#、Python、PHP 又如何选择呢?人工智能现如今这么火,是不是机器学习、深度学习更高级一些呢?那么程序员又如何修炼内功呢?
- [全栈开发神兵利器](notes/全栈开发神兵利器.md)
工欲善其事,必先利其器。这里我将推荐开发过程中的提效工具、开发利器、协作工具、文档技术等等。
- [XP 极限编程](notes/XP极限编程.md)
敏捷软件开发中可能是最富有成效的几种方法学之一
## 技能图谱
- [backend skill](notes/SkillTree/backend-skill.md)
后台开发技能图谱,从程序员的内功修炼到后台语言,分布式系统架构
## 一、数据结构与算法
- [数据结构与算法](notes/数据结构与算法.md)
排序算法、动态规划、递归、回溯法、贪心算法等
- [海量数据处理](notes/海量数据处理.md)
数据处理典型案例,逐渐更新
## 二、Java
- [Java 基础概念](notes/JavaArchitecture/01-Java基础.md)
基本概念、面向对象、关键字、基本数据类型与运算、字符串与数组、异常处理、Object 通用方法
- [Java 集合框架](notes/JavaArchitecture/02-Java集合框架.md)
数据结构 & 源码分析:ArrayList、Vector、LinkedList、HashMap、ConcurrentHashMap、HashSet、LinkedHashSet and LinkedHashMap
- [Java 并发编程](notes/JavaArchitecture/03-Java并发编程.md)
线程状态、线程机制、线程通信、J.U.C 组件、JMM、线程安全、锁优化
- [Java I/O](notes/JavaArchitecture/04-Java-IO.md)
磁盘操作、字节操作、字符操作、对象操作、网络操作、NIO
- [Java 虚拟机](notes/JavaArchitecture/05-Java虚拟机.md)
运行时数据区域、垃圾收集、内存分配机制、类加载机制、性能调优监控工具
- [Java 设计模式](notes/JavaArchitecture/06-Java设计模式.md)
Java 常见的 10 余种设计模式,全 23 种设计模式逐步更新
- [Java Web](notes/JavaArchitecture/07-JavaWeb.md)
包含 Servlet & JSP、Spring、SpringMVC、Mybatis、Hibernate、Structs2 核心思想,如 IOC、AOP 等思想。SSM 更详细请转向:[Spring](notes/JavaWeb/Spring.md) | [SpringMVC](https://github.com/frank-lam/SpringMVC_MyBatis_Learning) | [MyBatis](https://github.com/frank-lam/SpringMVC_MyBatis_Learning)
## 三、Python
- [Python 语言基础](notes/Python/Python简介及基础语法.md)
## 四、前端
- [前端知识体系](notes/Frontend/前端知识体系.md)
- [Angular 基础知识](notes/Frontend/Angular.md)
- [ES6+ 语法全解析](https://notes.frankfeekr.cn/docs/frontend/es6/%E9%A1%B9%E7%9B%AE%E5%87%86%E5%A4%87/%E5%89%8D%E8%A8%80)
TODO LIST
- HTML5
- CSS3
- CSS 预处理
- sass(scss)
- less
- stylus
- CSS 框架
- BootStarp
- LayUI
- JavaScript
基础语法、进阶、ES6
- JavaScript 框架
- Vue
- React
- Angular
- jQuery
- Node
常用 api、对象池、异常处理、进程通信、高并发
- 静态类型检查
- TypeScript
- Flow
- 构建/打包工具
- webpack
- gulp
- rollup
- 包管理工具
- npm
- yarn
- 服务端渲染
- koa2
- express
- nuxt
- next
## 五、数据库
- [MySQL](notes/MySQL.md)
存储引擎、事务隔离级别、索引、主从复制
- [Redis](notes/Redis.md)
Redis 核心知识
- [SQL](notes/SQL.md)
常用 SQL 语句
- [PostgreSQL](notes/PostgreSQL.md)
一个开源的关系数据库,是从伯克利写的 POSTGRES 软件包发展而来的
- [InfluxDB](https://www.frankfeekr.cn/2019/07/24/influxdb-tutorial-start/)
玩转时序数据库
## 六、操作系统
- [操作系统原理](notes/操作系统.md)
进程管理、死锁、内存管理、磁盘设备
- [Linux](notes/Linux.md)
基础核心概念、常用命令使用
## 七、网络通信
- [计算机网络](notes/计算机网络.md)
传输层、应用层(HTTP)、网络层、网络安全
- [RESTful API](notes/RESTful%20API.md)
软件架构风格、格设计原则和约束条件
- [Web网络安全](notes/网络安全.md)
web前后端漏洞分析与防御,XSS 攻击、CSRF 攻击、DDoS 攻击、SQL 注入
## 八、分布式
- [Docker](notes/Docker基础.md)
容器化引擎服务
- [微服务](notes/微服务.md)
微服务简介、API 网关、服务注册发现、服务通信
- [Zookeeper](notes/分布式/Zookeeper.md)
分布式协调服务,服务注册发现
- [Kafka](notes/MicroService/kafka/README.md)
深入浅出 Kafka,将用最极简的语言带你走进 Kafka 的消息中间件世界
【说明】**分布式专题** 笔者也在学习中,这里列举了一些技能列表,笔者将局部更新。敬请期待
TODO LIST
- Kubernetes(k8s)
容器化部署,管理云平台中多个主机上的容器化的应用
- 云计算
SaaS(软件即服务) 、PaaS(平台即服务) 、IaaS(基础架构即服务)
- Zookeeper
分布式协调服务,服务注册发现
- Dubbo、Thrift(RPC 框架)
分布式服务治理
- 分布式事务解决方案
- ActiveMQ、Kafka、RabbitMQ
分布式消息通信
- 熔断,限流,降级机制
- Redis
分布式缓存
- Mycat
数据库路由
- Nginx
反向代理
- Tomcat
Web Server 服务
- DevOps
自动化运维,持续集成、持续交付、持续部署
- 分布式锁
基于 Redis、MySQL、Zookeeper 的分布式锁实现
- FastDFS
轻量级分布式文件管理系统
- Go
并发的、带垃圾回收的、快速编译的语言
## 九、机器学习
- [深度学习初识](notes/DeepLearning/深度学习初识.md)
- 经典机器学习算法
K 近邻算法、线性回归、梯度下降法、逻辑回归、支持向量机、决策树、集成学习
## 十、工具
- [Git](notes/git-tutorial.md)
学习指引,将用最极简的语言带你进入 Git 版本控制的世界
- [Git 工作流](notes/Git工作流.md)
集中式工作流,功能分支工作流, GitFlow 工作流,Forking 工作流,Pull Requests
- [正则表达式](notes/正则表达式.md)
常见符号含义,速查表
- [手把手教你搭建内网穿透服务](https://github.com/frank-lam/lanproxy-nat)
基于 lanproxy 穿透服务,为你定了一键启动的服务端和客户端 Docker 镜像
- [基于 SpringBoot & IDEA & JRebel 玩转远程热部署与远程调试](https://www.frankfeekr.cn/2019/07/17/springboot-idea-jrebel-hotswap/)
手把手带你玩转,远程调试与远程热部署
- [什么是 TDD 及常见的测试方法](notes/软件测试.md)
## Learn 📖
- [LEARN_LIST](notes/LEARNLIST.md)
包含阅读清单,学习课程两部分
- [web应用开发标准流程](notes/web应用开发标准流程.md)
## Talking :bulb:
本仓库致力于成为一个全栈开发爱好者的学习指南,给初学者一个更明确的学习方向,同时也是对自己技能的强化和巩固。在架构师这条路上,希望和大家一起成长,帮助更多的计算机爱好者能够有一个明确的学习路径。持续不间断的维护本仓库,也欢迎有更多的极客们加入。
都说好记性不如烂笔头,定期的学习和整理必然对学习巩固有所帮助,这里通过索引的方式对全栈开发技术做一个系统分类,方便随时巩固和学习,当然还有面试。在学习这条路上难免会有很多盲点和学不完的知识。有道无术,术尚可求,掌握好思维能力才能应对千变万化的技术。不要把大脑当成硬盘,也不要做高速运转的 CPU,而修行自己的大脑成为一个搜索引擎,学会分析解决问题。
Since 20,May,2018
## Reference
个人的能力有限,在编写的过程中引用了诸多优秀的 GitHub 仓库。本项目的启发来自 [@CyC2018](https://github.com/CyC2018) 的学习笔记,是一个非常优秀的开源项目,在本仓库中部分内容引用文字和图例;引用了 [@计算所的小鼠标](https://github.com/CarpenterLee) 中对于 JCF 的源码分析和理解;引用了 [阿里面试题总结](https://www.nowcoder.com/discuss/5949) 中全部的面试题,并对面经进行了整理勘误,并进行了知识拓展和修改;引用了 [牛客网](https://www.nowcoder.com) 上的面试经验贴。也引用了知乎上的热门回答和优秀博客的回答。在这里特别鸣谢,我将每篇文章中做外链引用说明。
文中我也推荐了学习的书籍和学习课程,都将附着上最高清、最形象的配图进行讲解。在文中的配图都来自自己绘制的、博客、Github、PDF书籍等等,这里没法一一感谢,谢谢你们。
推荐一些优秀的开源项目,供大家参考,[reference](notes/reference.md)。
## Contributors
Thank you to all the people who already contributed to fullstack-tutorial !
Please make sure to read the [Contributing Guide/如何给我的仓库贡献](notes/docs/如何给我的仓库贡献.md) before making a pull request.
## Stargazers over time

## License
Copyright (c) 2021-present, Frank Lam
## 关于作者 :boy:
在颠覆世界的同时,也要好好关照自己。
from zero to hero.

================================================
FILE: assets/deploy/deploy.sh
================================================
#!/usr/bin/env sh
# 确保脚本抛出遇到的错误
set -e
rm gh-pages -rf; mkdir gh-pages; cp -r notes/* gh-pages/;
cd gh-pages;
# 将子目录的所有图片全部复制到文档根目录中,解决docsify图片索引不到的问题
rm assets/ -rf
mkdir assets
rm pics/ -rf
mkdir pics
for f in $(find ../notes/ -type f -print | grep assets)
do
cp $f ./assets
done
for f in $(find ../notes/ -type f -print | grep pics)
do
cp $f ./pics
done
# 进入生成的文件夹
#创建.nojekyll 防止Github Pages build错误
touch .nojekyll
git init
git add -A
git commit -m 'deploy'
git push -f "https://${GH_TOKEN}@github.com/frank-lam/fullstack-tutorial.git" master:gh-pages
cd -
================================================
FILE: course/01 玩转数据结构.md
================================================
## 刘宇波《玩转数据结构》学习记录
| 章节 | 记录 |
| ------------------------------------------- | ---- |
| **第1章 欢迎学习《玩转数据结构》** | |
| 1-1 欢迎学习《玩转数据结构》 | |
| 1-2 学习数据结构(和算法)到底有没有用? | |
| 1-3 关于课程学习的更多注意事项 | |
| 1-4 课程编程环境搭建 | |
| | |
| **第2章 不要小瞧数组** | |
| 2-1 使用Java中的数组 | |
| 2-2 二次封装属于我们自己的数组 | |
| 2-3 向数组中添加元素 | |
| 2-4 数组中查询元素和修改元素 | |
| 2-5 包含,搜索和删除 | |
| 2-6 使用泛型 | |
| 2-7 动态数组 | |
| 2-8 简单的复杂度分析 | |
| 2-9 均摊复杂度和防止复杂度的震荡 | |
| | |
| **第3章 栈和队列** | |
| 3-1 栈和栈的应用:撤销操作和系统栈 | 5/21 |
| 3-2 栈的基本实现 | 5/21 |
| 3-3 栈的另一个应用:括号匹配 | 5/21 |
| 3-4 关于Leetcode的更多说明 | 5/21 |
| 3-5 数组队列 | 5/21 |
| 3-6 循环队列 | 5/21 |
| 3-7 循环队列的实现 | 5/21 |
| 3-8 数组队列和循环队列的比较 | 5/21 |
| | |
| **第4章 最基础的动态数据结构:链表** | |
| 4-1 什么是链表 | |
| 4-2 在链表中添加元素 | |
| 4-3 使用链表的虚拟头结点 | |
| 4-4 链表的遍历,查询和修改 | |
| 4-5 从链表中删除元素 | |
| 4-6 使用链表实现栈 | |
| 4-7 带有尾指针的链表:使用链表实现队列 | |
| | |
| **第5章 链表和递归** | |
| 5-1 Leetcode中和链表相关的问题 | |
| 5-2 测试自己的Leetcode链表代码 | |
| 5-3 递归基础与递归的宏观语意 | |
| 5-4 链表的天然递归结构性质 | |
| 5-5 递归运行的机制:递归的微观解读 | |
| 5-6 递归算法的调试 | |
| 5-7 更多和链表相关的问题 | |
| | |
| **第6章 二分搜索树** | |
| 6-1 为什么要研究树结构 | 6/29 |
| 6-2 二分搜索树基础 | 6/29 |
| 6-3 向二分搜索树中添加元素 | 6/29 |
| 6-4 改进添加操作:深入理解递归终止条件 | 6/30 |
| 6-5 二分搜索树的查询操作 | 6/30 |
| 6-6 二分搜索树的前序遍历 | 6/30 |
| 6-7 二分搜索树的中序遍历和后序遍历 | 6/30 |
| 6-8 深入理解二分搜索树的前中后序遍历 | 6/30 |
| 6-9 二分搜索树前序遍历的非递归实现——**通过栈实现** | 6/30 |
| 6-10 二分搜索树的层序遍历——**通过队列实现** | 6/30 |
| 6-11 删除二分搜索树的最大元素和最小元素 | 6/30 |
| 6-12 删除二分搜索树的任意元素 | 6/30 |
| 6-13 更多二分搜索树相关话题 | 6/30 |
| | |
| **第7章 集合和映射** | |
| 7-1 集合基础和基于二分搜索树的集合实现 | |
| 7-2 基于链表的集合实现 | |
| 7-3 集合类的复杂度分析 | |
| 7-4 _Leetcode中的集合问题和更多集合相关问题 | |
| 7-5 映射基础 | |
| 7-6 基于链表的映射实现 | |
| 7-7 基于二分搜索树的映射实现 | |
| 7-8 映射的复杂度分析和更多映射相关问题 | |
| 7-9 Leetcode上更多集合和映射的问题 | |
| | |
| **第8章 优先队列和堆** | |
| 8-1 什么是优先队列 | |
| 8-2 堆的基础表示 | |
| 8-3 向堆中添加元素和Sift Up | |
| 8-4 从堆中取出元素和Sift Down | |
| 8-5 Heapify 和 Replace | |
| 8-6 基于堆的优先队列 | |
| 8-7 Leetcode上优先队列相关问题 | |
| 8-8 Java中的PriorityQueue | |
| 8-9 和堆相关的更多话题和广义队列 | |
| ||
| **第9章 线段树** ||
| 9-1 什么是线段树 ||
| 9-2 线段树基础表示 ||
| 9-3 创建线段树 ||
| 9-4 线段树中的区间查询 ||
| 9-5 Leetcode上线段树相关的问题 ||
| 9-6 线段树中的更新操作 ||
| 9-7 更多线段树相关的话题 ||
| ||
| **第10章 Trie** ||
| 10-1 什么是Trie字典树 ||
| 10-2 Trie字典树基础 ||
| 10-3 Trie字典树的查询 ||
| 10-4 Trie字典树的前缀查询 ||
| 10-5 Trie字典树和简单的模式匹配 ||
| 10-6 Trie字典树和字符串映射 ||
| 10-7 更多和Trie字典树相关的话题 ||
| ||
| **第11章 并查集** ||
| 11-1 什么是并查集 ||
| 11-2 Quick Find ||
| 11-3 Quick Union ||
| 11-4 基于size的优化 ||
| 11-5 基于rank的优化 ||
| 11-6 路径压缩 ||
| 11-7 更多和并查集相关的话题 ||
| ||
| **第12章 AVL** ||
| 12-1 平衡树和AVL ||
| 12-2 计算节点的高度和平衡因子 ||
| 12-3 检查二分搜索树性质和平衡性 ||
| 12-4 旋转操作的基本原理 ||
| 12-5 左旋转和右旋转的实现 ||
| 12-6 LR 和 RL ||
| 12-7 从AVL树中删除元素 ||
| 12-8 基于AVL树的集合和映射 ||
| | |
| **第13章 红黑树** | |
| 13-1 红黑树与2-3树 | |
| 13-2 2-3树的绝对平衡性 | |
| 13-3 红黑树与2-3树的等价性 | |
| 13-4 红黑树的基本性质和复杂度分析 | |
| 13-5 保持根节点为黑色和左旋转 | |
| 13-6 颜色翻转和右旋转 | |
| 13-7 红黑树中添加新元素 | |
| 13-8 红黑树的性能测试 | |
| 13-9 更多和红黑树相关的话题 | |
| 13-10 对于红黑树,任何不平衡都会在三次旋转内解决? | |
| | |
| **第14章 哈希表** | |
| 14-1 哈希表基础 | |
| 14-2 哈希函数的设计 | |
| 14-3 Java中的 hashCode 方法 | |
| 14-4 链地址法 Seperate Chaining | |
| 14-5 实现属于我们自己的哈希表 | |
| 14-6 哈希表的动态空间处理与复杂度分析。 | |
| 14-7 哈希表更复杂的动态空间处理方法 | |
| 14-8 更多哈希冲突的处理方法 | |
| | |
| **第15章 结尾语** | |
| 15-1 更广阔的数据结构的世界,大家加油! | |
**2018年7月10日完结**
================================================
FILE: course/02 玩转算法面试.md
================================================
## 刘宇波《玩转算法面试》学习记录
| 章节 | 记录 |
| ------------------------------------------------------------ | ---- |
| **第1章 算法面试到底是什么鬼?** | |
| 1-1 算法面试不仅仅是正确的回答问题 | |
| 1-2 算法面试只是面试的一部分 | |
| 1-3 如何准备算法面试 | |
| 1-4 如何回答算法面试问题 | |
| | |
| **第2章 面试中的复杂度分析** | |
| 2-1 究竟什么是大O(Big O) | |
| 2-2 对数据规模有一个概念 | |
| 2-3 简单的复杂度分析 | |
| 2-4 亲自试验自己算法的时间复杂度 | |
| 2-5 递归算法的复杂度分析 | |
| 2-6 均摊时间复杂度分析(Amortized Time Analysis) | |
| 2-7 避免复杂度的震荡 | |
| | |
| **第3章 数组中的问题其实最常见** | |
| 3-1 从二分查找法看如何写出正确的程序 | |
| 3-2 改变变量定义,依然可以写出正确的算法 | |
| 3-3 在LeetCode上解决第一个问题 Move Zeros | |
| 3-4 即使简单的问题,也有很多优化的思路 | |
| 3-5 三路快排partition思路的应用 Sort Color | |
| 3-6 对撞指针 Two Sum II - Input Array is Sorted | |
| 3-7 滑动窗口 Minimum Size Subarray Sum | |
| 3-8 在滑动窗口中做记录 Longest Substring Without Repeating Characters | |
| | |
| **第4章 查找表相关问题** | |
| 4-1 set的使用 Intersection of Two Arrays | |
| 4-2 map的使用 Intersection of Two Arrays II | |
| 4-3 set和map不同底层实现的区别 | |
| 4-4 使用查找表的经典问题 Two Sum | |
| 4-5 灵活选择键值 4Sum II | |
| 4-6 灵活选择键值 Number of Boomerangs | |
| 4-7 查找表和滑动窗口 Contain Duplicate II | |
| 4-8 二分搜索树底层实现的顺序性 Contain Duplicate III | |
| | |
| **第5章 在链表中穿针引线** | |
| 5-1 链表,在节点间穿针引线 Reverse Linked List | |
| 5-2 测试你的链表程序 | |
| 5-3 设立链表的虚拟头结点 Remove Linked List Elements | |
| 5-4 复杂的穿针引线 Swap Nodes in Pairs | |
| 5-5 不仅仅是穿针引线 Delete Node in a Linked List | |
| 5-6 链表与双指针 Remove Nth Node Form End of List | |
| | |
| **第6章 栈,队列,优先队列** | |
| 6-1 栈的基础应用 Valid Parentheses | |
| 6-2 栈和递归的紧密关系 Binary Tree Preorder, Inorder and Postorder Traversal | |
| 6-3 运用栈模拟递归 | |
| 6-4 队列的典型应用 Binary Tree Level Order Traversal | |
| 6-5 BFS和图的最短路径 Perfect Squares | |
| 6-6 优先队列 | |
| 6-7 优先队列相关的算法问题 Top K Frequent Elements | |
| | |
| **第7章 二叉树和递归** | |
| 7-1 二叉树天然的递归结构 | |
| 7-2 一个简单的二叉树问题引发的血案 Invert Binary Tree | |
| 7-3 注意递归的终止条件 Path Sum | |
| 7-4 定义递归问题 Binary Tree Path | |
| 7-5 稍复杂的递归逻辑 Path Sum III | |
| 7-6 二分搜索树中的问题 Lowest Common Ancestor of a Binary Search Tree | |
| | |
| **第8章 递归和回溯法** | |
| 8-1 树形问题 Letter Combinations of a Phone Number | 7/19 |
| 8-2 什么是回溯 | |
| 8-3 排列问题 Permutations | |
| 8-4 组合问题 Combinations | |
| 8-5 回溯法解决组合问题的优化 | |
| 8-6 二维平面上的回溯法 Word Search | |
| 8-7 floodfill算法,一类经典问题 Number of Islands- | |
| 8-8 回溯法是经典人工智能的基础 N Queens | |
| | |
| **第9章 动态规划基础** | |
| 9-1 什么是动态规划 | |
| 9-2 第一个动态规划问题 Climbing Stairs | |
| 9-3 发现重叠子问题 Integer Break | |
| 9-4 状态的定义和状态转移 House Robber | |
| 9-5 0-1背包问题 | |
| 9-6 0-1背包问题的优化和变种 | |
| 9-7 面试中的0-1背包问题 Partition Equal Subset Sum | |
| 9-8 LIS问题 Longest Increasing Subsequence | |
| 9-9 LCS,最短路,求动态规划的具体解以及更多 | |
| | |
| **第10章 贪心算法** | |
| 10-1 贪心基础 Assign Cookies | |
| 10-2 贪心算法与动态规划的关系 Non-overlapping Intervals | |
| 10-3 贪心选择性质的证明 | |
| | |
| **第11章 课程结语** | |
| 11-1 结语 | |
================================================
FILE: course/03 算法与数据结构.md
================================================
## 刘宇波《算法与数据结构》学习记录
| 章节 | 记录 |
| ------------------------------------------------------------ | ---- |
| **第1章 当我们在讨论算法的时候,我们在讨论什么?** ||
| 1-1 我们究竟为什么要学习算法 ||
| 1-2 课程介绍 ||
| ||
| **第2章 排序基础** ||
| 2-1 选择排序法 ||
| 2-2 使用模板(泛型)编写算法 ||
| 2-3 随机生成算法测试用例 ||
| 2-4 测试算法的性能 ||
| 2-5 插入排序法 ||
| 2-6 插入排序法的改进 ||
| 2-7 更多关于O(n*2)排序算法的思考 ||
| ||
| **第3章 高级排序问题** ||
| 3-1 归并排序法 ||
| 3-2 归并排序法的实现 ||
| 3-3 归并排序法的优化 ||
| 3-4 自底向上的归并排序算法 ||
| 3-5 快速排序法 ||
| 3-6 随机化快速排序法 ||
| 3-7 双路快速排序法 ||
| 3-8 三路快速排序法 ||
| 3-9 归并排序和快速排序的衍生问题 ||
| ||
| **第4章 堆和堆排序** ||
| 4-1 为什么使用堆 ||
| 4-2 堆的基本存储 ||
| 4-3 Shift Up ||
| 4-4 Shift Down ||
| 4-5 基础堆排序和Heapify ||
| 4-6 优化的堆排序 ||
| 4-7 排序算法总结 ||
| 4-8 索引堆 ||
| 4-9 索引堆的优化 ||
| 4-10 和堆相关的其他问题 ||
| ||
| **第5章 二分搜索树** ||
| 5-1 二分查找法 ||
| 5-2 二分搜索树基础 ||
| 5-3 二分搜索树的节点插入 ||
| 5-4 二分搜索书的查找 ||
| 5-5 二分搜索树的遍历(深度优先遍历) ||
| 5-6 层序遍历(广度优先遍历) ||
| 5-7 删除最大值,最小值 ||
| 5-8 二分搜索树的删除 ||
| 5-9 二分搜索树的顺序性 ||
| 5-10 二分搜索树的局限性 ||
| 5-11 树形问题和更多树。 ||
| ||
| **第6章 并查集** ||
| 6-1 并查集基础 ||
| 6-2 Qucik Find ||
| 6-3 Quick Union ||
| 6-4 基于size的优化 ||
| 6-5 基于rank的优化 ||
| 6-6 路径压缩 ||
| ||
| **第7章 图的基础** ||
| 7-1 图论基础 ||
| 7-2 图的表示 ||
| 7-3 相邻点迭代器 ||
| 7-4 图的算法框架 ||
| 7-5 深度优先遍历和联通分量 ||
| 7-6 寻路 ||
| 7-7 广度优先遍历和最短路径 ||
| 7-8 迷宫生成,ps抠图--更多无权图的应用 ||
| ||
| **第8章 最小生成树** ||
| 8-1 有权图 ||
| 8-2 最小生成树问题和切分定理 ||
| 8-3 Prim算法的第一个实现 ||
| 8-4 Prim算法的优化 ||
| 8-5 优化后的Prim算法的实现 ||
| 8-6 Krusk算法 ||
| 8-7 最小生成树算法的思考 ||
| ||
| **第9章 最短路径** ||
| 9-1 最短路径问题和松弛操作 ||
| 9-2 Dijkstra算法的思想 ||
| 9-3 实现Dijkstra算法 ||
| 9-4 负权边和Bellman-Ford算法 ||
| 9-5 实现Bellman-Ford算法 ||
| 9-6 更多和最短路径相关的思考 ||
| ||
| **第10章 结束语** ||
| 10-1 总结,算法思想,大家加油! ||
================================================
FILE: course/04 Nginx从入门到实战.md
================================================
## 《Nginx从入门到实践》学习记录
February 2018 Web Server Survey | Netcraft
https://news.netcraft.com/archives/2018/02/13/february-2018-web-server-survey.html
| 章节 | 记录 |
| ------------------------------------------------------------ | ---- |
| **第1章 课程前言** | |
| 1-1 课程介绍 | |
| 1-2 学习环境准备 | |
| | |
| **第2章 基础篇** | |
| 2-1 什么是Nginx | |
| 2-2 常见的中间件服务 | |
| 2-3 Nginx特性_实现优点1 | |
| 2-4 Nginx特性_实现优点2 | |
| 2-5 Nginx特性_实现优点3 | |
| 2-6 Nginx特性_实现优点4 | |
| 2-7 Nginx快速安装 | |
| 2-8 Nginx的目录和配置语法_Nginx安装目录 | |
| 2-9 Nginx的目录和配置语法_Nginx编译配置参数 | |
| 2-10 Nginx的目录和配置语法_默认配置语法 | |
| 2-11 Nginx的目录和配置语法_默认配置与默认站点启动 | |
| 2-12 HTTP请求 | |
| 2-13 Nginx日志_log_format1 | |
| 2-14 Nginx日志_log_format2 | |
| 2-15 Nginx模块讲解_模块介绍 | |
| 2-16 Nginx模块讲解_sub_status | |
| 2-17 Nginx模块讲解_random_index | |
| 2-18 Nginx模块讲解_sub_module | |
| 2-19 Nginx模块讲解_sub_module配置演示 | |
| 2-20 Nginx的请求限制_配置语法与原理1 | |
| 2-21 Nginx的请求限制_配置语法与原理2 | |
| 2-22 Nginx的请求限制_配置语法与原理3 | |
| 2-23 Nginx的访问控制_介绍实现访问控制的基本方式 | |
| 2-24 Nginx的访问控制—access_module配置语法介绍 | |
| 2-25 Nginx的访问控制—access_module配置 | |
| 2-26 Nginx的访问控制—access_module局限性 | |
| 2-27 Nginx的访问控制—auth_basic_module配置 | |
| 2-28 Nginx的访问控制—auth_basic_module局限性 | |
| | |
| **第3章 场景实践篇** | |
| 3-1 场景实践篇内容介绍 | |
| 3-2 Nginx作为静态资源web服务_静态资源类型 | |
| 3-3 Nginx作为静态资源web服务_CDN场景 | |
| 3-4 Nginx作为静态资源web服务_配置语法 | |
| 3-5 Nginx作为静态资源web服务_场景演示 | |
| 3-6 Nginx作为静态资源web服务_浏览器缓存原理 | |
| 3-7 Nginx作为静态资源web服务_浏览器缓存场景演示 | |
| 3-8 Nginx作为静态资源web服务_跨站访问 | |
| 3-9 Nginx作为静态资源web服务_跨域访问场景配置 | |
| 3-10 Nginx作为静态资源web服务_防盗链(1) | |
| 3-11 Nginx作为静态资源web服务_防盗链(2) | |
| 3-12 Nginx作为代理服务_代理服务 | |
| 3-13 Nginx作为代理服务_配置语法及反向代理场景 | |
| 3-14 Nginx作为代理服务_正向代理配置场景(1) | |
| 3-15 Nginx作为代理服务_正向代理配置场景(2) | |
| 3-16 Nginx作为代理服务_代理配置语法补充 | |
| 3-17 Nginx作为代理服务_代理补充配置和规范 | |
| 3-18 Nginx作为负载均衡服务_负载均衡与Nginx | |
| 3-19 Nginx作为负载均衡服务_配置语法 | |
| 3-20 Nginx作为负载均衡服务_配置场景 | |
| 3-21 Nginx作为负载均衡服务_server参数讲解 | |
| 3-22 Nginx作为负载均衡服务_backup状态演示 | |
| 3-23 Nginx作为负载均衡服务_轮询策略与加权轮询 | |
| 3-24 Nginx作为负载均衡服务_负载均衡策略ip_hash方式 | |
| 3-25 Nginx作为负载均衡服务_负载均衡策略url_hash策略 | |
| 3-26 Nginx作为缓存服务_Nginx作为缓存服务 | |
| 3-27 Nginx作为缓存服务_缓存服务配置语法 | |
| 3-28 Nginx作为缓存服务_场景配置演示 | |
| 3-29 Nginx作为缓存服务_场景配置补充说明 | |
| 3-30 Nginx作为缓存服务_分片请求 | |
| | |
| **第4章 深度学习篇** | |
| 4-1 Nginx动静分离_动静分离场景演示 | |
| 4-2 Nginx动静分离_动静分离场景演示(1) | |
| 4-3 Nginx动静分离_动静分离场景演示(2) | |
| 4-4 Rewrite规则_rewrite规则作用 | |
| 4-5 Rewrite规则_rewrite配置语法 | |
| 4-6 Rewrite规则_rewrite正则表达式 | |
| 4-7 Rewrite规则_rewrite规则中的flag | |
| 4-8 Rewrite规则_redirect和permanent区别 | |
| 4-9 Rewrite规则_rewrite规则场景(1) | |
| 4-10 Rewrite规则_rewrite规则场景(2) | |
| 4-11 Rewrite规则_rewrite规则书写 | |
| 4-12 Nginx进阶高级模块_secure_link模块作用原理 | |
| 4-13 Nginx进阶高级模块_secure_link模块实现请求资源验证 | |
| 4-14 Nginx进阶高级模块_Geoip读取地域信息模块介绍 | |
| 4-15 Nginx进阶高级模块_Geoip读取地域信息场景展示 | |
| 4-16 基于Nginx的HTTPS服务_HTTPS原理和作用1 | |
| 4-17 基于Nginx的HTTPS服务_HTTPS原理和作用2 | |
| 4-18 基于Nginx的HTTPS服务_证书签名生成CA证书 | |
| 4-19 基于Nginx的HTTPS服务_证书签名生成和Nginx的HTTPS服务场景演示1 | |
| 4-20 基于Nginx的HTTPS服务_证书签名生成和Nginx的HTTPS服务场景演示2 | |
| 4-21 基于Nginx的HTTPS服务_实战场景配置苹果要求的openssl后台HTTPS服务1 | |
| 4-22 基于Nginx的HTTPS服务_实战场景配置苹果要求的openssl后台HTTPS服务2 | |
| 4-23 基于Nginx的HTTPS服务_实战场景配置苹果要求的openssl后台HTTPS服务3 | |
| 4-24 基于Nginx的HTTPS服务_HTTPS服务优化 | |
| 4-25 Nginx与Lua的开发_Nginx与Lua特性与优势 | |
| 4-26 Nginx与Lua的开发_Lua基础开发语法1 | |
| 4-27 Nginx与Lua的开发_Lua基础开发语法2 | |
| 4-28 Nginx与Lua的开发_Nginx与Lua的开发环境 | |
| 4-29 Nginx与Lua的开发_Nginx调用Lua的指令及Nginx的Luaapi接口 | |
| 4-30 Nginx与Lua的开发_实战场景灰度发布 | |
| 4-31 Nginx与Lua的开发_实战场景灰度发布场景演示1 | |
| 4-32 Nginx与Lua的开发_实战场景灰度发布场景演示2 | |
| 4-33 Nginx与Lua的开发_实战场景灰度发布场景演示3 | |
| 4-34 Nginx与Lua的开发_实战场景灰度发布场景演示4 | |
| | |
| **第5章 Nginx架构篇** | |
| 5-1 Nginx常见问题_架构篇介绍 | |
| 5-2 Nginx常见问题__多个server_name中虚拟主机读取的优先级 | |
| 5-3 Nginx常见问题_多个location匹配的优先级1 | |
| 5-4 Nginx常见问题_多个location匹配的优先级2 | |
| 5-5 Nginx常见问题_try_files使用 | |
| 5-6 Nginx常见问题_alias和root的使用区别 | |
| 5-7 Nginx常见问题_如何获取用户真实的ip信息 | |
| 5-8 Nginx常见问题_Nginx中常见错误码 | |
| 5-9 Nginx的性能优化_内容介绍及性能优化考虑 | |
| 5-10 Nginx的性能优化_ab压测工具 | |
| 5-11 Nginx的性能优化_ab压测工具1 | |
| 5-12 Nginx的性能优化_ab压测工具2 | |
| 5-13 Nginx的性能优化_ab压测工具3 | |
| 5-14 Nginx的性能优化_系统与Nginx性能优化 | |
| 5-15 Nginx的性能优化_文件句柄设置 | |
| 5-16 Nginx的性能优化_CPU亲和配置1 | |
| 5-17 Nginx的性能优化_CPU亲和配置2 | |
| 5-18 Nginx的性能优化_Nginx通用配置优化 | |
| 5-19 Nginx安全_基于Nginx的安全章节内容介绍 | |
| 5-20 Nginx安全_恶意行为控制手段 | |
| 5-21 Nginx安全_攻击手段之暴力破解 | |
| 5-22 Nginx安全_文件上传漏洞 | |
| 5-23 Nginx安全_SQL注入 | |
| 5-24 Nginx安全_SQL注入场景说明 | |
| 5-25 Nginx安全_场景准备mariadb和lnmp环境 | |
| 5-26 Nginx安全_模拟SQL注入场景 | |
| 5-27 Nginx安全_Nginx+LUA防火墙功能 | |
| 5-28 Nginx安全_Nginx+LUA防火墙防sql注入场景演示 | |
| 5-29 Nginx安全_复杂的访问攻击中CC攻击方式 | |
| 5-30 Nginx安全_Nginx版本更新和本身漏洞 | |
| 5-31 Nginx架构总结_静态资源服务的功能设计 | |
| 5-32 Nginx架构总结_Nginx作为代理服务的需求 | |
| 5-33 Nginx架构总结_需求设计评估 | |
| 5-34 完结散花 | |
================================================
FILE: course/05 Java并发编程与高并发解决方案.md
================================================
## 《Java并发编程与高并发解决方案》学习记录
时长:12小时30分钟
| 章节 | 记录 |
| ------------------------------------------ | ---- |
| **第1章 课程准备** | |
| 1-1 课程导学 | |
| 1-2 并发编程初体验 | |
| 1-3 并发与高并发基本概念 | |
| | |
| **第2章 并发基础** | |
| 2-1 CPU多级缓存-缓存一致性 | |
| 2-2 CPU多级缓存-乱序执行优化 | |
| 2-3 JAVA内存模型 | |
| 2-4 并发的优势与风险 | |
| | |
| **第3章 项目准备** | |
| 3-1 案例环境初始化 | |
| 3-2 案例准备工作 | |
| 3-3 并发模拟-工具 | |
| 3-4 并发模拟-代码 | |
| | |
| **第4章 线程安全性** | |
| 4-1 线程安全性-原子性-atomic-1 | |
| 4-2 线程安全性-原子性-atomic-2 | |
| 4-3 线程安全性-原子性-synchronized | |
| 4-4 线程安全性-可见性 | |
| 4-5 线程安全性-有序性与总结 | |
| | |
| **第5章 安全发布对象** | |
| 5-1 安全发布对象-发布与逸出 | |
| 5-2 安全发布对象-四种方法-1 | |
| 5-3 安全发布对象-四种方法-2 | |
| | |
| **第6章 线程安全策略** | |
| 6-1 不可变对象-1 | |
| 6-2 不可变对象-2 | |
| 6-3 线程封闭-1 | |
| 6-4 线程封闭-2 | |
| 6-5 线程不安全类与写法-1 | |
| 6-6 线程不安全类与写法-2 | |
| 6-7 同步容器-1 | |
| 6-8 同步容器-2 | |
| 6-9 并发容器及安全共享策略总结 | |
| | |
| **第7章 J.U.C之AQS** | |
| 7-1 J.U.C之AQS-介绍 | |
| 7-2 J.U.C之AQS-CountDownLatch | |
| 7-3 J.U.C之AQS-Semaphore | |
| 7-4 J.U.C之AQS-CyclicBarrier | |
| 7-5 J.U.C之AQS-ReentrantLock与锁-1 | |
| 7-6 J.U.C之AQS-ReentrantLock与锁-2 | |
| | |
| **第8章 J.U.C组件拓展** | |
| 8-1 J.U.C-FutureTask-1 | |
| 8-2 J.U.C-FutureTask-2 | |
| 8-3 J.U.C-ForkJoin | |
| 8-4 J.U.C-BlockingQueue | |
| | |
| **第9章 线程调度-线程池** | |
| 9-1 线程池-1 | |
| 9-2 线程池-2 | |
| 9-3 线程池-3 | |
| | |
| **第10章 多线程并发拓展** | |
| 10-1 死锁 | |
| 10-2 并发最佳实践 | |
| 10-3 Spring与线程安全 | |
| 10-4 HashMap与ConcurrentHashMap解析 | |
| 10-5 多线程并发与线程安全总结 | |
| | |
| **第11章 高并发之扩容思路** | |
| 11-1 高并发之扩容思路 | |
| | |
| **第12章 高并发之缓存思路** | |
| 12-1 高并发之缓存-特征、场景及组件介绍-1 | |
| 12-2 高并发之缓存-特征、场景及组件介绍-2 | |
| 12-3 高并发之缓存-redis的使用 | |
| 12-4 高并发之缓存-高并发场景问题及实战讲解 | |
| | |
| **第13章 高并发之消息队列思路** | |
| 13-1 高并发之消息队列-1 | |
| 13-2 高并发之消息队列-2 | |
| 13-3 高并发之消息队列-3 | |
| | |
| **第14章 高并发之应用拆分思路** | |
| 14-1 高并发之应用拆分-1 | |
| 14-2 高并发之应用拆分-2 | |
| | |
| **第15章 高并发之应用限流思路** | |
| 15-1 高并发之应用限流-1 | |
| 15-2 高并发之应用限流-2 | |
| | |
| **第16章 高并发之服务降级与服务熔断思路** | |
| 16-1 高并发之服务降级与服务熔断思路 | |
| | |
| **第17章 高并发之数据库切库分库分表思路** | |
| 17-1 高并发之数据库切库分库分表 | |
| | |
| **第18章 高并发之高可用手段介绍** | |
| 18-1 高并发之高可用一些手段 | |
| | |
| **第19章 课程总结** | |
| 19-1 课程总结 | |
================================================
FILE: course/06 HTTP协议原理+实践 Web开发工程师必学.md
================================================
## 《HTTP协议原理+实践 Web开发工程师必学》学习记录
| 章节 | 记录 |
| ----------------------------------------- | ---- |
| **第1章 课程导学** | |
| 1-1 导学 | |
| 1-2 内容介绍 | |
| | |
| **第2章 HTTP协议基础及发展历史** | |
| 2-1 5层网络模型介绍 | |
| 2-2 HTTP协议的发展历史 | |
| 2-3 HTTP的三次握手 | |
| 2-4 URI-URL和URN | |
| 2-5 HTTP报文格式 | |
| 2-6 创建一个最简单的web服务 | |
| | |
| **第3章 HTTP各种特性总览** | |
| 3-1 认识HTTP客户端 | |
| 3-2 CORS跨域请求的限制与解决 | |
| 3-3 CORS跨域限制以及预请求验证 | |
| 3-4 缓存头Cache-Control的含义和使用 | |
| 3-5 缓存验证Last-Modified和Etag的使用 | |
| 3-6 cookie和session | |
| 3-7 HTTP长连接 | |
| 3-8 数据协商 | |
| 3-9 Redirect | |
| 3-10 CSP | |
| | |
| **第4章 Nginx代理以及面向未来的HTTP** | |
| 4-1 Nginx安装和基础代理配置 | |
| 4-2 Nginx代理配置和代理缓存的用处 | |
| 4-3 HTTPS解析 | |
| 4-4 使用Nginx部署HTTPS服务 | |
| 4-5 HTTP2的优势和Nginx配置HTTP2的简单使用 | |
| | |
| **第5章 课程总结** | |
| 5-1 课程总结 | |
================================================
FILE: course/07 SpringBoot微信点餐.md
================================================
## 《Spring Boot企业微信点餐系统 》学习记录
| 章节 | 记录 | |
| ----------------------------------- | ---- | ---- |
| **01章 课程介绍** | | |
| 01-01 课程介绍 | | |
| | | |
| **02章 项目设计** | | |
| 02-01 项目设计 | | |
| 02-02 架构和基础框架 | | |
| 02-03 数据库设计 | | |
| | | |
| **03章 项目起步** | | |
| 03-01 开发环境搭建 | | |
| 03-02 日志的使用 | | |
| 03-03 源码下载及使用 | | |
| | | |
| **04章 买家端类目** | | |
| 04-01 买家类目-dao(上) | | |
| 04-02 买家类目-dao(下) | | |
| 04-03 买家类目-service | | |
| | | |
| **05章 买家端商品** | | |
| 05-01 买家商品-dao | 5/22 | |
| 05-02 买家商品-service | 5/22 | |
| 05-03 买家商品-api(上) | 5/22 | |
| 05-04 买家商品-api(下) | 5/22 | |
| | | |
| **06章 买家端订单** | | |
| 06-01 买家订单-dao(上) | | |
| 06-02 买家订单-dao(下) | | |
| 06-03 买家订单-service创建_A | | |
| 06-04 买家订单-service创建_B | | |
| 06-05 买家订单-service创建_C | | |
| 06-06 买家订单-service创建_D | | |
| 06-07 买家订单-service查询 | | |
| 06-08 买家订单-service取消 | | |
| 06-09 买家订单-service finish和paid | | |
| 06-10 买家订单-api_A | | |
| 06-11 买家订单-api_B | | |
| 06-12 买家订单-api_C | | |
| 06-13 买家订单-api_D | | |
| | | |
| **07章 微信授权** | | |
| 07-01 设置域名 | | |
| 07-02 获取code | | |
| 07-03 换取access_token | | |
| 07-04 使用sdk方式(上) | | |
| 07-05 使用sdk方式(下) | | |
| 07-06 微信网页授权前端调试 | | |
| | | |
| **08章 微信支付和退款** | | |
| 08-01 发起微信支付-后端(上) | | |
| 08-02 发起微信支付-后端(下) | | |
| 08-03 在网页发起支付 | | |
| 08-04 动态注入参数发起支付 | | |
| 08-05 微信异步通知(上) | | |
| 08-06 微信异步通知(下) | | |
| 08-07 微信退款 | | |
| 08-08 补充:使用测试号实现授权 | | |
| | | |
| **09章 卖家端订单** | | |
| 09-01 卖家订单-service | | |
| 09-02 卖家-订单-controller(上) | | |
| 09-03 卖家-订单-controller(下) | | |
| 09-04 卖家订单-controller-翻页 | | |
| 09-05 卖家订单-controller-取消订单 | | |
| 09-06 卖家订单-controller-订单详情 | | |
| 09-07 卖家订单-controller-完结订单 | | |
| | | |
| **10章 卖家端通用功能和上下架** | | |
| 10-01 关于模版的小技巧 | | |
| 10-02 实现边栏 | | |
| 10-03 实现商品列表 | | |
| 10-04 商品上下架-service | | |
| 10-05 商品上下架-controller | | |
| | | |
| **11章 卖家端新增商品和类目** | | |
| 11-01 卖家商品-新增修改页面 | | |
| 11-02 卖家商品-修改表单提交 | | |
| 11-03 卖家商品-新增功能 | | |
| 11-04 卖家类目功能开发 | | |
| | | |
| **12章 买家和卖家端联通** | | |
| 12-01 分布式session理论(上) | | |
| 12-02 分布式session理论(下) | | |
| 12-03 卖家信息表-dao开发 | | |
| 12-04 卖家扫码登录service开发 | | |
| 12-05 卖家扫码登录获取openid | | |
| 12-06 登录成功 | | |
| 12-07 登出成功 | | |
| 12-08 AOP实现身份验证 | | |
| 12-09 微信模版消息推送 | | |
| 12-10 webSocket消息推送 | | |
| | | |
| **13章 项目优化** | | |
| 13-01 异常捕获 | | |
| 13-02 mybatis注解方式使用_A | | |
| 13-03 mybatis注解方式使用_B | | |
| 13-04 mybatis xml方式使用 | | |
| 13-05 jpa和mybatis的选择 | | |
| 13-06 ab压测介绍 | | |
| 13-07 synchronized处理并发 | | |
| 13-08 redis分布式锁 | | |
| 13-09 redis缓存的使用(上) | | |
| 13-10 redis缓存的使用(下) | | |
| | | |
| **14章 项目部署** | | |
| 14-01 项目部署 | | |
| | | |
| **15章 课程总结** | | |
| 15-01 13.总结 | | |
================================================
FILE: course/08 廖雪峰的Java教程.md
================================================
## 《廖雪峰的Java教程》学习记录
| 章节 | 小节 | 记录 |
| ------------------------ | ---------------------- | ---- |
| **1-Java快速入门** | | |
| 01-Java入门 | | |
| | 01-Java简介 | |
| | 02-安装JDK | |
| | 03-第一个Java程序 | |
| | 04-安装并使用Eclipse | |
| | 05-安装Eclipse插件 | |
| 02-Java程序基础 | | |
| | 01-Java程序基本结构 | |
| | 02-变量和数据类型 | |
| | 03-整数运算 | |
| | 05-浮点数运算 | |
| | 07-布尔运算 | |
| | 08-字符和字符串 | |
| | 09-数组类型 | |
| 03-流程控制 | | |
| | 01-输入和输出 | |
| | 03-if判断 | |
| | 04-switch多重选择 | |
| | 05-while循环 | |
| | 06-do-while循环 | |
| | 07-for循环 | |
| | 09-break和continue | |
| 04-数组操作 | | |
| | 1-遍历数组 | |
| | 2-数组排序 | |
| | 4-多维数组 | |
| | 5-命令行参数 | |
| | | |
| **2-Java面向对象编程** | | |
| 1-面向对象的概念 | | |
| | 面向对象基础 | |
| 2-数据封装 | | |
| | 1-方法 | |
| | 2-构造方法 | |
| | 3-方法重载 | |
| 3-继承和多态 | | |
| | 1-继承 | |
| | 2-多态 | |
| 4-抽象类和接口 | | |
| | 1-抽象类 | |
| | 2-接口 | |
| 5-包和classpath | | |
| | 1-静态字段和方法 | |
| | 2-包 | |
| | 3-作用域 | |
| | 4-classpath和jar | |
| 6-Java核心类 | | |
| | 1-字符串和编码 | |
| | 2-StringBuilder | |
| | 3-包装类型 | |
| | 4-JavaBean | |
| | 5-枚举类 | |
| | 6-常用工具类 | |
| | | |
| **3-Java异常处理** | | |
| 1-错误处理 | | |
| | 1-Java的异常 | |
| | 2-捕获异常 | |
| | 3-抛出异常 | |
| | 4-自定义异常 | |
| 2-断言和日志 | | |
| | 1-使用断言 | |
| | 2-使用JDK Logging | |
| | 3-使用Commons Logging | |
| | 4-使用Log4j | |
| | | |
| **4-Java反射与泛型** | | |
| 1-反射 | | |
| | 1-Class类 | |
| | 2-访问字段 | |
| | 3-调用方法 | |
| | 4-调用构造方法 | |
| | 5-获取继承关系 | |
| 2-注解 | | |
| | 1-使用注解 | |
| | 2-定义注解 | |
| | 3-处理注解 | |
| 3-泛型 | | |
| | 1-什么是泛型 | |
| | 2-使用泛型 | |
| | 3-编写泛型 | |
| | 4-擦拭法 | |
| | 5-extends通配符 | |
| | 6-super通配符 | |
| | 7-泛型和反射 | |
| | | |
| **5-Java集合** | | |
| 1-Java集合简介 | | |
| | Java集合简介 | |
| 2-List | | |
| | 1-使用List | |
| | 2-编写equals方法 | |
| 3-Map | | |
| | 1-使用Map | |
| | 2-编写equals和hashCode | |
| | 3-使用Properties | |
| 4-Set | | |
| | 使用Set | |
| | | |
| 5-Queue | | |
| | 1-使用Queue | |
| | 2-使用PriorityQueue | |
| | 3-使用Deque | |
| 6-Stack | | |
| | 使用Stack | |
| | | |
| 7-最佳实践 | | |
| | 1-使用Iterator | |
| | 2-使用Collections | |
| | | |
| **6-Java IO编程** | | |
| 1-IO基础 | | |
| | 1-IO简介 | |
| | 2-File对象 | |
| 2-Input和Output | | |
| | 1-InputStream | |
| | 2-OutputStream | |
| | 4-Filter模式 | |
| | 6-classpath资源 | |
| | 7-序列化 | |
| 3-Reader和Writer | | |
| | 1-Reader | |
| | 2-Writer | |
| | | |
| **7-Java处理日期和时间** | | |
| 1-概念 | | |
| | 日期和时间 | |
| 2-Date和Calendar | | |
| | 1-Date | |
| | 2-Calendar | |
| 3-java.time的API | | |
| | 1-LocalDateTime | |
| | 2-ZonedDateTime | |
| 4-最佳实践 | | |
| | 最佳实践 | |
| | | |
| **8-JUnit单元测试** | | |
| 1-JUnit简介 | | |
| | JUnit测试 | |
| | | |
| 2-使用JUnit | | |
| | 1-使用Before和After | |
| | 2-异常测试 | |
| | 3-参数化测试 | |
| | 4-超时测试 | |
| | | |
| **9-Java正则表达式** | | |
| 1-正则表达式入门 | | |
| | 1-正则表达式简介 | |
| | 2-匹配规则 | |
| 2-正则表达式进阶 | | |
| | 1-复杂匹配规则 | |
| | 3-分组匹配规则 | |
| | 5-非贪婪匹配 | |
| | 6-搜索和替换 | |
| | | |
| **10-Java加密与安全** | | |
| 1-数据安全简介 | | |
| | 加密与安全 | |
| 2-编码算法 | | |
| | 1-URL编码 | |
| | 2-Base64编码 | |
| 3-摘要算法 | | |
| | 1-MD5 | |
| | 3-SHA1 | |
| | 4-BouncyCastle | |
| | 5-Hmac | |
| 4-加密算法 | | |
| | 1-对称加密算法 | |
| | 2-口令加密算法 | |
| | 4-密钥交换算法 | |
| | 5-非对称加密算法 | |
| 5-签名算法 | | |
| | 1-RSA签名算法 | |
| | 2-DSA签名算法 | |
| 6-数字证书 | | |
| | 数字证书 | |
| | | |
| **11-Java多线程编程** | | |
| 1-线程的概念 | | |
| | 1-多线程简介 | |
| | 2-创建新线程 | |
| | 3-线程的状态 | |
| | 5-中断线程 | |
| | 6-守护线程 | |
| 2-线程同步 | | |
| | 1-线程同步 | |
| | 2-synchronized方法 | |
| | 3-死锁 | |
| | 4-wait和notify | |
| 3-高级concurrent包 | | |
| | 1-ReentrantLock | |
| | 2-ReadWriteLock | |
| | 3-Condition | |
| | 4-Concurrent集合 | |
| | 5-Atomic | |
| | 6-ExecutorService | |
| | 7-Future | |
| | 8-CompletableFuture | |
| | 9-Fork_Join | |
| 4-线程工具类 | | |
| | ThreadLocal | |
| | | |
| **12-Maven基础** | | |
| 1-Maven入门 | | |
| | 1-Maven介绍 | |
| | 2-依赖管理 | |
| | 3-构建流程 | |
| 2-Maven进阶 | | |
| | 1-使用插件 | |
| | 2-模块管理 | |
| | | |
| **13-Java网络编程** | | |
| 1-Socket编程 | | |
| | 1-网络编程概念 | |
| | 2-TCP编程 | |
| | 3-TCP多线程编程 | |
| | 5-UDP编程 | |
| 2-Email编程 | | |
| | 1-发送Email | |
| | 2-接收Email | |
| 3-其他 | | |
| | 1-HTTP编程 | |
| | 2-RMI远程调用 | |
| | | |
| **14-Java操作XML和JSON** | | |
| 1-XML | | |
| | 1-XML介绍 | |
| | 2-DOM | |
| | 3-SAX | |
| | 4-第三方XML库 | |
| 2-JSON | | |
| | 1-JSON介绍 | |
| | 2-处理JSON | |
| | | |
| **15-Java JDBC编程** | | |
| 1-关系数据库基础 | | |
| | 1-关系数据库简介 | |
| | 2-安装MySQL | |
| 2-SQL入门 | | |
| | 1-SQL介绍 | |
| | 2-Insert语句 | |
| | 3-Select语句 | |
| | 4-Update语句 | |
| | 5-Delete语句 | |
| 3-JDBC接口 | | |
| | 1-JDBC简介 | |
| | 2-JDBC查询 | |
| | 3-JDBC更新 | |
| | 4-JDBC事务 | |
| | 5-JDBC连接池 | |
| | | |
| **16-Java函数式编程** | | |
| 1-Lambda表达式 | | |
| | 1-Lambda基础 | |
| | 3-Method Reference | |
| 2-Stream | | |
| | 1-Stream简介 | |
| | 2-创建Stream | |
| | 4-map | |
| | 5-filter | |
| | 6-reduce | |
| | 7-其他操作 | |
================================================
FILE: course/09 Spring学习框架.md
================================================
Spring框架2016-黑马程序员_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
https://www.bilibili.com/video/av27640334?from=search&seid=15898343232092137971
黑马程序员springmvc_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
https://www.bilibili.com/video/av18288362?from=search&seid=11826156096511418277
尚硅谷好评如潮【SpringBoot】视频_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
https://www.bilibili.com/video/av20965295?from=search&seid=5610749687546975866
尚硅谷-SpringBoot整合篇_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
https://www.bilibili.com/video/av23284778/
最好的JavaWeb教程 - 搜索结果 - 哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ 乾杯~ - bilibili
https://search.bilibili.com/all?keyword=%E6%9C%80%E5%A5%BD%E7%9A%84JavaWeb%E6%95%99%E7%A8%8B
| 类型 | 课程 | 时长 |
| ---------- | ------------------------------------------------------------ | ---- |
| Spring AOP | [【慕课在线】探秘Spring AOP-慕课网](https://www.imooc.com/learn/869) | |
| 基础课程 | [【黑马】Struts2 ](https://www.bilibili.com/video/av13748042) | |
| 基础课程 | [【黑马】Spring](https://www.bilibili.com/video/av14839030?from=search&seid=7226271969404706912) | |
| 基础课程 | [【黑马】Hibernate](https://www.bilibili.com/video/av14626440) | |
| | | |
| | | |
| | | |
| | | |
| | | |
================================================
FILE: course/10 Redis.md
================================================
## 《一站式学习Redis 从入门到高可用分布式实践》 学习记录
- ##### 第1章 Redis初识
带领听众进入Redis的世界,了解它的前世今生、众多特性、应用场景、安装配置、简单使用,可以让听众对Redis有一个全面的认识。
- 1-1 导学
- 1-2 Redis初识
- 1-3 谁在使用Redis
- 1-4 redis特性目录
- 1-5 特性1-速度快
- 1-6 特性2-持久化
- 1-7 特性3-数据结构
- 1-8 特性4-多语言客户端
- 1-9 特性5-功能丰富
- 1-10 特性6-简单
- 1-11 特性7-复制
- 1-12 特性8-高可用分布式
- 1-13 redis典型使用场景
- 1-14 redis三种启动方式介绍
- 1-15 redis常用配置
- 1-16 redis安装启动演示
- ##### 第2章 API的理解和使用
全面介绍了Redis提供的5种数据结构字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(zset)的数据模型、常用命令、典型应用场景。同时本章还会对Redis的单线程处理机制、键值管理做一个全面介绍,通过对这些原理的理解,听众可以在合适的应用场景选择合适的数据结构。 ...
- 2-1 -课程目录
- 2-2 -通用命令
- 2-3 数据结构和内部编码
- 2-4 单线程
- 2-5 字符串
- 2-6 hash (1)
- 2-7 hash (2)
- 2-8 list(1)
- 2-9 list(2)
- 2-10 set
- 2-11 zset
- ##### 第3章 Redis客户端的使用
本章重点关注Redis客户端的开发,介绍了详细讲解了Java客户端Jedis,简单介绍下Python和Go语言的Redis客户端的选择和使用。
- 3-1 课程目录
- 3-2 Java客户端:Jedis
- 3-3 Python客户端:redis-py
- 3-4 Go客户端:redigo简介
- 3-5 Jedis配置优化(上)
- 3-6 Jedis配置优化(下)
- ##### 第4章 瑞士军刀Redis其他功能
除了5种数据结构外,Redis还提供了诸如慢查询、Pipeline、Bitmap、HyperLogLog、发布订阅、GEO等附加功能,在这些功能的帮助下,Redis的应用场景更加丰富。
- 4-1 课程目录
- 4-2 慢查询
- 4-3 pipeline
- 4-4 发布订阅
- 4-5 bitmap
- 4-6 hyperloglog
- 4-7 geo
- ##### 第5章 Redis持久化的取舍和选择
Redis的持久化功能有效避免因进程退出造成的数据丢失问题,本章将介绍介绍RDB和AOF两种持久化配置和运行流程,以及选择策略
- 5-1 目录
- 5-2 持久化的作用
- 5-3 RDB(1)
- 5-4 RDB(2)
- 5-5 RDB(3)
- 5-6 AOF(1)
- 5-7 AOF(2)
- 5-8 AOF实验
- 5-9 RDB和AOF抉择
- ##### 第6章 常见的持久化开发运维问题
本章探讨了常见的持久化问题进行定位和优化,最后结合Redis常见的单机多实例部署场景进行优化
- 6-1 常见问题目录
- 6-2 fork
- 6-3 子进程开销和优化
- 6-4 AOF阻塞
- ##### 第7章 Redis复制的原理与优化
复制是实现高可用的基石,但复制同样是运维的痛点,本部分详细分析复制的原理,讲解运维过程中可能遇到的问题。
- 7-1 目录
- 7-2 什么是主从复制
- 7-3 主从复制配置-介绍
- 7-4 主从复制配置-操作
- 7-5 runid和复制偏移量
- 7-6 全量复制
- 7-7 全量复制开销 + 部分复制
- 7-8 故障处理
- 7-9 主从复制常见问题
- ##### 第8章 Redis Sentinel
本章将一步步解析Redis Sentinel的相关概念、安装部署、配置、客户端路由、原理解析,最后分析了Redis Sentinel运维中的一些问题。
- 8-1 sentinel-目录
- 8-2 主从复制高可用?
- 8-3 redis sentinel架构
- 8-4 redis sentinel安装与配置
- 8-5 redis sentinel安装演示-1
- 8-6 redis sentinel安装演示-2
- 8-7 java客户端
- 8-8 python客户端
- 8-9 实现原理-1-故障转移演练
- 8-10 实现原理-2.故障转移演练(客户端)
- 8-11 实现原理-3.故障演练(日志分析)
- 8-12 三个定时任务
- 8-13 主观下线和客观下线
- 8-14 领导者选举
- 8-15 故障转移
- 8-16 常见开发运维问题-目录
- 8-17 节点运维
- 8-18 高可用读写分离
- 8-19 本章总结
- ##### 第9章 初识Redis Cluster
Redis Cluster是Redis 3提供的分布式解决方案,有效解决了Redis分布式方面的需求,同时它也是学习分布式存储的绝佳案例。本章将针对Redis Cluster的数据分布,搭建集群进行分析说明。
- 9-1 本章目录
- 9-2 呼唤集群
- 9-3 数据分布概论
- 9-4 节点取余分区
- 9-5 一致性哈希分区
- 9-6 虚拟槽哈希分布
- 9-7 基本架构
- 9-8 原生安装
- 9-9 原生安装-1.准备节点
- 9-10 原生安装-2.节点握手
- 9-11 原生安装-3.分配槽
- 9-12 原生安装-4.分配主从
- 9-13 ruby环境准备-说明
- 9-14 ruby环境准备-操作
- 9-15 redis-trib构建集群
- 9-16 原生命令和redis-trib.rb对比
- ##### 第10章 深入Redis Cluster
本章将针对Redis Cluster的集群伸缩,请求路由,故障转移等方面进行分析说明。
- 10-1 集群伸缩目录
- 10-2 集群伸缩原理
- 10-3 扩展集群-1.加入节点
- 10-4 扩展集群-2.加入集群
- 10-5 扩展集群-3.迁移槽和数据
- 10-6 集群扩容演示-1
- 10-7 集群扩容演示-2
- 10-8 集群缩容-说明
- 10-9 集群缩容-操作
- 10-10 客户端路由-目录
- 10-11 moved异常说明和操作
- 10-12 ask重定向
- 10-13 smart客户端实现原理
- 10-14 JedisCluster执行源码分析
- 10-15 smart客户端JedisCluster-目录
- 10-16 JedisCluster基本使用
- 10-17 整合spring-1
- 10-18 整合spring-2
- 10-19 多节点操作命令
- 10-20 批量操作优化
- 10-21 故障转移-目录
- 10-22 故障发现
- 10-23 故障恢复
- 10-24 故障模拟
- 10-25 Redis Cluster常见开发运维问题-目录
- 10-26 集群完整性
- 10-27 带宽消耗
- 10-28 PubSub广播
- 10-29 集群倾斜-目录
- 10-30 数据倾斜
- 10-31 请求倾斜
- 10-32 读写分离
- 10-33 数据迁移
- 10-34 集群vs单机
- 10-35 本章总结
- ##### 第11章 缓存设计与优化
讲解将缓存加入应用架构后带来的一些问题,这些问题常常会成为应用的致命点。
- 11-1 目录
- 11-2 缓存的受益和成本
- 11-3 缓存的更新策略
- 11-4 缓存粒度问题
- 11-5 缓存穿透问题
- 11-6 缓存雪崩优化
- 11-7 无底洞问题
- 11-8 热点key的重建优化
- 11-9 本章总结
- ##### 第12章 Redis云平台CacheCloud
本章结合前面的知识介绍redis规模化后使用云平台如何进行机器部署、应用接入、用户相关功能维护等问题
- 12-1 _目录
- 12-2 _Redis规模化困扰
- 12-3 _快速构建
- 12-4 机器部署
- 12-5 应用接入
- 12-6 用户功能
- 12-7 运维功能
- ##### 第13章 课程总结
课程总结
- 13-1 _课程总结
- ##### 第14章 增补:Redis布隆过滤器
现有50亿电话号码,如何快速判断10w个电话号码是否在其中?利用之前学习的bitmap和redis cluster构建分布式布隆过滤器
- 14-1 _目录_
- 14-2 引出布隆过滤器
- 14-3 布隆过滤器基本原理
- 14-4 布隆过滤器误差率
- 14-5 本地布隆过滤器
- 14-6 Redis布隆过器
- 14-7 Redis分布式布隆过滤器
- ##### 第15章 Redis开发规范
本章介绍键值的设计、命令的优化、连接池优化、客户端使用规范及客户端常见问题,带领用户全面梳理Redis开发规范。
- 15-1 key设计
- 15-2 value设计
- 15-3 发现bigkey的方法
- 15-4 bigkey的删除
- 15-5 选择合理的数据结构
- 15-6 键值生命周期的管理
- 15-7 命令优化技巧
- 15-8 java客户端优化
- 15-9 连接池参数优化1
- 15-10 连接池参数优化2
- 15-11 连接池参数优化3
- ##### 第16章 内存管理
本章主要讲解Redis内存消耗、组成分析、Redis内存管理设置及内存优化技巧。
- 16-1 Redis内存优化介绍
- 16-2 Redis内存消耗
- 16-3 客户端缓冲区
- 16-4 缓冲内存
- 16-5 对象内存
- 16-6 内存设置上限
- 16-7 内存回收策略
- 16-8 内存优化
- 16-9 客户端缓冲区优化
- ##### 第17章 开发运维常见坑
本章介绍Linux针对Redis的内核参数优化、Redis安全七个方法以及Redis热点key的发现方法。
- 17-1 redis开发运维那些坑
- 17-2 overcommit_memory参数讲解和演示
- 17-3 其它参数的讲解
- 17-4 安全的redis
- 17-5 安全七法则
- 17-6 热点key
================================================
FILE: course/11 SpringMVC.md
================================================
## 黑马程序员 SpringMVC 学习记录
时长:10小时04分钟
| 章节 | 记录 |
| ----------------------------------------------------------- | ---- |
| **day01** | |
| 01 spring第一天课程安排 | |
| 02 springmvc架构-mvc设计模式在bs系统下的应用 | |
| 03 springmvc架构-springmvc架构原理分析 | |
| 04 springmvc入门程序-环境搭建 | |
| 05 springmvc入门程序-前端控制器配置 | |
| 06 springmvc入门程序-Handler编写调试 | |
| 07 springmvc入门程序-非注解映射器和适配器 | |
| 08 springmvc入门程序-注解映射器和适配器配置 | |
| 09 springmvc入门程序-注解映射器和适配器 | |
| 10 springmvc入门程序-前端控制器源代码分析 | |
| 11 springmvc入门程序-视图解析器配置前缀和后缀 | |
| 12 springmvc和mybaits整合-整合思路 | |
| 13 springmvc和mybaits整合-工程结构 | |
| 14 springmvc和mybaits整合-商品查询mapper | |
| 15 springmvc和mybaits整合-商品查询service | |
| 16 springmvc和mybaits整合-商品查询controller | |
| 17 springmvc和mybaits整合-商品查询调试 | |
| 18 springmvc注解开发-商品修改功能分析 | |
| 19 springmvc注解开发-商品修改功能开发service | |
| 20 springmvc注解开发-商品修改功能开发controller | |
| 21 springmvc注解开发-RequestMapping注解 | |
| 22 springmvc注解开发-controller方法返回值 | |
| 23 springmvc注解开发-springmvc参数绑定过程 | |
| 24 springmvc注解开发-springmvc参数绑定-简单类型绑定 | |
| 25 springmvc注解开发-springmvc参数绑定-pojo绑定 | |
| 26 springmvc注解开发-springmvc参数绑定-自定义参数绑定 | |
| 27 springmvc和struts2的区别 | |
| | |
| **day02** | |
| 01 springmvc第一天课程复习 | |
| 02 springmvc注解开发-springmvc参数绑定-包装类型pojo参数绑定 | |
| 03 springmvc注解开发-springmvc参数绑定-数组 | |
| 04 springmvc注解开发-springmvc参数绑定-list | |
| 05 springmvc注解开发-validation校验-商品修改校验 | |
| 06 springmvc注解开发-validation校验-分组校验 | |
| 07 springmvc注解开发-数据回显 | |
| 08 springmvc异常处理-全局异常处理器开发 | |
| 09 springmvc异常处理-抛出异常 | |
| 10 springmvc上传图片 | |
| 11 springmvc实现json交互-requestBody和responseBody | |
| 12 springmvc实现json交互-准备环境 | |
| 13 springmvc实现json交互-json交互测试 | |
| 14 springmvc对RESTful支持 | |
| 15 springmvc拦截器-定义和配置 | |
| 16 springmvc拦截器-多拦截器测试 | |
| 17 springmvc拦截器-实现登陆认证 | |
================================================
FILE: course/12 Mybatis.md
================================================
## 黑马程序员 Mybatis 学习记录
时长:10小时23分钟
| 章节 | 记录 |
| ------------------------------------------------- | ---- |
| **day-01** | |
| 01 mybatis第一天课程安排 | |
| 02 原生态jdbc编程中的问题总结 | |
| 03 mybatis框架原理 | |
| 04 mybatis入门程序-工程结构 | |
| 05 mybatis入门程序-根据id查询用户-映射文件 | |
| 06 mybatis入门程序-根据id查询用户-程序代码 | |
| 07 mybatis入门程序-根据id查询用户-程序调试 | |
| 08 mybatis入门程序-根据名称查询用户 | |
| 09 mybatis入门程序-查询用户小结 | |
| 10 mybatis入门程序-添加用户 | |
| 11 mybatis入门程序-添加用户-主键返回 | |
| 12 mybatis入门程序-删除用户和更新用户 | |
| 13 mybatis入门程序-小结 | |
| 14 mybatis和hibernate的本质区别和应用场景 | |
| 15 mybatis开发dao方法-sqlSession应用场合 | |
| 16 mybatis开发dao方法-原始dao开发方法 | |
| 17 mybatis开发dao方法-原始dao开发方法-问题总结 | |
| 18 mybatis开发dao方法-mapper代理开发方法-开发规范 | |
| 19 mybatis开发dao方法-mapper代理开发方法-实现 | |
| 20 SqlMapConfig-properties定义 | |
| 21 SqlMapConfig-settings | |
| 22 SqlMapConfig-别名定义 | |
| 23 SqlMapConfig-类型处理器 | |
| 24 SqlMapConfig-mapper加载 | |
| 25 输入映射-pojo包装类型-定义pojo包装类型 | |
| 26 输入映射-pojo包装类型-实现 | |
| 27 输出映射-resultType | |
| 28 输出映射-resultMap | |
| 29 动态sql-if判断 | |
| 30 动态sql-sql片段 | |
| 31 动态sql-foreach | |
| **day-02** | |
| 01 第一天课程复习及第二天课程安排 | |
| 02 订单商品数据模型-分析思路 | |
| 03 订单商品数据模型-分析 | |
| 04 高级映射-一对一查询-使用resultType | |
| 05 高级映射-一对一查询-使用resultMap | |
| 06 高级映射-一对多查询 | |
| 07 高级映射-多对多查询 | |
| 08 高级映射-resultMap总结 | |
| 09 高级映射-延迟加载 | |
| 10 查询缓存-一级缓存原理 | |
| 11 查询缓存-一级缓存测试 | |
| 12 查询缓存-一级缓存实际应用 | |
| 13 查询缓存-二级缓存-二级缓存测试 | |
| 14 查询缓存-二级缓存-整合ehcache | |
| 15 查询缓存-二级缓存-应用场景和局限性 | |
| 16 mybatis和spring整合-sqlSessionFactory配置 | |
| 17 mybatis和spring整合-原始dao开发 | |
| 18 mybatis和spring整合-mapper代理开发 | |
| 19 mybatis逆向工程自动生成代码 | |
================================================
FILE: course/13 韩立刚计算机网络.md
================================================
## 《韩立刚计算机网络》学习记录
| 章节 | 记录 |
| ------------------------------------------------- | ---- |
| **第1章 计算机网络概述** | |
| 01 课程介绍 | |
| 02 局域网 | |
| 03 Intenet和广域网 | |
| 04 规划IP地址介绍MAC地址 | |
| 05 数据包和数据帧 | |
| 06 访问网站数据传输过程 | |
| 07 OSI参考模型 | |
| 08 理解OSI参考模型分层思想 | |
| 09 OSI参考模型和网络排错 | |
| 10 OSI参考模型和网络安全 | |
| 11 OSI参考模型和TCP_IP协议 | |
| 12 计算机网络性能指标1 | |
| 13 计算机网络性能指标2 | |
| | |
| **第2章 物理层** | |
| 14 物理层定义的标准 | |
| 15 数据通信基础知识 | |
| 16 常用编码 | |
| 17 奈氏准则和香农公式 | |
| 18 数据通信基础知识总结 | |
| 19 物理层下面的传输介质 | |
| 20 信道复用技术 | |
| 21 数字传输系统 | |
| 22 宽带接入技术 | |
| | |
| **第3章 数据链路层** | |
| 23 数据链路层基本概念 | |
| 24 封装成帧和透明传输 | |
| 25 差错检测 | |
| 26 点到点通信数据链路层协议PPP | |
| 27 配置路由器使用PPP协议 | |
| 28 广播信道的数据链路层 | |
| 29 CSMA_CD协议技术细节 | |
| 30 什么是以太网 | |
| 31 以太网帧格式 | |
| 32 抓包分析数据帧格式 | |
| 33 使用网桥和交换机优化以太网 | |
| 34 查看思科交换机MAC地址表 | |
| 35 快速以太网和G比特以太网 | |
| | |
| **第4章 网络层** | |
| 36 网络层提供的服务 | |
| 37 验证网络层功能 | |
| 38 准备发送数据 | |
| 39 发送数据的过程 | |
| 40 ARP协议 | |
| 41 ARP欺骗 | |
| 42 网络执法官和ARP防火墙 | |
| 43 ICMP协议和ping命令 | |
| 44 ping和pathping排除网络故障 | |
| 45 IGMP协议和多播组播 | |
| 46 访问多播视频节目 | |
| 47 抓包分析数据包首部 | |
| 48 数据包总长度和数据包分片 | |
| 49 抓包分析分片数据包 | |
| 50 数据包TTL和协议号 | |
| 51 使用抓包工具排除网络故障 | |
| 52 网络畅通的条件 | |
| 53 静态路由 | |
| 54 动态路由 | |
| | |
| **第5章 传输层** | |
| 55 TCP和UDP的应用场景 | |
| 56 传输层协议和应用层协议之间关系 | |
| 57 服务和应用层协议之间的关系 | |
| 58 服务和端口 端口和安全 | |
| 59 传输层功能和端口范围 | |
| 60 UDP首部 | |
| 61 TCP协议概述 | |
| 62 TCP如何实现可靠传输 | |
| 63 TCP首部 端口序号确认号数据偏移 | |
| 64 抓包分析TCP首部 | |
| 65 TCP首部标记位 | |
| 66 接收窗口和发送窗口 | |
| 67 TCP滑动窗口技术实现可靠传输 | |
| 68 TCP流量控制 | |
| 69 TCP拥塞避免 | |
| 70 TCP传输连接管理 | |
| | |
| **第6章 应用层** | |
| 71 什么是域名 | |
| 72 安装和配置DNS服务器 | |
| 73 安装和配置DHCP服务器 | |
| 74 跨网段配置IP地址 | |
| 75 FTP协议主动模式被动模式 | |
| 76 安装和配置FTP服务器 | |
| 77 telnet协议 | |
| 78 远程桌面协议RDP | |
| 79 HTTP协议和网站 | |
| 80 使用Web代理服务访问网站 | |
| 81 Internet发送和接收电子邮件的过程 | |
| 82 准备邮件服务器实验环境 | |
| 83 安装和配置邮件服务器 | |
| | |
| **第7章 网络安全** | |
| 84 网络安全介绍 | |
| 85 网络安全面临的威胁 | |
| 86 篡改和伪造 | |
| 87 病毒和木马 | |
| 88 对称加密 | |
| 89 非对称加密和数字签名 | |
| 90 证书颁发机构CA | |
| 91 安装CA并申请证书和邮箱 | |
| 92 发送签名加密电子邮件 | |
| 93 安全套接字SSL功能 | |
| 94 配置网站使用SSL通信 | |
| 95 介绍网络层安全IPSec | |
| 96 搭建IPSec实验环境 | |
| 97 配置IPSec实现安全通信 | |
| 98 数据链路层安全 | |
| | |
| **第8章 Internet上的音频视频** | |
| 99 互联网音频视频面临的问题 | |
| 100 安装流媒体服务 | |
| 101 通过网站观看流媒体节目 | |
| 102 流媒体实现现场直播 | |
| 103 IP电话和QoS | |
| | |
| **第9章 无线网络** | |
| 104 无线局域网 | |
| 105 创建临时无线网络 | |
================================================
FILE: course/14 韩立刚计算机网络2.md
================================================
## 《韩立刚计算机网络(v2) 》学习记录
| 章节 | 记录 |
| ------------------------------------------------- | ---- |
| **第1章 计算机网络概述** | |
| 001 课程介绍 | |
| 002 计算机网络在信息时代的作用 | |
| 003 Internet概述 | |
| 004 Internet组成 | |
| 005 计算机网络类别 | |
| 006 计算机网络的性能指标 | |
| 007 回顾 | |
| 008 性能指标2 | |
| 009 OSI参考模型 | |
| 010 理解OSI参考模型 | |
| 011 OSI和网络排错 | |
| 012 OSI参考模型与网络安全 | |
| 013 计算机网络的体系结构 | |
| 014 虚拟机的网络设置 | |
| | |
| **第2章 物理层** | |
| 015 物理层基本概念 | |
| 016 数据通信基础知识 | |
| 017 奈氏准则和香农公式 | |
| 018 物理层下面的物理媒体 | |
| 019 回顾 | |
| 020 频分复用技术 | |
| 021 时分复用技术 | |
| 022 码分复用技术 | |
| 023 数字传输系统 | |
| 024 宽带接入技术 | |
| | |
| **第3章 数据链路层** | |
| 025 数据链路层几个基本概念 | |
| 026 三个基本问题 | |
| 027 CRC差错检测技术 | |
| 028 PPP协议介绍 | |
| 029 PPP协议实现透明传输的2种方法 | |
| 030 PPP协议的工作状态 | |
| 031 配置路由器接口使用PPP协议封装 | |
| 032 回顾 | |
| 033 以太网特点 | |
| 034 CSMA CD | |
| 035 以太网冲突检测和避让机制 | |
| 036 以太网 | |
| 037 集线器 | |
| 038 无冲突时以太网信道最大利用率 | |
| 039 以太网MAC地址 | |
| 040 回顾 | |
| 041 更改和查看MAC地址 | |
| 042 以太网帧格式 | |
| 043 抓包工具排除网络故障 | |
| 044 以太网帧格式2 | |
| 045 网桥和交换机优化以太网 | |
| 046 查看交换机MAC地址表 | |
| 047 生成树过程 | |
| 048 更改交换机生成树的根 优先级 | |
| 049 远程重启服务器 | |
| 050 验证VLAN | |
| 051 VLAN干道链路和访问链路 | |
| 052 扩展以太网 | |
| 053 交换机上实现的接入安全 | |
| | |
| **第4章 网络层** | |
| 054 网络的两种服务 虚电路和数据报服务 | |
| 055 虚电路和数据报服务的对比 | |
| 056 虚拟互联网 | |
| 057 IP地址 网络部分和主机部分 | |
| 058 IP地址 ABCDE类IP地址 | |
| 059 IP地址 十进制和二进制关系 | |
| 060 IP地址 ABCD类网络和默认子网掩码 | |
| 061 IP地址 保留的地址 | |
| 062 子网掩码的作用 | |
| 063 IP地址 将一个C类网络等分成两个子网 | |
| 064 IP地址 将一个C类网络等分成四个子网 | |
| 065 IP地址 将一个C类网络等分成八个子网 | |
| 066 IP地址 点到点网络的子网掩码最好是252 | |
| 067 IP地址 划分子网的规律 | |
| 068 IP地址 变长子网划分 | |
| 069 IP地址 变长子网练习 | |
| 070 IP地址 子网划分回顾 | |
| 071 IP地址 B类网络子网划分 | |
| 072 IP地址 利用超网合并网段 | |
| 073 数据包转发过程 MAC地址和IP地址 | |
| 074 基于MAC地址控制代理服务器只能控制本网段计算机 | |
| 075 ARP协议工作机制 | |
| 076 arp欺骗的应用 | |
| 077 如何断定ARP欺骗 | |
| 078 逆向ARP 就是计算机请求IP地址的过程 | |
| 079 数据包首部 | |
| 080 数据包首部生存时间TTL | |
| 081 数据包首部 首部校验和 | |
| 082 通过抓包工具分析数据包首部 | |
| 083 网络畅通的条件和静态路由 | |
| 084 添加静态路由 | |
| 085 Windows网关就是默认路由 | |
| 086 网络负载均衡 | |
| 087 ICMP协议ping和pathping | |
| 088 RIP协议工作原理 | |
| 089 配置动态路由RIP协议 | |
| 090 回顾 | |
| 091 配置OSPF协议 | |
| 092 OSPF协议特点 | |
| 093 BGP协议实现自制系统之间最佳路径选择 | |
| 094 VPN的功能 | |
| 095 验证VPN拨号 | |
| 096 创建VPN拨号连接 | |
| 097 站点间VPN | |
| 098 NAT和PAT | |
| 099 NAT的端口映射 | |
| 100 回顾 | |
| 101 虚拟机的网络设置 | |
| | |
| **第5章 传输层** | |
| 102 TCPIP协议分层 | |
| 103 TCP和UDP的应用场景 | |
| 104 传输层协议和应用层协议之间的关系 | |
| 105 服务和应用层协议之间的关系 | |
| 106 安装telnet客户端 | |
| 107 更改服务器的默认端口 | |
| 108 TCPIP筛选实现服务器安全 | |
| 109 Windows防火墙的作用 | |
| 110 Windows防火墙不能防控灰鸽子木马程序 | |
| 111 IPSec严格控制网络流量 | |
| 112 UDP协议 | |
| 113 TCP协议概述 | |
| 114 TCP如何实现可靠传输 | |
| 115 TCP首部 | |
| 116 抓包分析TCP首部 | |
| 117 TCP首部标记位 | |
| 118 接收窗口确定发送窗口 | |
| 119 TCP滑动窗口技术实现可靠传输 | |
| 120 避免拥塞 | |
| 121 TCP连接管理 | |
| | |
| **第6章 应用层** | |
| 122 域名解析过程 | |
| 123 安装和配置DNS服务器 | |
| 124 DHCP协议 | |
| 125 跨网段分配IP地址 | |
| 126 FTP协议主动模式和被动模式 | |
| 127 安装和配置FTP服务器 | |
| 128 Telnet协议 | |
| 129 远程桌面协议RDP | |
| 130 HTTP协议 | |
| 131 Web代理服务器 | |
| 132 Internet发送和接收电子邮件的过程 | |
| 133 准备邮件服务器实验环境 | |
| 134 安装和配置邮件服务器 | |
| | |
| **第7章 网络安全** | |
| 135 网络安全介绍 | |
| 136 网络安全面临的4种威胁 | |
| 137 篡改和伪造攻击 | |
| 138 病毒和木马 | |
| 139 对称加密 | |
| 140 非对称加密和数字签名 | |
| 141 证书颁发机构CA | |
| 142 安装CA并申请证书和邮箱 | |
| 143 发送签名和加密电子邮件 | |
| 144 安全套接字SSL功能 | |
| 145 配置网站使用SSL通信 | |
| 146 网络层安全IPSec介绍 | |
| 147 搭建IPSec实验环境 | |
| 148 配置IPSec实现网络安全 | |
| 149 数据链路层安全 | |
| | |
| **第8章 Internet上的音频视频** | |
| 150 互联网音频视频面临的问题 | |
| 151 安装流媒体服务 | |
| 152 通过网站观看流媒体节目 | |
| 153 流媒体实现现场直播 | |
| 154 IP电话 | |
| | |
| **第9章 无线网络** | |
| 155 无线局域网 | |
| 156 创建临时无线网络 | |
================================================
FILE: course/15 咕泡学院-公开课.md
================================================
## 咕泡学院 公开课
| 章节 | 记录 |
| ------------------------------------------------------------ | ---- |
| 2018_03_05如何从源码copy经验并武装自己 | |
| 2018_03_07面试Mysql底层要准备这些 | |
| 2018_04_11_深入浅出JVM | |
| 2018_04_18_轻松搞定面试中各种并发问题 | |
| 2018_04_20_魔鬼式分析NIO通信架构原理 | |
| 2018_04_23_垂直打击之JVM剖析 | |
| 2018_05_08(下午)_一张图完美还原HashMap(JDK1.8)源码 | |
| 2018_05_08_434_BAT面试必问的JVM到底怎么学 | |
| 2018_05_11_阿里面试必备之分析IO及NIO的底层原理 | |
| 2018_05_13_千万级流量的优化策略实战 | |
| 2018_05_14_漫谈Mysql索引 | |
| 2018_05_16_synchronized的底层原理分析 | |
| 2018_05_23面试必问之JVM | |
| 2018_05_28_一小时搞定阿里核心面试题 | |
| Jack_20180427_今晚谁再说看不懂HashMap源码算我输 | |
| Jack_20180430_后来的我们学会了这样看源码 | |
| Jack_20180501_Tomcat8源码邀你乘坐五一假期末班车 | |
| Jack_20180504_Professional Analysis of NIO | |
| Jack_20180511_阿里面试必备之分析IO及NIO的底层原理 | |
| James_0430高效程序员如何优雅落地需求 | |
| James_0506程序员的职业生涯及面试指南 | |
| James_0523面试必问之JVM | |
| James_0719Mysql底层索引剖析 | |
| Mic_20180428_分布式服务Dubbo的前世今生 | |
| Mic_20180502_深入分析https的底层原理 | |
| Mic_20180718_分布式集群及动态负载均衡实战 | |
| Tom_20180429_以ElasticSearch为例,论学习方法的重要性 | |
| Tom_20180503_巧用工具,解放双手,架构师都是这样思考问题的 | |
| Tom_20180720_一口气写完Spring核心代码,不信你就来 | |
| 咕泡学院 - Java 9 异步并发编程 | |
| 咕泡学院 - Java 9 新特性之核心库(上) | |
| 咕泡学院 - Java 9 新特性之核心库(下) | |
| 咕泡学院 - Reactor Streams 并发编程之 Reactor | |
| 咕泡学院 - 微服务实践之路 | |
| 咕泡学院 - 深入浅出 Spring Boot 日志 | |
| 咕泡学院 - 深入浅出 Spring Boot 管控 | |
| 大神带你剖析Mysql索引底层数据结构 | |
| | |
| 20180803_理解 Spring 技术栈或许没有那么难 | |
| Mic_20180802_并发编程的原理 | |
| Tom_20180801_不修改代码、不新增配置和,1小时快速搭建可视化监控系统 | |
| Tom_20180805_10W条记录,只需0.1秒快速搜索到附近的人 | |
================================================
FILE: course/16 咕泡学院-JAVA开发中的热点技术剖析.md
================================================
## 咕泡学院 JAVA开发中的热点技术剖析
| 章节 | 记录 |
| ----------------------------------------------- | ---- |
| **PART1** | |
| Bad smell 内存泄露和内存溢出 | |
| JVM难吗?听听一本正经的James老师怎么说 | |
| mybatis源码分析及手写实现 | |
| 爱一个人需要一万个理由,学习Nginx只需要一个 | |
| | |
| **PART2** | |
| 分布式环境下session跨域共享原理 | |
| 带你装B带你飞,手把手教你学docker | |
| 纯手写系列之Dubbo RPC实现原理 | |
| | |
| **PART3** | |
| 分布式全局ID生成器介绍 | |
| 深入底层解读网络通信 | |
| 高阶程序员必须要知道的多线程并发编程 | |
| | |
| **PART4** | |
| 深入分析ThreadLocal的底层实现原理 | |
| 深入分析动态代理的实现原理 | |
| 深入分析热部署底层原理 | |
| | |
| **PART5** | |
| 一道面试题引发的思考 | |
| 做一个合格的程序员你必须掌握的linux性能工具集锦 | |
| 系统设计方法论之监控系统设计 | |
| 系统设计方法论初探之Redis实现监控系统设计 | |
================================================
FILE: course/17 咕泡学院-BAT面试课程.md
================================================
## 咕泡学院 BAT面试课程
| 章节 | 记录 |
| -------------------------------------------------------- | ---- |
| 7.1 如何控制多线程执行顺序 | |
| 7.2 深入底层研究volatile和synchronized的区别 | |
| 7.3 深入底层lock接口和synchronized的区别和优势 | |
| 7.4 多线程并发编程的总结和梳理 | |
| 7.5 分布式锁的实现原理 | |
| 7.6 剖析一道不简单的面试题 | |
| 7.7 图解阻塞io和非阻塞io及多路复用机制 | |
| 7.8 mysql中binlog的底层原理分析 | |
| 7.9 cookie和session的联系和区别 | |
| 7.10 tom_面试题_aop的底层实现原理,动态代理的动如何体现 | |
| 7.11 tom_面试题_javaweb开发中解决跨域问题的n种方案 | |
| 7.12 tom_面试题_从数据库底层来分析事务的提交与回滚全过程 | |
| 7.13 james_vip_要不要跳槽,怎么成长 | |
| 7.14 小马哥-技术人成长之路(上) | |
| 7.15 小马哥-技术人成长之路(下) | |
================================================
FILE: course/18 咕泡学院-性能优化.md
================================================
## 咕泡学院 性能优化
| 章节 | 记录 |
| --------------------------------- | ---- |
| 1.1 性能优化专题-什么是性能优化一 | |
| 1.1 性能优化专题-什么是性能优化二 | |
| 2.1 性能测试与优化(一) | |
| 2.1 性能测试与优化(二) | |
| 3.1 jvm介绍 一 | |
| 3.1 jvm介绍 二 | |
| 3.2 jvm垃圾回收一 | |
| 3.2 jvm垃圾回收二 | |
| 3.3 jvm案例分析一 | |
| 3.3 jvm案例分析二 | |
| 4.1 tomcat 架构(上) | |
| 4.1 tomcat 架构(下) | |
| 4.2 嵌入式 tomcat(下) | |
| 4.2 嵌入式 tomcat(上) | |
| 4.3 tomcat 性能优化(下) | |
| 4.3 tomcat 性能优化(中) | |
| 4.3 tomcat 性能优化(上) | |
| 5.1 性能优化之mysql介绍一 | |
| 5.1 性能优化之mysql介绍二 | |
| 5.2 性能优化之mysql优化一 | |
| 5.2 性能优化之mysql优化二 | |
================================================
FILE: course/19 并发编程原理.md
================================================
## 《Java并发编程原理与实战》学习记录
官网:[【龙果学院】Java并发编程原理与实战](https://www.roncoo.com/course/view/b6f89747a8284f44838b2c4da6c8677b)
| 课程大纲 | 记录 |
| ---------------------------------------------------------- | ---- |
| 1 你真的了解并发吗? | |
| 2 理解多线程与并发的之间的联系与区别 | |
| 3 解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 | |
| 4 学习并发的四个阶段并推荐学习并发的资料 | |
| 5 线程的状态以及各状态之间的转换详解 | |
| 6 线程的初始化,中断以及其源码讲解 | |
| 7 多种创建线程的方式案例演示(一)带返回值的方式 | |
| 8 多种创建线程的方式案例演示(二)使用线程池 | |
| 9 Spring对并发的支持:Spring的异步任务 | |
| 10 使用jdk8提供的lambda进行并行计算 | |
| 11 了解多线程所带来的安全风险 | |
| 12 从线程的优先级看饥饿问题 | |
| 13 从Java字节码的角度看线程安全性问题 | |
| 14 synchronized保证线程安全的原理(理论层面) | |
| 15 synchronized保证线程安全的原理(jvm层面) | |
| 16 单例问题与线程安全性深入解析 | |
| 17 理解自旋锁,死锁与重入锁 | |
| 18 深入理解volatile原理与使用 | |
| 19 JDK5提供的原子类的操作以及实现原理 | |
| 20 Lock接口认识与使用 | |
| 21 手动实现一个可重入锁 | |
| 22 AbstractQueuedSynchronizer(AQS)详解 | |
| 23 使用AQS重写自己的锁 | |
| 24 重入锁原理与演示 | |
| 25 读写锁认识与原理 | |
| 26 细读ReentrantReadWriteLock源码 | |
| 27 ReentrantReadWriteLock锁降级详解 | |
| 28 线程安全性问题简单总结 | |
| 29 线程之间的通信之wait/notify | |
| 30 通过生产者消费者模型理解等待唤醒机制 | |
| 31 Condition的使用及原理解析 | |
| 32 使用Condition重写wait/notify案例并实现一个有界队列 | |
| 33 深入解析Condition源码 | |
| 34 实战:简易数据连接池 | |
| 35 线程之间通信之join应用与实现原理剖析 | |
| 36 ThreadLocal 使用及实现原理 | |
| 37 并发工具类CountDownLatch详解 | |
| 38 并发工具类CyclicBarrier 详解 | |
| 39 并发工具类Semaphore详解 | |
| 40 并发工具类Exchanger详解 | |
| 41 CountDownLatch,CyclicBarrier,Semaphore源码解析 | |
| 42 提前完成任务之FutureTask使用 | |
| 43 Future设计模式实现(实现类似于JDK提供的Future) | |
| 44 Future源码解读 | |
| 45 Fork/Join框架详解 | |
| 46 同步容器与并发容器 | |
| 47 并发容器CopyOnWriteArrayList原理与使用 | |
| 48 并发容器ConcurrentLinkedQueue原理与使用 | |
| 49 Java中的阻塞队列原理与使用 | |
| 50 实战:简单实现消息队列 | |
| 51 并发容器ConcurrentHashMap原理与使用 | |
| 52 线程池的原理与使用 | |
| 53 Executor框架详解 | |
| 54 实战:简易web服务器(一) | |
| 55 实战:简易web服务器(二) | |
| 56 JDK8的新增原子操作类LongAddr原理与使用 | |
| 57 JDK8新增锁StampedLock详解 | |
| 58 重排序问题 | |
| 59 happens-before简单概述 | |
| 60 锁的内存语义 | |
| 61 volatile内存语义 | |
| 62 final域的内存语义 | |
| 63 实战:问题定位 | |
================================================
FILE: course/20 MySQL性能管理及架构设计.md
================================================
## 《MySQL性能管理及架构设计》学习记录
| 章节 | 记录 |
| ------------------------------------------------------------ | ---- |
| **第1章 实例和故事** | |
| *决定电商11大促成败的各个关键因素。* | |
| | |
| 1-1 什么决定了电商双11大促的成败 | |
| 1-2 在双11大促中的数据库服务器 | |
| 1-3 在大促中什么影响了数据库性能 | |
| 1-4 大表带来的问题 | |
| 1-5 大事务带来的问题 | |
| | |
| **第2章 什么影响了MySQL性能** | |
| *详细介绍影响性能各个因素,包括硬件、操作系统等等。* | |
| | |
| 2-1 影响性能的几个方面 | |
| 2-2 CPU资源和可用内存大小 | |
| 2-3 磁盘的配置和选择 | |
| 2-4 使用RAID增加传统机器硬盘的性能 | |
| 2-5 使用固态存储SSD或PCIe卡 | |
| 2-6 使用网络存储SAN和NAS | |
| 2-7 总结:服务器硬件对性能的影响 | |
| 2-8 操作系统对性能的影响-MySQL适合的操作系统 | |
| 2-9 CentOS系统参数优化 | |
| 2-10 文件系统对性能的影响 | |
| 2-11 MySQL体系结构 | |
| 2-12 MySQL常用存储引擎之MyISAM | |
| 2-13 MySQL常用存储引擎之Innodb | |
| 2-14 Innodb存储引擎的特性(1) | |
| 2-15 Innodb存储引擎的特性(2) | |
| 2-16 MySQL常用存储引擎之CSV | |
| 2-17 MySQL常用存储引擎之Archive | |
| 2-18 MySQL常用存储引擎之Memory | |
| 2-19 MySQL常用存储引擎之Federated | |
| 2-20 如何选择存储引擎 | |
| 2-21 MySQL服务器参数介绍 | |
| 2-22 内存配置相关参数 | |
| 2-23 IO相关配置参数 | |
| 2-24 安全相关配置参数 | |
| 2-25 其它常用配置参数 | |
| 2-26 数据库设计对性能的影响 | |
| 2-27 总结 | |
| | |
| **第3章 MySQL基准测试** | |
| *了解基准测试,MySQL基准测试工具介绍及实例演示。* | |
| | |
| 3-1 什么是基准测试 | |
| 3-2 如何进行基准测试 | |
| 3-3 基准测试演示实例 | |
| 3-4 Mysql基准测试工具之mysqlslap | |
| 3-5 Mysql基准测试工具之sysbench | |
| 3-6 sysbench基准测试演示实例 | |
| | |
| **第4章 MySQL数据库结构优化** | |
| *详细介绍数据库结构设计、范式和反范式设计、物理设计等等。* | |
| | |
| 4-1 数据库结构优化介绍 | |
| 4-2 数据库结构设计 | |
| 4-3 需求分析及逻辑设计 | |
| 4-4 需求分析及逻辑设计-反范式化设计 | |
| 4-5 范式化设计和反范式化设计优缺点 | |
| 4-6 物理设计介绍 | |
| 4-7 物理设计-数据类型的选择 | |
| 4-8 物理设计-如何存储日期类型 | |
| 4-9 物理设计-总结 | |
| | |
| **第5章 MySQL高可用架构设计** | |
| *详细介绍二进制日志及其对复制的影响、GTID的复制、MMM、MHA等等。* | |
| | |
| 5-1 mysql复制功能介绍 | |
| 5-2 mysql二进制日志 | |
| 5-3 mysql二进制日志格式对复制的影响 | |
| 5-4 mysql复制工作方式 | |
| 5-5 基于日志点的复制 | |
| 5-6 基于GTID的复制 | |
| 5-7 MySQL复制拓扑 | |
| 5-8 MySQL复制性能优化 | |
| 5-9 MySQL复制常见问题处理 | |
| 5-10 什么是高可用架构 | |
| 5-11 MMM架构介绍 | |
| 5-12 MMM架构实例演示(上) | |
| 5-13 MMM架构实例演示(下) | |
| 5-14 MMM架构的优缺点 | |
| 5-15 MHA架构介绍 | |
| 5-16 MHA架构实例演示(1) | |
| 5-17 MHA架构实例演示(2) | |
| 5-18 MHA架构优缺点 | |
| 5-19 读写分离和负载均衡介绍 | |
| 5-20 MaxScale实例演示 | |
| | |
| **第6章 数据库索引优化** | |
| *介绍BTree索引和Hash索引,详细介绍索引的优化策略等等。* | |
| | |
| 6-1 Btree索引和Hash索引 | |
| 6-2 安装演示数据库 | |
| 6-3 索引优化策略(上) | |
| 6-4 索引优化策略(中) | |
| 6-5 索引优化策略(下) | |
| | |
| **第7章 SQL查询优化** | |
| *详细介绍慢查询日志及示例演示,MySQL查询优化器介绍及特定SQL的查询优化等。* | |
| | |
| 7-1 获取有性能问题SQL的三种方法 | |
| 7-2 慢查询日志介绍 | |
| 7-3 慢查询日志实例 | |
| 7-4 实时获取性能问题SQL | |
| 7-5 SQL的解析预处理及生成执行计划 | |
| 7-6 如何确定查询处理各个阶段所消耗的时间 | |
| 7-7 特定SQL的查询优化 | |
| | |
| **第8章 数据库的分库分表** | |
| *详细介绍数据库分库分表的实现原理及演示案例等。* | |
| | |
| 8-1 数据库分库分表的几种方式 | |
| 8-2 数据库分片前的准备 | |
| 8-3 数据库分片演示(上) | |
| 8-4 数据库分片演示(下) | |
| | |
| **第9章 数据库监控** | |
| *介绍数据库可用性监控、性能监控、MySQL主从复制监控等* | |
| | |
| 9-1 数据库监控介绍 | |
| 9-2 数据库可用性监控 | |
| 9-3 数据库性能监控 | |
| 9-4 MySQL主从复制监控 | |
================================================
FILE: course/21 JVM.md
================================================
## 《深入理解Java虚拟机》学习记录
[深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)](https://www.roncoo.com/course/view/0ec92a81e8764b838e86c4febe7a5b17)
| 章节 | 记录 |
| ---------------------------------------------------- | ---- |
| 1 说在前面的话 | |
| 2 整个部分要讲的内容说明 | |
| 3 环境搭建以及jdk,jre,jvm的关系 | |
| 4 jvm初体验-内存溢出问题的分析与解决 | |
| 5 jvm再体验-jvm可视化监控工具 | |
| 6 杂谈 | |
| 7 Java的发展历史 | |
| 8 Java的发展历史续 | |
| 9 Java技术体系 | |
| 10 jdk8的新特性 | |
| 11 lanmbda表达式简介 | |
| 12 Java虚拟机-classic vm | |
| 13 Java虚拟机-ExactVM | |
| 14 Java虚拟机-HotSpotVM | |
| 15 Java虚拟机-kvm | |
| 16 Java虚拟机-JRockit | |
| 17 Java虚拟机-j9 | |
| 18 Java虚拟机-dalvik | |
| 19 Java虚拟机-MicrosoftJVM | |
| 20 Java虚拟机-高性能Java虚拟机 | |
| 21 Java虚拟机-TaobaoVM | |
| 22 Java内存区域-简介 | |
| 23 Java内存区域-Java虚拟机栈 | |
| 24 Java内存区域-程序计数器 | |
| 25 Java内存区域-本地方法栈 | |
| 26 Java内存区域-堆内存 | |
| 27 Java内存区域-方法区 | |
| 28 Java内存区域-直接内存和运行时常量池 | |
| 29 对象在内存中的布局-对象的创建 | |
| 30 探究对象的结构 | |
| 31 深入理解对象的访问定位 | |
| 32 垃圾回收-概述 | |
| 33 垃圾回收-判断对象是否存活算法-引用计数法详解 | |
| 34 垃圾回收-判断对象是否存活算法-可达性分析法详解 | |
| 35 垃圾回收算法-标记清除算法 | |
| 36 垃圾回收算法-复制算法 | |
| 37 垃圾回收算法-标记整理算法和分代收集算法 | |
| 38 垃圾收集器-serial收集器详解 | |
| 39 垃圾收集器-parnew收集器详解 | |
| 40 垃圾收集器-parallel收集器详解 | |
| 41 垃圾收集器-cms收集器详解 | |
| 42 最牛的垃圾收集器-g1收集器详解 | |
| 43 内存分配-概述 | |
| 44 内存分配-Eden区域 | |
| 45 内存分配-大对象直接进老年代 | |
| 46 内存分配-长期存活的对象进入老年代 | |
| 47 内存分配-空间分配担保 | |
| 48 内存分配-逃逸分析与栈上分配 | |
| 49 虚拟机工具介绍 | |
| 50 虚拟机工具-jps详解 | |
| 51 虚拟机工具-jstat详解 | |
| 52 虚拟机工具-jinfo详解 | |
| 53 虚拟机工具-jmap详解 | |
| 54 虚拟机工具-jhat详解 | |
| 55 虚拟机工具-jstack详解 | |
| 56 可视化虚拟机工具-Jconsole内存监控 | |
| 57 可视化虚拟机工具-Jconsole线程监控 | |
| 58 死锁原理以及可视化虚拟机工具-Jconsole线程死锁监控 | |
| 59 VisualVM使用详解 | |
| 60 性能调优概述 | |
| 61 性能调优-案例1 | |
| 62 性能调优-案例2 | |
| 63 性能调优-案例3 | |
| 64 前半部分内容整体回顾 | |
| 65 Class文件简介和发展历史 | |
| 66 Class文件结构概述 | |
| 67 Class文件设计理念以及意义 | |
| 68 文件结构-魔数 | |
| 69 文件结构-常量池 | |
| 70 文件结构-访问标志 | |
| 71 文件结构-类索引 | |
| 72 文件结构-字段表集合 | |
| 73 文件结构-方法表集合 | |
| 74 文件结构-属性表集合 | |
| 75 字节码指令简介 | |
| 76 字节码与数据类型 | |
| 77 加载指令 | |
| 78 运算指令 | |
| 79 类型转换指令 | |
| 80 对象创建与访问指令 | |
| 81 操作树栈指令 | |
| 82 控制转移指令 | |
| 83 方法调用和返回指令 | |
| 84 异常处理指令 | |
| 85 同步指令 | |
| 86 类加载机制概述 | |
| 87 类加载时机 | |
| 88 类加载的过程-加载 | |
| 89 类加载的过程-验证 | |
| 90 类加载的过程-准备 | |
| 91 类加载的过程-解析 | |
| 92 类加载的过程-初始化 | |
| 93 类加载器 | |
| 94 双亲委派模型 | |
| 95 运行时栈帧结构 | |
| 96 局部变量表 | |
| 97 操作数栈 | |
| 98 动态连接 | |
| 99 方法返回地址和附加信息 | |
| 100 方法调用-解析调用 | |
| 101 方法调用-静态分派调用 | |
| 102 方法调用-动态分派调用 | |
| 103 动态类型语言支持 | |
| 104 字节码执行引擎小结 | |
| 105 总结与回顾 | |
| 106 happens-before简单概述 | |
| 107 重排序问题 | |
| 108 锁的内存语义 | |
| 109 volatile的内存语义 | |
| 110 final域内存语义 | |
================================================
FILE: course/22 白鹤翔_JVM虚拟机优化.md
================================================
## 尚学堂-白鹤翔_jvm虚拟机优化 学习记录
| 章节 | 记录 |
| ------------------------------- | ------------------------------- |
| 1 jvm_虚拟机概念1 | |
| 2 jvm_虚拟机概念2 | |
| 3 jvm_虚拟机组成部分概述 | |
| 4 jvm_堆栈永久区详细讲解 | |
| 5 jvm_虚拟机参数讲解(一)1 | |
| 6 jvm_虚拟机参数讲解(一)2 | |
| 7 jvm_虚拟机参数讲解(二)1 | |
| 8 jvm_虚拟机参数讲解(二)2 | |
| 9 jvm_虚拟机参数讲解(三)1 | |
| 10 jvm_虚拟机参数讲解(三)2 | |
| 11 jvm_虚拟机参数讲解(三)3 | |
| 12 jvm_垃圾收集算法讲解(一)1 | |
| 13 jvm_垃圾收集算法讲解(一)2 | |
| 14 jvm_垃圾收集算法讲解(二) | |
| 15 jvm_关于一些编辑器工具使用 | |
| 16 虚拟机介绍 | |
| 17 垃圾回收 | |
================================================
FILE: course/23 MySQL大型分布式集群.md
================================================
## 《MySQL大型分布式集群》 学习记录
官网:[【龙果学院】MySQL大型分布式集群](https://www.roncoo.com/course/view/658088f6e77541f5835b61800314083e)
### 课程介绍
本套课程将通过分布式集群和分库分表两部分内容进行讲解
1. 主要解决针对大型网站架构中持久化部分中,大量数据存储以及高并发访问所带来是数据读写问题。分布式是将一个业务拆分为多个子业务,部署在不同的服务器上。集群是同一个业务,部署在多个服务器上。
2. 着重对数据切分做了细致丰富的讲解,从数据切分的原理出发,一步一步深入理解数据的切分,通过深入理解各种切分策略来设计和优化我们的系统。这部分中我们还用到了数据库中间件和客户端组件来进行数据的切分,让广大网友能够对数据的切分从理论到实战都会有一个质的飞跃。
学完本套课程以后能够达到的效果:
期望通过本课程能帮助大家学习到如何通过分布式+集群的方式来提高io的吞吐量,以及数据库的主从复制,主主复制,负载均衡,高可用,分库分表以及数据库中间件的使用。希望能够帮助大家更加清楚了解架构的工作模式,从而写出更高质量的代码。对于企业的架构人员可以优化企业架构。对于兴趣爱好者,可以作为一个很好的入门。
课程讲解过程中尽可能用简单的语言描述其中的原理,通过实例来帮助初学者快速上手。案例中代码全部手写,实例全部现场真实环境演示。
教程样例项目中用到的技术及相应的环境
MySQL5.7 CentOS6.9 Vmware Spring3.x以上 JDK8 Maven XShell Xftp
教程中所有的与编程相关均使用Java来进行演示,但与编程语言无关,可使用任何编程语言进行测试。
| 章节 | 记录 |
| ---------------------------------------------------- | ---- |
| 1 课程概述 | |
| 2 课程背景 | |
| 3 纵观大型网站架构发展,总结持久化部分需要应对的问题 | |
| 4 操作系统安装以及配置 | |
| 5 在CentOS上通过yum安装mysql5.7 | |
| 6 mysql初次见面-mysql5.7的用户以及安全策略 | |
| 7 mysql初次见面续-mysql基本操作 | |
| 8 认识主从复制 | |
| 9 主从复制的准备工作01-mysql用户以及权限 | |
| 10 主从复制的准备工作02-binlog日志详解 | |
| 11 主从实战01-准备环境 | |
| 12 主从实战02-主节点配置 | |
| 13 主从实战03-从节点配置 | |
| 14 java操作主从01 | |
| 15 java操作主从02 | |
| 16 主主复制 | |
| 17 负载均衡概述以及环境准备 | |
| 18 搭建负载均衡-01 | |
| 19 搭建负载均衡-02 | |
| 20 启动haproxy的监控功能 | |
| 21 高可用以及环境准备 | |
| 22 搭建keepalived | |
| 23 Keepalived配置简介 | |
| 24 Keepalived配置邮件 | |
| 25 Keepalived其他配置 | |
| 26 分库分表概述 | |
| 27 逻辑分表01-水平分表 | |
| 28 逻辑分表02-水平分表续及垂直分表 | |
| 29 表分区 | |
| 30 数据库中间件01-认识mycat | |
| 31 数据库中间件02-mycat安装 | |
| 32 数据库中间件03-mycat的helloworld | |
| 33 数据库中间件04-mycat的初识 | |
| 34 数据库中间件05-mycat的数据切分 | |
| 35 数据库中间件06-mycat的读写分离-01 | |
| 36 数据库中间件06-mycat的读写分离-02 | |
| 37 数据库中间件06-mycat的读写分离03-读写分离补充 | |
| 38 数据库中间件07-mycat的高可用-01 | |
| 39 数据库中间件08-mycat的高可用-02 | |
| 40 数据库中间件09-mycat集群 | |
| 41 mysql查询缓存 | |
| 42 数据库切分概述 | |
| 43 java环境配置 | |
| 44 水平切分原理及单表切分后的操作 | |
| 45 水平切分原理及单表切分后的操作-2 | |
| 46 水平切分多表关联操作 | |
| 47 垂直切分原理及操作 | |
| 48 全局序列号 | |
| 49 数据库切分策略-分片枚举 | |
| 50 数据库切分策略-hash | |
| 51 数据库切分策略-范围约定 | |
| 52 数据库切分策略-取模 | |
| 53 数据库切分策略-按日期分片 | |
| 54 全局表 | |
| 55 认识MyCat | |
| 56 部署MyCat | |
| 57 使用MyCat完成简单的数据库分片 | |
| 58 MyCat分片策略 | |
| 59 MyCat全局表配置 | |
| 60 MyCatER表配置 | |
| 61 另外一种切分方式-使用客户端组件的方式实现数据库分 | |
| 62 课程总结 | |
================================================
FILE: course/24 操作系统(清华大学).md
================================================
## 操作系统_清华大学(向勇、陈渝)
| 章节 | 记录 |
| ------------------------------------------ | ---- |
| 1.1 课程概述 | |
| 1.2 什么是操作系统 | |
| 1.3 为什么学习操作系统 | |
| 1.4 如何学习操作系统 | |
| 1.5 操作系统实例 | |
| 1.6 操作系统的历史 | |
| 1.7 操作系统结构 | |
| 1.8 小结 | |
| | |
| 2.1 操作系统的启动 | |
| 2.2 操作系统的终端、异常、和系统调用 | |
| | |
| 3.1 计算机体系结构及内存分层体系 | |
| 3.2 地址空间与地址生成 | |
| 3.3 连续内存分配:内存碎片与分区的动态分配 | |
| 3.4 连续内存分配:压缩式与交换式碎片整理 | |
| | |
| 4.1 非连续内存分配:分段 | |
| 4.2 非连续内存分配:分页 | |
| 4.3 非连续内存分配:页表-概述、TLB | |
| 4.4 非连续内存分配:页表-二级,多级页表 | |
| 4.5 非连续内存分配:页表-反向页表 | |
| | |
| 5.1 虚拟内存的起因 | |
| 5.2 覆盖技术 | |
| 5.3 交换技术 | |
| 5.4 虚存技术(上) | |
| 5.5 虚存技术(下) | |
| | |
| 6.1 最优页面置换算法 | |
| 6.2 先进先出算法 | |
| 6.3 最近最久未使用算法 | |
| 6.4 时钟页面置换算法 | |
| 6.5 二次机会法 | |
| 6.6 最不常用法 | |
| 6.7 Belady现象、LRU、FIFO、Clock的比较 | |
| 6.8 局部页替换算法的问题、工作集模型 | |
| 6.9 两个全局置换算法 | |
| 6.10 抖动问题 | |
| | |
| 7.1 进程的定义 | |
| 7.2 进程的组成 | |
| 7.3 进程的特点 | |
| 7.4 进程控制结构 | |
| 7.5 进程的生命期原理 | |
| 7.6 进程状态变化模型 | |
| 7.7 进程挂起 | |
| 7.8 为什么使用线程 | |
| 7.9 什么是线程 | |
| 7.10 线程的实现 | |
| 7.11 上下文切换 | |
| 7.12 进程控制——创建进程 | |
| 7.13 进程控制——加载和执行进程 | |
| 7.14 进程控制——等待和终止进程 | |
| | |
| 8.1 背景 | |
| 8.2 调度原则 | |
| 8.3 调度算法1 | |
| 8.4 调度算法2 | |
| 8.5 实时调度 | |
| 8.6 多处理器调度与优先级反转 | |
| | |
| 9.1 背景知识 | |
| 9.2 一些概念part1 | |
| 9.3 一些概念part2 | |
| 9.4 一些概念part3 | |
| 9.5 临界区 | |
| 9.6 方法1:禁用硬件中断 | |
| 9.7 方法2:基于软件的解决方案 | |
| 9.8 方法3:更高级的抽象 | |
| | |
| 10.1 背景 | |
| 10.2 信号量 | |
| 10.3 信号量的使用 | |
| 10.4 信号量的实现 | |
| 10.5 管程 | |
| 10.6 经典同步问题-1 | |
| 10.7 经典同步问题-2 | |
| 10.8 经典同步问题-3 | |
| 10.9 经典同步问题-4 | |
| 10.10 经典同步问题-5 | |
| 10.11 景点同步问题-6 | |
| | |
| 11.1 死锁问题 | |
| 11.2 系统模型 | |
| 11.3 死锁特征 | |
| 11.4 死锁处理办法 | |
| 11.5 死锁预防和死锁避免 | |
| 11.6 银行家算法 | |
| 11.7 死锁检测和死锁恢复 | |
| 11.8 IPC概述 | |
| 11.9 信号、管道、消息队列和共享内存 | |
| | |
| 12.1 文件系统:总体介绍 | |
| 12.2 基本概念 | |
| 12.3 基本概念——文件系统和文件 | |
| 12.4 基本概念——文件系统的功能 | |
| 12.5 基本概念——文件和块 | |
| 12.6 基本概念——文件描述符 | |
| 12.7 基本概念——目录 | |
| 12.8 基本概念——文件别名 | |
| 12.9 基本概念——文件系统种类 | |
| 12.10 虚拟文件系统 | |
| 12.11 数据缓存 | |
| 12.12 打开文件的数据结构 | |
| 12.13 文件分配 | |
| 12.14 空闲空间列表 | |
| 12.15 多磁盘管理-RAID | |
| 12.16 磁盘调度 | |
================================================
FILE: course/25 Linux达人养成计划 I.md
================================================
## 《Linux达人养成计划 I》学习记录
时长:8小时58分钟
| 章节 | 记录 |
| ------------------------------------------ | ---- |
| 1-1 Linux简介 | |
| 1-2 开源软件简介 | |
| 1-3 Linux应用领域 | |
| 1-4 Linux学习方法 | |
| 1-5 Linux与Windows的不同 | |
| 1-6 字符界面的优势 | |
| | |
| 2-1 虚拟机的安装 | |
| 2-2 虚拟机使用 | |
| 2-3 系统分区之分区与格式化 | |
| 2-4 分区之分区设备文件名与挂载 | |
| 2-5 Linux系统安装 | |
| 2-6 XShell的安装和使用 | |
| | |
| 3-1 命令格式(命令基本格式及文件处理命令) | |
| 3-2 目录处理命令(上) | |
| 3-3 目录处理命令(下) | |
| 3-4 常见目录作用 | |
| 3-5 链接命令 | |
| | |
| 4-1 文件搜索命令locate | |
| 4-2 命令搜索命令 | |
| 4-3 find命令 | |
| 4-4 grep命令 | |
| | |
| 5-1 帮助命令 | |
| 5-2 其他帮助命令 | |
| | |
| 6-1 压缩命令1 | |
| 6-2 压缩命令2 | |
| | |
| 7-1 关机与重启命令 | |
| | |
| 8-1 挂载命令 | |
| 8-2 用户登录查看命令 | |
| | |
| 9-1 shell概述 | |
| 9-2 脚本执行方式 | |
| 9-3 别名与快捷键 | |
| 9-4 历史命令 | |
| 9-5 输出重定向 | |
| 9-6 管道符 | |
| 9-7 通配符 | |
================================================
FILE: course/26 Linux 达人养成计划 II.md
================================================
## 《Linux 达人养成计划 II》学习记录
时长:2小时30分
| 章节 | 记录 |
| --------------------------------- | ---- |
| 第1章 VIM文本编辑器 | |
| 1-1 VIM编辑器概述 | |
| 1-2 VIM编辑器的操作模式 | |
| 1-3 VIM编辑器的命令模式 | |
| 1-4 底行模式和命令模式常用指令 | |
| 1-5 练习题 | |
| | |
| 第2章 磁盘管理 | |
| 2-1 Linux 磁盘管理基本命令 | |
| 2-2 Linux 硬盘分区和格式化概述 | |
| 2-3 Linux 在VM虚拟机中添加硬盘 | |
| 2-4 Linux中MBR分区 | |
| 2-5 Linux中GPT分区 | |
| 2-6 Linux中分区的格式化 | |
| 2-7 Linux中挂载分区 | |
| 2-8 Linux中swap分区 | |
| 2-9 练习题 | |
| | |
| 第3章 用户管理 | |
| 3-1 Linux中用户和用户组的概念 | |
| 3-2 Linux中用户和用户组的基本命令 | |
| 3-3 Linux中用户和用户组进阶命令 | |
| 3-4 Linux中用户管理其他命令 | |
================================================
FILE: course/27 快速上手Linux 玩转典型应用.md
================================================
## 快速上手 Linux 玩转典型应用
时长:10小时
| 章节 | 记录 |
| ------------------------------------------ | ---- |
| 第1章 课程介绍 | |
| 1-1 导学 | |
| | |
| 第2章 Linux简介 | |
| 2-1 什么是 Linux | |
| 2-2 Linux能够做什么事情 | |
| 2-3 Linux的学习方法 | |
| 2-4 忘掉 window的所有东西 | |
| | |
| 第3章 CentOs 的安装 | |
| 3-1 虚拟机是什么 | |
| 3-2 在虚拟机中安装CentOs | |
| 3-3 云服务器介绍 | |
| | |
| 第4章 准备工作 | |
| 4-1 课前准备工作 | |
| | |
| 第5章 远程连接SSH专题 | |
| 5-1 认识SSH | |
| 5-2 服务器安装SSH服务 | |
| 5-3 客户端安装SSH工具 | |
| 5-4 客户端链接SSH服务 | |
| 5-5 SSH config 命令讲解 | |
| 5-6 SSH免密登录 | |
| | |
| 第6章 Linux常用命令讲解 | |
| 6-1 Linux常用命令 | |
| 6-2 服务器硬件资源信息 | |
| 6-3 文件操作命令 | |
| 6-4 Linux文本编辑神器--VIM | |
| 6-5 系统用户操作命令 | |
| 6-6 防火墙的设置 | |
| 6-7 提权和文件上传下载的操作 | |
| | |
| 第7章 WebServer安装和配置讲解 | |
| 7-1 Apache的安装 | |
| 7-2 Apache的虚拟主机配置及伪静态操作 | |
| 7-3 Nginx的基本操作 | |
| 7-4 Nginx伪静态的实现 | |
| 7-5 实例演示反向代理和负载均衡 | |
| | |
| 第8章 数据库服务 | |
| 8-1 Mysql安装及链接 | |
| 8-2 远程链接 | |
| 8-3 开启genelog | |
| | |
| 第9章 缓存服务 | |
| 9-1 Redis、Memcache介绍及安装 | |
| 9-2 Redis的基本操作 | |
| | |
| 第10章 Git安装和使用 | |
| 10-1 git版本管理工具(上) | |
| 10-2 git版本管理工具(下) | |
| | |
| 第11章 Php框架TP5,Lavaral Yii2.0 环境配置 | |
| 11-1 PHP基础运行环境搭建 | |
| 11-2 Laravel运行环境配置(上) | |
| 11-3 Laravel运行环境配置(下) | |
| 11-4 yii2.0 TP 5.0 框架配置 | |
| 11-5 PhpMyadmin的配置安装 | |
| 11-6 PhpRedisAdmin的配置安装 | |
| | |
| 第12章 Java运行环境配置 | |
| 12-1 Java运行环境配置 | |
| 12-2 maven高级使用 | |
| | |
| 第13章 Python运行环境 | |
| 13-1 Python 运行环境配置 | |
| 13-2 Python flask 高级应用 | |
| | |
| 第14章 服务管理 | |
| 14-1 Linux常见服务-Crontba、Ntpdate | |
| 14-2 Linux常见服务--Logrotate.Supervisor | |
| | |
| 第15章 监控神器Zabbix | |
| 15-1 监控系统Zabbix (上) | |
| 15-2 监控系统Zabbix (下) | |
| | |
| 第16章 课程总结 | |
| 16-1 课程总结 | |
================================================
FILE: course/28 系统学习Docker 践行DevOps理念.md
================================================
## 系统学习Docker 践行DevOps理念
时长:15小时
| 章节 | 记录 |
| --------------------------------------------------- | ---- |
| 第1章 容器技术和Docker简介 | |
| 1-1 Docker导学 | |
| 1-2 容器技术概述 | |
| 1-3 Docker魅力初体验 | |
| 1-4 课程源码获取和注意事项 | |
| | |
| 第2章 Docker环境的各种搭建方法 | |
| 2-1 Docker安装简介 | |
| 2-2 在MAC系统上安装Docker | |
| 2-3 在Windows系统上安装Docker | |
| 2-4 Vagrant&VirtualBox for Mac | |
| 2-5 Vagrant&VirtualBox for Windows | |
| 2-6 在CentOS上安装Docker | |
| 2-7 Docker Machine的本地使用 | |
| 2-8 Docker Machine在阿里云上的使用 | |
| 2-9 Docker Machine在亚马逊AWS云上的使用 | |
| 2-10 Docker Playground | |
| 2-11 本章总结 | |
| | |
| 第3章 Docker的镜像和容器 | |
| 3-1 Docker架构和底层技术简介 | |
| 3-2 Docker Image概述 | |
| 3-3 DIY一个Base Image | |
| 3-4 初识Container | |
| 3-5 构建自己的Docker镜像 | |
| 3-6 Dockerfile语法梳理及最佳实践 | |
| 3-7 RUN vs CMD vs Entrypoint | |
| 3-8 镜像的发布 | |
| 3-9 Dockerfile实战 | |
| 3-10 容器的操作 | |
| 3-11 Dockerfile实战(2) | |
| 3-12 容器的资源限制 | |
| | |
| 第4章 Docker的网络 | |
| 4-1 本章概述和实验环境介绍 | |
| 4-2 网络基础回顾 | |
| 4-3 Linux网络命名空间 | |
| 4-4 Docker bridge0详解 | |
| 4-5 容器之间的link | |
| 4-6 容器的端口映射 | |
| 4-7 容器网络之host和none | |
| 4-8 多容器复杂应用的部署演示 | |
| 4-9 Overlay和Underlay的通俗解释 | |
| 4-10 Docker Overlay网络和etcd实现多机容器通信 | |
| | |
| 第5章 Docker的持久化存储和数据共享 | |
| 5-1 本章介绍 | |
| 5-2 本章实验环境介绍 | |
| 5-3 数据持久化之Data Volume | |
| 5-4 数据持久化之Bind Mouting | |
| 5-5 开发者利器-Docker+Bind Mout | |
| | |
| 第6章 Docker Compose多容器部署 | |
| 6-1 根据前面所学部署一个wordpress | |
| 6-2 Docker Compose到底是什么 | |
| 6-3 Docker Compose的安装和基本使用 | |
| 6-4 水平扩展和负载均衡 | |
| 6-5 部署一个复杂的投票应用 | |
| | |
| 第7章 容器编排Docker Swarm | |
| 7-1 容器编排Swarm介绍 | |
| 7-2 创建一个三节点的swarm集群 | |
| 7-3 Service的创建维护和水平扩展 | |
| 7-4 在swarm集群里通过service部署wordpress | |
| 7-5 集群服务间通信之Routing Mesh | |
| 7-6 Routing Mesh之Ingress负载均衡 | |
| 7-7 Docker Stack部署Wordpress | |
| 7-8 作业解答之部署投票应用 | |
| 7-9 Docker Secret管理和使用 | |
| 7-10 Docker Secret在Stack中的使用 | |
| 7-11 Service更新 | |
| | |
| 第8章 DevOps初体验——Docker Cloud和Docker企业版 | |
| 8-1 谈钱不伤感情-Docker的收费模式 | |
| 8-2 Docker Cloud简介 | |
| 8-3 Docker Cloud之自动build Docker image | |
| 8-4 Docker Cloud之持续集成和持续部署 | |
| 8-5 Docker企业版的在线免费体验 | |
| 8-6 Docker企业版本地安装之UCP | |
| 8-7 Docker企业版本地安装之DTR | |
| 8-8 Docker企业版UCP的基本使用演示 | |
| 8-9 体验阿里云的容器服务 | |
| 8-10 在阿里云上安装Docker企业版.mp4 | |
| 8-11 Docker企业版DTR的基本使用演示 | |
| | |
| 第9章 容器编排Kubernetes | |
| 9-1 Kubenetes简介 | |
| 9-2 Minikube快速搭建K8S单节点环境 | |
| 9-3 K8S最小调度单位Pod | |
| 9-4 ReplicaSet和ReplicationController | |
| 9-5 Deployment_.mp4 | |
| 9-6 使用Tectonic在本地搭建多节点K8S集群 | |
| 9-7 k8s基础网络Cluster Network | |
| 9-8 Service简介和演示 | |
| 9-9 NodePort类型Service以及Label的简单实用_音频.mp4 | |
| 9-10 准备工作——使用kops在亚马逊AWS上搭建k8s集群 | |
| 9-11 使用kops在亚马逊AWS上搭建k8s集群.mp4 | |
| 9-12 LoadBlancer类型Service以及AWS的DNS服务配置 | |
| 9-13 在亚马逊k8s集群上部署wordpress | |
| | |
| 第10章 容器的的运维和监控 | |
| 10-1 容器的基本监控 | |
| 10-2 k8s集群运行资源监控——Heapster+Grafana+InfluxDB | |
| 10-3 根据资源占用自动横向伸缩 | |
| 10-4 k8s集群Log的采集和展示——ELK+Fluentd | |
| 10-5 k8s集群监控方案Prometheus | |
| | |
| 第11章 Docker+DevOps实战——过程和工具 | |
| 11-1 本章简介 | |
| 11-2 搭建GitLab服务器 | |
| 11-3 搭建GitLab CI服务器和Pipeline演示 | |
| 11-4 基于真实Python项目的CI演示 | |
| 11-5 简单Java项目的CI演示 | |
| 11-6 使用Python项目演示的CICD流程 | |
| 11-7 CI实现版本自动发布 | |
| 11-8 本章总结和如何继续学习 | |
| | |
| 第12章 课程总结 | |
| 12-1 不是总结的总结 | |
================================================
FILE: course/30 Python Flask构建可扩展的RESTful API.md
================================================
## Python Flask构建可扩展的RESTful API
时长:6小时25分钟
| 章节 | 记录 |
| ------------------------------------------------------------ | ---- |
| **第1章 随便聊聊** | |
| 聊聊Flask与Django,聊聊代码的创造性 | |
| | |
| 1-1 Flask VS Django | |
| 1-2 课程更新维护说明 | |
| | |
| **第2章 起步与红图** | |
| 本章我们初始化项目,探讨与研究Flask的默认层级结构。当我们遇到层级结构不合理时,我们将模仿蓝图自己定义一个“红图”来扩展Flask层级体系 | |
| | |
| 2-1 环境、开发工具与flask1.0 | |
| 2-2 初始化项目 | |
| 2-3 新建入口文件 | |
| 2-4 蓝图分离视图函数的缺陷 | |
| 2-5 打开思维,创建自己的Redprint——红图 | |
| 2-6 实现Redprint | |
| 2-7 优化Redprint | |
| | |
| **第3章 REST基本特征** | |
| 本章我们将探讨REST的基本特征,并结合实际情况给出REST的适用范围与优劣势 | |
| | |
| 3-1 REST的最基本特征(可选观看) | |
| 3-2 为什么标准REST不适合内部开发(可选观看) | |
| | |
| **第4章 自定义异常对象** | |
| 异常处理其实是一个非常严肃而又麻烦的事情,这直接涉及到前端如何对用户做出响应。本章我们将重写HTTPException并建立全局异常处理机制,统一处理框架内的异常,向前端返回统一而标准的异常信息,简化前端的开发流程 | |
| | |
| 4-1 关于“用户”的思考 | |
| 4-2 构建Client验证器 | |
| 4-3 处理不同客户端注册的方案 | |
| 4-4 创建User模型 | |
| 4-5 完成客户端注册 | |
| 4-6 生成用户数据 | |
| 4-7 自定义异常对象 | |
| 4-8 浅谈异常返回的标准与重要性 | |
| 4-9 自定义APIException | |
| | |
| **第5章 理解WTForms并灵活改造她** | |
| WTForms其实是非常强大的验证插件。但很多同学对WTForms的理解仅仅停留在“验证表单”上。那WTForms可以用来做API的参数验证码?完全可以,但这需要你灵活的使用它,对它做出一些“改变” | |
| | |
| 5-1 重写WTForms 一 | |
| 5-2 重写WTForms 二 | |
| 5-3 可以接受定义的复杂,但不能接受调用的复杂 | |
| 5-4 已知异常与未知异常 | |
| 5-5 全局异常处理 | |
| | |
| **第6章 Token与HTTPBasic验证 —— 用令牌来管理用户** | |
| 在我的TP5课程里,我们使用令牌的方式是服务器缓存的方式。那么在Python Flask中我们换一种令牌的发放方式。我们将用户的信息加密后作为令牌返回到客户端,客户端在访问服务器API时必须以HTTP Basic的方式携带令牌,我们再读取令牌信息后,将用户信息存入到g变量中,共业务代码全局使用... | |
| | |
| 6-1 Token概述 | |
| 6-2 获取Token令牌 | |
| 6-3 Token的用处 | |
| 6-4 @auth拦截器执行流程 | |
| 6-5 HTTPBasicAuth基本原理 | |
| 6-6 以BasicAuth的方式发送Token | |
| 6-7 验证Token | |
| 6-8 重写first_or_404与get_or_404 | |
| | |
| **第7章 模型对象的序列化** | |
| 最适合Python JSON序列化的是dict字典类型,每一种语言都有其对应的数据结构用来对应JSON对象,比如在PHP中是它的数组数据结构。而Python是用字典来对应JSON的。如果我们想直接序列化一个对象或者模型对象,那么最笨的办法是把对象的属性读取出来,然后组装成一个字典再序列化。这实在是太麻烦了。本章节我们将深入了解JSO... | |
| | |
| 7-1 鸡汤? | |
| 7-2 理解序列化时的default函数 | |
| 7-3 不完美的对象转字典 | |
| 7-4 深入理解dict的机制 | |
| 7-5 一个元素的元组要特别注意 | |
| 7-6 序列化SQLAlchemy模型 | |
| 7-7 完善序列化 | |
| 7-8 ViewModel对于API有意义吗 | |
| | |
| **第8章 权限控制** | |
| 我看过太多同学编写的API在互联网上疯狂的裸奔了。殊不知这太危险了。API必须提供分层保护机制,根据不同用户的种类来限制其可以访问的API,从而保护接口。比如管理员可以访问哪些接口,普通用户可以访问哪些接口,小程序可以访问哪些,APP又能够访问哪些?灵活而强大的可配置Scope,可以帮助你事半功倍... | |
| | |
| 8-1 删除模型注意事项 | |
| 8-2 g变量中读取uid防止超权 | |
| 8-3 生成超级管理员账号 | |
| 8-4 不太好的权限管理方案 | |
| 8-5 比较好的权限管理方案 | |
| 8-6 实现Scope权限管理 一 | |
| 8-7 globals()实现“反射” | |
| 8-8 实现Scope权限管理 二 | |
| 8-9 Scope优化一 支持权限相加 | |
| 8-10 Scope优化 二 支持权限链式相加 | |
| 8-11 Scope优化 三 所有子类支持相加 | |
| 8-12 Scope优化 四 运算符重载 | |
| 8-13 Scope 优化 探讨模块级别的Scope | |
| 8-14 Scope优化 实现模块级别的Scope | |
| 8-15 Scope优化 七 支持排除 | |
| | |
| **第9章 实现部分鱼书小程序功能** | |
| 理论必须结合实践,我们提供一个简单的鱼书小程序,编写他的业务接口,并用小程序来进行API的检验 | |
| | |
| 9-1 小程序演示API调用效果 | |
| 9-2 模糊搜索书籍 | |
| 9-3 再谈严格型REST的缺陷 | |
| 9-4 实现hide方法 | |
| 9-5 @orm.reconstructor 解决模型对象实例化问题 | |
| 9-6 重构hide与append | |
| 9-7 赠送礼物接口 | |
| 9-8 实现获取令牌信息接口 | |
================================================
FILE: course/31 学习Scala 进击大数据Spark生态圈.md
================================================
学习Scala_进击大数据Spark生态圈-课程章节
https://coding.imooc.com/class/chapter/215.html#Anchor
================================================
FILE: course/32 10小时入门大数据.md
================================================
================================================
FILE: course/Java 架构师成长之路/01 Java 单体应用.md
================================================
## Java 单体应用
| **章节** | **记录** |
| --------------------------------------------------------- | -------- |
| **开篇** | |
| 1 开篇-程序员的玄学与佛学-1 | |
| 2 开篇-程序员的玄学与佛学-2 | |
| 3 开篇-程序员的玄学与佛学-3 | |
| | |
| **第01章** | |
| 4 第01章-使用 Intellij IDEA-IDEA 简介 | |
| 5 第01章-使用 Intellij IDEA-第一个 IDEA 应用程 | |
| 6 小知识-使用 Markdown 记笔记 | |
| | |
| **第02章** | |
| 7 第02章-使用 Maven 构建应用-Maven 简介 | |
| 8 第02章-使用 Maven 构建应用-Maven 安装配置 | |
| 9 第02章-使用 Maven 构建应用-Maven 本地仓库 | |
| 10 第02章-使用 Maven 构建应用-Maven 中央仓库 | |
| 11 第02章-使用 Maven 构建应用-Maven 依赖机制 | |
| 12 第02章-使用 Maven 构建应用-Maven POM | |
| 13 第02章-使用 Maven 构建应用-Maven 快照 | |
| 14 第02章-使用 Maven 构建应用-第一个 Maven 应用程序 | |
| | |
| **第03章** | |
| 15 第03章-三层架构+MVC-什么是三层架构 | |
| 16 第03章-三层架构+MVC-什么是 MVC 模式 | |
| 17 小知识-高内聚,低耦合 | |
| 18 课后练习-三层架构-1 | 12/27 |
| 19 课后练习-三层架构-2 | |
| 20 小知识-关于如何自学的一些心得 | |
| | |
| **第04章** | |
| 21 第04章-使用 Bootstrap-Bootstrap 简介 | |
| 22 第04章-使用 Bootstrap-Bootstrap 环境安装 | |
| 23 第04章-使用 Bootstrap-Bootstrap 网格布局 | |
| 24 第04章-使用 Bootstrap-媒体查询的用法 | |
| 25 第04章-使用 Bootstrap-Bootstrap 表格 | |
| 26 第04章-使用 Bootstrap-Bootstrap 字体图标 | |
| | |
| **第05章** | |
| 27 第05章-基础框架入门-Spring-Spring 简介 | |
| 28 第05章-基础框架入门-Spring-Spring 体系结构 | |
| 29 第05章-基础框架入门-Spring-Spring 的特点 | |
| 30 第05章-基础框架入门-Spring-Spring 与 IoC | |
| 31 第05章-基础框架入门-Spring-第一个 Spring 应用程 | |
| 32 小知识-什么是 TDD 及常见的测试方式 | |
| 33 第05章-基础框架入门-JUnit-JUnit 简介 | |
| 34 第05章-基础框架入门-JUnit-第一个 JUnit 单元测试 | |
| 35 第05章-基础框架入门-JUnit-JUnit 断言 | |
| 36 第05章-基础框架入门-Log4j-Log4j 简介 | |
| 37 第05章-基础框架入门-Log4j-Log4j 日志级别 | |
| 38 第05章-基础框架入门-Log4j-Log4j 日志输出控制文件 | |
| 39 第05章-基础框架入门-Log4j-第一个 Log4j 日志文件 | |
| 40 综合复习-本周知识总结 | |
| 41 综合复习-创建项目 | |
| 42 综合复习-Bootstrap 管理模板-AdminLTE | |
| 43 综合复习-Bootstrap 管理模板-创建登录页 | |
| 44 综合复习-实现登录功能-完成后台编码 | |
| 45 综合复习-实现登录功能-增强用户体验 | |
| | |
| **第06章** | |
| 46 第06章-Spring Web 与 Bean 装配-Spring | |
| 47 第06章-Spring Web 与 Bean 装配-容器中 Bea | |
| 48 第06章-Spring Web 与 Bean 装配-基于注解的装配 | |
| 49 课后作业-记住我 | |
| | |
| **第07章** | |
| 50 第07章-Spring MVC 与 Maven 模块化开发-Spr | |
| 51 第07章-Spring MVC 与 Maven 模块化开发-Spr | |
| 52 第07章-Spring MVC 与 Maven 模块化开发-第一个 | |
| 53 第07章-Spring MVC 与 Maven 模块化开发-Spr | |
| 54 第07章-Spring MVC 与 Maven 模块化开发-Mav | |
| 55 课后练习-重新完善功能代码 | |
| | |
| **第08章** | |
| 56 第08章-MyBatis 数据持久化-MyBatis 简介 | |
| 57 第08章-MyBatis 数据持久化-Druid 简介 | |
| 58 第08章-MyBatis 数据持久化-Spring 整合 Drui | |
| 59 第08章-MyBatis 数据持久化-Spring 整合 MyBa | |
| 60 小知识-utf8 与 utf8mb4 字符集 | |
| 61 第08章-MyBatis 数据持久化-第一个 MyBatis 对象 | |
| | |
| **第09章** | |
| 62 第09章-MyBatis 表操作-单表 CRUD 操作 | |
| 63 项目实战-MyShop-实现用户登录功能 | |
| 64 项目实战-MyShop-实现首页布局 | |
| 65 项目实战-MyShop-用户管理功能-用户列表展示 | |
| 66 项目实战-MyShop-用户管理功能-实现新增用户功能 | |
| 67 项目实战-MyShop-用户管理功能-使用 Spring MVC | |
| 68 项目实战-MyShop-用户管理功能-使用 jQuery Vali | |
| 69 项目实战-MyShop-用户管理功能-使用动态 SQL 实现搜索功 | |
| 70 项目实战-MyShop-用户管理功能-优化搜索功能 | |
| 71 项目实战-MyShop-用户管理功能-使用 jQuery iChe | |
| 72 项目实战-MyShop-用户管理功能-实现批量删除功能1 | |
| 73 项目实战-MyShop-用户管理功能-实现批量删除功能2 | |
| 74 项目实战-MyShop-用户管理功能-使用 DataTables | |
| 75 项目实战-MyShop-用户管理功能-使用 DataTables | |
| 76 项目实战-MyShop-用户管理功能-实现编辑和查看功能 | |
| 77 项目实战-MyShop-用户管理功能-重新实现搜索功能 | |
| 78 项目实战-MyShop-用户管理功能-最后的收尾工作 | |
| 79 项目实战-MyShop-内容管理功能-内容分类功能准备 | |
| 80 项目实战-MyShop-内容管理功能-使用 TreeTable 展 | |
| 81 项目实战-MyShop-内容管理功能-内容列表功能准备 | |
| 82 项目实战-MyShop-内容管理功能-使用 zTree 展示内容分 | |
| 83 项目实战-MyShop-使用 Lombok 插件简化 Bean 代 | |
| 84 项目实战-MyShop-使用 Spring Validation | |
| 85 项目实战-MyShop-内容管理功能-Spring MVC + D | |
| 86 项目实战-MyShop-内容管理功能-封装 Dropzone 插件 | |
| 87 项目实战-MyShop-内容管理功能-使用 wangEditor | |
| 88 项目实战-MyShop-内容管理功能-实现 wangEditor | |
| 89 项目实战-MyShop-内容管理功能-实现关联关系查询 | |
| 90 项目实战-MyShop-重构代码-提取统一的数据访问和业务接口 | |
| 91 项目实战-MyShop-内容管理功能-实现内容分类的新增功能 | |
| 92 项目实战-MyShop-重构代码-深度封装业务逻辑层1 | |
| 93 项目实战-MyShop-重构代码-深度封装业务逻辑层2 | |
| 94 项目实战-MyShop-重构代码-封装控制器层 | |
| | |
| **第11章** | |
| 95 第11章-Spring 的事务管理-Spring 事务管理简介 | |
| 96 第11章-Spring 的事务管理-使用 AspectJ 的 AO | |
| 97 项目实战-MyShop-使用 Spring 注解管理事务 | |
| | |
| **第12章** | |
| 98 第12章-解决模块间的通信问题-项目改动说明 | |
| 99 第12章-解决模块间的通信问题-后台管理与门户数据展示说明 | |
| 100 第12章-解决模块间的通信问题-为什么存在通信问题 | |
| 101 第12章-解决模块间的通信问题-Apache HttpClien | |
| 102 第12章-解决模块间的通信问题-Apache HttpClien | |
| 103 第12章-解决模块间的通信问题-使用 Jackson 处理 JS | |
| 104 第12章-解决模块间的通信问题-创建 API 接口模块 | |
| 105 小知识-POJO、VO、DTO、Entity、Domain 的区 | |
| 106 第12章-解决模块间的通信问题-RESTful 风格的 API | |
| 107 第12章-解决模块间的通信问题-使用 Spirng MVC 实现 | |
| | |
| 108 项目实战-MyShop-创建 Web UI 门户模块 | |
| 109 项目实战-MyShop-实现 UI 模块与 API 模块的通信 | |
| 110 项目实战-MyShop-实现门户首页的幻灯片展示 | |
| 111 项目实战-MyShop-实现门户登录-实现 API | |
| 112 项目实战-MyShop-实现门户登录-对接 API | |
| 113 项目实战-MyShop-实现门户登录-使用拦截器禁止重复登录 | |
| 114 小知识-验证码的作用与如何打码 | |
| 115 项目实战-MyShop-解决 Maven 无法下载依赖的问题 | |
| 116 项目实战-MyShop-实现门户登录-增加 Kaptcha 验证 | |
| 117 项目实战-MyShop-使用 Apache Commons Em | |
| 118 课程完结-阶段总结,撒花,撒花,可喜可贺,可喜可贺 | |
================================================
FILE: course/Java 架构师成长之路/02 Java 微服务架构.md
================================================
## Java 微服务架构
| 章节 | 记录 |
| ----------------------------------------------------- | ---- |
| 1 关于博客改版的一些说明 | |
| 2 第01章-微服务简介-构建单体应用模型 | |
| 3 第01章-微服务简介-走向单体地狱 | |
| 4 第01章-微服务简介-微服务解决复杂问题 | |
| 5 第01章-微服务简介-微服务的优点 | |
| 6 第01章-微服务简介-微服务的缺点 | |
| | |
| 7 第02章-基础设施即服务-Linux-简介 | |
| 8 第02章-基础设施即服务-Linux-关于操作系统的选型 | |
| 9 第02章-基础设施即服务-Linux-安装 Ubuntu Serve | |
| 10 第02章-基础设施即服务-Linux-服务器远程控制 | |
| 11 第02章-基础设施即服务-Linux-目录结构说明 | |
| 12 第02章-基础设施即服务-Linux-操作文件目录命令 | |
| 13 第02章-基础设施即服务-Linux-系统管理命令 | |
| 14 第02章-基础设施即服务-Linux-重启与压缩命令 | |
| 15 第02章-基础设施即服务-Linux-编辑器的使用 | |
| 16 第02章-基础设施即服务-Linux-软件的安装与卸载 | |
| 17 第02章-基础设施即服务-Linux-用户和组管理 | |
| 18 第02章-基础设施即服务-Linux-文件权限管理 | |
| 19 第02章-基础设施即服务-Linux-安装 Java | |
| 20 第02章-基础设施即服务-Linux-安装 Tomcat | |
| 21 第02章-基础设施即服务-Linux-安装 MySQL | |
| 22 第02章-基础设施即服务-Linux-部署应用到生成环境 | |
| 23 第02章-基础设施即服务-Docker-什么是 Docker | |
| 24 第02章-基础设施即服务-Docker-为什么要用 Docker | |
| 25 第02章-基础设施即服务-Docker-引擎 | |
| 26 第02章-基础设施即服务-Docker-架构 | |
| 27 第02章-基础设施即服务-Docker-镜像与容器 | |
| 28 第02章-基础设施即服务-Docker-仓库 | |
| 29 第02章-基础设施即服务-Docker-安装 | |
| 30 第02章-基础设施即服务-Docker-加速器 | |
| 31 第02章-基础设施即服务-Docker-镜像-获取镜像 | |
| 32 第02章-基础设施即服务-Docker-镜像-列出镜像 | |
| 33 第02章-基础设施即服务-Docker-镜像-删除镜像 | |
| 34 第02章-基础设施即服务-Docker-镜像-Dockerfile | |
| 35 第02章-基础设施即服务-Docker-镜像-Dockerfile | |
| 36 第02章-基础设施即服务-Docker-镜像-Dockerfile | |
| 37 第02章-基础设施即服务-Docker-镜像-Dockerfile | |
| 38 第02章-基础设施即服务-Docker-镜像-Dockerfile | |
| 39 第02章-基础设施即服务-Docker-守护态运行容器 | |
| 40 第02章-基础设施即服务-Docker-容器数据持久化 | |
| 41 第02章-基础设施即服务-Docker-部署数据库 | |
| 42 第02章-基础设施即服务-Docker-部署项目到容器 | |
| 43 第02章-基础设施即服务-Docker Compose-简介与安装 | |
| 44 第02章-基础设施即服务-Docker Compose-基本使用 | |
| 45 第02章-基础设施即服务-Docker Compose-部署项目到 | |
| 46 第02章-基础设施即服务-Docker Compose-YAML | |
| | |
| 47 第03章-平台即服务-GitLab-使用 Git 托管代码 | |
| 48 第03章-平台即服务-GitLab-简介与安装 | |
| 49 第03章-平台即服务-GitLab-基本设置 | |
| 50 第03章-平台即服务-GitLab-第一个托管项目 | |
| 51 第03章-平台即服务-GitLab-使用 SSH 免密登录 | |
| 52 第03章-平台即服务-Nexus-简介与安装 | |
| 53 第03章-平台即服务-Nexus-在项目中使用 Maven 私服 | |
| 54 第03章-平台即服务-Registry-简介与安装 | |
| 55 第03章-平台即服务-Registry-配置 WebUI 与客户端 | |
| 56 Docker-真正实现:一次构建,到处运行 | |
| | |
| 57 第04章-再谈微服务-传统架构与微服务架构的区别 | |
| 58 第04章-再谈微服务-微服务的特征 | |
| 59 第04章-再谈微服务-微服务的实践1 | |
| 60 第04章-再谈微服务-微服务的实践2 | |
| 61 小知识-单点故障与分布式锁 | |
| 62 第04章-再谈微服务-微服务架构设计模式 | |
| | |
| 63 第05章-微服务框架-SpringBoot-简史 | |
| 64 第05章-微服务框架-SpringBoot-简介 | |
| 65 第05章-微服务框架-SpringBoot-优缺点 | |
| 66 第05章-微服务框架-SpringBoot-第一个应用程序 | |
| 67 第05章-微服务框架-SpringBoot-单元测试 | |
| 68 第05章-微服务框架-SpringBoot-常用配置 | |
| 69 第05章-微服务框架-SpringBoot-Thymeleaf-简 | |
| 70 第05章-微服务框架-SpringBoot-Thymeleaf-为 | |
| 71 第05章-微服务框架-SpringBoot-Thymeleaf-第 | |
| 72 第05章-微服务框架-SpringBoot-MyBatis-整合 | |
| 73 第05章-微服务框架-SpringBoot-MyBatis-测试 | |
| 74 第05章-微服务框架-SpringCloud-简介 | |
| 75 第05章-微服务框架-SpringCloud-创建统一的依赖管理 | |
| 76 第05章-微服务框架-SpringCloud-服务注册与发现 | |
| 77 第05章-微服务框架-SpringCloud-创建服务提供者 | |
| 78 第05章-微服务框架-SpringCloud-创建服务消费者(Ri | |
| 79 第05章-微服务框架-SpringCloud-创建服务消费者(Fe | |
| 80 第05章-微服务框架-SpringCloud-使用熔断器防止服务雪 | |
| 81 第05章-微服务框架-SpringCloud-使用熔断器仪表盘监控 | |
| 82 第05章-微服务框架-SpringCloud-使用路由网关统一访问 | |
| 83 第05章-微服务框架-SpringCloud-使用路由网关的服务过 | |
| 84 第05章-微服务框架-SpringCloud-分布式配置中心-服务 | |
| 85 第05章-微服务框架-SpringCloud-分布式配置中心-客户 | |
| 86 第05章-微服务框架-SpringCloud-服务链路追踪 | |
| 87 第05章-微服务框架-SpringCloud-服务监控-服务端 | |
| 88 第05章-微服务框架-SpringCloud-服务监控-客户端 | |
================================================
FILE: course/Java 架构师成长之路/03 Java 微服务实战.md
================================================
## Java 微服务实战
| 章节 | 记录 |
| ------------------------------------------- | ---- |
| 1 开篇-倾力打造互联网 Java 全栈工程师 | |
| 2 白皮书 | |
| 3 项目简介 | |
| 4 开发前的准备-了解敏捷开发 | |
| 5 开发前的准备-了解 XP 极限编程 | |
| 6 开发前的准备-创建 GitLab 项目组 | |
| 7 开发前的准备-完善各服务配置 | |
| 8 开发前的准备-部署服务到容器1 | |
| 9 开发前的准备-部署服务到容器2 | |
| 10 部署持续集成-持续集成的基本概念 | |
| 11 部署持续集成-持续集成的操作流程 | |
| 12 部署持续集成-使用 GitLab 持续集成 | |
| 13 部署持续集成-使用 GitLab Runn | |
| 14 部署持续集成-使用 GitLab Runn | |
| 15 部署持续集成-第一个 GitLab Run | |
| 16 部署持续集成-实战分布式配置中心 | |
| 17 部署持续集成-实战服务注册与发现 | |
| 18 管理员服务-提供者1 | |
| 19 管理员服务-提供者2 | |
| 20 管理员服务-提供者3 | |
| 21 管理员服务-消费者 | |
| 22 反向代理负载均衡-Nginx 简介 | |
| 23 反向代理负载均衡-Nginx 虚拟主机 | |
| 24 小知识-Nginx 惊群问题 | |
| 25 反向代理负载均衡-Nginx 反向代理 | |
| 26 反向代理负载均衡-Nginx 负载均衡 | |
| 27 反向代理负载均衡-Nginx 搭建伪 CD | |
| 28 数据缓存服务-Redis 简介 | |
| 29 数据缓存服务-Redis 高可用方案 | |
| 30 数据缓存服务-Redis Sentinel | |
| 31 数据缓存服务-提供者 | |
| 32 单点登录服务-单点登录系统机制 | |
| 33 单点登录服务-多系统登录的复杂性 | |
| 34 单点登录服务-单点登录系统流程 | |
| 35 单点登录服务-实战单点登录1 | |
| 36 单点登录服务-实战单点登录2 | |
| 37 单点登录服务-实战单点登录3 | |
| 38 单点登录服务-实战单点登录4 | |
| 39 单点登录服务-实战单点登录5 | |
| 40 单点登录服务-使用 Nginx 反向代理解 | |
| 41 单点登录服务-实战单点登录完结篇 | |
| 42 进入下半场的准备工作 | |
| 43 番外篇-重构改善既有代码的设计-数据库 | |
| 44 番外篇-重构改善既有代码的设计-领域模型 | |
| 45 番外篇-重构改善既有代码的设计-业务逻辑层 | |
| 46 番外篇-重构改善既有代码的设计-管理员服务 | |
| 47 番外篇-重构改善既有代码的设计-管理员分页 | |
| 48 文章服务-提供者 | |
| 49 文章服务-配置 MyBatis Redis | |
| 50 文章服务-配置 Swagger2 接口文档 | |
| 51 文章服务-消费者 | |
| 52 文章服务-消费者-分页功能 | |
| 53 文章服务-消费者-提取 Thymeleaf | |
| 54 文章服务-消费者-保存功能 | |
| 55 文件上传服务-FastDFS | |
| 56 文件上传服务-提供者 | |
| 57 文章服务-消费者-文件上传功能 | |
| 58 后台服务聚合-页面拆分1 | |
| 59 后台服务聚合-页面拆分2 | |
| 60 后台服务聚合-页面聚合1 | |
| 61 后台服务聚合-页面聚合2 | |
| 62 数字货币服务-前言 | |
| 63 消息队列-消息队列的流派 | |
| 64 消息队列-Actor 模型 | |
| 65 消息队列-RabbitMQ 简介 | |
| 66 消息队列-RabbitMQ 安装 | |
| 67 消息队列-RabbitMQ 使用 | |
| 68 任务调度-Quartz | |
================================================
FILE: course/Java 架构师成长之路/04 Java 微服务架构 Dubbo 篇.md
================================================
## Java 微服务架构 Dubbo 篇
| 章节 | 记录 |
| --------------------------------------------------- | ---- |
| 01 实现微服务架构-课程回顾-微服务架构需要解决的问题 | |
| 02 实现微服务架构-Zookeeper-什么是分布式协调服务 | |
| 03 实现微服务架构-Zookeeper-什么是分布式锁1 | |
| 04 实现微服务架构-Zookeeper-什么是分布式锁2 | |
| 05 实现微服务架构-Zookeeper-什么是分布式锁3 | |
| 06 实现微服务架构-Zookeeper-服务注册与发现 | |
| 07 实现微服务架构-Zookeeper-集群崩溃恢复1 | |
| 08 实现微服务架构-Zookeeper-集群崩溃恢复2 | |
| 09 实现微服务架构-Zookeeper-集群数据同步 | |
| 10 实现微服务架构-Zookeeper-如何实现分布式锁 | |
| 11 实现微服务架构-Zookeeper-基于 Docker | |
| 12 实现微服务架构-Zookeeper-配置说明 | |
| | |
| 13 实现微服务架构-Dubbo-简介1 | |
| 14 实现微服务架构-Dubbo-简介2 | |
| 15 实现微服务架构-Dubbo-服务治理 | |
| 16 实现微服务架构-Dubbo-核心功能与组件角色 | |
| 17 实现微服务架构-Dubbo-管理控制台 | |
| 18 实现微服务架构-Dubbo-服务提供者 | |
| 19 实现微服务架构-Dubbo-服务消费者 | |
| 20 实现微服务架构-Dubbo-负载均衡 | |
| 21 实现微服务架构-Dubbo-使用 Kryo 实现高速序 | |
| 22 实现微服务架构-Dubbo-使用 Hystrix 实现 | |
| 23 实现微服务架构-Dubbo-使用 Hystrix 熔断 | |
| 24 实现微服务架构-Dubbo-系统架构的演进 | |
| | |
| 25 实现微服务架构-项目实战-搭建通用模块项目 | |
| 26 实现微服务架构-项目实战-搭建用户管理服务 | |
| | |
| 27 实现微服务架构-持续集成-GitLab Runner | |
| 28 实现微服务架构-持续集成-实战服务提供者 | |
| 29 实现微服务架构-持续集成-实战服务消费者 | |
| | |
| 30 实现微服务架构-持续交付-基于 Docker 安装 J | |
| 31 实现微服务架构-持续交付-配置 Jenkins | |
| 32 实现微服务架构-持续交付-创建第一个任务 | |
| 33 实现微服务架构-持续交付-实战服务提供者 | |
| | |
| 34 实现微服务架构-用户管理服务-Metronic 模板介 | |
| 35 实现微服务架构-用户管理服务-实现基本布局 | |
| 36 实现微服务架构-用户管理服务-PageHelper分页 | |
| 37 实现微服务架构-用户管理服务-PageHelper分页 | |
| | |
| 38 实现微服务架构-内容管理服务-实现基本功能 | |
| | |
| 39 实现微服务架构-服务聚合-API 网关1 | |
| 40 实现微服务架构-服务聚合-API 网关2 | |
| | |
| 41 实现微服务架构-分布式文件系统-什么是 FastDFS | |
| 42 实现微服务架构-分布式文件系统-基于 Docker 安 | |
| 43 实现微服务架构-分布式文件系统-FastDFS Jav | |
| | |
| 44 实现微服务架构-使用 Nginx 解决跨域问题-跨域现 | |
| 45 实现微服务架构-使用 Nginx 解决跨域问题-Ngi | |
| 46 实现微服务架构-使用 Nginx 解决跨域问题-Ngi | |
| 47 实现微服务架构-使用 Nginx 解决跨域问题-Ngi | |
| 48 实现微服务架构-使用 Nginx 解决跨域问题-Ngi | |
| 49 实现微服务架构-使用 Nginx 解决跨域问题-COR | |
| 50 实现微服务架构-使用 Nginx 解决跨域问题-假请求 | |
| | |
| 51 实现微服务架构-使用 Redis 实现数据缓存-创建缓 | |
| 52 实现微服务架构-使用 Redis 实现数据缓存-MyB | |
| | |
| 53 实现微服务架构-使用 Solr 实现全文检索-Solr | |
| 54 实现微服务架构-使用 Solr 实现全文检索-搜索引擎 | |
| 55 实现微服务架构-使用 Solr 实现全文检索-基于 D | |
| 56 实现微服务架构-使用 Solr 实现全文检索-Solr | |
| 57 实现微服务架构-使用 Solr 实现全文检索-Spri | |
================================================
FILE: course/LEARN.md
================================================
## PART2:学习记录
★2018年6月-7月学习计划
【慕课网】玩转数据结构 从入门到进阶
【慕课网】程序员的内功修炼,学好算法与数据结构
【慕课网】玩转算法面试 leetcode题库分门别类详细解析
【慕课网】HTTP协议原理+实践 Web开发工程师必学
【慕课网】Java并发编程与高并发解决方案
### 学习课程(精简版)
以下清单是需要学习的课程
| 专题 | 类型 | 课程 | 进展 |
| --------- | ------------------ | ------------------------------------------------------------ | :-------------: |
| **专题1** | **数据结构与算法** | | |
| | | :gem:【慕课网】程序员的内功修炼,学好算法与数据结构 | |
| | | :gem:【慕课网】玩转算法面试 leetcode题库分门别类详细解析 | |
| | | :gem:【慕课网】玩转数据结构 从入门到进阶 | |
| | | 【牛客网】算法高频题目精讲 | |
| | | 【牛客网】直通BAT — 求职算法精品课 | |
| **专题2** | **后端技术栈** | | |
| | 00 Web基础 | | |
| | | 【表严肃】讲正则表达式 | 完成 |
| | 01 Java | | |
| | | 【翁凯】Java基础 | 完成 |
| | | 【慕课网】Java零基础入门 | |
| | | :gem:【极客学院】极客学院23种设计模式 | |
| | | :gem:【炼数成金】深入JVM内核—原理、诊断与优化 | |
| | | :gem:【炼数成金】实战Java高并发程序设计 | |
| | | 【慕课网】Java并发编程与高并发解决方案 | **🚴** |
| | | 【慕课网】Google面试官亲授 升级Java面试 | |
| | | 【慕课网】Java读源码之Netty深入剖析 | 有时间回来学习 |
| | | 【慕课在线】Netty入门之WebSocket初体验 \| [慕课网](https://www.imooc.com/learn/941) | |
| | 02 Java web | | |
| | | [【慕课网在线】Spring Boot热部署](https://www.imooc.com/learn/915) \| [参考文档](https://www.cnblogs.com/magicalSam/p/7196355.html) | 进行中 |
| | | 【慕课网】ZooKeeper分布式专题与Dubbo微服务入门 | |
| | | :gem:【慕课网】Spring Cloud微服务实战_廖师兄 | |
| | | :gem:【慕课网】Spring Boot企业微信点餐系统 | 完成 |
| | | 【神马小风】Spring MVC4入门 | 完成 |
| | | ~~【极客学院】JavaWeb工程师(全套)~~ \| 部分可以学习 | |
| | | 神码小风:SpringMVC4从入门到实战视频教程 \| [腾讯课堂](https://ke.qq.com/course/263024) | 完成 |
| | 03 Web Server | | |
| | | :gem:【慕课网】Nginx从入门到实践 | |
| | 04 Linux | | |
| | | 【慕课网】大数据的Linux基础 | |
| | | 【慕课网】快速上手Linux 玩转典型应用 | |
| | | 【莫烦】Linux 简易教学 | |
| | | 【慕课网在线】[Crontab不知疲倦的时间表](https://www.imooc.com/learn/1009) | |
| | 05 网络 | | |
| | | **:gem:【慕课网】HTTP协议原理+实践 Web开发工程师必学** | **:bicyclist:** |
| | 06 数据库 | | |
| | | 【慕课网】MySQL性能管理及架构设计 | |
| | | 【慕课网】Redis从入门到高可用,分布式实践 | |
| | 07 Git | | |
| | | 【表严肃】讲Git | 完成 |
| | | 【莫烦】01 Git 版本管理 | |
| | 08 docker | | |
| | | :gem:【慕课网】系统学习Docker 践行DevOps理念 | |
| | | 【慕课网】Docker环境下的前后端分离项目部署与运维 | |
| **专题3** | **机器学习** | | |
| | | :gem:【慕课网—刘宇波】Python3入门机器学习 经典算法与应用 | |
| | | ~~【慕课网】机器学习入门 Scikit-learn实现经典小案例~~ | |
| | | ~~【慕课网】基于Python玩转人工智能最火框架 TensorFlow应用实践~~ | |
| **专题4** | **Python** | | |
| | | ~~【慕课网】Python3入门与进阶~~ | |
| | | ~~【莫烦】Python+机器学习系列~~ | |
| | | 【慕课网】Python Flask构建可扩展的RESTful API | |
| | | | |
| **专题5** | **PHP** | | |
| | | 【慕课网】360大牛全面解读PHP面试 | 完成 |
| | | 【网易云课堂】thinkphp5开发restful-api接口 | 完成 |
| **专题6** | 工具篇 | | |
| | | [【慕课网在线】IntelliJ IDEA神器使用技巧](https://www.imooc.com/learn/924) | 完成 |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
### 学习图书(精简版)
以下是需要学习的清单
| 编号 | 类型 | 图书 | 进展 |
| ---- | ----------------- | ----------------------------------- | ---- |
| 1 | 面试宝典 | **:gem:《Java程序员面试笔试宝典》** | |
| 2 | 面试宝典 | 《程序员代码面试指南》结合Leetcode | |
| 3 | Java | **《Java并发编程实战》** | |
| 4 | Java | 《深入理解Java虚拟机》 | |
| 5 | Java(设计模式) | **《设计模式之禅》** | |
| 6 | Java Web | 《Spring实战》 | |
| 7 | Java Web | 《深入分析Java Web技术内幕》 | |
| 8 | 数据库 | 《高性能MySQL》 | |
| 9 | 计算机网络 | **《图解HTTP》** | |
| 10 | 数据结构与算法 | 《计算机考研——机试指南》 | |
| 11 | 数据结构与算法 | 《数据结构高分笔记》 | |
| 12 | 操作系统(Linux) | 《快乐的Linux命令行(书)》 | |
深入理解计算机系统
自顶向下计算机网络
Nginx阿里巴巴文档
### 课程与图书总览
以下是所有待学习图书,仅作为全文预览检索
详情转向 [course/LEARN_FULL.md](LEARN_FULL.md)
================================================
FILE: course/LEARNLIST.md
================================================
# 阅读清单与学习课程
在这部分,我将对阅读书籍和学习课程进程推荐,在课程中我将附带官网链接,图书则附京东的链接。
正在整理,未完待续
## 一、数据结构与算法
包含数据结构与算法两部分。
### :books:阅读清单
- [《算法4》](https://item.jd.com/11098789.html)
- [《剑指Offer》](https://item.jd.com/12163054.html)
- [《程序员面试指南》](https://item.jd.com/11770838.html)
### :tv:学习课程
- [【慕课网】刘宇波:玩转数据结构,从入门到进阶](https://coding.imooc.com/class/207.html)
- [【慕课网】刘宇波:程序员的内功修炼,学好算法与数据结构](https://coding.imooc.com/class/71.html)
- [【慕课网】刘宇波:玩转算法面试 leetcode题库分门别类详细解析](https://coding.imooc.com/class/82.html)
## 二、Java
包含 Java 核心知识和 Java Web 框架。
### :books:阅读清单
- [《Java并发编程实战》](https://item.jd.com/10922250.html)
-
- [《深入分析Java Web技术内幕》](https://item.jd.com/11520670.html)
- 《阿里巴巴Java开发手册》
- 《Java程序员面试笔试宝典》
- 《Java网络编程》
- 《Spring实战》
- [《Spring MVC+MyBatis开发从入门到项目实战》](https://item.jd.com/12308496.html)
- 《深入理解Java虚拟机》
- 《Java核心技术 卷Ⅰ / Ⅱ》
### :tv:学习课程
- 【廖雪峰】Java教程
- 【龙果学院】Java并发编程原理与实战
- 【龙果学院】深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)
- 【慕课网】Java零基础入门
- 【尚学堂】白鹤翔_jvm虚拟机优化
- 【网易云课堂】Java开发工程师(Web方向)翁凯
- 【慕课网】Spring Cloud微服务实战_廖师兄
- 【黑马程序员】SSH框架_王泽
- 【黑马程序员】SpringMVC+Mybatis
- 【牛客网】初中高Python+Java项目实战_叶神
## 三、Web Server
- 【网易云课堂】thinkphp5开发restful-api接口
## 四、面向对象
- [《设计模式之禅》](https://item.jd.com/11414555.html)
- 【极客学院】极客学院23种设计模式
## 五、数据库
### :books:阅读清单
- 《高性能MySQL》
- 《Redis实战》
### :tv:学习课程
- 【慕课网】MySQL性能管理及架构设计
- 【慕课网】Redis从入门到高可用,分布式实践
## 六、操作系统
### :books:阅读清单
- 《Linux+C程序设计大全》
- 《快乐的Linux命令行》
- 《深入理解计算机系统》
### :tv:学习课程
- [【慕课网】快速上手Linux 玩转典型应用](https://coding.imooc.com/class/154.html)
- [【慕课在线】Linux达人养成计划 I-Linux的入门级课程!](https://www.imooc.com/learn/175)
- [【慕课在线】Linux 达人养成计划 II VIM+磁盘管理+用户权限!](https://www.imooc.com/learn/111)
- 【小甲鱼】零基础入门学习汇编语言
- 操作系统_清华大学(向勇、陈渝)
## 七、计算机网络
### :books:阅读清单
- 《图解HTTP》
- 《计算机网络原理创新教程》韩立刚主编
### :tv:学习课程
- 【51CTO】韩老师-计算机网络原理-156讲
- 【慕课网】HTTP协议原理+实践 Web开发工程师必学
## 八、系统架构
### :books:阅读清单
### :tv:学习课程
- 【慕课网】Nginx从入门到实践
- 【咕泡学院】架构师系列课程
## 九、面试
- 【慕课网】360大牛全面解读PHP面试
- 【慕课网】Google面试官亲授 升级Java面试
## 十、机器学习
### :books:阅读清单
- 《机器学习实战》
### :tv:学习课程
- 【慕课网】Python3入门机器学习 经典算法与应用
- 【莫烦Python】机器学习系列
## 十一、工具
### :tv:学习课程
- 【表严肃】讲正则表达式
- 【表严肃】讲Git
- 【慕课网】系统学习Docker 践行DevOps理念
- [【慕课在线】IntelliJ IDEA神器使用技巧](https://www.imooc.com/learn/924)
================================================
FILE: course/LEARN_FULL.md
================================================
## PART2:学习总览
### 学习课程总览
| 专题 | 类型 | 课程 | 进展 |
| --------- | :----------------- | ------------------------------------------------------------ | ---- |
| **专题1** | **数据结构与算法** | | |
| | | 【慕课网】程序员的内功修炼,学好算法与数据结构 | |
| | | 【慕课网】玩转算法面试 leetcode题库分门别类详细解析 | |
| | | 【慕课网】玩转数据结构 | |
| | | 【牛客网】算法高频题目精讲 | |
| | | 【牛客网】直通BAT — 求职算法精品课 | |
| | | 【小甲鱼】数据结构与算法 | |
| | | 【慕课网】看得见的算法 7个经典应用诠释算法精髓 | |
| **专题2** | **后端技术栈** | | |
| | 00 Web基础 | | |
| | | 【表严肃】讲正则表达式 | |
| | 01 Java | | |
| | | 【翁凯】Java基础 | |
| | | 【慕课网】Java零基础入门 | |
| | | 【极客学院】极客学院23种设计模式 | |
| | | 【炼数成金】深入JVM内核—原理、诊断与优化 | |
| | | 【炼数成金】实战Java高并发程序设计 | |
| | | 【龙果学院】深入理解Java虚拟机 | |
| | | 【慕课网】Google面试官亲授 升级Java面试 | |
| | 02 Java web | | |
| | | 【慕课网】ZooKeeper分布式专题与Dubbo微服务入门 | |
| | | 【慕课网】Spring Cloud微服务实战_廖师兄 | |
| | | 【慕课网】Spring Boot企业微信点餐系统 | |
| | | 【慕课网】Java秒杀系统方案优化 高性能高并发实战 | |
| | | 【慕课网】IT段子手详解MyBatis遇到Spring 秒学Java SSM开发大众点评 | |
| | | 【慕课网】Docker+Kubernetes(k8s)微服务容器化实践 | |
| | | 【极客学院】JavaWeb工程师(全套) | |
| | | ~~【传智播客】Springmvc+Mybatis由浅入深全套视频教程~~ | |
| | | ~~【传智播客】孔浩Java课程~~ | |
| | | ~~【慕课网】Java Spring带前后端开发完整电商平台~~ | |
| | | ~~【慕课网】Java从零到企业级电商项目实战~~ | |
| | | ~~【慕课网】Spring Boot企业级博客系统实战视频教程~~ | |
| | 03 Web Server | | |
| | | 【慕课网】Nginx从入门到实践 | |
| | 04 Linux | | |
| | | 【慕课网】大数据的Linux基础 | |
| | | 【慕课网】快速上手Linux 玩转典型应用 | |
| | | 【莫烦】Linux 简易教学 | |
| | 05 网络 | | |
| | | 【慕课网】HTTP协议原理+实践 Web开发工程师必学 | |
| | 06 数据库 | | |
| | | 【慕课网】MySQL性能管理及架构设计 | |
| | | 【慕课网】Redis从入门到高可用,分布式实践 | |
| | 07 Git | | |
| | | 【表严肃】讲Git | |
| | | 【莫烦】01 Git 版本管理 | |
| | 08 docker | | |
| | | 【极客学院】docker | |
| | | 【慕课网】系统学习Docker 践行DevOps理念 | |
| **专题3** | **机器学习** | | |
| | | 【麦子学院】机器学习系列 × 3 | |
| | | 【慕课网】机器学习入门 Scikit-learn实现经典小案例 | |
| | | 【慕课网】基于Python玩转人工智能最火框架 TensorFlow应用实践 | |
| | | 【慕课网—刘宇波】Python3入门机器学习 经典算法与应用 | |
| | | 【斯坦福】Andrew Ng机器学习 | |
| **专题4** | **Python** | | |
| | | 【慕课网】Python3入门与进阶 | |
| | | 【慕课网】2017 Vue+Django API前后端分离开发电商新技术跨域项目实战 | |
| | | 【慕课网】Python高级编程和异步IO并发编程 | |
| | | 【慕课网】Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台 | |
| | | 【慕课网】Vue+Django REST framework 打造生鲜电商项目 | |
| | | 【莫烦】Python+机器学习系列 | |
| **专题5** | **PHP** | | |
| | | 【慕课网】360大牛全面解读PHP面试 | |
| | | 【慕课网】PHP接口开发 | |
| | | 【网易云课堂】thinkphp5开发restful-api接口 | |
### 学习书籍总览
以下是所有待学习图书,仅作为全文预览检索
| 类型 | 图书 | 进展 |
| ----------------- | -------------------------------------------- | ---- |
| 面试宝典 | 《Java程序员面试笔试宝典》 | |
| 面试宝典 | 《程序员代码面试指南》 | |
| 面试宝典 | ~~《剑指Offer》~~ | |
| 面试宝典 | ~~《技术之瞳》~~ | |
| 面试宝典 | 《Java程序员面试面试笔试真题与解析》 | |
| Java | 《Java并发编程实战》 | |
| Java | 《深入理解Java虚拟机》 | |
| Java | ~~《Java核心技术 卷Ⅰ / Ⅱ》~~ | |
| Java(设计模式) | 《设计模式之禅》 | |
| Java Web | 《Spring实战》 | |
| Java Web | 《深入分析Java Web技术内幕》 | |
| 数据库 | 《高性能MySQL》 | |
| 计算机网络 | 《图解HTTP》 | |
| 数据结构与算法 | 《计算机考研——机试指南》 | |
| 数据结构与算法 | 《数据结构高分笔记》 | |
| 操作系统(Linux) | 《快乐的Linux命令行(书)》 | |
| 操作系统 | ~~《操作系统高分笔记》~~ | |
| 机器学习 | ~~《机器学习实战》~~ | |
| 机器学习 | ~~《终极算法》~~ | |
| 机器学习 | ~~《机器学习在线——解析阿里云机器学习平台》~~ | |
| 计算机视觉 | ~~《OpenCV3编程入门》~~ | |
| 阿里丛书 | ~~《尽在双十一》~~ | |
================================================
FILE: course/LEARN_RECORD.md
================================================
## PART2:学习记录
### 已完成的课程
| 课程 | 进展 |
| ------------------------------------------------------------ | --------------- |
| [SpringBoot+MyBatis搭建迷你小程序教程](https://www.imooc.com/learn/945) | 2018/05/06 完成 |
| [IntelliJ IDEA神器使用技巧](https://www.imooc.com/learn/924) | 2018/05/14 完成 |
| [表严肃讲正则表达式](http://biaoyansu.com/28.x) | 2018/06/05 完成 |
| [表严肃讲Git](http://biaoyansu.com/27.x) | 2018/06/05 完成 |
| [第一个docker化的java应用](https://www.imooc.com/learn/824) | 2018/06/06 完成 |
### 学习课程
| 课程 | 进展 |
| ------------------------------------------------------------ | ---------------------------- |
| ★★★刘宇波:玩转数据结构 \| [代码仓库](https://github.com/liuyubobobo/Play-with-Algorithms) \| [学习笔记](course\01 玩转数据结构.md ) | 2018/05/06 学习至 第三章
|
| ★刘宇波:玩转算法面试 \| [学习笔记](course/02 玩转算法面试.md) | 计划学习 |
| ★刘宇波:程序员的内功修炼 | 计划学习 |
| ★★★廖师兄:[Spring Boot企业微信点餐系统](https://coding.imooc.com/class/117.html) \| [学习笔记](course\03 SpringBoot微信点餐.md ) | 2018/05/06 学习至 第五章 |
| [微信授权登录](https://www.imooc.com/learn/713) | |
| [PHP第三方登录—OAuth2.0协议](https://www.imooc.com/learn/557) | |
| | |
| Redis从入门到高可用,分布式实践 \| [慕课网](https://coding.imooc.com/class/151.html) | 计划学习 |
| ZooKeeper分布式专题与Dubbo微服务入门 \| [慕课网](https://coding.imooc.com/class/201.html) | 计划学习 |
| | |
| [Redis入门](https://www.imooc.com/learn/839) | 计划学习 |
| | |
| HTTP协议原理+实践 Web开发工程师必学 | 正在学习 |
| ★Nginx入门到实践 \| [慕课网](https://coding.imooc.com/class/evaluation/121.html#Anchor) \| [学习笔记](course\04 Nginx从入门到实战.md) | 正在学习 |
| 系统学习Docker 践行DevOps理念 | 正在学习 |
================================================
FILE: notes/DeepLearning/README.md
================================================
深度学习板块
================================================
FILE: notes/DeepLearning/assets/README.md
================================================
深度学习板块-图片文件夹
================================================
FILE: notes/DeepLearning/深度学习入门课程.md
================================================
## 入门课程
> 简介:本课程首先介绍机器学习与深度学习,包括机器学习的应用、岗位职责,深度学习的等。然后通过讲解神经元及其衍生模型逻辑斯底回归、目标函数、梯度下降等深度学习基础知识。最后通过Tensorflow来实现课程讲解的模型。
深度学习之神经网络入门最佳路径
https://www.imooc.com/learn/1063
深度学习-初识 - Corwien - SegmentFault 思否
https://segmentfault.com/a/1190000016068053
## 从入门到实战
实战课已经上线:https://coding.imooc.com/class/259.html
================================================
FILE: notes/DeepLearning/深度学习初识.md
================================================
- [深度学习初识](#深度学习初识)
- [一、入门基本概念](#一入门基本概念)
- [机器学习简介](#机器学习简介)
- [机器学习应用举例](#机器学习应用举例)
- [机器学习应用流程](#机器学习应用流程)
- [机器学习岗位职责](#机器学习岗位职责)
- [深度学习简介](#深度学习简介)
- [深度学习与机器学习关系](#深度学习与机器学习关系)
- [深度学习算法集合](#深度学习算法集合)
- [深度学习进展](#深度学习进展)
- [二、神经网络](#二神经网络)
- [人体神经元模型](#人体神经元模型)
- [人工神经网络](#人工神经网络)
- [1. 神经元](#1-神经元)
- [2. 逻辑回归模型](#2-逻辑回归模型)
- [目标函数](#目标函数)
- [梯度下降](#梯度下降)
- [三、Tensorflow基础](#三tensorflow基础)
- [Tensorflow简介](#tensorflow简介)
- [计算图模型](#计算图模型)
- [TensorFlow 安装](#tensorflow-安装)
- [参考资料](#参考资料)
# 深度学习初识
## 一、入门基本概念
### 机器学习简介
**机器学习**:无序数据转化为价值的方法
**机器学习价值**:从数据中抽取规律,并预测未来
#### 机器学习应用举例
- 分类问题:图像识别、垃圾邮件识别
- 回归问题:股价预测、房价预测
- 排序问题:点击率预估、推荐
- 生成问题:图像生成、图像风格转换、图像文字描述生成
#### 机器学习应用流程

#### 机器学习岗位职责
- 数据处理(采集+去噪)
- 模型训练(特征+模型)
- 模型评估与优化(MSE、F1-score、AUC+调参)
- 模型应用(A/B测试)
### 深度学习简介

人工智能、机器学习、深度学习之间的关系
```
人工智能(AI)> 机器学习(Machine Learning)> 深度学习(Deep learning)
```
#### 深度学习与机器学习关系
- 机器学习是实现人工智能的方法
- 深度学习是实现机器学习算法的技术
#### 深度学习算法集合
- **卷积神经网络**(Convolutional Neural Network, CNN)
- CV 领域使用较多
- **循环神经网络**(Recurrent Neural Networks,RNNs)
- NLP 领域使用较多
- 处理不定长数据
- 自动编码器
- 稀疏编码
- 深度信念网络
- 深度学习 + 强化学习 = **深度强化学习**
- AlphaGo
- AlphaZero
#### 深度学习进展
1. 图像分类
ImageNet: http://image-net.org/

2. 机器翻译

3. 图像生成



- [Implementing Neural Artistic Style Transfer | L2Program](http://l2program.co.uk/945/implementing-neural-artistic-style-transfer)
4. 字体生成
5. AlphaGo
## 二、神经网络
### 人体神经元模型
神经网络模型是模仿人类的大脑神经构造而构造的。先来看人体神经元模型。

神经元的可以分为四个区域:
- 接收区(receptive zone):树突接收到输入信息。
- 触发区(trigger zone):位于轴突和细胞体交接的地方,决定是否产生神经冲动。
- 传导区(conducting zone):由轴突进行神经冲动的传递。
- 输出区(output zone):神经冲动的目的就是要让神经末梢,突触的神经递质或电力释出,才能影响下一个接受的细胞(神经元、肌肉细胞或是腺体细胞),此称为突触传递。
### 人工神经网络
人工神经网络(ANN:Artificial Neural Network),简称神经网络(NN:Neural Network)。迄今为止,人工神经网络尚无统一定义, 其实一种模拟了人体神经元构成的数学模型,依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

上图显示了人工神经网络是一个分层模型,逻辑上可以分为三层:
- 输入层:输入层接收特征向量 x 。
- 输出层:输出层产出最终的预测 h 。
- 隐含层:隐含层介于输入层与输出层之间,之所以称之为隐含层,是因为当中产生的值并不像输入层使用的样本矩阵 X 或者输出层用到的标签矩阵 y 那样直接可见。
### 1. 神经元



### 2. 逻辑回归模型
```
神经元 -> 激活函数sigmoid -> 二元类逻辑斯蒂回归模型
```

神经元 -> 多输出
- W从向量扩展为矩阵
- 输出W*x则变成向量

多输出神经元 -> softmax -> 多分类逻辑斯蒂回归模型



### 目标函数
也称为损失函数,衡量对数据的拟合程度
### 梯度下降
- 下山算法
- 找方向
- 走一步
- 梯度下降算法

## 三、Tensorflow基础
### Tensorflow简介
Google Brain 第二代机器学习框架
### 计算图模型
- 命令式变成
- 声明式变成

## TensorFlow 安装
- [TensorFlow 官方文档](https://tensorflow.google.cn/)
- [TensorFlow 安装方法](https://tensorflow.google.cn/install)
1. 基于 VirtualEnv 的安装
2. 原生 pip
3. Docker
4. 从源代码安装
## 参考资料
- [机器学习入门(五) -- 神经网络](https://waltyou.github.io/Neural-Network/#%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%AE%9A%E4%B9%89)
- [深度学习-初识 - Corwien - SegmentFault 思否](https://segmentfault.com/a/1190000016068053)
================================================
FILE: notes/DistributedSystem/03 分布式通信-序列化.md
================================================
# java序列化机制Serialize接口
## java本身的序列化机制存在的问题
1. 序列化数据结果比较大、传输效率比较低
2. 不能跨语言对接
以至于在后来的很长一段时间,基于XML格式编码的对象序列化机制成为了主流,一方面解决了多语言兼容问题,另一方面比二进制的序列化方式更容易理解。以至于基于XML的SOAP协议及对应的WebService框架在很长一段时间内成为各个主流开发语言的必备的技术。
再到后来,基于JSON的简单文本格式编码的HTTP REST接口又基本上取代了复杂的Web Service接口,成为分布式架构中远程通信的首要选择。但是JSON序列化存储占用的空间大、性能低等问题,同时移动客户端应用需要更高效的传输数据来提升用户体验。在这种情况下与语言无关并且搞笑的二进制编码协议就成为了大家追求的热点技术之一。首先诞生的一个开源的二进制序列化框架-MessagePack。它比google的Protocol Buffers出现得还要早
恰当的序列化协议不仅可以提高系统的通用性、强壮型、安全性、优化性能。同时还能让系统更加易于调试和扩展
## 序列化和反序列化的概念
把对象转化为字节序列的过程称之为对象的序列化
反之,称之为反序列化
# 怎么去实现一个序列化操作
1. 实现Serializable接口
2. ObjectInputStream : 表示读取指定的字节数据转换成对象
3. ObjectOutputStream :
# 科普小知识
## serialVersionUID的作用
文件流中的class和classpath中的class,也就是修改过后的class,不兼容了,处于安全机制考虑,程序抛出了错误,并且拒绝载入。从错误结果来看,如果没有为指定的class配置serialVersionUID,那么java编译器会自动给这个class进行一个摘要算法,类似于指纹算法,只要这个文件有任何改动,得到的UID就会截然不同的,可以保证在这么多类中,这个编号是唯一的。所以,由于没有显指定 serialVersionUID,编译器又为我们生成了一个UID,当然和前面保存在文件中的那个不会一样了,于是就出现了2个序列化版本号不一致的错误。因此,只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。
## 静态变量的序列化
序列化并不保存静态变量的状态(例如序列号之前修改了静态变量,则会被序列化)。
## Transient关键字
transient关键字表示指定属性不参与序列化
## 父子类问题
如果父类没有实现序列化,而子类实现列序列化。那么父类中的成员没办法做序列化操作
## 序列化的存储规则
对同一个对象进行多次写入,打印出的第一次存储结果和第二次存储结果,只多了5个字节的引用关系。
并不会导致文件累加
# 序列化实现深度克隆
**浅拷贝(浅复制、浅克隆)**:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所拷贝的对象,而不复制它所引用的对象。
**深拷贝(深复制、深克隆)**:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。
那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。
换言之,深拷贝把要复制的对象所引用的对象都复制了一遍
# 总结
1. 在java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化
2. 通过ObjectOutputStream和ObjectInputStream对对象进行序列化合反序列化操作
3. 对象是否允许被反序列化,不仅仅是取决于对象的代码是否一致,同时还有一个重要的因素(UID)
4. 序列化不保存静态变量
5. 要想父类对象也参与序列化操作,那么必须要让父类也实现Serializable接口
6. Transient关键字,主要是控制变量是否能够被序列化。如果没有被序列化的成员变量反序列化后,会被设置成初始值,比如String -> null
7. 通过序列化操作实现深度克隆
# 主流的序列化技术有哪些
JSON/Hessian(2) /xml/protobuf/kryo/MsgPack/FST/thrift/protostuff/Avro
================================================
FILE: notes/DistributedSystem/04 分布式通信协议-http.md
================================================
# HTTP协议的概述
1. 客户端和服务器端

2. 资源
html/文本、word、avi电影、其他资源
3. 媒体类型
MIME类型(*MIME* (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。 *MIME*消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。 )
text/html
image/jpeg
4. URI和URL
URI:web服务器资源的名字,例如: index.html
URL:`http://www.gupaoedu.com:80/java/index.html[?query-string] #location`
schema: http/https/ftp.
host: web服务器的ip地址或者域名
port: 服务端端口, http默认访问的端口是80
path: 资源访问路径
query-string: 查询参数
5. 方法
GET/PUT/DELETE/POST/HEAD
HEAD:主要用于确认 URL 的有效性以及资源更新的日期时间等。
###
# 报文
request参数、 response响应参数
request消息结构包含三部分: (起始行、首部字段、主体)
METHOD /path / http/version-number
Header-Name:value
空行
主体 optional request body

response
http/version-number status code message
header-name:value
body

# 状态码
http/1.1版本的协议里面定义了五种类型的状态码
1XX 提示信息
2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器端的错误
# 缓存
HTTP协议的特点
1. 无状态
cookie+session
2. 多次请求
3. 基于TCP协议
# HTTPS
SSL/TLS
目前最新:SSL 3.0
ISOC 在 SSL 的基础上发布了升级版本 TLS1.2(最新)
## HTTPS的工作原理

### 第一步, 使用对称加解密

### 第二步,密钥是公开的,所有的客户端都可以拿到

### 第三步 针对不同的客户端使用不同的密钥

问题:协商过程是没有加密的,所以还会出现被截断的问题
### 第四步:使用非对称加密
非对称:公钥和私钥的概念

问题: 客户端如何拿到公钥
1. 服务器端把公钥发送给每一个客户端
2. 服务器端把公钥放到远程服务器,客户端可以请求到
3. 让浏览器保存所有的公钥(不现实)
### 第五步 公钥被调包的问题按照上面的方案,永远存在。

### 第六步:使用第三方机构来解决
通过第三方机构,使用第三方机构的私钥对我们【需要传输的公钥】进行加密
第七部分
数字证里面包含的内容:
公司信息、网站信息、数字证书的算法(指纹)、公钥
连接过程

# RESTful
REST表述性状态转移
使用WEB标准来做一些准则和约束。
RESTful的基本概念
1. 在REST中,一切的内容都被认为是一种资源
2. 每个资源都由URI唯一标识
3. 使用统一的接口处理资源请求(POST/GET/PUT/DELETE/HEAD)
4. 无状态(每次请求之前是无关联,没有session)
## 资源和URI
1. [/]表示资源的层级关系
2. ?过滤资源
3. 使用_或者-让URI的可读性更好
## 统一接口
GET 获取某个资源。 幂等(取多少次结果都没有变化)
POST 创建一个新的资源
PUT 替换某个已有的资源(更新操作) , 幂等(更新多次只保存一个结果)
DELETE 删除某个资源
PATCH/HEAD (用的比较少)
## 资源表述
MIME 类型()
accept: text/xml html文件
Content-Type告诉客户端资源的表述形式
## 资源链接
超媒体即应用状态引擎(可以做多层链接)
https://api.github.com/repos/github
```
{
"message": "Not Found",
"documentation_url": "https://developer.github.com/v3"
}
```
## 状态转移
服务器端不应该保存客户端状态。
应用状态 -> 服务器端不保存应用状态
访问订单 根据接口去查询
访问商品 查询
**待整理查询资料**
## RESTful的最佳设计
1. 域名
http://api.gupaoedu.com
2. 版本
http://api.gupaoedu.com/v1/user/1
header里面维护版本
3. 路径
http://api.gupaoedu.com/v1/users_list //获取用户列表
http://api.gupaoedu.com/v1/goods-list //商品列表
http://api.gupaoedu.com/v1/users/{id}
4. 过滤信息
5. 状态码
- 业务状态码
- http状态码
================================================
FILE: notes/Docker.md
================================================
- [前言](#前言)
- [1. Docker 简介](#1-docker-简介)
- [1.1 什么是 Docker](#11-什么是-docker)
- [1.2 为什么要使用 Docker](#12-为什么要使用-docker)
- [2. Docker 基本概念](#2-docker-基本概念)
- [2.1 Docker 引擎](#21-docker-引擎)
- [2.2 Docker 架构](#22-docker-架构)
- [2.3 Docker 镜像](#23-docker-镜像)
- [2.4 Docker 容器](#24-docker-容器)
- [2.5 Docker 仓库](#25-docker-仓库)
- [3. 安装 Docker](#3-安装-docker)
- [3.1 Ubuntu 安装 Docker](#31-ubuntu-安装-docker)
- [准备工作](#准备工作)
- [系统要求](#系统要求)
- [卸载旧版本](#卸载旧版本)
- [Ubuntu 14.04 可选内核模块](#ubuntu-1404-可选内核模块)
- [Ubuntu 16.04 +](#ubuntu-1604-)
- [使用 APT 安装](#使用-apt-安装)
- [安装必要的一些系统工具](#安装必要的一些系统工具)
- [安装 GPG 证书](#安装-gpg-证书)
- [写入软件源信息](#写入软件源信息)
- [更新并安装 Docker CE](#更新并安装-docker-ce)
- [使用脚本自动安装](#使用脚本自动安装)
- [特别说明](#特别说明)
- [启动 Docker CE](#启动-docker-ce)
- [建立 docker 用户组](#建立-docker-用户组)
- [测试 Docker 是否安装正确](#测试-docker-是否安装正确)
- [镜像加速](#镜像加速)
- [参考文档](#参考文档)
- [3.2 CentOS 安装 Docker](#32-centos-安装-docker)
- [准备工作](#准备工作-1)
- [系统要求](#系统要求-1)
- [卸载旧版本](#卸载旧版本-1)
- [使用 yum 安装](#使用-yum-安装)
- [安装 Docker CE](#安装-docker-ce)
- [使用脚本自动安装](#使用脚本自动安装-1)
- [启动 Docker CE](#启动-docker-ce-1)
- [建立 docker 用户组](#建立-docker-用户组-1)
- [测试 Docker 是否安装正确](#测试-docker-是否安装正确-1)
- [镜像加速](#镜像加速-1)
- [添加内核参数](#添加内核参数)
- [参考文档](#参考文档-1)
- [3.3 树莓派卡片电脑安装 Docker](#33-树莓派卡片电脑安装-docker)
- [系统要求](#系统要求-2)
- [使用 APT 安装](#使用-apt-安装-1)
- [安装 Docker CE](#安装-docker-ce-1)
- [使用脚本自动安装](#使用脚本自动安装-2)
- [启动 Docker CE](#启动-docker-ce-2)
- [建立 docker 用户组](#建立-docker-用户组-2)
- [测试 Docker 是否安装正确](#测试-docker-是否安装正确-2)
- [镜像加速](#镜像加速-2)
- [3.4 macOS 安装 Docker](#34-macos-安装-docker)
- [系统要求](#系统要求-3)
- [安装](#安装)
- [使用 Homebrew 安装](#使用-homebrew-安装)
- [手动下载安装](#手动下载安装)
- [运行](#运行)
- [镜像加速](#镜像加速-3)
- [3.5 Windows 安装 Docker](#35-windows-安装-docker)
- [系统要求](#系统要求-4)
- [安装](#安装-1)
- [运行](#运行-1)
- [镜像加速](#镜像加速-4)
- [3.6 Docker 镜像加速器](#36-docker-镜像加速器)
- [Ubuntu 14.04、Debian 7 Wheezy](#ubuntu-1404debian-7-wheezy)
- [Ubuntu 16.04+、Debian 8+、CentOS 7](#ubuntu-1604debian-8centos-7)
- [Windows 10](#windows-10)
- [macOS](#macos)
- [检查加速器是否生效](#检查加速器是否生效)
# 前言
Docker 容器化引擎,更详细请转向:[Docker_Tutorial: Docker 容器化引擎入门手册](https://github.com/frank-lam/Docker_Tutorial)
> 参考资料:
>
> - http://www.funtl.com/
> - [Docker —— 从入门到实践](https://yeasy.gitbooks.io/docker_practice/content/)
>
> 基于以上部分内容做一定的修改
# 1. Docker 简介
## 1.1 什么是 Docker
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源](https://en.wikipedia.org/wiki/Docker_(software)),主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟(OCI)](https://www.opencontainers.org/)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,[dotCloud 公司决定改名为 Docker](https://blog.docker.com/2013/10/dotcloud-is-becoming-docker-inc/)。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
Docker 使用 Google 公司推出的 [Go 语言](https://golang.org/) 进行开发实现,基于 Linux 内核的 [cgroup](https://zh.wikipedia.org/wiki/Cgroups),[namespace](https://en.wikipedia.org/wiki/Linux_namespaces),以及 [AUFS](https://en.wikipedia.org/wiki/Aufs) 类的 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 等技术,对进程进行封装隔离,属于 [操作系统层面的虚拟化技术](https://en.wikipedia.org/wiki/Operating-system-level_virtualization)。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 [LXC](https://linuxcontainers.org/lxc/introduction/),从 0.7 版本以后开始去除 LXC,转而使用自行开发的 [libcontainer](https://github.com/docker/libcontainer),从 1.11 开始,则进一步演进为使用 [runC](https://github.com/opencontainers/runc) 和 [containerd](https://github.com/containerd/containerd)。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。


## 1.2 为什么要使用 Docker
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
**更高效的利用系统资源**
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
**更快速的启动时间**
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
**一致的运行环境**
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 *「这段代码在我机器上没问题啊」* 这类问题。
**持续交付和部署**
对开发和运维([DevOps](https://zh.wikipedia.org/wiki/DevOps))人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 `Dockerfile` 来进行镜像构建,并结合 [持续集成(Continuous Integration)](https://en.wikipedia.org/wiki/Continuous_integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 [持续部署(Continuous Delivery/Deployment)](https://en.wikipedia.org/wiki/Continuous_delivery) 系统进行自动部署。
而且使用 `Dockerfile` 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
**更轻松的迁移**
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
**更轻松的维护和扩展**
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 [官方镜像](https://store.docker.com/search?q=&source=verified&type=image),既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
**对比传统虚拟机总结**
| 特性 | 容器 | 虚拟机 |
| ---------- | ------------------ | ----------- |
| 启动 | 秒级 | 分钟级 |
| 硬盘使用 | 一般为 `MB` | 一般为 `GB` |
| 性能 | 接近原生 | 弱于 |
| 系统支持量 | 单机支持上千个容器 | 一般几十个 |
# 2. Docker 基本概念
Docker 包括三个基本概念
- 镜像(`Image`)
- 容器(`Container`)
- 仓库(`Repository`)
理解了这三个概念,就理解了 Docker 的整个生命周期。
## 2.1 Docker 引擎
Docker 引擎是一个包含以下主要组件的客户端服务器应用程序。
- 一种服务器,它是一种称为守护进程并且长时间运行的程序。
- REST API 用于指定程序可以用来与守护进程通信的接口,并指示它做什么。
- 一个有命令行界面 (CLI) 工具的客户端。
Docker 引擎组件的流程如下图所示:

## 2.2 Docker 架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。
Docker 容器通过 Docker 镜像来创建。
**容器与镜像**的关系类似于**面向对象**编程中的**对象与类**。
| Docker | 面向对象 |
| ------ | -------- |
| 容器 | 对象 |
| 镜像 | 类 |

| 标题 | 说明 |
| ------------------- | ------------------------------------------------------------ |
| **镜像**(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
| **容器**(Container) | 容器是独立运行的一个或一组应用。 |
| **客户端**(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API () 与 Docker 的守护进程通信。 |
| **主机**(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
| **仓库**(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub([https://hub.docker.com](https://hub.docker.com/)) 提供了庞大的镜像集合供使用。 |
| **Docker Machine** | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
## 2.3 Docker 镜像
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 `root` 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 `root` 文件系统。比如官方镜像 `ubuntu:16.04` 就包含了完整的一套 Ubuntu 16.04 最小系统的 `root` 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
**分层存储**
因为镜像包含操作系统完整的 `root` 文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
关于镜像构建,将会在后续相关章节中做进一步的讲解。
## 2.4 Docker 容器
镜像(`Image`)和容器(`Container`)的关系,就像是面向对象程序设计中的 `类` 和 `实例` 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 [命名空间](https://en.wikipedia.org/wiki/Linux_namespaces)。因此容器可以拥有自己的 `root` 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为**容器存储层**。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 `数据卷(Volume)`、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
## 2.5 Docker 仓库
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,`Docker Registry` 就是这样的服务。
一个 **Docker Registry** 中可以包含多个**仓库**(`Repository`);每个仓库可以包含多个**标签**(`Tag`);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 `<仓库名>:<标签>` 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 `latest` 作为默认标签。
以 [Ubuntu 镜像](https://store.docker.com/images/ubuntu) 为例,`ubuntu` 是仓库的名字,其内包含有不同的版本标签,如,`14.04`, `16.04`。我们可以通过 `ubuntu:14.04`,或者 `ubuntu:16.04` 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 `ubuntu`,那将视为 `ubuntu:latest`。
仓库名经常以 *两段式路径* 形式出现,比如 `jwilder/nginx-proxy`,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
**公有 Docker Registry**
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 [Docker Hub](https://hub.docker.com/),这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 [CoreOS](https://coreos.com/) 的 [Quay.io](https://quay.io/repository/),CoreOS 相关的镜像存储在这里;Google 的 [Google Container Registry](https://cloud.google.com/container-registry/),[Kubernetes](http://kubernetes.io/) 的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(`Registry Mirror`),这些镜像服务被称为**加速器**。常见的有 [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)、[DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) 等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 [时速云镜像仓库](https://hub.tenxcloud.com/)、[网易云镜像服务](https://c.163.com/hub#/m/library/)、[DaoCloud 镜像市场](https://hub.daocloud.io/)、[阿里云镜像库](https://cr.console.aliyun.com/) 等。
**私有 Docker Registry**
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 [Docker Registry](https://store.docker.com/images/registry/) 镜像,可以直接使用做为私有 Registry 服务。
开源的 Docker Registry 镜像只提供了 [Docker Registry API](https://docs.docker.com/registry/spec/api/) 的服务端实现,足以支持 `docker` 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 [Docker Trusted Registry](https://docs.docker.com/datacenter/dtr/2.0/) 中,提供了这些高级功能。
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,[VMWare Harbor](https://github.com/vmware/harbor) 和 [Sonatype Nexus](https://www.sonatype.com/docker)。
# 3. 安装 Docker
Docker 在 1.13 版本之后,从 2017 年的 3 月 1 日开始,版本命名规则变为如下:
| 项目 | 说明 |
| ----------- | ------------ |
| 版本格式 | YY.MM |
| Stable 版本 | 每个季度发行 |
| Edge 版本 | 每个月发行 |
同时 Docker 划分为 CE 和 EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。
Docker CE 每月发布一个 Edge 版本 (17.03, 17.04, 17.05…),每三个月发布一个 Stable 版本 (17.03, 17.06, 17.09…),Docker EE 和 Stable 版本号保持一致,但每个版本提供一年维护。
官方网站上有各种环境下的 [安装指南](https://docs.docker.com/engine/installation/),这里主要介绍 Docker CE 在 Linux 、Windows 10 (PC) 和 macOS 上的安装。
## 3.1 Ubuntu 安装 Docker
> 警告:切勿在没有配置 Docker APT 源的情况下直接使用 apt 命令安装 Docker.
### 准备工作
#### 系统要求
Docker CE 支持以下版本的 [Ubuntu](https://www.ubuntu.com/server) 操作系统:
- Artful 17.10 (Docker CE 17.11 Edge +)
- Xenial 16.04 (LTS)
- Trusty 14.04 (LTS)
Docker CE 可以安装在 64 位的 x86 平台或 ARM 平台上。Ubuntu 发行版中,LTS(Long-Term-Support)长期支持版本,会获得 5 年的升级维护支持,这样的版本会更稳定,因此在生产环境中推荐使用 LTS 版本,当前最新的 LTS 版本为 Ubuntu 16.04。
#### 卸载旧版本
旧版本的 Docker 称为 `docker` 或者 `docker-engine`,使用以下命令卸载旧版本:
```
$ sudo apt-get remove docker \
docker-engine \
docker.io
```
#### Ubuntu 14.04 可选内核模块
从 Ubuntu 14.04 开始,一部分内核模块移到了可选内核模块包 (`linux-image-extra-*`) ,以减少内核软件包的体积。正常安装的系统应该会包含可选内核模块包,而一些裁剪后的系统可能会将其精简掉。`AUFS` 内核驱动属于可选内核模块的一部分,作为推荐的 Docker 存储层驱动,一般建议安装可选内核模块包以使用 `AUFS`。
如果系统没有安装可选内核模块的话,可以执行下面的命令来安装可选内核模块包:
```
$ sudo apt-get update
$ sudo apt-get install \
linux-image-extra-$(uname -r) \
linux-image-extra-virtual
```
#### Ubuntu 16.04 +
Ubuntu 16.04 + 上的 Docker CE 默认使用 `overlay2` 存储层驱动,无需手动配置。
### 使用 APT 安装
#### 安装必要的一些系统工具
```
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
```
#### 安装 GPG 证书
```
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
```
#### 写入软件源信息
```
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
```
#### 更新并安装 Docker CE
```
sudo apt-get -y update
sudo apt-get -y install docker-ce
```
> 以上命令会添加稳定版本的 Docker CE APT 镜像源,如果需要最新或者测试版本的 Docker CE 请将 stable 改为 edge 或者 test。从 Docker 17.06 开始,edge test 版本的 APT 镜像源也会包含稳定版本的 Docker。
### 使用脚本自动安装
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Ubuntu 系统上可以使用这套脚本安装:
```
$ curl -fsSL get.docker.com -o get-docker.sh
# 可能会出现 404 错误,请移步下面的特别说明
$ sudo sh get-docker.sh --mirror Aliyun
```
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。
#### 特别说明
2018 年 7 月 21 日,貌似阿里云这边在做调整,故导致 Docker 的 Aliyun 安装脚本不可用,是永久性还是临时性的尚不清除,如果你已经按照之前的操作安装 Docker,请按以下步骤进行修复并重新安装
- 如果已经使用了 Aliyun 脚本安装并成功的
- 请先卸载 Docker,命令为:`apt-get autoremove docker-ce`
- 删除 `/etc/apt/sources.list.d` 目录下的 `docker.list` 文件
- 使用 `AzureChinaCloud` 镜像脚本重新安装,命令为:`sudo sh get-docker.sh --mirror AzureChinaCloud`
### 启动 Docker CE
```
$ sudo systemctl enable docker
$ sudo systemctl start docker
```
Ubuntu 14.04 请使用以下命令启动:
```
$ sudo service docker start
```
### 建立 docker 用户组
默认情况下,`docker` 命令会使用 [Unix socket](https://en.wikipedia.org/wiki/Unix_domain_socket) 与 Docker 引擎通讯。而只有 `root` 用户和 `docker` 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 `root` 用户。因此,更好地做法是将需要使用 `docker` 的用户加入 `docker` 用户组。
建立 `docker` 组:
```
$ sudo groupadd docker
```
将当前用户加入 `docker` 组:
```
$ sudo usermod -aG docker $USER
```
退出当前终端并重新登录,进行如下测试。
### 测试 Docker 是否安装正确
```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
```
若能正常输出以上信息,则说明安装成功。
### 镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 `国内镜像加速`。
### 参考文档
- [Docker 官方 Ubuntu 安装文档](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/)
## 3.2 CentOS 安装 Docker
> 警告:切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker.
### 准备工作
#### 系统要求
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 `overlay2` 存储层驱动)无法使用,并且部分功能可能不太稳定。
#### 卸载旧版本
旧版本的 Docker 称为 `docker` 或者 `docker-engine`,使用以下命令卸载旧版本:
```
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
```
### 使用 yum 安装
执行以下命令安装依赖包:
```
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
```
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
执行下面的命令添加 `yum` 软件源:
```
$ sudo yum-config-manager \
--add-repo \
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 官方源
# $ sudo yum-config-manager \
# --add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo
```
如果需要最新版本的 Docker CE 请使用以下命令:
```
$ sudo yum-config-manager --enable docker-ce-edge
```
如果需要测试版本的 Docker CE 请使用以下命令:
```
$ sudo yum-config-manager --enable docker-ce-test
```
#### 安装 Docker CE
更新 `yum` 软件源缓存,并安装 `docker-ce`。
```
$ sudo yum makecache fast
$ sudo yum install docker-ce
```
### 使用脚本自动安装
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装:
```
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
```
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。
### 启动 Docker CE
```
$ sudo systemctl enable docker
$ sudo systemctl start docker
```
### 建立 docker 用户组
默认情况下,`docker` 命令会使用 [Unix socket](https://en.wikipedia.org/wiki/Unix_domain_socket) 与 Docker 引擎通讯。而只有 `root` 用户和 `docker` 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 `root` 用户。因此,更好地做法是将需要使用 `docker` 的用户加入 `docker` 用户组。
建立 `docker` 组:
```
$ sudo groupadd docker
```
将当前用户加入 `docker` 组:
```
$ sudo usermod -aG docker $USER
```
退出当前终端并重新登录,进行如下测试。
### 测试 Docker 是否安装正确
```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
```
若能正常输出以上信息,则说明安装成功。
### 镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 `国内镜像加速`。
### 添加内核参数
默认配置下,如果在 CentOS 使用 Docker CE 看到下面的这些警告信息:
```
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
```
请添加内核配置参数以启用这些功能。
```
$ sudo tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
```
然后重新加载 `sysctl.conf` 即可
```
$ sudo sysctl -p
```
### 参考文档
- [Docker 官方 CentOS 安装文档](https://docs.docker.com/engine/installation/linux/docker-ce/centos/)。
## 3.3 树莓派卡片电脑安装 Docker
> 警告:切勿在没有配置 Docker APT 源的情况下直接使用 apt 命令安装 Docker.
### 系统要求
Docker CE 不仅支持 `x86_64` 架构的计算机,同时也支持 `ARM` 架构的计算机,本小节内容以树莓派单片电脑为例讲解 `ARM` 架构安装 Docker CE。
Docker CE 支持以下版本的 [Raspbian](https://www.raspberrypi.org/downloads/raspbian/) 操作系统:
- Raspbian Stretch
- Raspbian Jessie
*注:* `Raspbian` 是树莓派的开发与维护机构 [树莓派基金会](http://www.raspberrypi.org/) 推荐用于树莓派的首选系统,其基于 `Debian`。
### 使用 APT 安装
由于 apt 源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用 HTTPS 传输的软件包以及 CA 证书。
```
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
lsb-release \
software-properties-common
```
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
```
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian/gpg | sudo apt-key add -
# 官方源
# $ curl -fsSL https://download.docker.com/linux/raspbian/gpg | sudo apt-key add -
```
然后,我们需要向 `source.list` 中添加 Docker CE 软件源:
```
$ sudo add-apt-repository \
"deb [arch=armhf] https://mirrors.ustc.edu.cn/docker-ce/linux/raspbian \
$(lsb_release -cs) \
stable"
# 官方源
# $ sudo add-apt-repository \
# "deb [arch=armhf] https://download.docker.com/linux/raspbian \
# $(lsb_release -cs) \
# stable"
```
> 以上命令会添加稳定版本的 Docker CE APT 源,如果需要最新版本的 Docker CE 请将 stable 改为 edge 或者 test。从 Docker 17.06 开始,edge test 版本的 APT 源也会包含稳定版本的 Docker CE。
#### 安装 Docker CE
更新 apt 软件包缓存,并安装 `docker-ce`。
```
$ sudo apt-get update
$ sudo apt-get install docker-ce
```
### 使用脚本自动安装
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,Raspbian 系统上可以使用这套脚本安装:
```
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
```
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker CE 的 Edge 版本安装在系统中。
### 启动 Docker CE
```
$ sudo systemctl enable docker
$ sudo systemctl start docker
```
### 建立 docker 用户组
默认情况下,`docker` 命令会使用 [Unix socket](https://en.wikipedia.org/wiki/Unix_domain_socket) 与 Docker 引擎通讯。而只有 `root` 用户和 `docker` 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 `root` 用户。因此,更好地做法是将需要使用 `docker` 的用户加入 `docker` 用户组。
建立 `docker` 组:
```
$ sudo groupadd docker
```
将当前用户加入 `docker` 组:
```
$ sudo usermod -aG docker $USER
```
退出当前终端并重新登录,进行如下测试。
### 测试 Docker 是否安装正确
```
$ docker run arm32v7/hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
```
若能正常输出以上信息,则说明安装成功。
*注意:* ARM 平台不能使用 `x86` 镜像,查看 Raspbian 可使用镜像请访问 [arm32v7](https://hub.docker.com/u/arm32v7/)。
### 镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 `国内镜像加速`。
## 3.4 macOS 安装 Docker
### 系统要求
[Docker for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS 10.10.3 Yosemite。如果系统不满足需求,可以安装 [Docker Toolbox](https://docs.docker.com/toolbox/overview/)。
### 安装
#### 使用 Homebrew 安装
[Homebrew](http://brew.sh/) 的 [Cask](https://caskroom.github.io/) 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:
```
$ brew cask install docker
```
#### 手动下载安装
如果需要手动下载,请点击以下链接下载 [Stable](https://download.docker.com/mac/stable/Docker.dmg) 或 [Edge](https://download.docker.com/mac/edge/Docker.dmg) 版本的 Docker for Mac。
如同 macOS 其它软件一样,安装也非常简单,双击下载的 `.dmg` 文件,然后将那只叫 [Moby](https://blog.docker.com/2013/10/call-me-moby-dock/) 的鲸鱼图标拖拽到 `Application` 文件夹即可(其间需要输入用户密码)。

### 运行
从应用中找到 Docker 图标并点击运行。

运行之后,会在右上角菜单栏看到多了一个鲸鱼图标,这个图标表明了 Docker 的运行状态。

第一次点击图标,可能会看到这个安装成功的界面,点击 “Got it!” 可以关闭这个窗口。

以后每次点击鲸鱼图标会弹出操作菜单。

启动终端后,通过命令可以检查安装后的 Docker 版本。
```
$ docker --version
Docker version 17.10.0-ce, build f4ffd25
$ docker-compose --version
docker-compose version 1.17.0-rc1, build a0f95af
$ docker-machine --version
docker-machine version 0.13.0, build 9ba6da9
```
如果 `docker version`、`docker info` 都正常的话,可以尝试运行一个 [Nginx 服务器](https://store.docker.com/images/nginx/):
```
$ docker run -d -p 80:80 --name webserver nginx
```
服务运行后,可以访问 [http://localhost](http://localhost/),如果看到了 “Welcome to nginx!”,就说明 Docker for Mac 安装成功了。

要停止 Nginx 服务器并删除执行下面的命令:
```
$ docker stop webserver
$ docker rm webserver
```
### 镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 `国内镜像加速`。
## 3.5 Windows 安装 Docker
### 系统要求
[Docker for Windows](https://docs.docker.com/docker-for-windows/install/) 支持 64 位版本的 Windows 10 Pro,且必须开启 Hyper-V。
### 安装
点击以下链接下载 [Stable](https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe) 或 [Edge](https://download.docker.com/win/edge/Docker%20for%20Windows%20Installer.exe) 版本的 Docker for Windows。
下载好之后双击 Docker for Windows Installer.exe 开始安装。
### 运行
在 Windows 搜索栏输入 Docker 点击 Docker for Windows 开始运行。

Docker CE 启动之后会在 Windows 任务栏出现鲸鱼图标。

等待片刻,点击 Got it 开始使用 Docker CE。

### 镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置 `国内镜像加速`。
## 3.6 Docker 镜像加速器
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
- [Docker 官方提供的中国 registry mirror](https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror)
- [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)
- [DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc)
我们以 Docker 官方加速器为例进行介绍。
### Ubuntu 14.04、Debian 7 Wheezy
对于使用 [upstart](http://upstart.ubuntu.com/) 的系统而言,编辑 `/etc/default/docker` 文件,在其中的 `DOCKER_OPTS` 中配置加速器地址:
```
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
```
重新启动服务。
```
$ sudo service docker restart
```
### Ubuntu 16.04+、Debian 8+、CentOS 7
对于使用 [systemd](https://www.freedesktop.org/wiki/Software/systemd/) 的系统,请在 `/etc/docker/daemon.json` 中写入如下内容(如果文件不存在请新建该文件)
```json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
```
> 注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。
之后重新启动服务。
```shell
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```
> 注意:如果您之前查看旧教程,修改了 `docker.service` 文件内容,请去掉您添加的内容(`--registry-mirror=https://registry.docker-cn.com`),这里不再赘述。
### Windows 10
对于使用 Windows 10 的系统,在系统右下角托盘 Docker 图标内右键菜单选择 `Settings`,打开配置窗口后左侧导航菜单选择 `Daemon`。在 `Registry mirrors`一栏中填写加速器地址 `https://registry.docker-cn.com`,之后点击 `Apply` 保存后 Docker 就会重启并应用配置的镜像地址了。
### macOS
对于使用 macOS 的用户,在任务栏点击 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors。在列表中填写加速器地址 `https://registry.docker-cn.com`。修改完成之后,点击 `Apply & Restart` 按钮,Docker 就会重启并应用配置的镜像地址了。
### 检查加速器是否生效
配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 `docker info`,如果从结果中看到了如下内容,说明配置成功。
```
Registry Mirrors:
https://registry.docker-cn.com/
```
================================================
FILE: notes/Docker基础.md
================================================
- [一、Docker 快速入门](#一docker-快速入门)
- [初探 Docker](#初探-docker)
- [什么是 Docker](#什么是-docker)
- [为什么要使用 Docker](#为什么要使用-docker)
- [CentOS 7 安装 Docker](#centos-7-安装-docker)
- [Docker 镜像加速器](#docker-镜像加速器)
- [Docker 常用命令](#docker-常用命令)
- [1. 启动、停止、重启服务](#1-启动停止重启服务)
- [2. 拉取一个镜像,启动容器](#2-拉取一个镜像启动容器)
- [3. 启动的容器列表](#3-启动的容器列表)
- [4. 查看所有的容器](#4-查看所有的容器)
- [5. 启动、停止、重启某个容器](#5-启动停止重启某个容器)
- [6. 查看指定容器的日志记录](#6-查看指定容器的日志记录)
- [7. 删除某个容器,若正在运行,需要先停止](#7-删除某个容器若正在运行需要先停止)
- [8. 删除容器](#8-删除容器)
- [9. 删除镜像](#9-删除镜像)
- [10. 删除虚悬镜像](#10-删除虚悬镜像)
- [11. 镜像导入与导出](#11-镜像导入与导出)
- [二、Docker File 镜像构建](#二docker-file-镜像构建)
- [三、Docker Compose](#三docker-compose)
- [docker-compose 命令安装](#docker-compose-命令安装)
- [1. 安装 python-pip](#1-安装-python-pip)
- [2. 安装 Docker-Compose](#2-安装-docker-compose)
- [docker-compose.yml 规范](#docker-composeyml-规范)
- [四、Docker 实战](#四docker-实战)
- [实战1:快速搭建 MySQL](#实战1快速搭建-mysql)
- [实战2:快速搭建 phpMyAdmin](#实战2快速搭建-phpmyadmin)
- [实战3:快速搭建 GitLab](#实战3快速搭建-gitlab)
- [参考资料](#参考资料)
# 一、Docker 快速入门
本文部分内容引用来自:【千锋-李卫民老师博客,推荐大家学习】http://www.funtl.com/
A simple, interactive and fun playground to learn Docker:[Play with Docker](https://labs.play-with-docker.com/)
## 初探 Docker
### 什么是 Docker
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 [2013 年 3 月以 Apache 2.0 授权协议开源](https://en.wikipedia.org/wiki/Docker_(software)),主要项目代码在 [GitHub](https://github.com/moby/moby) 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 [开放容器联盟(OCI)](https://www.opencontainers.org/)。
Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,[dotCloud 公司决定改名为 Docker](https://blog.docker.com/2013/10/dotcloud-is-becoming-docker-inc/)。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。
Docker 使用 Google 公司推出的 [Go 语言](https://golang.org/) 进行开发实现,基于 Linux 内核的 [cgroup](https://zh.wikipedia.org/wiki/Cgroups),[namespace](https://en.wikipedia.org/wiki/Linux_namespaces),以及 [AUFS](https://en.wikipedia.org/wiki/Aufs) 类的 [Union FS](https://en.wikipedia.org/wiki/Union_mount) 等技术,对进程进行封装隔离,属于 [操作系统层面的虚拟化技术](https://en.wikipedia.org/wiki/Operating-system-level_virtualization)。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 [LXC](https://linuxcontainers.org/lxc/introduction/),从 0.7 版本以后开始去除 LXC,转而使用自行开发的 [libcontainer](https://github.com/docker/libcontainer),从 1.11 开始,则进一步演进为使用 [runC](https://github.com/opencontainers/runc) 和 [containerd](https://github.com/containerd/containerd)。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

### 为什么要使用 Docker

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
**更高效的利用系统资源**
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
**更快速的启动时间**
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
**一致的运行环境**
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 *「这段代码在我机器上没问题啊」* 这类问题。
**持续交付和部署**
对开发和运维([DevOps](https://zh.wikipedia.org/wiki/DevOps))人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 `Dockerfile` 来进行镜像构建,并结合 [持续集成(Continuous Integration)](https://en.wikipedia.org/wiki/Continuous_integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 [持续部署(Continuous Delivery/Deployment)](https://en.wikipedia.org/wiki/Continuous_delivery) 系统进行自动部署。
而且使用 `Dockerfile` 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
**更轻松的迁移**
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
**更轻松的维护和扩展**
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 [官方镜像](https://store.docker.com/search?q=&source=verified&type=image),既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
**对比传统虚拟机总结**
| 特性 | 容器 | 虚拟机 |
| ---------- | ------------------ | ----------- |
| 启动 | 秒级 | 分钟级 |
| 硬盘使用 | 一般为 `MB` | 一般为 `GB` |
| 性能 | 接近原生 | 弱于 |
| 系统支持量 | 单机支持上千个容器 | 一般几十个 |
## CentOS 7 安装 Docker
1. 先更新 yum 软件管理器,然后再安装 Docker
```shell
[root@localhost /] yum -y update
[root@localhost /] yum install -y docker
```
说明:上述 `-y` 代表选择程序安装中的 yes 选项
或是,直接安装
```shell
yum install docker
```
2. 验证安装,查看 Docker 版本信息
```shell
[root@localhost /] docker -v
Docker version 1.13.1, build 8633870/1.13.1
You have new mail in /var/spool/mail/root
```
3. 启动 / 重启 / 关闭 Docker
```shell
[root@localhost /] docker start
[root@localhost /] docker restart
[root@localhost /] docker stop
```
【意外情况】service docker start 无法启动问题
- centos 安装 docker 显示 No package docker available,原因是 yum 没有找到 docker 的包,需要 epel 第三方软件库,运行下面的命令
`sudo yum install epel-release`
- [【亲测有效】Centos安装完成docker后启动docker报错docker](http://www.cnblogs.com/ECJTUACM-873284962/p/9362840.html)
1. 配置yum源
vim /etc/yum.repos.d/docker.repo
```ini
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
```
2. 通过yum安装
```
yum install docker-engine
service docker start
service docker status
```
3. 日志
```
vim /var/log/docker
```
在 Ubuntu 16.04 LTS 上 离线安装 Docker / Docker-compose - TonyZhang24 - 博客园
https://www.cnblogs.com/atuotuo/p/9272368.html
## Docker 镜像加速器
1. 加速器服务
[DaoCloud 加速器,一行命令,镜像万千](https://www.daocloud.io/mirror)
[阿里云 - 开发者平台 - 容器 hub](https://dev.aliyun.com/search.html)
2. 配置 Docker 加速器
以 Linux 为例
```shell
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
```
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。更多详情请访问文档。
删除 /etc/docker/daemon.json 中最后一个逗号,重启 Docker 服务即可
## Docker 常用命令

### 1. 启动、停止、重启服务
```shell
[root@localhost ~]# service docker restart
Redirecting to /bin/systemctl restart docker.service
[root@localhost ~]# service docker stop
Redirecting to /bin/systemctl stop docker.service
[root@localhost ~]# service docker start
Redirecting to /bin/systemctl start docker.service
```
### 2. 拉取一个镜像,启动容器
```shell
[root@localhost ~]# docker pull centos
[root@localhost ~]# docker run -it -v /centos_dir:/docker_dir --name biodwhu-1 centos
```
- -i:允许我们对容器内的 (STDIN) 进行交互
- -t:在新容器内指定一个伪终端或终端
- -v:是挂在宿机目录, /centos_dir 是宿机目录,/docker_dir 是当前 Docker 容器的目录,宿机目录必须是绝对的。
- -p:端口映射
- --name:是给容器起一个名字,可省略,省略的话 docker 会随机产生一个名字
- --restart:always
### 3. 启动的容器列表
```shell
[root@localhost ~]# docker ps
```
### 4. 查看所有的容器
```shell
[root@localhost ~]# docker ps -a
```
### 5. 启动、停止、重启某个容器
```shell
[root@localhost ~]# docker start biodwhu-1
biodwhu-1
[root@localhost ~]# docker stop biodwhu-2
biodwhu-2
[root@localhost ~]# docker restart biodwhu-3
biodwhu-3
```
### 6. 查看指定容器的日志记录
```shell
[root@localhost ~]# docker logs -f biodwhu-1
```
### 7. 删除某个容器,若正在运行,需要先停止
```shell
[root@localhost ~]# docker rm biodwhu-1
Error response from daemon: You cannot remove a running container 2d48fc5b7c17b01e6247cbc012013306faf1e54f24651d5e16d6db4e15f92d33. Stop the container before attempting removal or use -f
[root@localhost ~]# docker stop biodwhu-1
biodwhu-1
[root@localhost ~]# docker rm biodwhu-1
biodwhu-1
```
### 8. 删除容器
```shell
# 删除某个容器
[root@localhost ~]# docker rm f3b346204a39
# 删除所有容器
[root@localhost ~]# docker stop $(docker ps -a -q)
[root@localhost ~]# docker rm $(docker ps -a -q)
```
### 9. 删除镜像
```shell
# 删除某个镜像
[root@localhost ~]# docker rmi docker.io/mysql:5.6
# 删除所有镜像
[root@localhost ~]# docker rmi $(docker images -q)
# 强制删除所有镜像
[root@localhost ~]# docker rmi -f $(docker images -q)
```
### 10. 删除虚悬镜像
我们在 build 镜像的过程中,可能会产生一些临时的不具有名称也没有作用的镜像他们的名称一般都是 `` ,我们可以执行下面的命令将其清除掉:
```shell
[root@localhost ~]# docker rmi $(docker images -f "dangling=true" -q)
# 或者
[root@localhost ~]# docker image prune -a -f
```
### 11. 镜像导入与导出
保存镜像
```shell
[root@localhost ~]# docker save a46c2a2722b9 > /var/docker/images_save/mysql.tar.gz
```
加载镜像
```shell
[root@localhost ~]# docker load -i /var/docker/images_save/mysql.tar.gz
```
# 二、Docker File 镜像构建
# 三、Docker Compose
## docker-compose 命令安装
Docker-Compose 是一个部署多个容器的简单但是非常必要的工具.
安装 Docker-Compose 之前,请先安装 python-pip
### 1. 安装 python-pip
1. 首先检查 Linux 有没有安装 python-pip 包,终端执行 pip -v
```shell
[root@localhost ~]# pip -V
-bash: pip: command not found
```
2. 没有 python-pip 包就执行命令
```shell
[root@localhost ~]# yum -y install epel-release
```
3. 执行成功之后,再次执行
```shell
[root@localhost ~]# yum -y install python-pip
```
4. 对安装好的 pip 进行升级
```shell
[root@localhost ~]# pip install --upgrade pip
```
### 2. 安装 Docker-Compose
1. 终端执行
```shell
[root@localhost ~]# pip install docker-compose
```
2. 检查 docker-compose 安装
```shell
[root@localhost ~]# docker-compose -version
```
参考资料:
- [CentOS7下安装Docker-Compose - YatHo - 博客园](https://www.cnblogs.com/YatHo/p/7815400.html)
## docker-compose.yml 规范
# 四、Docker 实战
## 实战1:快速搭建 MySQL
- 官方镜像仓库
[https://hub.docker.com/_/mysql/](https://hub.docker.com/_/mysql/)
- docker-compose.yml
```yml
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.6
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- /usr/local/docker/mysql/mysql-data:/var/lib/mysql
```
## 实战2:快速搭建 phpMyAdmin
- 官方镜像仓库
[phpmyadmin/phpmyadmin](phpmyadmin/phpmyadmin)
- docker-compose.yml
```yml
version: '3.1'
services:
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=120.92.17.12
# - PMA_PORT=3306
# - PMA_USER=xxx
# - PMA_PASSWORD=xxx
restart: always
ports:
- 6060:80
volumes:
- /sessions
```
## 实战3:快速搭建 GitLab
GitLab 使用163邮箱发送邮件 - 刘锐群的笔记 - CSDN博客
https://blog.csdn.net/liuruiqun/article/details/50000213
gitlab服务器邮箱配置 - weifengCorp - 博客园
https://www.cnblogs.com/weifeng1463/p/8489563.html
twang2218/gitlab-ce-zh - Docker Hub
https://hub.docker.com/r/twang2218/gitlab-ce-zh/
```yml
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh:10.5'
restart: always
hostname: '120.131.11.187'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://120.131.11.187:3000'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 3000
ports:
- '3000:3000'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
```
# 参考资料
- [docker前后分离笔记 - 小翼的前端天地](https://my-fe.pub/post/docker-front-and-backend-separation.html#toc-619)
================================================
FILE: notes/Docker实战.md
================================================
# Docker实战系列
## Docker搭建自己的Gitlab CI Runner
> 这里主要将采用 docker 镜像方式安装
>
1. 拉取gitlab-runner镜像
```
docker pull gitlab/gitlab-runner:latest
```
2. 添加 gitlab-runner container
```
sudo docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
sudo docker run -d --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
```
3. 注册runner
```
sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
```
4. 注册
```shell
sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register
```
sudo docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
[Docker搭建自己的Gitlab CI Runner - 哎_小羊的博客 - CSDN博客](https://blog.csdn.net/aixiaoyang168/article/details/72168834)
================================================
FILE: notes/EalsticSearch/Untitled.md
================================================
elasticsearch-head的使用 - 仅此而已-远方 - 博客园
https://www.cnblogs.com/xuwenjin/p/8792919.html
tyrival/gitbook: Logstash + Elasticsearch 6.7 用户指南中文版
https://github.com/tyrival/gitbook
Mac下ElasticSearch安装 - 简书
https://www.jianshu.com/p/df4af12a420a
## 安装
Logstash在Linux上安装部署 - haw2106 - 博客园
https://www.cnblogs.com/haw2106/p/10410916.html
ElasticSearch在linux上安装部署 - socket强 - 博客园
https://www.cnblogs.com/socketqiang/p/11363024.html
详解Docker下使用Elasticsearch可视化Kibana_docker_脚本之家
https://www.jb51.net/article/138582.htm
docker下载镜像报net/http: TLS handshake timeout-西风未眠-51CTO博客
https://blog.51cto.com/10950710/2122702
Docker安装部署ELK教程 (Elasticsearch+Kibana+Logstash+Filebeat) - 万能付博 - 博客园
https://www.cnblogs.com/fbtop/p/11005469.html
1.拉取镜像
```
docker pull elasticsearch:6.5.4
docker pull kibana:6.5.4
```
2.启动容器
```
docker run -d --name es1 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.5.4
docker run -d -p 5601:5601 --name kibana --link es1:elasticsearch kibana:6.5.4
```
================================================
FILE: notes/FastDFS.md
================================================
# FastDFS
手把手教你搭建分布式文件存储系统
用FastDFS一步步搭建文件管理系统 - bojiangzhou - 博客园
https://www.cnblogs.com/chiangchou/p/fastdfs.html
================================================
FILE: notes/Frontend/Angular.md
================================================
# Angular
## 1. 框架背景
Angular 是一个由 Google维护的开源JavaScript框架,用于在HTML和JavaScript中构建Web应用程序,是三大框架之首。
不管是1还是2,Angular最显著的特征就是其**整合性**。涵盖了M、V、C/VM等各个层面,不需要组合、评估其它技术就能完成大部分前端开发任务。这样可以有效降低决策成本,提高决策速度,对需要快速起步的团队是非常有帮助的。
由于它是从一个用来做原型的框架演化而来的,加上诞生时间很早(2009年,作为对比,jQuery诞生于2006年),当时生态不完善,连模块化机制都得自己实现。
但Angular 2就不同了,发布于2016年9月份,它是基于ES6来开发的,它的起点更高,整合了现代前端的各种先进理念,在框架、文档、工具等各个层面提供了全方位的支持
在Angular 中最具特色的就是**依赖注入**系统了,它把后端开发中用来解决复杂问题、实现高弹性设计的技术引入了前端
## 2. Angular CLI
### 2.1 安装
Angular CLI用于简单,快速构建Angular2项目,只要掌握几行命令就能扣减前端架构。依赖于NodeJs和npm。
```jsx
//安装脚手架
npm install -g angular-cli
//创建项目
ng new project_name(项目名称)
//启动项目
cd project_name
ng serve --open
```
### 2.2 主要特性
1. Angular CLI 可以快速搭建框架,创建module,service,class,directive等;
2. 具有webpack的功能,代码分割,按需加载;
3. 代码打包压缩;
4. 模块测试;
5. 热部署,有改动立即重新编译,不用刷新浏览器;而且速度很快
6. 有开发环境,测试环境,生产环境的配置,不用自己操心;
7. sass,less的预编译Angular CLI都会自动识别后缀来编译;
8. typescript的配置,Angular CLI在创建应用时都可以自己配置;
9. 在创建好的工程也可以做一些个性化的配置,webpack的具体配置还不支持,未来可能会增加;
10. Angular CLI创建的工程结构是最佳实践,生产可用;
### 2.3 创建module,component,service,class
## 3. 架构
### 3.1 模块
模块组件的特征在于可以用于执行单个任务的代码块。 您可以从代码(类)中导出值。 Angular应用程序被称为模块,并使用许多模块构建您的应用程序。 Angular 的基本构建块是可以从模块导出的**组件**类。
```js
export class AppComponent {
title = '朝夕教育';
}
```
### 3.2 组件
组件是拥有模板的控制器类,主要处理页面上的应用程序和逻辑的视图。 组件可以拥有独立的样式。
注册组件,使用 *@Component* 注释,可以将应用程序拆分为更小的部分。
#### 3.2.1 创建组件
使用ng命令`ng generate component `创建的组件会自动生成在`app.module`中的引用,推荐使用ng命令生成组件
```jsx
//快速创建
ng g c xxx
```
```jsx
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
```
@Component最常用的几个选项:
**selector**:这个 CSS 选择器用于在模板中标记出该指令,并触发该指令的实例化。
**template**:组件的内联模板
**templateUrl**:组件模板文件的 URL
**styleUrls**:组件样式文件
**styles**:组件内联样式
#### 3.2.2 组件生命周期
Angular 会按以下顺序执行钩子方法。你可以用它来执行以下类型的操作。
| 钩子方法 | 用途 | 时机 |
| :------------------------ | :----------------------------------------------------------- | :----------------------------------------------------------- |
| `ngOnChanges()` | 当 Angular 设置或重新设置数据绑定的输入属性时响应。 该方法接受当前和上一属性值的 `SimpleChanges` 对象注意,这发生的非常频繁,所以你在这里执行的任何操作都会显著影响性能。 | 在 `ngOnInit()` 之前以及所绑定的一个或多个输入属性的值发生变化时都会调用。注意,如果你的组件没有输入,或者你使用它时没有提供任何输入,那么框架就不会调用 `ngOnChanges()`。 |
| `ngOnInit()` | 在 Angular 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。 | 在第一轮 `ngOnChanges()` 完成之后调用,只调用**一次**。 |
| `ngDoCheck()` | 检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应。 | 紧跟在每次执行变更检测时的 `ngOnChanges()` 和 首次执行变更检测时的 `ngOnInit()` 后调用。 |
| `ngAfterContentInit()` | 当 Angular 把外部内容投影进组件视图或指令所在的视图之后调用。 | 第一次 `ngDoCheck()` 之后调用,只调用一次。 |
| `ngAfterContentChecked()` | 每当 Angular 检查完被投影到组件或指令中的内容之后调用 | `ngAfterContentInit()` 和每次 `ngDoCheck()` 之后调用 |
| `ngAfterViewInit()` | 当 Angular 初始化完组件视图及其子视图或包含该指令的视图之后调用 | 第一次 `ngAfterContentChecked()` 之后调用,只调用一次。 |
| `ngAfterViewChecked()` | 每当 Angular 做完组件视图和子视图或包含该指令的视图的变更检测之后调用。 | `ngAfterViewInit()` 和每次 `ngAfterContentChecked()` 之后调用。 |
| `ngOnDestroy()` | 每当 Angular 每次销毁指令/组件之前调用并清扫。 在这儿反订阅可观察对象和分离事件处理器,以防内存泄漏 | 在 Angular 销毁指令或组件之前立即调用。 |
#### 3.2.3 组件交互
1. **@Input**
父组件通过`@Input`给子组件绑定属性设置输入类数据
```jsx
//父组件
//子组件
import { Component, Input } from '@angular/core';
@Input()
name!: string;
ngOnInit(): void {
console.log(this.name)
}
```
2. **@Output**
父组件给子组件传递一个事件,子组件通过`@Output`弹射触发事件
```jsx
//父组件
list:number[] = [1,2,3,4]
addListFun(num:number){
this.list.push(num)
}
//子组件
import { Component, Output,EventEmitter } from '@angular/core';
@Output() addList = new EventEmitter()
pushList(v:string){
console.log(this.inpValue)
this.addList.emit(v)
}
```
3. **@ViewChild()**
通过`ViewChild`获取子组件实例,获取子组件数据
```jsx
@ViewChild('myChild') child: any;
constructor() { }
ngOnInit(): void {
}
getView(e:any){
console.log(this.child)
this.child.setInpValue('我是一段数据')
}
```
### 3.3 模板
在 Angular 中,**模板**就是一块 HTML。在模板中,你可以通过一种特殊语法来使用 Angular 的许多功能
#### 3.3.1 插值语法
所谓 "插值" 是指将表达式嵌入到标记文本中。 默认情况下,插值会用双花括号 `{{` 和 `}}` 作为分隔符
```js
hello {{ name }}
```
花括号之间的文本通常是组件属性的名字。Angular 会把这个名字替换为响应组件属性的字符串值
括号间的素材是一个**模板表达式**我们可以在`{{}}`内编写js运算
```jsx
hello {{ 1+1 }}
```
#### 3.3.2 属性绑定
1. **Attribute绑定**
```jsx
hello {{ 1+1 }}
```
2. **类绑定**
```jsx
//单一类绑定
hello {{ 1+1 }}
//多重类绑定
hello {{ 1+1 }}
hello {{ 1+1 }}
hello {{ 1+1 }}
//ngClass
export class AppComponent {
isActive = true;
}
hello {{ 1+1 }}
```
3. **样式绑定**
```jsx
//单一样式绑定
hello {{ 1+1 }}
//带单位的单一样式绑定
hello {{ 1+1 }}
//多重样式绑定
hello {{ 1+1 }}
hello {{ 1+1 }}
//ngStyle
export class AppComponent {
isMax = false;
}
hello {{ 1+1 }}
hello {{ 1+1 }}
```
#### 3.3.3 条件判断
***ngIf**是直接影响元素是否被渲染,而非控制元素的显示和隐藏
```jsx
export class AppComponent {
isMax = false;
isMin = false;
}
Max title
Min title
//解析完
Max title
isMax为true
isMax为false
```
#### 3.3.4 循环语句
解析器会把 `let color`、`let i` 和 `let odd` 翻译成命名变量 `color`、`i` 和 `odd`
微语法解析器接收of,会将它的首字母大写(Of),然后加上属性的指令名(ngFor)前缀,它最终生成的名字是 ngFor 的输入属性(colors)
`NgFor` 指令在列表上循环,每个循环中都会设置和重置它自己的上下文对象上的属性。 这些属性包括 `index` 和 `odd` 以及一个特殊的属性名 `$implicit`(隐式变量)
Angular 将 let-color 设置为此上下文中 $implicit 属性的值, 它是由 NgFor 用当前迭代中的 colors 初始化的
```jsx
export class AppComponent {
colors:Array = [ 'red', 'blue', 'yellow', 'green' ];
}
{{odd}}
{{i}}
{{color}}
//解析完
{{odd}} {{i}} {{color}}
```
```jsx
export class AppComponent {
status = 1;
}
```
#### 3.3.5 事件绑定
Angular 的事件绑定语法由等号左侧括号内的目标事件名和右侧引号内的模板语句组成。目标事件名是 `click` ,模板语句是 `onSave()`
事件对象通过`$event`传递
```jsx
export class AppComponent {
onSave(){
console.log('点击了按钮')
}
}
```
#### 3.3.6 双向绑定
双向绑定是应用中的组件共享数据的一种方式。使用双向绑定绑定来侦听事件并在父组件和子组件之间同步更新值
ngModel指令**只对表单元素有效**,所以在使用之前需要导入`FormsModule`板块
```jsx
import { FormsModule } from '@angular/forms';
@NgModule({
// 申明组件内用到的视图
declarations: [
AppComponent,
HelloComponent,
],
//引入模块需要的类
imports: [
BrowserModule,
AppRoutingModule,
FormsModule
],
//全局服务
providers: [],
//根组件
bootstrap: [AppComponent]
})
```
```jsx
export class AppComponent {
userName='';
}
输入:
你输入了: {{userName}}
```
#### 3.3.7 模板引用变量
模板变量可以帮助你在模板的另一部分使用这个部分的数据。使用模板变量,你可以执行某些任务,比如响应用户输入或微调应用的表单
在模板中,要使用井号 `#` 来声明一个模板变量。下列模板变量 `#userName` 语法在 `` 元素上声明了一个名为 `userName` 的变量
```html
```
可以在组件模板中的任何地方引用某个模板变量
```jsx
export class AppComponent {
callUserName(v){
console.log(v)
}
}
```
Angular 根据你所声明的变量的位置给模板变量赋值:
- 如果在组件上声明变量,该变量就会引用该组件实例。
- 如果在标准的 HTML 标记上声明变量,该变量就会引用该元素。
- 如果你在 `` 元素上声明变量,该变量就会引用一个 `TemplateRef` 实例来代表此模板。
#### 3.3.8 表单控件
使用表单控件有三个步骤。
1. 在你的应用中注册响应式表单模块。该模块声明了一些你要用在响应式表单中的指令。
2. 生成一个新的 `FormControl` 实例,并把它保存在组件中。
3. 在模板中注册这个 `FormControl`。
**注册响应式表单模块**
要使用响应式表单控件,就要从 `@angular/forms` 包中导入 `ReactiveFormsModule`,并把它添加到你的 NgModule 的 `imports` 数组中。
```js
import { ReactiveFormsModule } from '@angular/forms';
@NgModule({
imports: [
// other imports ...
ReactiveFormsModule
],
})
export class AppModule { }
```
要注册一个表单控件,就要导入 `FormControl` 类并创建一个 `FormControl` 的新实例,将其保存为类的属性。
```js
import { Component } from '@angular/core';
import { FormControl } from '@angular/forms';
@Component({
selector: 'app-name-editor',
templateUrl: './name-editor.component.html',
styleUrls: ['./name-editor.component.css']
})
export class NameEditorComponent {
name = new FormControl('');
}
//使用这种模板绑定语法,把该表单控件注册给了模板中名为 name 的输入元素。这样,表单控件和 DOM 元素就可以互相通讯了:视图会反映模型的变化,模型也会反映视图中的变化
Value: {{ name.value }}
```
修改name值可以通过`FormControl` 提供的 `setValue()` 方法
```js
updateName() {
this.name.setValue('Tina');
}
```
#### 3.3.9 表单控件分组
表单中通常会包含几个相互关联的控件。响应式表单提供了两种把多个相关控件分组到同一个输入表单中的方法
要将表单组添加到此组件中,请执行以下步骤。
1. 创建一个 `FormGroup` 实例。
2. 把这个 `FormGroup` 模型关联到视图。
3. 保存表单数据。
**创建一个 FormGroup 实例**
在组件类中创建一个名叫 `loginForm` 的属性,并设置为 `FormGroup` 的一个新实例。要初始化这个 `FormGroup`,请为构造函数提供一个由控件组成的对象,对象中的每个名字都要和表单控件的名字一一对应
```js
import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-profile-editor',
templateUrl: './profile-editor.component.html',
styleUrls: ['./profile-editor.component.css']
})
export class ProfileEditorComponent {
loginForm = new FormGroup({
userName: new FormControl(''),
password: new FormControl(''),
});
}
//模板渲染
```
#### 3.3.10 表单验证
表单元素添加`required`关键字表示必填,通过绑定`ngModel`的引用可以拿到到当前组件的信息,通过引用获取到验证的信息
```jsx
export class AppComponent {
fromData={
name:'',
password:''
};
subBtnFUn(obj){
console.log(obj)
}
}
```
我们还可以通过 **ngModel** 跟踪修改状态与有效性验证,它使用了三个 CSS 类来更新控件,以便反映当前状态。
| 状态 | 为 true 时的类 | 为 false 时的类 |
| :--------------- | :------------- | :-------------- |
| 控件已经被访问过 | `ng-touched` | `ng-untouched` |
| 控件值已经变化 | `ng-dirty` | `ng-pristine` |
| 控件值是有效的 | `ng-valid` | `ng-invalid` |
#### 3.3.11 自定义表单验证
先引入表单的一些内置依赖
```js
import { FormGroup, FormBuilder,Validators } from '@angular/forms';
//构造函数里注入FormBuilder
constructor(private fb:FormBuilder) { }
//错误提醒数据
formErrors = {
'title': '',
'content': ''
};
//在组件类的初始化函数里对表单中的元素的校验进行定义,并调用表单的valueChanges方法,检测表单的输入的变化
ngOnInit():void {
this.taskInfo.isComplete = 1;
this.tasksForm = this.fb.group({
userName: ['', [Validators.required,
Validators.maxLength(18),
Validators.minLength(6) ] ],
password: ['', [this.passWordVal]],
phone: ['', [Validators.required,this.phoneVal],]
});
phoneVal(phone: FormControl): object {
const value = phone.value || '';
if(!value) return {desc:'请输入手机号'}
const valid = /[0-9]{11}/.test(value);
return valid ? {} :{desc:'联系电话必须是11位数字'}
}
passWordVal(password:FormControl):object{
const value = password.value || '';
const valid = value.match(/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/);
return valid ? {} : {passwordValidator: {desc:'密码至少包含 数字和英文,长度6-20'}}
}
}
```
#### 3.3.12 管道
管道的作用就是传输。不同的管道具有不同的作用。(其实就是处理数据)
`angular`中自带的`pipe`函数
| 管道 | 功能 |
| ------------- | ------------------------------------------------------------ |
| DatePipe | 日期管道,格式化日期 |
| JsonPipe | 将输入数据对象经过JSON.stringify()方法转换后输出对象的字符串 |
| UpperCasePipe | 将文本所有小写字母转换成大写字母 |
| LowerCasePipe | 将文本所有大写字母转换成小写字母 |
| DecimalPipe | 将数值按照特定的格式显示文本 |
| CurrentcyPipe | 将数值进行货币格式化处理 |
| SlicePipe | 将数组或者字符串裁剪成新子集 |
| PercentPipe | 将数值转百分比格式 |
`pipe`用法
- {{ 输入数据 | 管道 : 管道参数}} (其中‘|’是管道操作符)
- 链式管道 {{ 输入数据 | date | uppercase}}
- 管道流通方向自左向右,逐层执行
使用脚手架命令:**ng g p test**
```js
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'testTitle'
})
export class TestPipe implements PipeTransform {
transform(value: unknown, ...args: unknown[]): unknown {
console.log(value)
return 'title';
}
}
{{ 'Angular' | testTitle }}
```
### 3.4 服务
angular中,把从组件内抽离出来的代码叫服务,服务的本质就是函数
官方认为组件不应该直接获取或保存数据, 它们应该聚焦于展示数据,而把数据访问的职责委托给某个服务。而服务就充当着数据访问,逻辑处理的功能。把组件和服务区分开,以提高模块性和复用性。通过把组件中和视图有关的功能与其他类型的处理分离开,可以让组件类更加精简、高效。
使用命令ng g s xxx创建一个服务,通过**@Injectable()**装饰器标识服务。
```js
//导入Injectable装饰器
import { Injectable } from '@angular/core';
//使用Injectable装饰器声明服务
@Injectable({
//作用域设定,'root'表示默认注入,注入到AppModule里
providedIn: 'root',
})
export class TestService {
}
```
组件中如何使用服务呢,必须将服务依赖注入系统、组件或者模块,才能够使用服务。我们可以用**注册提供商**和**根注入器**实现**。**
该服务本身是 CLI 创建的一个类,并且加上了 `@Injectable()` 装饰器。默认情况下,该装饰器是用 `providedIn` 属性进行配置的,它会为该服务创建一个提供商。
### 3.5 依赖注入
在这个例子中,`providedIn: 'root'` 指定 Angular 应该在根注入器中提供该服务,从而实现**根注入器**将服务注入,它就在整个应用程序中可用了**。**
**providedIn**:
'root' :注入到AppModule,提供该服务,所有子组件都可以使用(推荐)
null : 不设定服务作用域(不推荐)
组件名:只作用于该组件(懒加载模式)
```js
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class TestService {
}
import { Component, OnInit } from '@angular/core';
import {HeroService} from '../hero.service'
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.scss'],
})
export class TestComponent implements OnInit {
constructor(private heroService:HeroService) { }
ngOnInit(): void {
console.log(this.heroService.getHeroList())
}
}
```
也可以使用 `@Component` 或 `@Directive` 内部的 `providers: []`,为特定的组件子树提供服务,这也将导致创建多个服务实例(每个组件使用一个服务实例)
```js
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class TestService {
}
import { Component, OnInit } from '@angular/core';
import {HeroService} from '../hero.service'
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.scss'],
providers: [HeroService]
})
export class TestComponent implements OnInit {
constructor(private heroService:HeroService) { }
ngOnInit(): void {
console.log(this.heroService.getHeroList())
}
}
```
### 3.6 路由
路由就是连接组件的筋络,它也是树形结构的.有了它,就可以在angular中实现路径的导航模式
可以把路由看成是一组规则,它决定了url的变化对应着哪一种状态,具体表现就是不同视图的切换
在angular中,路由是非常重要的组成部分, 组件的实例化与销毁,模块的加载,组件的某些生命周期钩子的发起,都是与它有关
#### 3.6.1 路由基本使用
**路由器**是一个调度中心,它是一套规则的列表,能够查询当前URL对应的规则,并呈现出相应的视图.
**路由**是列表里面的一个规则,即路由定义,它有很多功能字段:
- **path**字段,表示该路由中的URL路径部分
- **Component**字段,表示与该路由相关联的组件
每个带路由的Angular应用都有一个路由器服务的单例对象,通过路由定义的列表进行配置后使用。
```js
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import {HomeComponent} from './home/home.component'
const routes: Routes = [
{path:'home',component:HomeComponent}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
```
```jsx
//路由导航
home
hello
//组件渲染输出
```
上述具体的工作流程,可以举例简单描述为:
- 当浏览器地址栏的URL变化时,路径部分`/home`满足了列表中path为"**home**"的这个路由定义,激活对应**HomeComponent**的实例,显示它的视图
- 当应用程序请求导航到路径`/hello`时,符合了另外的规则,激活对应视图且展示内容,并将该路径更新到浏览器地址栏和历史
#### 3.6.2 路由嵌套
父子路由嵌套配置:
```js
const routes: Routes = [
{path:'home',
component:HomeComponent,
children:[
{path:'hello',component:HelloComponent}
]
},
];
```
在**home Component**内这是`router-outlet`路由出口,即可在**home** 路由内渲染子级路由
```jsx
//home template
home Component
hello
```
在非`home Component`内跳转到`/home/hello`路由需要写全路径
```jsx
//app template
app Component
hello
```
#### 3.6.3 路由传参
- **query**
在a标签上添加一个参数queryParams,并通过`this.routerinfo.snapshot.queryParams`获取参数
```jsx
hello
```
```js
import {ActivatedRoute} from '@angular/router';
constructor(private routerinfo:ActivatedRoute) { }
ngOnInit() {
//id为参数名字
this.id=this.routerinfo.snapshot.queryParams["id"]
}
```
- **params**
修改路由配置文件`path`,路由导航`a`标签`routerLink`后面数组的第二个参数为传递的值
并且通过`subscribe`请阅的方式获取`name`参数
```js
{
path: 'hello/:name',
component:HelloComponent,
},
```
```jsx
//我们在后面添加/:name此时name即为传递的参数名字
//a标签设置如下
hello
```
```js
ngOnInit() {
this.routerinfo.params.subscribe((params:Params)=>{
this.name=params['name']
})
}
```
================================================
FILE: notes/Frontend/README.md
================================================
这里将是前端相关的项目目录
================================================
FILE: notes/Frontend/assets/README.md
================================================
这里是图片目录
================================================
FILE: notes/Frontend/前端知识体系.md
================================================
- [前端知识体系](#前端知识体系)
- [前端三要素](#前端三要素)
- [结构层(HTML)](#结构层html)
- [表现层(CSS)](#表现层css)
- [什么是 CSS 预处理器](#什么是-css-预处理器)
- [常用的 CSS 预处理器有哪些](#常用的-css-预处理器有哪些)
- [行为层(JavaScript)](#行为层javascript)
- [Native 原生 JS 开发](#native-原生-js-开发)
- [TypeScript 微软的标准](#typescript-微软的标准)
- [JavaScript 框架](#javascript-框架)
- [UI 框架](#ui-框架)
- [JavaScript 构建工具](#javascript-构建工具)
- [三端统一](#三端统一)
- [混合开发(Hybrid App)](#混合开发hybrid-app)
- [微信小程序](#微信小程序)
- [后端技术](#后端技术)
- [附:当前主流前端框架](#附当前主流前端框架)
- [Angular](#angular)
- [Angular Material](#angular-material)
- [Vue.js](#vuejs)
- [iView](#iview)
- [ElementUI](#elementui)
- [ICE](#ice)
- [VantUI](#vantui)
- [AtUI](#atui)
- [CubeUI](#cubeui)
- [混合开发](#混合开发)
- [Flutter](#flutter)
- [Ionic](#ionic)
- [微信小程序](#微信小程序-1)
- [mpvue](#mpvue)
- [WeUI](#weui)
# 前端知识体系
## 前端三要素
- HTML(结构):超文本标记语言(Hyper Text Markup Language),决定网页的结构和内容
- CSS(表现):层叠样式表(Cascading Style Sheets),设定网页的表现样式
- JavaScript(行为):是一种弱类型脚本语言,其源代码不需经过编译,而是由浏览器解释运行,用于控制网页的行为
### 结构层(HTML)
略
### 表现层(CSS)
CSS 层叠样式表是一门标记语言,并不是编程语言,因此不可以自定义变量,不可以引用等,换句话说就是不具备任何语法支持,它主要缺陷如下:
- 语法不够强大,比如无法嵌套书写,导致模块化开发中需要书写很多重复的选择器;
- 没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量的形式重复输出,导致难以维护;
这就导致了我们在工作中无端增加了许多工作量。为了解决这个问题,前端开发人员会使用一种称之为 **【CSS 预处理器】** 的工具,提供 CSS 缺失的样式层复用机制、减少冗余代码,提高样式代码的可维护性。大大提高了前端在样式上的开发效率。
#### 什么是 CSS 预处理器
CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行 CSS 的编码工作。转化成通俗易懂的话来说就是“**用一种专门的编程语言,进行 Web 页面样式设计,再通过编译器转化为正常的 CSS 文件,以供项目使用**”。
#### 常用的 CSS 预处理器有哪些
- SASS:基于 Ruby,通过服务端处理,功能强大。解析效率高。需要学习 Ruby 语言,上手难度高于 LESS。
- LESS:基于 NodeJS,通过客户端处理,使用简单。功能比 SASS 简单,解析效率也低于 SASS,但在实际开发中足够了,所以我们后台人员如果需要的话,建议使用 LESS。
### 行为层(JavaScript)
JavaScript 一门弱类型脚本语言,其源代码在发往客户端运行之前不需经过编译,而是将文本格式的字符代码发送给浏览器由浏览器解释运行。
#### Native 原生 JS 开发
原生 JS 开发,也就是让我们按照 **【ECMAScript】** 标准的开发方式,简称是 ES,特点是所有浏览器都支持。截止到当前博客发布时间(2018 年 12 月 04 日),ES 标准已发布如下版本:
- ES3
- ES4(内部,未正式发布)
- ES5(全浏览器支持)
- ES6(常用,当前主流版本)
- ES7
- ES8
- ES9(草案阶段)
区别就是逐步增加新特性。
#### TypeScript 微软的标准
TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。由安德斯·海尔斯伯格(C#、Delphi、TypeScript 之父;.NET 创立者)主导。
该语言的特点就是除了具备 ES 的特性之外还纳入了许多不在标准范围内的新特性,所以会导致很多浏览器不能直接支持 TypeScript 语法,需要编译后(编译成 JS)才能被浏览器正确执行。
#### JavaScript 框架
- jQuery:大家熟知的 JavaScript 框架,优点是简化了 DOM 操作,缺点是 DOM 操作太频繁,影响前端性能;在前端眼里使用它仅仅是为了兼容 IE6、7、8;
- Angular:Google 收购的前端框架,由一群 Java 程序员开发,其特点是将后台的 MVC 模式搬到了前端并增加了模块化开发的理念,与微软合作,采用 TypeScript 语法开发;对后台程序员友好,对前端程序员不太友好;最大的缺点是版本迭代不合理(如:1 代 -> 2 代,除了名字,基本就是两个东西;截止发表博客时已推出了 Angular8)。Angular 作为 Google 推出的一个“重型”的框架,内置包括路由、HTTP 等常用组件,同时深度集成 TypeScript,WebPack,RxJS,angular-cli 等工具,可以方便地进行大型前端项目的开发以及调试。但是由于 Angular 引入了许多概念,增加了新手上手的复杂性。特别是组件、模块、服务、指令、依赖注入的引入,对于新手而言,厘清其中各个概念的作用域是就不是一件容易的事情。同时 RxJS 的引入,也进一步使得学习曲线变得陡峭。
- React:Facebook 出品,一款高性能的 JS 前端框架;特点是提出了新概念 **【虚拟 DOM】** 用于减少真实 DOM 操作,在内存中模拟 DOM 操作,有效的提升了前端渲染效率;缺点是使用复杂,因为需要额外学习一门 **【JSX】** 语言;
- `Vue`:一款渐进式 JavaScript 框架,所谓渐进式就是逐步实现新特性的意思,如实现模块化开发、路由、状态管理等新特性。其特点是综合了 Angular(模块化) 和 React(虚拟 DOM) 的优点;
- `Axios`:前端通信框架;因为 `Vue` 的边界很明确,就是为了处理 DOM,所以并不具备通信能力,此时就需要额外使用一个通信框架与服务器交互;当然也可以直接选择使用 jQuery 提供的 AJAX 通信功能;
#### UI 框架
- Ant-Design:阿里巴巴出品,基于 React 的 UI 框架
- ElementUI:饿了么出品,基于 Vue 的 UI 框架
- Bootstrap:Twitter 推出的一个用于前端开发的开源工具包
- AmazeUI:又叫“妹子 UI”,一款 HTML5 跨屏前端框架
#### JavaScript 构建工具
- Babel:JS 编译工具,主要用于浏览器不支持的 ES 新特性,比如用于编译 TypeScript
- WebPack:模块打包器,主要作用是打包、压缩、合并及按序加载
**注:以上知识点已将 WebApp 开发所需技能全部梳理完毕**
## 三端统一
### 混合开发(Hybrid App)
主要目的是实现一套代码三端统一(PC、Android、iOS)并能够调用到设备底层硬件(如:传感器、GPS、摄像头等),打包方式主要有以下两种:
- 云打包:HBuild -> HBuildX,DCloud 出品;API Cloud
- 本地打包: Cordova(前身是 PhoneGap)
### 微信小程序
详见微信官网,这里就是介绍一个方便微信小程序 UI 开发的框架:WeUI
## 后端技术
前端人员为了方便开发也需要掌握一定的后端技术,但我们 Java 后台人员知道后台知识体系极其庞大复杂,所以为了方便前端人员开发后台应用,就出现了 NodeJS 这样的技术。
NodeJS 的作者已经声称放弃 NodeJS(说是架构做的不好再加上笨重的 node_modules,可能让作者不爽了吧),开始开发全新架构的 Deno
既然是后台技术,那肯定也需要框架和项目管理工具,NodeJS 框架及项目管理工具如下:
- Express:NodeJS 框架
- Koa:Express 简化版
- NPM:项目综合管理工具,类似于 Maven
- YARN:NPM 的替代方案,类似于 Maven 和 Gradle 的关系
## 附:当前主流前端框架
### Angular
#### Angular Material
Angular Material 是 Angular 官方团队维护的一个遵从 Material Design 的 Angular UI 库。它提供了丰富的组件库、CDK、以及内置主题,开箱即用,并且与 Angular 版本同步。
- [官网地址](https://material.angular.io/)
- [Github](https://github.com/angular/components)
#### ngx-admin
ngx-admin 是一款开源的 Angualr UI 库,目前仍处于维护和活跃状态。它也提供了丰富的开箱即用的组件库、内置主题,并且与 Angular 版本同步。代码风格遵循 Angular 最佳实践,也是一个不错的学习资源。
- [Github](https://github.com/akveo/ngx-admin)
### Vue.js
#### iView
iview 是一个强大的基于 Vue 的 UI 库,有很多实用的基础组件比 elementui 的组件更丰富,主要服务于 PC 界面的中后台产品。使用单文件的 Vue 组件化开发模式 基于 npm + webpack + babel 开发,支持 ES2015 高质量、功能丰富 友好的 API ,自由灵活地使用空间。
- [官网地址](https://www.iviewui.com/)
- [Github](https://github.com/TalkingData/iview-weapp)
- [iview-admin](https://github.com/iview/iview-admin)
**备注:属于前端主流框架,选型时可考虑使用,主要特点是移动端支持较多**
#### ElementUI
Element 是饿了么前端开源维护的 Vue UI 组件库,组件齐全,基本涵盖后台所需的所有组件,文档讲解详细,例子也很丰富。主要用于开发 PC 端的页面,是一个质量比较高的 Vue UI 组件库。
- [官网地址](http://element-cn.eleme.io/#/zh-CN)
- [Github](https://github.com/ElementUI/element-starter)
- [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
**备注:属于前端主流框架,选型时可考虑使用,主要特点是桌面端支持较多**
#### ICE
飞冰是阿里巴巴团队基于 React/Angular/Vue 的中后台应用解决方案,在阿里巴巴内部,已经有 270 多个来自几乎所有 BU 的项目在使用。飞冰包含了一条从设计端到开发端的完整链路,帮助用户快速搭建属于自己的中后台应用。
- [官网地址](https://alibaba.github.io/ice)
- [Github](https://github.com/alibaba/ice)
**备注:主要组件还是以 React 为主,截止 2019 年 02 月 17 日更新博客前对 Vue 的支持还不太完善,目前尚处于观望阶段**
#### VantUI
Vant UI 是有赞前端团队基于有赞统一的规范实现的 Vue 组件库,提供了一整套 UI 基础组件和业务组件。通过 Vant,可以快速搭建出风格统一的页面,提升开发效率。
- [官网地址](https://youzan.github.io/vant/#/zh-CN/intro)
- [Github](https://github.com/youzan/vant)
#### AtUI
at-ui 是一款基于 Vue 2.x 的前端 UI 组件库,主要用于快速开发 PC 网站产品。 它提供了一套 npm + webpack + babel 前端开发工作流程,CSS 样式独立,即使采用不同的框架实现都能保持统一的 UI 风格。
- [官网地址](https://at-ui.github.io/at-ui/#/zh)
- [Github](https://github.com/at-ui/at-ui)
#### CubeUI
cube-ui 是滴滴团队开发的基于 Vue.js 实现的精致移动端组件库。支持按需引入和后编译,轻量灵活;扩展性强,可以方便地基于现有组件实现二次开发。
- [官网地址](https://didi.github.io/cube-ui/#/zh-CN)
- [Github](https://github.com/didi/cube-ui/)
### 混合开发
#### Flutter
Flutter 是谷歌的移动端 UI 框架,可在极短的时间内构建 Android 和 iOS 上高质量的原生级应用。Flutter 可与现有代码一起工作, 它被世界各地的开发者和组织使用, 并且 Flutter 是免费和开源的。
- [官网地址](http://doc.flutter-dev.cn/)
- [Github](https://github.com/flutter/flutter)
**备注:Google 出品,主要特点是快速构建原生 APP 应用程序,如做混合应用该框架为必选框架**
#### Ionic
Ionic 既是一个 CSS 框架也是一个 Javascript UI 库,Ionic 是目前最有潜力的一款 HTML5 手机应用开发框架。通过 SASS 构建应用程序,它提供了很多 UI 组件来帮助开发者开发强大的应用。它使用 JavaScript MVVM 框架和 AngularJS/Vue 来增强应用。提供数据的双向绑定,使用它成为 Web 和移动开发者的共同选择。
- [官网地址](https://ionicframework.com/)
- [官网文档](https://ionicframework.com/docs/)
- [Github](https://github.com/ionic-team/ionic)
### 微信小程序
#### mpvue
mpvue 是美团开发的一个使用 `Vue.js` 开发小程序的前端框架,目前支持 **微信小程序**、**百度智能小程序**,**头条小程序** 和 **支付宝小程序**。 框架基于 `Vue.js`,修改了的运行时框架 `runtime` 和代码编译器 `compiler` 实现,使其可运行在小程序环境中,从而为小程序开发引入了 `Vue.js` 开发体验。
- [官网地址](http://mpvue.com/)
- [Github](https://github.com/Meituan-Dianping/mpvue)
**备注:完备的 Vue 开发体验,并且支持多平台的小程序开发,推荐使用**
#### WeUI
WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。包含 button、cell、dialog、toast、article、icon 等各式元素。
- [官网地址](https://weui.io/)
- [Github](https://github.com/weui/weui.git)
================================================
FILE: notes/Git.md
================================================
- [前言](#前言)
- [一、Git 简介](#一git-简介)
- [什么是版本控制系统](#什么是版本控制系统)
- [为什么需要版本 控制](#为什么需要版本-控制)
- [什么是版本控制系统](#什么是版本控制系统-1)
- [版本控制系统的发展史](#版本控制系统的发展史)
- [什么是 Git](#什么是-git)
- [如何安装 Git](#如何安装-git)
- [二、Git 常用命令速查](#二git-常用命令速查)
- [配置](#配置)
- [基础操作](#基础操作)
- [比对 diff](#比对-diff)
- [历史 log](#历史-log)
- [分支 branch](#分支-branch)
- [远程](#远程)
- [三、Git 常用场景](#三git-常用场景)
- [1. 删除本地文件后,想从远程仓库中重新Pull最新版文件](#1-删除本地文件后想从远程仓库中重新pull最新版文件)
- [2. 储藏与清理](#2-储藏与清理)
# 前言
这是一篇入门级使用指南,更多详细的请参考 [Git 官网电子书](https://git-scm.com/book/zh/v2)。
在这里将列举一些常用命令和场景解决方案,欢迎大家补充学习。
# 一、Git 简介
## 什么是版本控制系统
### 为什么需要版本 控制
在软件开发过程,每天都会产生新的代码,代码合并的过程中可能会出现如下问题:
- 代码被覆盖或丢失
- 代码写的不理想希望还原之前的版本
- 希望知道与之前版本的差别
- 是谁修改了代码以及为什么修改
- 发版时希望分成不同的版本(测试版、发行版等)
因此,我们希望有一种机制,能够帮助我们:
- 可以随时回滚到之前的版本
- 协同开发时不会覆盖别人的代码
- 留下修改记录,以便随时查看
- 发版时可以方便的管理不同的版本
### 什么是版本控制系统
一个标准的版本控制系统 Version Control System (VCS),通常需要有以下功能:
- 能够创建 Repository (仓库),用来保存代码
- 协同开发时方便将代码分发给团队成员
- 记录每次修改代码的内容、时间、原因等信息
- 能够创建 Branch (分支),可以根据不同的场景进行开发
- 能够创建 Tag (标签),建立项目里程碑
### 版本控制系统的发展史
版本控制系统发展至今有几种不同的模式:
**Local VCS**
本地使用 `复制/粘贴` 的方式进行管理,缺点是无法协同开发
**Centralized VCS (Lock,悲观锁)**
中央集中式版本控制系统团队共用仓库,当某人需要编辑文件时,进行锁定,以免其他人同时编辑时造成冲突。缺点是虽然避免了冲突,但不是很方便。其他人需要排队才能编辑文件,如果有人编辑了很久或是忘记解锁就会造成其他人长时间等待的情况。
**Centralized VCS (Merge,乐观锁)**
中央集中式版本控制系统团队共用仓库,不采用悲观锁方式来避免冲突,而是事后发现如果别人也修改相同文件(冲突),再进行手动修改解决。有很多 VCS 属于这种类型,如:CVS,Subversion,Perforce 等
中央集中式版本控制系统的共同问题是,做任何操作都需要和服务器同步,如果服务器宕机则会造成无法继续工作的窘迫。
**Distributed VCS**
分布式版本控制系统,本地也拥有完整的代码仓库,就不会出现上述集中式管理的问题,即使没有网络,依然可以 `commit` 和看 `log`,也无需担心服务器同步问题。如:Git,Mercurial,Bazaar 等就属于分布式版本控制系统。缺点是功能比较复杂,上手需要一定的学习时间。
## 什么是 Git
- Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
- Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
- Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
## 如何安装 Git
- Git 官网下载地址:[Git 版本管理工具](https://git-scm.com/downloads)
- 客户端推荐:[SourceTree](https://www.sourcetreeapp.com/),软件安装跳过注册,[请参考这里](https://www.cnblogs.com/lucio110/p/8192792.html?tdsourcetag=s_pcqq_aiomsg)
# 二、Git 常用命令速查
一图胜千言

推荐一个不错的可视化工具:[Git Cheat Sheet](http://ndpsoftware.com/git-cheatsheet.html)
## 配置
设置提交者姓名
```shell
$ git config --global user.name "John Doe"
```
设置提交者邮箱
```shell
$ git config --global user.email johndoe@example.com
```
查看配置列表
```shell
$ git config --list
```
## 基础操作
在指定目录创建仓库,如果没有指定目录名将在当前目录创建仓库
```shell
$ git init [目录名]
# 当前文件夹初始化
$ git init .
# 指定目录
$ git init frank
```
从指定地址克隆仓库,若不指定`目录名`将默认创建与远程同名目录
```shell
$ git clone <远程仓库地址> [目录名]
# 不想创建目录,目录名为 . ,直接加在内容到当前目录下
$ git clone https://github.com/frank-lam/2019_campus_apply.git .
```
将文件或目录中已修改的代码添加追暂存区
```shell
$ git add <目录名|文件名>
```
提交暂存区内容
```shell
$ git commit -m "<注释>"
```
查看仓库状态
```shell
$ git status
```
## 比对 diff
比对当前内容和暂存区内容
```shell
$ git diff
```
比对当前内容和最近一次提交
```shell
$ git diff HEAD
```
比对当前内容和倒数第二次提交
```shell
$ git diff HEAD^
```
比对最近两次提交
```shell
$ git diff HEAD^ HEAD
```
## 历史 log
查看提交历史
```shell
$ git log --oneline
```
打印为单行log
```shell
$ git log --oneline
```
打印所有记录(忽略HEAD的位置)
```shell
$ git log --all
```
打印示意图(忽略HEAD的位置)
```shell
$ git log --graph
```
## 分支 branch
查看所有分支
```shell
$ git branch
```
有分支:创建分支,无分支:列出所有分支
```shell
$ git branch [分支]
```
切换至分支
```shell
$ git checkout <分支>
```
创建并切换至分支分支
```shell
$ git checkout -b <分支>
```
将分支与当前分支合并
```shell
$ git merge <分支>
```
## 远程
拉取远程仓库
```shell
$ git pull
```
推送至远程仓库
```shell
$ git push <远程仓库> <分支>
```
新增远程仓库 origin
```shell
$ git remote add origin https://xxx.git
```
修改远程仓库 origin
```shell
$ git remote set-url origin https://xxx.git
```
# 三、Git 常用场景
## 1. 删除本地文件后,想从远程仓库中重新 Pull 最新版文件
Git提示:up-to-date,但未得到删除的文件
原因:当前本地库处于另一个分支中,需将本分支发 Head 重置至 master
```bash
$ git checkout master
$ git reset --hard
```
git 强行 pull 并覆盖本地文件
```shell
$ git fetch --all
$ git reset --hard origin/master
$ git pull
```
## 2. 储藏与清理
应用场景:
1. 当正在 dev 分支上开发某个项目,这时项目中出现一个 bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用 git stash 命令将修改的内容保存至堆栈区,然后顺利切换到 hotfix 分支进行 bug 修复,修复完成后,再次切回到 dev 分支,从堆栈中恢复刚刚保存的内容。
2. 由于疏忽,本应该在 dev 分支开发的内容,却在 master 上进行了开发,需要重新切回到 dev 分支上进行开发,可以用 git stash 将内容保存至堆栈中,切回到 dev 分支后,再次恢复内容即可。
总的来说,git stash 命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash 中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash 作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
- [Git - 储藏与清理](https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%E4%B8%8E%E6%B8%85%E7%90%86)
- [git stash详解 - stone_yw的博客 - CSDN博客](https://blog.csdn.net/stone_yw/article/details/80795669)
## 3. SSH 连接配置
### 1. 生成密钥对
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。首先你要确认一下本机是否已经有一个公钥。
SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。进去看看:
```shell
$ cd ~/.ssh
$ ls
authorized_keys2 id_dsa known_hosts config id_dsa.pub
```
看一下有没有id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之类成对的文件),有 .pub 后缀的文件就是公钥,另一个文件则是密钥。
假如没有这些文件,甚至连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在 Linux/Mac 系统上由 SSH 包提供,而在 Windows 上则包含在 MSysGit 包里:
```shell
$ ssh-keygen -t rsa -C "your_email@youremail.com"
Creates a new ssh key using the provided email # Generating public/private rsa key pair.
Enter file in which to save the key (/home/you/.ssh/id_rsa):
```
直接按Enter就行。然后,会提示你输入密码,如下(建议输一个,安全一点,当然不输也行,应该不会有人闲的无聊冒充你去修改你的代码):
```shell
Enter same passphrase again: [Type passphrase again]
```
完了之后,大概是这样:
```shell
Your public key has been saved in /home/you/.ssh/id_rsa.pub.
The key fingerprint is: # 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@youremail.com
```
到此为止,你本地的密钥对就生成了。
(9+条消息)Mac OS 配置多个ssh-key - maoxinwen1的博客 - CSDN博客
https://blog.csdn.net/maoxinwen1/article/details/80269299
### 2. 添加公钥到你的远程仓库(github)
1. 查看你生成的公钥:
```
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0X6L1zLL4VHuvGb8aJH3ippTozmReSUzgntvk434aJ/v7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8vR3c8E7CjZN733f5AL8uEYJA+YZevY5UCvEg+umT7PHghKYaJwaCxV7sjYP7Z6V79OMCEAGDNXC26IBMdMgOluQjp6o6j2KAdtRBdCDS/QIU5THQDxJ9lBXjk1fiq9tITo/aXBvjZeD+gH/Apkh/0GbO8VQLiYYmNfqqAHHeXdltORn8N7C9lOa/UW3KM7QdXo6J0GFlBVQeTE/IGqhMS5PMln3 admin@admin-PC
```
2. 登陆你的 GitHub 帐户。点击你的头像,然后 `Settings -> 左栏点击 SSH and GPG keys -> 点击 New SSH key`
3. 然后你复制上面的公钥内容,粘贴进“Key”文本域内。 title域,自己随便起个名字。
4. 点击 Add key。
完成以后,验证下这个key是不是正常工作:
```shell
$ ssh -T git@github.com
Attempts to ssh to github
```
如果,看到:
```
Hi xxx! You've successfully authenticated, but GitHub does not # provide shell access.
```
恭喜你,你的设置已经成功了。
### 3. 修改git的remote url
使用命令 git remote -v 查看你当前的 remote url
```shell
$ git remote -v
origin https://github.com/someaccount/someproject.git (fetch)
origin https://github.com/someaccount/someproject.git (push)
```
如果是以上的结果那么说明此项目是使用https协议进行访问的(如果地址是git开头则表示是git协议)
你可以登陆你的github,就像本文开头的图例,你在上面可以看到你的ssh协议相应的url,类似:

复制此ssh链接,然后使用命令 git remote set-url 来调整你的url。
```shell
$ git remote set-url origin git@github.com:someaccount/someproject.git
```
然后你可以再用命令 git remote -v 查看一下,url是否已经变成了ssh地址。
然后你就可以愉快的使用 git fetch, git pull , git push,再也不用输入烦人的密码了
### 4. 常见问题
- [Git 提交大文件提示 fatal: The remote end hung up unexpectedly - WNFK - 博客园](https://www.cnblogs.com/hanxianlong/p/3464224.html)
## 4. Git 记住密码
- [Git Pull 避免用户名和密码方法 - 王信平 - 博客园](https://www.cnblogs.com/wangshuo1/p/5531200.html)
## 5. Git FTP 使用
利用Git版本管理将只修改过的文件上传到FTP服务器 支持SFTP协议 - 吕滔博客
https://lvtao.net/tool/gitftp.html
## 6. Git 删除文件如何提交
## 7. Git 中的 origin 是什么意思
git学习:关于origin和master - mashiqi - 博客园
https://www.cnblogs.com/mashiqi/p/6002671.html
Git 里面的 origin 到底代表啥意思? - Not Only DBA. - CSDN博客
https://blog.csdn.net/u011478909/article/details/77683754
## 8. Git 回退到制定版本
**回滚到指定的版本**
```shell
git reset --hard e377f60e28c8b84158
```
**强制提交**
```shell
git push -f origin master
```
================================================
FILE: notes/Git命令速查.md
================================================
# Git 命令速查
> 本文参考极客时间苏玲老师的《玩转Git三剑客》
## 添加配置
```bash
git config [--local | --global | --system] user.name 'Your name'
git config [--local | --global | --system] user.email 'Your email'
```
## 查看配置
```bash
git config --list [--local | --global | --system]
```
### 区别
```bash
local:区域为本仓库
global: 当前用户的所有仓库
system: 本系统的所有用户
```
## `git add .` 和 `git add -u`区别
```bash
git add . :将工作空间新增和被修改的文件添加的暂存区
git add -u :将工作空间被修改和被删除的文件添加到暂存区(不包含没有纳入Git管理的新增文件)
```
## 创建仓库
```bash
git init [project folder name] 初始化 git 仓库
git add [fileName] 把文件从工作目录添加到暂存区
git commit -m'some information' 用于提交暂存区的文件
git commit -am'Some information' 用于提交跟踪过的文件
git log 查看历史
git status 查看状态
```
**额外**
git add -u 可以添加所有已经被 git 控制的文件到暂存区
以前删除文件夹只会用 「-rf」,今天学到了 「-r」,并得知它们两个区别:「-r」 有时候会提示是否确认删除。
## 给文件重命名的简便方法
```bash
git mv [old file name] [new file name]
git commit -m 'some information'
```
## 通过`git log`查看版本演变历史
```bash
git log --all 查看所有分支的历史
git log --all --graph 查看图形化的 log 地址
git log --oneline 查看单行的简洁历史。
git log --oneline -n4 查看最近的4条简洁历史。
git log --oneline --all -n4 --graph 查看所有分支最近4条单行的图形化历史。
git help --web log 跳转到git log 的帮助文档网页
```
```bash
git branch -v 查看本地有多少分支
```
## 通过图形界面工具来查看版本历史
```bash
gitk
```
## 探密`.git`目录
查看`.git`文件夹下的内容:
```bash
ls .git/ -al
```
如下:
```shell
drwxr-xr-x 1 Andy 197609 0 12月 17 22:38 ./
drwxr-xr-x 1 Andy 197609 0 12月 17 21:50 ../
-rw-r--r-- 1 Andy 197609 7 12月 17 22:38 COMMIT_EDITMSG
-rw-r--r-- 1 Andy 197609 301 12月 12 22:55 config
-rw-r--r-- 1 Andy 197609 73 12月 12 22:55 description
-rw-r--r-- 1 Andy 197609 96 12月 19 00:00 FETCH_HEAD
-rw-r--r-- 1 Andy 197609 23 12月 12 22:55 HEAD
drwxr-xr-x 1 Andy 197609 0 12月 12 22:55 hooks/
-rw-r--r-- 1 Andy 197609 249 12月 17 22:38 index
drwxr-xr-x 1 Andy 197609 0 12月 12 22:55 info/
drwxr-xr-x 1 Andy 197609 0 12月 12 22:55 logs/
drwxr-xr-x 1 Andy 197609 0 12月 17 22:38 objects/
-rw-r--r-- 1 Andy 197609 114 12月 12 22:55 packed-refs
drwxr-xr-x 1 Andy 197609 0 12月 12 22:55 refs/
```
```bash
cat命令主要用来查看文件内容,创建文件,文件合并,追加文件内容等功能。
cat HEAD 查看HEAD文件的内容
git cat-file 命令 显示版本库对象的内容、类型及大小信息。
git cat-file -t b44dd71d62a5a8ed3 显示版本库对象的类型
git cat-file -s b44dd71d62a5a8ed3 显示版本库对象的大小
git cat-file -p b44dd71d62a5a8ed3 显示版本库对象的内容
```
`.git`里几个常用的如下:
```bash
HEAD:指向当前的工作路径
config:存放本地仓库(local)相关的配置信息。
refs/heads: 存放分支
refs/heads/master/: 指向master分支最后一次commit
refs/tags: 存放tag,又叫里程牌 (当这次commit是具有里程碑意义的 比如项目1.0的时候 就可以打tag)
objects:核心文件,存储文件
```
.git/objects/ 存放所有的 git 对象,对象哈希值前 2 位作为文件夹名称,后 38 位作为对象文件名, 可通过 git cat-file -p 命令,拼接文件夹名称+文件名查看。
## `commit`、`tree`和`blob`三个对象之间的关系

```bash
commit: 提交时的镜像
tree: 文件夹
blob: 文件
```
**【同学问题】** 每次commit,git 都会将当前项目的所有文件夹及文件快照保存到objects目录,如果项目文件比较大,不断迭代,commit无数次后,objects目录中文件大小是不是会变得无限大?
**【老师解答】** Git对于内容相同的文件只会存一个blob,不同的commit的区别是commit、tree和有差异的blob,多数未变更的文件对应的blob都是相同的,这么设计对于版本管理系统来说可以省很多存储空间。其次,Git还有增量存储的机制,我估计是对于差异很小的blob设计的吧。
## `分离头指针`情况下的注意事项
detached HEAD
## 进一步理解`HEAD`和`branch`
```bash
git checkout -b new_branch [具体分支 或 commit] 创建新分支并切换到新分支
git diff HEAD HEAD~1 比较最近两次提交
git diff HEAD HEAD~2 比较最近和倒数第三次提交
git diff HEAD HEAD^ 比较最近两次提交
git diff HEAD HEAD^^ 比较最近和倒数第三次提交
```
## 怎么删除不需要的分支?
查看分支:
```bash
git branch -av
```
删除分支命令:
```bash
git branch -d [branch name] 删除
git branch -D [branch name] 强制删除
```
## 怎么修改最新 commit 的 message?
```bash
git commit --amend 对最近一次的commit信息进行修改
```
## 怎么修改老旧 commit 的 message?
```bash
git rebase -i [要更改的commit的上一级commit]
```
接下来就是一个交互过程...
这期间会产生一个detached HEAD,然后将改好的commit指向该detached HEAD,如下图所示:

**git rebase工作的过程中,就是用了分离头指针。rebase意味着基于新base的commit来变更部分commits。它处理的时候,把HEAD指向base的commit,此时如果该commit没有对应branch,就处于分离头指针的状态,然后重新一个一个生成新的commit,当rebase创建完最后一个commit后,结束分离头状态,Git让变完基的分支名指向HEAD。**
## 怎样把连续的多个commit整理成1个?
```bash
git rebase -i [要更改的commit的上一级commit]
```
```bash
$ git log --graph
* commit 7d3386842a2168ae630b65f687364243139c893c (HEAD -> master, origin/master, origin/HEAD)
| Author: aimuch
| Date: Thu Dec 20 23:34:18 2018 +0800
|
| update
|
* commit 9eb3188bbc63cae1bfed5f9dfc1593019e360a6a
| Author: aimuch
| Date: Wed Dec 19 20:30:14 2018 +0800
|
| update
|
* commit bbe6d53e2b477f2d2aa402af7f315ecdfc63459e
| Author: aimuch
| Date: Wed Dec 19 20:12:29 2018 +0800
|
| update
|
* commit 7735d66ded7f98adeca93d96fb7be12ffb67c76a
| Author: aimuch
| Date: Wed Dec 19 00:27:00 2018 +0800
|
| update
|
* commit d9f9d115fab425b5654f8ccfec6a996aef35b76b
| Author: aimuch
| Date: Wed Dec 19 00:23:36 2018 +0800
|
| update
```
```bash
pick 7735d66 update #合并到该commit上
squash bbe6d53 update
squash 9eb3188 update
squash 7d33868 update
# Rebase d9f9d11..7d33868 onto d9f9d11 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop = remove commit
# l, label