diff --git "a/Day91-100/91.\345\233\242\351\230\237\351\241\271\347\233\256\345\274\200\345\217\221\347\232\204\351\227\256\351\242\230\345\222\214\350\247\243\345\206\263\346\226\271\346\241\210.md" "b/Day91-100/91.\345\233\242\351\230\237\351\241\271\347\233\256\345\274\200\345\217\221\347\232\204\351\227\256\351\242\230\345\222\214\350\247\243\345\206\263\346\226\271\346\241\210.md" index 5fd630c8de4d974b95363578dfaf3eda9aa5710b..e2b5807d4cba395402d26ed8e7435a388cef1998 100644 --- "a/Day91-100/91.\345\233\242\351\230\237\351\241\271\347\233\256\345\274\200\345\217\221\347\232\204\351\227\256\351\242\230\345\222\214\350\247\243\345\206\263\346\226\271\346\241\210.md" +++ "b/Day91-100/91.\345\233\242\351\230\237\351\241\271\347\233\256\345\274\200\345\217\221\347\232\204\351\227\256\351\242\230\345\222\214\350\247\243\345\206\263\346\226\271\346\241\210.md" @@ -441,7 +441,9 @@ Git不像SVN那样一定需要中央服务器才能工作,上面我们演示 ```Shell git switch -c release-0.1 develop + git push -u origin release-0.1 ... ... ... + git pull git commit -a -m "............" ``` @@ -457,7 +459,8 @@ Git不像SVN那样一定需要中央服务器才能工作,上面我们演示 git push git branch -d release-0.1 - git tag -a v0.1 master + git push --delete release-0.1 + git tag v0.1 master git push --tags ``` @@ -467,8 +470,10 @@ Git不像SVN那样一定需要中央服务器才能工作,上面我们演示 ```Shell git checkout -b hotfix-0.1.1 master + git push -u origin hotfix-0.1.1 ... ... ... - git commit -m "............" + git pull + git commit -a -m "............" ``` 将`hotfix`分支合并回`develop`和`master`分支。 @@ -483,7 +488,8 @@ Git不像SVN那样一定需要中央服务器才能工作,上面我们演示 git push git branch -d hotfix-0.1.1 - git tag -a 0.1.1 + git push --delete hotfix-0.1.1 + git tag v0.1.1 master git push --tags ``` @@ -501,7 +507,7 @@ Git-flow流程比较容易控制各个分支的状况,但是在运用上github #### 禅道 -[禅道]()是国产的专业项目管理软件,它不仅仅是缺陷管理工具,它提供了完整软件生命周期管理功能,支持Scrum敏捷开发,能够实现需求管理、缺陷管理、任务管理等一系列的功能,而且拥有强大的扩展机制和丰富的功能插件。可以从禅道的官方网站提供的[下载链接]()来下载禅道,推荐使用一键安装包。 +[禅道]()是国产的专业项目管理软件,它不仅仅是缺陷管理工具,它提供了完整软件生命周期管理功能,支持[Scrum敏捷开发](),能够实现需求管理、缺陷管理、任务管理等一系列的功能,而且拥有强大的扩展机制和丰富的功能插件。可以从禅道的官方网站提供的[下载链接]()来下载禅道,推荐使用一键安装包。 下面仍然以CentOS Linux为例,讲解如何利用官方提供的一键安装包来安装禅道。 @@ -529,9 +535,11 @@ tar -xvf ZenTaoPMS.pro8.5.2.zbox_64.tar ![](./res/zentao-index.png) +对敏捷开发以及敏捷闭环工具不是特别了解的,可以参考[《基于JIRA的Scrum敏捷开发的项目管理》]()一文。 + #### Gitlab -一般的代码托管平台或者是我们之前提到的Git私服Gitlab都提供了缺陷管理的功能,当我们要报告一个bug时,可以在如下图所示的界面创建一个新的问题票(issue ticket)。填写的内容包括: +常用的代码托管平台和之前提到的Git私服Gitlab都提供了缺陷管理的功能,当我们要报告一个bug时,可以在如下图所示的界面创建一个新的问题票(issue ticket)。填写的内容包括: 1. **[必填]**出现问题的软件版本号、具体的使用环境(如操作系统)等相关信息。 2. **[必填]**能够稳定重现该问题的相关步骤。 @@ -559,7 +567,7 @@ tar -xvf ZenTaoPMS.pro8.5.2.zbox_64.tar ### 持续集成 -为了快速的产生高品质的软件,在团队开发中,持续集成(CI)也是一个非常重要的基础。按照经典的软件过程模型(瀑布模型),集成的工作一般要等到所有的开发工作都结束后才能开始,但这个时候如果发现了问题,修复问题的代价是非常具体的。基本上,集成实施得越晚,代码量越大,解决问题就越困难。持续集成将版本控制、自动化构建、代码测试融入到一起,让这些工作变得自动化和可协作。由于其频繁重复整个开发流程(在指定时间内多次pull源代码并运行测试代码),所以能帮助开发者提早发现问题。 +为了快速的产出高质量的软件,在团队开发中持续集成(CI)是一个非常重要的环节。所谓CI,就是一种让计算机自动任意次重复编译、测试、汇报等工作的方法,通过CI可以帮助开发者提早发现问题,降低各种人为失误给项目带来的风险。按照经典的软件过程模型(瀑布模型),集成的工作一般要等到所有的开发工作都结束后才能开始,但这个时候如果发现了问题,修复问题的代价是非常具体的。基本上,集成实施得越晚,代码量越大,解决问题就越困难。持续集成将版本控制、自动化构建、代码测试融入到一起,让这些工作变得自动化和可协作。由于其频繁重复整个开发流程(在指定时间内多次pull源代码并运行测试代码),所以能帮助开发者提早发现问题。 在所有的CI工具中,Jenkins和[TravisCI]()是最具有代表性的,前者是基于 Java的开源CI工具,后者是新晋的在线CI工具,下图是Jenkins的工作面板。 diff --git "a/Day91-100/92.\344\275\277\347\224\250Docker\351\203\250\347\275\262\345\272\224\347\224\250.md" "b/Day91-100/92.\344\275\277\347\224\250Docker\351\203\250\347\275\262\345\272\224\347\224\250.md" index 4be56cedd1deb71a07ec33c0b2f30781b8d62e39..143b110dba2541fc7aceef8699ef5d196b5529b0 100644 --- "a/Day91-100/92.\344\275\277\347\224\250Docker\351\203\250\347\275\262\345\272\224\347\224\250.md" +++ "b/Day91-100/92.\344\275\277\347\224\250Docker\351\203\250\347\275\262\345\272\224\347\224\250.md" @@ -22,10 +22,11 @@ Docker属于对Linux容器技术的一种封装(利用了Linux的namespace和c 下面以CentOS为例讲解如何安装Docker,使用[Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/)、[macOS](https://docs.docker.com/docker-for-mac/install/)或[Windows](https://docs.docker.com/docker-for-windows/install/)的用户可以通过点击对应的链接了解这些平台下如何进行安装。 -1. 确定操作系统内核版本(CentOS 7要求64位,内核版本3.10+;CentOS 6要求64位,内核版本2.6+),可以通过下面的命令确定Linux系统内核版本。 +1. 确定操作系统内核版本(CentOS 7要求64位,内核版本3.10+;CentOS 6要求64位,内核版本2.6+),可以通过下面的命令确定Linux系统内核版本并更新底层库文件。 ```Shell uname -r +yum update ``` 2. 在CentOS下使用yum安装Docker并启动。 @@ -112,7 +113,7 @@ docker rmi hello-world > > 国内用户可以通过更换Ubuntu软件下载源来提升下载速度,具体请参照清华大学开源软件镜像站上的[《Ubuntu镜像使用帮助》]()。 -安装Docker后,由于直接访问[dockerhub](https://hub.docker.com/)下载镜像会非常缓慢,建议将服务器更换为国内镜像,可以通过修改 `/etc/docker/daemon.js` 文件来做到。一般的云服务器会有自己专属的镜像,就不需要手动修改了。 +安装Docker后,由于直接访问[dockerhub](https://hub.docker.com/)下载镜像会非常缓慢,建议将服务器更换为国内镜像,可以通过修改 `/etc/docker/daemon.json` 文件来做到。一般的云服务器会有自己专属的镜像,就不需要手动修改了。 ```JavaScript { @@ -125,7 +126,7 @@ docker rmi hello-world ### 使用Docker -想要玩转Docker,最简单的办法就是马上用Docker创建一些自己学习和工作中需要用到的容器,接下来我们就带着大家一起来创建这些容器。 +想要玩转Docker,最简单的办法就是马上用Docker创建一些自己学习和工作中需要用到的容器,下面我们带着大家一起来创建这些容器。 #### 运行Nginx @@ -152,7 +153,7 @@ docker container stop mynginx 然后用下面的命令重新创建容器。 ```Shell -docker container run -d -p 80:80 --rm --name mynginx --volume $PWD/html:/usr/share/nginx/html nginx +docker container run -d -p 80:80 --rm --name mynginx --volume /root/docker/nginx/html:/usr/share/nginx/html nginx ``` > 说明:上面创建容器和拷贝文件的命令中,`container`是可以省略的,也就是说`docker container run`和`docker run`是一样的,而`docker container cp`和`docker cp`是一样的。此外,命令中的`--volume`也可以缩写为`-v`,就如同`-d`是`--detach`的缩写,`-p`是`--publish`的缩写。`$PWD`代表宿主系统当前文件夹,这些对于使用过Unix或者Linux系统的人来说,应该是很容易理解的。 @@ -230,7 +231,7 @@ docker.io/mysql 5.7 f6509bac4980 3 weeks ago 创建并运行MySQL容器。 ```Shell -docker run -d -p 3306:3306 --name mysql57 -v $PWD/mysql/conf:/etc/mysql/mysql.cnf.d -v $PWD/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 +docker run -d -p 3306:3306 --name mysql57 -v /root/docker/mysql/conf:/etc/mysql/mysql.conf.d -v /root/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 ``` > **注意**:上面创建容器时我们又一次使用了数据卷操作,那是因为通常容器是随时创建随时删除的,而数据库中的数据却是需要保留下来的。 diff --git "a/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" "b/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" index b35f3cbb8e7714ebd830c749adfd5e22e2eed392..f037a5623864156bd63b224985b183f2e3e91724 100644 --- "a/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" +++ "b/Day91-100/93.MySQL\346\200\247\350\203\275\344\274\230\345\214\226.md" @@ -17,8 +17,6 @@ 过程,通常也称之为存储过程,它是事先编译好存储在数据库中的一组SQL的集合。调用存储过程可以简化应用程序开发人员的工作,减少与数据库服务器之间的通信,对于提升数据操作的性能是有帮助的,这些我们在之前的[《关系型数据库MySQL》](../Day36-40/36-38.关系型数据库MySQL.md)一文中已经提到过。 - - ### 数据分区 MySQL支持做数据分区,通过分区可以存储更多的数据、优化查询,获得更大的吞吐量并快速删除过期的数据。关于这个知识点建议大家看看MySQL的[官方文档](https://dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html)。数据分区有以下几种类型: @@ -62,9 +60,40 @@ MySQL支持做数据分区,通过分区可以存储更多的数据、优化查 1. 定位低效率的SQL语句 - 慢查询日志。 - ```SQL + - 查看慢查询日志相关配置 + + ```SQL + mysql> show variables like 'slow_query%'; + +---------------------------+----------------------------------+ + | Variable_name | Value | + +---------------------------+----------------------------------+ + | slow_query_log | OFF | + | slow_query_log_file | /mysql/data/localhost-slow.log | + +---------------------------+----------------------------------+ - ``` + mysql> show variables like 'long_query_time'; + +-----------------+-----------+ + | Variable_name | Value | + +-----------------+-----------+ + | long_query_time | 10.000000 | + +-----------------+-----------+ + ``` + + - 修改全局慢查询日志配置。 + + ```SQL + mysql> set global slow_query_log='ON'; + mysql> set global long_query_time=1; + ``` + + 或者直接修改MySQL配置文件启用慢查询日志。 + + ```INI + [mysqld] + slow_query_log=ON + slow_query_log_file=/usr/local/mysql/data/slow.log + long_query_time=1 + ``` 2. 通过`explain`了解SQL的执行计划。例如: diff --git "a/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" "b/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" index 26bdf4005ce0b7c79a1d15e5bf5d9aef205472d2..0b24a9327cd353aca9583b481215731316fcf2c5 100644 --- "a/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" +++ "b/Day91-100/95.\344\275\277\347\224\250Django\345\274\200\345\217\221\345\225\206\344\270\232\351\241\271\347\233\256.md" @@ -160,23 +160,14 @@ python manage.py inspectdb > /models.py - `filter()` / `exclude()` - `exact` / `iexact`:精确匹配/忽略大小写的精确匹配查询 - - `contains` / `icontains` / `startswith / istartswith / endswith / iendswith`:基于`like`的模糊查询 - - `in`:集合运算 - - `gt` / `gte` / `lt` / `lte`:大于/大于等于/小于/小于等于关系运算 - - `range`:指定范围查询(SQL中的`between…and…`) - - `year` / `month` / `day` / `week_day` / `hour` / `minute` / `second`:查询时间日期 - - `isnull`:查询空值(`True`)或非空值(`False`) - - `search`:基于全文索引的全文检索 - - `regex` / `iregex`:基于正则表达式的模糊匹配查询 - - `aggregate()` / `annotate()` - `Avg` / `Count` / `Sum` / `Max` / `Min` @@ -268,9 +259,9 @@ python manage.py inspectdb > /models.py #### 如何设计视图函数 -1. 用户的每个操作(用户故事)对应一个视图函数。 +1. 用户的每个请求(用户故事)对应一个视图函数,当然也可以将用户要执行的业务逻辑封装到独立的函数中,也就是有专门的模块处理程序中的业务逻辑。 -2. [每个视图函数可以构成一个事务边界](https://docs.djangoproject.com/en/2.1/ref/settings/)。 +2. 用户的请求可能会包含多个(持久化)操作,这些操作有可能需要设计成不可分割的原子性操作,那么这里就形成了事务的边界。 - 事务的ACID特性。 @@ -356,7 +347,7 @@ python manage.py inspectdb > /models.py 4. 如果使用`url`函数捕获的路径参数都是字符串,`path`函数可以指定路径参数类型。 -5. 可以使用`include`函数引入其他URL配置,捕获的参数会向下传递。 +5. 可以使用`include`函数引入其他URL配置并指定`namespace`来解决命名冲突,捕获的参数会向下传递。 6. 在`url`和`path`函数甚至是`include`函数中都可以用字典向视图传入额外的参数,如果参数与捕获的参数同名,则使用字典中的参数。 @@ -488,7 +479,9 @@ python manage.py inspectdb > /models.py - 向浏览器传输二进制数据。 ```Python - buffer = ByteIO() + from io import BytesIO + + buffer = BytesIO() resp = HttpResponse(content_type='...') resp['Content-Disposition'] = 'attachment; filename="..."' @@ -496,13 +489,16 @@ python manage.py inspectdb > /models.py ``` ```Python + from io import BytesIO + + import xlwt + + def get_style(name, color=0, bold=False, italic=False): - style = xlwt.XFStyle() font = xlwt.Font() - font.name = name - font.colour_index = color - font.bold = bold - font.italic = italic + font.name, font.colour_index, font.bold, font.italic = \ + name, color, bold, italic + style = xlwt.XFStyle() style.font = font return style @@ -535,7 +531,6 @@ python manage.py inspectdb > /models.py # 如果文件名有中文需要处理成百分号编码 resp['content-disposition'] = 'attachment; filename="detail.xls"' return resp - ``` - 大文件的流式处理:`StreamingHttpResponse`。 @@ -1089,13 +1084,13 @@ LOGGING = { #### 使用djangorestframework -安装djangorestfrmework(为了描述方便,以下统一简称为drf)。 +安装djangorestfrmework(为了描述方便,以下统一简称为DRF)。 ```Shell pip install djangorestframework ``` -配置drf。 +配置DRF。 ```Python INSTALLED_APPS = [ @@ -1412,7 +1407,7 @@ class HouseInfoViewSet(CacheResponseMixin, ReadOnlyModelViewSet): #### 身份认证 -查看drf中APIView类的代码可以看出,drf默认的认证方案是 `DEFAULT_AUTHENTICATION_CLASSES`,如果修改authentication_classes就可以自行定制身份认证的方案。 +查看DRF中APIView类的代码可以看出,DRF默认的认证方案是 `DEFAULT_AUTHENTICATION_CLASSES`,如果修改authentication_classes就可以自行定制身份认证的方案。 ```Python class APIView(View): @@ -1499,7 +1494,7 @@ class EstateViewSet(CacheResponseMixin, ModelViewSet): #### 授予权限 -权限检查总是在视图的最开始处运行,在任何其他代码被允许进行之前。最简单的权限是允许通过身份验证的用户访问,并拒绝未经身份验证的用户访问,这对应于dfr中的`IsAuthenticated`类,可以用它来取代默认的`AllowAny`类。权限策略可以在Django的drf配置中用`DEFAULT_PERMISSION_CLASSES`全局设置。 +权限检查总是在视图的最开始处运行,在任何其他代码被允许进行之前。最简单的权限是允许通过身份验证的用户访问,并拒绝未经身份验证的用户访问,这对应于dfr中的`IsAuthenticated`类,可以用它来取代默认的`AllowAny`类。权限策略可以在Django的DRF配置中用`DEFAULT_PERMISSION_CLASSES`全局设置。 ```Python REST_FRAMEWORK = { @@ -2011,7 +2006,6 @@ def chrome(): def test_baidu_index(chrome): chrome.get('https://www.baidu.com') assert chrome.title == '百度一下,你就知道' - ``` 除了Selenium之外,还有一个Web自动化测试工具名叫Robot Framework。 @@ -2243,7 +2237,7 @@ TOTAL 267 176 34% sysbench --test=memory --num-threads=512 --memory-block-size=256M --memory-total-size=32G run ``` -4. jmeter +4. JMeter 请查看[《使用JMeter进行性能测试》](https://www.ibm.com/developerworks/cn/java/l-jmeter/index.html)。 @@ -2493,9 +2487,6 @@ TOTAL 267 176 34% [mysqld] slow_query_log=ON slow_query_log_file=/usr/local/mysql/data/slow.log - long_query_time=1 + long_query_time=1。 ``` -#### 其他 - -请参考《Python性能调优》。 \ No newline at end of file diff --git "a/Day91-100/97.\347\224\265\345\225\206\347\275\221\347\253\231\346\212\200\346\234\257\350\246\201\347\202\271\345\211\226\346\236\220.md" "b/Day91-100/97.\347\224\265\345\225\206\347\275\221\347\253\231\346\212\200\346\234\257\350\246\201\347\202\271\345\211\226\346\236\220.md" index 8af2050257ea8fd0f5dec274196660d883d46bb4..ab86e2b46ad86e6cf9701af7247c08b36758dea0 100644 --- "a/Day91-100/97.\347\224\265\345\225\206\347\275\221\347\253\231\346\212\200\346\234\257\350\246\201\347\202\271\345\211\226\346\236\220.md" +++ "b/Day91-100/97.\347\224\265\345\225\206\347\275\221\347\253\231\346\212\200\346\234\257\350\246\201\347\202\271\345\211\226\346\236\220.md" @@ -325,10 +325,11 @@ ElasticSearch既是一个分布式文档数据库又是一个高可扩展的开 ElasticSearch的底层是开源搜索引擎[Lucene](https://lucene.apache.org/),但是直接用Lucene会非常麻烦,必须自己编写代码去调用它的接口而且只支持Java语言。ElasticSearch相当于对Lucene进行了一次全面的封装,提供了REST风格的API接口,通过基于HTTP协议的访问方式屏蔽了编程语言的差异。ElasticSearch会为数据构建[倒排索引](https://zh.wikipedia.org/zh-hans/%E5%80%92%E6%8E%92%E7%B4%A2%E5%BC%95),但是ElasticSearch内置的分词器对中文分词的支持几乎为零,因此需要通过安装elasticsearch-analysis-ik插件来提供中文分词服务。 -ElasticSearch的安装和配置可以参考[《ElasticSearch之Docker安装》](https://blog.csdn.net/jinyidong/article/details/80475320)。除了ElasticSearch之外,也可以使用Solr、Whoosh等来提供搜索引擎服务,基本上Django项目中可以考虑如下两套方案: +ElasticSearch的安装和配置可以参考[《ElasticSearch之Docker安装》](https://blog.csdn.net/jinyidong/article/details/80475320)。除了ElasticSearch之外,也可以使用Solr、Whoosh等来提供搜索引擎服务,基本上Django项目中可以考虑如下几种方案: - haystack(django-haystack / drf-haystack) + whoosh + Jieba - haystack (django-haystack / drf-haystack)+ elasticsearch +- requests + elasticsearch ####安装和使用ElasticSearch @@ -660,7 +661,10 @@ ElasticSearch的安装和配置可以参考[《ElasticSearch之Docker安装》]( 参数: ```JSON - + { + "analyzer": "pinyin", + "text": "张学友" + } ``` 响应: @@ -781,14 +785,17 @@ ElasticSearch的安装和配置可以参考[《ElasticSearch之Docker安装》]( 参数: ```JSON - + { + "query": { + "term": { + "type": "" + } + } + } ``` - 响应: + POST搜索是基于DSL的。 - ```JSON - - ``` #### Django对接ElasticSearch diff --git a/Day91-100/res/jenkins-create-admin.png b/Day91-100/res/jenkins-create-admin.png new file mode 100644 index 0000000000000000000000000000000000000000..abc5efdc16698b65d50d3b4c652f3960460ee4bf Binary files /dev/null and b/Day91-100/res/jenkins-create-admin.png differ diff --git a/Day91-100/res/jenkins-unlock.png b/Day91-100/res/jenkins-unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..5dee191db7e070cc7ed4ad90c2d1c33b4421e4e1 Binary files /dev/null and b/Day91-100/res/jenkins-unlock.png differ