欢迎来到我的博客! 这里主要记录了我学习工作中的一些内容梳理,希望对你有所帮助。
你可以在这里找到我写的一些文章,也可以在其他地方找到我,比如:
欢迎来到我的博客! 这里主要记录了我学习工作中的一些内容梳理,希望对你有所帮助。
你可以在这里找到我写的一些文章,也可以在其他地方找到我,比如:
提交信息格式模板 <type>(<scope>): <subject> <body> BREAKING CHANGE: <changes> Closes <closes> Type - 提交类型 取值 适用范围 使用范围英文原文 feat (feature) 新功能、新特性 A new feature fix 修改 bug A bug fix docs 仅文档修改 Documentation only changes style 代码格式修改 Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) refactor 代码重构(重构,在不影响代码内部行为、功能下的代码修改) A code change that neither fixes a bug nor adds a feature perf 更改代码,以提高性能(在不影响代码内部行为的前提下,对程序性能进行优化) A code change that improves performance test 测试用例新增、修改 Adding missing or correcting existing tests build 影响项目构建或依赖项修改 Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) ci CI/CD 持续集成相关文件修改 Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs) chore 其他修改(不在上述类型中的修改) Other changes that don’t modify src or test files revert 恢复上一次提交 Reverts a previous commit Scope - 此次变更的范围 用于说明 commit 影响的范围...
安装 docker 输入命令 curl -sSL https://get.daocloud.io/docker | sh 等待安装完成 安装 docker compose 执行下面这行命令,下载 docker-compose 可执行文件 curl -L https://get.daocloud.io/docker/compose/releases/download/v2.16.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 执行下面这行命令,赋予该文件执行权限 chmod +x /usr/local/bin/docker-compose 执行命令 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 完成 docker 更换镜像源 更换镜像源后,执行 sudo systemctl restart docker 重启 docker 服务 安装 git 执行命令 yum install -y git 安装 git,安装完成后输入 git --version 若正常回显 git 版本号,则安装成功 执行命令 mkdir /var/ivre ,创建 ivre 目录,随后执行命令 cd /var/ivre 切换到 /var/ivre 目录中...
问题分析 因为有需要通过Python项目代码目录中的 node.exe 执行指定的 JavaScript 代码,但发现 PyExecJS 总是报出 execjs._exceptions.RuntimeUnavailableError: Node.js (V8)_local runtime is not available on this system 这个错误。 经过仔细阅读源码,发现 PyExecJS 默认只能运行系统环境变量中设置好的目录下的 NodeJS 环境,主要原因在于 PyExecJS 是通过两个分别名为 _binary 和 _which 的函数来获取 Node 程序的执行路径,而 _which 函数被设计为遍历系统环境变量 Path 中设定的目录,并从中寻找 node.exe 程序,从而获取到其完整路径的方法。 这两个函数的设计原型如下: class ExternalRuntime(AbstractRuntime): def _binary(self): if not hasattr(self, "_binary_cache"): self._binary_cache = _which(self._command) return self._binary_cache def _which(command): """protected""" if isinstance(command, str): command = [command] command = list(command) name = command[0] args = command[1:] if _is_windows(): pathext = _decode_if_not_text(os....
一、SQL 层面调优 1. 性能分析 使用 explain 语句查看 SQL 语句的执行计划相关信息,可以通过查看返回的 可供使用索引、实际使用索引 等信息对 SQL 语句的执行情况进行分析,并进行针对性的优化。 2. 建立、优化索引 索引是 SQL 调优最重要的、最有效的方式,恰当的使用索引,可以大幅提升 SQL 的执行效率,让数据库优化器更好优化 SQL 的执行过程。 索引并不是越多越好,过多的索引个数,会增加优化器的筛选负担。 如果遇到通过一个字段,查询另一个字段的值的情况,可以建立联合索引,来避免数据库回表,优化查询效率。 注意:主键会默认添加至索引中,所以在联合索引中,不需要手动再次添加主键 尽可能地避免函数调用,同时要注意隐式的函数调用(隐式数据类型转换),函数调用会强制禁止使用索引,导致索引建立后并不能得到有效的使用。 使用索引虽然会在一些场景中,大幅提升查询效率,但也会增加存储消耗,更重要的是,在有数据更新(插入、修改、删除)时,需要对索引进行修改,会大幅降低数据更新效率,所以采用索引必须要慎重考虑。 二、DDL 层面调优 尽可能地采用足以容纳数据的最小存储类型,让数据库在执行查询语句的过程中,能够将更多的数据载入内存进行处理。 相比于 varchar ,数据库更适合对 int 类型的数据进行处理,如果条件允许,可以将 IP地址、时间戳 等数据通过 int 或 bigint 类型来存储。 尽量不要使用 text 类型字段,若必须要使用,且不常需要查询,则可以考虑将其提出到一张数据表中单独存储,并使用关联查询获取。 尽可能地使用 not null 标记,这将大大减小采用了 innoDB 引擎的负担。 若数据库读取需求远大于修改需求,且不是很需要数据库事务提供支持,可以将数据库引擎由默认的 innoDB 更改为 MyISAM,相比于前者,后者提供了更快的数据读取支持。 注:MyISAM 与 innoDB 引擎还存在其他差别,需要根据具体业务情况进行选择。 在对数据库进行表结构设计时,就要充分考虑到查询性能相关的问题,一句具体的应用场景,基于基本的数据库设计准则,对数据库进行合理的结构设计,在某些时候,可以违背第三范式设计准则,对数据表增加冗余字段,通过数据的冗余存储,来降低联查的频率。 针对经常需要进行联查的字段,也可以通过建立中间表的方法,直接从中间表中获取需要联合查询的数据,以此来减少联合查询的频率,提高查询效率。 三、数据库层面调优 1. 分库、分表 当表中数据达到一定数据量时,单次查询遍历全表速度过慢,可以考虑分库分表。 分库: 在数据量过大,一个数据库无法满足业务查询需求时,需要同时开启多台数据库服务器,同时提供服务,以提高系统的访问载荷。 在通常情况下,为了保证数据的一致性,采用 Master/Slave(主/从)模式来构建数据库架构,主库负责修改,从库负责查询。 但需要注意的是,一旦采用分库技术,数据库之间相互独立,就不能再依赖数据库自身的主键生成方法,需要使用独立的主键生成工具,生成全局主键,才能避免主键冲突。 还需要注意的是,使用分库技术后,数据表之间无法跨数据库联查,所以通常需要两次查询来近似实现联查功能。 若系统中涉及到频繁的数据更新操作,可以通过增加数据库服务器的方式解决,但由于数据库服务器通常是成本高昂的高性能服务器,无限扩充服务器数量,从实际上讲并不现实。在这种情况下,更适合引入为高并发、频繁修改设计的高性能内存数据库(redis 等),用内存数据库充当中间件,并定期将内存数据库中的最新数据持久化到数据库中。 分表...
一、下载编译好的 Carrot2 应用程序 从该页面下载最新版本的程序:GitHub Carrot2 Release cd 至相应文件夹后,使用命令 # 注:******* 是具体版本号,下面的命令unzip后面的文件名按真实文件名写 unzip carrot2-*******.zip cd 到 上一步命令解压出来的文件夹中的 dcs 文件夹内 二、运行前准备 Ⅰ 、安装 Java 11 执行该命令,安装 Java 11:yum install java-11-openjdk-devel 若系统内有多个 Java 版本,则执行该命令,选择 Java 11 为默认版本 alternatives --config java Ⅱ、配置防火墙 使用该命令查看防火墙状态 systemctl status firewalld 若显示结果如下图,则需要配置放行 8080 端口 执行该命令,放行8080端口 firewall-cmd --add-port=8080/tcp --permanent && firewall-cmd --reload,若显示 success,则防火墙配置成功。 二、运行 Carrot2 方式一:前台运行 执行 ./dcs 命令,开启程序 方式二:后台运行 执行下面的命令: nohup /opt/carrot2-4.2.1/dcs/dcs > /opt/carrot2-4.2.1/carrot2.log 2>&1 & 方式三:系统服务 cd 进入 该文件夹:/usr/lib/systemd/system/...
正文 在使用 Django-Rest-Framework 的 HyperlinkedIdentityField 来生成字段的反向链接时,如果数据库中字段的值为空,此时 DRF 就会返回一串错误信息: django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "user-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field. 解决方案: 重写 HyperlinkedIdentityField 类的 to_representation 方法,从而规避数据库值为空的情况 注: value 是一个数据库记录的对象 需要将 user 修改为数据库中希望反向生成链接的字段名 # 重写 HyperlinkedIdentityField 类的 to_representation 方法,从而规避数据库值为空的情况 class MyHyperlinkedIdentityField(serializers.HyperlinkedIdentityField): def to_representation(self, value): if not value.user: return None return super()....
人人网登录链接 http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=202063230558 202063230558 为时间戳 通过查找源码可以发现,它的生成方式写在了 login.js 中 对应源码为: var s = new Date; e = e + "&uniqueTimestamp=" + s.getFullYear() + s.getMonth() + s.getDay() + s.getHours() + s.getSeconds() + s.getUTCMilliseconds() 分别由 年、月、日、时、秒、UTC秒组成 使用 Python 代码改写为: from datetime import datetime time = datetime.now() year = time.year month = time.month - 1 day = time.day - 5 hour = time.hour second = time.second utcSecond = datetime.utcnow().second uniqueTimestamp = '{}{}{}{:0>2}{:0>2}{:0>2}'.format(year, month, day, hour, second, utcSecond) uniqueTimestamp 就是最终生成的时间戳,大家可以自行字符串拼接,然后访问登录,登陆成功后,数据返回格式为:...
序言 在 Scrapy 中保存 json 文件有以下 3 种方式: 直接创建并写入 json 文件,将数据写入其中 使用 Scrapy.exporters 中自带的 JsonItemExporter进行导出操作 使用 Scrapy.exporters 中自带的 JsonLinesItemExporter进行导出操作 但,Scrapy 框架提供的这两个 json 导出模块,均 存在各自的问题 : JsonItemExporter 必须先将爬虫爬取下来的 所有数据存放在内存 中,待爬虫完成后,再一次性写入文件。 这种方式,可以输出标准的 json 格式文件,但是如果数据量巨大,会 大量占用内存 。 JsonLinesItemExporter 这种方式,每次拿到数据都直接写入文件,占用内存少,但是输出的结果 并不是标准的 Json 格式文件 ,无法通过 Json 将文件内容解析出来。 于是,下面首先介绍,第一种方式,直接创建并将数据写入 json 文件, 一、直接创建并写入 json 文件 在 Scrapy 框架的 pipeline 写入如下内容 import os import codecs import json class SpiderPipeline(object): # 构造方法(初始化对象时执行的方法) def __init__(self): # 必须使用 w+ 模式打开文件,以便后续进行 读写操作(w+模式,意味既可读,亦可写) # 注意:此处打开文件使用的不是 python 的 open 方法,而是 codecs 中的 open 方法 self....
一、从 MySql 官网下载安装包 打开 MySql官网 并点击页面顶部导航栏中的 DOWNLOADS 按钮, 点击页面中部的 MySQL Community (GPL) Downloads 点击 MySQL Community Server 按钮 在下拉菜单中,选择 Microsoft Windows后,点击下方的 Download 按钮 在打开的页面中,选择 No thanks, just start my download. ,然后开始下载MySql zip安装包 二、安装 MySql 将安装包解压到希望进行安装的位置,例如:D:\Program Files\mysql-8.0.20-winx64 将该路径添加至系统环境变量 在 “此电脑” 图标上,右键点击属性,打开计算机属性 点击左侧菜单栏中的 “高级系统设置”,然后在打开的窗口 “高级” 选项卡中,点击 “环境变量” 在下方 “系统变量” 一栏中,点击 “新建”,创建一个新的变量 将变量名设置为 “MYSQL_HOME” ,将变量值设定为刚才 MySql 安装包的解压路径,配置好后点击 “确定” 完成创建 在 “系统变量中” 找到名为 “Path” 的变量,双击打开,并点击 “新建” 按钮,输入 %MYSQL_HOME%\bin ,并点击下方的 随后关闭系统环境变量设置窗口 打开命令行窗口(如在配置环境变量前已经打开,请重新打开,以完成环境变量刷新) 在命令行窗口中输入以下命令,进行初始化。初始化后,MySql 安装目录会出现一个 data目录(请勿手动创建)...
一、部署环境介绍 软件依赖 版本 Ubuntu 18.04 LTS WordPress 5.4 Nginx 1.14.0 PHP 7.3 MariaDB 10.1.44 二、准备环境 (1)安装 Nginx 使用 apt-get 命令 安装 Nginx sudo apt-get update sudo apt-get install nginx 安装完成后,启动 Nginx sudo systemctl start nginx 启动成功后,在浏览器中打开系统的 IP 地址,正常情况下,会出现如下界面,表示 Nginx 安装成功 (2) 安装 MariaDB 数据库 MariaDB 与 MySQL 同源,在这里我们选择 MariaDB sudo apt-get install mariadb-client mariadb-server 启动 MariaDB (MariaDB 服务名为 MySQL) sudo systemctl start mysql 初次运行 MariaDB ,需要创建 root 用户密码以保护数据库 sudo mysql_secure_installation 会出现一下提示信息...