mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-22 23:00:57 +08:00
Merge remote-tracking branch 'LCTT/master'
This commit is contained in:
commit
90a09a3d20
@ -1,19 +1,19 @@
|
|||||||
开始使用Python调试器
|
Python 调试器入门
|
||||||
======
|
======
|
||||||
|
|
||||||
![](https://fedoramagazine.org/wp-content/uploads/2018/05/pdb-816x345.jpg)
|
![](https://fedoramagazine.org/wp-content/uploads/2018/05/pdb-816x345.jpg)
|
||||||
|
|
||||||
Python生态系统包含丰富的工具和库,可以改善开发人员的生活。 例如,杂志之前已经介绍了如何[使用交互式shell增强Python][1]。 本文重点介绍另一种可以节省时间并提高Python技能的工具:Python调试器。
|
Python 生态系统包含丰富的工具和库,可以让开发人员更加舒适。 例如,我们之前已经介绍了如何[使用交互式 shell 增强 Python][1]。本文重点介绍另一种可以节省时间并提高 Python 技能的工具:Python 调试器。
|
||||||
|
|
||||||
### Python 调试器
|
### Python 调试器
|
||||||
|
|
||||||
Python标准库提供了一个名为pdb的调试器。 此调试器提供了调试所需的大多数功能,如断点,单行步进,堆栈帧的检查等等。
|
Python 标准库提供了一个名为 pdb 的调试器。此调试器提供了调试所需的大多数功能,如断点、单行步进、堆栈帧的检查等等。
|
||||||
|
|
||||||
pdb的基本知识很有用,因为它是标准库的一部分。 你可以在无法安装其他增强的调试器的环境中使用它。
|
了解一些pdb 的基本知识很有用,因为它是标准库的一部分。 你可以在无法安装其他增强的调试器的环境中使用它。
|
||||||
|
|
||||||
#### 运行 pdb
|
#### 运行 pdb
|
||||||
|
|
||||||
运行pdb的最简单方法是从命令行,将程序作为参数传递给debug。 考虑以下脚本:
|
运行 pdb 的最简单方法是从命令行,将程序作为参数传递来调试。 看看以下脚本:
|
||||||
|
|
||||||
```
|
```
|
||||||
# pdb_test.py
|
# pdb_test.py
|
||||||
@ -41,7 +41,7 @@ $ python3 -m pdb pdb_test.py
|
|||||||
(Pdb)
|
(Pdb)
|
||||||
```
|
```
|
||||||
|
|
||||||
使用pdb的另一种方法是在程序中设置断点。 为此,请导入pdb模块并使用set_trace函数:
|
使用 pdb 的另一种方法是在程序中设置断点。为此,请导入 `pdb` 模块并使用`set_trace` 函数:
|
||||||
|
|
||||||
```
|
```
|
||||||
# pdb_test.py
|
# pdb_test.py
|
||||||
@ -60,21 +60,22 @@ def countdown(number):
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
seconds = 10
|
seconds = 10
|
||||||
countdown(seconds)
|
countdown(seconds)
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
$ python3 pdb_test.py
|
$ python3 pdb_test.py
|
||||||
> /tmp/pdb_test.py(6)countdown()
|
> /tmp/pdb_test.py(6)countdown()
|
||||||
-> print(i)
|
-> print(i)
|
||||||
(Pdb)
|
(Pdb)
|
||||||
```
|
```
|
||||||
|
|
||||||
脚本在断点处停止,pdb显示脚本中的下一行。 你也可以在失败后执行调试器。 这称为*事后调试(postmortem debugging)*。
|
脚本在断点处停止,pdb 显示脚本中的下一行。 你也可以在失败后执行调试器。 这称为<ruby>事后调试<rt>postmortem debugging</rt></ruby>。
|
||||||
|
|
||||||
#### 导航执行堆栈
|
#### 穿行于执行堆栈
|
||||||
|
|
||||||
调试中的一个常见用例是导航执行堆栈。 Python调试器运行后,以下命令很有用:
|
调试中的一个常见用例是在执行堆栈中穿行。 Python 调试器运行后,可以使用以下命令:
|
||||||
|
|
||||||
+ w(here) : 显示当前执行的行以及执行堆栈的位置。
|
|
||||||
|
|
||||||
|
+ `w(here)`:显示当前执行的行以及执行堆栈的位置。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ python3 test_pdb.py
|
$ python3 test_pdb.py
|
||||||
@ -88,8 +89,7 @@ $ python3 test_pdb.py
|
|||||||
(Pdb)
|
(Pdb)
|
||||||
```
|
```
|
||||||
|
|
||||||
+ l(ist) : 显示当前位置周围更多的上下文(代码)。
|
+ `l(ist)`:显示当前位置周围更多的上下文(代码)。
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ python3 test_pdb.py
|
$ python3 test_pdb.py
|
||||||
@ -109,8 +109,7 @@ $ python3 test_pdb.py
|
|||||||
15 seconds = 10
|
15 seconds = 10
|
||||||
```
|
```
|
||||||
|
|
||||||
+ u(p)/d(own) : 向上或向下导航调用堆栈。
|
+ `u(p)`/`d(own)`:向上或向下穿行调用堆栈。
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ py3 test_pdb.py
|
$ py3 test_pdb.py
|
||||||
@ -129,10 +128,9 @@ $ py3 test_pdb.py
|
|||||||
|
|
||||||
pdb提供以下命令来执行和单步执行代码:
|
pdb提供以下命令来执行和单步执行代码:
|
||||||
|
|
||||||
+ n(ext): 继续执行,直到达到当前函数中的下一行,否则返回
|
+ `n(ext)`:继续执行,直到达到当前函数中的下一行,或者返回
|
||||||
+ s(tep): 执行当前行并在第一个可能的场合停止(在被调用的函数或当前函数中)
|
+ `s(tep)`:执行当前行并在第一个可能的场合停止(在被调用的函数或当前函数中)
|
||||||
+ c(ontinue): 继续执行,仅在断点处停止。
|
+ `c(ontinue)`:继续执行,仅在断点处停止。
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ py3 test_pdb.py
|
$ py3 test_pdb.py
|
||||||
@ -162,11 +160,11 @@ $ py3 test_pdb.py
|
|||||||
(Pdb)
|
(Pdb)
|
||||||
```
|
```
|
||||||
|
|
||||||
该示例显示了next和step之间的区别。 实际上,当使用step时,调试器会进入pdb模块源代码,而接下来就会执行set_trace函数。
|
该示例显示了 `next` 和 `step` 之间的区别。 实际上,当使用 `step` 时,调试器会进入 `pdb` 模块源代码,而接下来就会执行 `set_trace` 函数。
|
||||||
|
|
||||||
#### 检查变量内容
|
#### 检查变量内容
|
||||||
|
|
||||||
pdb非常有用的地方是检查执行堆栈中存储的变量的内容。 例如,a(rgs)命令打印当前函数的变量,如下所示:
|
+ pdb 非常有用的地方是检查执行堆栈中存储的变量的内容。 例如,`a(rgs)` 命令打印当前函数的变量,如下所示:
|
||||||
|
|
||||||
```
|
```
|
||||||
py3 test_pdb.py
|
py3 test_pdb.py
|
||||||
@ -184,7 +182,7 @@ number = 10
|
|||||||
|
|
||||||
pdb 打印变量的值,在本例中是 10。
|
pdb 打印变量的值,在本例中是 10。
|
||||||
|
|
||||||
可用于打印变量值的另一个命令是p(rint)。
|
+ 可用于打印变量值的另一个命令是 `p(rint)`。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ py3 test_pdb.py
|
$ py3 test_pdb.py
|
||||||
@ -211,19 +209,19 @@ $ py3 test_pdb.py
|
|||||||
(Pdb)
|
(Pdb)
|
||||||
```
|
```
|
||||||
|
|
||||||
如示例中最后的命令所示,print可以在显示结果之前计算表达式。
|
如示例中最后的命令所示,`print` 可以在显示结果之前计算表达式。
|
||||||
|
|
||||||
[Python 文档][2]包含每个 pdb 命令的参考和示例。 对于开始使用 Python 调试器人来说,这是一个有用的读物。
|
[Python 文档][2]包含每个 pdb 命令的参考和示例。 对于开始使用 Python 调试器人来说,这是一个有用的读物。
|
||||||
|
|
||||||
### 增强的调试器
|
### 增强的调试器
|
||||||
|
|
||||||
一些增强的调试器提供了更好的用户体验。 大多数为pdb添加了有用的额外功能,例如语法突出高亮,更好的回溯和自我检查。 流行的增强调试器包括[IPython的ipdb][3]和[pdb ++][4]。
|
一些增强的调试器提供了更好的用户体验。 大多数为 pdb 添加了有用的额外功能,例如语法突出高亮、更好的回溯和自省。 流行的增强调试器包括 [IPython 的 ipdb][3] 和 [pdb++][4]。
|
||||||
|
|
||||||
这些示例显示如何在虚拟环境中安装这两个调试器。 这些示例使用新的虚拟环境,但在调试应用程序的情况下,应使用应用程序的虚拟环境。
|
这些示例显示如何在虚拟环境中安装这两个调试器。 这些示例使用新的虚拟环境,但在调试应用程序的情况下,应使用应用程序的虚拟环境。
|
||||||
|
|
||||||
#### 安装 IPython 的 ipdb
|
#### 安装 IPython 的 ipdb
|
||||||
|
|
||||||
要安装IPython ipdb,请在虚拟环境中使用pip:
|
要安装 IPython ipdb,请在虚拟环境中使用 `pip`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ python3 -m venv .test_pdb
|
$ python3 -m venv .test_pdb
|
||||||
@ -237,7 +235,7 @@ $ source .test_pdb/bin/activate
|
|||||||
import ipdb; ipdb.set_trace()
|
import ipdb; ipdb.set_trace()
|
||||||
```
|
```
|
||||||
|
|
||||||
IPython的ipdb也可以在Fedora包中使用,所以你可以使用Fedora的包管理器dnf来安装它:
|
IPython 的 ipdb 也可以用 Fedora 包安装,所以你可以使用 Fedora 的包管理器 `dnf` 来安装它:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo dnf install python3-ipdb
|
$ sudo dnf install python3-ipdb
|
||||||
@ -259,7 +257,7 @@ pdb++重写了pdb模块,因此你可以使用相同的语法在程序中添加
|
|||||||
import pdb; pdb.set_trace()
|
import pdb; pdb.set_trace()
|
||||||
```
|
```
|
||||||
|
|
||||||
### Conclusion
|
### 总结
|
||||||
|
|
||||||
学习如何使用 Python 调试器可以节省你在排查应用程序问题时的时间。 对于了解应用程序或某些库的复杂部分如何工作也是有用的,从而提高 Python 开发人员的技能。
|
学习如何使用 Python 调试器可以节省你在排查应用程序问题时的时间。 对于了解应用程序或某些库的复杂部分如何工作也是有用的,从而提高 Python 开发人员的技能。
|
||||||
|
|
||||||
@ -270,7 +268,7 @@ via: https://fedoramagazine.org/getting-started-python-debugger/
|
|||||||
作者:[Clément Verna][a]
|
作者:[Clément Verna][a]
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
译者:[Flowsnow](https://github.com/Flowsnow)
|
译者:[Flowsnow](https://github.com/Flowsnow)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -6,27 +6,25 @@
|
|||||||
|
|
||||||
如果你想知道大家对某件事情的看法,Twitter 是最好的地方了。Twitter 是观点持续不断的涌现出来的地方,每秒钟大概有 6000 条新 Twitter 发送出来。因特网上的发展很快,如果你想与时俱进或者跟上潮流,Twitter 就是你要去的地方。
|
如果你想知道大家对某件事情的看法,Twitter 是最好的地方了。Twitter 是观点持续不断的涌现出来的地方,每秒钟大概有 6000 条新 Twitter 发送出来。因特网上的发展很快,如果你想与时俱进或者跟上潮流,Twitter 就是你要去的地方。
|
||||||
|
|
||||||
现在,我们生活在一个数据为王的时代,很多公司都善于运用 Twitter 上的数据。根据测量到的他们新产品的人气,尝试预测之后的市场趋势,分析 Twitter 上的数据有很多用处。通过数据,商人把产品卖给合适的用户,收集关于他们品牌和改进的反馈,或者获取他们产品或促销活动失败的原因。不仅仅是商人,很多政治和经济上的决定是在观察人们意见的基础上所作的。今天,我会试着让你感受下关于 Twitter 的简单 [情感分析][1],判断这个 Twitter 是正能量,负能量还是中性的。这不会像专业人士所用的那么复杂,但至少,它会让你知道挖掘观念的想法。
|
现在,我们生活在一个数据为王的时代,很多公司都善于运用 Twitter 上的数据。根据测量到的他们新产品的人气,尝试预测之后的市场趋势,分析 Twitter 上的数据有很多用处。通过数据,商人把产品卖给合适的用户,收集关于他们品牌和改进的反馈,或者获取他们产品或促销活动失败的原因。不仅仅是商人,很多政治和经济上的决定是在观察人们意见的基础上所作的。今天,我会试着让你感受下关于 Twitter 的简单 [情感分析][1],判断这个 Twitter 是正能量、负能量还是中性的。这不会像专业人士所用的那么复杂,但至少,它会让你知道挖掘观念的想法。
|
||||||
|
|
||||||
我们将使用 NodeJs,因为 JavaScript 太常用了,而且它还是最容易入门的语言。
|
我们将使用 NodeJs,因为 JavaScript 太常用了,而且它还是最容易入门的语言。
|
||||||
|
|
||||||
### 前置条件:
|
### 前置条件:
|
||||||
|
|
||||||
* 安装了 NodeJs 和 NPM
|
* 安装了 NodeJs 和 NPM
|
||||||
|
|
||||||
* 有 NodeJs 和 NPM 包的经验
|
* 有 NodeJs 和 NPM 包的经验
|
||||||
|
|
||||||
* 熟悉命令行。
|
* 熟悉命令行。
|
||||||
|
|
||||||
好了,就是这样。开始吧
|
好了,就是这样。开始吧。
|
||||||
|
|
||||||
### 开始
|
### 开始
|
||||||
|
|
||||||
为了你的项目新建一个目录,进入这个目录下面。打开终端(或是命令行)。进入刚创建的目录下面,运行命令 `npm init -y`。这会在这个目录下创建一个 `package.json` 文件。现在我们可以安装需要的 npm 包了。只需要创建一个新文件,命名为 `index.js` 然后我们就完成了初始的编码。
|
为了你的项目新建一个目录,进入这个目录下面。打开终端(或是命令行)。进入刚创建的目录下面,运行命令 `npm init -y`。这会在这个目录下创建一个 `package.json` 文件。现在我们可以安装需要的 npm 包了。只需要创建一个新文件,命名为 `index.js` 然后我们就完成了初始的编码。
|
||||||
|
|
||||||
### 获取 tweets
|
### 获取推文
|
||||||
|
|
||||||
好了,我们想要分析 Twitter ,为了实现这个目的,我们需要获取 Twitter 的标题。为此,我们要用到 [twit][2] 包。因此,先用 `npm i wit` 命令安装它。我们还需要在 APP 上注册账户,用来访问 Twitter 的 API。点击这个 [链接][3],填写所有项目,从 “Keys and Access Token” 标签页中复制 “Consumer Key”,“Consumer Secret”,“Access token” 和 “Access Token Secret” 这几项到 `.env` 文件中,就像这样:
|
好了,我们想要分析 Twitter ,为了实现这个目的,我们需要以编程的方式访问 Twitter。为此,我们要用到 [twit][2] 包。因此,先用 `npm i wit` 命令安装它。我们还需要注册一个 App,以通过我们的账户来访问 Twitter 的 API。点击这个 [链接][3],填写所有项目,从 “Keys and Access Token” 标签页中复制 “Consumer Key”、“Consumer Secret”、“Access token” 和 “Access Token Secret” 这几项到一个 `.env` 文件中,就像这样:
|
||||||
|
|
||||||
```
|
```
|
||||||
# .env
|
# .env
|
||||||
@ -35,7 +33,6 @@ CONSUMER_KEY=************
|
|||||||
CONSUMER_SECRET=************
|
CONSUMER_SECRET=************
|
||||||
ACCESS_TOKEN=************
|
ACCESS_TOKEN=************
|
||||||
ACCESS_TOKEN_SECRET=************
|
ACCESS_TOKEN_SECRET=************
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
现在开始。
|
现在开始。
|
||||||
@ -63,22 +60,20 @@ const config_twitter = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let api = new Twit(config_twitter);
|
let api = new Twit(config_twitter);
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
这里已经用所需的配置文件建立了到 Twitter 上的连接。但我们什么事情都没做。先定义个获取 Twitter 的函数:
|
这里已经用所需的配置文件建立了到 Twitter 上的连接。但我们什么事情都没做。先定义个获取推文的函数:
|
||||||
|
|
||||||
```
|
```
|
||||||
async function get_tweets(q, count) {
|
async function get_tweets(q, count) {
|
||||||
let tweets = await api.get('search/tweets', {q, count, tweet_mode: 'extended'});
|
let tweets = await api.get('search/tweets', {q, count, tweet_mode: 'extended'});
|
||||||
return tweets.data.statuses.map(tweet => tweet.full_text);
|
return tweets.data.statuses.map(tweet => tweet.full_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
这是个 async 函数,因为 `api.get` 函数返回一个 promise 对象,而不是 `then` 链,我想通过这种简单的方式获取推文。它接收两个参数 -q 和 count,`q` 是查询或者我们想要搜索的关键字,`count` 是让这个 `api` 返回的 Twitter 数量。
|
这是个 async 函数,因为 `api.get` 函数返回一个 promise 对象,而不是 `then` 链,我想通过这种简单的方式获取推文。它接收两个参数 `q` 和 `count`,`q` 是查询或者我们想要搜索的关键字,`count` 是让这个 `api` 返回的推文数量。
|
||||||
|
|
||||||
目前为止我们拥有了一个从 Twitter 上获取完整文本的简单方法,我们要获取的文本中可能包含某些连接或者原推文可能已经被删除了。所以我们会编写另一个函数,获取并返回即便是转发的 Twitter 的文本,,并且删除其中存在的链接。
|
目前为止我们拥有了一个从 Twitter 上获取完整文本的简单方法。不过这里有个问题,现在我们要获取的文本中可能包含某些连接或者由于转推而被截断了。所以我们会编写另一个函数,拆解并返回推文的文本,即便是转发的推文,并且其中有链接的话就删除。
|
||||||
|
|
||||||
```
|
```
|
||||||
function get_text(tweet) {
|
function get_text(tweet) {
|
||||||
@ -90,21 +85,18 @@ async function get_tweets(q, count) {
|
|||||||
let tweets = await api.get('search/tweets', {q, count, 'tweet_mode': 'extended'});
|
let tweets = await api.get('search/tweets', {q, count, 'tweet_mode': 'extended'});
|
||||||
return tweets.data.statuses.map(get_text);
|
return tweets.data.statuses.map(get_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
现在我们拿到了文本。下一步是从文本中获取情感。为此我们会使用 `npm` 中的另一个包 —— [`sentiment`][4]。让我们像安装其他包那样安装 `sentiment`,添加到脚本中。
|
现在我们拿到了文本。下一步是从文本中获取情感。为此我们会使用 `npm` 中的另一个包 —— [`sentiment`][4]。让我们像安装其他包那样安装 `sentiment`,添加到脚本中。
|
||||||
|
|
||||||
```
|
```
|
||||||
const sentiment = require('sentiment')
|
const sentiment = require('sentiment')
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
`sentiment` 用起来很简单。我们只用把 `sentiment` 函数用在我们想要分析的文本上,它就能返回文本的相对分数。如果分数小于 0,它表达的就是消极情感,大于 0 的分数是积极情感,而 0,如你所料,表示中性的情感。基于此,我们将会把 tweets 打印成不同的颜色 —— 绿色表示积极,红色表示消极,蓝色表示中性。为此,我们会用到 [`colors`][5] 包。先安装这个包,然后添加到脚本中。
|
`sentiment` 用起来很简单。我们只用把 `sentiment` 函数用在我们想要分析的文本上,它就能返回文本的相对分数。如果分数小于 0,它表达的就是消极情感,大于 0 的分数是积极情感,而 0,如你所料,表示中性的情感。基于此,我们将会把推文打印成不同的颜色 —— 绿色表示积极,红色表示消极,蓝色表示中性。为此,我们会用到 [`colors`][5] 包。先安装这个包,然后添加到脚本中。
|
||||||
|
|
||||||
```
|
```
|
||||||
const colors = require('colors/safe');
|
const colors = require('colors/safe');
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
好了,现在把所有东西都整合到 `main` 函数中。
|
好了,现在把所有东西都整合到 `main` 函数中。
|
||||||
@ -127,17 +119,15 @@ async function main() {
|
|||||||
console.log(tweet);
|
console.log(tweet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
最后,执行 `main` 函数。
|
最后,执行 `main` 函数。
|
||||||
|
|
||||||
```
|
```
|
||||||
main();
|
main();
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
就是这样,一个简单的分析 tweet 中的基本情感的脚本。
|
就是这样,一个简单的分析推文中的基本情感的脚本。
|
||||||
|
|
||||||
```
|
```
|
||||||
\\ full script
|
\\ full script
|
||||||
@ -201,7 +191,7 @@ via: https://boostlog.io/@anshulc95/twitter-sentiment-analysis-using-nodejs-5ad1
|
|||||||
|
|
||||||
作者:[Anshul Chauhan][a]
|
作者:[Anshul Chauhan][a]
|
||||||
译者:[BriFuture](https://github.com/BriFuture)
|
译者:[BriFuture](https://github.com/BriFuture)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -1,92 +0,0 @@
|
|||||||
translating---geekpi
|
|
||||||
|
|
||||||
How to publish a WordPress blog to a static GitLab Pages site
|
|
||||||
======
|
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/web-design-monitor-website.png?itok=yUK7_qR0)
|
|
||||||
|
|
||||||
A long time ago, I set up a WordPress blog for a family member. There are lots of options these days, but back then there were few decent choices if you needed a web-based CMS with a WYSIWYG editor. An unfortunate side effect of things working well is that the blog has generated a lot of content over time. That means I was also regularly updating WordPress to protect against the exploits that are constantly popping up.
|
|
||||||
|
|
||||||
So I decided to convince the family member that switching to [Hugo][1] would be relatively easy, and the blog could then be hosted on [GitLab][2]. But trying to extract all that content and convert it to [Markdown][3] turned into a huge hassle. There were automated scripts that got me 95% there, but nothing worked perfectly. Manually updating all the posts was not something I wanted to do, so eventually, I gave up trying to move the blog.
|
|
||||||
|
|
||||||
Recently, I started thinking about this again and realized there was a solution I hadn't considered: I could continue maintaining the WordPress server but set it up to publish a static mirror and serve that with [GitLab Pages][4] (or [GitHub Pages][5] if you like). This would allow me to automate [Let's Encrypt][6] certificate renewals as well as eliminate the security concerns associated with hosting a WordPress site. This would, however, mean comments would stop working, but that feels like a minor loss in this case because the blog did not garner many comments.
|
|
||||||
|
|
||||||
Here's the solution I came up with, which so far seems to be working well:
|
|
||||||
|
|
||||||
* Host WordPress site at URL that is not linked to or from anywhere else to reduce the odds of it being exploited. In this example, we'll use <http://private.localconspiracy.com> (even though this site is actually built with Pelican).
|
|
||||||
* [Set up hosting on GitLab Pages][7] for the public URL <https://www.localconspiracy.com>.
|
|
||||||
* Add a [cron job][8] that determines when the last-built date differs between the two URLs; if the build dates differ, mirror the WordPress version.
|
|
||||||
* After mirroring with `wget`, update all links from "private" version to "public" version.
|
|
||||||
* Do a `git push` to publish the new content.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
These are the two scripts I use:
|
|
||||||
|
|
||||||
`check-diff.sh` (called by cron every 15 minutes)
|
|
||||||
```
|
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
ORIGINDATE="$(curl -v --silent http://private.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)"
|
|
||||||
PUBDATE="$(curl -v --silent https://www.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)"
|
|
||||||
|
|
||||||
if [ "$ORIGINDATE" != "$PUBDATE" ]
|
|
||||||
then
|
|
||||||
/home/doc/repos/localconspiracy/mirror.sh
|
|
||||||
fi
|
|
||||||
```
|
|
||||||
|
|
||||||
`mirror.sh:`
|
|
||||||
```
|
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
cd /home/doc/repos/localconspiracy
|
|
||||||
|
|
||||||
wget \
|
|
||||||
--mirror \
|
|
||||||
--convert-links \
|
|
||||||
--adjust-extension \
|
|
||||||
--page-requisites \
|
|
||||||
--retry-connrefused \
|
|
||||||
--exclude-directories=comments \
|
|
||||||
--execute robots=off \
|
|
||||||
http://private.localconspiracy.com
|
|
||||||
|
|
||||||
git rm -rf public/*
|
|
||||||
mv private.localconspiracy.com/* public/.
|
|
||||||
rmdir private.localconspiracy.com
|
|
||||||
find ./public/ -type f -exec sed -i -e 's|http://private.localconspiracy|https://www.localconspiracy|g' {} \;
|
|
||||||
find ./public/ -type f -exec sed -i -e 's|http://www.localconspiracy|https://www.localconspiracy|g' {} \;
|
|
||||||
git add public/*
|
|
||||||
git commit -m "new snapshot"
|
|
||||||
git push origin master
|
|
||||||
```
|
|
||||||
|
|
||||||
That's it! Now, when the blog is changed, within 15 minutes the site is mirrored to a static version and pushed up to the repo where it will be reflected in GitLab pages.
|
|
||||||
|
|
||||||
This concept could be extended a little further if you wanted to [run WordPress locally][9]. In that case, you would not need a server to host your WordPress blog; you could just run it on your local machine. In that scenario, there's no chance of your blog getting exploited. As long as you can run `wget` against it locally, you could use the approach outlined above to have a WordPress site hosted on GitLab Pages.
|
|
||||||
|
|
||||||
_This article was originally posted at[Local Conspiracy][10]. Reposted with permission._
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
via: https://opensource.com/article/18/8/publish-wordpress-static-gitlab-pages-site
|
|
||||||
|
|
||||||
作者:[Christopher Aedo][a]
|
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
|
||||||
译者:[译者ID](https://github.com/译者ID)
|
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|
||||||
|
|
||||||
[a]:https://opensource.com/users/docaedo
|
|
||||||
[1]:https://gohugo.io/
|
|
||||||
[2]:https://gitlab.com/
|
|
||||||
[3]:https://en.wikipedia.org/wiki/Markdown
|
|
||||||
[4]:https://docs.gitlab.com/ee/user/project/pages/
|
|
||||||
[5]:https://pages.github.com/
|
|
||||||
[6]:https://letsencrypt.org/
|
|
||||||
[7]:https://about.gitlab.com/2016/04/07/gitlab-pages-setup/
|
|
||||||
[8]:https://en.wikipedia.org/wiki/Cron
|
|
||||||
[9]:https://codex.wordpress.org/Installing_WordPress_Locally_on_Your_Mac_With_MAMP
|
|
||||||
[10]:https://localconspiracy.com/2018/08/wp-on-gitlab.html
|
|
@ -1,3 +1,5 @@
|
|||||||
|
translating---geekpi
|
||||||
|
|
||||||
How To Reset MySQL Or MariaDB Root Password
|
How To Reset MySQL Or MariaDB Root Password
|
||||||
======
|
======
|
||||||
|
|
||||||
|
@ -0,0 +1,90 @@
|
|||||||
|
如何将 WordPress 博客发布到静态 GitLab Pages 上
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/web-design-monitor-website.png?itok=yUK7_qR0)
|
||||||
|
|
||||||
|
很久以前,我为一个家庭成员建立了一个 WordPress 博客。现在有很多选择,但是当时如果你需要一个带有 WYSIWYG 编辑器的基于网络的 CMS,那么当时很少有不错的选择。运行良好的一个不幸的副作用是博客随着时间的推移产生了很多内容。这意味着我要经常更新 WordPress 以防止不断出现的漏洞。
|
||||||
|
|
||||||
|
因此,我决定劝说家人切换到 [Hugo][1] 会相对容易,然后可以在 [GitLab][2] 上托管博客。但是尝试提取所有内容并将其转换为 [Markdown][3] 变成了一个巨大的麻烦。有自动脚本完成了 95% 的工作,但并不完美。手动更新所有帖子不是我想做的事情,所以最终,我放弃了试图移动博客。
|
||||||
|
|
||||||
|
最近,我又开始考虑这个问题,并意识到有一个我没有考虑过的解决方案:我可以继续维护 WordPress 服务器,但将其设置为发布静态镜像,并使用 [GitLab Pages][4](或 [ GitHub Pages][5] ,如果你喜欢的话)服务。这能让我自动化 [Let's Encrypt][6] 证书续订并消除与托管 WordPress 站点相关的安全问题。然而,这意味着评论将无法使用,但在这种情况下感觉就像是一个小损失,因为博客没有收到很多评论。
|
||||||
|
|
||||||
|
这是我提出的解决方案,到目前为止似乎运作良好:
|
||||||
|
|
||||||
|
* WordPress 站点中的 URL 没有链接到或来自其他任何地方,以减少它被利用的几率。在此例中,我们将使用 <http://private.localconspiracy.com>(即使此站点实际上是使用 Pelican 构建的)。
|
||||||
|
* 为公共 URL <https://www.localconspiracy.com> [在 GitLab Pages 上设置托管][7]。
|
||||||
|
* 添加 [cron job][8],确定两个 URL 之间的最后构建日期何时不同。如果构建日期不同,则镜像 WordPress 版本。
|
||||||
|
* 使用 `wget` 镜像后,将所有链接从“私有”更新成“公共”。
|
||||||
|
* 运行 `git push` 来发布新内容。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
这是我使用的两个脚本:
|
||||||
|
|
||||||
|
`check-diff.sh` (cron 每 15 分钟调用一次)
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ORIGINDATE="$(curl -v --silent http://private.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)"
|
||||||
|
PUBDATE="$(curl -v --silent https://www.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)"
|
||||||
|
|
||||||
|
if [ "$ORIGINDATE" != "$PUBDATE" ]
|
||||||
|
then
|
||||||
|
/home/doc/repos/localconspiracy/mirror.sh
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
`mirror.sh:`
|
||||||
|
```
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
cd /home/doc/repos/localconspiracy
|
||||||
|
|
||||||
|
wget \
|
||||||
|
--mirror \
|
||||||
|
--convert-links \
|
||||||
|
--adjust-extension \
|
||||||
|
--page-requisites \
|
||||||
|
--retry-connrefused \
|
||||||
|
--exclude-directories=comments \
|
||||||
|
--execute robots=off \
|
||||||
|
http://private.localconspiracy.com
|
||||||
|
|
||||||
|
git rm -rf public/*
|
||||||
|
mv private.localconspiracy.com/* public/.
|
||||||
|
rmdir private.localconspiracy.com
|
||||||
|
find ./public/ -type f -exec sed -i -e 's|http://private.localconspiracy|https://www.localconspiracy|g' {} \;
|
||||||
|
find ./public/ -type f -exec sed -i -e 's|http://www.localconspiracy|https://www.localconspiracy|g' {} \;
|
||||||
|
git add public/*
|
||||||
|
git commit -m "new snapshot"
|
||||||
|
git push origin master
|
||||||
|
```
|
||||||
|
|
||||||
|
就是这些了!现在,当博客发生变化时,在 15 分钟内将网站镜像到静态版本并推送到仓库,这将在 GitLab Pages 中反映出来。
|
||||||
|
|
||||||
|
如果你想[在本地运行 WordPress][9],这个概念可以进一步扩展。在这种情况下,你不需要服务器来托管你的 WordPress 博客。你可以在本机运行它。在这种情况下,你的博客不可能被利用。只要你可以在本地运行 `wget`,就可以使用上面的方法在 GitLab Pages 上托管 WordPress 站点。
|
||||||
|
|
||||||
|
_这篇文章最初发表于 [Local Conspiracy] [10]。允许转载。_
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/18/8/publish-wordpress-static-gitlab-pages-site
|
||||||
|
|
||||||
|
作者:[Christopher Aedo][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[译者ID](https://github.com/译者ID)
|
||||||
|
校对:[校对者ID](https://github.com/校对者ID)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]:https://opensource.com/users/docaedo
|
||||||
|
[1]:https://gohugo.io/
|
||||||
|
[2]:https://gitlab.com/
|
||||||
|
[3]:https://en.wikipedia.org/wiki/Markdown
|
||||||
|
[4]:https://docs.gitlab.com/ee/user/project/pages/
|
||||||
|
[5]:https://pages.github.com/
|
||||||
|
[6]:https://letsencrypt.org/
|
||||||
|
[7]:https://about.gitlab.com/2016/04/07/gitlab-pages-setup/
|
||||||
|
[8]:https://en.wikipedia.org/wiki/Cron
|
||||||
|
[9]:https://codex.wordpress.org/Installing_WordPress_Locally_on_Your_Mac_With_MAMP
|
||||||
|
[10]:https://localconspiracy.com/2018/08/wp-on-gitlab.html
|
Loading…
Reference in New Issue
Block a user