├── .gitignore ├── LICENSE ├── README.md ├── config.example.php ├── convert.sh ├── courses.php ├── courses ├── Android │ └── Android应用开发基础 │ │ ├── 0.Hello World.md │ │ ├── 1.基础组件(1) - Activity.md │ │ ├── 2.Android UI编程.md │ │ ├── 3.事件处理与内部通信.md │ │ ├── 4.基础组件(2) - Service.md │ │ ├── 5.基础组件(3) - Content Provider.md │ │ ├── 6.基础组件(4) - Broadcast Receiver.md │ │ └── 7.资源调用.md ├── C&C++ │ ├── 3 个 C 语言实例带你掌握递归方法论 │ │ └── 递归方法论.md │ ├── C 语言实现 LRU 缓存 │ │ └── 0.C 语言实现 LRU 缓存.md │ ├── C 语言实现 linux pwd 命令 │ │ └── 0.C 语言实现 linux pwd 命令.md │ ├── C++ 实现基数树 radix tree │ │ ├── 0.实现节点和迭代器.md │ │ ├── 1.实现 radix_tree.md │ │ └── 2.编写测试范例.md │ ├── C++ 实现太阳系行星系统 │ │ ├── 0.基本框架设计.md │ │ └── 1.编码实现.md │ ├── C++ 实现智能指针 │ │ ├── 0.智能指针的雏形.md │ │ ├── 1.拷贝与赋值.md │ │ ├── 2.引用计数技术.md │ │ └── 3.解引用、判空以及比较.md │ ├── C++ 开发 Web 服务框架 │ │ ├── 0.基础知识:C++11 与 Boost Asio.md │ │ ├── 1.HTTP Web 框架的设计与实现.md │ │ └── 2.HTTPS Web 框架的设计与实现.md │ ├── C++ 编写 json 生成器 │ │ ├── 0.介绍.md │ │ └── 1.实现.md │ ├── C++11&14 高速上手教程 │ │ ├── 0.C++11&14 简介.md │ │ ├── 1.语言可用性的强化.md │ │ ├── 2.语言运行期的强化.md │ │ ├── 3.对标准库的扩充 │ │ ├── 4.对标准库的扩充 │ │ ├── 5.对标准库的扩充 │ │ ├── 6.对标准库的扩充 │ │ ├── 7.其他杂项.md │ │ └── 8.扩展主题 │ ├── C++基于OpenCV实现实时监控和运动检测记录 │ │ └── 0.实现摄像头实时监控及运动检测记录视频.md │ ├── C语言入门教程 │ │ ├── 0.为什么是c-因为你无可替代.md │ │ ├── 1.开发环境和剖析第一个c语言.md │ │ ├── 10.指针(二).md │ │ ├── 11.文件与文件的输入与输出.md │ │ ├── 2.顺序程序设计-数据类型(一).md │ │ ├── 3.顺序程序设计-数据类型(二).md │ │ ├── 4.顺序程序设计-运算符和数据转换.md │ │ ├── 5.选择程序设计.md │ │ ├── 6.循环程序设计.md │ │ ├── 7.c语言数组.md │ │ ├── 8.模块化程序设计.md │ │ └── 9.指针(一).md │ ├── C语言制作2048 │ │ └── 0.c语言制作2048.md │ ├── C语言制作简单计算器 │ │ └── 0.c语言制作简单计算器.md │ ├── C语言实现大数计算器(加减乘除) │ │ └── 0.C语言实现大数计算器.md │ ├── C语言快速实现五子棋 │ │ ├── 0.快速实验五子棋.md │ │ └── 1.修复BUG.md │ ├── Linux系统编程 │ │ ├── 0.课程介绍.md │ │ ├── 1.GCC的使用.md │ │ ├── 2.gdb使用.md │ │ ├── 3.Makefile使用.md │ │ ├── 4.文件IO(一).md │ │ ├── 5.文件IO(二).md │ │ ├── 6.多进程(一).md │ │ ├── 7.多进程(二).md │ │ └── 8.多进程(三).md │ ├── ffmpeg 结合 SDL 编写播放器 │ │ ├── 0.安装配置ffmpeg.md │ │ └── 1.ffmpeg 结合sdl 播放视频.md │ ├── 使用 OpenCV 进行图片平滑处理打造模糊效果 │ │ ├── 0.通过平滑处理打造图片模糊效果.md │ │ └── 1.深度了解四种滤波器详情.md │ ├── 使用 OpenCV&&C++ 进行模板匹配 │ │ └── 0.使用 OpenCV&&C++ 进行模板匹配.md │ ├── 数据结构(新版) │ │ ├── 0.基本概念.md │ │ ├── 1.线性结构-线性表.md │ │ ├── 2.线性结构-栈和队列.md │ │ ├── 3.非线性结构-树.md │ │ ├── 4.非线性结构-图.md │ │ ├── 5.查找.md │ │ ├── 6.插入排序.md │ │ ├── 7.交换排序.md │ │ ├── 8.选择排序.md │ │ └── 9.归并排序和基数排序.md │ ├── 新手指南之玩转实验楼 │ │ ├── 0.Hello World!.md │ │ └── 1.Hello,ShiYanLou!.md │ ├── 用 C语言编写自己的编程语言 │ │ ├── 0.介绍.md │ │ ├── 1.编程语言.md │ │ ├── 10.更好的语言.md │ │ ├── 2.树的计算.md │ │ ├── 3.错误处理.md │ │ ├── 4.s_expression.md │ │ ├── 5.q_expression.md │ │ ├── 6.变量.md │ │ ├── 7.函数.md │ │ ├── 8.条件判断.md │ │ └── 9.字符串.md │ └── 软件工程(C编码实践篇) │ │ ├── 0.实验一:写一个hello world小程序.md │ │ ├── 1.实验二:命令行菜单小程序V1.0,具体要求参见视频.md │ │ ├── 2.实验三:内部模块化的命令行菜单小程序V2.0.md │ │ ├── 3.实验四:用可重用的链表模块来实现命令行菜单小程序V2.5.md │ │ ├── 4.实验五:用callback增强链表模块来实现命令行菜单小程序V2.8.md │ │ ├── 5.实验六:函数的可重入性(reentrant)及线程安全.md │ │ └── 6.实验七:将menu设计为可重用的子系统.md ├── GO │ ├── GO语言开发2048 │ │ └── 0.GO语言开发2048.md │ ├── Go by Example 中文版 │ │ ├── 0.课程说明与学习方法.md │ │ ├── 1.值,变量,常量.md │ │ ├── 10.定时器,打点器,工作池,速率限制,原子计数器.md │ │ ├── 11.互斥锁,Go状态协程.md │ │ ├── 12.排序,使用函数自定义排序,Panic,Defer.md │ │ ├── 13.组合函数,字符串函数,字符串格式化.md │ │ ├── 14.正则表达式,JSON.md │ │ ├── 15.时间,时间戳,时间的格式化和解析.md │ │ ├── 16.随机数,数字解析,URL解析.md │ │ ├── 17.SHA1散列,Base64编码.md │ │ ├── 18.读文件,写文件,行过滤器.md │ │ ├── 19.命令行参数,命令行标志,环境变量.md │ │ ├── 2.For循环,if&else分支,分支结构.md │ │ ├── 20.生成进程,执行进程,信号,退出.md │ │ ├── 3.数组,切片,关联数组,Range遍历.md │ │ ├── 4.函数,多返回值,变参函数.md │ │ ├── 5.闭包,递归.md │ │ ├── 6.指针,结构体,方法,接口.md │ │ ├── 7.错误处理,协程.md │ │ ├── 8.通道,通道缓冲,通道同步,通道方向,通道选择器.md │ │ └── 9.超时处理,非阻塞通道操作,通道的关闭,通道遍历.md │ ├── Golang实现简单tcp服务器 │ │ ├── 0.概述.md │ │ ├── 1.用Golang实现 echo服务器&客户端.md │ │ ├── 2.聊天服务器&客户端实现.md │ │ └── 3.服务器粘包处理.md │ ├── Go语言实现WebSocket协议 │ │ └── 0.WebSocket协议实现.md │ ├── Go语言实现缓存系统 │ │ └── 0.缓存组件的实现.md │ ├── Go语言编程 │ │ ├── 0.Go语言介绍.md │ │ ├── 1.Go语言基础和数值布尔类型.md │ │ ├── 2.Go语言字符串.md │ │ ├── 3.Go语言复合类型.md │ │ ├── 4.Go语言过程式编程.md │ │ ├── 5.Go语言面向对象编程.md │ │ └── 6.Go语言包和词频统计.md │ ├── 《o语言实战 》快速开始一个Go程序 │ │ └── 快速开始一个Go程序.md │ ├── 制作Markdown预览器 │ │ └── 0.Go语言制作Markdown预览器.md │ └── 基于GO语言Revel框架和mgo的博客 │ │ ├── 0.博客的首页与投稿设计.md │ │ ├── 1.评论和留言板功能.md │ │ └── 2.归档和提醒功能.md ├── Git │ ├── Git 实战教程 │ │ ├── 0.git介绍.md │ │ ├── 1.基本用法(上).md │ │ ├── 2.基本用法(下).md │ │ ├── 3.中级技能(上).md │ │ ├── 4.中级技能(下).md │ │ └── 5.高级技能.md │ └── 使用Githook实现团队CodingReview流程 │ │ ├── 0.Git钩子:定制工作流.md │ │ ├── 1.Hook实战:编写动作脚本.md │ │ └── 2.使用Hook将代码版本变动信息通过邮件发送.md ├── HTML5 │ ├── HTML5 本地裁剪图片 │ │ └── 0.HTML5 本地裁剪图片.md │ ├── HTML5两步实现拼图游戏 │ │ └── 0.HTML5两步实现拼图游戏.md │ ├── HTML5基础入门 │ │ ├── 0.认识HTML5.md │ │ ├── 1.HTML5的新的结构元素介绍.md │ │ ├── 2.增强型表单标签.md │ │ ├── 3.HTML5文件操作API.md │ │ ├── 4.Canvas绘图API.md │ │ └── 5.HTML5本地存储和本地数据库.md │ └── HTML5的Canvas小游戏 │ │ └── 0.HTML5 Canvas小游戏.md ├── Hadoop │ ├── HBASE教程 │ │ ├── 0.HBase简介.md │ │ ├── 1.HBase安装配置.md │ │ ├── 2.HBase 基本操作.md │ │ └── 3.HBase应用程序开发.md │ ├── HIVE教程 │ │ ├── 0.Hive 简介.md │ │ ├── 1.Hive 安装配置.md │ │ ├── 2.Hive 基本操作.md │ │ ├── 3.Hive数据导入&导出.md │ │ └── 4.Hive 接口介绍(Web UI&JDBC).md │ ├── Hadoop入门进阶课程 │ │ ├── 0.Hadoop介绍及1.X伪分布式安装.md │ │ ├── 1.Hadoop2.X 64位编译.md │ │ ├── 10.Sqoop介绍、安装与操作.md │ │ ├── 11.Flume介绍与安装.md │ │ ├── 12.Chukwa介绍与安装部署.md │ │ ├── 2.Hadoop2.X 64位环境搭建.md │ │ ├── 3.HDFS原理及操作.md │ │ ├── 4.MapReduce原理及操作.md │ │ ├── 5.MapReduce应用案例.md │ │ ├── 6.Pig介绍、安装与应用案例.md │ │ ├── 7.Hive介绍和安装部署.md │ │ ├── 8.Mahout介绍、安装与应用案例.md │ │ └── 9.HBase介绍、安装与应用案例.md │ ├── Hadoop分布式文件系统——导入和导出数据 │ │ └── 0.Hadoop分布式文件系统——导入和导出数据.md │ ├── Hadoop图处理 │ │ └── 0.Hadoop图处理.md │ ├── Hadoop部署及管理 │ │ ├── 0.Hadoop课程介绍.md │ │ ├── 1.Hadoop单机模式安装.md │ │ └── 2.Hadoop伪分布模式配置部署.md │ ├── Kafka快速上手教程 │ │ ├── 0.kafka介绍与实践.md │ │ ├── 1.使用Java操作Kafka.md │ │ ├── 2.Kafka集成Flume.md │ │ ├── 3.Java测试Flume与Kafka的连通.md │ │ └── 4.KafkaOffsetMonitor安装及使用.md │ ├── Mahout教程 │ │ ├── 0.Mahout 简介.md │ │ ├── 1.Mahout 安装配置.md │ │ ├── 2.Mahout 聚类算法.md │ │ └── 3.Mahout 分类算法.md │ ├── MapReduce分析Youtube数据 │ │ └── 0.MapReduce分析Youtube数据.md │ ├── Spark流式计算电商商品关注度 │ │ └── 0.基于Spark实时计算商品关注度.md │ └── 使用Flume收集数据 │ │ └── 0.使用Flume收集数据.md ├── Java │ ├── Hadoop入门进阶课程 │ │ ├── 0.Hadoop介绍及1.X伪分布式安装.md │ │ ├── 1.Hadoop2.X 64位编译.md │ │ ├── 10.Sqoop介绍、安装与操作.md │ │ ├── 11.Flume介绍与安装.md │ │ ├── 12.Chukwa介绍与安装部署.md │ │ ├── 2.Hadoop2.X 64位环境搭建.md │ │ ├── 3.HDFS原理及操作.md │ │ ├── 4.MapReduce原理及操作.md │ │ ├── 5.MapReduce应用案例.md │ │ ├── 6.Pig介绍、安装与应用案例.md │ │ ├── 7.Hive介绍和安装部署.md │ │ ├── 8.Mahout介绍、安装与应用案例.md │ │ └── 9.HBase介绍、安装与应用案例.md │ ├── Hibernate框架教程 │ │ ├── 0.Hibernate 简介.md │ │ ├── 1.Hibernate 简单增删改查.md │ │ ├── 2.Hibernate - EJB注解映射.md │ │ ├── 3.Hibernate - HQL 查询.md │ │ ├── 4.Hibernate - 一对多.md │ │ ├── 5.Hibernate - 多对一.md │ │ └── 6.Hibernate - 多对多.md │ ├── J2SE核心开发实战 │ │ ├── 0.认识J2SE.md │ │ ├── 1.字符串与包装类.md │ │ ├── 2.集合类框架.md │ │ ├── 3.数学工具.md │ │ ├── 4.错误处理.md │ │ ├── 5.输入输出.md │ │ ├── 6.枚举和泛型.md │ │ ├── 7.Swing入门.md │ │ └── 8.多线程编程.md │ ├── JDBC 入门教程 │ │ ├── 0.认识 JDBC.md │ │ ├── 1.JDBC 基础.md │ │ ├── 2.JDBC 接口.md │ │ ├── 3.JDBC 结果集.md │ │ ├── 4.JDBC 数据类型与事务.md │ │ └── 5.JDBC 的处理.md │ ├── JDK 核心 API │ │ ├── 0.java.lang 包.md │ │ ├── 1.java.util 包.md │ │ ├── 2.Java 集合框架.md │ │ ├── 3.java.io 包——字节流.md │ │ ├── 4.java.io 包——字符流.md │ │ ├── 5.文件操作&随机访问文件.md │ │ └── 6.泛型.md │ ├── Java 8 新特性指南 │ │ ├── 0.Lambda表达式的含义及使用方法、方法引用.md │ │ ├── 1.函数式接口、默认方法和 Optional 类.md │ │ ├── 2.Streams(流).md │ │ └── 3.Data&Time API 和 Base64 编码.md │ ├── Java 实现微信红包分配算法 │ │ └── 0.java 实现微信红包分配算法.md │ ├── Java 编写数独计算器 │ │ ├── 0.核心算法.md │ │ └── 1.编写界面.md │ ├── Java实现在线协作文档编辑 │ │ └── 0.Java实现在线协作文档编辑.md │ ├── Java实现记事本 │ │ └── 0.Java实现记事本.md │ ├── Java开发简单的计算器 │ │ └── 0.Java版图形界面计算器.md │ ├── Java编程语言(新版) │ │ ├── 0.认识 Java.md │ │ ├── 1.Java 语言基础.md │ │ ├── 2.Java 运算符.md │ │ ├── 3.Java 控制语句.md │ │ ├── 4.Java 数组.md │ │ ├── 5.Java 方法.md │ │ ├── 6.Java 类与对象.md │ │ ├── 7.Java 封装.md │ │ ├── 8.Java 继承.md │ │ └── 9.Java 多态.md │ ├── Java进阶之设计模式 │ │ ├── 0.设计模式简介.md │ │ ├── 1.工厂模式.md │ │ ├── 2.抽象工厂模式.md │ │ ├── 3.适配器模式.md │ │ ├── 4.装饰者模式.md │ │ ├── 5.观察者模式.md │ │ └── 6.单例模式.md │ ├── MyBatis框架基础入门 │ │ ├── 0.MyBatis简介.md │ │ ├── 1.入门程序.md │ │ ├── 2.配置文件.md │ │ ├── 3.映射文件.md │ │ ├── 4.关联映射之一对一.md │ │ ├── 5.关联映射之一对多.md │ │ ├── 6.关联映射之多对多.md │ │ ├── 7.动态SQL.md │ │ └── 8.注解.md │ ├── SSH框架实现简单的在线考试系统 │ │ └── 0.SSH实现简单的在线考试系统.md │ ├── SSM+easyUI搭建简易的人事管理系统 │ │ ├── 0.系统分析.md │ │ ├── 1.项目环境搭建.md │ │ ├── 10.运行测试与总结.md │ │ ├── 11.附录:项目工程导入及问题解决.md │ │ ├── 2.数据库设计实现.md │ │ ├── 3.持久化实体.md │ │ ├── 4.DAO层实现.md │ │ ├── 5.Service层实现.md │ │ ├── 6.Spring与MyBatis整合.md │ │ ├── 7.Controller层实现.md │ │ ├── 8.表现层JSP页面实现.md │ │ └── 9.拦截器及SpringMVC整合.md │ ├── SSM框架整合实例 │ │ └── 0.SSM框架整合实例.md │ ├── SpringMVC简易教程 │ │ ├── 0.SpringMVC简介.md │ │ ├── 1.SpringMVC入门程序.md │ │ ├── 2.常用注解.md │ │ ├── 3.数据绑定与校验.md │ │ ├── 4.文件上传和下载.md │ │ └── 5.拦截器.md │ ├── Spring框架入门教程(新版) │ │ ├── 0.Spring 概述.md │ │ ├── 1.HelloShiyanlou 与松耦合的实现.md │ │ ├── 2.Spring IoC 容器.md │ │ ├── 3.Spring自动扫描与自动装配.md │ │ ├── 4.AOP - Advice.md │ │ ├── 5.AOP - Pointcut & Advisor.md │ │ ├── 6.AOP - 自动创建 Proxy.md │ │ └── 7.AOP - AspectJ.md │ ├── Struts框架教程 │ │ ├── 0.Struts 简介.md │ │ ├── 1.Hello World - Struts2.md │ │ ├── 2.核心配置文件详解 - struts.xml.md │ │ ├── 3.Struts2 - OGNL 详解.md │ │ ├── 4.Struts2 - 文件上传与下载.md │ │ ├── 5.Struts2 - Interceptor(拦截器).md │ │ └── 6.Struts2 - 表单验证.md │ ├── 结合七牛搭建个人相册 │ │ └── 0.结合七牛搭建个人相册.md │ └── 自己的Java编辑器 │ │ ├── 0.No1、制作GUI界面.md │ │ └── 1.No2、实现功能.md ├── Linux │ ├── Linux Web运维(Nginx)实战 │ │ ├── 0.Nginx功能描述.md │ │ ├── 1.LNMP系统安装.md │ │ ├── 2.nginx进程与模块.md │ │ ├── 3.Nginx模块开发实验.md │ │ ├── 4.nginx优化.md │ │ ├── 5.nginx配置实战:流量及并发连接数限制.md │ │ └── 6.nginx配置实战:访问控制及ddos预防.md │ ├── Linux 基础入门(新版) │ │ ├── 0.Linux 系统简介.md │ │ ├── 1.基本概念及操作.md │ │ ├── 10.简单的文本处理.md │ │ ├── 11.数据流重定向.md │ │ ├── 12.正则表达式基础.md │ │ ├── 13.Linux下软件安装.md │ │ ├── 14.Linux 进程概念.md │ │ ├── 15.Linux 进程管理.md │ │ ├── 16.Linux 日志系统.md │ │ ├── 2.用户及文件权限管理.md │ │ ├── 3.Linux 目录结构及文件基本操作.md │ │ ├── 4.环境变量与文件查找.md │ │ ├── 5.文件打包与解压缩.md │ │ ├── 6.文件系统操作与磁盘管理.md │ │ ├── 7.Linux下的帮助命令.md │ │ ├── 8.Linux任务计划crontab.md │ │ └── 9.命令执行顺序控制与管道.md │ ├── Linux 多线程编程入门指南 │ │ ├── 0.线程的基本概念.md │ │ ├── 1.线程的高级话题.md │ │ └── 2.线程的互斥与同步.md │ ├── Linux内核分析 │ │ ├── 0.通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的.md │ │ ├── 1.完成一个简单的时间片轮转多道程序内核代码.md │ │ ├── 2.跟踪分析Linux内核的启动过程.md │ │ ├── 3.使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用.md │ │ ├── 4.分析system_call中断处理过程.md │ │ ├── 5.分析Linux内核创建一个新进程的过程.md │ │ ├── 6.Linux内核如何装载和启动一个可执行程序.md │ │ ├── 7.理解进程调度时机跟踪分析进程调度与进程切换的过程.md │ │ └── 8.Linux内核学习总结.md │ ├── Linux命令实例练习 │ │ ├── 0.Linux操作命令(一).md │ │ ├── 1.Linux操作命令(二).md │ │ ├── 2.Linux操作命令(三).md │ │ ├── 3.Linux操作命令(四).md │ │ ├── 4.Linux操作命令(五).md │ │ ├── 5.Linux操作命令(六).md │ │ ├── 6.Linux操作命令(七).md │ │ ├── 7.Linux操作命令(八).md │ │ ├── 8.Linux操作命令(九).md │ │ └── 9.Linux操作命令(十).md │ ├── Linux系统安装配置VPN服务器 │ │ └── 0.Linux系统安装配置VPN服务器.md │ ├── Linux系统监控实战 │ │ ├── 0.linux系统监控常用命令(一).md │ │ ├── 1.linux系统监控常用命令(二).md │ │ ├── 2.linux系统监控工具——Conky.md │ │ ├── 3.Linux系统监控工具——Nagios.md │ │ └── 4.Linux 监控的 Python 脚本.md │ ├── Linux系统编程 │ │ ├── 0.课程介绍.md │ │ ├── 1.GCC的使用.md │ │ ├── 2.gdb使用.md │ │ ├── 3.Makefile使用.md │ │ ├── 4.文件IO(一).md │ │ ├── 5.文件IO(二).md │ │ ├── 6.多进程(一).md │ │ ├── 7.多进程(二).md │ │ └── 8.多进程(三).md │ ├── Memcache基础教程 │ │ ├── 0.Memcache简介.md │ │ ├── 1.Memcached的安装与配置.md │ │ ├── 2.Memcached特性实战.md │ │ └── 3.Memcache PHP 实战.md │ ├── TCP&IP网络协议基础 │ │ ├── 0.TCP&IP简介.md │ │ ├── 1.链路层介绍.md │ │ ├── 2.IP网际协议.md │ │ ├── 3.网络层其它协议.md │ │ ├── 4.传输层:UDP协议.md │ │ ├── 5.传输层:TCP协议.md │ │ └── 6.应用层协议.md │ ├── Vim编辑器 │ │ ├── 0.Vim快速入门.md │ │ ├── 1.Vim文档编辑.md │ │ ├── 2.查找替换.md │ │ └── 3.高级功能入门.md │ ├── 在Github Pages上部署自己的简历 │ │ └── 0.在Github Pages上部署自己的简历.md │ ├── 基于 Amazon AWS EC2 部署 Ghost 博客 │ │ └── 0.基于 Amazon AWS EC2 部署 Ghost 博客.md │ ├── 基于阿里云的 ECS 部署 Ghost 博客 │ │ └── 0.基于阿里云的 ECS 部署 Ghost 博客.md │ ├── 操作系统原理与实践 │ │ ├── 0.熟悉实验环境.md │ │ ├── 1.操作系统的引导.md │ │ ├── 2.系统调用.md │ │ ├── 3.进程运行轨迹的跟踪与统计.md │ │ ├── 4.基于内核栈切换的进程切换.md │ │ ├── 5.信号量的实现和应用.md │ │ ├── 6.地址映射与共享.md │ │ ├── 7.终端设备的控制.md │ │ └── 8.proc文件系统的实现.md │ ├── 操作系统实验-基于uCore OS │ │ ├── 0.lab0:Coding!.md │ │ ├── 1.lab1:启动操作系统.md │ │ ├── 2.lab2 :物理内存管理.md │ │ ├── 3.lab3 :虚拟内存管理.md │ │ ├── 4.lab4 :内核线程.md │ │ ├── 5.lab5 :用户进程.md │ │ └── 6.lab6 :处理器调度.md │ ├── 正则表达式基础 │ │ ├── 0.基础正则表达式介绍与练习.md │ │ ├── 1.grep命令与正则表达式.md │ │ ├── 2.正则表达式运用之 sed工具命令.md │ │ └── 3.扩展正则表达式.md │ └── 高级Bash脚本编程指南 │ │ ├── 0.Bash介绍与入门.md │ │ ├── 1.Bash中的特殊字符(上).md │ │ ├── 2.Bash中的特殊字符(下).md │ │ ├── 3.变量和参数.md │ │ ├── 4.引用和转义.md │ │ ├── 5.退出和退出状态码.md │ │ ├── 6.条件判断.md │ │ ├── 7.操作符.md │ │ ├── 8.变量重游.md │ │ └── 9.循环与分支.md ├── NoSQL │ ├── Redis基础教程 │ │ ├── 0.Redis简介与安装.md │ │ ├── 1.Redis数据类型.md │ │ ├── 2.Redis系统管理.md │ │ └── 3.Redis的高级应用.md │ └── mongoDB基础教程 │ │ ├── 0.数据库和集合基本操作.md │ │ ├── 1.数据查询.md │ │ ├── 2.更新和删除文档(document).md │ │ ├── 3.查询、索引与聚合.md │ │ └── 4.高级查询与索引.md ├── NodeJS │ ├── 120行代码实现简单的即时搜索 │ │ └── 0.120行代码实现简单的即时搜索.md │ ├── Node.js包教不包会 │ │ ├── 0.一个最简单的 express 应用.md │ │ ├── 1.学习使用外部模块.md │ │ ├── 10.作用域与闭包:this,var,(function () {}).md │ │ ├── 11.线上部署:heroku.md │ │ ├── 12.持续集成平台:travis.md │ │ ├── 13.js 中的那些最佳实践.md │ │ ├── 14.Mongodb 与 Mongoose 的使用.md │ │ ├── 15.cookie 和 session.md │ │ ├── 16.使用 promise 替代回调函数.md │ │ ├── 17.何为 connect 中间件.md │ │ ├── 2.使用 superagent 与 cheerio 完成简单爬虫.md │ │ ├── 3.使用 eventproxy 控制并发.md │ │ ├── 4.使用 async 控制并发.md │ │ ├── 5.测试用例:mocha,should,istanbul.md │ │ ├── 6.浏览器端测试:mocha,chai,phantomjs.md │ │ ├── 7.测试用例:supertest.md │ │ ├── 8.正则表达式.md │ │ └── 9.benchmark 怎么写.md │ ├── NodeJS教程 │ │ ├── 0.Node.js课程介绍.md │ │ ├── 1.Node.js模块.md │ │ ├── 2.Node.js Events模块.md │ │ ├── 3.Node.js fs模块.md │ │ ├── 4.Node.js的http模块.md │ │ ├── 5.Node.js中的网络编程.md │ │ └── 6.Node.js中的进程.md │ └── 轻松创建NodeJS服务器 │ │ ├── 0.服务器的请求和响应.md │ │ ├── 1.解决服务器的阻塞操作.md │ │ └── 2.处理表单输入.md ├── PHP │ ├── Laravel5.1制作简易留言板评论系统 │ │ ├── 0.项目设计,基础视图搭建.md │ │ └── 1.实现评论(留言)以及回复功能.md │ ├── Laravel5.1制作简易相册 │ │ ├── 0.项目设计、基础视图搭建.md │ │ ├── 1.实现相册的新增、编辑、删除、更换封面.md │ │ └── 2.实现相片的上传、编辑、删除、瀑布流展示.md │ ├── Laravel5.1基础教程 │ │ ├── 0.开启Laravel之旅以及环境配置.md │ │ ├── 1.HelloWorld—我的第一行代码.md │ │ ├── 10.30分钟搭建迷你博客.md │ │ ├── 11.使用bootstrap美化样式.md │ │ ├── 2.初识强大的Artisan命令.md │ │ ├── 3.路由.md │ │ ├── 4.控制器.md │ │ ├── 5.中间件.md │ │ ├── 6.视图.md │ │ ├── 7.Blade模板.md │ │ ├── 8.数据库&数据库迁移.md │ │ └── 9.模型&Eloquent.md │ ├── Laravel5.1实现Markdown编辑器 │ │ ├── 0.项目设计、基础视图搭建.md │ │ └── 1.实现Markdown.md │ ├── Laravel5.1快速搭建用户认证系统 │ │ ├── 0.开箱即用的用户认证系统(登录注册).md │ │ ├── 1.实现图片验证码功能.md │ │ └── 2.用QQ邮箱实现忘记密码功能.md │ ├── PHP 实例 -- 理解无限级分类 │ │ └── 0.PHP 实例 -- 理解无限级分类.md │ ├── PHP 实例--CURL实现简单采集 │ │ └── 0.PHP 实例--CURL实现简单采集.md │ ├── PHP 实现 ECharts 图表功能 │ │ └── 0.php 实现 ECharts 图表功能.md │ ├── PHP 实现简单的 MVC 框架 │ │ ├── 0.MVC 初探.md │ │ ├── 1.框架搭建.md │ │ ├── 2.框架核心类(一).md │ │ ├── 3.框架核心类(二).md │ │ └── 4.运行测试.md │ ├── PHP 封装分页类 │ │ └── 0.PHP 实现分页类.md │ ├── PHP 设计模式 │ │ ├── 0.设计模式讲解(一).md │ │ └── 1.设计模式讲解(二).md │ ├── PHP会话控制 │ │ ├── 0.cookie基础和应用.md │ │ ├── 1.php操作cookie.md │ │ ├── 2.session入门.md │ │ └── 3.实现购物车.md │ ├── PHP实现留言本 │ │ └── 0.PHP留言本.md │ ├── PHP微信公众号接口开发 │ │ ├── 0.微信公众平台介绍与接入.md │ │ ├── 1.常用API封装.md │ │ └── 2.功能测试与总结.md │ ├── PHP文件编程 │ │ ├── 0.PHP文件编程基础.md │ │ └── 2.实现文件上传功能模块.md │ ├── PHP编程语言 │ │ ├── 0.PHP简介.md │ │ ├── 1.基本语法.md │ │ ├── 10.类与对象(一).md │ │ ├── 11.类与对象(二).md │ │ ├── 2.数据类型(一).md │ │ ├── 3.数据类型(二).md │ │ ├── 4.php变量.md │ │ ├── 5.php常量.md │ │ ├── 6.php运算符.md │ │ ├── 7.控制结构(一).md │ │ ├── 8.控制结构(二).md │ │ └── 9.php函数.md │ ├── ThinkPHP实现云书签 │ │ ├── 0.云书签后台构建.md │ │ ├── 1.云书签前台构建.md │ │ └── 2.课后习题.md │ ├── ThinkPHP框架实践 │ │ ├── 0.ThinkPHP安装与配置.md │ │ ├── 1.ThinkPHP 路由.md │ │ ├── 2.ThinkPHP 控制器.md │ │ ├── 3.ThinkPHP 模型.md │ │ ├── 4.ThinkPHP 视图.md │ │ ├── 5.ThinkPHP 模板.md │ │ └── 6.ThinkPHP 文件与验证码.md │ ├── Yii 2系列教程 │ │ ├── 0.Yii 2的安装.md │ │ ├── 1.Yii2 的MVC Forms Layouts.md │ │ ├── 2.Yii2 数据库和Gii.md │ │ ├── 3.实现用户的注册和登陆.md │ │ ├── 4.Yii2 权限控制.md │ │ ├── 5.Yii2应用集成编辑器.md │ │ └── 6.Yii2 Behaviors 和 Validations.md │ ├── 基于 Bootstrap 和 PHP 实现百度翻译 │ │ ├── 0.配置环境.md │ │ ├── 1.有道翻译 API 的使用.md │ │ ├── 2.使用 Bootstrap 实现前端页面.md │ │ └── 3.使用 PHP 实现后端逻辑代码.md │ ├── 基于信令验证技术的身份验证功能 │ │ └── 0.基于信令验证技术的身份验证功能.md │ └── 校花评比排名项目 │ │ └── 0.使用PHP实现校花排名.md ├── Python │ ├── 200行Python代码实现2048 │ │ └── 0.200行Python代码实现2048.md │ ├── Django 搭建简易博客 │ │ ├── 0.开发环境以及项目与App.md │ │ ├── 1.Models和Admin以及Views和URL.md │ │ ├── 2.Template和动态URL.md │ │ ├── 3.多说,markdown和代码高亮.md │ │ ├── 4.归档, AboutMe和标签分类.md │ │ └── 5.搜索和Readme与RSS和分页.md │ ├── Django入门教程 │ │ ├── 0.HelloWorld.md │ │ ├── 1.Django环境搭建与目录结构.md │ │ ├── 2.Django基本命令.md │ │ ├── 3.视图与链接路由.md │ │ ├── 4.模板(template).md │ │ ├── 5.模型(model)与数据库.md │ │ └── 6.Django表单.md │ ├── Django进阶教程 │ │ ├── 0.Django发送邮件.md │ │ ├── 1.Django后台管理.md │ │ ├── 2.Django缓存系统.md │ │ ├── 3.Django部署(Nginx).md │ │ ├── 4.使用Django搭建简易博客之一-基础数据构建.md │ │ ├── 5.使用Django搭建简易博客之二-由内向外,完成前端渲染.md │ │ └── 6.使用Django搭建简易博客之三-使用动态URL完成文章单页面.md │ ├── Flask开发轻博客 │ │ ├── 0.欢迎来到Flask的世界.md │ │ ├── 1.Flask模板.md │ │ ├── 2.Flask的Web表单.md │ │ ├── 3.数据库.md │ │ ├── 4.用户登录.md │ │ ├── 5.用户首页和发布博客.md │ │ └── 6.分页.md │ ├── Kaggle入门:泰坦尼克号幸存者项目 │ │ └── 0.Kaggle入门.md │ ├── Kivy--使用Python开发跨平台的GUI程序 │ │ └── 0.使用kivy开发socket通讯程序.md │ ├── NBA常规赛结果预测——利用Python进行比赛数据分析 │ │ └── 0.利用Python进行NBA比赛数据分析.md │ ├── PyQt 实现简易浏览器 │ │ ├── 0.Qt 速览.md │ │ └── 1.实现浏览器.md │ ├── Python 3 实现 Markdown 解析器 │ │ └── 0.Python 3 实现 Markdown 解析器.md │ ├── Python 3 实现图片转彩色字符 │ │ ├── 0.docopt 与 Pillow 库基础学习.md │ │ └── 1.实现图像转彩色字符.md │ ├── Python Django Web框架 │ │ ├── 0.Welcome to Django!.md │ │ ├── 1.Django入门.md │ │ ├── 10.表单(二).md │ │ ├── 2.视图和URL配置.md │ │ ├── 3.模板(一).md │ │ ├── 4.模板(二).md │ │ ├── 5.模板(三).md │ │ ├── 6.模型(一).md │ │ ├── 7.模型(二).md │ │ ├── 8.Django网站管理(Admin).md │ │ └── 9.表单(一).md │ ├── Python Flask Web框架 │ │ ├── 0.Flask介绍及安装.md │ │ ├── 1.Flask运行及调试模式.md │ │ ├── 2.路由.md │ │ ├── 3.静态文件及渲染模版.md │ │ ├── 4.接受请求数据.md │ │ ├── 5.重定向、响应、会话和扩展.md │ │ ├── 6.Flask项目实战1.md │ │ ├── 7.Flask项目实战2.md │ │ └── 8.Flask项目实战3.md │ ├── Python 图片转字符画 │ │ └── 0.Python 图片转字符画.md │ ├── Python 实现 Huffman 编码解压缩文件 │ │ ├── 0.实现 Huffman 编码树.md │ │ └── 1.Huffman 编码进行文件的压缩和解压缩.md │ ├── Python 实现密码强度检测器 │ │ └── 0.Python 实现密码强度检测器.md │ ├── Python 实现简单滤镜 │ │ └── 0.Python 实现简单滤镜.md │ ├── Python 实现简易 Shell │ │ └── 0.Python 实现简易 Shell.md │ ├── Python 数据分析(一) │ │ ├── 0.pandas 回顾.md │ │ ├── 1.读写文本格式的数据.md │ │ ├── 2.使用 HTML 和 Web API.md │ │ ├── 3.使用数据库.md │ │ ├── 4.合并数据集.md │ │ ├── 5.重塑和轴向旋转.md │ │ ├── 6.数据转换.md │ │ ├── 7.字符串操作.md │ │ └── 8.绘图和可视化.md │ ├── Python 数据分析(二) │ │ ├── 0.groupby 技术.md │ │ ├── 1.数据聚合.md │ │ ├── 2.分组级运算和转换.md │ │ ├── 3.透视表和交叉表.md │ │ ├── 4.时间序列.md │ │ ├── 5.日期的规范、频率以及移动.md │ │ ├── 6.时区处理.md │ │ ├── 7.时期及算术运算.md │ │ ├── 8.重采样及频率转换.md │ │ └── 9.时间序列绘图.md │ ├── Python 破解验证码 │ │ └── 0.Python 破解验证码.md │ ├── Python3 & OpenCV 视频转字符动画 │ │ └── 0.Python3 & OpenCV 视频转字符动画.md │ ├── Python3 图片隐写术 │ │ └── 0.Python3 图片隐写术.md │ ├── Python3 基于 Scapy 实现 DDos │ │ ├── 0.Scapy 实现 SYN 泛洪攻击.md │ │ └── 1.结合 Scoket 实现 DDoS 攻击.md │ ├── Python3 实现火车票查询工具 │ │ └── 0.Python3 实现火车票查询工具.md │ ├── Python3 实现简单的 FTP 认证服务器 │ │ └── 0.基于 pyftpdlib 库实现简单认证服务器.md │ ├── Python3 简明教程 │ │ ├── 0.开始 Python 之旅.md │ │ ├── 1.变量和数据类型.md │ │ ├── 10.类.md │ │ ├── 11.模块.md │ │ ├── 12.Collections 模块.md │ │ ├── 13.PEP8 代码风格指南.md │ │ ├── 14.迭代器、生成器、装饰器.md │ │ ├── 15.Virtualenv.md │ │ ├── 16.测试.md │ │ ├── 17.项目结构.md │ │ ├── 18.Flask 介绍.md │ │ ├── 2.运算符和表达式.md │ │ ├── 3.控制流 If-else.md │ │ ├── 4.循环.md │ │ ├── 5.数据结构.md │ │ ├── 6.字符串.md │ │ ├── 7.函数.md │ │ ├── 8.文件处理.md │ │ └── 9.异常.md │ ├── Python3 色情图片识别 │ │ └── 0.Python3 色情图片识别.md │ ├── Python基于共现提取《釜山行》人物关系 │ │ └── 0.基于共现提取《釜山行》人物关系.md │ ├── Python实现3D建模工具 │ │ ├── 0.Python实现3D建模工具(上).md │ │ └── 1.Python实现3D建模工具(下).md │ ├── Python实现Python解释器 │ │ ├── 0.Hello, 解释器.md │ │ ├── 1.真实的Python字节码.md │ │ └── 2.实现Python解释器.md │ ├── Python实现javaweb项目远端自动化更新部署 │ │ ├── 0.Tomcat自动化部署流程.md │ │ ├── 1.使用shell启动Tomcat.md │ │ └── 2.使用python实现自动化部署.md │ ├── Python实现中文错别字高亮系统 │ │ └── 0.找出中文错别字.md │ ├── Python实现从excel读取数据并绘制成精美图像 │ │ └── 0.Python实现从excel读取数据绘制成精美图像.md │ ├── Python实现基于协程的异步爬虫 │ │ ├── 0.线程池实现爬虫.md │ │ ├── 1.事件驱动-回调函数实现爬虫.md │ │ └── 2.事件驱动-协程实现爬虫.md │ ├── Python实现康威生命游戏 │ │ └── 0.Python实现康威生命游戏.md │ ├── Python实现简单的Web服务器 │ │ └── 0.Python实现简单的Web服务器.md │ ├── Python实现遗传算法求解n-queens问题 │ │ ├── 0.遗传算法入门.md │ │ └── 1.遗传算法求解N皇后问题.md │ ├── Python实现键值数据库 │ │ └── 0.Python实现键值数据库.md │ ├── Python应用马尔可夫链算法实现随机文本生成 │ │ └── 0.马尔可夫链算法实现中&英文随机文本生成.md │ ├── Python开发木马程序 │ │ └── 0.python开发木马程序.md │ ├── Python快速教程 │ │ ├── 0.Python基础(上)  .md │ │ ├── 1.Python基础(下).md │ │ ├── 10.Python网络.md │ │ ├── 11.Django(上).md │ │ ├── 12.Django(中).md │ │ ├── 13.Django(下).md │ │ ├── 2.Python进阶(上).md │ │ ├── 3.Python进阶(下).md │ │ ├── 4.Python深入(上).md │ │ ├── 5.Python深入(下).md │ │ ├── 6.Python补充.md │ │ ├── 7.Python标准库(上).md │ │ ├── 8.Python标准库(中).md │ │ └── 9.Python标准库(下).md │ ├── Python打造漏洞扫描器 │ │ ├── 0.网站爬虫开发以及SQL注入检测插件.md │ │ ├── 1.基于爬虫开发E-mail收集插件.md │ │ ├── 2.基于爬虫开发XSS检测程序.md │ │ ├── 3.基于爬虫开发webshell爆破插件与备份扫描.md │ │ ├── 4.CMS识别(web指纹识别)扫描器开发.md │ │ ├── 5.目标端口扫描,系统指纹分析.md │ │ ├── 6.敏感目录爆破.md │ │ ├── 7.CDN检测插件.md │ │ ├── 8.自动生成网页报告.md │ │ └── 9.扫描器测试以及未来展望.md │ ├── Python文本解析器 │ │ └── 0.Python文本解释器.md │ ├── Python暴力猜解Web登录 │ │ └── 0.Python暴力猜解Web登录.md │ ├── Python气象数据分析--《Python 数据分析实战》 │ │ └── 0.Python气象数据分析.md │ ├── Python科学计算(一) │ │ ├── 0.介绍.md │ │ ├── 1.Numpy - 多维数组(上).md │ │ ├── 2.Numpy - 多维数组(下).md │ │ ├── 3.SciPy - 科学计算库(上).md │ │ ├── 4.SciPy - 科学计算库(下).md │ │ ├── 5.matplotlib - 2D 与 3D 图的绘制(上).md │ │ ├── 6.matplotlib - 2D 与 3D 图的绘制(下).md │ │ ├── 7.Sympy - 代数系统.md │ │ ├── 8.Python 与 C.md │ │ └── 9.Python并行计算.md │ ├── Python科学计算(二) │ │ ├── 0.Pandas 结构化数据(上).md │ │ ├── 1.Pandas 结构化数据(下).md │ │ ├── 2.scikit-learn 机器学习.md │ │ └── 3.scikit-image 图像处理.md │ ├── Python编程语言 │ │ ├── 0.Python快速入门.md │ │ ├── 1.Python 流程控制.md │ │ ├── 2.数据结构.md │ │ ├── 3.输入和输出.md │ │ ├── 4.面向对象编程.md │ │ └── 5.Python标准库基础.md │ ├── Python解决哲学家就餐问题 │ │ └── 0.Python解决哲学家就餐问题.md │ ├── SQLAlchemy 基础教程 │ │ └── 0.SQLAlchemy 基础教程.md │ ├── Twitter 数据情感分析 │ │ └── 0.使用 Spark MLlib 进行情感分析.md │ ├── ebay 在线拍卖数据分析 │ │ └── 0.scikit-learn 实现 ebay 数据分析.md │ ├── k-近邻算法实现手写数字识别系统--《机器学习实战 》 │ │ └── 0.k-近邻算法实现手写数字识别系统.md │ ├── pygame开发打飞机游戏 │ │ └── 0.pygame开发打飞机游戏.md │ ├── python 实现英文新闻摘要自动提取 │ │ ├── 0.“关键字” 法完成新闻摘要提取.md │ │ └── 1.TextRank 算法完成摘要提取.md │ ├── python实现简单邮件客户端 │ │ ├── 0.常见的邮件客户端协议.md │ │ ├── 1.email.md │ │ └── 2.客户端.md │ ├── python生成汉字图片字库 │ │ └── 0.python生成汉字图片字库.md │ ├── scikit-learn实战之监督学习 │ │ ├── 1.监督学习简介.md │ │ ├── 2.广义线性模型用于分类和回归预测.md │ │ ├── 3.支持向量机用于分类和回归预测.md │ │ └── 4.常见的监督学习模型对比评价.md │ ├── scikit-learn实战之非监督学习 │ │ ├── 0.K-Means聚类算法.md │ │ ├── 1.K值选择与聚类评估.md │ │ ├── 2.聚类算法对比与选择.md │ │ └── 3.主成分分析(PCA降维).md │ ├── 人机对战初体验 Python 基于 Pygame 实现四子棋游戏 │ │ └── 0.人机对战初体验 四子棋游戏.md │ ├── 使用 Github Pages 和 Hexo 搭建独立博客 │ │ └── 0.Hexo + github page 实现搭建博客.md │ ├── 使用 Python 3 编写系列实用脚本 │ │ ├── 0.Markdown to HTML.md │ │ ├── 1.文本文件编码检测与转换.md │ │ └── 2.文件校验.md │ ├── 使用 Python 解数学方程 │ │ ├── 0.SymPy 库简介与解线性方程的实现.md │ │ ├── 1.解微积分相关习题实现.md │ │ └── 2.解微分方程与矩阵化简的实现.md │ ├── 使用Python3编写Github自动周报生成器 │ │ ├── 0.PyGithub环境配置及测试API封装.md │ │ └── 1.实战:编写周报生成器.md │ ├── 使用Python定制词云 │ │ └── 0.使用Python定制词云.md │ ├── 使用python实现深度神经网络 │ │ ├── 0.深度学习.md │ │ ├── 1.导数与梯度、矩阵运算性质、科学计算库numpy.md │ │ ├── 2.快速计算梯度的魔法--反向传播算法.md │ │ ├── 3.使用浅层神经网络识别图片中的英文字母.md │ │ └── 4.深度学习.md │ ├── 使用卷积神经网络进行图片分类 │ │ ├── 0.卷积神经网络原理.md │ │ ├── 1.使用caffe构建卷积神经网络.md │ │ ├── 2.控制caffe模型的训练过程.md │ │ └── 3.利用训练好的模型开发图片分类程序.md │ ├── 利用微信 API 将你的微信变为聊天机器人 │ │ └── 0.利用微信 API 将你的微信个人号变为聊天机器人.md │ ├── 基于 Flask 与 MySQL 实现番剧推荐系统 │ │ ├── 0.实验框架的设计.md │ │ └── 1.推荐系统的实现.md │ ├── 基于 LeanCloud 的短信验证 │ │ └── 0.基于 LeanCloud 的短信验证.md │ ├── 基于 SendCloud 的邮箱验证 │ │ └── 0.基于 SendCloud 的邮箱验证.md │ ├── 基于Flask&RethinkDB实现TODO List │ │ ├── 0.技术栈介绍.md │ │ ├── 1.RethinkDB 10分钟入门.md │ │ ├── 2.Backbone.js 10分钟入门.md │ │ ├── 3.搭建应用框架.md │ │ ├── 4.设计模型与接口.md │ │ └── 5.完成前端部分-大功告成!.md │ ├── 基于Flask │ │ └── RethinkDB实现TODO List │ │ │ ├── 0.技术栈介绍.md │ │ │ ├── 1.RethinkDB 10分钟入门.md │ │ │ ├── 2.Backbone.js 10分钟入门.md │ │ │ ├── 3.搭建应用框架.md │ │ │ ├── 4.设计模型与接口.md │ │ │ └── 5.完成前端部分-大功告成!.md │ ├── 基于SVM的猫咪图片识别器 │ │ └── 0.基于SVM的猫咪图片识别器.md │ ├── 基于TCP的python聊天程序 │ │ ├── 0.TCP&IP协议简介与聊天程序的初步实现.md │ │ └── 1.使用Tkinter库编写聊天程序GUI模块.md │ ├── 基于卷积神经网络实现图片风格的迁移 │ │ ├── 0.卷积神经网络详解.md │ │ ├── 1.VGG与风格迁移算法原理详解.md │ │ └── 2.实现图片的风格转换.md │ ├── 基于微信公众号实现邮件信息推送 │ │ ├── 0.环境准备.md │ │ ├── 1.微信公众号接收回复文字、图文等消息.md │ │ └── 2.微信公众号对邮件信息的推送.md │ ├── 基于无监督学习的自编码器实现 │ │ ├── 0.无监督学习介绍 & 部分函数实现.md │ │ └── 1.自编码器实现.md │ ├── 川普撞脸希拉里(基于 OpenCV 的面部特征交换) │ │ ├── 0.dlib 与 docopt 使用介绍.md │ │ └── 1.实现人脸特征转换.md │ ├── 数独游戏的 Python 实现与破解 │ │ ├── 0.实现数独题目的生成.md │ │ └── 1.回溯法解决数独问题.md │ ├── 每天一个PythonChallenge《任务一》 │ │ └── 0.PythonChallenge_1.md │ ├── 每天一个PythonChallenge《任务三》 │ │ └── 0.PythonChallenge_3.md │ ├── 每天一个PythonChallenge《任务二》 │ │ └── 0.PythonChallenge_2.md │ ├── 用Python做2048游戏 │ │ ├── 0.认识wxpython.md │ │ ├── 1.画几个形状.md │ │ ├── 2.再做个计算器.md │ │ └── 3.最后实现个2048游戏.md │ ├── 神经网络实现人脸识别任务 │ │ ├── 0.无监督学习进行人脸数据降维.md │ │ └── 1.利用有监督学习进行人脸识别.md │ ├── 神经网络实现手写字符识别系统 │ │ └── 0.神经网络实现手写字符识别系统.md │ ├── 给Python3爬虫做一个界面妹子图网实战 │ │ ├── 0.概述——完成计算器Demo.md │ │ ├── 1.模块化实践——完成图片预览以及元素列表.md │ │ └── 2.成品——完成爬虫以及界面的结合.md │ ├── 自联想器的 Python 实现 │ │ └── 0.自联想存储器的 Python 实现.md │ └── 高德API+Python解决租房问题 │ │ └── 0.高德API+Python解决租房问题.md ├── R │ ├── R语言基础入门 │ │ ├── 0.R语言入门:基础数据结构.md │ │ └── 1.R语言入门:tidyverse生态链.md │ ├── R语言实现股票数据的预处理及分析 │ │ └── 0.股票数据预处理及分析.md │ ├── R语言教程 │ │ ├── 0.R语言课程介绍.md │ │ ├── 1.R语法学习(一).md │ │ ├── 2.R语法学习(二).md │ │ ├── 3.R语言常用函数.md │ │ └── 4.R语言扩展包.md │ ├── R语言进行商业问卷分析--菜鸟侦探挑战数据分析 │ │ └── 0.关于搞活商业街的调查问卷,这东西该怎么做.md │ ├── 使用R语言基于新浪股票数据分析金融数据的“统计常识” │ │ └── 0.使用R语言基于新浪股票数据分析金融数据的“统计常识”.md │ ├── 基于R的高级数据管理--《R语言实战(第2版)》 │ │ └── 0.高级数据管理.md │ ├── 基于R语言的多元线性回归--我国经济增长的定量研究 │ │ └── 0.基于R语言的多元线性回归--我国经济增长的定量研究.md │ ├── 对英国房屋价格建模并预测---《量化金融 R 语言初级教程》 │ │ └── 0.对英国房屋价格建模并预测.md │ └── 序列的数据挖掘--《数据科学:R语言实战》 │ │ └── 0.序列的数据挖掘.md ├── Ruby │ ├── Rails基础入门 │ │ ├── 0.Rails 介绍与环境配置.md │ │ ├── 1.Rails 控制器与路由.md │ │ ├── 2.Rails 数据库模型.md │ │ ├── 3.Rails 视图.md │ │ ├── 4.博客的用户登录和视图的实现.md │ │ └── 5.博客的文章管理和评论功能.md │ └── Ruby基础教程 │ │ ├── 0.基础语法.md │ │ ├── 1.类和对象.md │ │ ├── 10.异常处理.md │ │ ├── 2.变量.md │ │ ├── 3.方法(函数).md │ │ ├── 4.代码块与运算符.md │ │ ├── 5.循环与判断.md │ │ ├── 6.模块.md │ │ ├── 7.字符串、数组、Hash.md │ │ ├── 8.迭代器.md │ │ └── 9.输入输出.md ├── SQL │ ├── MySQL 基础课程 │ │ ├── 0.基础篇 - SQL 介绍及 MySQL 安装.md │ │ ├── 1.基础篇 - 创建数据库并插入数据.md │ │ ├── 10.进阶篇 - MySQL 数据类型.md │ │ ├── 11.进阶篇 - MySQL 函数和操作符.md │ │ ├── 12.进阶篇 - SQL 语句语法详解.md │ │ ├── 13.进阶篇 - MySQL 触发器.md │ │ ├── 14.进阶篇 - MySQL 视图.md │ │ ├── 15.进阶篇 - MySQL 存储过程和函数.md │ │ ├── 16.进阶篇 - MySQL 数据库管理.md │ │ ├── 2.基础篇 - SQL 的约束.md │ │ ├── 3.基础篇 - SELECT 语句详解.md │ │ ├── 4.基础篇 - 数据库及表的修改和删除.md │ │ ├── 5.基础篇 - 其他基本操作.md │ │ ├── 6.进阶篇 - MySQL 服务安装及命令使用.md │ │ ├── 7.进阶篇 - MySQL 操作详解.md │ │ ├── 8.进阶篇 - MySQL 常用查询.md │ │ └── 9.进阶篇 - MySQL 语言结构.md │ └── MySQL参考手册中文版 │ │ ├── 0.初识MySQL.md │ │ ├── 1.MySQL基本操作.md │ │ ├── 10.MySQL数据库管理.md │ │ ├── 2.MySQL常用查询.md │ │ ├── 3.MySQL的语言结构.md │ │ ├── 4.MySQL数据类型.md │ │ ├── 5.MySQL函数和操作符.md │ │ ├── 6.SQL语句语法.md │ │ ├── 7.MySQL触发器.md │ │ ├── 8.MySQL视图.md │ │ └── 9.存储程序和函数.md ├── Scala │ ├── Scala 专题教程 - Case Class和模式匹配 │ │ ├── 0.简单的示例.md │ │ ├── 1.模式的种类.md │ │ ├── 2.模式限定修饰与重叠模式定义.md │ │ └── 3.Sealed Classes与Option类型.md │ ├── Scala 专题教程 - Extractor │ │ └── 0.Scala 专题教程之 Extractor.md │ ├── Scala 专题教程 - 抽象成员 │ │ └── 0.抽象成员.md │ ├── Scala 专题教程 - 隐式变换和隐式参数 │ │ ├── 0.认识隐式变换.md │ │ └── 1.使用隐式参数.md │ ├── Scala开发二十四点游戏 │ │ ├── 0.表达式的计算.md │ │ ├── 1.算法部分(一).md │ │ ├── 2.List简介.md │ │ ├── 3.算法部分(二).md │ │ ├── 4.完整的代码和计算结果.md │ │ └── 5.在Java中调用Scala函数.md │ ├── Scala开发教程 │ │ ├── 0.开启神奇的Scala编程之旅.md │ │ ├── 1.起步Scala.md │ │ ├── 10.类层次关系和底层类型.md │ │ ├── 11.Trait.md │ │ ├── 12.使用Package(包).md │ │ ├── 13.访问控制修饰符.md │ │ ├── 2.类和对象.md │ │ ├── 3.基本数据类型及其操作.md │ │ ├── 4.类和对象(二).md │ │ ├── 5.控制语句.md │ │ ├── 6.函数.md │ │ ├── 7.函数(二).md │ │ ├── 8.组合和继承.md │ │ └── 9.组合和继承(二).md │ └── 大数据带你看穿航班晚点的套路 │ │ ├── 0.航班数据分析实战.md │ │ └── 1.数据分析进阶:数据可视化.md ├── Spark │ ├── Kmeans聚类算法评估足球比赛 │ │ └── 0.Kmeans聚类算法评估足球比赛.md │ ├── Spark2.x快速入门教程 │ │ ├── 0.Spark2.x新特性.md │ │ ├── 1.SparkSQL.md │ │ ├── 2.HiveonSpark.md │ │ ├── 3.StructuredStreaming.md │ │ ├── 4.Spark处理多种数据源.md │ │ ├── 5.Streaming整合Flume.md │ │ └── 6.Streaming整合Kafka.md │ ├── Spark实现黑名单实时过滤 │ │ └── 0.Spark实现黑名单实时过滤.md │ ├── Spark机器学习之电影推荐系统 │ │ └── 0.机器学习实现电影推荐系统.md │ ├── Spark的模式挖掘—FPGrowth算法 │ │ └── 0.Spark的模式挖掘—FPGrowth算法.md │ ├── Spark自定义UDF分析Uber数据 │ │ └── 0.自定义UDF分析Uber数据.md │ ├── 使用Spark进行流量日志分析 │ │ └── 0.Spark流量分析日志.md │ ├── 使用决策树算法预测森林植被 │ │ └── 0.决策树算法用于预测森林植被.md │ ├── 大数据带你挖掘打车的秘籍 │ │ ├── 0.出租车数据分析.md │ │ └── 1.数据分析进阶:数据可视化.md │ └── 流式实时日志分析系统——《Spark最佳实践》 │ │ └── 0.流式分析系统实现.md ├── Swift │ └── 深入浅出 Swift 3 │ │ ├── 0.Swift 简介.md │ │ ├── 1.常量、变量、运算符与其他基本概念.md │ │ ├── 2.基础类型与可选类型.md │ │ ├── 3.逻辑控制流语句.md │ │ ├── 4.函数与闭包.md │ │ ├── 5.结构体与类.md │ │ ├── 6.协议、扩展、枚举.md │ │ ├── 7.泛型、可选链、引用计数.md │ │ └── 8.延伸阅读:Swift API 设计则例.md ├── Web │ ├── Bootstrap3.0入门学习 │ │ ├── 0.入门.md │ │ ├── 1.栅格系统原理.md │ │ ├── 10.导航、标签、面板屑导航.md │ │ ├── 11.导航条.md │ │ ├── 12.分页、徽章.md │ │ ├── 13.大屏幕介绍、页面标题、缩略图、警示框、Well.md │ │ ├── 14.进度条、媒体对象、列表组、面板.md │ │ ├── 15.JavaScript插件-模态框.md │ │ ├── 16.JavaScript插件-下拉菜单.md │ │ ├── 17.JavaScript插件-标签页.md │ │ ├── 18.JavaScript插件-滚动监听.md │ │ ├── 19.JavaScript插件-工具提示.md │ │ ├── 2.栅格系统案例.md │ │ ├── 20.JavaScript插件-弹出框.md │ │ ├── 21.JavaScript插件-警示框.md │ │ ├── 22.JavaScript插件-按钮.md │ │ ├── 23.JavaScript插件-折叠.md │ │ ├── 24.JavaScript插件-轮播.md │ │ ├── 3.排版.md │ │ ├── 4.表格.md │ │ ├── 5.表单.md │ │ ├── 6.按钮.md │ │ ├── 7.工具Class.md │ │ ├── 8.下拉菜单.md │ │ └── 9.输入框组.md │ ├── CSS速成教程 │ │ ├── 0.css入门基础.md │ │ ├── 1.基础选择器.md │ │ ├── 2.css基本样式(一).md │ │ ├── 3.css基本样式(二).md │ │ ├── 4.css盒子模型.md │ │ ├── 5.css高级.md │ │ ├── 6.css选择器.md │ │ └── 7.HTML与css简单页面效果实例.md │ ├── HTML5 本地裁剪图片 │ │ └── 0.HTML5 本地裁剪图片.md │ ├── HTML5两步实现拼图游戏 │ │ └── 0.HTML5两步实现拼图游戏.md │ ├── HTML5基础入门 │ │ ├── 0.认识HTML5.md │ │ ├── 1.HTML5的新的结构元素介绍.md │ │ ├── 2.增强型表单标签.md │ │ ├── 3.HTML5文件操作API.md │ │ ├── 4.Canvas绘图API.md │ │ └── 5.HTML5本地存储和本地数据库.md │ ├── HTML5的Canvas小游戏 │ │ └── 0.HTML5 Canvas小游戏.md │ ├── HTML基础入门 │ │ ├── 0.HTML初识.md │ │ ├── 1.HTML文本.md │ │ ├── 2.HTML超文本(一).md │ │ ├── 3.HTML超文本(二).md │ │ └── 4.HTML基础汇总实验.md │ ├── JavaScript实现玫瑰花 │ │ └── 0.情人节玫瑰.md │ ├── Javascript基础(新版) │ │ ├── 0.JavaScript 简介.md │ │ ├── 1.JavaScript 基本语法(上).md │ │ ├── 2.JavaScript 基本语法(下).md │ │ ├── 3.事件.md │ │ ├── 4.对象.md │ │ └── 5.DOM.md │ ├── SCSS(SASS)画小黄人 │ │ └── 0.SCSS(SASS)画小黄人.md │ ├── Vuejs2.0使用教程 │ │ ├── 0.开始使用Vuejs2.0.md │ │ ├── 1.Vuejs的常用指令.md │ │ ├── 2.Vuejs的第一个示例.md │ │ ├── 3.Vuejs组件.md │ │ └── 4.Vuejs计算属性.md │ ├── amo.js—用于创建 CSS3 动画的JS库 │ │ └── 0.amo.js指南.md │ ├── jQuery基础入门 │ │ ├── 0.认识jQuery.md │ │ ├── 1.jQuery选择器.md │ │ ├── 2.管理jQuery包装集.md │ │ ├── 3.使用jQuery操作元素的属性与样式.md │ │ ├── 4.jQuery的事件与事件对象.md │ │ ├── 5.Ajax.md │ │ ├── 6.jQuery动画.md │ │ ├── 7.JQuery工具函数.md │ │ ├── 8.jQuery UI常用功能实战.md │ │ └── 9.实战表单验证与自动完成提示插件.md │ ├── 基于 Luosimao 的人机验证服务 │ │ └── 0.基于 luosimao 的人机验证服务.md │ ├── 基于impress.js制作炫酷幻灯片 │ │ └── 0.基于impress.js制作炫酷幻灯片.md │ ├── 打造网页版「大白」 │ │ └── 0.打造网页版「大白」- Baymax.md │ ├── 用CSS和jQuery打造一个简单的图片编辑器 │ │ └── 0.用CSS和Jquery打造一个简单的图片编辑器.md │ ├── 用Vue.js和vue-router创建单页导航和分页 │ │ ├── 0.使用vue-router2.0创建单页简单导航.md │ │ ├── 1.在vue-route路由组件中进行分页.md │ │ └── 2.使用vue-resource的get方法加载数据.md │ └── 网页版-别踩白块游戏 │ │ └── 0.网页版 别踩白块.md ├── 信息安全 │ ├── BurpSuite基础教程 │ │ ├── 0.BurpSuite的简单使用和proxy模块说明.md │ │ ├── 1.BurpSuite之spider模块的使用.md │ │ ├── 2.BurpSuite之intruder模块使用.md │ │ ├── 3.BurpSuite之Repeater模块使用.md │ │ ├── 4.BurpSuite之Decoder模块使用.md │ │ └── 5.BurpSuite之scanner模块的使用.md │ ├── Collabtive系统SQL注入实验 │ │ └── 0.Collabtive系统SQL注入实验.md │ ├── Collabtive系统浏览器同源策略探索实验 │ │ └── 0.Collabtive系统浏览器同源策略探索实验.md │ ├── Collabtive系统跨站脚本攻击实验 │ │ └── 0.Collabtive系统跨站脚本攻击实验.md │ ├── Collabtive系统跨站请求伪造攻击实验 │ │ └── 0.Collabtive系统跨站请求伪造攻击实验.md │ ├── DVWA 之暴力破解攻击 │ │ └── 0.DVWA 之暴力破解攻击.md │ ├── Elgg 系统 CSRF 攻击实验 │ │ └── 0.Elgg系统CSRF攻击实验.md │ ├── Elgg系统跨站脚本攻击实验 │ │ └── 0.Elgg系统跨站脚本攻击实验.md │ ├── Metasploit 实现木马生成、捆绑及免杀 │ │ └── 0.Metasploit 实现木马生成、捆绑及免杀.md │ ├── Python暴力猜解Web登录 │ │ └── 0.Python暴力猜解Web登录.md │ ├── Return-to-libc攻击实验 │ │ └── 0.Return-to-libc攻击实验.md │ ├── SET-UID程序漏洞实验 │ │ └── 0.SET-UID程序漏洞实验.md │ ├── ShellShock 攻击实验 │ │ └── 0.ShellShock 攻击实验.md │ ├── Sql注入基础原理介绍 │ │ └── 0.Sql注入基础原理介绍.md │ ├── 公钥加密与PKI实验 │ │ └── 0.公钥加密与PKI.md │ ├── 单向哈希函数与MAC实验 │ │ └── 0.单向哈希函数与MAC.md │ ├── 密钥加解密实验 │ │ ├── 0.密钥加解密实验(上).md │ │ └── 1.密钥加解密实验(下).md │ ├── 格式化字符串漏洞实验 │ │ └── 0.格式化字符串漏洞实验.md │ ├── 竞态条件漏洞实验 │ │ └── 0.竞态条件漏洞实验.md │ └── 缓冲区溢出漏洞实验 │ │ └── 0.缓冲区溢出漏洞实验.md ├── 汇编 │ └── 《汇编语言(第2版)》郑晓薇编著配套实验 │ │ ├── 0.DOS及DEBUG介绍.md │ │ ├── 1.指令系统与寻址方式.md │ │ ├── 2.汇编语言程序设计.md │ │ ├── 3.走向分支.md │ │ ├── 4.循环之循环.md │ │ ├── 5.子程序与模块化.md │ │ ├── 6.宏与多模块.md │ │ ├── 7.中断程序设计.md │ │ └── 8.汇编综合实验.md ├── 算法 │ └── 经典算法解题实战 │ │ ├── 0.字符串(一).md │ │ ├── 1.字符串(二).md │ │ ├── 10.数学和位运算(三).md │ │ ├── 11.链表(一).md │ │ ├── 12.链表(二).md │ │ ├── 13.链表(三).md │ │ ├── 14.链表(四).md │ │ ├── 15.链表(五).md │ │ ├── 16.二叉树(一).md │ │ ├── 17.二叉树(二).md │ │ ├── 18.二叉树(三).md │ │ ├── 19.二叉树(四).md │ │ ├── 2.整型数组(一).md │ │ ├── 20.二叉搜索树.md │ │ ├── 21.穷竭搜索(一).md │ │ ├── 22.穷竭搜索(二).md │ │ ├── 23.穷竭搜索(三).md │ │ ├── 24.动态规划(一).md │ │ ├── 25.动态规划(二).md │ │ ├── 26.动态规划(三).md │ │ ├── 27.动态规划(四).md │ │ ├── 28.动态规划(五).md │ │ ├── 29.图算法.md │ │ ├── 3.整型数组(二).md │ │ ├── 30.数据结构.md │ │ ├── 31.其他(一).md │ │ ├── 32.其他(二).md │ │ ├── 4.整型数组(三).md │ │ ├── 5.二分搜索(一).md │ │ ├── 6.二分搜索(二).md │ │ ├── 7.二分搜索(三).md │ │ ├── 8.数学和位运算(一).md │ │ └── 9.数学和位运算(二).md ├── 网络 │ ├── Floodlight入门教程 │ │ └── 0.Floodlight入门教程.md │ ├── SDN软件定义网络动手实验 │ │ ├── 0.SDN初试.md │ │ ├── 1.mininet使用.md │ │ ├── 2.mininet自定义拓扑.md │ │ └── 3.Ryu的RESTAPI.md │ ├── TCP&IP网络协议基础 │ │ ├── 0.TCP&IP简介.md │ │ ├── 1.链路层介绍.md │ │ ├── 2.IP网际协议.md │ │ ├── 3.网络层其它协议.md │ │ ├── 4.传输层:UDP协议.md │ │ ├── 5.传输层:TCP协议.md │ │ ├── 6.应用层协议一.md │ │ └── 7.应用层协议二.md │ └── Wireshark抓包解析OpenFlow协议 │ │ └── 0.Wireshark抓包解析OpenFlow协议.md └── 计算机专业课 │ ├── C++11&14 高速上手教程 │ ├── 0.C++11&14 简介.md │ ├── 1.语言可用性的强化.md │ ├── 2.语言运行期的强化.md │ ├── 3.对标准库的扩充 │ ├── 4.对标准库的扩充 │ ├── 5.对标准库的扩充 │ ├── 6.对标准库的扩充 │ ├── 7.其他杂项.md │ └── 8.扩展主题 │ ├── C语言入门教程 │ ├── 0.为什么是c-因为你无可替代.md │ ├── 1.开发环境和剖析第一个c语言.md │ ├── 10.指针(二).md │ ├── 11.文件与文件的输入与输出.md │ ├── 2.顺序程序设计-数据类型(一).md │ ├── 3.顺序程序设计-数据类型(二).md │ ├── 4.顺序程序设计-运算符和数据转换.md │ ├── 5.选择程序设计.md │ ├── 6.循环程序设计.md │ ├── 7.c语言数组.md │ ├── 8.模块化程序设计.md │ └── 9.指针(一).md │ ├── Linux内核分析 │ ├── 0.通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的.md │ ├── 1.完成一个简单的时间片轮转多道程序内核代码.md │ ├── 2.跟踪分析Linux内核的启动过程.md │ ├── 3.使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用.md │ ├── 4.分析system_call中断处理过程.md │ ├── 5.分析Linux内核创建一个新进程的过程.md │ ├── 6.Linux内核如何装载和启动一个可执行程序.md │ ├── 7.理解进程调度时机跟踪分析进程调度与进程切换的过程.md │ └── 8.Linux内核学习总结.md │ ├── TCP&IP网络协议基础 │ ├── 0.TCP&IP简介.md │ ├── 1.链路层介绍.md │ ├── 2.IP网际协议.md │ ├── 3.网络层其它协议.md │ ├── 4.传输层:UDP协议.md │ ├── 5.传输层:TCP协议.md │ └── 6.应用层协议.md │ ├── 《C++语言程序设计(第4版)》(郑莉著)配套实验 │ ├── 0.C++语言介绍.md │ ├── 1.C++简单程序设计.md │ ├── 10.流类库与输入&输出.md │ ├── 11.异常处理.md │ ├── 2.C++函数.md │ ├── 3.C++类与对象.md │ ├── 4.数据的共享与保护.md │ ├── 5.数组、指针与字符串.md │ ├── 6.继承与派生.md │ ├── 7.多态性.md │ ├── 8.群体类和群体数据的组织.md │ └── 9.泛型程序设计与C++标准模板库.md │ ├── 《汇编语言(第2版)》郑晓薇编著配套实验 │ ├── 0.DOS及DEBUG介绍.md │ ├── 1.指令系统与寻址方式.md │ ├── 2.汇编语言程序设计.md │ ├── 3.走向分支.md │ ├── 4.循环之循环.md │ ├── 5.子程序与模块化.md │ ├── 6.宏与多模块.md │ ├── 7.中断程序设计.md │ └── 8.汇编综合实验.md │ ├── 操作系统原理与实践 │ ├── 0.熟悉实验环境.md │ ├── 1.操作系统的引导.md │ ├── 2.系统调用.md │ ├── 3.进程运行轨迹的跟踪与统计.md │ ├── 4.基于内核栈切换的进程切换.md │ ├── 5.信号量的实现和应用.md │ ├── 6.地址映射与共享.md │ ├── 7.终端设备的控制.md │ └── 8.proc文件系统的实现.md │ ├── 操作系统实验-基于uCore OS │ ├── 0.lab0:Coding!.md │ ├── 1.lab1:启动操作系统.md │ ├── 2.lab2 :物理内存管理.md │ ├── 3.lab3 :虚拟内存管理.md │ ├── 4.lab4 :内核线程.md │ ├── 5.lab5 :用户进程.md │ └── 6.lab6 :处理器调度.md │ ├── 数据结构(新版) │ ├── 0.基本概念.md │ ├── 1.线性结构-线性表.md │ ├── 2.线性结构-栈和队列.md │ ├── 3.非线性结构-树.md │ ├── 4.非线性结构-图.md │ ├── 5.查找.md │ ├── 6.插入排序.md │ ├── 7.交换排序.md │ ├── 8.选择排序.md │ └── 9.归并排序和基数排序.md │ ├── 经典算法解题实战 │ ├── 0.字符串(一).md │ ├── 1.字符串(二).md │ ├── 10.数学和位运算(三).md │ ├── 11.链表(一).md │ ├── 12.链表(二).md │ ├── 13.链表(三).md │ ├── 14.链表(四).md │ ├── 15.链表(五).md │ ├── 16.二叉树(一).md │ ├── 17.二叉树(二).md │ ├── 18.二叉树(三).md │ ├── 19.二叉树(四).md │ ├── 2.整型数组(一).md │ ├── 20.二叉搜索树.md │ ├── 21.穷竭搜索(一).md │ ├── 22.穷竭搜索(二).md │ ├── 23.穷竭搜索(三).md │ ├── 24.动态规划(一).md │ ├── 25.动态规划(二).md │ ├── 26.动态规划(三).md │ ├── 27.动态规划(四).md │ ├── 28.动态规划(五).md │ ├── 29.图算法.md │ ├── 3.整型数组(二).md │ ├── 30.数据结构.md │ ├── 31.其他(一).md │ ├── 32.其他(二).md │ ├── 4.整型数组(三).md │ ├── 5.二分搜索(一).md │ ├── 6.二分搜索(二).md │ ├── 7.二分搜索(三).md │ ├── 8.数学和位运算(一).md │ └── 9.数学和位运算(二).md │ └── 软件工程(C编码实践篇) │ ├── 0.实验一:写一个hello world小程序.md │ ├── 1.实验二:命令行菜单小程序V1.0,具体要求参见视频.md │ ├── 2.实验三:内部模块化的命令行菜单小程序V2.0.md │ ├── 3.实验四:用可重用的链表模块来实现命令行菜单小程序V2.5.md │ ├── 4.实验五:用callback增强链表模块来实现命令行菜单小程序V2.8.md │ ├── 5.实验六:函数的可重入性(reentrant)及线程安全.md │ └── 6.实验七:将menu设计为可重用的子系统.md ├── ex └── function.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | *.log 3 | *.tmp 4 | *.swp 5 | tags 6 | config.php 7 | cookie -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 DZLZH 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /config.example.php: -------------------------------------------------------------------------------- 1 | 7 | * +-------------------------------------------------------------- 8 | * | Filename: config.example.php 9 | * +-------------------------------------------------------------- 10 | * | Last modified: 2016-11-15 20:58 11 | * +-------------------------------------------------------------- 12 | * | Description: 13 | * +-------------------------------------------------------------- 14 | */ 15 | 16 | require_once 'function.php'; 17 | 18 | $basePath = 'courses' . DIRECTORY_SEPARATOR; 19 | 20 | $userAgent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.87 Safari/537.36'; 21 | 22 | $url = array( 23 | 'root' => 'https://www.shiyanlou.com', 24 | 'login' => 'https://www.shiyanlou.com/login', 25 | 'courses' => 'https://www.shiyanlou.com/courses/?course_type=all', 26 | ); 27 | 28 | 29 | $loginParam = array( 30 | 'login' => '', 31 | 'password' => '', 32 | ); 33 | 34 | $coursesParam = array( 35 | //标签 36 | 'tag' => 'php', 37 | 38 | //类别 39 | //free 免费 40 | //limited 限免 41 | //member 会员 42 | 'fee' => 'free', 43 | 44 | //排序 45 | //latest 最新 46 | //hotest 最热 47 | 'order' => 'latest', 48 | 49 | //页码 50 | // 'page' => '1', 51 | ); 52 | 53 | $tag = array( 54 | 'Python', 55 | 'C/C++', 56 | 'Linux', 57 | 'Web', 58 | 'PHP', 59 | 'Java', 60 | '信息安全', 61 | 'NodeJS', 62 | 'Android', 63 | 'GO', 64 | '计算机专业课', 65 | 'Spark', 66 | 'Hadoop', 67 | 'HTML5', 68 | 'Scala', 69 | 'SQL', 70 | 'Ruby', 71 | 'R', 72 | '网络', 73 | 'Git', 74 | 'NoSQL', 75 | '算法', 76 | 'Docker', 77 | 'Swift', 78 | '汇编', 79 | 'Windows', 80 | ); 81 | -------------------------------------------------------------------------------- /convert.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ls -1 courses/*/*/*.md | while read loop 4 | do 5 | sed -i -f ex "$loop" 6 | done 7 | -------------------------------------------------------------------------------- /courses/C&C++/C++11&14 高速上手教程/3.对标准库的扩充: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dzlzh/shiyanlou-courses/a50f7177d392c71cfa702d23679295d541655374/courses/C&C++/C++11&14 高速上手教程/3.对标准库的扩充 -------------------------------------------------------------------------------- /courses/C&C++/C++11&14 高速上手教程/4.对标准库的扩充: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dzlzh/shiyanlou-courses/a50f7177d392c71cfa702d23679295d541655374/courses/C&C++/C++11&14 高速上手教程/4.对标准库的扩充 -------------------------------------------------------------------------------- /courses/C&C++/C++11&14 高速上手教程/5.对标准库的扩充: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dzlzh/shiyanlou-courses/a50f7177d392c71cfa702d23679295d541655374/courses/C&C++/C++11&14 高速上手教程/5.对标准库的扩充 -------------------------------------------------------------------------------- /courses/C&C++/C++11&14 高速上手教程/6.对标准库的扩充: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dzlzh/shiyanlou-courses/a50f7177d392c71cfa702d23679295d541655374/courses/C&C++/C++11&14 高速上手教程/6.对标准库的扩充 -------------------------------------------------------------------------------- /courses/C&C++/C++11&14 高速上手教程/8.扩展主题: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dzlzh/shiyanlou-courses/a50f7177d392c71cfa702d23679295d541655374/courses/C&C++/C++11&14 高速上手教程/8.扩展主题 -------------------------------------------------------------------------------- /courses/C&C++/Linux系统编程/0.课程介绍.md: -------------------------------------------------------------------------------- 1 | 2 | #Linux 系统编程课程介绍 3 | 4 | --- 5 | 6 | 本实验所有的源代码都可下载: 7 | 8 | ``` 9 | git clone http://git.shiyanlou.com/shiyanlou/Linux-c-code 10 | ``` 11 | 12 | 13 | 14 | Linux-c-code为[实验楼](http://shiyanlou.com)课程[Linux系统编程](http://www.shiyanlou.com/courses/24)配套代码。 15 | 16 | 17 | | 资源 | 所属课时 | 包含源文件 | 18 | | :-------- | :----------:| :---------: | 19 | | gcc | 1 | hello.c、hello.h、hello_main.c、hello_print.c | 20 | | gdb | 2 | test.c | 21 | | makefile | 3 | code.c、code.h、Makefile、prog.c | 22 | | IO-1 | 4 | lseek.c、open.c、read_write.c、select.c | 23 | | IO-2 | 5 | stat_base.c、stat_type.c、statu_dir.c | 24 | 25 | **Linux系统编程**持续更新中,请关注:http://www.shiyanlou.com/courses/24 26 | 27 | 想学多课程?请访问**实验楼**:http://www.shiyanlou.com 28 | 29 | 提需求?求助攻?有建议?想灌水?干货分享! 30 | 31 | 实验中有任何问题欢迎到[实验楼问答](http://www.shiyanlou.com/questions)提问。 32 | -------------------------------------------------------------------------------- /courses/C&C++/数据结构(新版)/6.插入排序.md: -------------------------------------------------------------------------------- 1 | # 插入排序 2 | 3 | ## 实验简介 4 | 5 | 学习了前面一章的查找,我们知道二分查找需要先对数据进行排序,那么这章开始我们就来讲解一下几种经典的排序算法。 6 | 7 | ## 一、直接插入排序 8 | 9 | 首先我们来讲直接插入排序,它的做法是:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程,如下图所示。 10 | 11 | ![](https://dn-anything-about-doc.qbox.me/sjjg/35.gif) 12 | 13 | 直接插入排序的代码实现: 14 | ``` 15 | #include 16 | #include 17 | 18 | int n; 19 | 20 | /* 21 | * 直接插入排序 22 | */ 23 | void InsertSort(int *array) 24 | { 25 | int i, j; 26 | for (i = 2; i <= n; i++) 27 | { 28 | if (array[i] < array[i - 1]) 29 | { 30 | array[0] = array[i]; 31 | array[i] = array[i - 1]; 32 | for (j = i - 2; array[0] < array[j]; j--) 33 | { 34 | array[j + 1] = array[j]; 35 | } 36 | array[j + 1] = array[0]; 37 | } 38 | } 39 | } 40 | 41 | int main() 42 | { 43 | int i; 44 | int *array; 45 | printf("请输入数组的大小:"); 46 | scanf("%d", &n); 47 | array = (int*) malloc(sizeof(int) * (n + 1)); 48 | printf("请输入数据(用空格分隔):"); 49 | for (i = 1; i <= n; i++) 50 | { 51 | scanf("%d", &array[i]); 52 | } 53 | InsertSort(array); 54 | printf("排序后为:"); 55 | for (i = 1; i <= n; i++) 56 | { 57 | printf("%d ", array[i]); 58 | } 59 | printf("\n"); 60 | } 61 | ``` 62 | 63 | ## 二、希尔排序 64 | 65 | 希尔排序也是插入排序的一种,但它在效率上要比上面的直接插入排序高,它是对直接插入排序的改进,它的基本思想是先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2< d1重复上述的分组和排序,直至所取的增量dt=1(dt<…< d2< d1),即所有记录放在同一组中进行直接插入排序为止,增量序列尤为关键,一般的初次取序列的一半为增量,以后每次减半,直到增量为1,大致过程如下图所示。 66 | 67 | ![](https://dn-anything-about-doc.qbox.me/sjjg/33.png) 68 | 69 | ![](https://dn-anything-about-doc.qbox.me/sjjg/36.gif) 70 | 71 | 希尔排序的代码实现: 72 | ``` 73 | #include 74 | #include 75 | 76 | int n; 77 | 78 | /* 79 | * 希尔排序 80 | */ 81 | void ShellSort(int *array) 82 | { 83 | int k = n / 2; //增量序列(仅作举例) 84 | while (k > 0) 85 | { 86 | int i, j; 87 | for (i = k + 1; i <=n; i++) 88 | { 89 | if (array[i] < array[i - k]) 90 | { 91 | array[0] = array[i]; 92 | for (j = i - k; j > 0 && array[0] < array[j]; j -= k) 93 | { 94 | array[j + k] = array[j]; 95 | } 96 | array[j + k] = array[0]; 97 | } 98 | } 99 | k = k / 2; 100 | } 101 | } 102 | 103 | int main() 104 | { 105 | int i; 106 | int *array; 107 | printf("请输入数组的大小:"); 108 | scanf("%d", &n); 109 | array = (int*) malloc(sizeof(int) * (n + 1)); 110 | printf("请输入数据(用空格分隔):"); 111 | for (i = 1; i <= n; i++) 112 | { 113 | scanf("%d", &array[i]); 114 | } 115 | ShellSort(array); 116 | printf("排序后为:"); 117 | for (i = 1; i <= n; i++) 118 | { 119 | printf("%d ", array[i]); 120 | } 121 | printf("\n"); 122 | } 123 | ``` 124 | 125 | ## 三、小结 126 | 127 | 这一章讲了插入排序中的两个经典算法,直接插入排序和希尔排序。直接插入排序的主要思想是每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序,它属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1)。希尔排序的主要思想是分组插入,它是不稳定的排序,它的时间复杂度跟增量序列有关,在取增量序列时要保证其中的值没有除1之外的公因子,并且最后一个增量值必为1。 128 | 129 | ## 作业 130 | 131 | 结合这章讲的插入排序实现二分查找。 132 | 133 | 实验中有任何问题欢迎到[实验楼问答](http://www.shiyanlou.com/questions)提问。 134 | 135 | 136 | -------------------------------------------------------------------------------- /courses/C&C++/用 C语言编写自己的编程语言/10.更好的语言.md: -------------------------------------------------------------------------------- 1 | # 更好的语言 2 | 3 | ## 一、这只是一个开始 4 | 5 | 虽然我们对 `Lispy` 做了很多工作,但是它仍然离完全完整的生产力编程语言还有一段距离。 如果你试图使用它为任何足够大的项目,有一些你最终会遇到的问题和改进你必须做的。 解决这些问题将是什么会将它更多地纳入完全成熟的编程语言的范围。 6 | 7 | 这里有一些你可能会遇到的问题,这些问题的潜在解决方案,以及其他一些有趣的想法。 8 | 9 | ## 二、本地类型 10 | 11 | 目前我们的语言只包含本地 c `long` 和 `char *` 类型。 如果你想做任何有用的计算,这是相当限制。 我们对这些数据类型的操作也非常有限。 理想情况下,我们的语言应该包装所有的本地 c/c++ 类型,并允许操作它们的方法。 最重要的补充之一是操纵十进制数字的能力。 为此,我们可以添加 `double` 类型和相关操作。 使用多个数字类型,我们需要确保算术运算符(如 + 和 - )可以执行相关的运算。 12 | 13 | ## 三、用户定义的类型 14 | 15 | 除了添加对原生类型的支持外,最好能够给用户添加自己的新类型,就像我们在 c 中使用 `struct` 一样。使用的语法或方法取决于你怎么设计。这是一个非常重要的部分,使我们的语言可用于任何合理规模的项目。 16 | 17 | 这个任务可以给那些有想法的人试试,他们如何开发语言,他们想要的最终设计看起来像什么。 18 | 19 | ## 四、列表 20 | 21 | 一些 lisps 使用方括号 `[]`为列表提供文字符号。这种语法用于编写类似列表 `100(+ 10 20)300` ,在 `[]` 的要求为 `[100(+ 10 20)300]`。 在某些情况下,这显然更好,但它确实使用了可能用于更有趣的目的的 [] 字符。 22 | 23 | ## 五、操作系统交互 24 | 25 | 编程语言的一个重要部分是打开,读取和写入文件。 比如类似在 c 中,如 `fread`,`fwrite`,`fgetc` 等。 编写实现这个功能的函数是一个相当直接的任务,但确实需要编写相当多的函数。 这就是为什么我们还没有为我们的语言做到这一点。 26 | 27 | 很多的语言都可以操作文件系统,但是我们的语言还不行。我们应该给它改变目录,列出目录中的文件和处理其他事物的能力。这是一个容易的任务,但同样需要大量的 c 函数。脚本语言一般都有这些功能,所有如果想让我们的语言用起来更方便,可以试试。 28 | 29 | ## 六、哈希表 30 | 31 | 在我们用我们的语言查找变量名的时候,我们只是对环境中的所有变量进行线性搜索。 这变得越来越低效,我们已经定义的变量越多。 32 | 33 | 一个更有效的方法是实现一个哈希表。 此技术将变量名称转换为整数,并使用它来索引已知大小的数组,以找到与此符号相关联的值。 这是一个真正重要的数据结构,因为它在大量数据下有很好的性能。 34 | 35 | 任何有兴趣了解数据结构和算法的人都可以编写试试。 36 | 37 | ## 七、内存池分配 38 | 39 | 我们的 Lisp 很简单,它不快。它的性能是相对于一些脚本语言,如 Python 和 Ruby 。我们程序中的大部分性能开销来自于几乎任何事情都需要我们构造和销毁lval。因此我们经常调用 `malloc`。这是一个缓慢的功能,因为它需要操作系统为我们做一些管理。在进行计算时,有很多复制,分配和释放 `lval` 类型的操作。 40 | 41 | 如果我们希望减少这种开销,我们需要降低对 `malloc` 的调用次数。这样做的一种方法是在程序开始时调用 `malloc` 一次,分配一个大的内存池。然后,我们应该将所有的 `malloc` 调用替换为一些函数,这些函数切片并切分这些内存供程序使用。这意味着我们正在模拟操作系统的一些行为,但是以更快的本地方式。这个想法被称为内存池分配,并且是游戏开发中使用的常见技术,以及其他性能敏感的应用程序。 42 | 43 | ## 八、垃圾收集 44 | 45 | 其他 Lisps 分配变量不同于我们的。它们不会在环境中存储值的副本,而实际上是指向它的直接指针或引用。因为使用指针而不是副本,就像在 c 中一样,所需的开销要少得多。 46 | 47 | 如果我们存储指向值而不是副本的指针,我们需要确保指向的数据在某些其他值尝试使用之前不会被删除。执行此操作的一种方法称为标记和扫描,是监视环境中的那些值以及已分配的每个值。当一个变量放入环境中时,它和它所引用的一切都被标记。然后,当我们希望释放内存时,我们可以遍历每个分配,并删除任何未标记的内容。 48 | 49 | 这称为垃圾收集,是许多编程语言的一个组成部分。与内存池分配一样,实现垃圾收集器不需要很复杂,但它需要很认真地做,特别是如果你想让它有效率。实现这一点对于使这种语言,处理大量数据来说是实用的。 50 | 51 | ## 九、尾调用优化 52 | 53 | 我们的编程语言使用递归来完成它的循环。这在概念上是一个非常聪明的方式,但实际上它是相当差。递归函数调用自己来收集计算的所有部分结果,然后将所有结果组合在一起。这是一种浪费的计算方法,对于旨在运行许多或无限迭代的循环,这是特别有问题的。 54 | 55 | 一些递归函数可以自动转换为相应的 `while` 循环,它一步一步地累加总计,而不是完全累加。这种自动转换称为尾调用优化,是对使用递归执行大量循环的程序的一个基本优化。 56 | 57 | ## 十、词法定界 58 | 59 | 当我们的语言试图查找一个未定义的变量时,它会抛出一个错误。如果它能够告诉我们在运行程序之前哪些变量是未定义的,这将是更好的。这将让我们避免打字错误和其他恼人的错误。在程序运行之前找到这些问题被称为词法定界,并且使用变量定义的规则来尝试和推断哪些变量被定义,哪些变量不在程序中。 60 | 61 | ## 十一、静态类型 62 | 63 | 我们程序中的每个值都有一个相关的类型。这是我们知道在任何计算发生之前。我们的内置函数也只接受某些类型作为输入。我们应该能够使用这些信息来推断新的用户定义函数和值的类型。 我们还可以使用这些信息来检查在运行程序之前使用正确的类型调用函数。 这将减少在计算之前调用具有不正确类型的函数引起的任何错误。这种检查称为静态类型。 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /courses/C&C++/软件工程(C编码实践篇)/0.实验一:写一个hello world小程序.md: -------------------------------------------------------------------------------- 1 | ##实验一:写一个hello world小程序 2 | 3 | 4 | ###实验要求 5 | 6 | 写一个hello world小程序: 7 | - 在[实验楼Linux环境](https://www.shiyanlou.com/courses/122)使用C语言编写,编译后执行输出"Hello,World!"; 8 | - 实验和实验报告务必在实验楼linux下完成,课程视频是在本地虚拟机上操作的,除了目录环境和作业提交方式不同外,基本的命令和编辑操作方式是一致的。 9 | 10 | ###实验过程参考 11 | 12 | - 进入实验目录并创建实验一文件夹lab1 13 | 14 | ``` 15 | shiyanlou:~/ $ cd Code/shiyanlou_cs122 16 | shiyanlou:shiyanlou_cs122/ (master) $ mkdir lab1 17 | shiyanlou:shiyanlou_cs122/ (master) $ cd lab1 18 | shiyanlou:lab1/ (master*) $ vi hello.c 19 | ``` 20 | - 使用vi编辑hello.c文件 21 | 22 | ``` 23 | #include 24 | 25 | int main() 26 | { 27 | printf("hello world!\n"); 28 | } 29 | ``` 30 | - 编译执行hello程序 31 | 32 | ``` 33 | shiyanlou:lab1/ (master*) $ ls 34 | hello.c 35 | shiyanlou:lab1/ (master*) $ gcc -o hello hello.c 36 | shiyanlou:lab1/ (master*) $ ./hello 37 | hello world! 38 | shiyanlou:lab1/ (master*) $ 39 | ``` 40 | - 提交代码到版本库(注意不要使用视频中要求的打包文件提交作业),具体方法可以参考https://www.shiyanlou.com/questions/360 41 | 42 | ``` 43 | shiyanlou:lab1/ (master*) $ git add hello.c 44 | shiyanlou:lab1/ (master*) $ git commit -m "hello world" 45 | [master 40425fe] hello world 46 | 1 file changed, 7 insertions(+) 47 | create mode 100644 lab1/hello.c 48 | shiyanlou:lab1/ (master*) $ git push 49 | ...... 50 | 51 | Counting objects: 4, done. 52 | Delta compression using up to 4 threads. 53 | Compressing objects: 100% (2/2), done. 54 | Writing objects: 100% (3/3), 339 bytes | 0 bytes/s, done. 55 | Total 3 (delta 0), reused 0 (delta 0) 56 | To git@git.shiyanlou.com:mengning/shiyanlou_cs122.git 57 | 5f24b93..40425fe master -> master 58 | shiyanlou:lab1/ (master*) $ 59 | ``` 60 | 61 | 62 | ###实验报告要求 63 | 64 | 完成实验报告并公开发表(要求使用实验楼的实验报告),具体要求如下: 65 | 66 | - 简述自己的实验的思路和具体过程; 67 | - 引用实验中自己添加或修改的部分关键代码; 68 | - 至少有一张实验关键代码截图,至少有一张实验运行结果截图; 69 | - 将自己在实验中遇到疑惑和困难,以及自己的处理方法,实验心得等写入实验报告; 70 | - 实验报告的最后做一个简要的实验总结; 71 | - 将实验报告的URL提交到[网易云课堂MOOC平台](http://mooc.study.163.com/course/USTC-1000002006),编辑成一个链接可以直接点击打开。 72 | 73 | ###测试自己的实验代码,复审自己的实验报告 74 | 75 | 请务必确认您提交的实验报告中的实验代码可以直接启动实验环境进行如下操作 76 | 77 | ``` 78 | shiyanlou:~/ $ cd Code/code_refer 79 | shiyanlou:code_refer/ (master) $ ls 80 | README.md hello.c lab1 81 | shiyanlou:code_refer/ (master) $ cd lab1 82 | shiyanlou:lab1/ (master) $ gcc -o hello hello.c 83 | shiyanlou:lab1/ (master*) $ ./hello 84 | hello world! 85 | shiyanlou:lab1/ (master*) $ vi hello.c 86 | ``` 87 | 88 | -------------------------------------------------------------------------------- /courses/C&C++/软件工程(C编码实践篇)/1.实验二:命令行菜单小程序V1.0,具体要求参见视频.md: -------------------------------------------------------------------------------- 1 | ##实验二:命令行菜单小程序V1.0 2 | 3 | 务必在Code/shiyanlou_cs122目录下新创建一个目录lab2完成实验。 4 | 5 | ###一、实验要求 6 | 7 | ####1、代码风格规范: 8 | - 代码风格的原则:简明、易读、无二义性; 9 | - 缩进、命名、注释等代码编排的风格规范; 10 | - [《构建之法》4.1代码规范](http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html) 11 | - [高质量C++/C编程指南(林锐)](http://teamtrac.ustcsz.edu.cn/raw-attachment/wiki/ASE2013/%E9%AB%98%E8%B4%A8%E9%87%8FC%2B%2B%20C%E7%BC%96%E7%A8%8B%E6%8C%87%E5%8D%97.pdf) 12 | 13 | ####2、具体要求(参照视频中的具体实验过程): 14 | - 实现一个命令行的菜单小程序,执行某个命令时调用一个特定的函数作为执行动作,实现的命令个数不少于8个; 15 | - 类似ftp的help目录或者bash的help目录; 16 | - 程序循环、接收用户的命令,如help、others等命令; 17 | - 可以广泛通用的命令行菜单子系统组件,可方便地定制而嵌入到其他系统; 18 | 19 | ###一定要及时提交代码以防丢失 20 | 21 | ``` 22 | $ cd /home/shiyanlou/Code/shiyanlou_cs122/lab2 23 | # 修改代码文件 24 | # 添加修改文件 25 | $ git add 所有修改的文件 26 | # 提交到环境中本地代码仓库 27 | $ git commit -m '本次修改的描述' 28 | # push到git.shiyanlou.com,无需输入密码 29 | $ git push 30 | ``` 31 | 32 | 33 | ###实验报告要求 34 | 35 | 完成实验报告并公开发表(要求使用实验楼的实验报告),具体要求如下: 36 | 37 | - 务必注意本次实验以代码为主要评审对象; 38 | - 简述自己的实验的思路和具体过程; 39 | - 引用实验中自己添加或修改的部分关键代码; 40 | - 至少有一张实验关键代码截图,至少有一张实验运行结果截图; 41 | - 将自己在实验中遇到疑惑和困难,以及自己的处理方法,实验心得等写入实验报告; 42 | - 实验报告的最后做一个简要的实验总结; 43 | - 将实验报告的URL提交到[网易云课堂MOOC平台](http://mooc.study.163.com/course/USTC-1000002006),编辑成一个链接可以直接点击打开。 44 | 45 | 46 | ####测试自己的实验代码,复审自己的实验报告 47 | 请务必确认您提交的实验报告中的实验代码可以直接启动实验环境进行如下操作 48 | ``` 49 | shiyanlou:~/ $ cd Code/code_refer/lab2 50 | 编译代码 51 | 执行可执行程序 52 | 复审阅读代码 53 | ``` -------------------------------------------------------------------------------- /courses/C&C++/软件工程(C编码实践篇)/2.实验三:内部模块化的命令行菜单小程序V2.0.md: -------------------------------------------------------------------------------- 1 | ##实验三:内部模块化的命令行菜单小程序V2.0 2 | 3 | 务必在Code/shiyanlou_cs122目录下新创建一个目录lab3完成实验。 4 | 5 | ###实验要求(参照视频中的具体实验过程) 6 | 7 | - 注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑和菜单数据存储 8 | - 要求:1)遵守代码风格规范,参考借鉴代码设计规范的一些方法;2)代码的业务逻辑和数据存储使用不同的源文件实现,即应该有2个.c和一个.h作为接口文件。 9 | 10 | ###一定要及时提交代码以防丢失 11 | 12 | ``` 13 | $ cd /home/shiyanlou/Code/shiyanlou_cs122/lab3 14 | # 修改代码文件 15 | # 添加修改文件 16 | $ git add 所有修改的文件 17 | # 提交到环境中本地代码仓库 18 | $ git commit -m '本次修改的描述' 19 | # push到git.shiyanlou.com,无需输入密码 20 | $ git push 21 | ``` 22 | 23 | ###实验报告要求 24 | 25 | 完成实验报告并公开发表(要求使用实验楼的实验报告),具体要求如下: 26 | 27 | - 务必注意本次实验以代码为主要评审对象; 28 | - 简述自己的实验的思路和具体过程; 29 | - 引用实验中自己添加或修改的部分关键代码; 30 | - 至少有一张实验关键代码截图,至少有一张实验运行结果截图; 31 | - 将自己在实验中遇到疑惑和困难,以及自己的处理方法,实验心得等写入实验报告; 32 | - 实验报告的最后做一个简要的实验总结; 33 | - 将实验报告的URL提交到[网易云课堂MOOC平台](http://mooc.study.163.com/course/USTC-1000002006),编辑成一个链接可以直接点击打开。 34 | 35 | 36 | ####测试自己的实验代码,复审自己的实验报告 37 | 请务必确认您提交的实验报告中的实验代码可以直接启动实验环境进行如下操作 38 | ``` 39 | shiyanlou:~/ $ cd Code/code_refer/lab3 40 | 编译代码 41 | 执行可执行程序 42 | 复审阅读代码 43 | ``` -------------------------------------------------------------------------------- /courses/C&C++/软件工程(C编码实践篇)/3.实验四:用可重用的链表模块来实现命令行菜单小程序V2.5.md: -------------------------------------------------------------------------------- 1 | ##实验四:用可重用的链表模块来实现命令行菜单小程序V2.5 2 | 3 | 务必在Code/shiyanlou_cs122目录下新创建一个目录lab4完成实验。 4 | 5 | ###实验要求(参照视频中的具体实验过程) 6 | 7 | - 用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作; 8 | - 链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变; 9 | - 可以将通用的Linktable模块集成到我们的menu程序中; 10 | - 接口规范; 11 | 12 | ###一定要及时提交代码以防丢失 13 | 14 | ``` 15 | $ cd /home/shiyanlou/Code/shiyanlou_cs122/lab4 16 | # 修改代码文件 17 | # 添加修改文件 18 | $ git add 所有修改的文件 19 | # 提交到环境中本地代码仓库 20 | $ git commit -m '本次修改的描述' 21 | # push到git.shiyanlou.com,无需输入密码 22 | $ git push 23 | ``` 24 | 25 | ###实验报告要求 26 | 27 | 完成实验报告并公开发表(要求使用实验楼的实验报告),具体要求如下: 28 | 29 | - 务必注意本次实验以代码为主要评审对象; 30 | - 简述自己的实验的思路和具体过程; 31 | - 引用实验中自己添加或修改的部分关键代码; 32 | - 至少有一张实验关键代码截图,至少有一张实验运行结果截图; 33 | - 将自己在实验中遇到疑惑和困难,以及自己的处理方法,实验心得等写入实验报告; 34 | - 实验报告的最后做一个简要的实验总结; 35 | - 将实验报告的URL提交到[网易云课堂MOOC平台](http://mooc.study.163.com/course/USTC-1000002006),编辑成一个链接可以直接点击打开。 36 | 37 | 38 | ####测试自己的实验代码,复审自己的实验报告 39 | 请务必确认您提交的实验报告中的实验代码可以直接启动实验环境进行如下操作 40 | ``` 41 | shiyanlou:~/ $ cd Code/code_refer/lab4 42 | 编译代码 43 | 执行可执行程序 44 | 复审阅读代码 45 | ``` -------------------------------------------------------------------------------- /courses/C&C++/软件工程(C编码实践篇)/4.实验五:用callback增强链表模块来实现命令行菜单小程序V2.8.md: -------------------------------------------------------------------------------- 1 | ##实验五:用callback增强链表模块来实现命令行菜单小程序V2.8 2 | 3 | 务必在Code/shiyanlou_cs122目录下新创建一个目录lab5完成实验。 4 | 然后将lab5-1.tar.gz(在实验楼Linux虚拟机环境下~/se_files/目录下)中的代码(即解压后lab5.1/目录下的源文件)直接放到Code/shiyanlou_cs122/lab5/目录下继续完成后面的实验内容 5 | 6 | ###实验要求(参照视频中的具体实验过程) 7 | 8 | **本实验在提供的代码基础上进行** 9 | - 给lab5-1.tar.gz(在实验楼Linux虚拟机环境下~/se_files/目录下)找bug,quit命令无法运行的bug 10 | - 利用callback函数参数使Linktable的查询接口更加通用 11 | - 注意接口的信息隐藏 12 | 13 | ###一定要及时提交代码以防丢失 14 | 15 | ``` 16 | $ cd /home/shiyanlou/Code/shiyanlou_cs122/lab5 17 | # 修改代码文件 18 | # 添加修改文件 19 | $ git add 所有修改的文件 20 | # 提交到环境中本地代码仓库 21 | $ git commit -m '本次修改的描述' 22 | # push到git.shiyanlou.com,无需输入密码 23 | $ git push 24 | ``` 25 | 26 | ###实验报告要求 27 | 28 | 完成实验报告并公开发表(要求使用实验楼的实验报告),具体要求如下: 29 | 30 | - 务必注意本次实验以【关键代码】为主要评审对象; 31 | - 简述自己的实验的思路和具体过程; 32 | - 引用实验中自己添加或修改的部分关键代码; 33 | - 至少有一张实验关键代码截图,至少有一张实验运行结果截图; 34 | - 将自己在实验中遇到疑惑和困难,以及自己的处理方法,实验心得等写入实验报告; 35 | - 实验报告的最后做一个简要的实验总结; 36 | - 将实验报告的URL提交到[网易云课堂MOOC平台](http://mooc.study.163.com/course/USTC-1000002006),编辑成一个链接可以直接点击打开。 37 | 38 | 39 | ####测试自己的实验代码,复审自己的实验报告 40 | 请务必确认您提交的实验报告中的实验代码可以直接启动实验环境进行如下操作 41 | ``` 42 | shiyanlou:~/ $ cd Code/code_refer/lab5 43 | 编译代码 44 | 执行可执行程序 45 | 复审阅读代码 46 | ``` -------------------------------------------------------------------------------- /courses/C&C++/软件工程(C编码实践篇)/5.实验六:函数的可重入性(reentrant)及线程安全.md: -------------------------------------------------------------------------------- 1 | ##实验六:函数的可重入性(reentrant)及线程安全 2 | 3 | 本次作业为测验题请前往[网易云课堂](http://mooc.study.163.com/course/USTC-1000002006#/info)作答并提交,但您依然可以在Code/shiyanlou_cs122目录下新创建一个目录lab6来做实验。 -------------------------------------------------------------------------------- /courses/C&C++/软件工程(C编码实践篇)/6.实验七:将menu设计为可重用的子系统.md: -------------------------------------------------------------------------------- 1 | ##实验七:将menu设计为可重用的子系统 2 | 3 | 务必在Code/shiyanlou_cs122目录下新创建一个目录lab7完成实验。 4 | 5 | ###实验要求(参照视频中的具体实验过程) 6 | 7 | - 为menu子系统设计接口,并写用户范例代码来实现原来的功能; 8 | - 使用make和make clean来编译程序和清理自动生成的文件; 9 | - 使menu子系统支持带参数的复杂命令,并在用户范例代码中自定义一个带参数的复杂命令; 10 | - 可以使用getopt函数获取命令行参数。 11 | 12 | ###一定要及时提交代码以防丢失 13 | 14 | ``` 15 | $ cd /home/shiyanlou/Code/shiyanlou_cs122/lab7 16 | # 修改代码文件 17 | # 添加修改文件 18 | $ git add 所有修改的文件 19 | # 提交到环境中本地代码仓库 20 | $ git commit -m '本次修改的描述' 21 | # push到git.shiyanlou.com,无需输入密码 22 | $ git push 23 | ``` 24 | 25 | ###实验报告要求 26 | 27 | 完成实验报告并公开发表(要求使用实验楼的实验报告),具体要求如下: 28 | 29 | - 务必注意本次实验以代码为主要评审对象; 30 | - 简述自己的实验的思路和具体过程; 31 | - 引用实验中自己添加或修改的部分关键代码; 32 | - 至少有一张实验关键代码截图,至少有一张实验运行结果截图; 33 | - 将自己在实验中遇到疑惑和困难,以及自己的处理方法,实验心得等写入实验报告; 34 | - 实验报告的最后做一个简要的实验总结; 35 | - 将实验报告的URL提交到[网易云课堂MOOC平台](http://mooc.study.163.com/course/USTC-1000002006),编辑成一个链接可以直接点击打开。 36 | 37 | 38 | ####测试自己的实验代码,复审自己的实验报告 39 | 请务必确认您提交的实验报告中的实验代码可以直接启动实验环境进行如下操作 40 | ``` 41 | shiyanlou:~/ $ cd Code/code_refer/lab7 42 | 编译代码(这里应该是使用make和make clean了) 43 | 执行可执行程序 44 | 复审阅读代码 45 | ``` -------------------------------------------------------------------------------- /courses/GO/Go by Example 中文版/0.课程说明与学习方法.md: -------------------------------------------------------------------------------- 1 | # 课程说明与学习方法 2 | 3 | ## 一、课程说明 4 | 5 | 本课程基于Go By Example教程中文版制作。[Go](http://golang.org/) 是一个被设计用来建立简单,快速和可信赖的软件的开源程序设计语言。 6 | 7 | Go by Example 是一个实践性的教程,通过带注释的程序实例去学习 Go 语言。我们希望这个教程能给你在学习 Go 语言的过程中提供思路和源码方面的参考,请按照教程在线完成代码并理解每行代码。 8 | 9 | ### 课程来源 10 | 11 | 本课程来自[everyx](http://everyx.in)翻译的[《Go by Example 中文》](http://gobyexample.everyx.in/)项目。 12 | 13 | 该项目是是 [mmcgrana](https://github.com/mmcgrana) 的 [Go by Example](https://github.com/mmcgrana/gobyexample) 中文翻译,除为 github page 做出的部分修改外,完全遵从原作的模式。 14 | 15 | #### 相关链接 16 | 17 | + Go By Example英文:[https://github.com/mmcgrana/gobyexample](https://github.com/mmcgrana/gobyexample) 18 | + Go By Example中文:[http://gobyexample.everyx.in/](http://gobyexample.everyx.in/) 19 | + 项目Github地址:[https://github.com/everyx/gobyexample](https://github.com/everyx/gobyexample) 20 | 21 | ### 适用用户 22 | 23 | 我们假设本课程的用户已经掌握: 24 | 25 | + 计算机基础知识 26 | + 任意一门语言的编程基础 27 | + 实验楼Linux环境的基本用法 28 | 29 | ### 许可证 30 | 31 | This work is copyright Mark McGranaghan and licensed under a 32 | [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/). 33 | 34 | The Go Gopher is copyright the Go Authors and licensed under a 35 | [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/). 36 | 37 | 38 | ### 致谢 39 | 40 | + 感谢译者 [everyx](http://everyx.in) 授权实验楼制作本实验课程。 41 | + 感谢原作者 [mmcgrana](https://github.com/mmcgrana) 提供的高质量教程。 42 | 43 | ## 二、学习方法 44 | 45 | ### 在线实验 46 | 47 | 实验楼的理念是理论与实践相结合,点击开始实验进入实验环境后,按照左边的教程在环境中操作,需要注意: 48 | 49 | + 课程提供Go实例的实现代码,请仔细阅读并在环境中实现。 50 | + 实验环境中已内置课程所需的开发工具,例如go环境,Vim等。 51 | + 如果对实验环境不熟悉,请先观看[实验入门视频教程](https://www.shiyanlou.com/questions/2544)。 52 | + 如果对编程语言不熟悉,请先学习相关实验课程。 53 | + 如果要保存实验代码,可以使用[我的代码库](https://www.shiyanlou.com/questions/360)功能。 54 | 55 | ### 课程问答 56 | 57 | 实验中遇到任何问题,可以在[实验楼问答](https://www.shiyanlou.com/questions)中提问。我们鼓励大家多多提问,也希望能回复同学提出的问题。交流与分享才能获得更快的成长。 58 | 59 | 如果发现文档中有任何错误,也可以在[实验楼问答](https://www.shiyanlou.com/questions)提出,我们会及时修复。 60 | 61 | ### 实验报告 62 | 63 | 实验报告是每次实验的数据汇总,可以在实验报告中使用Markdown记录实验心得和收获,使用方法见[实验报告的使用方法](https://www.shiyanlou.com/questions/670)。 64 | 65 | ## 三、开发第一个Go程序 Hello World 66 | 67 | 我们的第一个程序将打印传说中的 "hello world"消息,下面是完整的程序代码和编译运行过程。 68 | 69 | ### 1. 编写代码 70 | 71 | 打开桌面上的gedit,输入以下代码: 72 | 73 | ``` 74 | package main 75 | import "fmt" 76 | func main() { 77 | fmt.Println("hello world") 78 | } 79 | ``` 80 | 81 | 将代码文件保存为`/home/shiyanlou/hello-world.go`。 82 | 83 | ### 2. 运行程序 84 | 85 | 打开桌面上的Xfce终端,输入下面的命令查看输出。 86 | 87 | 要运行这个程序,将这些代码放到 hello-world.go 中并且使用 go run 命令。 88 | 89 | ``` 90 | $ go run hello-world.go 91 | hello world 92 | ``` 93 | 94 | 有时候我们想将我们的程序编译成二进制文件。我们可以通过 go build 命来达到目的。 95 | 96 | ``` 97 | $ go build hello-world.go 98 | $ ls 99 | hello-world hello-world.go 100 | ``` 101 | 102 | 然后我们可以直接运行这个二进制文件。 103 | 104 | ``` 105 | $ ./hello-world 106 | hello world 107 | ``` 108 | 109 | 现在我们可以运行和并以基本的 Go 程序,让我们进入下一个实验学习更多的关于这门语言的知识吧。 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /courses/GO/Go by Example 中文版/1.值,变量,常量.md: -------------------------------------------------------------------------------- 1 | ## 值 2 | 3 | ### 代码实例 4 | 5 | Go 拥有各值类型,包括字符串,整形,浮点型,布尔型等。下面是一些基本的例子。 6 | 7 | ``` 8 | package main 9 | 10 | import "fmt" 11 | 12 | func main() { 13 | 14 | // 字符串可以通过 `+` 连接。 15 | fmt.Println("go" + "lang") 16 | 17 | // 整数和浮点数 18 | fmt.Println("1+1 =", 1+1) 19 | fmt.Println("7.0/3.0 =", 7.0/3.0) 20 | 21 | // 布尔型,还有你想要的逻辑运算符。 22 | fmt.Println(true && false) 23 | fmt.Println(true || false) 24 | fmt.Println(!true) 25 | } 26 | ``` 27 | 28 | 将代码保存为`/home/shiyanlou/values.go`文件。 29 | 30 | ### 运行程序 31 | 32 | 打开桌面上的Xfce终端,输入下面的命令查看输出: 33 | 34 | ``` 35 | $ cd /home/shiyanlou/ 36 | $ go run values.go 37 | golang 38 | 1+1 = 2 39 | 7.0/3.0 = 2.3333333333333335 40 | false 41 | true 42 | false 43 | ``` 44 | 45 | ## 变量 46 | 47 | ### 代码实例 48 | 49 | 50 | 在 Go 中,变量 被显式声明,并被编译器所用来检查函数调用时的类型正确性 51 | 52 | ``` 53 | package main 54 | 55 | import "fmt" 56 | 57 | func main() { 58 | 59 | // `var` 声明 1 个或者多个变量。 60 | var a string = "initial" 61 | fmt.Println(a) 62 | 63 | // 你可以申明一次性声明多个变量。 64 | var b, c int = 1, 2 65 | fmt.Println(b, c) 66 | 67 | // Go 将自动推断已经初始化的变量类型。 68 | var d = true 69 | fmt.Println(d) 70 | 71 | // 声明变量且没有给出对应的初始值时,变量将会初始化为 72 | // _零值_ 。例如,一个 `int` 的零值是 `0`。 73 | var e int 74 | fmt.Println(e) 75 | 76 | // `:=` 语句是申明并初始化变量的简写,例如 77 | // 这个例子中的 `var f string = "short"`。 78 | f := "short" 79 | fmt.Println(f) 80 | } 81 | ``` 82 | 83 | 将代码保存为`/home/shiyanlou/variables.go`文件。 84 | 85 | ### 运行程序 86 | 87 | 打开桌面上的Xfce终端,输入下面的命令查看输出: 88 | 89 | ``` 90 | $ cd /home/shiyanlou/ 91 | $ go run variables.go 92 | initial 93 | 1 2 94 | true 95 | 0 96 | short 97 | ``` 98 | 99 | ## 常量 100 | 101 | ### 代码实例 102 | 103 | Go 支持字符、字符串、布尔和数值 常量 。 104 | 105 | ``` 106 | // Go 支持字符、字符串、布尔和数值 _常量_ 。 107 | package main 108 | 109 | import "fmt" 110 | import "math" 111 | 112 | // `const` 用于声明一个常量。 113 | const s string = "constant" 114 | 115 | func main() { 116 | fmt.Println(s) 117 | 118 | // `const` 语句可以出现在任何 `var` 语句可以出现 119 | // 的地方 120 | const n = 500000000 121 | 122 | // 常数表达式可以执行任意精度的运算 123 | const d = 3e20 / n 124 | fmt.Println(d) 125 | 126 | // 数值型常量是没有确定的类型的,直到它们被给定了一个 127 | // 类型,比如说一次显示的类型转化。 128 | fmt.Println(int64(d)) 129 | 130 | // 当上下文需要时,一个数可以被给定一个类型,比如 131 | // 变量赋值或者函数调用。举个例子,这里的 `math.Sin` 132 | // 函数需要一个 `float64` 的参数。 133 | fmt.Println(math.Sin(n)) 134 | } 135 | ``` 136 | 137 | ### 运行程序 138 | 139 | 打开桌面上的Xfce终端,输入下面的命令查看输出: 140 | 141 | ``` 142 | $ go run constant.go 143 | constant 144 | 6e+11 145 | 600000000000 146 | -0.28470407323754404 147 | ``` 148 | -------------------------------------------------------------------------------- /courses/GO/Go by Example 中文版/17.SHA1散列,Base64编码.md: -------------------------------------------------------------------------------- 1 | ## SHA1散列 2 | 3 | 4 | ### 代码实例 5 | 6 | ``` 7 | // [_SHA1 散列_](http://en.wikipedia.org/wiki/SHA-1)经常用 8 | // 生成二进制文件或者文本块的短标识。例如,[git 版本控制系统](http://git-scm.com/) 9 | // 大量的使用 SHA1 来标识受版本控制的文件和目录。这里是 Go 10 | // 中如何进行 SHA1 散列计算的例子。 11 | 12 | package main 13 | 14 | // Go 在多个 `crypto/*` 包中实现了一系列散列函数。 15 | import "crypto/sha1" 16 | import "fmt" 17 | 18 | func main() { 19 | s := "sha1 this string" 20 | 21 | // 产生一个散列值得方式是 `sha1.New()`,`sha1.Write(bytes)`, 22 | // 然后 `sha1.Sum([]byte{})`。这里我们从一个新的散列开始。 23 | h := sha1.New() 24 | 25 | // 写入要处理的字节。如果是一个字符串,需要使用 26 | // `[]byte(s)` 来强制转换成字节数组。 27 | h.Write([]byte(s)) 28 | 29 | // 这个用来得到最终的散列值的字符切片。`Sum` 的参数可以 30 | // 用来都现有的字符切片追加额外的字节切片:一般不需要要。 31 | bs := h.Sum(nil) 32 | 33 | // SHA1 值经常以 16 进制输出,例如在 git commit 中。使用 34 | // `%x` 来将散列结果格式化为 16 进制字符串。 35 | fmt.Println(s) 36 | fmt.Printf("%x\n", bs) 37 | } 38 | ``` 39 | 40 | ### 运行程序 41 | 42 | ``` 43 | # 运行程序计算散列值并以可读 16 进制格式输出。 44 | $ go run sha1-hashes.go 45 | sha1 this string 46 | cf23df2207d99a74fbe169e3eba035e633b65d94 47 | 48 | 49 | # 你可以使用和上面相似的方式来计算其他形式的散列值。例 50 | # 如,计算 MD5 散列,引入 `crypto/md5` 并使用 `md5.New()` 51 | # 方法。 52 | 53 | # 注意,如果你需要密码学上的安全散列,你需要小心的研究一下 54 | # [哈希强度](http://en.wikipedia.org/wiki/Cryptographic_hash_function)。 55 | ``` 56 | 57 | ## Base64编码 58 | 59 | 60 | ### 代码实例 61 | 62 | ``` 63 | // Go 提供内建的 [base64 编解码](http://zh.wikipedia.org/wiki/Base64)支持。 64 | 65 | package main 66 | 67 | // 这个语法引入了 `encoding/base64` 包并使用名称 `b64` 68 | // 代替默认的 `base64`。这样可以节省点空间。 69 | import b64 "encoding/base64" 70 | import "fmt" 71 | 72 | func main() { 73 | 74 | // 这是将要编解码的字符串。 75 | data := "abc123!?$*&()'-=@~" 76 | 77 | // Go 同时支持标准的和 URL 兼容的 base64 格式。编码需要 78 | // 使用 `[]byte` 类型的参数,所以要将字符串转成此类型。 79 | sEnc := b64.StdEncoding.EncodeToString([]byte(data)) 80 | fmt.Println(sEnc) 81 | 82 | // 解码可能会返回错误,如果不确定输入信息格式是否正确, 83 | // 那么,你就需要进行错误检查了。 84 | sDec, _ := b64.StdEncoding.DecodeString(sEnc) 85 | fmt.Println(string(sDec)) 86 | fmt.Println() 87 | 88 | // 使用 URL 兼容的 base64 格式进行编解码。 89 | uEnc := b64.URLEncoding.EncodeToString([]byte(data)) 90 | fmt.Println(uEnc) 91 | uDec, _ := b64.URLEncoding.DecodeString(uEnc) 92 | fmt.Println(string(uDec)) 93 | } 94 | ``` 95 | 96 | ### 运行程序 97 | 98 | ``` 99 | # 标准 base64 编码和 URL 兼容 base64 编码的编码字符串存在 100 | # 稍许不同(后缀为 `+` 和 `-`),但是两者都可以正确解码为 101 | # 原始字符串。 102 | $ go run base64-encoding.go 103 | YWJjMTIzIT8kKiYoKSctPUB+ 104 | abc123!?$*&()'-=@~ 105 | 106 | YWJjMTIzIT8kKiYoKSctPUB- 107 | abc123!?$*&()'-=@~ 108 | ``` -------------------------------------------------------------------------------- /courses/GO/Go by Example 中文版/4.函数,多返回值,变参函数.md: -------------------------------------------------------------------------------- 1 | ## 函数 2 | 3 | 4 | ### 代码实例 5 | 6 | ``` 7 | // _函数_ 是 Go 的中心。我们将通过一些不同的例子来 8 | // 进行学习。 9 | 10 | package main 11 | 12 | import "fmt" 13 | 14 | // 这里是一个函数,接受两个 `int` 并且以 `int` 返回它 15 | // 们的和 16 | func plus(a int, b int) int { 17 | 18 | // Go 需要明确的返回值,例如,它不会自动返回最 19 | // 后一个表达式的值 20 | return a + b 21 | } 22 | 23 | func main() { 24 | 25 | // 正如你期望的那样,通过 `name(args)` 来调用一 26 | // 个函数, 27 | res := plus(1, 2) 28 | fmt.Println("1+2 =", res) 29 | } 30 | 31 | // todo: coalesced parameter types 32 | ``` 33 | 34 | ### 运行程序 35 | 36 | ``` 37 | $ go run functions.go 38 | 1+2 = 3 39 | 40 | # 这里有许多 Go 函数的其他特性。其中一个就是多值返回,也是 41 | # 我们接下来需要接触的。 42 | ``` 43 | 44 | ## 多返回值 45 | 46 | 47 | ### 代码实例 48 | 49 | ``` 50 | // Go 内建_多返回值_ 支持。这个特性在 Go 语言中经常被用到, 51 | // 例如用来同时返回一个函数的结果和错误信息。 52 | 53 | package main 54 | 55 | import "fmt" 56 | 57 | // `(int, int)` 在这个函数中标志着这个函数返回 2 个 `int`。 58 | func vals() (int, int) { 59 | return 3, 7 60 | } 61 | 62 | func main() { 63 | 64 | // 这里我们通过_多赋值_ 操作来使用这两个不同的返回值。 65 | a, b := vals() 66 | fmt.Println(a) 67 | fmt.Println(b) 68 | 69 | // 如果你仅仅想返回值的一部分的话,你可以使用空白定 70 | // 义符 `_`。 71 | _, c := vals() 72 | fmt.Println(c) 73 | } 74 | 75 | // todo: named return parameters 76 | // todo: naked returns 77 | ``` 78 | 79 | ### 运行程序 80 | 81 | ``` 82 | $ go run multiple-return-values.go 83 | 3 84 | 7 85 | 7 86 | 87 | # 允许可变长参数是 Go 函数的另一个好的特性;我们将在接下来 88 | # 进行学习。 89 | ``` 90 | 91 | ## 变参函数 92 | 93 | 94 | ### 代码实例 95 | 96 | ``` 97 | // [_可变参数函数_](http://zh.wikipedia.org/wiki/可變參數函數)。可以用任意 98 | // 数量的参数调用。例如,`fmt.Println` 是一个常见的变参函数。 99 | 100 | package main 101 | 102 | import "fmt" 103 | 104 | // 这个函数使用任意数目的 `int` 作为参数。 105 | func sum(nums ...int) { 106 | fmt.Print(nums, " ") 107 | total := 0 108 | for _, num := range nums { 109 | total += num 110 | } 111 | fmt.Println(total) 112 | } 113 | 114 | func main() { 115 | 116 | // 变参函数使用常规的调用方式,除了参数比较特殊。 117 | sum(1, 2) 118 | sum(1, 2, 3) 119 | 120 | // 如果你的 slice 已经有了多个值,想把它们作为变参 121 | // 使用,你要这样调用 `func(slice...)`。 122 | nums := []int{1, 2, 3, 4} 123 | sum(nums...) 124 | } 125 | ``` 126 | 127 | ### 运行程序 128 | 129 | ``` 130 | $ go run variadic-functions.go 131 | [1 2] 3 132 | [1 2 3] 6 133 | [1 2 3 4] 10 134 | 135 | # Go 函数的另一个关键的方面是闭包结构,这是接下来我们需 136 | # 要看看的。 137 | ``` 138 | -------------------------------------------------------------------------------- /courses/GO/Go by Example 中文版/5.闭包,递归.md: -------------------------------------------------------------------------------- 1 | ## 闭包 2 | 3 | Go 支持通过 [闭包](http://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)") 来使用 [_匿名函数_](http://zh.wikipedia.org/wiki/%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0)。匿名函数在你想定义一个不需要命名的内联函数时是很实用的。 4 | 5 | ### 代码实例 6 | 7 | ``` 8 | 9 | package main 10 | 11 | import "fmt" 12 | 13 | // 这个 `intSeq` 函数返回另一个在 `intSeq` 函数体内定义的 14 | // 匿名函数。这个返回的函数使用闭包的方式 _隐藏_ 变量 `i`。 15 | func intSeq() func() int { 16 | i := 0 17 | return func() int { 18 | i += 1 19 | return i 20 | } 21 | } 22 | 23 | func main() { 24 | 25 | // 我们调用 `intSeq` 函数,将返回值(也是一个函数)赋给 26 | // `nextInt`。这个函数的值包含了自己的值 `i`,这样在每 27 | // 次调用 `nextInt` 是都会更新 `i` 的值。 28 | nextInt := intSeq() 29 | 30 | // 通过多次调用 `nextInt` 来看看闭包的效果。 31 | fmt.Println(nextInt()) 32 | fmt.Println(nextInt()) 33 | fmt.Println(nextInt()) 34 | 35 | // 为了确认这个状态对于这个特定的函数是唯一的,我们 36 | // 重新创建并测试一下。 37 | newInts := intSeq() 38 | fmt.Println(newInts()) 39 | } 40 | ``` 41 | 42 | ### 运行程序 43 | 44 | ``` 45 | $ go run closures.go 46 | 1 47 | 2 48 | 3 49 | 1 50 | 51 | # 我们马上要学习关于函数的最后一个特性,递归啦。 52 | ``` 53 | 54 | ## 递归 55 | 56 | Go 支持 [递归](http://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)。 57 | 58 | 这里是一个经典的阶乘示例。 59 | 60 | ### 代码实例 61 | 62 | ``` 63 | package main 64 | 65 | import "fmt" 66 | 67 | // `face` 函数在到达 `face(0)` 前一直调用自身。 68 | func fact(n int) int { 69 | if n == 0 { 70 | return 1 71 | } 72 | return n * fact(n-1) 73 | } 74 | 75 | func main() { 76 | fmt.Println(fact(7)) 77 | } 78 | ``` 79 | 80 | ### 运行程序 81 | 82 | ``` 83 | $ go run recursion.go 84 | 5040 85 | ``` 86 | 87 | -------------------------------------------------------------------------------- /courses/GO/Golang实现简单tcp服务器/0.概述.md: -------------------------------------------------------------------------------- 1 | # 概述 2 | 3 | Golang作为一门近些年来非常风光的开发语言, 其实用范围很广, 图形界面, web框架, 图像引擎等等. 4 | 由于其语言特性简化了并发/多核的开发, 受到了很大的关注. 而使用它进行服务器开发, 也是非常高校而简洁的. 5 | 废话不多说, 本项目实践的目的是使用golang开发一个简单的基于tcp协议的服务器/客户端. 6 | 7 | ## 预备知识 8 | 首先, 我们需要了解一下golang下的如下包与特性: 9 | 10 | ### goroutine 11 | goroutine是一种轻量型的线程, 作为golang语言的语言特性, 可以很简单的在golang中进行多线程的开发. 利用go关键字, 我们能把任何一个方法/函数, 放在一个新的goroutine里执行. 12 | 实验01: 13 | 14 | 在**实验环境**的**主文件夹**里, 建立一个名为test.go的文本文档, 并开始编写以下代码 15 | > package main 16 | > 17 | > import ( 18 | > "fmt" 19 | > ) 20 | > 21 | > var quit chan bool = make(chan bool) 22 | > 23 | > func main() { 24 | > go testGorountine() 25 | > <-quit 26 | > } 27 | > 28 | > func testGorountine() { 29 | > for i := 0; i < 10; i++ { 30 | > fmt.Println("Hello world!") 31 | > } 32 | > quit <- true 33 | > } 34 | 35 | 然后, 打开xFce终端, 键入命令 36 | > go run test.go 37 | 38 | 我们就会看到终端的输出, 可以看到10行"hello world". 这里, 我们的hello world程序就是利用了gorountine创建了一个多线程/协程程序, 然后利用channel等待开启的协程处理完毕, 才结束主线程. 39 | 40 | ### net包 41 | 在net包中, 提供了常用网络I/O操作的api, 包括我们的试验中需要用到的, Listen, Accept, Write, Read等方法. 具体参考链接:[http://godoc.golangtc.com/pkg/net/](http://godoc.golangtc.com/pkg/net/) 42 | 43 | ### bufio包 44 | bufio包则提供了一套有缓存的I/O读写操作的方法, 在我们的服务器与客户端进行数据通讯时, 会用到. 参考链接:[http://godoc.golangtc.com/pkg/bufio/](http://godoc.golangtc.com/pkg/bufio/) 45 | 46 | 然后, 还需要对**长连接的TCP服务器**与客户端通讯有个基本的认识: 47 | client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。 关于这个概念, 网上有很多参考资料, 如果还不清楚, 随便google一下~ 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /courses/GO/Golang实现简单tcp服务器/3.服务器粘包处理.md: -------------------------------------------------------------------------------- 1 | # 服务器的粘包处理 # 2 | 3 | **什么是粘包** 4 | 5 | 一个完成的消息可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题 6 | 7 | **TCP粘包和拆包产生的原因** 8 | 9 | 1. 应用程序写入数据的字节大小大于套接字发送缓冲区的大小 10 | 11 | 2. 进行MSS大小的TCP分段。MSS是最大报文段长度的缩写。MSS是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是TCP报文段的最大长度,而是:MSS=TCP报文段长度-TCP首部长度 12 | 13 | 3. 以太网的payload大于MTU进行IP分片。MTU指:一种通信协议的某一层上面所能通过的最大数据包大小。如果IP层有一个数据包要传,而且数据的长度比链路层的MTU大,那么IP层就会进行分片,把数据包分成托干片,让每一片都不超过MTU。注意,IP分片可以发生在原始发送端主机上,也可以发生在中间路由器上。 14 | 15 | **TCP粘包和拆包的解决策略** 16 | 17 | 1. 消息定长。例如100字节。 18 | 2. 在包尾部增加回车或者空格符等特殊字符进行分割,典型的如FTP协议 19 | 3. 将消息分为消息头和消息尾。 20 | 4. 其它复杂的协议,如RTMP协议等。 21 | 22 | 参考文章 (http://blog.csdn.net/initphp/article/details/41948919) 23 | 24 | **我们的处理方式** 25 | 26 | 解决粘包问题有多种多样的方式, 我们这里的做法是: 27 | 28 | - 发送方在每次发送消息时将消息长度写入一个int32作为包头一并发送出去, 我们称之为Encode 29 | - 接受方则先读取一个int32的长度的消息长度信息, 再根据长度读取相应长的byte数据, 称之为Decode 30 | 31 | 在实验环境中的主文件夹内, 新建一个名为codec的文件夹在其之下新建一个文件codec.go, 将我们的Encode和Decode方法写入其中, 这里给出Encode与Decode相应的代码: 32 | 33 | codec.go 34 | 35 | package codec 36 | 37 | import ( 38 | "bufio" 39 | "bytes" 40 | "encoding/binary" 41 | ) 42 | 43 | func Encode(message string) ([]byte, error) { 44 | // 读取消息的长度 45 | var length int32 = int32(len(message)) 46 | var pkg *bytes.Buffer = new(bytes.Buffer) 47 | // 写入消息头 48 | err := binary.Write(pkg, binary.LittleEndian, length) 49 | if err != nil { 50 | return nil, err 51 | } 52 | // 写入消息实体 53 | err = binary.Write(pkg, binary.LittleEndian, []byte(message)) 54 | if err != nil { 55 | return nil, err 56 | } 57 | 58 | return pkg.Bytes(), nil 59 | } 60 | 61 | func Decode(reader *bufio.Reader) (string, error) { 62 | // 读取消息的长度 63 | lengthByte, _ := reader.Peek(4) 64 | lengthBuff := bytes.NewBuffer(lengthByte) 65 | var length int32 66 | err := binary.Read(lengthBuff, binary.LittleEndian, &length) 67 | if err != nil { 68 | return "", err 69 | } 70 | if int32(reader.Buffered()) < length+4 { 71 | return "", err 72 | } 73 | 74 | // 读取消息真正的内容 75 | pack := make([]byte, int(4+length)) 76 | _, err = reader.Read(pack) 77 | if err != nil { 78 | return "", err 79 | } 80 | return string(pack[4:]), nil 81 | } 82 | 83 | 这里就不帖服务器与客户端的调用代码了, 同学们自己动手试试~ 84 | -------------------------------------------------------------------------------- /courses/Git/Git 实战教程/0.git介绍.md: -------------------------------------------------------------------------------- 1 | 2 | ## 一、实验说明 3 | 4 | ### 1. 环境登录 5 | 无需密码自动登录,系统用户名shiyanlou 6 | 若不小心登出后,直接刷新页面即可 7 | 8 | ### 2. 环境使用 9 | 10 | 11 | 实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。 12 | 13 | ###3. 课程来源 14 | 15 | 感谢译者@liuhui998授权,本课程为[《Git Community Book 中文版》](http://gitbook.liuhui998.com/)提供配套实验。 16 | 17 | 18 | ###4.课程学习说明 19 | 20 | 21 | 学习本课程需要有一定的Linux基础,熟悉Linux的常用命令。 22 | 23 | **建议初学者只需要学习前三个实验即可,基本用法已经涵盖了最常用的git操作。中级与高级用法使用很少,可以简单了解,用到时再查详细文档。** 24 | 25 | 26 | 27 | ## 二、git诞生 28 | 29 | 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。1991年,Linus创建了开源的Linux,并且有着为数众多的参与者。虽然有世界各地的志愿者为Linux编写代码,但是绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。在这期间,所有的源代码都是由Linus手工合并。因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统(集中式和分布式我们会在接下来的内容讲解)不但速度慢,而且必须联网才能使用。虽然有一些商用的版本控制系统,比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。 30 | 31 | 不过,到了2002 年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是整个项目组启用了一个商业版本的分布式版本控制系统 BitKeeper 来管理和维护代码。BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。安定团结的大好局面在2005年被打破,开发BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,原因是Linux社区牛人聚集,开发Samba的Andrew试图破解BitKeeper的协议,这么干的其实也不只他一个,但是被BitMover公司发现了,于是BitMover公司收回了Linux社区的免费使用权。这就迫使Linux开源社区( 特别是Linux的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。 32 | 33 | 他们对新的系统制订了若干目标:速度 、 简单的设计 、 对非线性开发模式的强力支持(允许上千个并行开发的分支)、完全分布式、有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)。自诞生于 2005 年以来,Git 日臻成熟完善,迅速成为最流行的分布式版本控制系统,在高度易用的同时,仍然保留着初期设定的目标。它的速度飞快,极其适合管理大项目,它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求。2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。 34 | 35 | 历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。 36 | 37 | ##三、版本控制系统 38 | 39 | Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 40 | 41 | 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始工作,工作完成,再把自己的修订推送给中央服务器。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 42 | 43 | 44 | ![img](https://dn-anything-about-doc.qbox.me/userid1labid485time1423114955957) 45 | 46 | 那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。 47 | 48 | 和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。 49 | 50 | 在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。 51 | 52 | ![img](https://dn-anything-about-doc.qbox.me/userid1labid485time1423115040073) 53 | 54 | 许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。 55 | 56 | 57 | -------------------------------------------------------------------------------- /courses/Git/使用Githook实现团队CodingReview流程/1.Hook实战:编写动作脚本.md: -------------------------------------------------------------------------------- 1 | # Hook 实战:编写动作脚本 2 | 3 | ## 一、实验简介 4 | 5 | ### 1.1 实验内容 6 | 7 | 通过编写 Python 脚本,利用 Git Hook 完成定制动作。 8 | 9 | ### 1.2 实验知识点 10 | 11 | - Git 12 | 13 | ### 1.3 实验环境 14 | 15 | - Xfce 终端 16 | - Git CLI 17 | - Python 2.7 18 | 19 | ### 1.4 适合人群 20 | 21 | 本课程难度属于一般,属于初级级别课程,适合具有 Git 基础的用户。 22 | 23 | ## 二、Hello Hook 24 | 25 | 上一章节我们提到了 Hook 会根据 git 的提交流程从而使用不同的 Hook 方法触发不同的 Hook 脚本。并且其中我们具体说了一下 `post-commit` 这个 Hook,因为我们马上将会用到它。 26 | 27 | 例如我们在每次提交的时候,让终端的 log 为我们现实一下本次提交的修改内容,下面我们来详细制作一下这个工作流程。 28 | 29 | 首先我们将示例项目从 shiyanlou 的 git 仓库中 `clone` 下来: 30 | 31 | ``` 32 | $ git clone http://git.shiyanlou.com/shiyanlou/gitproject 33 | 34 | ``` 35 | 36 | 进入 `gitproject` 我们使用 `ls -al` 命令查看全部文件: 37 | 38 | ``` 39 | drwxrwxr-x 3 shiyanlou shiyanlou 4.0K Apr 27 13:59 . 40 | drwxr-xr-x 24 shiyanlou shiyanlou 4.0K Apr 27 14:10 .. 41 | drwxrwxr-x 8 shiyanlou shiyanlou 4.0K Apr 27 14:10 .git 42 | -rw-rw-r-- 1 shiyanlou shiyanlou 22 Apr 27 13:59 README.md 43 | 44 | ``` 45 | 46 | 我们进入 `.git/hooks` 中查看文件: 47 | 48 | ![此处输入图片的描述](https://dn-anything-about-doc.qbox.me/document-uid18510labid2872timestamp1493345136612.png/wm) 49 | 50 | 由于我们需要使用 `post-commit` 这个 hook ,所以我们新建一个脚本,命名为 `post-commit`: 51 | 52 | ``` 53 | $ vim post-commit 54 | 55 | ``` 56 | 57 | 我们先写一个 hello hook 脚本来测试一下 hook 是否可以工作: 58 | 59 | ``` 60 | #!/usr/bin/env python 61 | 62 | print("hello hook") 63 | 64 | ``` 65 | 66 | 保存之后我们查看一下文件的权限: 67 | 68 | ![此处输入图片的描述](https://dn-anything-about-doc.qbox.me/document-uid370033labid2872timestamp1493274209347.png/wm) 69 | 70 | 我们发现 `post-commit` 的权限是 `rw-rw-r--` ,而 hook 文件需要为为所有者、所处用户组开放权限,我们执行以下命令: 71 | 72 | ``` 73 | $ chmod +x post-commit 74 | 75 | ``` 76 | 77 | 返回到这个项目的根目录,修改一下 `README.md` 文件,然后执行 git 的 `commit` 命令: 78 | 79 | ![此处输入图片的描述](https://dn-anything-about-doc.qbox.me/document-uid370033labid2872timestamp1493275988963.png/wm) 80 | 81 | 我们发现 Hook 脚本已经执行,并且成功的在 log 处输出 `hello hook`。 82 | 83 | ## 三、开始编写我们的工作流 84 | 85 | 目标相同,我们要在每次 `commit` 的时候显示本次项目代码变动情况。继续编辑 `post-commit`: 86 | 87 | ``` 88 | #!/usr/bin/env python 89 | 90 | from subprocess import check_output 91 | 92 | log = check_output(['git', 'log', '-1', '--stat', 'HEAD']) 93 | print(log) 94 | 95 | ``` 96 | 97 | 代码很简单,其效果其实就是将 `git log -1 --stat HEAD` 的 log 重定向到 `log` 变量中。然后将其输出即可看到本次修改内容。我们修改一下 `README.md` 然后进行提交,结果如下: 98 | 99 | ![此处输入图片的描述](https://dn-anything-about-doc.qbox.me/document-uid370033labid2872timestamp1493281320404.png/wm) 100 | 101 | 发现已经成功完成了此次提交改动信息的显示。 102 | 103 | ## 四、实验总结 104 | 105 | 在 Hook 脚本中,我们已经将此次版本代码的改动信息输出到 log 中。在下一章,我们讲述如何使用 Python 代码运用 smtp 邮件协议发送邮件。 -------------------------------------------------------------------------------- /courses/HTML5/HTML5基础入门/0.认识HTML5.md: -------------------------------------------------------------------------------- 1 | # 认识HTML5 2 | 3 | ## 一、实验说明 4 | 5 | ### 1. 环境登录 6 | 7 | 无需密码自动登录,系统用户名shiyanlou,该用户具备sudo的权限,可以执行安装软件等管理员操作。 8 | 9 | ### 2. 环境介绍 10 | 11 | 本实验环境采用Ubuntu Linux桌面环境,实验中会用到桌面上的程序: 12 | 13 | 1. Xfce终端: Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 14 | 2. Firefox及Opera:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的HTML/JS页面即可 15 | 3. gvim:非常好用的Vim编辑器,最简单的用法可以参考课程[Vim编辑器](http://www.shiyanlou.com/courses/2) 16 | 4. 其他编辑器:如果Vim不熟悉可以使用gedit或brackets,其中brackets比较适合开发前端代码。 17 | 18 | 19 | ### 3. 环境使用 20 | 21 | 使用GVim编辑器输入实验所需的代码,然后使用Firefox浏览器打开代码文件,可以在虚拟环境中Firefox浏览器中按F12键打开firebug进行前端页面的调试。 22 | 23 | 24 | 实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。 25 | 26 | ### 4. 版权声明 27 | 28 | 本课程基于FlyDragon的HTML5文档制作,感谢原作者授权,附原作者版权声明: 29 | 30 | 作者:FlyDragon 31 | 32 | 出处:http://www.cnblogs.com/fly_dragon/ 33 | 34 | 关于作者:专注于微软平台项目架构、管理和企业解决方案。如有问题或建议,请多多赐教! 35 | 36 | 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通malun666@126.com 联系我,非常感谢。 37 | 38 | ## 二、认识HTML5 39 | ------------------------------- 40 | 41 | ### 1. 什么是HTML5 42 | HTML 5草案的前身名为Web Applications 1.0,是在2004年由WHATWG提出,再于2007年获W3C接纳,并成立了新的HTML工作团队。在2008年1月22日,第一份正式草案发布。WHATWG表示该规范是目前仍在进行的工作,仍须多年的努力。目前Firefox、Google Chrome、Opera、Safari(版本4以上)、Internet Explorer 9已支援HTML5技术。 43 | 44 | HTML5本质并没有对之前HTML4版本的规范进行彻底的变革,而是一开始设计就考虑了跟之前的标准进行兼容,并且把最新的WEB开发的一些新技术新的规范引入进了新版本的标准中。 45 | 46 | ### 2. HTML5新特性 47 | 48 | #### 2.1 新增拥有具体含义的标签 49 | 50 | 现在所有的站点基本上都是`div`+`css`布局,几乎所有的文章标题、内容、辅助介绍等都用`div`容器来承载。搜索引擎在抓取页面内容时,因为没有明确的容器的含义只能去猜测这些标签容器承载的是文章标题还是文章内容等。HTML5新标准中直接添加了拥有具体含义的HTML标签比如:`
`、`