「Chapter 12」- 名词从句
典型的名词从句
典型的名词从句具有以下几个特色:
(1)是简单句:本身原来是一个完整、独立的简单句。
(2)有连接词:前面加上连接词 that。这个连接词没有意义,只有语法功能,表示后面跟着一个名词从句。
(2)作名词用:名词从句须放在主要从句的名词位置(主语、宾语、补语、同位语等位置),当作名词使用。
现在依名词从句出现的各种位置来看看它的变化。
主语位置
示例一、普通改写
Something[S] is strange.
He didn’t show up on time.
(2) He didn’t show up on time 就是(1)主语 something 的内容。在(2)前面加上 that(表示“那件事”)就成了名词从句,可以直接放入(1)主语(something)的位置,做为 is 的主语使用,成为复句:
That he didn’t show up on time[S] is strange.
示例二、使用虚词
如果名词从句很长,直接放入主语位置使用时,可能会让读者看不清楚,这时候可以用 it 这个虚词(expletive)来填入主语位置,让主要从句 It is strange 比较清楚地表达出来,名词从句则向后移,成为复句:
It is strange that he didn’t show up on time[S].(真是奇怪,他没有准时来)
宾语位置
示例一、普通改写
The defendant[S] said[V] something[O].
He didn’t do it.
(2)的 He didn’t do it 就是(1)中 something 的内容,于是在(2)前面加上连接词 that 成为名词从句,然后直接放入(1)中作为 said 的宾语,成为复句:
The defendant[S] said[V] that he didn’t do it[O].(被告说那不是他做的)
示例二、使用虚词
I[S] find[V] something[O] strange[C].
He didn’t show up on time.
(2) He didn’t show up on time 就是(1)的宾语 something 的内容,可以加上连接词 that,成为名词从句,放入 something 的位置作宾语使用。可是它后面还有一个补语 str[……]
「Chapter 13」- 副词从句
副词从句是三种从属从句(名词、形容词、副词从句)中最简单的一种。它与主要从句之间,有点像对等从句的关系,很容易了解。副词从句因为结构十分单纯,所以学习副词从句的重点只是在认识各种连接词,以便写作时可以选择贴切的连接词来表达各种逻辑关系。
副词从句与对等从句的比较
Because[从属连接词] he needs the money[副词从句], he works hard[主要从句].(因为他缺钱,所以他勤奋工作。)
He needs the money[对等从句], and[对等连接词] he works hard[对等从句].(他需要钱,也勤奋工作。)
(1)是分成主、从的复句结构。其中副词从句 he needs the money 和主要从句 he works hard 分别都是完整、独立的简单句,以一个连接词连起来。这和(2)中两个对等从句的情形完全相同。唯一的差别是对等从句(2)使用对等连接词 and,连接起来的两个从句地位相等,没有主从之分,也不需互相解释。副词从句(1)则使用从属连接词 because,使得 because he needs the money 成为从属地位的从句,当作副词使用,用来修饰主要从句中的动词 works(交待 works hard 的原因)。除了这一层修饰关系之外,副词从句和对等从句同样单纯。
副词从句与名词从句的比较
The Witness[S] said[V] that[连接词] he saw the whole thing[O(名词从句)].(证人说他目睹了事情发生的全过程。)
The witness[S] said[V] this[O], though[连接词] he didn’t really see it[副词从句].(证人这样说,尽管他没有真正看到。)
副词从句和名词从句就有较大的差别。
两者的共同点
首先,两者原来都是完整、独立的简单句。(1)中的 he saw the whole thing 与(2)中的 he didn’t really see it。
然后,两者都是加上从属连接词构成从属从句,但是由此开始有了差别。
两者的不同点
第一个差别是:使用的连接词不同,一个有意义,一个无意义。名词从句加的连接词是 that,表示“那件事情”,此外没有别的意义。副词从句加的连接词,如(2)的 though,以及上节例子中的 because 等等,都是有意义的连接词,表达两句话之间的逻辑关系:though 表示让步,because 表示原因,if 表示条件。
第二个差别是:名词从句属于名词类,要放在主要从句中的名词位置使[……]
「Chapter 14」- 关系从句
从属从句有三种,除了名词从句和副词从句之外,还有就是形容词从句,又称关系从句。如同名词从句和副词从句一样,关系从句也有它明显的特色。
关系从句的特色
关系从句如果没有经过任何省略,都应该以形容词从句看待。 它的特色有以下几点:
一、两个句子要有交叉
也就是:两个句子间要有一个重复的元素,由此建立“关系”, 才可以用关系从句的方式来合成复句。例如:
For boyfriend I’m looking for a man. (找男朋友,我想找个男人。)
He is tall, rich, and well-educated. (他身材高、收入高、教育水准高。)
这两个句子中的 a man 和 he 是重复的:a man就是代名词he所代表的对象(即先行词)。因为有这个交叉存在,两个句子有关系, 才可以进行下一步的动作 —— 制造关系从句。
二、把交集点改写为关系词的拼法(wh-),让它产生连接词的功能
在上例中就是把he改写为who,成为:
who[S] is[V] tall, rich, and well-educated
这就是一个关系从句。Who 仍然具有 he 的功能,也就是作为这个从句的主语,但是它同时也有连接词的功能。
三、将关系从句附于主要从句的交集点(名词)后面来修饰它(作形容词使用)
上例中就是把 who 从句附在 a man 之后成为:
For boyfriend I’m looking for a man[名词(先行词)] who is tall rich, and well-educated[关系从句(形容词类)].
(找男朋友,我想找一个身材高、收入高、教育水准高的人。)
由以上的分析可以看出,关系从句有一个很重要的特色:关系从句的连接词是从句中内含字眼的改写,而名词从句与副词从句的连接词都是外加的。请比较下列三句:
I[S] know[V] that[连接词] I am right[O(名词从句)].(我知道我对。)
I[S] know[V] this[O] because[连接词] I have proof[副词从句].
(我知道,因为我有证据。)
I[S] don’t trust[V] people[O] who talk too much[关系从句].
(我不信任话太多的人。)
例1中的名词从句是由完整的简单句 I am right 外加连接词 that 所构成。例2的副词从句也是完整的单句 I have proof[……]
「Chapter 15」
内容简介[……]
「PART 3 (Reduced Clauses and Inverted Sentence)」
内容简介
章节列表
「Chapter 22」 「Chapter 19」 「Chapter 16」- 从属从句简化的通则 「Chapter 20」 「Chapter 21」 「Chapter 17」 「Chapter 18」[……]
「Chapter 16」- 从属从句简化的通则
简化从句
英语语法以句子为研究对象。英语句型有结构较单纯的简单句 与结构较复杂的复句、合句之分,在前面已分别探讨过。简单句的结构比较单纯,只有五种基本句型的变化。作文中若只用简单句, 除了风格不够成熟外,表达力亦嫌薄弱。间杂复句、合句于文中, 则有助于表达较为复杂的观念,亦可丰富句型的变化,使风格趋于成熟。
然而,复句、合句包含两个以上的从句,其间往往有重复的元素,因而有进一步精简的空间。若剔除重复或空洞的元素,让复句、合句更加精简,又不失清楚,这就是简化从句。如果说简单句是初级句型,复句、合句是中级句型,那么精简的简化从句就是高级句型。这种句型可以浓缩若干句子的意思于一句,同时符合修辞学对 清楚与简洁的要求,是讲究修辞的 TIME 大量使用的句型。
合句的简化方式
删除对等从句间相对应位置(主语与主语、动词与动词等等)重复的部分,第十五章已经以例句的方式介绍过其简化方法。
复句的简化方式
包括名词从句、形容词从句、副词从句三种的简化。一般语法书称这三种从属从句的简化为“非限定从句”(NonfiniteClauses),并称其中的 Ving(动名词或现在分词)、Ven(过去分词)与toV(不定词)为“非限定动词”(Nonfinite Verbs)
为何不称“非限定从句”?
读者可能会感到奇怪,为何本书不沿用行之有年的“非限定从句”观念,而要提出新的“简化从句”(Reduced Clauses)概念,原因有二:
第一,“非限定从句”的概念固然很好,但是对于各种非限定动词的由来、变化及如何选择等等问题所提出的说明,似乎不易让学习者很快通盘了解,至少从笔者接触的学习者及教学经验中观察 是如此。
第二,非限定从句往往被与非限定动词划上等号。亦即,许多学生只知有 to V、Ving 与 Ven,而不知还有许多其他的变化。因此, 笔者尝试建立一套统一、易懂的结构,来诠释比较复杂的高级句型变化。简化从句的观念就是如此产生的。这个观念回溯到修辞的根源,以修辞的两大要求清楚(clear)与简洁(concise) 为岀发点,借着探讨如何由完整的从句简化为非限定从句等等的过程,帮助学习者了解各种句型变化的道理。
简化从句的观念可以说是笔者对修辞学的观察与教学经验结合的成果,并已经过长期实际教学所验证,能在短期内大幅促进学习 者对英语句型的掌握。
从属从句简化的通则
不论是名词类、形容词类还是副词类的从属从句,简化的共同原则是省略主语与 be 动词,只保留补语部分。这当中还有一些变化,例如若省略从属从句的主语会造成主语不清时该如何处理?剩下的补语部分如果词类与原来的从属从句词类不同时要怎么办?还有,连接词是否应一并省略?这些问题在不同词类的从属从句中[……]
「Chapter 18」
内容简介[……]
「Chapter 19」
内容简介[……]
「Chapter 22」
内容简介[……]
「REGULAR EXPRESSION」- 常用代码
匹配中文字符,但并不包含标点符号:[\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff]
常用特殊字符
.,匹配任意单个的字符,包括空格 例如:0.0 匹配 0x0、020、…
^,匹配行首的位置,即一个字符串的开始 例如:^10 匹配 10.1.1.1,不匹配 20.1.1.1
$,匹配行尾的位置,即一个字符串的结束 例如:1$ 匹配10.1.1.1,不匹配10.1.1.2
_,下划线,匹配任意的一个分隔符:匹配单个逗号(,)、左花括号({)、右花括号(})、左圆括号、右圆括号;匹配输入字符串的开始位置(同^);匹配输入字符串的结束位置(同$);匹配一个空格; 例如:_10 匹配 (10、{10、空格10;10_ 匹配 10)、10}、10空格
|,管道字符,逻辑或。x|y,匹配x或y 例如:100|200 匹配100或者200
\,转义字符,用来将下一个字符(特殊字符或普通字符)标记为普通字符 例如:\* 匹配 *
*,匹配前面的子正则表达式0次或多次 例如:10* 匹配1、10、100、1000、… 例如:(10)* 匹配空、10、1010、101010、…
+,匹配前面的子正则表达式1次或多次 例如:10+ 匹配10、100、1000、… 例如:(10)+ 匹配10、1010、101010、…
?,匹配前面的子正则表达式0次或1次 例如:10? 匹配1或10 例如:(10)? 匹配空或10
(),圆括号可以用来定义操作符的范围和优先度。 例如:gr(a|e)y等价于gray|grey。
[xyz],匹配正则表达式中包含的任意一个字符 例如:[123] 匹配255中的2
[^xyz],匹配正则表达式中未包含的字符 例如:[^123] 匹配123之外的任何字符
[a-z],匹配正则表达式指定范围内的任意字符 例如:[0-9] 匹配0到9之间的所有数字
[^a-z],匹配正则表达式指定范围外的任意字符 例如:[^0-9] 匹配所有非数字字符(即匹配0到9之外的任何字符)
常用正则表达式
# 处理汉字空格
([^\x00-\xff]) ([^\x00-\xff])
\1\2
# 中英文之间添加空格
([^\x00-\xff,、:。)(])([A-z])
\1 \2
([A-z…])([^\x00-\xff,、:。…)(])
\1 \2
# 逗号替换
([^\x00-\xff])\s*,
\1,
,\s*([^\x00-\xff])
,\1
# 其他替换处理
([^\x00-\xff])([\x00-\xff])
([A-z])([^\x00-\xff])
\1 \2[……]
「Shell」- 数据类型:日期
常用日期格式
# 2023-01-18 14:33:09
date “+%Y-%m-%d %H:%M:%S”
判断日期是否在某个时间段之内
bash – Calculate time difference between two dates – Unix & Linux Stack Exchange
CURRENT_TIME=$(date ‘+%H%M’)
[ “0805” -lt “$CURRENT_TIME” ] && [ “$CURRENT_TIME” -lt “0910” ] && echo “Skip between 08:50-09:10” && exit
[ “1350” -lt “$CURRENT_TIME” ] && [ “$CURRENT_TIME” -lt “1410” ] && echo “Skip between 13:50-14:10” && exit
[ “1920” -lt “$CURRENT_TIME” ] && [ “$CURRENT_TIME” -lt “1940” ] && echo “Skip between 19:20-19:40” && exit[……]
「Docker Compose」- 安装(x86、arm、amd64)
在 x86 中,安装 Docker Compose 命令
方法一、从 GitHub 中安装(推荐)
国内的安装方法(解决网络问题):
# 安装最新版本
# 参考 https://get.daocloud.io/#install-compose 文档
# 1.29.2
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` \
> /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 2.15.1
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.15.1/docker-compose-`uname -s`-`uname -m` \
> /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
官网的安装方法:
curl -s -L “https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)” \
-o /usr/local/sbin/docker-compose
chmod +x /usr/local/sbin/docker-compose
方法二、使用 pip 安装(不建议使用)
在安装过程中,该方法需要处理依赖问题与版本问题,略显复杂,因此不建议使用该方法:
pip install -U docker-compose
方法三、从仓库中安装(不建议)
在 CentOS 7 及 Debian 10 中,仓库已经内置 Docker Compoes 包,可以直接安装:
yum install -y docker-compose.noarch
apt-get install -y docker-compose
但是,从仓库安装的 Docker Compose 命令的版本较旧,经常会提示各种问题。因此,我们很少采用这种方法来安装。
在 arm64 中,安装 Docker Compose 命令
通过仓库安装(APT)
# Ubuntu 18.04 ARM64
apt-get install docker-compose[……]
「docker-compose」- 常用命令及常见问题处理
常用命令
docker-compose help
docker-compose ps
docker-compose logs
docker-compose stop # 首先使用docker-compose stop停止命令
docker-compose kill # 如果服务没有停止,可以结束进程
docker-compose start
docker-compose rm # 删除服务
重启特定服务(容器),并使配置生效
docker-compose down | Docker Documentation docker-compose restart | Docker Documentation How to restart a single container with docker-compose – Stack Overflow
当修改 docker-compose.yml 文件后,需要重启容器(docker-compose down, then docker-compose up),以使新的配置生效。
但是,我们希望仅仅重启特定服务(容器),而不是全部重新启动。解决方案:
docker-compose up –detach –build “<service name>”
查看容器日志
docker-compose logs “service name”
docker-compose logs -f “service name”
# 如果不使用 –tail= 选项,则日志会不断的输出,最后才会出现 -f 效果。
docker-compose logs –tail=10 -f[……]
「Docker Compose」- 生成镜像构建命令
问题描述
在 Docker Compose 中,可以使用 docker-compose build <service> 可以构建单独的镜像。
但是,在实际的应用过程中,还会遇到其他的更复杂的需求,导致我们需要从 docker-compose.yaml 提取构建命令。
该笔记将记录:在 Docker Compose 中,如何使用 docker-compose.yml 生成构建命令。
解决方案
# 04/15/2021 虽然 docker-compose.yaml 支持 build 指令,但是我们很少使用该指令,我们将 docker-compose 作为容器编排的部署工具,而不是构建工具。如果在 docker-compose 中完成构建,那么我们将难以很好的集成到 GitLab CI/CD 中,因此才放弃使用 docker-compose build 方式。
第一步、安装依赖
安装 yq 命令:
apt-get install -y jq
pip3 install yq
因为 yq 是对 jq 命令的封装(还有一个 yq 是 Golang 版本),因此需要 jq 命令。
第二步、执行命令
如下命令,可以用于生成 docker build 命令:
docker-compose -f docker-compose-with-build.yml config \
| yq -r ‘.services | .[] | select(.build != null) | “docker build -f ” + .build.context + “/” + .build.dockerfile + ” -t ” + .image + ” ” + .build.context’
如下命令,可以用于执行命令(去掉 echo 命令):
docker-compose -f docker-compose-with-build.yml config \
| yq -r ‘.services | .[] | select(.build != null) | [.build.dockerfile, .image, .build.context] | @tsv’ \
| while IFS=$’\t’ read -r dockerfile image context
do
echo docker build -f “${context}/${dockerfile}” -t “${image}” “${context}”
done
参考文献
docker-compose build | Docker Doc[……]
「Docker Compose」- 向远程主机部署服务
问题描述
通常,我们本地编写 docker-compose.yml 文件,然后运行测试。但是,我们需要在 arm64 环境中进行测试,无法在本地直接运行测试。
我们希望可以在本地编写,然后本地使用 docker-compose up 直接在远程 arm 主机上运行测试。
该笔记将介绍:在本地运行 docker-compose 命令,但是在远程主机中启动服务的方法。
方法一、在上传后执行(传统方法)
在传统方法中,我们需要将 docker-compose.yaml 及相关文件,上传到远程主机,然后执行 docker-compose up 启动服务。
这里不再赘述……
方法二、使用 DOCKER_HOST 变量
使用 tcp 协议
第一步、修改 Docker 服务配置,使其监听 TCP/2375 端口(不再赘述)
第二步、通过 DOCKER_HOST 变量指定远程服务,比如 DOCKER_HOST=”tcp://0.0.0.0:2375″ 指定远程服务:
DOCKER_HOST=”tcp://192.168.10.143:2375″ docker-compose up -d
docker-compose –host “tcp://192.168.10.143:2375″ up -d
使用 ssh 协议(推荐)
我们想使用 TCP 协议(即我们不会改变 docker 配置,使其监听 TCP 端口),而是使用 SSH 协议:
DOCKER_HOST=”ssh://root@192.168.10.143” docker-compose up -d
docker-compose –host “ssh://root@192.168.10.143” up -d
使用 SSH 协议需要注意以下问题: 1)从 Docker 18.09 开始支持 SSH 协议; 2)如果使用 SSH KEY 连接主机,需要 ssh-add -k /path/to/key-file 命令添加密钥,因为 docker-compose 不支持命令行指定密钥,也不会解析 .ssh/config 文件。
该方法的局限性
虽然是远程执行,但本质上还是将命令发送到 Docker 守护进程,也就是说本地配置文件不会发送到远程主机。即类似于 volumes: [“./config:/config”] 指令不会生效,因为在 config 下的配置文件不会发送到远程主机。
方法三、使用 Docker Context 命令
在 Docker 19.03.0 中,引入 Docker Context 支持。Docker Engine release notes | D[……]
「Docker Compose」- 在 CI/CD 中,分离 docker-compose build 与 docker-compose up 指令
问题描述
在 CI/CD 中,我们使用 Docker Compose 来进行容器编排。
但是如果 docker-compose.yaml 包含 build 指令,会导致我们无法分离构建阶段与运行阶段。
该笔记将记录:在使用 Docker Compose 编排时,如何分离构建阶段与运行阶段。
解决方案
docker-compose build docker-compose push docker-compose pull docker-compose up -d
参考文献
docker-compose up | Docker Documentation docker-compose pull | Docker Documentation docker-compose push | Docker Documentation[……]
「Docker Compose」- 在构建时,使用网络加速(代理)
问题描述
在 Docker Compose 中,支持使用 build 指令,以构建运行服务所需要的镜像。
但是,某些构建需要下载国外资源(比如 golang 构建),然而由于网络原因会下载失败。
该笔记将记录:如何在构建时使用网络加速服务(代理)来解决该问题。
解决方法
在构建时,可以制定参数,或者设置环境变量:
1)通过指定构建参数:
docker-compose build \
–build-arg http_proxy=http://proxy.exaple.com \
–build-arg https_proxy=http://proxy.exaple.com
2)通过设置环境变量:
# docker-compose.yaml
build:
context: .
args:
– http_proxy=http://proxy.exaple.com
– https_proxy=http://proxy.exaple.com
参考文献
Docker Build Proxy: Setup the proxy for Dockerfile building – DEV Compose file version 3 reference | Docker Documentation elasticsearch – docker-compose build and http_proxy – Stack Overflow[……]
「Docker Compose」- 开机自动启动应用容器
问题描述
当我们使用 Docker Compose 启动应用程序之后,如果主机发生重启,应用容器无法自动启动。
我们可以使用 Docker Compose 的重启策略,但是也存在一些问题。
该笔记将记录:1)自动启动服务的解决方案、2)及其常见问题和解决方法
方法一、通过 Docker Restart Policy 方法
在 Docker 中,支持 –restart 选项,来控制容器自动启动。在 Docker Compose 中,应该使用 restart 属性:
version: “3.6”
services:
frontend:
image: frontend:v1.0.0
depends_on:
– backend
restart: always
backend:
image: backend:v1.0.0
restart: always
注意事项: 1)Docker 并不知道这些服务的依赖关系及启动顺序,需要我们精心编排 docker-compose.yaml 文件; 2)Docker Compose 不支持 deploy:restart_policy 属性,该属性只能用于 a swarm with docker stack deploy 环境;
方法二、通过进程管理服务(推荐)
该方法本质上还是在执行 docker-compose 命令。
使用 systemd 管理
如下示例,可以根据需要进行设置:
# cat /etc/systemd/system/docker-compose-app.service
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker/app/
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
参考文献
Start containers automatically | Docker Documentation How to run docker-compose up -d at system start up? – Stac[……]
「GitLab CI/CD」- 常用 GitLab Runner 管理
注册 Executor 服务
Registering runners | GitLab
# 通过交互完成注册
gitlab-runner register
…
# 通过命令直接注册
gitlab-runner register –non-interactive \
–url “https://gitlab.com/” \
–registration-token “sBZ7xHzxTz6Ec9mYb1yp” \
–executor “docker” –docker-image ubuntu:latest \
–tag-list “build-in-docker,executor=docker” \
–run-untagged=”true”
gitlab-runner register \
–non-interactive \
–url “https://your.gitlab.server.com/” \
–registration-token “YOUR_REGISTRATION_TOKEN” \
–executor “ssh” \
–ssh-host “REMOTE_SERVER_IP” \
–ssh-port “22” \
–ssh-user “REMOTE_SERVER_USERNAME” \
–ssh-password “REMOTE_SERVER_PASSWORD” \
–ssh-identity-file “/path/to/ssh/private/key” \
–tag-list “ssh,linux”
配置重新加载
GitLab Runner commands/Signals
kill -SIGHUP <main_runner_pid>
并行执行任务数
Advanced configuratio[……]
「Apache Benchmark/ab」- Apache 基准测试
内容:Apache中的ab命令介绍。
ab是Apache HTTP服务器的基准测试工具,用于对Apache HTTP服务器进行基准测试。目的就是为了让你对当前的Web Server的性能有个印象。尤其显示了当前的Web Server每秒能处理的请求数。
ab属于httpd软件包。
命令行语法
ab [ -A auth-username:password ] [ -b windowsize ] [ -B local-address ] [ -c concurrency ] [ -C cookie-
name=value ] [ -d ] [ -e csv-file ] [ -f protocol ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [
-i ] [ -k ] [ -l ] [ -m HTTP-method ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username:pass‐
word ] [ -q ] [ -r ] [ -s timeout ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -u PUT-file ] [ -v
verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[:port] ] [ -y <tr>-attributes ] [ -z
<td>-attributes ] [ -Z ciphersuite ] [http[s]://]hostname[:port]/path
命令行选项
下面是ab命令支持的选项
用于帮助类信息
-h/-V
显示帮助/版本信息。
用于数据分析类
-e csv-file
包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间 这通常比gnuplot文件有用,因为结果已经“二进制”了。
-g gnuplot-file
将所有测量值写为“gnuplot”或TSV(Tab分割)文件。该文件可以轻松地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel等软件中。标签位于文件的第一行。
控制输出结果
-v verbosity
设置输出的详细等级。4+时打印标题;3+时打印响应代码(404,200等),2及以上打印警告和信息。
-w
在HTML表格中打印出结果。默认表是两列宽,带有白色背景
-x[……]
「HTTPS」- HTTP over TLS
问题描述
HTTP 具有以下问题: 1)缺乏安全性:HTTP 不具备数据加密和身份验证的功能,因此传输的数据容易被黑客窃取和篡改,可能导致信息泄露和安全风险; 2)易受攻击:HTTP 传输数据时,黑客可以轻松地窃取数据包和会话 ID,从而伪造用户身份,登录用户账户,进行恶意操作和攻击; 3)用户隐私不受保护:HTTP 传输数据时,用户的个人信息和隐私数据容易被窃取和泄露,从而导致身份被盗用和财产损失;
解决方案
HTTPS(Hypertext Transfer Protocol Secure,超文本传输安全协议),也常称为 HTTP over TLS(Hyper Text Transfer Protocol over Transport Layer Security)或 HTTP over SSL(Hyper Text Transfer Protocol over Secure Socket Layer),HTTP Secure,是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。HTTPS 通过 HTTP 进行通信,并使用 SSL/TLS 来加密数据;
HTTPS 证书是一种数字证书,用于保护网站和应用程序的安全性;
原理简述
它通过加密通信的方式来保护用户的隐私和敏感信息,如用户名、密码、信用卡号等;
HTTPS 证书通常由第三方认证机构(CA)颁发,证明了网站或应用程序的身份,确保用户与其交互的是合法的实体,并且保证数据传输的完整性和机密性;
HTTPS 在 HTTP 的基础下加入 SSL/TLS 层,是使用 SSL/TLS 加密的 HTTP 协议;
特性特征
HTTP 协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议 TLS 具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生;
数据传输安全性更高:HTTPS 使用 SSL/TLS 协议对数据进行加密,可以防止数据被窃听和篡改,确保数据传输的安全性; 用户隐私保护更好:HTTPS 使用 SSL/TLS 协议对数据进行加密,可以防止敏感信息被截获和泄露,保护用户的隐私; 增强网站可信度:HTTPS 使用 SSL/TLS 协议进行认证,可以证明网站的身份和合法性,增强网站的可信度; 支持 HTTP/2 协议:HTTPS 支持 HTTP/2 协议,可以提高网站的性能和速度,加快网页加载速度;
应用场景
网上购物:HTTPS 可以加密用户的信用卡信息和其他敏感信息,提高用户的支付安全性; 网上银行:HTTPS 可以保证用户的银行账户信息不会被盗取,提高用户的资金安全性; 社交网络:HTTPS 可以保护用户的个人信息不被黑客窃取,提高用户的隐私保护; 搜索引擎:HTTPS[……]
「HTTPS」- 概念术语
泛域名证书
Can You Create A Wildcard SSL Certificate For Two Levels? SSL Multilevel Subdomain Wildcard 泛域名证书是否对三级子域名生效呢?[……]
「HTTPS」- 模块交互
HTTPS 优化
美图HTTPS优化探索与实践 从无法开启 OCSP Stapling 说起
说明
TLS 将所有流量包含在不同类型的“记录(record)”中。第一个字节是十六进制字节 0x16=22,这意味着这是一个“握手(handshake)”记录。共有以下几种“记录”类型:
change_cipher_spec(20, 0x14)
alert(21, 0x15)
handshake(22, 0x16)
application_data(23, 0x17)
(255)
括号中的值分别为十进制和十六进制的编码;
“非对称加密”算法用于在握手过程中加密生成的密码;“对称加密算法”用于对真正传输的数据进行加密;“哈希算法”用于验证数据的完整性;[……]
「HTTP/HTTPS」- 常见问题处理
配置 HTTPS 证书
Configuring HTTPS servers
在腾讯云购买了域名,赠送了一年的SSL证书。其他的云平台应该也有赠送吧(瞎猜的)。我的博客主要是静态页面,压根就没有敏感的数据需要保护。但是,送的SSL证书不用干嘛,闲着也是闲着,跟一下风,正好也整理一下与HTTPS有关的内容,毕竟这里不用其他的地方还要用。所以,HTTPS还是很有必要学习一下的。
不同Web服务器配置方法
详细的配置方法和各种参数在各个Web服务器的官方手册里都有介绍。
腾讯云里也有现成的文档,参考「文档平台/SSL 证书/操作指南/证书安装指引」一文。涵盖的Web服务器有:Apache 2.x、Nginx、IIS、Tomcat这四种Web服务器。
具体的配置方法这里就不再赘述。
强制使用HTTPS访问
How to force or redirect to SSL in nginx?[……]
「TLS」- 与 IE 有关的问题
问题描述
在使用 Chrome、Firefox 浏览器时,能够正常访问 HTTPS 站点。在使用 IE 浏览器时,无法正常访问并产生如下提示:
然后,我们按照提示修改 IE 浏览器的 TLS 设置: 然后便可正常访问 HTTPS 站点(默认只勾选TLS 1.0选项),至此原因已经清晰。
问题原因
该站点部署在Kusernetes Cluster中,使用NGINX Ingress Controller暴露,但是NGINX Ingress Controller默认只支持TLS 1.2版本。在IE 11中,默认只启用TLS 1.0版本。因此出现TLS握手失败的情况,导致站点无法访问。
查看服务器支持哪些 SSL 协议版本:
openssl s_client -connect foo.example.com:443 -tls1 # TLSv1
openssl s_client -connect foo.example.com:443 -tls1_1 # TLSv1.1
openssl s_client -connect foo.example.com:443 -tls1_2 # TLSv1.2
openssl s_client -connect foo.example.com:443 -tls1_3 # TLSv1.3
# 有时可以使用NMAP进行扫描,但是有时候会出现无结果(原因未知)
nmap –script ssl-enum-ciphers -p 443 www.example.com
解决办法
调整 NGINX Ingress Controller 配置,修改名为nginx-configuration的ConfigMap资源,在data中应包含如下两行配置:
ssl-ciphers: ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-A[……]
「HTTPS」- 使用 mitmproxy 调试
The web gui is very comfortable. You can use mitmproxy instead.
1)Run the proxy server $ mitmweb –listen-port 44700 Make sure that 44700 port is open in firewall. You can specify the IP of proxy with –listen-host flag. I.E. –listen-host 192.168.0.10 or try –listen-host 0.0.0.0 if can not access remotely.
2)Configure in the remote device the IP and port proxy.
3)Open browser in the remote device and go to http://mitm.it, is a local page, in a local DNS, that you can download and install the certs. If android, you must specify a pin lock screen.
mv mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
update-ca-certificates
4)Open web gui, by default in port 8081 in your browser: http://127.0.0.1:8081/#/flows
5)Enjoy networks intercepts.
参考文献
linux – How to configure mitmproxy to intercept https? – Server Fault[……]
「HTTPS」- unable to get local issuer certificate
问题描述
当我们更新网站证书之后,使用 Safari 正常,但是使用 curl 访问产生如下错误:
# curl https://xxxxx.example.com/
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
问题原因
HTTP Server Test Fails with SSL Error – ThousandEyes Documentation
解决方法
针对我们的问题,我们需要下载 RapidSSL TLS DV RSA Mixed SHA256 2020 CA-1 的 PEM 证书。
保存到 /usr/local/share/ca-certificates/extra/RapidSSLTLSDVRSAMixedSHA2562020CA-1.crt 文件
然后执行 update-ca-certificates 命令即可。
参考文献
DigiCert Root Certificates – Download & Test | DigiCert.com How to import CA root certificates on Linux and Windows[……]
「Certbot」- 基本概念
原理概述
Let’s Encrypt/How It Works
在使用Certbot申请证书时,我们会疑问…………我们可以为任意域名申请证书吗?我们应该能够想到,这是不可能的…………
本文将简述ACME协议工作原理,通过理解原理来找到它的适用场景。
分为两个步骤:(1)向CA证明域名所有权;(2)进行证书申请、续期、撤销动作。
域名所有权证明
首先客户端会生成密钥对,公钥发送给CA服务器,这等同于“创建帐号”。以后申请证书都与该公钥挂钩。
然后客户端会请求CA服务器,应该如何证明自己拥有域名。随后CA则会返回用于证明身份的方法,并且还会返回随机串,而客户端必须使用该随机字符串签名,以证明它控制密钥对。
之后CA服务器会进行检查,如果检查通过就表示该密钥可以用于特定域名管理。
证书操作过程
在密钥对认证通过之后,就可以使用该密钥对进行证书管理。
频率限制,Rate Limits
Rate Limits[……]
「Certbot」- 安装并申请 Let’s Encrypt 证书
问题描述
该笔记将记录:在 Linux 中,如何安装 Certbot 工具,并使用它申请证书,以及相关问题的处理。
解决方案
注意事项
该部分内容属于简述,详细内容请参考 certbot instructions 官方页面,依据提示操作即可。以下是操作大致流程: 1)选择站点服务器软件,以及操作系统发行版 2)查看是否满足条件 3)依据提示安装软件包 4)执行命令生成证书 5)访问站点以检查证书是否生效 6)添加定时任务以实现证书自动续期
on Debian GNU/Linux 10 (buster)
# 环境设置
apt update
apt install python3 python3-venv libaugeas0
# 安装 certbot 命令
python3 -m venv /srv/certbot/
/srv/certbot/bin/pip install –upgrade pip
/srv/certbot/bin/pip install certbot
ln -s /srv/certbot/bin/certbot /usr/bin/certbot
# 证书申请操作
…
# 定时任务,以完成证书自动续期
echo “0 0,12 * * * root /srv/certbot/bin/python -c ‘import random; import time; time.sleep(random.random() * 3600)’ && certbot renew -q –post-hook ‘systemctl reload nginx'” \
| sudo tee -a /etc/crontab > /dev/null
on CentOS 7.4 with PIP3.6
经验:这种东西就应该在虚拟环境里搞,但凡与应用有关且与系统管理无关的 Python 应用,都应该在虚拟环境里搞。要是在系统环境里搞,直接 yum install,pip2.7 install,等着吧,早晚有难受的时候。
我们并没有在虚拟环境里,因为系统没有使用 Python 3.6 环境,因此我们可以直接使用:
pip3.6 install certbot certbot-nginx certbot-dns-aliyun
Certbot 1.0.0 on CentOS 7.4
################################################################################
# 安装 Certbot 工具
###############################[……]
「Certbot」- The manual plugin is not working
问题描述
执行 certbot renew 产生如下错误:
# certbot renew
/usr/lib/python2.7/site-packages/pkg_resources/py2_warn.py:22: UserWarning: Setuptools will stop working on Python 2
************************************************************
You are running Setuptools on Python 2, which is no longer
supported and
>>> SETUPTOOLS WILL STOP WORKING <<<
in a subsequent release (no sooner than 2020-04-20).
Please ensure you are installing
Setuptools using pip 9.x or later or pin to `setuptools<45`
in your environment.
If you have done those things and are still encountering
this message, please comment in
https://github.com/pypa/setuptools/issues/1458
about the steps that led to this unsupported combination.
************************************************************
sys.version_info < (3,) and warnings.warn(pre + “*” * 60 + msg + “*” * 60)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Processing /etc/letsencrypt/renewal/harbor.example.com.conf
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Cert is due for renewal, auto-renewing…
Could not cho[……]