Hello World - 2019年7月
type: channel
link: https://wlwl.host/index.php/2019/07/
description: Just So So ...
items: 数据结构 树
items: Linux SWAP（交换空间）
items: Linux shell命令
items: nginx从http到https
items: openssl生成数字证书
items: jenkins安装
items: 安装gitlab
items: Markdown语法
items: ssh安装与配置

数据结构 树
type: item
date: 2019-07-30T15:43:00+00:00
description: 一、树1、树的定义树是N（N >= 0）个结点的有限集合。当N=0 时，称为空树；当N>0 时，应满足：1）有且仅有一个特定的称为根的结点，它没有直接前驱，但有零个或多个后继。 2）其余n-1个结点可分为m（m>=0)个互不相交的有限集T1,T2,....,Tm, 其中Ti又是一棵树，并且称为根的子树2、相关术语结点的度：结点的子树个数树的度（阶）：树的所有结点中最大的度数N，同时这棵可称为N叉树叶结点：度为0的结点父结点：有子树的结点是其子树的根节点的父结点子结点：若A结点是B结点的父结点，则称B结点是A结点的子结点兄弟结点：具有同一个父结点的各结点彼此是兄弟结点祖先结点：沿树根到某一结点路径上的所有结点都是这个结点的祖先结点子孙结点：某一结点的子树中的所有结点是这个结点的子孙结点的层次：规定根结点在1层，其他任一结点的层数是其父结点的层数加1树的深度：树中所有结点中的最大层次是这棵树的深度有序树：树中任意节点的子结点之间有顺序关系；反之称为无序树森林：由 m（m >= 0）个互不相交的树组成的集合被称为森林路径：从一个结点往下可以达到的孩子或孙子结点之间的通路路径长度：通路中分支的数目。若规定根结点的层数为1，则从根结点到第L层结点的路径长度为L-1结点的权：若将树中结点赋给一个有着某种含义的数值，则这个数值称为该结点的权结点的带权路径长度：从根结点到该结点之间的路径长度与该结点的权的乘积树的带权路径长度：所有叶子结点的带权路径长度之和，记为WPL结点的平衡因子：某节点的左子树与右子树的高度(深度)差二、二叉树1、二叉树定义每个结点至多拥有两棵子树的树结构。并且，二叉树的子树有左右之分，其次序不能任意颠倒。2、类型满二叉树：除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层完全二叉树：叶结点只能出现在最底层的两层，且最底层叶结点均处于次底层叶结点的左侧3、遍历按一定的规则和顺序走遍二叉树的所有结点，使每一个结点都被访问一次，而且只被访问一次。由于二叉树是非线性结构，因此，树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。先序遍历：首先访问根，再先序遍历左子树，最后先序遍历右子树中序遍历：首先中序遍历左子树，再访问根，最后中序遍历右子树后序遍历：首先后序遍历左子树，再后序遍历右子树，最后访问根层序遍历：首先访问第一层的根节点，然后从左到右访问第2层上的节点，以此类推，自上而下，自左至右逐层访问4、树的转换树转换为二叉树1）加线。在所有兄弟结点之间加一条连线。 2）去线。树中的每个结点，只保留它与第一个孩子结点的连线，删除它与其它孩子结点之间的连线。 3）层次调整。以树的根节点为轴心，将整棵树顺时针旋转一定角度（第一个孩子是左孩子，其余结点是右孩子）二叉树转换为树1）加线。若某结点X的左孩子结点存在，则将这个左孩子的右孩子结点、右孩子的右孩子结点…，都作为结点X的孩子。 2）去线。删除原二叉树中所有结点与其右孩子结点的连线。 3）层次调整。孩子靠左排列三、线索二叉树（二叉树变种）对于n个结点的二叉树，在二叉链存储结构中有n+1个空链域，利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针，这些指针称为线索，加上线索的二叉树称为线索二叉树。根据线索性质的不同，线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。同时为了区别线索指针和孩子指针，在每个结点中添加两个标志ltag和rtag。lchildltagdatartagrchild线索化规则：若结点的左子树为空，则该结点的左孩子指针指向其前驱结点。 若结点的右子树为空，则该结点的右孩子指针指向其后继结点。建立线索二叉树，或者说对二叉树线索化，实质上就是遍历一棵二叉树。在遍历过程中，访问结点的操作是检查当前的左，右指针域是否为空，将它们改为指向前驱结点或后续结点的线索，以中序二叉树为例：线索二叉树充分利用了指针空间，同时又便于寻找结点的前驱结点和后继结点。线索二叉树适用于经常需要遍历寻找结点前驱或者后继结点的二叉树。四、最优二叉树（又：哈夫曼树）1、定义给定n个权值作为n个叶子结点，构造一棵二叉树，若该树的带权路径长度达到最小，称这样的二叉树为最优二叉树，也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树，权值较大的结点离根较近。2、构造哈夫曼树假设有n个权值，则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn，则哈夫曼树的构造规则为：1) 将w1、w2、…，wn看成是有n 棵树的森林(每棵树仅有一个结点)； 2) 在森林中选出两个带权路径长度最小的树合并，作为一棵新树的左、右子树； 3)从森林中删除选取的两棵树，并将新树加入森林； 4)重复(2)、(3)步，直到森林中只剩一棵树为止，…

Linux SWAP（交换空间）
type: item
date: 2019-07-23T14:23:00+00:00
description: swap交换空间可以增加一定量的内存使用，但增加swap的最重要的作用是防止网站流量突然增大而导致系统分配内存不够用而死机。如果你的VPS长期处理使用swap的状态下，建议你检查下程序或VPS，或者升级更大的内存的VPS，因为使用swap交换分区，会使服务器的性能降低很多，导致访问速度变慢。Linux可以使用一个分区或者一个常规文件作为交换空间。单独的分区速度要快一些，但是交换文件大小可以改变，更加灵活些。一、创建swap交换空间语法：mkswap [参数] 设备名 [块数]设备名，这里的设备通常是一个磁盘分区，如：/dev/sda6，或者是一个文件/swapfile例： 1、设置分区/dev/sdb1为新交换空间 mkswap /dev/sdb1 2、设置文件swapfile为新交换空间 首先创建swapfile文件 dd if=/dev/zero of=swapfile count=2000 bs=1024k if 表示输入文件 /dev/zero表示一个空文件，即以null字符写入文件中。 of 表示输出文件 bs 每个块多少个字节,可以带单位 count 表示多少个块 mkswap -f swapfile 二、启用swap交换空间手动开启交换空间语法：swapon [参数] 交换空间 例： 1、开启交换文件/swapfile swapon /swapfile 2、开启交换分区/dev/sdb1 swapon /dev/sdb1 自动开启交换空间编辑 /etc/fstab文件，并增加如下代码。 /swapfile swap swap defaults 0 0 自动开启交换空间在重启系统后，swap还是有效的。三、关闭swap交换空间1、停止swap交换空间 swapoff /swapfile 2、删除swap文件 rm -rf /swapfile 3、修改/etc/fstab文件 把/swapfile swap swap default 0 0 这行删除。

Linux shell命令
type: item
date: 2019-07-23T13:11:00+00:00
description: 基本格式命令名称 选项 参数例：rm -r hello.c有些命令不写选项和参数也能执行，有些命令在必要的时候可以附带选项和参数选项格式Linux的选项可分为：短格式选项:是长格式选项的简写，用一个减号-和一个字母表示，例如ls -l长格式选项:是完整的英文单词，用两个减号--和一个单词表示，例如ls --all一般情况下，短格式选项是长格式选项的缩写，也就是一个短格式选项会有对应的长格式选项。当然也有例外，比如 ls 命令的短格式选项-l就没有对应的长格式选项，所以具体的命令选项还需要通过帮助手册来查询。使用参数参数是命令的操作对象，一般情况下，文件、目录、用户和进程等都可以作为参数被命令操作，命令一般都需要加入参数，用于指定命令操作的对象是谁。如果可以省略参数，则一般都有默认参数。例：ls /home，如果没有参数，则其默认参数为当前目录换行如果命令不能在一行内写完，可以在末尾加反斜杠’\’来在下一行继续写。管道单竖线”|”是命令管道符，将前一个命令的结果作为后一个命令的输入。例：dpkg -l | wc -l 显示当前系统安装的软件总数输入输出重定向command >file： 标准输出重定向到一个文件,错误仍然输出屏幕command >>file： 标准输出重定向到一个文件(追加)command <file： 以file做为文件标准输入command < file1 >file2：以file1做为标准输入，file2做为标准输出命令置换将一个命令的输出作为另一个命令的参数，使用键盘esc下方的“`“引号例：ls \`pwd\`。基本命令ls，cat，less|more，rm，cp，mv，mkdir，cd，echo，pwd，clear，man，freegrep：查找字符串head|tail：显示文件开头|结尾diff：比较两个文件du：显示磁盘空间的使用情况free：查看内存使用情况

nginx从http到https
type: item
date: 2019-07-15T07:10:00+00:00
description: 一、Http与Https简介HTTP：HTTP协议是基于C/S架构进行通信的简单的请求-响应协议，而HTTP协议的服务器端实现程序有nginx等，其客户端的实现程序主要是Web浏览器，例如IE、chrome。HTTPS：是以安全为目标的HTTP通道，简单讲是HTTP的安全版，即HTTP下加入SSL层。作用有两个：一是建立一个信息安全通道，来保证数据传输的安全；二是确认网站的真实性。主要区别：https协议需要到ca申请证书，一般免费证书较少，因而需要一定费用。http是超文本传输协议，信息是明文传输，https则是具有安全性的ssl加密传输协议。http和https使用的是完全不同的连接方式，用的端口也不一样，前者是80，后者是443。http的连接很简单，是无状态的；HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，比http协议安全。Https优缺点优点：相比于http，https可以提供更加优质保密的信息，保证了用户数据的安全性，此外https同时也一定程度上保护了服务端，使用恶意攻击和伪装数据的成本大大提高。缺点：第一CA机构颁发的证书可能需要年费；其二，https加重了服务端的负担（相比http在传递信息过程中多了加密解密），会产生一些性能损耗。二、获取数字证书配置支持https的网站需要数字证书，通常是在可信任的证书授权机构申请，如果对安全性要求不高或测试可以使用自签证书。以自签证书为例，使用openssl一键生成hello.com的自签证书。执行openssl req -x509 -days 365 -newkey rsa:4096 -nodes -keyout hello.key -out hello.crt\ -subj "/C=CN/ST=BJ/L=BJ/O=HD/OU=dev/CN=hello.com/emailAddress=hello@world.com"将会在本目录下生成数字证书hello.crt和证书密钥hello.key，同样的在CA机构申请的证书也会得到这两个文件，数字证书可以任意传播，而证书密钥要私密保存。三、配置nginx这里以debian9为例，修改/etc/nginx/sites-available/default文件，关键配置如下：# listen 80 default_server; # listen [::]:80 default_server; # SSL configuration # listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate_key /etc/nginx/ssl/hello.key; ssl_certificate /etc/nginx/ssl/hello.crt;主要关闭http端口80的访问和开启https端口443的支持（当然端口可以任意指定），并且指定数字证书和证书密钥的路径（绝对路径）。四、重定向可以关闭http的访问，也可以配置http重定向到https。server { listen 80; server_name hello.com; rewrite ^(.*)$ https://${server_name}$1 permanent; }

openssl生成数字证书
type: item
date: 2019-07-12T09:06:00+00:00
description: 数字证书是指CA（即证书授权中心，或称证书授权机构）发行的一种电子文档，是一串能够表明网络用户身份信息的数字，提供了一种在计算机网络上验证网络用户身份的方式，因此数字证书又称为数字标识。数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。验证网站是否可信（针对HTTPS）验证某文件是否可信（是否被篡改）签发新的数字证书，自签的数字证书为根证书数字证书常见格式PEM--openssl默认采用的信息存放格式，以"-BEGIN"开头，"-END"结尾，内容是BASE64编码。KEY--一般指PEM格式的私钥文件。CSR--证书请求文件。生成数字证书前,一般先由用户提交证书申请文件,然后由CA来签发证书。CRT--证书文件，一般是指使用PEM格式的证书，Apache和Nginx服务器偏向于使用这种编码格式。CER--证书文件，一般是指使用DER格式的证书，Java和Windows服务器偏向于使用这种编码格式。证书主题表达证书的内容，例如：-subj "/C=CN/O=CA/CN=www.ca.com"所在国家 (Country) 简称：C字段，只能是国家字母缩写所在省份 (State/Provice) 简称：ST字段所在城市 (Locality) 简称：L字段单位名称 (Organization Name) ：简称：O字段，对于SSL证书，一般为网站域名公用名称 (Common Name) 简称：CN字段，对于SSL证书，一般为网站域名或IP地址数字证书的签名有两种方式，一种是自签，一种是CA签自签的数字证书自签需要一个密钥和组织（或网站）信息，使用 -newkey直接随机生成一个，使用-subj指定组织信息，还可以指定证书过期时间。// 先生成密钥，再自签 openssl genrsa -out ca.key 4096 openssl req -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=CN/O=CA/CN=www.ca.com" // 一步生成 openssl req -x509 -days 3650 -newkey rsa:4096 -noenc -keyout ca.key -out ca.crt -subj "/C=CN/O=CA/CN=www.ca.com"CA签发的数字证书1、生成证书私钥openssl genrsa -out my.key 40962、根据私钥生成证书签名请求openssl req -new -key my.key -out my.csr -subj "/CN=www.my.com"3、CA中心签发证书这里使用上一节自签的CA证书来签发openssl x509 -req -days 3650 -in my.csr -CA ca.crt -CAkey ca.key -out my.crt4、签发带SAN扩展的证书SAN拓展可以指定多个域名，先创建配置san.ext文件[v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1=www.my.com然后使用配置文件来签发证书openssl x509 -req -days 3650 -in my.csr -CA ca.crt -CAkey ca.key -out my.crt -extensions v3_req -extfile san.ext查看证书// 查看证书详情 openssl x509 -text -in my.crt // 查看证书申请信息 openssl req -text -in my.csr数字证书格式转换// crt转ceropenssl x509 -in my.crt -outform der -out my.cer// cer转crtopenssl x509 -in my.cer -inform der -out my.crt

jenkins安装
type: item
date: 2019-07-08T07:13:00+00:00
description: jenkins是一个开源可扩展自动化服务器，可用作简单的CI服务器（持续集成）或CD集线器（持续交付）。配置jenkins源由于debian的官方库中没有此软件，需要单独配置。1.安装基本工具wget和gnupg# apt install wget gnupg2.安装密钥和添加源# wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | apt-key add - # echo 'deb http://pkg.jenkins.io/debian-stable binary/' > /etc/apt/sources.list.d/jenkins.list安装jenkinsjenkins需要java运行环境，这里选择openjdk-11，由于更改源配置，所以要先更新软件包索引。# apt update # apt install openjdk-11-jre jenkins启动# service jenkins start访问jenkins其配置文件在/etc/default/jenkins，可以修改绑定的端口（默认8080）等信息，在启动jenkins之后，可以使用浏览器访问它，地址是:localhost:8080。在第一次使用时需要按照引导安装推荐的插件，此时可能遇到jenkins实例离线问题，需要修改/var/lib/jenkins/hudson.model.UpdateCenter.xml文件，将插件下载地址由https改为http并重启jenkins服务# sed -i "s/https/http/g" /var/lib/jenkins/hudson.model.UpdateCenter.xml在安装完插件进入到主界面可能会白屏，再一次重启jenkins服务即可。# service jenkins restart

安装gitlab
type: item
date: 2019-07-05T09:04:00+00:00
description: GitLab 是一个用于仓库管理系统的开源项目，使用Git作为代码管理工具，并在此基础上搭建起来的web服务。配置gitlab-ce源由于debian的官方库中没有此软件，需要单独配置，这里使用社区提供的脚本一键配置，其他linux发行版也可使用此脚本。1.安装wget# apt install wget2.下载安装脚本并执行# wget -O - https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh |bash安装gitlab-ce在前面我们已经配置好gitlab-ce的源，可以使用命令直接安装了,软件包比较大速度也慢，请耐心等待。# apt update # apt install gitlab-ce配置修改配置文件/etc/gitlab/gitlab.rb# gitlab-ctl reconfigure启动# gitlab-ctl start

Markdown语法
type: item
date: 2019-07-03T06:23:00+00:00
description: 简介Markdown是一种纯文本格式的标记语言。通过简单的标记语法，它可以使普通文本内容具有一定的格式。在 2004 由约翰·格鲁伯（英语：John Gruber）创建。编写的文档后缀为 .md, .markdown。一、标题在想要设置为标题的文字前面加#来表示，一个#是一级标题，二个#是二级标题，以此类推。支持六级标题。注：标准语法一般在#后跟个空格再写文字。示例：# 这是一级标题 ## 这是二级标题 ### 这是三级标题效果：这是一级标题这是二级标题这是三级标题二、段落Markdown 段落没有特殊的格式，直接编写文字就好，段落的换行是使用两个以上空格加上回车。使用空行来换行。示例：段落1 段落2 效果：段落1 段落2三、字体加粗：要加粗的文字左右分别用两个*号包起来斜体：要倾斜的文字左右分别用一个*号包起来斜体加粗：要倾斜和加粗的文字左右分别用三个*号包起来删除线：要加删除线的文字左右分别用两个~~号包起来示例：**这是加粗的文字** *这是倾斜的文字*` ***这是斜体加粗的文字*** ~~这是加删除线的文字~~效果：这是加粗的文字这是倾斜的文字`这是斜体加粗的文字这是加删除线的文字四、引用在引用的文字前加>即可。引用也可以嵌套，如加两个>>三个>>>可以一直加下去示例：>这是引用的内容 >>这是引用的内容 >>>>>这是引用的内容效果：这是引用的内容这是引用的内容这是引用的内容五、分割线三个或者三个以上的-或者*都可以。示例：--- *****效果如下：可以看到，显示效果是一样的。六、图片语法：![图片alt](图片地址 ''图片title'')图片alt就是显示在图片下面的文字，相当于对图片内容的解释。图片title是图片的标题，当鼠标移到图片上时显示的内容，title可加可不加。示例：![flower](/usr/uploads/2019/07/2749366889.jpeg "蔷薇花")效果：七、超链接语法：[超链接名](超链接地址 "超链接title")，title可加可不加。示例：[百度](http://baidu.com)效果：百度八、列表无序列表语法：无序列表用 - + * 任何一种都可以，注意：- + * 跟内容之间都要有一个空格- 列表内容 + 列表内容效果：列表内容列表内容有序列表语法：数字加点，1. 列表内容2. 列表内容注意：序号跟内容之间要有空格，数字任填，会自动重新排序示例：1. 列表内容 1. 列表内容效果：列表内容列表内容列表嵌套上一级和下一级之间敲三个空格即可示例：1. 列表内容 - 列表内容效果：列表内容列表内容九、表格语法：表头|表头|表头 ---|:--:|---: 内容|内容|内容 内容|内容|内容第二行分割表头和内容。有一个就行，为了对齐，多加了几个。文字默认居左，两边加：表示文字居中，右边加：表示文字居右。注：原生的语法两边都要用 | 包起来。此处省略示例：姓名|技能|排行 --|:--:|--: 刘备|哭|大哥 关羽|打|二哥 张飞|骂|三弟效果：姓名技能排行刘备哭大哥关羽打二哥张飞骂三弟十、代码单行代码：代码之间分别用一个反引号包起来\`create database hero;\`代码块：代码之间分别用三个反引号包起来，且两边的反引号单独占一行;或使用4个空格或者一个制表符（Tab 键）。\`\`\`function fun(){ echo "这是一句非常牛逼的代码";}fun();\`\`\`效果：单行代码create database hero;代码块function fun(){ echo "这是一句非常牛逼的代码"; } fun();十一、转义显示markdown的专有字符可能需要转义，代码块内的内容不会转义。示例：\\ 反斜杠 \` 反引号 \* 星号 \_ 下划线 \{\} 大括号 \[\] 中括号 \(\) 小括号 \# 井号 \+ 加号 \- 减号 \. 英文句号 \! 感叹号效果：\ 反斜杠\` 反引号* 星号\_ 下划线{} 大括号[] 中括号() 小括号\# 井号+ 加号- 减号. 英文句号\! 感叹号

ssh安装与配置
type: item
date: 2019-07-01T07:53:00+00:00
description: 安装ssh服务端和客户端$ sudo apt install ssh #两个都安装 $ sudo apt install openssh-server #安装服务端 $ sudo apt install openssh-client #安装客户端密钥登录配置客户端生成SSH秘钥对，在用户主目录.ssh下id-rsa和id-rsa.pub，记住公钥id-rsa.pub内容$ ssh-keygen -t rsa -b 4096 #(生成的rsa秘钥对的长度是4096个bit) 在服务器要登录的用户目录下创建.ssh/authorized_keys文件，将自己的公钥写入其中$ echo <公钥> >> .ssh/authorized_keys配置服务器的/etc/ssh/sshd_config文件，把PubkeyAuthentication配置为yes允许使用基于密钥认证的方式登录$ sudo nano /etc/ssh/sshd_config启动sshd服务和客户端登录$ sudo service ssh start $ ssh yi@127.0.0.1