diff --git a/published/20200707 Use systemd timers instead of cronjobs.md b/published/20200707 Use systemd timers instead of cronjobs.md
new file mode 100644
index 0000000000..81e4553369
--- /dev/null
+++ b/published/20200707 Use systemd timers instead of cronjobs.md
@@ -0,0 +1,529 @@
+[#]: collector: (lujun9972)
+[#]: translator: (tt67wq)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13307-1.html)
+[#]: subject: (Use systemd timers instead of cronjobs)
+[#]: via: (https://opensource.com/article/20/7/systemd-timers)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+使用 systemd 定时器代替 cron 作业
+======
+
+> 定时器提供了比 cron 作业更为细粒度的事件控制。
+
+
+
+我正在致力于将我的 [cron][2] 作业迁移到 systemd 定时器上。我已经使用定时器多年了,但通常来说,我的学识只足以支撑我当前的工作。但在我研究 [systemd 系列][3] 的过程中,我发现 systemd 定时器有一些非常有意思的能力。
+
+与 cron 作业类似,systemd 定时器可以在特定的时间间隔触发事件(shell 脚本和程序),例如每天一次或在一个月中的特定某一天(或许只有在周一生效),或在从上午 8 点到下午 6 点的工作时间内每隔 15 分钟一次。定时器也可以做到 cron 作业无法做到的一些事情。举个例子,定时器可以在特定事件发生后的一段时间后触发一段脚本或者程序去执行,例如开机、启动、上个任务完成,甚至于定时器调用的上个服务单元的完成的时刻。
+
+### 操作系统维护的计时器
+
+当在一个新系统上安装 Fedora 或者是任意一个基于 systemd 的发行版时,作为系统维护过程的一部分,它会在 Linux 宿主机的后台中创建多个定时器。这些定时器会触发事件来执行必要的日常维护任务,比如更新系统数据库、清理临时目录、轮换日志文件,以及更多其他事件。
+
+作为示例,我会查看一些我的主要工作站上的定时器,通过执行 `systemctl status *timer` 命令来展示主机上的所有定时器。星号的作用与文件通配相同,所以这个命令会列出所有的 systemd 定时器单元。
+
+```
+[root@testvm1 ~]# systemctl status *timer
+● mlocate-updatedb.timer - Updates mlocate database every day
+ Loaded: loaded (/usr/lib/systemd/system/mlocate-updatedb.timer; enabled; vendor preset: enabled)
+ Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
+ Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
+ Triggers: ● mlocate-updatedb.service
+
+Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Updates mlocate database every day.
+
+● logrotate.timer - Daily rotation of log files
+ Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
+ Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
+ Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
+ Triggers: ● logrotate.service
+ Docs: man:logrotate(8)
+ man:logrotate.conf(5)
+
+Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily rotation of log files.
+
+● sysstat-summary.timer - Generate summary of yesterday's process accounting
+ Loaded: loaded (/usr/lib/systemd/system/sysstat-summary.timer; enabled; vendor preset: enabled)
+ Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
+ Trigger: Fri 2020-06-05 00:07:00 EDT; 15h left
+ Triggers: ● sysstat-summary.service
+
+Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Generate summary of yesterday's process accounting.
+
+● fstrim.timer - Discard unused blocks once a week
+ Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
+ Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
+ Trigger: Mon 2020-06-08 00:00:00 EDT; 3 days left
+ Triggers: ● fstrim.service
+ Docs: man:fstrim
+
+Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Discard unused blocks once a week.
+
+● sysstat-collect.timer - Run system activity accounting tool every 10 minutes
+ Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: enabled)
+ Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
+ Trigger: Thu 2020-06-04 08:50:00 EDT; 41s left
+ Triggers: ● sysstat-collect.service
+
+Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Run system activity accounting tool every 10 minutes.
+
+● dnf-makecache.timer - dnf makecache --timer
+ Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; vendor preset: enabled)
+ Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
+ Trigger: Thu 2020-06-04 08:51:00 EDT; 1min 41s left
+ Triggers: ● dnf-makecache.service
+
+Jun 02 08:02:33 testvm1.both.org systemd[1]: Started dnf makecache –timer.
+
+● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
+ Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
+ Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
+ Trigger: Fri 2020-06-05 08:19:00 EDT; 23h left
+ Triggers: ● systemd-tmpfiles-clean.service
+ Docs: man:tmpfiles.d(5)
+ man:systemd-tmpfiles(8)
+
+Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily Cleanup of Temporary Directories.
+```
+
+每个定时器至少有六行相关信息:
+
+ * 定时器的第一行有定时器名字和定时器目的的简短介绍
+ * 第二行展示了定时器的状态,是否已加载,定时器单元文件的完整路径以及预设信息。
+ * 第三行指明了其活动状态,包括该定时器激活的日期和时间。
+ * 第四行包括了该定时器下次被触发的日期和时间和距离触发的大概时间。
+ * 第五行展示了被定时器触发的事件或服务名称。
+ * 部分(不是全部)systemd 单元文件有相关文档的指引。我虚拟机上输出中有三个定时器有文档指引。这是一个很好(但非必要)的信息。
+ * 最后一行是计时器最近触发的服务实例的日志条目。
+
+你也许有一些不一样的定时器,取决于你的主机。
+
+### 创建一个定时器
+
+尽管我们可以解构一个或多个现有的计时器来了解其工作原理,但让我们创建我们自己的 [服务单元][4] 和一个定时器去触发它。为了保持简单,我们将使用一个相当简单的例子。当我们完成这个实验之后,就能更容易理解其他定时器的工作原理以及发现它们正在做什么。
+
+首先,创建一个运行基础东西的简单的服务,例如 `free` 命令。举个例子,你可能想定时监控空余内存。在 `/etc/systemd/system` 目录下创建如下的 `myMonitor.server` 单元文件。它不需要是可执行文件:
+
+```
+# This service unit is for testing timer units
+# By David Both
+# Licensed under GPL V2
+#
+
+[Unit]
+Description=Logs system statistics to the systemd journal
+Wants=myMonitor.timer
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/free
+
+[Install]
+WantedBy=multi-user.target
+```
+
+这大概是你能创建的最简单的服务单元了。现在我们查看一下服务状态同时测试一下服务单元确保它和我们预期一样可用。
+
+
+```
+[root@testvm1 system]# systemctl status myMonitor.service
+● myMonitor.service - Logs system statistics to the systemd journal
+ Loaded: loaded (/etc/systemd/system/myMonitor.service; disabled; vendor preset: disabled)
+ Active: inactive (dead)
+[root@testvm1 system]# systemctl start myMonitor.service
+[root@testvm1 system]#
+```
+
+输出在哪里呢?默认情况下,systemd 服务单元执行程序的标准输出(`STDOUT`)会被发送到系统日志中,它保留了记录供现在或者之后(直到某个时间点)查看。(在本系列的后续文章中,我将介绍系统日志的记录和保留策略)。专门查看你的服务单元的日志,而且只针对今天。`-S` 选项,即 `--since` 的缩写,允许你指定 `journalctl` 工具搜索条目的时间段。这并不代表你不关心过往结果 —— 在这个案例中,不会有过往记录 —— 如果你的机器以及运行了很长时间且堆积了大量的日志,它可以缩短搜索时间。
+
+```
+[root@testvm1 system]# journalctl -S today -u myMonitor.service
+-- Logs begin at Mon 2020-06-08 07:47:20 EDT, end at Thu 2020-06-11 09:40:47 EDT. --
+Jun 11 09:12:09 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
+Jun 11 09:12:09 testvm1.both.org free[377966]: total used free shared buff/cache available
+Jun 11 09:12:09 testvm1.both.org free[377966]: Mem: 12635740 522868 11032860 8016 1080012 11821508
+Jun 11 09:12:09 testvm1.both.org free[377966]: Swap: 8388604 0 8388604
+Jun 11 09:12:09 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
+[root@testvm1 system]#
+```
+
+由服务触发的任务可以是单个程序、一组程序或者是一个脚本语言写的脚本。通过在 `myMonitor.service` 单元文件里的 `[Service]` 块末尾中添加如下行可以为服务添加另一个任务:
+
+```
+ExecStart=/usr/bin/lsblk
+```
+
+再次启动服务,查看日志检查结果,结果应该看上去像这样。你应该在日志中看到两条命令的结果输出:
+
+```
+Jun 11 15:42:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
+Jun 11 15:42:18 testvm1.both.org free[379961]: total used free shared buff/cache available
+Jun 11 15:42:18 testvm1.both.org free[379961]: Mem: 12635740 531788 11019540 8024 1084412 11812272
+Jun 11 15:42:18 testvm1.both.org free[379961]: Swap: 8388604 0 8388604
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sda 8:0 0 120G 0 disk
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─sda1 8:1 0 4G 0 part /boot
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─sda2 8:2 0 116G 0 part
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-root 253:0 0 5G 0 lvm /
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-var 253:4 0 20G 0 lvm /var
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─VG01-home 253:5 0 10G 0 lvm /home
+Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sr0 11:0 1 1024M 0 rom
+Jun 11 15:42:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
+Jun 11 15:42:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
+```
+
+现在你知道了你的服务可以按预期工作了,在 `/etc/systemd/system` 目录下创建 `myMonitor.timer` 定时器单元文件,添加如下代码:
+
+```
+# This timer unit is for testing
+# By David Both
+# Licensed under GPL V2
+#
+
+[Unit]
+Description=Logs some system statistics to the systemd journal
+Requires=myMonitor.service
+
+[Timer]
+Unit=myMonitor.service
+OnCalendar=*-*-* *:*:00
+
+[Install]
+WantedBy=timers.target
+```
+
+在 `myMonitor.timer` 文件中的 `OnCalendar` 时间格式,`*-*-* *:*:00`,应该会每分钟触发一次定时器去执行 `myMonitor.service` 单元。我会在文章的后面进一步探索 `OnCalendar` 设置。
+
+到目前为止,在服务被计时器触发运行时观察与之有关的日志记录。你也可以跟踪计时器,跟踪服务可以让你接近实时的看到结果。执行 `journalctl` 时带上 `-f` 选项:
+
+```
+[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
+-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --
+```
+
+执行但是不启用该定时器,看看它运行一段时间后发生了什么:
+
+```
+[root@testvm1 ~]# systemctl start myMonitor.service
+[root@testvm1 ~]#
+```
+
+一条结果立即就显示出来了,下一条大概在一分钟后出来。观察几分钟日志,看看你有没有跟我发现同样的事情:
+
+```
+[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
+-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --
+Jun 13 08:39:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
+Jun 13 08:39:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
+Jun 13 08:39:19 testvm1.both.org free[630566]: total used free shared buff/cache available
+Jun 13 08:39:19 testvm1.both.org free[630566]: Mem: 12635740 556604 10965516 8036 1113620 11785628
+Jun 13 08:39:19 testvm1.both.org free[630566]: Swap: 8388604 0 8388604
+Jun 13 08:39:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sda 8:0 0 120G 0 disk
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─sda1 8:1 0 4G 0 part /boot
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─sda2 8:2 0 116G 0 part
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-root 253:0 0 5G 0 lvm /
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-var 253:4 0 20G 0 lvm /var
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─VG01-home 253:5 0 10G 0 lvm /home
+Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sr0 11:0 1 1024M 0 rom
+Jun 13 08:40:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
+Jun 13 08:40:46 testvm1.both.org free[630572]: total used free shared buff/cache available
+Jun 13 08:40:46 testvm1.both.org free[630572]: Mem: 12635740 555228 10966836 8036 1113676 11786996
+Jun 13 08:40:46 testvm1.both.org free[630572]: Swap: 8388604 0 8388604
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sda 8:0 0 120G 0 disk
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─sda1 8:1 0 4G 0 part /boot
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─sda2 8:2 0 116G 0 part
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-root 253:0 0 5G 0 lvm /
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-var 253:4 0 20G 0 lvm /var
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─VG01-home 253:5 0 10G 0 lvm /home
+Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sr0 11:0 1 1024M 0 rom
+Jun 13 08:40:46 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
+Jun 13 08:40:46 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
+Jun 13 08:41:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
+Jun 13 08:41:46 testvm1.both.org free[630580]: total used free shared buff/cache available
+Jun 13 08:41:46 testvm1.both.org free[630580]: Mem: 12635740 553488 10968564 8036 1113688 11788744
+Jun 13 08:41:46 testvm1.both.org free[630580]: Swap: 8388604 0 8388604
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sda 8:0 0 120G 0 disk
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─sda1 8:1 0 4G 0 part /boot
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─sda2 8:2 0 116G 0 part
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-root 253:0 0 5G 0 lvm /
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-var 253:4 0 20G 0 lvm /var
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─VG01-home 253:5 0 10G 0 lvm /home
+Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sr0 11:0 1 1024M 0 rom
+Jun 13 08:41:47 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
+Jun 13 08:41:47 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
+```
+
+别忘了检查下计时器和服务的状态。
+
+你在日志里大概至少注意到两件事。第一,你不需要特地做什么来让 `myMonitor.service` 单元中 `ExecStart` 触发器产生的 `STDOUT` 存储到日志里。这都是用 systemd 来运行服务的一部分功能。然而,它确实意味着你需要小心对待服务单元里面执行的脚本和它们能产生多少 `STDOUT`。
+
+第二,定时器并不是精确在每分钟的 :00 秒执行的,甚至每次执行的时间间隔都不是刚好一分钟。这是特意的设计,但是有必要的话可以改变这种行为(如果只是它挑战了你的系统管理员的敏感神经)。
+
+这样设计的初衷是为了防止多个服务在完全相同的时刻被触发。举个例子,你可以用例如 Weekly,Daily 等时间格式。这些快捷写法都被定义为在某一天的 00:00:00 执行。当多个定时器都这样定义的话,有很大可能它们会同时执行。
+
+systemd 定时器被故意设计成在规定时间附近随机波动的时间点触发,以避免同一时间触发。它们在一个时间窗口内半随机触发,时间窗口开始于预设的触发时间,结束于预设时间后一分钟。根据 `systemd.timer` 的手册页,这个触发时间相对于其他已经定义的定时器单元保持在稳定的位置。你可以在日志条目中看到,定时器在启动后立即触发,然后在每分钟后的 46 或 47 秒触发。
+
+大部分情况下,这种概率抖动的定时器是没事的。当调度类似执行备份的任务,只需要它们在下班时间运行,这样是没问题的。系统管理员可以选择确定的开始时间来确保不和其他任务冲突,例如 01:05:00 这样典型的 cron 作业时间,但是有很大范围的时间值可以满足这一点。在开始时间上的一个分钟级别的随机往往是无关紧要的。
+
+然而,对某些任务来说,精确的触发时间是个硬性要求。对于这类任务,你可以向单元文件的 `Timer` 块中添加如下声明来指定更高的触发时间跨度精确度(精确到微秒以内):
+
+```
+AccuracySec=1us
+```
+
+时间跨度可用于指定所需的精度,以及定义重复事件或一次性事件的时间跨度。它能识别以下单位:
+
+ * `usec`、`us`、`µs`
+ * `msec`、`ms`
+ * `seconds`、`second`、`sec`、`s`
+ * `minutes`、`minute`、`min`、`m`
+ * `hours`、`hour`、`hr`、`h`
+ * `days`、`day`、`d`
+ * `weeks`、`week`、`w`
+ * `months`、`month`、`M`(定义为 30.44 天)
+ * `years`、`year`、`y`(定义为 365.25 天)
+
+所有 `/usr/lib/systemd/system` 中的定时器都指定了一个更宽松的时间精度,因为精准时间没那么重要。看看这些系统创建的定时器的时间格式:
+
+```
+[root@testvm1 system]# grep Accur /usr/lib/systemd/system/*timer
+/usr/lib/systemd/system/fstrim.timer:AccuracySec=1h
+/usr/lib/systemd/system/logrotate.timer:AccuracySec=1h
+/usr/lib/systemd/system/logwatch.timer:AccuracySec=12h
+/usr/lib/systemd/system/mlocate-updatedb.timer:AccuracySec=24h
+/usr/lib/systemd/system/raid-check.timer:AccuracySec=24h
+/usr/lib/systemd/system/unbound-anchor.timer:AccuracySec=24h
+[root@testvm1 system]#
+```
+
+看下 `/usr/lib/systemd/system` 目录下部分定时器单元文件的完整内容,看看它们是如何构建的。
+
+在本实验中不必让这个定时器在启动时激活,但下面这个命令可以设置开机自启:
+
+```
+[root@testvm1 system]# systemctl enable myMonitor.timer
+```
+
+你创建的单元文件不需要是可执行的。你同样不需要启用服务,因为它是被定时器触发的。如果你需要的话,你仍然可以在命令行里手动触发该服务单元。尝试一下,然后观察日志。
+
+关于定时器精度、事件时间规格和触发事件的详细信息,请参见 systemd.timer 和 systemd.time 的手册页。
+
+### 定时器类型
+
+systemd 定时器还有一些在 cron 中找不到的功能,cron 只在确定的、重复的、具体的日期和时间触发。systemd 定时器可以被配置成根据其他 systemd 单元状态发生改变时触发。举个例子,定时器可以配置成在系统开机、启动后,或是某个确定的服务单元激活之后的一段时间被触发。这些被称为单调计时器。“单调”指的是一个持续增长的计数器或序列。这些定时器不是持久的,因为它们在每次启动后都会重置。
+
+表格 1 列出了一些单调定时器以及每个定时器的简短定义,同时有 `OnCalendar` 定时器,这些不是单调的,它们被用于指定未来有可能重复的某个确定时间。这个信息来自于 `systemd.timer` 的手册页,有一些不重要的修改。
+
+定时器 | 单调性 | 定义
+---|---|---
+`OnActiveSec=` | X | 定义了一个与定时器被激活的那一刻相关的定时器。
+`OnBootSec=` | X | 定义了一个与机器启动时间相关的计时器。
+`OnStartupSec=` | X | 定义了一个与服务管理器首次启动相关的计时器。对于系统定时器来说,这个定时器与 `OnBootSec=` 类似,因为系统服务管理器在机器启动后很短的时间后就会启动。当以在每个用户服务管理器中运行的单元进行配置时,它尤其有用,因为用户的服务管理器通常在首次登录后启动,而不是机器启动后。
+`OnUnitActiveSec=` | X | 定义了一个与将要激活的定时器上次激活时间相关的定时器。
+`OnUnitInactiveSec=` | X | 定义了一个与将要激活的定时器上次停用时间相关的定时器。
+`OnCalendar=` | | 定义了一个有日期事件表达式语法的实时(即时钟)定时器。查看 `systemd.time(7)` 的手册页获取更多与日历事件表达式相关的语法信息。除此以外,它的语义和 `OnActiveSec=` 类似。
+
+_Table 1: systemd 定时器定义_
+
+单调计时器可使用同样的简写名作为它们的时间跨度,即我们之前提到的 `AccuracySec` 表达式,但是 systemd 将这些名字统一转换成了秒。举个例子,比如你想规定某个定时器在系统启动后五天触发一次事件;它可能看起来像 `OnBootSec=5d`。如果机器启动于 `2020-06-15 09:45:27`,这个定时器会在 `2020-06-20 09:45:27` 或在这之后的一分钟内触发。
+
+### 日历事件格式
+
+日历事件格式是定时器在所需的重复时间触发的关键。我们开始看下一些 `OnCalendar` 设置一起使用的格式。
+
+与 crontab 中的格式相比,systemd 及其计时器使用的时间和日历格式风格不同。它比 crontab 更为灵活,而且可以使用类似 `at` 命令的方式允许模糊的日期和时间。它还应该足够熟悉使其易于理解。
+
+systemd 定时器使用 `OnCalendar=` 的基础格式是 `DOW YYYY-MM-DD HH:MM:SS`。DOW(星期几)是选填的,其他字段可以用一个星号(`*`)来匹配此位置的任意值。所有的日历时间格式会被转换成标准格式。如果时间没有指定,它会被设置为 `00:00:00`。如果日期没有指定但是时间指定了,那么下次匹配的时间可能是今天或者明天,取决于当前的时间。月份和星期可以使用名称或数字。每个单元都可以使用逗号分隔的列表。单元范围可以在开始值和结束值之间用 `..` 指定。
+
+指定日期有一些有趣的选项,波浪号(`~`)可以指定月份的最后一天或者最后一天之前的某几天。`/` 可以用来指定星期几作为修饰符。
+
+这里有几个在 `OnCalendar` 表达式中使用的典型时间格式例子。
+
+日期事件格式 | 描述
+---|---
+`DOW YYYY-MM-DD HH:MM:SS` |
+`*-*-* 00:15:30` | 每年每月每天的 0 点 15 分 30 秒
+`Weekly` | 每个周一的 00:00:00
+`Mon *-*-* 00:00:00` | 同上
+`Mon` | 同上
+`Wed 2020-*-*` | 2020 年每个周三的 00:00:00
+`Mon..Fri 2021-*-*` | 2021 年的每个工作日(周一到周五)的 00:00:00
+`2022-6,7,8-1,15 01:15:00` | 2022 年 6、7、8 月的 1 到 15 号的 01:15:00
+`Mon *-05~03` | 每年五月份的下个周一同时也是月末的倒数第三天
+`Mon..Fri *-08~04` | 任何年份 8 月末的倒数第四天,同时也须是工作日
+`*-05~03/2` | 五月末的倒数第三天,然后 2 天后再来一次。每年重复一次。注意这个表达式使用了波浪号(`~`)。
+`*-05-03/2` | 五月的第三天,然后每两天重复一次直到 5 月底。注意这个表达式使用了破折号(`-`)。
+
+_Table 2: `OnCalendar` 事件时间格式例子_
+
+
+### 测试日历格式
+
+systemd 提供了一个绝佳的工具用于检测和测试定时器中日历时间事件的格式。`systemd-analyze calendar` 工具解析一个时间事件格式,提供标准格式和其他有趣的信息,例如下次“经过”(即匹配)的日期和时间,以及距离下次触发之前大概时间。
+
+首先,看看未来没有时间的日(注意 `Next elapse` 和 `UTC` 的时间会根据你当地时区改变):
+
+```
+[student@studentvm1 ~]$ systemd-analyze calendar 2030-06-17
+ Original form: 2030-06-17
+Normalized form: 2030-06-17 00:00:00
+ Next elapse: Mon 2030-06-17 00:00:00 EDT
+ (in UTC): Mon 2030-06-17 04:00:00 UTC
+ From now: 10 years 0 months left
+[root@testvm1 system]#
+```
+
+现在添加一个时间,在这个例子中,日期和时间是当作无关的部分分开解析的:
+
+```
+[root@testvm1 system]# systemd-analyze calendar 2030-06-17 15:21:16
+ Original form: 2030-06-17
+Normalized form: 2030-06-17 00:00:00
+ Next elapse: Mon 2030-06-17 00:00:00 EDT
+ (in UTC): Mon 2030-06-17 04:00:00 UTC
+ From now: 10 years 0 months left
+
+ Original form: 15:21:16
+Normalized form: *-*-* 15:21:16
+ Next elapse: Mon 2020-06-15 15:21:16 EDT
+ (in UTC): Mon 2020-06-15 19:21:16 UTC
+ From now: 3h 55min left
+[root@testvm1 system]#
+```
+
+为了把日期和时间当作一个单元来分析,可以把它们包在引号里。你在定时器单元里 `OnCalendar=` 时间格式中使用的时候记得把引号去掉,否则会报错:
+
+```
+[root@testvm1 system]# systemd-analyze calendar "2030-06-17 15:21:16"
+Normalized form: 2030-06-17 15:21:16
+ Next elapse: Mon 2030-06-17 15:21:16 EDT
+ (in UTC): Mon 2030-06-17 19:21:16 UTC
+ From now: 10 years 0 months left
+[root@testvm1 system]#
+```
+
+现在我们测试下 Table2 里的例子。我尤其喜欢最后一个:
+
+```
+[root@testvm1 system]# systemd-analyze calendar "2022-6,7,8-1,15 01:15:00"
+ Original form: 2022-6,7,8-1,15 01:15:00
+Normalized form: 2022-06,07,08-01,15 01:15:00
+ Next elapse: Wed 2022-06-01 01:15:00 EDT
+ (in UTC): Wed 2022-06-01 05:15:00 UTC
+ From now: 1 years 11 months left
+[root@testvm1 system]#
+```
+
+让我们看一个例子,这个例子里我们列出了时间表达式的五个经过时间。
+
+```
+[root@testvm1 ~]# systemd-analyze calendar --iterations=5 "Mon *-05~3"
+ Original form: Mon *-05~3
+Normalized form: Mon *-05~03 00:00:00
+ Next elapse: Mon 2023-05-29 00:00:00 EDT
+ (in UTC): Mon 2023-05-29 04:00:00 UTC
+ From now: 2 years 11 months left
+ Iter. #2: Mon 2028-05-29 00:00:00 EDT
+ (in UTC): Mon 2028-05-29 04:00:00 UTC
+ From now: 7 years 11 months left
+ Iter. #3: Mon 2034-05-29 00:00:00 EDT
+ (in UTC): Mon 2034-05-29 04:00:00 UTC
+ From now: 13 years 11 months left
+ Iter. #4: Mon 2045-05-29 00:00:00 EDT
+ (in UTC): Mon 2045-05-29 04:00:00 UTC
+ From now: 24 years 11 months left
+ Iter. #5: Mon 2051-05-29 00:00:00 EDT
+ (in UTC): Mon 2051-05-29 04:00:00 UTC
+ From now: 30 years 11 months left
+[root@testvm1 ~]#
+```
+
+这些应该为你提供了足够的信息去开始测试你的 `OnCalendar` 时间格式。`systemd-analyze` 工具可用于其他有趣的分析,我会在这个系列的下一篇文章来探索这些。
+
+### 总结
+
+systemd 定时器可以用于执行和 cron 工具相同的任务,但是通过按照日历和单调时间格式去触发事件的方法提供了更多的灵活性。
+
+虽然你为此次实验创建的服务单元通常是由定时器调用的,你也可以随时使用 `systemctl start myMonitor.service` 命令去触发它。可以在一个定时器中编写多个维护任务的脚本;它们可以是 Bash 脚本或者其他 Linux 程序。你可以通过触发定时器来运行所有的脚本来运行服务,也可以按照需要执行单独的脚本。
+
+我会在下篇文章中更加深入的探索 systemd 时间格式的用处。
+
+我还没有看到任何迹象表明 cron 和 at 将被废弃。我希望这种情况不会发生,因为至少 `at` 在执行一次性调度任务的时候要比 systemd 定时器容易的多。
+
+### 参考资料
+
+网上有大量的关于 systemd 的参考资料,但是大部分都有点简略、晦涩甚至有误导性。除了本文中提到的资料,下列的网页提供了跟多可靠且详细的 systemd 入门信息。
+
+ * Fedora 项目有一篇切实好用的 [systemd 入门][5],它囊括了几乎所有你需要知道的关于如何使用 systemd 配置、管理和维护 Fedora 计算机的信息。
+ * Fedora 项目也有一个不错的 [备忘录][6],交叉引用了过去 SystemV 命令和 systemd 命令做对比。
+ * 关于 systemd 的技术细节和创建这个项目的原因,请查看 [Freedesktop.org][7] 上的 [systemd 描述][8]。
+ * [Linux.com][9] 的“更多 systemd 的乐趣”栏目提供了更多高级的 systemd [信息和技巧][10]。
+
+此外,还有一系列深度的技术文章,是由 systemd 的设计者和主要实现者 Lennart Poettering 为 Linux 系统管理员撰写的。这些文章写于 2010 年 4 月至 2011 年 9 月间,但它们现在和当时一样具有现实意义。关于 systemd 及其生态的许多其他好文章都是基于这些文章:
+
+ * [Rethinking PID 1][11]
+ * [systemd for Administrators,Part I][12]
+ * [systemd for Administrators,Part II][13]
+ * [systemd for Administrators,Part III][14]
+ * [systemd for Administrators,Part IV][15]
+ * [systemd for Administrators,Part V][16]
+ * [systemd for Administrators,Part VI][17]
+ * [systemd for Administrators,Part VII][18]
+ * [systemd for Administrators,Part VIII][19]
+ * [systemd for Administrators,Part IX][20]
+ * [systemd for Administrators,Part X][21]
+ * [systemd for Administrators,Part XI][22]
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/7/systemd-timers
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[tt67wq](https://github.com/tt67wq)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dboth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist)
+[2]: https://opensource.com/article/17/11/how-use-cron-linux
+[3]: https://opensource.com/users/dboth
+[4]: https://opensource.com/article/20/5/manage-startup-systemd
+[5]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html
+[6]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
+[7]: http://Freedesktop.org
+[8]: http://www.freedesktop.org/wiki/Software/systemd
+[9]: http://Linux.com
+[10]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/
+[11]: http://0pointer.de/blog/projects/systemd.html
+[12]: http://0pointer.de/blog/projects/systemd-for-admins-1.html
+[13]: http://0pointer.de/blog/projects/systemd-for-admins-2.html
+[14]: http://0pointer.de/blog/projects/systemd-for-admins-3.html
+[15]: http://0pointer.de/blog/projects/systemd-for-admins-4.html
+[16]: http://0pointer.de/blog/projects/three-levels-of-off.html
+[17]: http://0pointer.de/blog/projects/changing-roots
+[18]: http://0pointer.de/blog/projects/blame-game.html
+[19]: http://0pointer.de/blog/projects/the-new-configuration-files.html
+[20]: http://0pointer.de/blog/projects/on-etc-sysinit.html
+[21]: http://0pointer.de/blog/projects/instances.html
+[22]: http://0pointer.de/blog/projects/inetd.html
diff --git a/published/20201109 Getting started with Stratis encryption.md b/published/20201109 Getting started with Stratis encryption.md
new file mode 100644
index 0000000000..6708bdaea5
--- /dev/null
+++ b/published/20201109 Getting started with Stratis encryption.md
@@ -0,0 +1,201 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13311-1.html)
+[#]: subject: (Getting started with Stratis encryption)
+[#]: via: (https://fedoramagazine.org/getting-started-with-stratis-encryption/)
+[#]: author: (briansmith https://fedoramagazine.org/author/briansmith/)
+
+Stratis 加密入门
+======
+
+
+
+Stratis 在其 [官方网站][2] 上被描述为“_易于使用的 Linux 本地存储管理_”。请看这个 [短视频][3],快速演示基础知识。该视频是在 Red Hat Enterprise Linux 8 系统上录制的。视频中显示的概念也适用于 Fedora 中的 Stratis。
+
+Stratis 2.1 版本引入了对加密的支持。继续阅读以了解如何在 Stratis 中开始加密。
+
+### 先决条件
+
+加密需要 Stratis 2.1 或更高版本。这篇文章中的例子使用的是 Fedora 33 的预发布版本。Stratis 2.1 将用在 Fedora 33 的最终版本中。
+
+你还需要至少一个可用的块设备来创建一个加密池。下面的例子是在 KVM 虚拟机上完成的,虚拟磁盘驱动器为 5GB(`/dev/vdb`)。
+
+### 在内核密钥环中创建一个密钥
+
+Linux 内核密钥环用于存储加密密钥。关于内核密钥环的更多信息,请参考 `keyrings` 手册页(`man keyrings`)。
+
+使用 `stratis key set` 命令在内核钥匙圈中设置密钥。你必须指定从哪里读取密钥。要从标准输入中读取密钥,使用 `-capture-key` 选项。要从文件中读取密钥,使用 `-keyfile-path ` 选项。最后一个参数是一个密钥描述。它将稍后你创建加密的 Stratis 池时使用。
+
+例如,要创建一个描述为 `pool1key` 的密钥,并从标准输入中读取密钥,可以输入:
+
+```
+# stratis key set --capture-key pool1key
+Enter desired key data followed by the return key:
+```
+
+该命令提示我们输入密钥数据/密码,然后密钥就创建在内核密钥环中了。
+
+要验证密钥是否已被创建,运行 `stratis key list`:
+
+```
+# stratis key list
+Key Description
+pool1key
+```
+
+这将验证是否创建了 `pool1key`。请注意,这些密钥不是持久的。如果主机重启,在访问加密的 Stratis 池之前,需要再次提供密钥(此过程将在后面介绍)。
+
+如果你有多个加密池,它们可以有一个单独的密钥,也可以共享同一个密钥。
+
+也可以使用以下 `keyctl` 命令查看密钥:
+
+```
+# keyctl get_persistent @s
+318044983
+# keyctl show
+Session Keyring
+ 701701270 --alswrv 0 0 keyring: _ses
+ 649111286 --alswrv 0 65534 \_ keyring: _uid.0
+ 318044983 ---lswrv 0 65534 \_ keyring: _persistent.0
+1051260141 --alswrv 0 0 \_ user: stratis-1-key-pool1key
+```
+
+### 创建加密的 Stratis 池
+
+现在已经为 Stratis 创建了一个密钥,下一步是创建加密的 Stratis 池。加密池只能在创建池时进行。目前不可能对现有的池进行加密。
+
+使用 `stratis pool create` 命令创建一个池。添加 `-key-desc` 和你在上一步提供的密钥描述(`pool1key`)。这将向 Stratis 发出信号,池应该使用提供的密钥进行加密。下面的例子是在 `/dev/vdb` 上创建 Stratis 池,并将其命名为 `pool1`。确保在你的系统中指定一个空的/可用的设备。
+
+```
+# stratis pool create --key-desc pool1key pool1 /dev/vdb
+```
+
+你可以使用 `stratis pool list` 命令验证该池是否已经创建:
+
+```
+# stratis pool list
+Name Total Physical Properties
+pool1 4.98 GiB / 37.63 MiB / 4.95 GiB ~Ca, Cr
+```
+
+在上面显示的示例输出中,`~Ca` 表示禁用了缓存(`~` 否定了该属性)。`Cr` 表示启用了加密。请注意,缓存和加密是相互排斥的。这两个功能不能同时启用。
+
+接下来,创建一个文件系统。下面的例子演示了创建一个名为 `filesystem1` 的文件系统,将其挂载在 `/filesystem1` 挂载点上,并在新文件系统中创建一个测试文件:
+
+```
+# stratis filesystem create pool1 filesystem1
+# mkdir /filesystem1
+# mount /stratis/pool1/filesystem1 /filesystem1
+# cd /filesystem1
+# echo "this is a test file" > testfile
+```
+
+### 重启后访问加密池
+
+当重新启动时,你会发现 Stratis 不再显示你的加密池或它的块设备:
+
+```
+# stratis pool list
+Name Total Physical Properties
+```
+
+```
+# stratis blockdev list
+Pool Name Device Node Physical Size Tier
+```
+
+要访问加密池,首先要用之前使用的相同的密钥描述和密钥数据/口令重新创建密钥:
+
+```
+# stratis key set --capture-key pool1key
+Enter desired key data followed by the return key:
+```
+
+接下来,运行 `stratis pool unlock` 命令,并验证现在可以看到池和它的块设备:
+
+```
+# stratis pool unlock
+# stratis pool list
+Name Total Physical Properties
+pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr
+# stratis blockdev list
+Pool Name Device Node Physical Size Tier
+pool1 /dev/dm-2 4.98 GiB Data
+```
+
+接下来,挂载文件系统并验证是否可以访问之前创建的测试文件:
+
+```
+# mount /stratis/pool1/filesystem1 /filesystem1/
+# cat /filesystem1/testfile
+this is a test file
+```
+
+### 使用 systemd 单元文件在启动时自动解锁 Stratis 池
+
+可以在启动时自动解锁 Stratis 池,无需手动干预。但是,必须有一个包含密钥的文件。在某些环境下,将密钥存储在文件中可能会有安全问题。
+
+下图所示的 systemd 单元文件提供了一个简单的方法来在启动时解锁 Stratis 池并挂载文件系统。欢迎提供更好的/替代方法的反馈。你可以在文章末尾的评论区提供建议。
+
+首先用下面的命令创建你的密钥文件。确保用之前输入的相同的密钥数据/密码来代替`passphrase`。
+
+```
+# echo -n passphrase > /root/pool1key
+```
+
+确保该文件只能由 root 读取:
+
+```
+# chmod 400 /root/pool1key
+# chown root:root /root/pool1key
+```
+
+在 `/etc/systemd/system/stratis-filesystem1.service` 创建包含以下内容的 systemd 单元文件:
+
+```
+[Unit]
+Description = stratis mount pool1 filesystem1 file system
+After = stratisd.service
+
+[Service]
+ExecStartPre=sleep 2
+ExecStartPre=stratis key set --keyfile-path /root/pool1key pool1key
+ExecStartPre=stratis pool unlock
+ExecStartPre=sleep 3
+ExecStart=mount /stratis/pool1/filesystem1 /filesystem1
+RemainAfterExit=yes
+
+[Install]
+WantedBy = multi-user.target
+```
+
+接下来,启用服务,使其在启动时运行:
+
+```
+# systemctl enable stratis-filesystem1.service
+```
+
+现在重新启动并验证 Stratis 池是否已自动解锁,其文件系统是否已挂载。
+
+### 结语
+
+在今天的环境中,加密是很多人和组织的必修课。本篇文章演示了如何在 Stratis 2.1 中启用加密功能。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/getting-started-with-stratis-encryption/
+
+作者:[briansmith][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/briansmith/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/stratis-encryption-2-816x345.jpg
+[2]: https://stratis-storage.github.io/
+[3]: https://www.youtube.com/watch?v=CJu3kmY-f5o
diff --git a/published/20201209 Program a simple game with Elixir.md b/published/20201209 Program a simple game with Elixir.md
new file mode 100644
index 0000000000..4d7f6e6211
--- /dev/null
+++ b/published/20201209 Program a simple game with Elixir.md
@@ -0,0 +1,134 @@
+[#]: collector: (lujun9972)
+[#]: translator: (tt67wq)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13292-1.html)
+[#]: subject: (Program a simple game with Elixir)
+[#]: via: (https://opensource.com/article/20/12/elixir)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
+
+使用 Elixir 语言编写一个小游戏
+======
+
+> 通过编写“猜数字”游戏来学习 Elixir 编程语言,并将它与一个你熟知的语言做对比。
+
+
+
+为了更好的学习一门新的编程语言,最好的方法是去关注主流语言的一些共有特征:
+
+ * 变量
+ * 表达式
+ * 语句
+
+这些概念是大多数编程语言的基础。因为这些相似性,只要你通晓了一门编程语言,你可以通过对比差异来熟知另一门编程语言。
+
+另外一个学习新编程语言的好方法是开始编写一个简单标准的程序。它可以让你集中精力在语言上而非程序的逻辑本身。在这个系列的文章中,我们使用“猜数字”程序来实现,在这个程序中,计算机会选择一个介于 1 到 100 之间的数字,并要求你来猜测它。程序会循环执行,直到你正确猜出该数字为止。
+
+“猜数字”这个程序使用了编程语言的以下概念:
+
+ * 变量
+ * 输入
+ * 输出
+ * 条件判断
+ * 循环
+
+这是一个学习新编程语言的绝佳实践。
+
+### 猜数字的 Elixir 实现
+
+[Elixir][2] 是一门被设计用于构建稳定可维护应用的动态类型的函数式编程语言。它与 [Erlang][3] 运行于同一虚拟机之上,吸纳了 Erlang 的众多长处的同时拥有更加简单的语法。
+
+你可以编写一个 Elixir 版本的“猜数字”游戏来体验这门语言。
+
+这是我的实现方法:
+
+```
+defmodule Guess do
+ def guess() do
+ random = Enum.random(1..100)
+ IO.puts "Guess a number between 1 and 100"
+ Guess.guess_loop(random)
+ end
+ def guess_loop(num) do
+ data = IO.read(:stdio, :line)
+ {guess, _rest} = Integer.parse(data)
+ cond do
+ guess < num ->
+ IO.puts "Too low!"
+ guess_loop(num)
+ guess > num ->
+ IO.puts "Too high!"
+ guess_loop(num)
+ true ->
+ IO.puts "That's right!"
+ end
+ end
+end
+
+Guess.guess()
+```
+
+Elixir 通过列出变量的名称后面跟一个 `=` 号来为了给变量分配一个值。举个例子,表达式 `random = 0` 给 `random` 变量分配一个数值 0。
+
+代码以定义一个模块开始。在 Elixir 语言中,只有模块可以包含命名函数。
+
+紧随其后的这行代码定义了入口函数 `guess()`,这个函数:
+
+ * 调用 `Enum.random()` 函数来获取一个随机整数
+ * 打印游戏提示
+ * 调用循环执行的函数
+
+剩余的游戏逻辑实现在 `guess_loop()` 函数中。
+
+`guess_loop()` 函数利用 [尾递归][4] 来实现循环。Elixir 中有好几种实现循环的方法,尾递归是比较常用的一种方式。`guess_loop()` 函数做的最后一件事就是调用自身。
+
+`guess_loop()` 函数的第一行读取用户输入。下一行调用 `parse()` 函数将输入转换成一个整数。
+
+`cond` 表达式是 Elixir 版本的多重分支表达式。与其他语言中的 `if/elif` 或者 `if/elsif` 表达式不同,Elixir 对于的首个分支或者最后一个没有分支并没有区别对待。
+
+这个 `cond` 表达式有三路分支:猜测的结果可以比随机数大、小或者相等。前两个选项先输出不等式的方向然后递归调用 `guess_loop()`,循环返回至函数开始。最后一个选项输出 `That's right`,然后这个函数就完成了。
+
+### 输出例子
+
+现在你已经编写了你的 Elixir 代码,你可以运行它来玩“猜数字”的游戏。每次你执行这个程序,Elixir 会选择一个不同的随机数,你可以一直猜下去直到你找到正确的答案:
+
+```
+$ elixir guess.exs
+Guess a number between 1 and 100
+50
+Too high
+30
+Too high
+20
+Too high
+10
+Too low
+15
+Too high
+13
+Too low
+14
+That's right!
+```
+
+“猜数字”游戏是一个学习一门新编程语言的绝佳入门程序,因为它用了非常直接的方法实践了常用的几个编程概念。通过用不同语言实现这个简单的小游戏,你可以实践各个语言的核心概念并且比较它们的细节。
+
+你是否有你最喜爱的编程语言?你将怎样用它来编写“猜数字”这个游戏?关注这个系列的文章来看看其他你可能感兴趣的语言实现。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/20/12/elixir
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972][b]
+译者:[tt67wq](https://github.com/tt67wq)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/moshez
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dice_tabletop_board_gaming_game.jpg?itok=y93eW7HN (A die with rainbow color background)
+[2]: https://elixir-lang.org/
+[3]: https://www.erlang.org/
+[4]: https://en.wikipedia.org/wiki/Tail_call
diff --git a/published/20210331 3 reasons I use the Git cherry-pick command.md b/published/20210331 3 reasons I use the Git cherry-pick command.md
new file mode 100644
index 0000000000..5f87ecc61e
--- /dev/null
+++ b/published/20210331 3 reasons I use the Git cherry-pick command.md
@@ -0,0 +1,181 @@
+[#]: subject: (3 reasons I use the Git cherry-pick command)
+[#]: via: (https://opensource.com/article/21/3/git-cherry-pick)
+[#]: author: (Manaswini Das https://opensource.com/users/manaswinidas)
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13305-1.html)
+
+我使用 Git cherry-pick 命令的 3 个理由
+======
+
+> “遴选”可以解决 Git 仓库中的很多问题。以下是用 `git cherry-pick` 修复错误的三种方法。
+
+
+
+在版本控制系统中摸索前进是一件很棘手的事情。对于一个新手来说,这可能是非常难以应付的,但熟悉版本控制系统(如 Git)的术语和基础知识是开始为开源贡献的第一步。
+
+熟悉 Git 也能帮助你在开源之路上走出困境。Git 功能强大,让你感觉自己在掌控之中 —— 没有哪一种方法会让你无法恢复到工作版本。
+
+这里有一个例子可以帮助你理解“遴选”的重要性。假设你已经在一个分支上做了好几个提交,但你意识到这是个错误的分支!你现在该怎么办?你现在要做什么?要么在正确的分支上重复所有的变更,然后重新提交,要么把这个分支合并到正确的分支上。等一下,前者太过繁琐,而你可能不想做后者。那么,还有没有办法呢?有的,Git 已经为你准备好了。这就是“遴选”的作用。顾名思义,你可以用它从一个分支中手工遴选一个提交,然后转移到另一个分支。
+
+使用遴选的原因有很多。以下是其中的三个原因。
+
+### 避免重复性工作
+
+如果你可以直接将相同的提交复制到另一个分支,就没有必要在不同的分支中重做相同的变更。请注意,遴选出来的提交会在另一个分支中创建带有新哈希的新提交,所以如果你看到不同的提交哈希,请不要感到困惑。
+
+如果您想知道什么是提交的哈希,以及它是如何生成的,这里有一个说明可以帮助你。提交哈希是用 [SHA-1][2] 算法生成的字符串。SHA-1 算法接收一个输入,然后输出一个唯一的 40 个字符的哈希值。如果你使用的是 [POSIX][3] 系统,请尝试在您的终端上运行这个命令:
+
+```
+$ echo -n "commit" | openssl sha1
+```
+
+这将输出一个唯一的 40 个字符的哈希值 `4015b57a143aec5156fd1444a017a32137a3fd0f`。这个哈希代表了字符串 `commit`。
+
+Git 在提交时生成的 SHA-1 哈希值不仅仅代表一个字符串。它代表的是:
+
+```
+sha1(
+ meta data
+ commit message
+ committer
+ commit date
+ author
+ authoring date
+ Hash of the entire tree object
+)
+```
+
+这就解释了为什么你对代码所做的任何细微改动都会得到一个独特的提交哈希值。哪怕是一个微小的改动都会被发现。这是因为 Git 具有完整性。
+
+### 撤销/恢复丢失的更改
+
+当你想恢复到工作版本时,遴选就很方便。当多个开发人员在同一个代码库上工作时,很可能会丢失更改,最新的版本会被转移到一个陈旧的或非工作版本上。这时,遴选提交到工作版本就可以成为救星。
+
+#### 它是如何工作的?
+
+假设有两个分支:`feature1` 和 `feature2`,你想把 `feature1` 中的提交应用到 `feature2`。
+
+在 `feature1` 分支上,运行 `git log` 命令,复制你想遴选的提交哈希值。你可以看到一系列类似于下面代码示例的提交。`commit` 后面的字母数字代码就是你需要复制的提交哈希。为了方便起见,您可以选择复制前六个字符(本例中为 `966cf3`)。
+
+```
+commit 966cf3d08b09a2da3f2f58c0818baa37184c9778 (HEAD -> master)
+Author: manaswinidas
+Date: Mon Mar 8 09:20:21 2021 +1300
+
+ add instructions
+```
+
+然后切换到 `feature2` 分支,在刚刚从日志中得到的哈希值上运行 `git cherry-pick`:
+
+```
+$ git checkout feature2
+$ git cherry-pick 966cf3.
+```
+
+如果该分支不存在,使用 `git checkout -b feature2` 来创建它。
+
+这里有一个问题。你可能会遇到下面这种情况:
+
+```
+$ git cherry-pick 966cf3
+On branch feature2
+You are currently cherry-picking commit 966cf3d.
+
+nothing to commit, working tree clean
+The previous cherry-pick is now empty, possibly due to conflict resolution.
+If you wish to commit it anyway, use:
+
+ git commit --allow-empty
+
+Otherwise, please use 'git reset'
+```
+
+不要惊慌。只要按照建议运行 `git commit --allow-empty`:
+
+```
+$ git commit --allow-empty
+[feature2 afb6fcb] add instructions
+Date: Mon Mar 8 09:20:21 2021 +1300
+```
+
+这将打开你的默认编辑器,允许你编辑提交信息。如果你没有什么要补充的,可以保存现有的信息。
+
+就这样,你完成了你的第一次遴选。如上所述,如果你在分支 `feature2` 上运行 `git log`,你会看到一个不同的提交哈希。下面是一个例子:
+
+```
+commit afb6fcb87083c8f41089cad58deb97a5380cb2c2 (HEAD -> feature2)
+Author: manaswinidas <[me@example.com][4]>
+Date: Mon Mar 8 09:20:21 2021 +1300
+ add instructions
+```
+
+不要对不同的提交哈希感到困惑。这只是区分 `feature1` 和 `feature2` 的提交。
+
+### 遴选多个提交
+
+但如果你想遴选多个提交的内容呢?你可以使用:
+
+```
+git cherry-pick ...
+```
+
+请注意,你不必使用整个提交的哈希值,你可以使用前五到六个字符。
+
+同样,这也是很繁琐的。如果你想遴选的提交是一系列的连续提交呢?这种方法太费劲了。别担心,有一个更简单的方法。
+
+假设你有两个分支:
+
+ * `feature1` 包括你想复制的提交(从更早的 `commitA` 到 `commitB`)。
+ * `feature2` 是你想把提交从 `feature1` 转移到的分支。
+
+然后:
+
+ 1. 输入 `git checkout `。
+ 2. 获取 `commitA` 和 `commitB` 的哈希值。
+ 3. 输入 `git checkout `。
+ 4. 输入 `git cherry-pick ^..` (请注意,这包括 `commitA` 和 `commitB`)。
+ 5. 如果遇到合并冲突,[像往常一样解决][5],然后输入 `git cherry-pick --continue` 恢复遴选过程。
+
+### 重要的遴选选项
+
+以下是 [Git 文档][6] 中的一些有用的选项,你可以在 `cherry-pick` 命令中使用。
+
+ * `-e`、`--edit`:用这个选项,`git cherry-pick` 可以让你在提交前编辑提交信息。
+ * `-s`、`--signoff`:在提交信息的结尾添加 `Signed-off by` 行。更多信息请参见 `git-commit(1)` 中的 signoff 选项。
+ * `-S[]`、`--pgg-sign[=]`:这些是 GPG 签名的提交。`keyid` 参数是可选的,默认为提交者身份;如果指定了,则必须嵌在选项中,不加空格。
+ * `--ff`:如果当前 HEAD 与遴选的提交的父级提交相同,则会对该提交进行快进操作。
+
+下面是除了 `--continue` 外的一些其他的后继操作子命令:
+
+ * `--quit`:你可以忘记当前正在进行的操作。这可以用来清除遴选或撤销失败后的后继操作状态。
+ * `--abort`:取消操作并返回到操作序列前状态。
+
+下面是一些关于遴选的例子:
+
+ * `git cherry-pick master`:应用 `master` 分支顶端的提交所引入的变更,并创建一个包含该变更的新提交。
+ * `git cherry-pick master~4 master~2':应用 `master` 指向的第五个和第三个最新提交所带来的变化,并根据这些变化创建两个新的提交。
+
+感到不知所措?你不需要记住所有的命令。你可以随时在你的终端输入 `git cherry-pick --help` 查看更多选项或帮助。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/3/git-cherry-pick
+
+作者:[Manaswini Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/manaswinidas
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe)
+[2]: https://en.wikipedia.org/wiki/SHA-1
+[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
+[4]: mailto:me@example.com
+[5]: https://opensource.com/article/20/4/git-merge-conflict
+[6]: https://git-scm.com/docs/git-cherry-pick
diff --git a/translated/tech/20210402 A practical guide to using the git stash command.md b/published/20210402 A practical guide to using the git stash command.md
similarity index 89%
rename from translated/tech/20210402 A practical guide to using the git stash command.md
rename to published/20210402 A practical guide to using the git stash command.md
index ddd8a761dd..51917981dd 100644
--- a/translated/tech/20210402 A practical guide to using the git stash command.md
+++ b/published/20210402 A practical guide to using the git stash command.md
@@ -3,24 +3,24 @@
[#]: author: (Ramakrishna Pattnaik https://opensource.com/users/rkpattnaik780)
[#]: collector: (lujun9972)
[#]: translator: (wxy)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13293-1.html)
git stash 命令实用指南
======
-> 学习如何使用 `git stash` 命令,以及何时应该使用它。
+> 学习如何使用 `git stash` 命令,以及何时应该使用它。
-![女人在笔记本上坐在窗口][1]
+
-版本控制是软件开发人员日常生活中不可分割的一部分。很难想象有哪个团队在开发软件时不使用版本控制工具。同样也很难想象有哪个开发者没有使用过(或没有听说过)Git。在 2018 年 Stackoverflow 开发者调查中,74298 名参与者中 87.2% 的人 [使用 Git][2] 进行版本控制。
+版本控制是软件开发人员日常生活中不可分割的一部分。很难想象有哪个团队在开发软件时不使用版本控制工具。同样也很难想象有哪个开发者没有使用过(或没有听说过)Git。在 2018 年 Stackoverflow 开发者调查中,74298 名参与者中有 87.2% 的人 [使用 Git][2] 进行版本控制。
-Linus Torvalds 在 2005 年创建了 Git 用于开发 Linux 内核。本文将介绍 `git stash` 命令,并探讨一些有用的暂存修改的选项。本文假定你对 [Git 概念][3] 有基本的了解,并对工作树、暂存区和相关命令有良好的理解。
+Linus Torvalds 在 2005 年创建了 Git 用于开发 Linux 内核。本文将介绍 `git stash` 命令,并探讨一些有用的暂存变更的选项。本文假定你对 [Git 概念][3] 有基本的了解,并对工作树、暂存区和相关命令有良好的理解。
### 为什么 git stash 很重要?
-首先要明白为什么在 Git 中暂存变更很重要。假设 Git 没有暂存变更的命令。当你正在一个有两个分支(A 和 B)的仓库上工作时,这两个分支已经分叉了一段时间,并且有不同的头。当你正在处理 A 分支的一些文件时,你的团队要求你修复 B 分支的一个错误。你迅速将你的修改保存到 A 分支,并尝试用 `git checkout B` 来签出 B 分支。Git 立即中止了这个操作,并抛出错误:“你对以下文件的本地修改会被该签出覆盖……请在切换分支之前提交你的修改或将它们暂存起来。”
+首先要明白为什么在 Git 中暂存变更很重要。假设 Git 没有暂存变更的命令。当你正在一个有两个分支(A 和 B)的仓库上工作时,这两个分支已经分叉了一段时间,并且有不同的头。当你正在处理 A 分支的一些文件时,你的团队要求你修复 B 分支的一个错误。你迅速将你的修改保存到 A 分支(但没有提交),并尝试用 `git checkout B` 来签出 B 分支。Git 会立即中止了这个操作,并抛出错误:“你对以下文件的本地修改会被该签出覆盖……请在切换分支之前提交你的修改或将它们暂存起来。”
在这种情况下,有几种方法可以启用分支切换:
@@ -31,7 +31,7 @@ Linus Torvalds 在 2005 年创建了 Git 用于开发 Linux 内核。本文将
`git stash` 将未提交的改动保存在本地,让你可以进行修改、切换分支以及其他 Git 操作。然后,当你需要的时候,你可以重新应用这些存储的改动。暂存是本地范围的,不会被 `git push` 推送到远程。
-### 如何使用git stash
+### 如何使用 git stash
下面是使用 `git stash` 时要遵循的顺序:
@@ -54,7 +54,7 @@ $ git stash
Saved working directory and index state WIP on master; d7435644 Feat: configure graphql endpoint
```
-默认情况下,`git stash` 存储(或“暂存”)未提交的更改(已暂存和未暂存的文件),并忽略未跟踪和忽略的文件。通常情况下,你不需要暂存未跟踪和忽略的文件,但有时它们可能会干扰你在代码库中要做的其他事情。
+默认情况下,`git stash` 存储(或称之为“暂存”)未提交的更改(已暂存和未暂存的文件),并忽略未跟踪和忽略的文件。通常情况下,你不需要暂存未跟踪和忽略的文件,但有时它们可能会干扰你在代码库中要做的其他事情。
你可以使用附加选项让 `git stash` 来处理未跟踪和忽略的文件:
@@ -212,7 +212,7 @@ via: https://opensource.com/article/21/4/git-stash
作者:[Ramakrishna Pattnaik][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20210405 7 Git tips for managing your home directory.md b/published/20210405 7 Git tips for managing your home directory.md
new file mode 100644
index 0000000000..67d8a3ceea
--- /dev/null
+++ b/published/20210405 7 Git tips for managing your home directory.md
@@ -0,0 +1,135 @@
+[#]: subject: (7 Git tips for managing your home directory)
+[#]: via: (https://opensource.com/article/21/4/git-home)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+[#]: collector: (lujun9972)
+[#]: translator: (stevenzdg988)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13313-1.html)
+
+7个管理家目录的 Git 技巧
+======
+
+> 这是我怎样设置 Git 来管理我的家目录的方法。
+
+
+
+我有好几台电脑。一台笔记本电脑用于工作,一台工作站放在家里,一台树莓派(或四台),一台 [Pocket CHIP][2],一台 [运行各种不同的 Linux 的 Chromebook][3],等等。我曾经在每台计算机上或多或少地按照相同的步骤设置我的用户环境,也经常告诉自己让每台计算机都略有不同。例如,我在工作中比在家里更经常使用 [Bash 别名][4],并且我在家里使用的辅助脚本可能对工作没有用。
+
+这些年来,我对各种设备的期望开始相融,我会忘记我在家用计算机上建立的功能没有移植到我的工作计算机上,诸如此类。我需要一种标准化我的自定义工具包的方法。使我感到意外的答案是 Git。
+
+Git 是版本跟踪软件。它以既可以用在非常大的开源项目也可以用在极小的开源项目而闻名,甚至最大的专有软件公司也在用它。但是它是为源代码设计的,而不是用在一个装满音乐和视频文件、游戏、照片等的家目录。我听说过有人使用 Git 管理其家目录,但我认为这是程序员们进行的一项附带实验,而不是像我这样的现实生活中的用户。
+
+用 Git 管理我的家目录是一个不断发展的过程。随着时间的推移我一直在学习和适应。如果你决定使用 Git 管理家目录,则可能需要记住以下几点。
+
+### 1、文本和二进制位置
+
+![家目录][5]
+
+当由 Git 管理时,除了配置文件之外,你的家目录对于所有内容而言都是“无人之地”。这意味着当你打开主目录时,除了可预见的目录的列表之外,你什么都看不到。不应有任何杂乱无章的照片或 LibreOffice 文档,也不应有 “我就在这里放一分钟” 的临时文件。
+
+原因很简单:使用 Git 管理家目录时,家目录中所有 _未_ 提交的内容都会变成噪音。每次执行 `git status` 时,你都必须翻过去之前 Git 未跟踪的任何文件,因此将这些文件保存在子目录(添加到 `.gitignore` 文件中)至关重要。
+
+许多 Linux 发行版提供了一组默认目录:
+
+ * `Documents`
+ * `Downloads`
+ * `Music`
+ * `Photos`
+ * `Templates`
+ * `Videos`
+
+如果需要,你可以创建更多。例如,我把创作的音乐(`Music`)和购买来聆听的音乐(`Albums`)区分开来。同样,我的电影(`Cinema`)目录包含了其他人的电影,而视频(`Videos`)目录包含我需要编辑的视频文件。换句话说,我的默认目录结构比大多数 Linux 发行版提供的默认设置更详细,但是我认为这样做有好处。如果没有适合你的目录结构,你更会将其存放在家目录中,因为没有更好的存放位置,因此请提前考虑并规划好适合你的工作目录。你以后总是可以添加更多,但是最好先开始擅长的。
+
+### 2、、设置最优的 `.gitignore`
+
+清理家目录后,你可以像往常一样将其作为 Git 存储库实例化:
+
+```
+$ cd
+$ git init .
+```
+
+你的 Git 仓库中还没有任何内容,你的家目录中的所有内容均未被跟踪。你的第一项工作是筛选未跟踪文件的列表,并确定要保持未跟踪状态的文件。要查看未跟踪的文件:
+
+```
+$ git status
+ .AndroidStudio3.2/
+ .FBReader/
+ .ICEauthority
+ .Xauthority
+ .Xdefaults
+ .android/
+ .arduino15/
+ .ash_history
+[...]
+```
+
+根据你使用家目录的时间长短,此列表可能很长。简单的是你在上一步中确定的目录。通过将它们添加到名为 `.gitignore` 的隐藏文件中,你告诉 Git 停止将它们列为未跟踪文件,并且永远不对其进行跟踪:
+
+```
+$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore
+```
+
+完成后,浏览 `git status` 所示的其余未跟踪文件,并确定是否有其他文件需要排除。这个过程帮助我发现了几个陈旧的配置文件和目录,这些文件和目录最终被我全部丢弃了,而且还发现了一些特定于一台计算机的文件和目录。我在这里非常严格,因为许多配置文件在自动生成时会表现得更好。例如,我从不提交我的 KDE 配置文件,因为许多文件包含了诸如最新文档之类的信息以及其他机器上不存在的其他元素。
+
+我会跟踪我的个性化配置文件、脚本和实用程序、配置文件和 Bash 配置,以及速查表和我经常引用的其他文本片段。如果有软件主要负责维护的文件,则将其忽略。当对一个文件不确定时,我将其忽略。你以后总是可以取消忽略它(通过从 `.gitignore` 文件中删除它)。
+
+### 3、了解你的数据
+
+我使用的是 KDE,因此我使用开源扫描程序 [Filelight][7] 来了解我的数据概况。Filelight 为你提供了一个图表,可让你查看每个目录的大小。你可以浏览每个目录以查看占用了空间的内容,然后回溯调查其他地方。这是一个令人着迷的系统视图,它使你可以以全新的方式看待你的文件。
+
+![Filelight][8]
+
+使用 Filelight 或类似的实用程序查找不需要提交的意外数据缓存。例如,KDE 文件索引器(Baloo)生成了大量特定于其主机的数据,我绝对不希望将其传输到另一台计算机。
+
+### 4、不要忽略你的 `.gitignore` 文件
+
+在某些项目中,我告诉 Git 忽略我的 `.gitignore` 文件,因为有时我要忽略的内容特定于我的工作目录,并且我不认为同一项目中的其他开发人员需要我告诉他们 `.gitignore` 文件应该是什么样子。因为我的家目录仅供我使用,所以我 _不_ 会忽略我的家目录的 `.gitignore` 文件。我将其与其他重要文件一起提交,因此它已在我的所有系统中被继承。当然,从家目录的角度来看,我所有的系统都是相同的:它们具有一组相同的默认文件夹和许多相同的隐藏配置文件。
+
+### 5、不要担心二进制文件
+
+我对我的系统进行了数周的严格测试,确信将二进制文件提交到 Git 绝对不是明智之举。我试过 GPG 加密的密码文件、试过 LibreOffice 文档、JPEG、PNG 等等。我甚至有一个脚本,可以在将 LibreOffice 文件添加到 Git 之前先解压缩,提取其中的 XML,以便仅提交 XML,然后重新构建 LibreOffice 文件,以便可以在 LibreOffice 中继续工作。我的理论是,提交 XML 会比使用 ZIP 文件(LibreOffice 文档实际上就是一个 ZIP 文件)会让 Git 存储库更小一些。
+
+令我惊讶的是,我发现偶尔提交一些二进制文件并没有大幅增加我的 Git 存储库的大小。我使用 Git 已经很长时间了,我知道如果我要提交几千兆的二进制数据,我的存储库将会受到影响,但是偶尔提交几个二进制文件也不是不惜一切代价要避免的紧急情况。
+
+有了这种信心,我将字体 OTF 和 TTF 文件添加到我的标准主存储库,以及 GDM 的 `.face` 文件以及其他偶尔小型二进制 Blob 文件。不要想太多,不要浪费时间去避免它。只需提交即可。
+
+### 6、使用私有存储库
+
+即使托管方提供了私人帐户,也不要将你的主目录提交到公共 Git 存储库。如果你像我一样,拥有 SSH 密钥、GPG 密钥链和 GPG 加密的文件,这些文件不应该出现在任何人的服务器上,而应该出现在我自己的服务器上。
+
+我在树莓派上 [运行本地 Git 服务器][9](这比你想象的要容易),因此我可以在家里时随时更新任何一台计算机。我是一名远程工作者,所以通常情况下就足够了,但是我也可以在旅行时通过 [虚拟私人网络][10] 访问我的计算机。
+
+### 7、要记得推送
+
+Git 的特点是,只有当你告诉它要推送改动时,它才会把改动推送到你的服务器上。如果你是 Git 的老用户,则此过程可能对你很自然。对于可能习惯于 Nextcloud 或 Syncthing 自动同步的新用户,这可能需要一些时间来适应。
+
+### Git 家目录
+
+使用 Git 管理我的常用文件,不仅使我在不同设备上的生活更加便利。我知道我拥有所有配置和实用程序脚本的完整历史记录,这会鼓励我尝试新的想法,因为如果结果变得 _很糟糕_,则很容易回滚我的更改。Git 曾将我从在 `.bashrc` 文件中一个欠考虑的 `umask` 设置中解救出来、从深夜对包管理脚本的拙劣添加中解救出来、从当时看似很酷的 [rxvt][11] 配色方案的修改中解救出来,也许还有其他一些错误。在家目录中尝试 Git 吧,因为这些提交会让家目录融合在一起。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/git-home
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[stevenzdg988](https://github.com/stevenzdg988)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/house_home_colors_live_building.jpg?itok=HLpsIfIL (Houses in a row)
+[2]: https://opensource.com/article/17/2/pocketchip-or-pi
+[3]: https://opensource.com/article/21/2/chromebook-linux
+[4]: https://opensource.com/article/17/5/introduction-alias-command-line-tool
+[5]: https://opensource.com/sites/default/files/uploads/home-git.jpg (home directory)
+[6]: https://creativecommons.org/licenses/by-sa/4.0/
+[7]: https://utils.kde.org/projects/filelight
+[8]: https://opensource.com/sites/default/files/uploads/filelight.jpg (Filelight)
+[9]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6
+[10]: https://www.redhat.com/sysadmin/run-your-own-vpn-libreswan
+[11]: https://opensource.com/article/19/10/why-use-rxvt-terminal
diff --git a/translated/tech/20210406 Experiment on your code freely with Git worktree.md b/published/20210406 Experiment on your code freely with Git worktree.md
similarity index 80%
rename from translated/tech/20210406 Experiment on your code freely with Git worktree.md
rename to published/20210406 Experiment on your code freely with Git worktree.md
index ffffba7845..b684e0e46f 100644
--- a/translated/tech/20210406 Experiment on your code freely with Git worktree.md
+++ b/published/20210406 Experiment on your code freely with Git worktree.md
@@ -4,25 +4,25 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
[#]: reviewer: (wxy)
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13301-1.html)
使用 Git 工作树对你的代码进行自由实验
======
> 获得自由尝试的权利,同时在你的实验出错时可以安全地拥有一个新的、链接的克隆存储库。
-![带烧杯的科学实验室][1]
+
-Git 的设计部分是为了进行实验。如果你知道你的工作会被安全地跟踪,并且在出现严重错误时有安全状态存在,你就不会害怕尝试新的想法。不过,创新的部分代价是,你很可能会在过程中弄得一团糟。文件会被重新命名、移动、删除、更改、切割成碎片;新的文件被引入;你不打算跟踪的临时文件会在你的工作目录中占据一席之地等等。
+Git 的设计部分是为了进行实验。如果你知道你的工作会被安全地跟踪,并且在出现严重错误时有安全状态存在,你就不会害怕尝试新的想法。不过,创新的部分代价是,你很可能会在这个过程中弄得一团糟。文件会被重新命名、移动、删除、更改、切割成碎片;新的文件被引入;你不打算跟踪的临时文件会在你的工作目录中占据一席之地等等。
-简而言之,你的工作空间变成了纸牌屋,在“快好了!”和“哦,不,我做了什么?”之间岌岌可危地平衡着。那么,当你需要把仓库恢复到下午的一个已知状态,以便完成一些真正的工作时,该怎么办?我立刻想到了 `git branch` 和 [git stash][2] 这两个经典命令,但这两个命令都不是用来处理未被跟踪的文件的,而且文件路径的改变和其他重大的转变也会让人困惑,它们只能把工作藏(`stash`)起来以备后用。解决这个需求的答案是 Git 工作树。
+简而言之,你的工作空间变成了纸牌屋,在“快好了!”和“哦,不,我做了什么?”之间岌岌可危地平衡着。那么,当你需要把仓库恢复到下午的一个已知状态,以便完成一些真正的工作时,该怎么办?我立刻想到了 `git branch` 和 [git stash][2] 这两个经典命令,但这两个命令都不是用来处理未被跟踪的文件的,而且文件路径的改变和其他重大的转变也会让人困惑,它们只能把工作暂存(`stash`)起来以备后用。解决这个需求的答案是 Git 工作树。
### 什么是 Git 工作树
-Git 工作树是 Git 仓库的一个链接副本,允许你同时签出多个分支。工作树与主工作副本的路径是分开的,它可以处于不同的状态和不同的分支上。在 Git 中新建工作树的好处是,你可以在不干扰当前工作环境的情况下,做出与当前任务无关的修改,提交修改,然后在以后再合并。
+Git 工作树是 Git 仓库的一个链接副本,允许你同时签出多个分支。工作树与主工作副本的路径是分开的,它可以处于不同的状态和不同的分支上。在 Git 中新建工作树的好处是,你可以在不干扰当前工作环境的情况下,做出与当前任务无关的修改、提交修改,然后在以后合并。
-直接从 `git-worktree` 手册中找到了一个典型的例子:当你正在为一个项目做一个令人兴奋的新功能时,你的项目经理告诉你有一个紧急的修复工作。问题是你的工作仓库(你的“工作树”)处于混乱状态,因为你正在开发一个重要的新功能。你不想在当前的冲刺中“偷偷地”进行修复,而且你也不愿意把变更藏(`stash`)起来,为修复创建一个新的分支。相反,你决定创建一个新的工作树,这样你就可以在那里进行修复:
+直接从 `git-worktree` 手册中找到了一个典型的例子:当你正在为一个项目做一个令人兴奋的新功能时,你的项目经理告诉你有一个紧急的修复工作。问题是你的工作仓库(你的“工作树”)处于混乱状态,因为你正在开发一个重要的新功能。你不想在当前的冲刺中“偷偷地”进行修复,而且你也不愿意把变更暂存起来,为修复创建一个新的分支。相反,你决定创建一个新的工作树,这样你就可以在那里进行修复:
```
$ git branch | tee
@@ -75,7 +75,7 @@ $ git worktree list
/home/seth/code/hotfix 09e585d [master]
```
-你可以在任何一个工作树中使用这个功能。工作树始终是链接的(除非你手动移动它们,破坏 Git 定位工作树的能力,从而切断链接)。
+你可以在任何一个工作树中使用这个功能。工作树始终是连接的(除非你手动移动它们,破坏 Git 定位工作树的能力,从而切断连接)。
### 移动工作树
@@ -132,4 +132,4 @@ via: https://opensource.com/article/21/4/git-worktree
[a]: https://opensource.com/users/seth
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/science_experiment_beaker_lab.png?itok=plKWRhlU (Science lab with beakers)
-[2]: https://opensource.com/article/21/4/git-stash
+[2]: https://linux.cn/article-13293-1.html
diff --git a/published/20210407 What is Git cherry-picking.md b/published/20210407 What is Git cherry-picking.md
new file mode 100644
index 0000000000..ba25e9572c
--- /dev/null
+++ b/published/20210407 What is Git cherry-picking.md
@@ -0,0 +1,187 @@
+[#]: subject: (What is Git cherry-picking?)
+[#]: via: (https://opensource.com/article/21/4/cherry-picking-git)
+[#]: author: (Rajeev Bera https://opensource.com/users/acompiler)
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13295-1.html)
+
+什么是 Git 遴选(cherry-pick)?
+======
+
+> 了解 `git cherry-pick` 命令是什么,为什么用以及如何使用。
+
+
+
+当你和一群程序员一起工作时,无论项目大小,处理多个 Git 分支之间的变更都会变得很困难。有时,你不想将整个 Git 分支合并到另一个分支,而是想选择并移动几个特定的提交。这个过程被称为 “遴选”。
+
+本文将介绍“遴选”是什么、为何使用以及如何使用。
+
+那么让我们开始吧。
+
+### 什么是遴选?
+
+使用遴选(`cherry-pick`)命令,Git 可以让你将任何分支中的个别提交合并到你当前的 [Git HEAD][2] 分支中。
+
+当执行 `git merge` 或者 `git rebase` 时,一个分支的所有提交都会被合并。`cherry-pick` 命令允许你选择单个提交进行整合。
+
+### 遴选的好处
+
+下面的情况可能会让你更容易理解遴选功能。
+
+想象一下,你正在为即将到来的每周冲刺实现新功能。当你的代码准备好了,你会把它推送到远程分支,准备进行测试。
+
+然而,客户并不是对所有修改都满意,要求你只呈现某些修改。因为客户还没有批准下次发布的所有修改,所以 `git rebase` 不会有预期的结果。为什么会这样?因为 `git rebase` 或者 `git merge` 会把上一个冲刺的每一个调整都纳入其中。
+
+遴选就是答案!因为它只关注在提交中添加的变更,所以遴选只会带入批准的变更,而不添加其他的提交。
+
+还有其他几个原因可以使用遴选:
+
+ * 这对于 bug 修复是必不可少的,因为 bug 是出现在开发分支中对应的提交的。
+ * 你可以通过使用 `git cherry-pick` 来避免不必要的工作,而不用使用其他选项例如 `git diff` 来应用特定变更。
+ * 如果因为不同 Git 分支的版本不兼容而无法将整个分支联合起来,那么它是一个很有用的工具。
+
+### 使用 cherry-pick 命令
+
+在 `cherry-pick` 命令的最简单形式中,你只需使用 [SHA][3] 标识符来表示你想整合到当前 HEAD 分支的提交。
+
+要获得提交的哈希值,可以使用 `git log` 命令:
+
+```
+$ git log --oneline
+```
+
+当你知道了提交的哈希值后,你就可以使用 `cherry-pick` 命令。
+
+语法是:
+
+```
+$ git cherry-pick
+```
+
+例如:
+
+```
+$ git cherry-pick 65be1e5
+```
+
+这将会把指定的修改合并到当前已签出的分支上。
+
+如果你想做进一步的修改,也可以让 Git 将提交的变更内容添加到你的工作副本中。
+
+语法是:
+
+```
+$ git cherry-pick --no-commit
+```
+
+例如:
+
+```
+$ git cherry-pick 65be1e5 --no-commit
+```
+
+如果你想同时选择多个提交,请将它们的提交哈希值用空格隔开:
+
+```
+$ git cherry-pick hash1 hash3
+```
+
+当遴选提交时,你不能使用 `git pull` 命令,因为它能获取一个仓库的提交**并**自动合并到另一个仓库。`cherry-pick` 是一个专门不这么做的工具;另一方面,你可以使用 `git fetch`,它可以获取提交,但不应用它们。毫无疑问,`git pull` 很方便,但它不精确。
+
+### 自己尝试
+
+要尝试这个过程,启动终端并生成一个示例项目:
+
+```
+$ mkdir fruit.git
+$ cd fruit.git
+$ git init .
+```
+
+创建一些数据并提交:
+
+```
+$ echo "Kiwifruit" > fruit.txt
+$ git add fruit.txt
+$ git commit -m 'First commit'
+```
+
+现在,通过创建一个项目的复刻来代表一个远程开发者:
+
+```
+$ mkdir ~/fruit.fork
+$ cd !$
+$ echo "Strawberry" >> fruit.txt
+$ git add fruit.txt
+$ git commit -m 'Added a fruit"
+```
+
+这是一个有效的提交。现在,创建一个不好的提交,代表你不想合并到你的项目中的东西:
+
+```
+$ echo "Rhubarb" >> fruit.txt
+$ git add fruit.txt
+$ git commit -m 'Added a vegetable that tastes like a fruit"
+```
+
+返回你的仓库,从你的假想的开发者那里获取提交的内容:
+
+```
+$ cd ~/fruit.git
+$ git remote add dev ~/fruit.fork
+$ git fetch dev
+remote: Counting objects: 6, done.
+remote: Compressing objects: 100% (2/2), done.
+remote: Total 6 (delta 0), reused 0 (delta 0)
+Unpacking objects: 100% (6/6), done...
+```
+
+```
+$ git log –oneline dev/master
+e858ab2 Added a vegetable that tastes like a fruit
+0664292 Added a fruit
+b56e0f8 First commit
+```
+
+你已经从你想象中的开发者那里获取了提交的内容,但你还没有将它们合并到你的版本库中。你想接受第二个提交,但不想接受第三个提交,所以使用 `cherry-pick`。
+
+```
+$ git cherry-pick 0664292
+```
+
+第二次提交现在在你的仓库里了:
+
+```
+$ cat fruit.txt
+Kiwifruit
+Strawberry
+```
+
+将你的更改推送到远程服务器上,这就完成了!
+
+### 避免使用遴选的原因
+
+在开发者社区中,通常不鼓励所以遴选。主要原因是它会造成重复提交,而你也失去了跟踪你的提交历史的能力。
+
+如果你不按顺序地遴选了大量的提交,这些提交会被记录在你的分支中,这可能会在 Git 分支中导致不理想的结果。
+
+遴选是一个强大的命令,如果没有正确理解可能发生的情况,它可能会导致问题。不过,当你搞砸了,提交到错误的分支时,它可能会救你一命(至少是你当天的工作)。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/cherry-picking-git
+
+作者:[Rajeev Bera][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/acompiler
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe)
+[2]: https://acompiler.com/git-head/
+[3]: https://en.wikipedia.org/wiki/Secure_Hash_Algorithms
diff --git a/published/20210407 Why I love using bspwm for my Linux window manager.md b/published/20210407 Why I love using bspwm for my Linux window manager.md
new file mode 100644
index 0000000000..8050039891
--- /dev/null
+++ b/published/20210407 Why I love using bspwm for my Linux window manager.md
@@ -0,0 +1,107 @@
+[#]: subject: (Why I love using bspwm for my Linux window manager)
+[#]: via: (https://opensource.com/article/21/4/bspwm-linux)
+[#]: author: (Stephen Adams https://opensource.com/users/stevehnh)
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13308-1.html)
+
+为什么我喜欢用 bspwm 来做我的 Linux 窗口管理器
+======
+
+> 在 Fedora Linux 上安装、配置并开始使用 bspwm 窗口管理器。
+
+
+
+有些人喜欢重新布置家具。还有的人喜欢尝试新鞋或定期重新装修他们的卧室。我呢,则是尝试 Linux 桌面。
+
+在对网上看到的一些不可思议的桌面环境流口水之后,我对一个窗口管理器特别好奇:[bspwm][2]。
+
+![bspwm desktop][3]
+
+我喜欢 [i3][5] 窗口管理器已经有一段时间了,我很喜欢它的布局方式和上手的便捷性。但 bspwm 的某些特性吸引了我。有几个原因让我决定尝试一下:
+
+ * 它_只是_一个窗口管理器(WM)。
+ * 它由几个易于配置的脚本管理。
+ * 它默认支持窗口之间的间隙。
+
+可能是最需要指出的第一个原因是它只是一个窗口管理器。和 i3 一样,默认情况下没有任何图形化的那些花哨东西。你当然可以随心所欲地定制它,但_你_需要付出努力来使它看起来像你想要的。这也是它吸引我的部分原因。
+
+虽然它可以在许多发行版上使用,但在我这个例子中使用的是 Fedora Linux。
+
+### 安装 bspwm
+
+bspwm 在大多数常见的发行版中都有打包,所以你可以用系统的包管理器安装它。下面这个命令还会安装 [sxkhd][6],这是一个 X 窗口系统的守护程序,它“通过执行命令对输入事件做出反应”;还有 [dmenu][7],这是一个通用的 X 窗口菜单:
+
+```
+dnf install bspwm sxkhd dmenu
+```
+
+因为 bspwm 只是一个窗口管理器,所以没有任何内置的快捷键或键盘命令。这也是它与 i3 等软件的不同之处。所以,在你第一次启动窗口管理器之前,请先配置一下 `sxkhd`:
+
+```
+systemctl start sxkhd
+systemctl enable sxkhd
+```
+
+这样就可以在登录时启用 `sxkhd`,但你还需要一些基本功能的配置:
+
+```
+curl https://raw.githubusercontent.com/baskerville/bspwm/master/examples/sxhkdrc --output ~/.config/sxkhd/sxkhdrc
+```
+
+在你深入了解之前,不妨先看看这个文件,因为有些脚本调用的命令可能在你的系统中并不存在。一个很好的例子是调用 `urxvt` 的 `super + Return` 快捷键。把它改成你喜欢的终端,尤其是当你没有安装 `urxvt` 的时候:
+
+```
+#
+# wm independent hotkeys
+#
+
+# terminal emulator
+super + Return
+ urxvt
+
+# program launcher
+super + @space
+ dmenu_run
+```
+
+如果你使用的是 GDM、LightDM 或其他显示管理器(DM),只要在登录前选择 `bspwm` 即可。
+
+### 配置 bspwm
+
+当你登录后,你会看到屏幕上什么都没有。这不是你感觉到的空虚感。而是无限可能性!你现在可以开始摆弄桌面环境的所有部分了。你现在可以开始摆弄这些年你认为理所当然的桌面环境的所有部分了。从头开始构建并不容易,但一旦你掌握了诀窍,就会非常有收获。
+
+任何窗口管理器最困难的是掌握快捷键。你开始会很慢,但在很短的时间内,你就可以只使用键盘在系统中到处操作,在你的朋友和家人面前看起来像一个终极黑客。
+
+你可以通过编辑 `~/.config/bspwm/bspwmrc`,在启动时添加应用,设置桌面和显示器,并为你的窗口应该如何表现设置规则,随心所欲地定制系统。有一些默认设置的例子可以让你开始使用。键盘快捷键都是由 `sxkhdrc` 文件管理的。
+
+还有更多的开源项目可以安装,让你的电脑看起来更漂亮,比如用于桌面背景的 [Feh][8]、状态栏的 [Polybar][9]、应用启动器的 [Rofi][10],还有 [Compton][11] 可以给你提供阴影和透明度,可以让你的电脑看起来焕然一新。
+
+玩得愉快!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/bspwm-linux
+
+作者:[Stephen Adams][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/stevehnh
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/windows_building_sky_scale.jpg?itok=mH6CAX29 (Tall building with windows)
+[2]: https://github.com/baskerville/bspwm
+[3]: https://opensource.com/sites/default/files/uploads/bspwm-desktop.png (bspwm desktop)
+[4]: https://creativecommons.org/licenses/by-sa/4.0/
+[5]: https://i3wm.org/
+[6]: https://github.com/baskerville/sxhkd
+[7]: https://linux.die.net/man/1/dmenu
+[8]: https://github.com/derf/feh
+[9]: https://github.com/polybar/polybar
+[10]: https://github.com/davatorium/rofi
+[11]: https://github.com/chjj/compton
diff --git a/published/20210409 4 ways open source gives you a competitive edge.md b/published/20210409 4 ways open source gives you a competitive edge.md
new file mode 100644
index 0000000000..4a9603b1ba
--- /dev/null
+++ b/published/20210409 4 ways open source gives you a competitive edge.md
@@ -0,0 +1,84 @@
+[#]: subject: (4 ways open source gives you a competitive edge)
+[#]: via: (https://opensource.com/article/21/4/open-source-competitive-advantage)
+[#]: author: (Jason Blais https://opensource.com/users/jasonblais)
+[#]: collector: (lujun9972)
+[#]: translator: (DCOLIVERSUN)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13299-1.html)
+
+开源为你带来竞争优势的 4 种方式
+======
+
+> 使用开源技术可以帮助组织获得更好的业务结果。
+
+
+
+构建技术栈是每个组织的主要决策。选择合适的工具将让团队获得成功,选择错误的解决方案或平台会对生产率和利润率产生毁灭性影响。为了在当今快节奏的世界中脱颖而出,组织必须明智地选择数字解决方案,好的数字解决方案可以提升团队行动力与运营敏捷性。
+
+这就是为什么越来越多的组织都采用开源解决方案的原因,这些组织来自各行各业,规模有大有小。根据 [麦肯锡][2] 最近的报告,高绩效组织的最大区别是采用不同的开源方案。
+
+采用开源技术可以帮助组织提高竞争优势、获得更好业务成果的原因有以下四点。
+
+### 1、可拓展性和灵活性
+
+可以说,技术世界发展很快。例如,在 2014 年之前,Kubernetes 并不存在,但今天,它却令人印象深刻,无处不在。根据 CNCF [2020 云原生调查][3],91% 的团队正在以某种形式使用 Kubernetes。
+
+组织投资开源的一个主要原因是因为开源赋予组织行动敏捷性,组织可以迅速地将新技术集成到技术栈中。这与传统方法不同,在传统方法中,团队需要几个季度甚至几年来审查、实施、采用软件,这导致团队不可能实现火速转变。
+
+开源解决方案完整地提供源代码,团队可以轻松将软件与他们每天使用的工具连接起来。
+
+简而言之,开源让开发团队能够为手头的东西构建完美的工具,而不是被迫改变工作方式来适应不灵活的专有工具。
+
+### 2、安全性和高可信的协作
+
+在数据泄露备受瞩目的时代,组织需要高度安全的工具来保护敏感数据的安全。
+
+专有解决方案中的漏洞不易被发现,被发现时为时已晚。不幸的是,使用这些平台的团队无法看到源代码,本质上是他们将安全性外包给特定供应商,并希望得到最好的结果。
+
+采用开源的另一个主要原因是开源工具使组织能够自己把控安全。例如,开源项目——尤其是拥有大型开源社区的项目——往往会收到更负责任的漏洞披露,因为每个人在使用过程中都可以彻底检查源代码。
+
+由于源代码是免费提供的,因此披露通常伴随着修复缺陷的详细建议解决方案。这些方案使得开发团队能够快速解决问题,不断增强软件。
+
+在远程办公时代,对于分布式团队来说,在知道敏感数据受到保护的情况下进行协作比以往任何时候都更重要。开源解决方案允许组织审核安全性、完全掌控自己数据,因此开源方案可以促进远程环境下高可信协作方式的成长。
+
+### 3、不受供应商限制
+
+根据 [最近的一项研究][4],68% 的 CIO 担心受供应商限制。当你受限于一项技术中,你会被迫接受别人的结论,而不是自己做结论。
+
+当组织更换供应商时,专有解决方案通常会 [给你带走数据带来挑战][5]。另一方面,开源工具提供了组织需要的自由度和灵活性,以避免受供应商限制,开源工具可以让组织把数据带去任意地方。
+
+### 4、顶尖人才和社区
+
+随着越来越多的公司 [接受远程办公][6],人才争夺战变得愈发激烈。
+
+在软件开发领域,获得顶尖人才始于赋予工程师先进工具,让工程师在工作中充分发挥潜力。开发人员 [越来越喜欢开源解决方案][7] 而不是专有解决方案,组织应该强烈考虑用开源替代商业解决方案,以吸引市场上最好的开发人员。
+
+除了雇佣、留住顶尖人才更容易,公司能够通过开源平台利用贡献者社区,得到解决问题的建议,从平台中得到最大收益。此外,社区成员还可以 [直接为开源项目做贡献][8]。
+
+### 开源带来自由
+
+开源软件在企业团队中越来越受到欢迎——[这是有原因的][8]。它帮助团队灵活地构建完美的工作工具,同时使团队可以维护高度安全的环境。同时,开源允许团队掌控未来方向,而不是局限于供应商的路线图。开源还帮助公司接触才华横溢的工程师和开源社区成员。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/open-source-competitive-advantage
+
+作者:[Jason Blais][a]
+选题:[lujun9972][b]
+译者:[DCOLIVERSUN](https://github.com/DCOLIVERSUN)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jasonblais
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openwires_fromRHT_520_0612LL.png?itok=PqZi55Ab (Open ethernet cords.)
+[2]: https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/developer-velocity-how-software-excellence-fuels-business-performance#
+[3]: https://www.cncf.io/blog/2020/11/17/cloud-native-survey-2020-containers-in-production-jump-300-from-our-first-survey/
+[4]: https://solutionsreview.com/cloud-platforms/flexera-68-percent-of-cios-worry-about-vendor-lock-in-with-public-cloud/
+[5]: https://www.computerworld.com/article/3428679/mattermost-makes-case-for-open-source-as-team-messaging-market-booms.html
+[6]: https://mattermost.com/blog/tips-for-working-remotely/
+[7]: https://opensource.com/article/20/6/open-source-developers-survey
+[8]: https://mattermost.com/blog/100-most-popular-mattermost-features-invented-and-contributed-by-our-amazing-open-source-community/
+[9]: https://mattermost.com/open-source-advantage/
diff --git a/published/20210410 How to Install Steam on Fedora -Beginner-s Tip.md b/published/20210410 How to Install Steam on Fedora -Beginner-s Tip.md
new file mode 100644
index 0000000000..9aa71925fa
--- /dev/null
+++ b/published/20210410 How to Install Steam on Fedora -Beginner-s Tip.md
@@ -0,0 +1,119 @@
+[#]: subject: (How to Install Steam on Fedora [Beginner’s Tip])
+[#]: via: (https://itsfoss.com/install-steam-fedora/)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13302-1.html)
+
+如何在 Fedora 上安装 Steam
+======
+
+
+
+Steam 对 Linux 游戏玩家来说是最好的东西了。由于 Steam,你可以在 Linux 上玩成百上千的游戏。
+
+如果你还不知道,Steam 是最流行的 PC 游戏平台。2013 年,它开始可以在 Linux 使用。[Steam 最新的 Proton 项目][1] 允许你在 Linux 上玩为 Windows 平台创建的游戏。这让 Linux 游戏库增强了许多倍。
+
+![][2]
+
+Steam 提供了一个桌面客户端,你可以用它从 Steam 商店下载或购买游戏,然后安装并玩它。
+
+过去我们曾讨论过 [在 Ubuntu 上安装 Steam][3]。在这个初学者教程中,我将向你展示在 Fedora Linux 上安装 Steam 的步骤。
+
+### 在 Fedora 上安装 Steam
+
+要在 Fedora 上使用 Steam,你必须使用 RMPFusion 软件库。[RPMFusion][4] 是一套第三方软件库,其中包含了 Fedora 选择不与它们的操作系统一起发布的软件。它们提供自由(开源)和非自由(闭源)的软件库。由于 Steam 在非自由软件库中,你将只安装那一个。
+
+我将同时介绍终端和图形安装方法。
+
+#### 方法 1:通过终端安装 Steam
+
+这是最简单的方法,因为它需要的步骤最少。只需输入以下命令即可启用仓库:
+
+```
+sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
+```
+
+你会被要求输入密码。然后你会被要求验证是否要安装这些仓库。你同意后,仓库安装就会完成。
+
+要安装 Steam,只需输入以下命令:
+
+```
+sudo dnf install steam
+```
+
+![Install Steam via command line][5]
+
+输入密码后按 `Y` 接受。安装完毕后,打开 Steam,玩一些游戏。
+
+#### 方法 2:通过 GUI 安装 Steam
+
+你可以从软件中心 [启用 Fedora 上的第三方仓库][6]。打开软件中心并点击菜单。
+
+![][7]
+
+在 “软件仓库” 窗口中,你会看到顶部有一个 “第三方软件仓库”。点击 “安装” 按钮。当提示你输入密码时,就完成了。
+
+![][8]
+
+安装了 Steam 的 RPM Fusion 仓库后,更新你系统的软件缓存(如果需要),并在软件中心搜索 Steam。
+
+![Steam in GNOME Software Center][9]
+
+安装完成后,打开 GNOME 软件中心,搜索 Steam。找到 Steam 页面后,点击安装。当被问及密码时,输入你的密码就可以了。
+
+安装完 Steam 后,启动应用,输入你的 Steam 帐户详情或注册它,然后享受你的游戏。
+
+### 将 Steam 作为 Flatpak 使用
+
+Steam 也可以作为 Flatpak 使用。Fedora 上默认安装 Flatpak。在使用该方法安装 Steam 之前,我们必须安装 Flathub 仓库。
+
+![Install Flathub][10]
+
+首先,在浏览器中打开 [Flatpak 网站][11]。现在,点击标有 “Flathub repository file” 的蓝色按钮。浏览器会询问你是否要在 GNOME 软件中心打开该文件。点击确定。在 GNOME 软件中心打开后,点击安装按钮。系统会提示你输入密码。
+
+如果你在尝试安装 Flathub 仓库时出现错误,请在终端运行以下命令:
+
+```
+flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
+```
+
+安装好 Flathub 仓库后,你需要做的就是在 GNOME 软件中心搜索 Steam。找到后,安装它,你就可以开始玩了。
+
+![Fedora Repo Select][12]
+
+Flathub 版本的 Steam 也有几个附加组件可以安装。其中包括一个 DOS 兼容工具和几个 [Vulkan][13] 和 Proton 工具。
+
+![][14]
+
+我想这应该可以帮助你在 Fedora 上使用 Steam。享受你的游戏 :)
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-steam-fedora/
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/steam-play-proton/
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2017/05/Steam-Store.jpg?resize=800%2C382&ssl=1
+[3]: https://itsfoss.com/install-steam-ubuntu-linux/
+[4]: https://rpmfusion.org/
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/install-steam-fedora.png?resize=800%2C588&ssl=1
+[6]: https://itsfoss.com/fedora-third-party-repos/
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/software-meni.png?resize=800%2C672&ssl=1
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repo-gui.png?resize=746%2C800&ssl=1
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gnome-store-steam.jpg?resize=800%2C434&ssl=1
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/flatpak-install-button.jpg?resize=800%2C434&ssl=1
+[11]: https://www.flatpak.org/setup/Fedora/
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/fedora-repo-select.jpg?resize=800%2C434&ssl=1
+[13]: https://developer.nvidia.com/vulkan
+[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/steam-flatpak-addons.jpg?resize=800%2C434&ssl=1
diff --git a/published/20210412 6 open source tools and tips to securing a Linux server for beginners.md b/published/20210412 6 open source tools and tips to securing a Linux server for beginners.md
new file mode 100644
index 0000000000..ebc367d9ff
--- /dev/null
+++ b/published/20210412 6 open source tools and tips to securing a Linux server for beginners.md
@@ -0,0 +1,191 @@
+[#]: subject: (6 open source tools and tips to securing a Linux server for beginners)
+[#]: via: (https://opensource.com/article/21/4/securing-linux-servers)
+[#]: author: (Sahana Sreeram https://opensource.com/users/sahanasreeram01gmailcom)
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13298-1.html)
+
+6 个提升 Linux 服务器安全的开源工具和技巧
+======
+
+> 使用开源工具来保护你的 Linux 环境不被入侵。
+
+
+
+如今我们的许多个人和专业数据都可以在网上获得,因此无论是专业人士还是普通互联网用户,学习安全和隐私的基本知识是非常重要的。作为一名学生,我通过学校的 CyberPatriot 活动获得了这方面的经验,在那里我有机会与行业专家交流,了解网络漏洞和建立系统安全的基本步骤。
+
+本文基于我作为初学者迄今所学的知识,详细介绍了六个简单的步骤,以提高个人使用的 Linux 环境的安全性。在我的整个旅程中,我利用开源工具来加速我的学习过程,并熟悉了与提升 Linux 服务器安全有关的更高层次的概念。
+
+我使用我最熟悉的 Ubuntu 18.04 版本测试了这些步骤,但这些步骤也适用于其他 Linux 发行版。
+
+### 1、运行更新
+
+开发者们不断地寻找方法,通过修补已知的漏洞,使服务器更加稳定、快速、安全。定期运行更新是一个好习惯,可以最大限度地提高安全性。运行它们:
+
+```
+sudo apt-get update && apt-get upgrade
+```
+
+### 2、启用防火墙保护
+
+[启用防火墙][2] 可以更容易地控制服务器上的进站和出站流量。在 Linux 上有许多防火墙应用程序可以使用,包括 [firewall-cmd][3] 和 简单防火墙([UFW][4])。我使用 UFW,所以我的例子是专门针对它的,但这些原则适用于你选择的任何防火墙。
+
+安装 UFW:
+
+```
+sudo apt-get install ufw
+```
+
+如果你想进一步保护你的服务器,你可以拒绝传入和传出的连接。请注意,这将切断你的服务器与世界的联系,所以一旦你封锁了所有的流量,你必须指定哪些出站连接是允许从你的系统中发出的:
+
+```
+sudo ufw default deny incoming
+sudo ufw default allow outgoing
+```
+
+你也可以编写规则来允许你个人使用所需要的传入连接:
+
+```
+ufw allow
+```
+
+例如,允许 SSH 连接:
+
+```
+ufw allow ssh
+```
+
+最后,启用你的防火墙:
+
+```
+sudo ufw enable
+```
+
+### 3、加强密码保护
+
+实施强有力的密码政策是保持服务器安全、防止网络攻击和数据泄露的一个重要方面。密码策略的一些最佳实践包括强制要求最小长度和指定密码年龄。我使用 libpam-cracklib 软件包来完成这些任务。
+
+安装 libpam-cracklib 软件包:
+
+```
+sudo apt-get install libpam-cracklib
+```
+
+强制要求密码的长度:
+
+ * 打开 `/etc/pam.d/common-password` 文件。
+ * 将 `minlen=12` 行改为你需要的任意字符数,从而改变所有密码的最小字符长度要求。
+
+为防止密码重复使用:
+
+ * 在同一个文件(`/etc/pam.d/common-password`)中,添加 `remember=x` 行。
+ * 例如,如果你想防止用户重复使用他们最后 5 个密码中的一个,使用 `remember=5`。
+
+要强制要求密码年龄:
+
+ * 在 `/etc/login.defs` 文件中找到以下几行,并用你喜欢的时间(天数)替换。例如:
+
+```
+PASS_MIN_AGE: 3
+PASS_MAX_AGE: 90
+PASS_WARN_AGE: 14
+```
+
+强制要求字符规格:
+
+ * 在密码中强制要求字符规格的四个参数是 `lcredit`(小写)、`ucredit`(大写)、`dcredit`(数字)和 `ocredit`(其他字符)。
+ * 在同一个文件(`/etc/pam.d/common-password`)中,找到包含 `pam_cracklib.so` 的行。
+ * 在该行末尾添加以下内容:`lcredit=-a ucredit=-b dcredit=-c ocredit=-d`。
+ * 例如,下面这行要求密码必须至少包含一个每种字符。你可以根据你喜欢的密码安全级别来改变数字。`lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1`。
+
+### 4、停用容易被利用的非必要服务。
+
+停用不必要的服务是一种最好的做法。这样可以减少开放的端口,以便被利用。
+
+安装 systemd 软件包:
+
+```
+sudo apt-get install systemd
+```
+
+查看哪些服务正在运行:
+
+```
+systemctl list-units
+```
+
+[识别][5] 哪些服务可能会导致你的系统出现潜在的漏洞。对于每个服务可以:
+
+ * 停止当前正在运行的服务:`systemctl stop `。
+ * 禁止服务在系统启动时启动:`systemctl disable `。
+ * 运行这些命令后,检查服务的状态:`systemctl status `。
+
+### 5、检查监听端口
+
+开放的端口可能会带来安全风险,所以检查服务器上的监听端口很重要。我使用 [netstat][6] 命令来显示所有的网络连接:
+
+```
+netstat -tulpn
+```
+
+查看 “address” 列,确定 [端口号][7]。一旦你找到了开放的端口,检查它们是否都是必要的。如果不是,[调整你正在运行的服务][8],或者调整你的防火墙设置。
+
+### 6、扫描恶意软件
+
+杀毒扫描软件可以有用的防止病毒进入你的系统。使用它们是一种简单的方法,可以让你的服务器免受恶意软件的侵害。我首选的工具是开源软件 [ClamAV][9]。
+
+安装 ClamAV:
+
+```
+sudo apt-get install clamav
+```
+
+更新病毒签名:
+
+```
+sudo freshclam
+```
+
+扫描所有文件,并打印出被感染的文件,发现一个就会响铃:
+
+```
+sudo clamscan -r --bell -i /
+```
+
+你可以而且应该设置为自动扫描,这样你就不必记住或花时间手动进行扫描。对于这样简单的自动化,你可以使用 [systemd 定时器][10] 或者你的 [喜欢的 cron][11] 来做到。
+
+### 保证你的服务器安全
+
+我们不能把保护服务器安全的责任只交给一个人或一个组织。随着威胁环境的不断迅速扩大,我们每个人都应该意识到服务器安全的重要性,并采用一些简单、有效的安全最佳实践。
+
+这些只是你提升 Linux 服务器的安全可以采取的众多步骤中的一部分。当然,预防只是解决方案的一部分。这些策略应该与严格监控拒绝服务攻击、用 [Lynis][12] 做系统分析以及创建频繁的备份相结合。
+
+你使用哪些开源工具来保证服务器的安全?在评论中告诉我们它们的情况。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/securing-linux-servers
+
+作者:[Sahana Sreeram][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/sahanasreeram01gmailcom
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_linux11x_cc.png?itok=XMDOouJR (People work on a computer server with devices)
+[2]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd
+[3]: https://opensource.com/article/20/2/firewall-cheat-sheet
+[4]: https://wiki.ubuntu.com/UncomplicatedFirewall
+[5]: http://www.yorku.ca/infosec/Administrators/UNIX_disable.html
+[6]: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/netstat
+[7]: https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
+[8]: https://opensource.com/article/20/5/systemd-units
+[9]: https://www.clamav.net/
+[10]: https://opensource.com/article/20/7/systemd-timers
+[11]: https://opensource.com/article/21/2/linux-automation
+[12]: https://opensource.com/article/20/5/linux-security-lynis
diff --git a/published/20210412 Encrypt your files with this open source software.md b/published/20210412 Encrypt your files with this open source software.md
new file mode 100644
index 0000000000..bf2e9d9fd2
--- /dev/null
+++ b/published/20210412 Encrypt your files with this open source software.md
@@ -0,0 +1,87 @@
+[#]: subject: (Encrypt your files with this open source software)
+[#]: via: (https://opensource.com/article/21/4/open-source-encryption)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13304-1.html)
+
+用开源的 VeraCrypt 加密你的文件
+======
+
+> VeraCrypt 提供跨平台的开源文件加密功能。
+
+
+
+许多年前,有一个名为 [TrueCrypt][2] 的加密软件。它的源码是可以得到的,尽管没有任何人声称曾对它进行过审计或贡献过。它的作者是(至今仍是)匿名的。不过,它是跨平台的,易于使用,而且真的非常有用。
+
+TrueCrypt 允许你创建一个加密的文件“保险库”,在那里你可以存储任何类型的敏感信息(文本、音频、视频、图像、PDF 等)。只要你有正确的口令,TrueCrypt 就可以解密保险库,并在任何运行 TrueCrypt 的电脑上提供读写权限。这是一项有用的技术,它基本上提供了一个虚拟的、可移动的、完全加密的驱动器(除了文件以外),你可以在其中安全地存储你的数据。
+
+TrueCrypt 最终关闭了,但一个名为 VeraCrypt 的替代项目迅速兴起,填补了这一空白。[VeraCrypt][3] 基于 TrueCrypt 7.1a,比原来的版本有许多改进(包括标准加密卷和引导卷的算法的重大变化)。在 VeraCrypt 1.12 及以后的版本中,你可以使用自定义迭代来提高加密安全性。更好的是,VeraCrypt 可以加载旧的 TrueCrypt 卷,所以如果你是 TrueCrypt 用户,可以很容易地将它们转移到 VeraCrypt 上。
+
+### 安装 VeraCrypt
+
+你可以从 [VeraCrypt 下载页面][4] 下载相应的安装文件,之后在所有主流平台上安装 VeraCrypt。
+
+另外,你也可以自己从源码构建它。在 Linux 上,它需要 wxGTK3、makeself 和通常的开发栈(Binutils、GCC 等)。
+
+当你安装后,从你的应用菜单中启动 VeraCrypt。
+
+### 创建一个 VeraCrypt 卷
+
+如果你刚接触 VeraCrypt,你必须先创建一个 VeraCrypt 加密卷(否则,你没有任何东西可以解密)。在 VeraCrypt 窗口中,点击左侧的 “Create Volume” 按钮。
+
+![Creating a volume with VeraCrypt][5]
+
+在出现的 VeraCrypt 的卷创建向导窗口中,选择要创建一个加密文件容器还是要加密整个驱动器或分区。向导将为你的数据创建一个保险库,所以请按照提示进行操作。
+
+在本文中,我创建了一个文件容器。VeraCrypt 容器和其他文件很像:它保存在硬盘、外置硬盘、云存储或其他任何你能想到的存储数据的地方。与其他文件一样,它可以被移动、复制和删除。与大多数其他文件不同的是,它可以_容纳_更多的文件,这就是为什么我认为它是一个“保险库”,而 VeraCrypt 开发者将其称为“容器”。它的开发者将 VeraCrypt 文件称为“容器”,是因为它可以包含其他数据对象;它与 LXC、Kubernetes 和其他现代 IT 机制所流行的容器技术无关。
+
+#### 选择一个文件系统
+
+在创建卷的过程中,你会被要求选择一个文件系统来决定你放在保险库中的文件的存储方式。微软 FAT 格式是过时的、非日志型,并且限制了卷和文件的大小,但它是所有平台都能读写的一种格式。如果你打算让你的 VeraCrypt 保险库跨平台,FAT 是你最好的选择。
+
+除此之外,NTFS 适用于 Windows 和 Linux。开源的 EXT 系列适用于 Linux。
+
+### 挂载 VeraCrypt 加密卷
+
+当你创建了 VeraCrypt 卷,你就可以在 VeraCrypt 窗口中加载它。要挂载一个加密库,点击右侧的 “Select File” 按钮。选择你的加密文件,选择 VeraCrypt 窗口上半部分的一个编号栏,然后点击位于 VeraCrypt 窗口左下角的 “Mount” 按钮。
+
+你挂载的卷在 VeraCrypt 窗口的可用卷列表中,你可以通过文件管理器访问该卷,就像访问一个外部驱动器一样。例如,在 KDE 上,我打开 [Dolphin][7],进入 `/media/veracrypt1`,然后我就可以把文件复制到我的保险库里。
+
+只要你的设备上有 VeraCrypt,你就可以随时访问你的保险库。在你手动在 VeraCrypt 中挂载之前,文件都是加密的,在那里,文件会保持解密,直到你再次关闭卷。
+
+### 关闭 VeraCrypt 卷
+
+为了保证你的数据安全,当你不需要打开 VeraCrypt 卷时,关闭它是很重要的。这样可以保证数据的安全,不被人窥视,且不被人趁机犯罪。
+
+![Mounting a VeraCrypt volume][8]
+
+关闭 VeraCrypt 容器和打开容器一样简单。在 VeraCrypt 窗口中选择列出的卷,然后点击 “Dismount”。你就不能访问保险库中的文件了,其他人也不会再有访问权。
+
+### VeraCrypt 轻松实现跨平台加密
+
+有很多方法可以保证你的数据安全,VeraCrypt 试图为你提供方便,而无论你需要在什么平台上使用这些数据。如果你想体验简单、开源的文件加密,请尝试 VeraCrypt。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/open-source-encryption
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock)
+[2]: https://en.wikipedia.org/wiki/TrueCrypt
+[3]: https://www.veracrypt.fr/en/Home.html
+[4]: https://www.veracrypt.fr/en/Downloads.html
+[5]: https://opensource.com/sites/default/files/uploads/veracrypt-create.jpg (Creating a volume with VeraCrypt)
+[6]: https://creativecommons.org/licenses/by-sa/4.0/
+[7]: https://en.wikipedia.org/wiki/Dolphin_%28file_manager%29
+[8]: https://opensource.com/sites/default/files/uploads/veracrypt-volume.jpg (Mounting a VeraCrypt volume)
diff --git a/published/20210413 Create an encrypted file vault on Linux.md b/published/20210413 Create an encrypted file vault on Linux.md
new file mode 100644
index 0000000000..94dde76530
--- /dev/null
+++ b/published/20210413 Create an encrypted file vault on Linux.md
@@ -0,0 +1,113 @@
+[#]: subject: (Create an encrypted file vault on Linux)
+[#]: via: (https://opensource.com/article/21/4/linux-encryption)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13296-1.html)
+
+在 Linux 上创建一个加密文件保险库
+======
+
+> 使用 Linux 统一密钥设置(LUKS)为物理驱动器或云存储上的敏感文件创建一个加密保险库。
+
+
+
+最近,我演示了如何在 Linux 上使用统一密钥设置([LUKS][3])和 `cryptsetup` 命令 [实现全盘加密][2]。虽然加密整个硬盘在很多情况下是有用的,但也有一些原因让你不想对整个硬盘进行加密。例如,你可能需要让一个硬盘在多个平台上工作,其中一些平台可能没有集成 [LUKS][3]。此外,现在是 21 世纪,由于云的存在,你可能不会使用物理硬盘来处理所有的数据。
+
+几年前,有一个名为 [TrueCrypt][4] 的系统,允许用户创建加密的文件保险库,可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术,基本上提供了一个虚拟的便携式、完全加密的驱动器,你可以在那里存储重要数据。TrueCrypt 项目关闭了,但它可以作为一个有趣的模型。
+
+幸运的是,LUKS 是一个灵活的系统,你可以使用它和 `cryptsetup` 在一个独立的文件中创建一个加密保险库,你可以将其保存在物理驱动器或云存储中。
+
+下面就来介绍一下怎么做。
+
+### 1、建立一个空文件
+
+首先,你必须创建一个预定大小的空文件。就像是一种保险库或保险箱,你可以在其中存储其他文件。你使用的命令是 `util-linux` 软件包中的 `fallocate`:
+
+```
+$ fallocate --length 512M vaultfile.img
+```
+
+这个例子创建了一个 512MB 的文件,但你可以把你的文件做成任何你想要的大小。
+
+### 2、创建一个 LUKS 卷
+
+接下来,在空文件中创建一个 LUKS 卷:
+
+```
+$ cryptsetup --verify-passphrase \
+ luksFormat vaultfile.img
+```
+
+### 3、打开 LUKS 卷
+
+要想创建一个可以存储文件的文件系统,必须先打开 LUKS 卷,并将其挂载到电脑上:
+
+```
+$ sudo cryptsetup open \
+ --type luks vaultfile.img myvault
+$ ls /dev/mapper
+myvault
+```
+
+### 4、建立一个文件系统
+
+在你打开的保险库中建立一个文件系统:
+
+```
+$ sudo mkfs.ext4 -L myvault /dev/mapper/myvault
+```
+
+如果你现在不需要它做什么,你可以关闭它:
+
+```
+$ sudo cryptsetup close myvault
+```
+
+### 5、开始使用你的加密保险库
+
+现在一切都设置好了,你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库,必须将其挂载为一个可用的文件系统:
+
+```
+$ sudo cryptsetup open \
+ --type luks vaultfile.img myvault
+$ ls /dev/mapper
+myvault
+$ sudo mkdir /myvault
+$ sudo mount /dev/mapper/myvault /myvault
+```
+
+这个例子用 `cryptsetup` 打开保险库,然后把保险库从 `/dev/mapper` 下挂载到一个叫 `/myvault` 的新目录。和 Linux 上的任何卷一样,你可以把 LUKS 卷挂载到任何你想挂载的地方,所以除了 `/myvault`,你可以用 `/mnt` 或 `~/myvault` 或任何你喜欢的位置。
+
+当它被挂载后,你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它,就像它是一个物理驱动器一样。
+
+当使用完你的加密保险库时,请卸载并关闭它:
+
+```
+$ sudo umount /myvault
+$ sudo cryptsetup close myvault
+```
+
+### 加密的文件保险库
+
+你用 LUKS 加密的镜像文件和其他文件一样,都是可移动的,因此你可以将你的保险库存储在硬盘、外置硬盘,甚至是互联网上。只要你可以使用 LUKS,就可以解密、挂载和使用它来保证你的数据安全。轻松加密,提高数据安全性,不妨一试。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/linux-encryption
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/life_bank_vault_secure_safe.png?itok=YoW93h7C (Secure safe)
+[2]: https://opensource.com/article/21/3/encryption-luks
+[3]: https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md
+[4]: https://en.wikipedia.org/wiki/TrueCrypt
diff --git a/published/20210414 Make your data boss-friendly with this open source tool.md b/published/20210414 Make your data boss-friendly with this open source tool.md
new file mode 100644
index 0000000000..5104978e55
--- /dev/null
+++ b/published/20210414 Make your data boss-friendly with this open source tool.md
@@ -0,0 +1,108 @@
+[#]: subject: (Make your data boss-friendly with this open source tool)
+[#]: via: (https://opensource.com/article/21/4/visualize-data-eda)
+[#]: author: (Juanjo Ortilles https://opensource.com/users/jortilles)
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-13310-1.html)
+
+用这个开源工具让你的数据对老板友好起来
+======
+
+> 企业数据分析旨在将数据可视化带给日常商务用户。
+
+
+
+企业数据分析([EDA][2]) 是一个网页应用,它可以通过一个简单、清晰的界面来获取信息。
+
+在巴塞罗那开源分析公司 [Jortilles][3] 工作几年后,我们意识到,现代世界强制性地收集数据,但普通人没有简单的方法来查看或解释这些数据。有一些强大的开源工具可用于此目的,但它们非常复杂。我们找不到一个工具设计成能让没有什么技术能力的普通人轻松使用。
+
+我们之所以开发 EDA,是因为我们认为获取信息是现代组织的要求和义务,并希望为每个人提供获取信息的机会。
+
+![EDA interface][4]
+
+### 可视化你的数据
+
+EDA 使用人们已经理解的商业术语提供了一个数据模型。你可以选择你想要的信息,并可以以你想要的方式查看它。它的目标是对用户友好,同时又功能强大。
+
+EDA 通过元数据模型将数据库中的信息可视化和丰富化。它可以从 BigQuery、Postgres、[MariaDB、MySQL][6] 和其他一些数据库中读取数据。这就把技术性的数据库模型转化为熟悉的商业概念。
+
+它还设计为加快信息传播的速度,因为它可以利用已经存储在数据库中的数据。EDA 可以发现数据库的拓扑结构,并提出业务模型。如果你设计了一个好的数据库模型,你就有了一个好的业务模型。EDA 还可以连接到生产服务器,提供实时分析。
+
+这种数据和数据模型的结合意味着你和你组织中的任何人都可以分析其数据。然而,为了保护数据,你可以定义数据安全,可以精确到行,以授予正当的人访问正当的数据。
+
+EDA 的一些功能包括:
+
+ * 自动生成数据模型
+ * 一致的数据模型,防止出现不一致的查询
+ * 高级用户的 SQL 模式
+ * 数据可视化:
+ * 标准图表(如柱状图、饼状图、线状图、树状图)
+ * 地图整合(如 geoJSON shapefile、纬度、经度)
+ * 电子邮件提醒,可通过关键绩效指标 (KPI) 来定义
+ * 私人和公共信息控制,以启用私人和公共仪表板,你可以通过链接分享它。
+ * 数据缓存和程序刷新。
+
+### 如何使用 EDA
+
+用 EDA 实现数据可视化的第一步是创建数据模型。
+
+#### 创建数据模型
+
+首先,在左侧菜单中选择 “New Datasource”。
+
+接下来,选择你的数据存储的数据库系统(如 Postgres、MariaDB、MySQL、Vertica、SqlServer、Oracle、Big Query),并提供连接参数。
+
+EDA 将自动为你生成数据模型。它读取表和列,并为它们定义名称以及表之间的关系。你还可以通过添加虚拟视图或 geoJSON 图来丰富你的数据模型。
+
+#### 制作仪表板
+
+现在你已经准备好制作第一个仪表板了。在 EDA 界面的主页面上,你应该会看到一个 “New dashboard” 按钮。点击它,命名你的仪表板,并选择你创建的数据模型。新的仪表板将出现一个面板供你配置。
+
+要配置面板,请单击右上角的 “Configuration” 按钮,并选择你要做的事情。在 “Edit query” 中,选择你要显示的数据。这将出现一个新的窗口,你的数据模型由实体和实体的属性表示。选择你要查看的实体和你要使用的属性。例如,对于名为 “Customers” 的实体,你可能会显示 “Customer Name”,对于 “Sales” 实体,你可能希望显示 “Total Sales”。
+
+接下来,运行一个查询,并选择你想要的可视化。
+
+![EDA interface][7]
+
+你可以添加任意数量的面板、过滤器和文本字段,所有这些都有说明。当你保存仪表板后,你可以查看它,与同事分享,甚至发布到互联网上。
+
+### 获取 EDA
+
+最快的方法是用 [公开演示][8] 来查看 EDA。但如果你想自己试一试,可以用 Docker 获取最新的 EDA 版本:
+
+```
+$ docker run -p 80:80 jortilles / eda: latest
+```
+
+我们还有一个 SaaS 选项,适用于任何想要使用 EDA 而无需进行安装、配置和持续更新的用户。你可以在我们的网站上查看 [云选项][9]。
+
+如果你想看看它的实际运行情况,你可以在 YouTube 上观看一些 [演示][10]。
+
+EDA 正在持续开发中,你可以在 GitHub 上找到它的 [源代码][11]。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/visualize-data-eda
+
+作者:[Juanjo Ortilles][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jortilles
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen)
+[2]: https://eda.jortilles.com/en/jortilles-english/
+[3]: https://www.jortilles.com/
+[4]: https://opensource.com/sites/default/files/uploads/eda-display.jpeg (EDA interface)
+[5]: https://creativecommons.org/licenses/by-sa/4.0/
+[6]: https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet
+[7]: https://opensource.com/sites/default/files/uploads/eda-chart.jpeg (EDA interface)
+[8]: https://demoeda.jortilles.com/
+[9]: https://eda.jortilles.com
+[10]: https://youtu.be/cBAAJbohHXQ
+[11]: https://github.com/jortilles/EDA
diff --git a/sources/talk/20210419 13 ways to get involved with your favorite open source project.md b/sources/talk/20210419 13 ways to get involved with your favorite open source project.md
new file mode 100644
index 0000000000..809d8c4319
--- /dev/null
+++ b/sources/talk/20210419 13 ways to get involved with your favorite open source project.md
@@ -0,0 +1,116 @@
+[#]: subject: (13 ways to get involved with your favorite open source project)
+[#]: via: (https://opensource.com/article/21/4/open-source-project-level)
+[#]: author: (Mike Bursell https://opensource.com/users/mikecamel)
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+
+13 ways to get involved with your favorite open source project
+======
+Apply GET/SET principles to connecting with open source projects.
+![Looking at a map for career journey][1]
+
+Many of my [blog][2]'s readers already know lots about open source, but I'm also aware that many know little, if anything, about it. I'm a big, big proponent of open source software (and beyond, such as open hardware), and there are lots of great resources you can find to learn more about it.
+
+One very good starting point is the one you're now reading, Opensource.com. It's run by a bunch of brilliant people for the broader community by my current employer, Red Hat. (I should add a disclaimer that I'm not only employed by Red Hat but also a [Correspondent][3] at Opensource.com—a kind of frequent contributor/Elder Thing.) It has articles on pretty much every aspect of open source that you can imagine.
+
+I was thinking about APIs today (they're [in the news][4] as I'm writing this, after a US Supreme Court judgment on an argument between Google and Oracle), and it occurred to me that if I were interested in understanding how to interact with open source at the project level but didn't know much about it, then a quick guide might be useful. The same goes if I were involved in an open source project (e.g., [Enarx][5]) interested in attracting contributors (particularly techie contributors) who aren't already knowledgeable about open source.
+
+Given that most programmers will understand what GET and SET methods do (one reads data, the other writes data), I thought this might be a useful framework for considering engagement.[1][6] I'll start with GET, as that's how you're likely to be starting off—finding out more about the project—and then move to SET methods for getting involved with an open source project.
+
+This is far from an exhaustive list, but I hope that I've hit most of the key ways you're most likely to start getting involved or encouraging others to get involved. The order I've chosen reflects what I suspect is a fairly typical approach to finding out more about a project, particularly for those who aren't open source savvy already but, as they say, YMMV.[3][7]
+
+I've managed to stop myself from using Enarx (which I co-founded) as the sole source of examples and have tried to find a variety of projects to give you a taster. Disclaimer: their inclusion here does not mean that I am a user or contributor to the project, nor is it any guarantee of their open source credentials, code quality, up to date-ness, project maturity, or community health.[4][8]
+
+### GET methods
+
+ * **Landing page:** The first encounter you have with a project will probably be its landing page. Some projects go for something basic, others apply more design, but you should be able to use this as the starting point for your adventures around the project. You'd generally hope to find links to various of the other resources listed below from the landing page.
+ * See [Sigstore][9]'s landing page.
+ * **Wiki:** In many cases, the project will have a wiki. This could be simple, or it could be complex. It may allow editing by anyone or only by a select band of contributors to the project, and its relevance as a source of truth may be impacted by how up to date it is. Still, the wiki is usually an excellent place to start.
+ * See the [Fedora Project][10] wiki.
+ * **Videos:** Some projects maintain a set of videos about their project. These may include introductions to the concepts, talking-head interviews with team members, conference sessions, demos, how-tos, and more. It's also worth looking for videos put up by contributors to the project but not necessarily officially owned by the project.
+ * See [Rust Language][11] videos.
+ * **Code of conduct:** Many projects insist that their project members follow a code of conduct to reduce harassment, reduce friction, and generally make the project a friendly, more inclusive, and more diverse place to be.
+ * See the [Linux kernel][12]'s CoC.
+ * **Binary downloads:** As projects get more mature, they may choose to provide precompiled binary downloads for users. More technically inclined users may choose to compile their own binaries from the codebase (see below), but binary downloads can be a quick way to try out a project and see whether it does what you want.
+ * See the binaries from [Chocolate Doom][13] (a Doom port).
+ * **Design documentation:** Without design documentation, it can be very difficult to get really into a project. (I've written about the [importance of architecture diagrams][14] before.) This documentation is likely to include everything from an API definition to complex use cases and threat models.
+ * See [Kubernetes][15]' design docs.
+ * **Codebase:** You've found out all you need to get going: It's time to look at the code! This may vary from a few lines to many thousands, include documentation in comments, or include test cases, but if the code is not there, then the project can't legitimately call itself open source.
+ * See [Rocket Rust web framework][16]'s code.[5][17]
+ * **Email/chat:** Most projects like to have a way for contributors to discuss matters asynchronously. The preferred medium varies among projects, but most will choose an email list, a chat server, or both. These are where to get to know other users and contributors, ask questions, celebrate successful compiles, and just hang out.
+ * See [Enarx chat][18].
+ * **Meetups, videoconferences, calls, etc.:** Although in-person meetings are tricky for many at the moment (I'm writing as COVID-19 still reduces travel opportunities), having ways for community members and contributors to get together synchronously can be really helpful for everybody. Sometimes these are scheduled on a daily, weekly, or monthly basis; sometimes, they coincide with other, larger meetups, sometimes a project gets big enough to have its own meetups; sometimes, it's so big that there are meetups of subprojects or internal interest groups.
+ * See the [Linux Security Summit Europe][19].
+
+
+
+### PUT methods
+
+ * **Bug reports:** The first time many of us contribute anything substantive back to an open source project is when we file a bug report. Bug reports from new users can be really helpful for projects, as they not only expose bugs that may not already be known to the project, but they also give clues as to how actual users of the project are trying to use the code. If the project already publishes binary downloads (see above), you don't even need to compile the code to try it and submit a bug report. But bug reports related to compilation and build can also be extremely useful to the project. Sometimes, the mechanism for bug reporting also provides a way to ask more general questions about the project or to ask for new features.
+ * See the issues page for [exa][20] (a replacement for the _ls_ command).
+ * **Tests:** Once you've started using the project, another way to get involved (particularly once you start contributing code) can be to design and submit tests for how the project _ought_ to work. This can be a great way to unearth both your assumptions (and lack of knowledge!) about the project and the project's design assumptions (some of which may well be flawed). Tests are often part of the code repository, but not always.
+ * See [GNOME Shell][21]'s test repository.
+ * **Wiki:** A wiki can be a great way to contribute to the project, whether you're coding or not. Many projects don't have as much information available as they should, and that information may not be aimed at people coming to the project "fresh." If this is what you've done, then you're in a great position to write material that will help other "newbs" get into the project faster, as you'll know what would have helped you if it had been there.
+ * See the wiki for [Wine][22] (Windows Emulator for Linux).
+ * **Code:** Last but not least, you can write code. You may take hours, months, or years to get to this stage—or you may never reach it—but open source software is nothing without its code. If you've paid enough attention to the other steps, gotten involved in the community, understood what the project aims to do, and have the technical expertise (which you may well develop as you go!), then writing code may be the way you want to contribute.
+ * See [Enarx][23] (again).
+
+
+
+* * *
+
+ 1. I did consider standard RESTful verbs—GET, PUT, POST, and DELETE—but that felt rather contrived.[2][24]
+ 2. And I don't like the idea of DELETE in this context!
+ 3. "Your Mileage May Vary," meaning, basically, that your experience may be different, and that's to be expected.
+ 4. That said, I do use lots of them!
+ 5. I included this one because I've spent _far_ too much of my time looking at this over the past few months…
+
+
+
+* * *
+
+_This article was originally published on [Alice, Eve, and Bob][25] and is reprinted with the author's permission._
+
+Six non-code opportunities for contributing to open source software code and communities.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/open-source-project-level
+
+作者:[Mike Bursell][a]
+选题:[lujun9972][b]
+译者:[译者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/mikecamel
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/career_journey_road_gps_path_map_520.png?itok=PpL6jJgY (Looking at a map for career journey)
+[2]: https://aliceevebob.com/
+[3]: https://opensource.com/correspondent-program
+[4]: https://www.eff.org/deeplinks/2021/04/victory-fair-use-supreme-court-reverses-federal-circuit-oracle-v-google
+[5]: https://enarx.dev/
+[6]: tmp.WF7h0s934j#1
+[7]: tmp.WF7h0s934j#3
+[8]: tmp.WF7h0s934j#4
+[9]: https://sigstore.dev/
+[10]: https://fedoraproject.org/wiki/Fedora_Project_Wiki
+[11]: https://www.youtube.com/channel/UCaYhcUwRBNscFNUKTjgPFiA
+[12]: https://www.kernel.org/doc/html/latest/process/code-of-conduct.html
+[13]: https://www.chocolate-doom.org/wiki/index.php/Downloads
+[14]: https://opensource.com/article/20/5/diagrams-documentation
+[15]: https://kubernetes.io/docs/reference/
+[16]: https://github.com/SergioBenitez/Rocket/tree/v0.4
+[17]: tmp.WF7h0s934j#5
+[18]: https://chat.enarx.dev/
+[19]: https://events.linuxfoundation.org/linux-security-summit-europe/
+[20]: https://github.com/ogham/exa/issues
+[21]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/tests/interactive
+[22]: https://wiki.winehq.org/Main_Page
+[23]: https://github.com/enarx
+[24]: tmp.WF7h0s934j#2
+[25]: https://aliceevebob.com/2021/04/06/get-set-methods-for-open-source-projects/
diff --git a/sources/talk/20210419 21 reasons why I think everyone should try Linux.md b/sources/talk/20210419 21 reasons why I think everyone should try Linux.md
new file mode 100644
index 0000000000..fc2dffba07
--- /dev/null
+++ b/sources/talk/20210419 21 reasons why I think everyone should try Linux.md
@@ -0,0 +1,189 @@
+[#]: subject: (21 reasons why I think everyone should try Linux)
+[#]: via: (https://opensource.com/article/21/4/linux-reasons)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+
+21 reasons why I think everyone should try Linux
+======
+Gaming, business, budgeting, art, programming, and more. These are just
+a few of the many ways anyone can use Linux.
+![Linux keys on the keyboard for a desktop computer][1]
+
+When I go on holiday, I often end up at one or more used bookstores. I always find a good book I've been meaning to read, and I always justify the inevitable purchase by saying, "I'm on vacation; I should treat myself to this book." It works well, and I've acquired some of my favorite books this way. Yet, like so many traditions in life, it doesn't hold up to scrutiny. In reality, I don't need an excuse to buy a good book. All things being equal, I can do it any time I want. But having a reason does seem to make the process more enjoyable, somehow.
+
+In my everyday life, I get a lot of questions about Linux. When caught unaware, I sometimes awkwardly ramble on about the history of open source software or the intellectual and economic benefits of sharing resources. Sometimes, I manage to mention some of my favorite features I enjoy on Linux and then end up reverse-engineering those benefits so they can be enjoyed on another operating system. These discussions are usually enjoyable and informative, but there's just one problem: None of it answers the question that people are really asking.
+
+When a person asks you about Linux, they're often asking you to give them a reason to try it. There are exceptions, of course. People who have never heard the term "Linux" are probably asking for a literal definition of the word. But when your friends and colleagues confide that they're a little dissatisfied with their current operating system, it's probably safe to explain why you enjoy Linux, rather than lecturing them on why Linux is a better option than proprietary systems. In other words, you don't need a sales presentation; you need vacation photos (or used books you bought on vacation, if you're a bookworm).
+
+To that end, the links below connect to 21 reasons I enjoy Linux, given to 21 separate people on 21 separate occasions.
+
+### Gaming
+
+![Gaming on Linux][2]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+When it comes to enjoying a computer, one of the most obvious activities is gaming, and when it comes to gaming, I love it all. I'm happy to spend an evening playing an 8-bit puzzler or a triple-A studio epic. Other times, I settle in for a board game or a tabletop role-playing game (RPG).
+
+And I [do it all on a Linux computer][4].
+
+### Office
+
+![LibreOffice][5]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+One size doesn't fit all. This is as true for hats as it is for office work. It pains me to see colleagues locked into a singular workflow that doesn't suit them, and I enjoy the way Linux encourages users to find tools they love. I've used office applications ranging from big suites (like LibreOffice and OpenOffice) to lightweight word processors (such as Abiword) to minimal text editors (with Pandoc for conversion).
+
+Regardless of what users around me are locked into, I have [the freedom to use the tools that work best][6] on my computer and with the way I want to work.
+
+### Choice
+
+![Linux login screen][7]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+One of open source's most valuable traits is the trust it allows users to have in the software they use. This trust is derived from a network of friends who can read the source code of the applications and operating systems they use. That means, even if you don't know good source code from bad, you can make friends within the [open source community][8] who do. These are important connections that Linux users can make as they explore the distribution they run. If you don't trust the community that builds and maintains a distribution, you can and should move to a different distribution. Many of us have done it, and it's one of the strengths of having many distros to choose from.
+
+[Linux offers choice][9] as a feature. A strong community, filled with real human connections, combined with the freedom of choice that Linux provides all give users confidence in the software they run. Because I've read some source code, and because I trust the people who maintain the code I haven't read, [I trust Linux][10].
+
+### Budgeting
+
+![Skrooge][11]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+Budgeting isn't fun, but it's important. I learned early, while working menial jobs as I learned a _free_ operating system (Linux!) in my free time, that a budget isn't meant to track your money so much as it tracks your habits. That means that whether you're living paycheck to paycheck or you're well on the way to planning your retirement, you should [maintain a budget][12].
+
+If you're in the United States, you can even [pay your taxes on Linux][13].
+
+### Art
+
+![MyPaint][14]
+
+(Dogchicken, [CC BY-SA 4.0][3])
+
+It doesn't matter whether you paint or do pixel art, [edit video][15], or scratch records, you can create great content on Linux. Some of the best art I've seen has been casually made with tools that aren't "industry standard," and it might surprise you just how much of the content you see is made the same way. Linux is a quiet engine, but it's a powerful one that drives indie artists as well as big producers.
+
+Try using Linux [to create some art][16].
+
+### Programming
+
+![NetBeans][17]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+Look, using Linux to program is almost a foregone conclusion. Second only to server administration, open source code and Linux are an obvious combination. There are [many reasons for this][18], but the one I cite is that it's just more fun. I run into plenty of roadblocks when inventing something new, so the last thing I need is for an operating system or software development kit (SDK) to be the reason for failure. On Linux, I have access to everything. Literally everything.
+
+### Packaging
+
+![Packaging GNOME software][19]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+The thing nobody talks about when they tell you about programming is _packaging_. As a developer, you have to get your code to your users, or you won't have any users. Linux makes it easy for developers [to deliver apps][20] and easy for users to [install those applications][21].
+
+It surprises many people, but [Linux can run many Windows applications][22] as if they were native apps. You shouldn't expect a Windows application to be executable on Linux. Still, many of the major common applications either already exist natively on Linux or else can be run through a compatibility layer called Wine.
+
+### Technology
+
+![Data center][23]
+
+([Taylor Vick][24], [Unsplash License][25])
+
+If you're looking for a career in IT, Linux is a great first step. As a former art student who stumbled into Linux to render video faster, I speak from experience!
+
+Cutting-edge technology happens on Linux. Linux drives most of the internet, most of the world's fastest supercomputers, and the cloud itself. Today, Linux drives [edge computing][26], combining the power of cloud data centers with decentralized nodes for quick response.
+
+You don't have to start at the top, though. You can learn to [automate][27] tasks on your laptop or desktop and remotely control systems with a [good terminal][28].
+
+Linux is open to your new ideas and [available for customization][29].
+
+### Share files
+
+![Beach with cloudy sky][30]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+Whether you're a fledgling sysadmin or just a housemate with files to distribute to friends, Linux makes [file sharing a breeze][31].
+
+### Media
+
+![Waterfall][32]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+With all the talk about programming and servers, people sometimes envision Linux as just a black screen filled with green 1's and 0's. Unsurprisingly to those of us who use it, Linux [plays all your media][33], too.
+
+### Easy install
+
+![CentOS installation][34]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+Never installed an operating system before? Linux is shockingly easy. Step-by-step, Linux installers hold your hand through an operating system installation to make you feel like a computer expert in under an hour.
+
+[Go install Linux][35]!
+
+### Try Linux
+
+![Porteus][36]
+
+(Seth Kenlon, [CC BY-SA 4.0][3])
+
+If you're not ready to install Linux, then you can _try_ Linux instead. No idea where to start? It's less intimidating than you may think. Here are some [things you should consider first][37]. Then take your pick, download a distro, and come up with your own 21 reasons to use Linux.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/linux-reasons
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者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/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer)
+[2]: https://opensource.com/sites/default/files/uploads/game_0ad-egyptianpyramids.jpg (Gaming on Linux)
+[3]: https://creativecommons.org/licenses/by-sa/4.0/
+[4]: https://opensource.com/article/21/2/linux-gaming
+[5]: https://opensource.com/sites/default/files/uploads/office_libreoffice.jpg (LibreOffice)
+[6]: https://opensource.com/article/21/2/linux-workday
+[7]: https://opensource.com/sites/default/files/uploads/trust_sddm.jpg (Linux login screen)
+[8]: https://opensource.com/article/21/2/linux-community
+[9]: https://opensource.com/article/21/2/linux-choice
+[10]: https://opensource.com/article/21/2/open-source-security
+[11]: https://opensource.com/sites/default/files/uploads/skrooge_1.jpg (Skrooge)
+[12]: https://opensource.com/article/21/2/linux-skrooge
+[13]: https://opensource.com/article/21/2/linux-tax-software
+[14]: https://opensource.com/sites/default/files/uploads/art_mypaint.jpg (MyPaint)
+[15]: https://opensource.com/article/21/2/linux-python-video
+[16]: https://opensource.com/article/21/2/linux-art-design
+[17]: https://opensource.com/sites/default/files/uploads/programming_java-netbeans.jpg (NetBeans)
+[18]: https://opensource.com/article/21/2/linux-programming
+[19]: https://opensource.com/sites/default/files/uploads/packaging_gnome-software.png (Packaging GNOME software)
+[20]: https://opensource.com/article/21/2/linux-packaging
+[21]: https://opensource.com/article/21/2/linux-package-management
+[22]: https://opensource.com/article/21/2/linux-wine
+[23]: https://opensource.com/sites/default/files/uploads/edge_taylorvick-unsplash.jpg (Data center)
+[24]: https://unsplash.com/@tvick
+[25]: https://unsplash.com/license
+[26]: https://opensource.com/article/21/2/linux-edge-computing
+[27]: https://opensource.com/article/21/2/linux-automation
+[28]: https://opensource.com/article/21/2/linux-terminals
+[29]: https://opensource.com/article/21/2/linux-technology
+[30]: https://opensource.com/sites/default/files/uploads/cloud_beach-sethkenlon.jpg (Beach with cloudy sky)
+[31]: https://opensource.com/article/21/3/linux-server
+[32]: https://opensource.com/sites/default/files/uploads/media_waterfall.jpg (Waterfall)
+[33]: https://opensource.com/article/21/2/linux-media-players
+[34]: https://opensource.com/sites/default/files/uploads/install_centos8.jpg (CentOS installation)
+[35]: https://opensource.com/article/21/2/linux-installation
+[36]: https://opensource.com/sites/default/files/uploads/porteus_0.jpg (Porteus)
+[37]: https://opensource.com/article/21/2/try-linux
diff --git a/sources/tech/20200223 The Zen of Go.md b/sources/tech/20200223 The Zen of Go.md
index 249c3790cd..c4143aed32 100644
--- a/sources/tech/20200223 The Zen of Go.md
+++ b/sources/tech/20200223 The Zen of Go.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( chensanle )
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20200707 Use systemd timers instead of cronjobs.md b/sources/tech/20200707 Use systemd timers instead of cronjobs.md
deleted file mode 100644
index b09dc86034..0000000000
--- a/sources/tech/20200707 Use systemd timers instead of cronjobs.md
+++ /dev/null
@@ -1,551 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Use systemd timers instead of cronjobs)
-[#]: via: (https://opensource.com/article/20/7/systemd-timers)
-[#]: author: (David Both https://opensource.com/users/dboth)
-
-Use systemd timers instead of cronjobs
-======
-Timers provide finer-grained control of events than cronjobs.
-![Team checklist][1]
-
-I am in the process of converting my [cron][2] jobs to systemd timers. I have used timers for a few years, but usually, I learned just enough to perform the task I was working on. While doing research for this [systemd series][3], I learned that systemd timers have some very interesting capabilities.
-
-Like cron jobs, systemd timers can trigger events—shell scripts and programs—at specified time intervals, such as once a day, on a specific day of the month (perhaps only if it is a Monday), or every 15 minutes during business hours from 8am to 6pm. Timers can also do some things that cron jobs cannot. For example, a timer can trigger a script or program to run a specific amount of time after an event such as boot, startup, completion of a previous task, or even the previous completion of the service unit called by the timer.
-
-### System maintenance timers
-
-When Fedora or any systemd-based distribution is installed on a new system, it creates several timers that are part of the system maintenance procedures that happen in the background of any Linux host. These timers trigger events necessary for common maintenance tasks, such as updating system databases, cleaning temporary directories, rotating log files, and more.
-
-As an example, I'll look at some of the timers on my primary workstation by using the `systemctl status *timer` command to list all the timers on my host. The asterisk symbol works the same as it does for file globbing, so this command lists all systemd timer units:
-
-
-```
-[root@testvm1 ~]# systemctl status *timer
-● mlocate-updatedb.timer - Updates mlocate database every day
- Loaded: loaded (/usr/lib/systemd/system/mlocate-updatedb.timer; enabled; vendor preset: enabled)
- Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
- Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
- Triggers: ● mlocate-updatedb.service
-
-Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Updates mlocate database every day.
-
-● logrotate.timer - Daily rotation of log files
- Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
- Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
- Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
- Triggers: ● logrotate.service
- Docs: man:logrotate(8)
- man:logrotate.conf(5)
-
-Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily rotation of log files.
-
-● sysstat-summary.timer - Generate summary of yesterday's process accounting
- Loaded: loaded (/usr/lib/systemd/system/sysstat-summary.timer; enabled; vendor preset: enabled)
- Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
- Trigger: Fri 2020-06-05 00:07:00 EDT; 15h left
- Triggers: ● sysstat-summary.service
-
-Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Generate summary of yesterday's process accounting.
-
-● fstrim.timer - Discard unused blocks once a week
- Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
- Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
- Trigger: Mon 2020-06-08 00:00:00 EDT; 3 days left
- Triggers: ● fstrim.service
- Docs: man:fstrim
-
-Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Discard unused blocks once a week.
-
-● sysstat-collect.timer - Run system activity accounting tool every 10 minutes
- Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: enabled)
- Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
- Trigger: Thu 2020-06-04 08:50:00 EDT; 41s left
- Triggers: ● sysstat-collect.service
-
-Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Run system activity accounting tool every 10 minutes.
-
-● dnf-makecache.timer - dnf makecache --timer
- Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; vendor preset: enabled)
- Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
- Trigger: Thu 2020-06-04 08:51:00 EDT; 1min 41s left
- Triggers: ● dnf-makecache.service
-
-Jun 02 08:02:33 testvm1.both.org systemd[1]: Started dnf makecache –timer.
-
-● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
- Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
- Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
- Trigger: Fri 2020-06-05 08:19:00 EDT; 23h left
- Triggers: ● systemd-tmpfiles-clean.service
- Docs: man:tmpfiles.d(5)
- man:systemd-tmpfiles(8)
-
-Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily Cleanup of Temporary Directories.
-```
-
-Each timer has at least six lines of information associated with it:
-
- * The first line has the timer's file name and a short description of its purpose.
- * The second line displays the timer's status, whether it is loaded, the full path to the timer unit file, and the vendor preset.
- * The third line indicates its active status, which includes the date and time the timer became active.
- * The fourth line contains the date and time the timer will be triggered next and an approximate time until the trigger occurs.
- * The fifth line shows the name of the event or the service that is triggered by the timer.
- * Some (but not all) systemd unit files have pointers to the relevant documentation. Three of the timers in my virtual machine's output have pointers to documentation. This is a nice (but optional) bit of data.
- * The final line is the journal entry for the most recent instance of the service triggered by the timer.
-
-
-
-Depending upon your host, you will probably have a different set of timers.
-
-### Create a timer
-
-Although we can deconstruct one or more of the existing timers to learn how they work, let’s create our own [service unit][4] and a timer unit to trigger it. We will use a fairly trivial example in order to keep this simple. After we have finished this, it will be easier to understand how the other timers work and to determine what they are doing.
-
-First, create a simple service that will run something basic, such as the `free` command. For example, you may want to monitor free memory at regular intervals. Create the following `myMonitor.service` unit file in the `/etc/systemd/system` directory. It does not need to be executable:
-
-
-```
-# This service unit is for testing timer units
-# By David Both
-# Licensed under GPL V2
-#
-
-[Unit]
-Description=Logs system statistics to the systemd journal
-Wants=myMonitor.timer
-
-[Service]
-Type=oneshot
-ExecStart=/usr/bin/free
-
-[Install]
-WantedBy=multi-user.target
-```
-
-This is about the simplest service unit you can create. Now let’s look at the status and test our service unit to ensure that it works as we expect it to.
-
-
-```
-[root@testvm1 system]# systemctl status myMonitor.service
-● myMonitor.service - Logs system statistics to the systemd journal
- Loaded: loaded (/etc/systemd/system/myMonitor.service; disabled; vendor preset: disabled)
- Active: inactive (dead)
-[root@testvm1 system]# systemctl start myMonitor.service
-[root@testvm1 system]#
-```
-
-Where is the output? By default, the standard output (`STDOUT`) from programs run by systemd service units is sent to the systemd journal, which leaves a record you can view now or later—up to a point. (I will look at systemd journaling and retention strategies in a future article in this series.) Look at the journal specifically for your service unit and for today only. The `-S` option, which is the short version of `--since`, allows you to specify the time period that the `journalctl` tool should search for entries. This isn't because you don't care about previous results—in this case, there won't be any—it is to shorten the search time if your host has been running for a long time and has accumulated a large number of entries in the journal:
-
-
-```
-[root@testvm1 system]# journalctl -S today -u myMonitor.service
-\-- Logs begin at Mon 2020-06-08 07:47:20 EDT, end at Thu 2020-06-11 09:40:47 EDT. --
-Jun 11 09:12:09 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
-Jun 11 09:12:09 testvm1.both.org free[377966]: total used free shared buff/cache available
-Jun 11 09:12:09 testvm1.both.org free[377966]: Mem: 12635740 522868 11032860 8016 1080012 11821508
-Jun 11 09:12:09 testvm1.both.org free[377966]: Swap: 8388604 0 8388604
-Jun 11 09:12:09 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
-[root@testvm1 system]#
-```
-
-A task triggered by a service can be a single program, a series of programs, or a script written in any scripting language. Add another task to the service by adding the following line to the end of the `[Service]` section of the `myMonitor.service` unit file:
-
-
-```
-`ExecStart=/usr/bin/lsblk`
-```
-
-Start the service again and check the journal for the results, which should look like this. You should see the results from both commands in the journal:
-
-
-```
-Jun 11 15:42:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
-Jun 11 15:42:18 testvm1.both.org free[379961]: total used free shared buff/cache available
-Jun 11 15:42:18 testvm1.both.org free[379961]: Mem: 12635740 531788 11019540 8024 1084412 11812272
-Jun 11 15:42:18 testvm1.both.org free[379961]: Swap: 8388604 0 8388604
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sda 8:0 0 120G 0 disk
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─sda1 8:1 0 4G 0 part /boot
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─sda2 8:2 0 116G 0 part
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-root 253:0 0 5G 0 lvm /
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: ├─VG01-var 253:4 0 20G 0 lvm /var
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: └─VG01-home 253:5 0 10G 0 lvm /home
-Jun 11 15:42:18 testvm1.both.org lsblk[379962]: sr0 11:0 1 1024M 0 rom
-Jun 11 15:42:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
-Jun 11 15:42:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
-```
-
-Now that you know your service works as expected, create the timer unit file, `myMonitor.timer` in `/etc/systemd/system`, and add the following:
-
-
-```
-# This timer unit is for testing
-# By David Both
-# Licensed under GPL V2
-#
-
-[Unit]
-Description=Logs some system statistics to the systemd journal
-Requires=myMonitor.service
-
-[Timer]
-Unit=myMonitor.service
-OnCalendar=*-*-* *:*:00
-
-[Install]
-WantedBy=timers.target
-```
-
-The `OnCalendar` time specification in the `myMonitor.timer file`, `*-*-* *:*:00`, should trigger the timer to execute the `myMonitor.service` unit every minute. I will explore `OnCalendar` settings a bit later in this article.
-
-For now, observe any journal entries pertaining to running your service when it is triggered by the timer. You could also follow the timer, but following the service allows you to see the results in near real time. Run `journalctl` with the `-f` (follow) option:
-
-
-```
-[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
-\-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --
-```
-
-Start but do not enable the timer, and see what happens after it runs for a while:
-
-
-```
-[root@testvm1 ~]# systemctl start myMonitor.service
-[root@testvm1 ~]#
-```
-
-One result shows up right away, and the next ones come at—sort of—one-minute intervals. Watch the journal for a few minutes and see if you notice the same things I did:
-
-
-```
-[root@testvm1 system]# journalctl -S today -f -u myMonitor.service
-\-- Logs begin at Mon 2020-06-08 07:47:20 EDT. --
-Jun 13 08:39:18 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
-Jun 13 08:39:18 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
-Jun 13 08:39:19 testvm1.both.org free[630566]: total used free shared buff/cache available
-Jun 13 08:39:19 testvm1.both.org free[630566]: Mem: 12635740 556604 10965516 8036 1113620 11785628
-Jun 13 08:39:19 testvm1.both.org free[630566]: Swap: 8388604 0 8388604
-Jun 13 08:39:18 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sda 8:0 0 120G 0 disk
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─sda1 8:1 0 4G 0 part /boot
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─sda2 8:2 0 116G 0 part
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-root 253:0 0 5G 0 lvm /
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: ├─VG01-var 253:4 0 20G 0 lvm /var
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: └─VG01-home 253:5 0 10G 0 lvm /home
-Jun 13 08:39:19 testvm1.both.org lsblk[630567]: sr0 11:0 1 1024M 0 rom
-Jun 13 08:40:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
-Jun 13 08:40:46 testvm1.both.org free[630572]: total used free shared buff/cache available
-Jun 13 08:40:46 testvm1.both.org free[630572]: Mem: 12635740 555228 10966836 8036 1113676 11786996
-Jun 13 08:40:46 testvm1.both.org free[630572]: Swap: 8388604 0 8388604
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sda 8:0 0 120G 0 disk
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─sda1 8:1 0 4G 0 part /boot
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─sda2 8:2 0 116G 0 part
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-root 253:0 0 5G 0 lvm /
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: ├─VG01-var 253:4 0 20G 0 lvm /var
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: └─VG01-home 253:5 0 10G 0 lvm /home
-Jun 13 08:40:46 testvm1.both.org lsblk[630574]: sr0 11:0 1 1024M 0 rom
-Jun 13 08:40:46 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
-Jun 13 08:40:46 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
-Jun 13 08:41:46 testvm1.both.org systemd[1]: Starting Logs system statistics to the systemd journal...
-Jun 13 08:41:46 testvm1.both.org free[630580]: total used free shared buff/cache available
-Jun 13 08:41:46 testvm1.both.org free[630580]: Mem: 12635740 553488 10968564 8036 1113688 11788744
-Jun 13 08:41:46 testvm1.both.org free[630580]: Swap: 8388604 0 8388604
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sda 8:0 0 120G 0 disk
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─sda1 8:1 0 4G 0 part /boot
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─sda2 8:2 0 116G 0 part
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-root 253:0 0 5G 0 lvm /
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-swap 253:1 0 8G 0 lvm [SWAP]
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-usr 253:2 0 30G 0 lvm /usr
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-tmp 253:3 0 10G 0 lvm /tmp
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: ├─VG01-var 253:4 0 20G 0 lvm /var
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: └─VG01-home 253:5 0 10G 0 lvm /home
-Jun 13 08:41:47 testvm1.both.org lsblk[630581]: sr0 11:0 1 1024M 0 rom
-Jun 13 08:41:47 testvm1.both.org systemd[1]: myMonitor.service: Succeeded.
-Jun 13 08:41:47 testvm1.both.org systemd[1]: Finished Logs system statistics to the systemd journal.
-```
-
-Be sure to check the status of both the timer and the service.
-
-You probably noticed at least two things in the journal. First, you do not need to do anything special to cause the `STDOUT` from the `ExecStart` triggers in the `myMonitor.service` unit to be stored in the journal. That is all part of using systemd for running services. However, it does mean that you might need to be careful about running scripts from a service unit and how much `STDOUT` they generate.
-
-The second thing is that the timer does not trigger exactly on the minute at :00 seconds or even exactly one minute from the previous instance. This is intentional, but it can be overridden if necessary (or if it just offends your sysadmin sensibilities).
-
-The reason for this behavior is to prevent multiple services from triggering at exactly the same time. For example, you can use time specifications such as Weekly, Daily, and more. These shortcuts are all defined to trigger at 00:00:00 hours on the day they are triggered. When multiple timers are specified this way, there is a strong likelihood that they would attempt to start simultaneously.
-
-systemd timers are intentionally designed to trigger somewhat randomly around the specified time to try to prevent simultaneous triggers. They trigger semi-randomly within a time window that starts at the specified trigger time and ends at the specified time plus one minute. This trigger time is maintained at a stable position with respect to all other defined timer units, according to the `systemd.timer` man page. You can see in the journal entries above that the timer triggered immediately when it started and then about 46 or 47 seconds after each minute.
-
-Most of the time, such probabilistic trigger times are fine. When scheduling tasks such as backups to run, so long as they run during off-hours, there will be no problems. A sysadmin can select a deterministic start time, such as 01:05:00 in a typical cron job specification, to not conflict with other tasks, but there is a large range of time values that will accomplish that. A one-minute bit of randomness in a start time is usually irrelevant.
-
-However, for some tasks, exact trigger times are an absolute requirement. For those, you can specify greater trigger time-span accuracy (to within a microsecond) by adding a statement like this to the `Timer` section of the timer unit file:
-
-
-```
-`AccuracySec=1us`
-```
-
-Time spans can be used to specify the desired accuracy as well as to define time spans for repeating or one-time events. It recognizes the following units:
-
- * usec, us, µs
- * msec, ms
- * seconds, second, sec, s
- * minutes, minute, min, m
- * hours, hour, hr, h
- * days, day, d
- * weeks, week, w
- * months, month, M (defined as 30.44 days)
- * years, year, y (defined as 365.25 days)
-
-
-
-All the default timers in `/usr/lib/systemd/system` specify a much larger range for accuracy because exact times are not critical. Look at some of the specifications in the system-created timers:
-
-
-```
-[root@testvm1 system]# grep Accur /usr/lib/systemd/system/*timer
-/usr/lib/systemd/system/fstrim.timer:AccuracySec=1h
-/usr/lib/systemd/system/logrotate.timer:AccuracySec=1h
-/usr/lib/systemd/system/logwatch.timer:AccuracySec=12h
-/usr/lib/systemd/system/mlocate-updatedb.timer:AccuracySec=24h
-/usr/lib/systemd/system/raid-check.timer:AccuracySec=24h
-/usr/lib/systemd/system/unbound-anchor.timer:AccuracySec=24h
-[root@testvm1 system]#
-```
-
-View the complete contents of some of the timer unit files in the `/usr/lib/systemd/system` directory to see how they are constructed.
-
-You do not have to enable the timer in this experiment to activate it at boot time, but the command to do so would be:
-
-
-```
-`[root@testvm1 system]# systemctl enable myMonitor.timer`
-```
-
-The unit files you created do not need to be executable. You also did not enable the service unit because it is triggered by the timer. You can still trigger the service unit manually from the command line, should you want to. Try that and observe the journal.
-
-See the man pages for `systemd.timer` and `systemd.time` for more information about timer accuracy, event-time specifications, and trigger events.
-
-### Timer types
-
-systemd timers have other capabilities that are not found in cron, which triggers only on specific, repetitive, real-time dates and times. systemd timers can be configured to trigger based on status changes in other systemd units. For example, a timer might be configured to trigger a specific elapsed time after system boot, after startup, or after a defined service unit activates. These are called monotonic timers. Monotonic refers to a count or sequence that continually increases. These timers are not persistent because they reset after each boot.
-
-Table 1 lists the monotonic timers along with a short definition of each, as well as the `OnCalendar` timer, which is not monotonic and is used to specify future times that may or may not be repetitive. This information is derived from the `systemd.timer` man page with a few minor changes.
-
-Timer | Monotonic | Definition
----|---|---
-`OnActiveSec=` | X | This defines a timer relative to the moment the timer is activated.
-`OnBootSec=` | X | This defines a timer relative to when the machine boots up.
-`OnStartupSec=` | X | This defines a timer relative to when the service manager first starts. For system timer units, this is very similar to `OnBootSec=`, as the system service manager generally starts very early at boot. It's primarily useful when configured in units running in the per-user service manager, as the user service manager generally starts on first login only, not during boot.
-`OnUnitActiveSec=` | X | This defines a timer relative to when the timer that is to be activated was last activated.
-`OnUnitInactiveSec=` | X | This defines a timer relative to when the timer that is to be activated was last deactivated.
-`OnCalendar=` | | This defines real-time (i.e., wall clock) timers with calendar event expressions. See `systemd.time(7)` for more information on the syntax of calendar event expressions. Otherwise, the semantics are similar to `OnActiveSec=` and related settings. This timer is the one most like those used with the cron service.
-
-_Table 1: systemd timer definitions_
-
-The monotonic timers can use the same shortcut names for their time spans as the `AccuracySec` statement mentioned before, but systemd normalizes those names to seconds. For example, you might want to specify a timer that triggers an event one time, five days after the system boots; that might look like: `OnBootSec=5d`. If the host booted at `2020-06-15 09:45:27`, the timer would trigger at `2020-06-20 09:45:27` or within one minute after.
-
-### Calendar event specifications
-
-Calendar event specifications are a key part of triggering timers at desired repetitive times. Start by looking at some specifications used with the `OnCalendar` setting.
-
-systemd and its timers use a different style for time and date specifications than the format used in crontab. It is more flexible than crontab and allows fuzzy dates and times in the manner of the `at` command. It should also be familiar enough that it will be easy to understand.
-
-The basic format for systemd timers using `OnCalendar=` is `DOW YYYY-MM-DD HH:MM:SS`. DOW (day of week) is optional, and other fields can use an asterisk (*) to match any value for that position. All calendar time forms are converted to a normalized form. If the time is not specified, it is assumed to be 00:00:00. If the date is not specified but the time is, the next match might be today or tomorrow, depending upon the current time. Names or numbers can be used for the month and day of the week. Comma-separated lists of each unit can be specified. Unit ranges can be specified with `..` between the beginning and ending values.
-
-There are a couple interesting options for specifying dates. The Tilde (~) can be used to specify the last day of the month or a specified number of days prior to the last day of the month. The “/” can be used to specify a day of the week as a modifier.
-
-Here are some examples of some typical time specifications used in `OnCalendar` statements.
-
-Calendar event specification | Description
----|---
-DOW YYYY-MM-DD HH:MM:SS |
-*-*-* 00:15:30 | Every day of every month of every year at 15 minutes and 30 seconds after midnight
-Weekly | Every Monday at 00:00:00
-Mon *-*-* 00:00:00 | Same as weekly
-Mon | Same as weekly
-Wed 2020-*-* | Every Wednesday in 2020 at 00:00:00
-Mon..Fri 2021-*-* | Every weekday in 2021 at 00:00:00
-2022-6,7,8-1,15 01:15:00 | The 1st and 15th of June, July, and August of 2022 at 01:15:00am
-Mon *-05~03 | The next occurrence of a Monday in May of any year which is also the 3rd day from the end of the month.
-Mon..Fri *-08~04 | The 4th day preceding the end of August for any years in which it also falls on a weekday.
-*-05~03/2 | The 3rd day from the end of the month of May and then again two days later. Repeats every year. Note that this expression uses the Tilde (~).
-*-05-03/2 | The third day of the month of may and then every 2nd day for the rest of May. Repeats every year. Note that this expression uses the dash (-).
-
-_Table 2: Sample `OnCalendar` event specifications_
-
-### Test calendar specifications
-
-systemd provides an excellent tool for validating and examining calendar time event specifications in a timer. The `systemd-analyze calendar` tool parses a calendar time event specification and provides the normalized form as well as other interesting information such as the date and time of the next "elapse," i.e., match, and the approximate amount of time before the trigger time is reached.
-
-First, look at a date in the future without a time (note that the times for `Next elapse` and `UTC` will differ based on your local time zone):
-
-
-```
-[student@studentvm1 ~]$ systemd-analyze calendar 2030-06-17
- Original form: 2030-06-17
-Normalized form: 2030-06-17 00:00:00
- Next elapse: Mon 2030-06-17 00:00:00 EDT
- (in UTC): Mon 2030-06-17 04:00:00 UTC
- From now: 10 years 0 months left
-[root@testvm1 system]#
-```
-
-Now add a time. In this example, the date and time are analyzed separately as non-related entities:
-
-
-```
-[root@testvm1 system]# systemd-analyze calendar 2030-06-17 15:21:16
- Original form: 2030-06-17
-Normalized form: 2030-06-17 00:00:00
- Next elapse: Mon 2030-06-17 00:00:00 EDT
- (in UTC): Mon 2030-06-17 04:00:00 UTC
- From now: 10 years 0 months left
-
- Original form: 15:21:16
-Normalized form: *-*-* 15:21:16
- Next elapse: Mon 2020-06-15 15:21:16 EDT
- (in UTC): Mon 2020-06-15 19:21:16 UTC
- From now: 3h 55min left
-[root@testvm1 system]#
-```
-
-To analyze the date and time as a single unit, enclose them together in quotes. Be sure to remove the quotes when using them in the `OnCalendar=` event specification in a timer unit or you will get errors:
-
-
-```
-[root@testvm1 system]# systemd-analyze calendar "2030-06-17 15:21:16"
-Normalized form: 2030-06-17 15:21:16
- Next elapse: Mon 2030-06-17 15:21:16 EDT
- (in UTC): Mon 2030-06-17 19:21:16 UTC
- From now: 10 years 0 months left
-[root@testvm1 system]#
-```
-
-Now test the entries in Table 2. I like the last one, especially:
-
-
-```
-[root@testvm1 system]# systemd-analyze calendar "2022-6,7,8-1,15 01:15:00"
- Original form: 2022-6,7,8-1,15 01:15:00
-Normalized form: 2022-06,07,08-01,15 01:15:00
- Next elapse: Wed 2022-06-01 01:15:00 EDT
- (in UTC): Wed 2022-06-01 05:15:00 UTC
- From now: 1 years 11 months left
-[root@testvm1 system]#
-```
-
-Let’s look at one example in which we list the next five elapses for the timestamp expression.
-
-
-```
-[root@testvm1 ~]# systemd-analyze calendar --iterations=5 "Mon *-05~3"
- Original form: Mon *-05~3
-Normalized form: Mon *-05~03 00:00:00
- Next elapse: Mon 2023-05-29 00:00:00 EDT
- (in UTC): Mon 2023-05-29 04:00:00 UTC
- From now: 2 years 11 months left
- Iter. #2: Mon 2028-05-29 00:00:00 EDT
- (in UTC): Mon 2028-05-29 04:00:00 UTC
- From now: 7 years 11 months left
- Iter. #3: Mon 2034-05-29 00:00:00 EDT
- (in UTC): Mon 2034-05-29 04:00:00 UTC
- From now: 13 years 11 months left
- Iter. #4: Mon 2045-05-29 00:00:00 EDT
- (in UTC): Mon 2045-05-29 04:00:00 UTC
- From now: 24 years 11 months left
- Iter. #5: Mon 2051-05-29 00:00:00 EDT
- (in UTC): Mon 2051-05-29 04:00:00 UTC
- From now: 30 years 11 months left
-[root@testvm1 ~]#
-```
-
-This should give you enough information to start testing your `OnCalendar` time specifications. The `systemd-analyze` tool can be used for other interesting analyses, which I will begin to explore in the next article in this series.
-
-### Summary
-
-systemd timers can be used to perform the same kinds of tasks as the cron tool but offer more flexibility in terms of the calendar and monotonic time specifications for triggering events.
-
-Even though the service unit you created for this experiment is usually triggered by the timer, you can also use the `systemctl start myMonitor.service` command to trigger it at any time. Multiple maintenance tasks can be scripted in a single timer; these can be Bash scripts or Linux utility programs. You can run the service triggered by the timer to run all the scripts, or you can run individual scripts as needed.
-
-I will explore systemd's use of time and time specifications in much more detail in the next article.
-
-I have not yet seen any indication that `cron` and `at` will be deprecated. I hope that does not happen because `at`, at least, is much easier to use for one-off task scheduling than systemd timers.
-
-### Resources
-
-There is a great deal of information about systemd available on the internet, but much is terse, obtuse, or even misleading. In addition to the resources mentioned in this article, the following webpages offer more detailed and reliable information about systemd startup.
-
- * The Fedora Project has a good, practical [guide to systemd][5]. It has pretty much everything you need to know in order to configure, manage, and maintain a Fedora computer using systemd.
- * The Fedora Project also has a good [cheat sheet][6] that cross-references the old SystemV commands to comparable systemd ones.
- * For detailed technical information about systemd and the reasons for creating it, check out [Freedesktop.org][7]'s [description of systemd][8].
- * [Linux.com][9]'s "More systemd fun" offers more advanced systemd [information and tips][10].
-
-
-
-There is also a series of deeply technical articles for Linux sysadmins by Lennart Poettering, the designer and primary developer of systemd. These articles were written between April 2010 and September 2011, but they are just as relevant now as they were then. Much of everything else good that has been written about systemd and its ecosystem is based on these papers.
-
- * [Rethinking PID 1][11]
- * [systemd for Administrators, Part I][12]
- * [systemd for Administrators, Part II][13]
- * [systemd for Administrators, Part III][14]
- * [systemd for Administrators, Part IV][15]
- * [systemd for Administrators, Part V][16]
- * [systemd for Administrators, Part VI][17]
- * [systemd for Administrators, Part VII][18]
- * [systemd for Administrators, Part VIII][19]
- * [systemd for Administrators, Part IX][20]
- * [systemd for Administrators, Part X][21]
- * [systemd for Administrators, Part XI][22]
-
-
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/7/systemd-timers
-
-作者:[David Both][a]
-选题:[lujun9972][b]
-译者:[译者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/dboth
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist)
-[2]: https://opensource.com/article/17/11/how-use-cron-linux
-[3]: https://opensource.com/users/dboth
-[4]: https://opensource.com/article/20/5/manage-startup-systemd
-[5]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html
-[6]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
-[7]: http://Freedesktop.org
-[8]: http://www.freedesktop.org/wiki/Software/systemd
-[9]: http://Linux.com
-[10]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/
-[11]: http://0pointer.de/blog/projects/systemd.html
-[12]: http://0pointer.de/blog/projects/systemd-for-admins-1.html
-[13]: http://0pointer.de/blog/projects/systemd-for-admins-2.html
-[14]: http://0pointer.de/blog/projects/systemd-for-admins-3.html
-[15]: http://0pointer.de/blog/projects/systemd-for-admins-4.html
-[16]: http://0pointer.de/blog/projects/three-levels-of-off.html
-[17]: http://0pointer.de/blog/projects/changing-roots
-[18]: http://0pointer.de/blog/projects/blame-game.html
-[19]: http://0pointer.de/blog/projects/the-new-configuration-files.html
-[20]: http://0pointer.de/blog/projects/on-etc-sysinit.html
-[21]: http://0pointer.de/blog/projects/instances.html
-[22]: http://0pointer.de/blog/projects/inetd.html
diff --git a/sources/tech/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md b/sources/tech/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md
deleted file mode 100644
index 54608a245e..0000000000
--- a/sources/tech/20201106 11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer.md
+++ /dev/null
@@ -1,224 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer)
-[#]: via: (https://itsfoss.com/32-bit-linux-distributions/)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-
-11 Linux Distributions You Can Rely on for Your Ancient 32-bit Computer
-======
-
-If you’ve been keeping up with the latest [Linux distributions][1], you must have noticed that 32-bit support has been dropped from [most of the popular Linux distributions][2]. Arch Linux, Ubuntu, Fedora, everyone has dropped the support for this older architecture.
-
-But, what if you have vintage hardware with you that still needs to be revived or you want to make use of it for something? Fret not, there are still a few options left to choose from for your 32-bit system.
-
-In this article, I’ve tried to compile some of the best Linux distributions that will keep on supporting 32-bit platform for next few years.
-
-### Top Linux distributions that still offer 32-bit support
-
-![][3]
-
-This list is a bit different from [our earlier list of Linux distributions for old laptops][4]. Even 64-bit computers can be considered old if they were released before 2010. This is why some suggestions listed there included distros that only support 64-bit now.
-
-The information presented here are correct as per my knowledge and findings but if you find otherwise, please let me know in the comment section.
-
-Before you go on, I suppose you know [how to check if you have a 32 bit or 64 bit computer][5].
-
-#### 1\. Debian
-
-![Image Credits: mrneilypops / Deviantart][6]
-
-Debian is a fantastic choice for 32-bit systems because they still support it with their latest stable release. At the time of writing this, the latest stable release **Debian 10 “buster”** offers a 32-bit version and is supported until 2024.
-
-If you’re new to Debian, it is worth mentioning that you get solid documentation for everything on their [official wiki][7]. So, it shouldn’t be an issue to get started.
-
-You can browse through the [available installers][8] to get it installed. However, before you proceed, I would recommend referring to the list of [things to remember before installing Debian][9] in addition to its [installation manual][10].
-
-[Debian][11]
-
-#### 2\. Slax
-
-![][12]
-
-If you just want to quickly boot up a device for some temporary work, Slax is an impressive option.
-
-It is based on Debian but it aims to be a portable and fast option that is meant to be run through USB devices or DVDs. You can download the 32-bit ISO file from their website for free or purchase a rewritable DVD/encrypted pendrive with Slax pre-installed.
-
-Of course, this isn’t meant to replace a traditional desktop operating system. But, yes, you do get the 32-bit support with Debian as its base.
-
-[Slax][13]
-
-#### 3\. AntiX
-
-![Image Credits: Opensourcefeed][14]
-
-Yet another impressive Debian-based distribution. AntiX is popularly known as a systemd-free distribution which focuses on performance while being a lightweight installation.
-
-It is perfectly suitable for just about any old 32-bit system. To give you an idea, it just needs 256 MB RAM and 2.7 GB storage space at the very least. Not just easy to install, but the user experience is focused for both newbies and experienced users as well.
-
-You should get the latest version based on Debian’s latest stable branch available.
-
-[AntiX][15]
-
-#### 4\. openSUSE
-
-![][16]
-
-openSUSE is an independent Linux distribution that supports 32-bit systems as well. Even though the latest regular version (Leap) does not offer 32-bit images, the rolling release edition (Tumbleweed) does provide 32-bit image.
-
-It will be an entirely different experience if you’re new. However, I suggest you to go through the [reasons why you should be using openSUSE.][17]
-
-It is mostly focused for developers and system administrators but you can utilize it as an average desktop user as well. It is worth noting that openSUSE is not meant to run on vintage hardware — so you have to make sure that you have at least 2 GB RAM, 40+ GB storage space, and a dual core processor.
-
-[openSUSE][18]
-
-#### 5\. Emmabuntüs
-
-![][19]
-
-Emmabuntus is an interesting distribution that aims to extend the life of the hardware to reduce waste of raw materials with 32-bit support. As a group they’re also involved in providing computers and digital technologies to schools.
-
-It offers two different editions, one based on Ubuntu and the other based on Debian. If you want a longer 32-bit support, you may want to go with the Debian edition. It may not be the best option, but with a number of pre-configured software to make the Linux learning experience easy and 32-bit support, it is a decent option if you want to support their cause in the process.
-
-[Emmanbuntus][20]
-
-#### 6\. NixOS
-
-![Nixos KDE Edition \(Image Credits: Distrowatch\)][21]
-
-NixOS is yet another independent Linux distribution that supports 32-bit systems. It focuses on providing a reliable system where packages are isolated from each other.
-
-This may not be directly geared towards average users but it is a KDE-powered usable distribution with a unique approach to package management. You can learn more about its [features][22] from its official website.
-
-[NixOS][23]
-
-#### 7\. Gentoo Linux
-
-![][24]
-
-If you’re an experienced Linux user and looking for a 32-bit Linux distributions, Gentoo Linux should be a great choice.
-
-You can easily configure, compile, and install a kernel through package manager with Gentoo Linux if you want. Not just limited to its configurability, which it is popularly known for, you will also be able to run it without any issues on older hardware.
-
-Even if you’re not an experienced user and want to give it a try, simply read through the [installation instructions][25] and you will be in for an adventure.
-
-[Gentoo Linux][26]
-
-#### 8\. Devuan
-
-![][27]
-
-[Devuan][28] is yet another systemd-free distribution. It is technically a fork of Debian, just without systemd and encouraging [Init freedom][29].
-
-It may not be a very popular Linux distribution for an average user but if you want a systemd-free distribution and 32-bit support, Devuan should be a good option.
-
-[Devuan][30]
-
-#### 9\. Void Linux
-
-![][31]
-
-Void Linux is an interesting distribution independently developed by volunteers. It aims to be a general purpose OS while offering a stable rolling release cycle. It features runit as the init system instead of systemd and gives you the option of several [desktop environments][32].
-
-It has an extremely impressive minimum requirement specification with just 96 MB of RAM paired up with Pentium 4 (or equivalent) chip. Try it out!
-
-[Void Linux][33]
-
-#### 10\. Q4OS
-
-![][34]
-
-Q4OS is another Debian-based distribution that focuses on providing a minimal and fast desktop user experience. It also happens to be one of the [best lightweight Linux distributions][4] in our list. It features the [Trinity desktop][35] for its 32-bit edition and you can find KDE Plasma support on 64-bit version.
-
-Similar to Void Linux, Q4OS also runs on a bare minimum of at least 128 MB RAM and a 300 MHz CPU with a 3 GB storage space requirement. It should be more than enough for any vintage hardware. So, I’d say, you should definitely try it out!
-
-To know more about it, you can also check out [our review of Q4OS][36].
-
-[Q$OS][37]
-
-#### 11: MX Linux
-
-![][38]
-
-If you’ve got a slightly decent configuration (not completely vintage but old), MX Linux would be my personal recommendation for 32-bit systems. It also happens to be one of the [best Linux distributions][2] for every type of user.
-
-In general, MX Linux is a fantastic lightweight and customizable distribution based on Debian. You get the option to choose from KDE, XFCE or Fluxbox (which is their own desktop environment for older hardware). You can explore more about it on their official website and give it a try.
-
-[MX Linux][39]
-
-### Honorable Mention: Funtoo
-
-Funtoo is a Gentoo-based community-developed Linux distribution. It focuses on giving you the best performance with Gentoo Linux along with some extra packages to make the experience complete for users. It is also interesting to note that the development is actually led by Gentoo Linux’s creator **Daniel Robbins**.
-
-Of course, if you’re new to Linux, you may not have the best experience here. But, it does support 32-bit systems and works well across many older Intel/AMD chipsets. Explore more about it on its official website to see if you want to try it out.
-
-[Funtoo][40]
-
-### Wrapping Up
-
-I focused the list on Debian-based and some Independent distributions. However, if you don’t mind long term support and just want to get your hands on a 32-bit supported image, you can try any Ubuntu 18.04 based distributions (or any official flavour) as well.
-
-At the time of writing this, they just have a few more months of software support left. Hence, I avoided mentioning it as the primary options. But, if you like Ubuntu 18.04 based distros or any of its flavours, you do have options like [LXLE][41], [Linux Lite][42], [Zorin Lite 15][43], and other official flavours.
-
-Even though most modern desktop operating systems based on Ubuntu have dropped support for 32-bit support. You still have plenty of choices to go with.
-
-What would you prefer to have on your 32-bit system? Let me know your thoughts in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/32-bit-linux-distributions/
-
-作者:[Ankush Das][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/ankush/
-[b]: https://github.com/lujun9972
-[1]: https://itsfoss.com/what-is-linux-distribution/
-[2]: https://itsfoss.com/best-linux-distributions/
-[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/32-bit-linux.png?resize=800%2C450&ssl=1
-[4]: https://itsfoss.com/lightweight-linux-beginners/
-[5]: https://itsfoss.com/32-bit-64-bit-ubuntu/
-[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/debian-screenshot.png?resize=800%2C450&ssl=1
-[7]: https://wiki.debian.org/FrontPage
-[8]: https://www.debian.org/releases/buster/debian-installer/
-[9]: https://itsfoss.com/before-installing-debian/
-[10]: https://www.debian.org/releases/buster/installmanual
-[11]: https://www.debian.org/
-[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/slax-screenshot.jpg?resize=800%2C600&ssl=1
-[13]: https://www.slax.org
-[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/antiX-19-1.jpg?resize=800%2C500&ssl=1
-[15]: https://antixlinux.com
-[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/01/opensuse-15-1.png?resize=800%2C500&ssl=1
-[17]: https://itsfoss.com/why-use-opensuse/
-[18]: https://www.opensuse.org/
-[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/10/Emmabuntus-xfce.png?resize=800%2C500&ssl=1
-[20]: https://emmabuntus.org/
-[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/nixos-kde.jpg?resize=800%2C500&ssl=1
-[22]: https://nixos.org/features.html
-[23]: https://nixos.org/
-[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/gentoo-linux.png?resize=800%2C450&ssl=1
-[25]: https://www.gentoo.org/get-started/
-[26]: https://www.gentoo.org
-[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/devuan-beowulf.jpg?resize=800%2C600&ssl=1
-[28]: https://itsfoss.com/devuan-3-release/
-[29]: https://www.devuan.org/os/init-freedom
-[30]: https://www.devuan.org
-[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/10/void-linux.jpg?resize=800%2C450&ssl=1
-[32]: https://itsfoss.com/best-linux-desktop-environments/
-[33]: https://voidlinux.org/
-[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/q4os8Debonaire.jpg?resize=800%2C500&ssl=1
-[35]: https://en.wikipedia.org/wiki/Trinity_Desktop_Environment
-[36]: https://itsfoss.com/q4os-linux-review/
-[37]: https://q4os.org/index.html
-[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/mx-linux-19-2-kde.jpg?resize=800%2C452&ssl=1
-[39]: https://mxlinux.org/
-[40]: https://www.funtoo.org/Welcome
-[41]: https://www.lxle.net/
-[42]: https://www.linuxliteos.com
-[43]: https://zorinos.com/download/15/lite/32/
diff --git a/sources/tech/20201109 Getting started with Stratis encryption.md b/sources/tech/20201109 Getting started with Stratis encryption.md
deleted file mode 100644
index 1aa0df1c7b..0000000000
--- a/sources/tech/20201109 Getting started with Stratis encryption.md
+++ /dev/null
@@ -1,201 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Getting started with Stratis encryption)
-[#]: via: (https://fedoramagazine.org/getting-started-with-stratis-encryption/)
-[#]: author: (briansmith https://fedoramagazine.org/author/briansmith/)
-
-Getting started with Stratis encryption
-======
-
-![][1]
-
-Stratis is described on its [official website][2] as an “_easy to use local storage management for Linux_.” See this [short video][3] for a quick demonstration of the basics. The video was recorded on a Red Hat Enterprise Linux 8 system. The concepts shown in the video also apply to Stratis in Fedora.
-
-Stratis version 2.1 introduces support for encryption. Continue reading to learn how to get started with encryption in Stratis.
-
-### Prerequisites
-
-Encryption requires Stratis version 2.1 or greater. The examples in this post use a pre-release of Fedora 33. Stratis 2.1 will be available in the final release of Fedora 33.
-
-You’ll also need at least one available block device to create an encrypted pool. The examples shown below were done on a KVM virtual machine with a 5 GB virtual disk drive _(/dev/vdb_).
-
-### Create a key in the kernel keyring
-
-The Linux kernel keyring is used to store the encryption key. For more information on the kernel keyring, refer to the _keyrings_ manual page (_man keyrings_).
-
-Use the _stratis key set_ command to set up the key within the kernel keyring. You must specify where the key should be read from. To read the key from standard input, use the _–capture-key_ option. To retrieve the key from a file, use the _–keyfile-path <file>_ option. The last parameter is a key description. It will be used later when you create the encrypted Stratis pool.
-
-For example, to create a key with the description _pool1key_, and to read the key from standard input, you would enter:
-
-```
-# stratis key set --capture-key pool1key
-Enter desired key data followed by the return key:
-```
-
-The command prompts us to type the key data / passphrase, and the key is then created within the kernel keyring.
-
-To verify that the key was created, run _stratis key list_:
-
-```
-# stratis key list
-Key Description
-pool1key
-```
-
-This verifies that the _pool1key_ was created. Note that these keys are not persistent. If the host is rebooted, the key will need to be provided again before the encrypted Stratis pool can be accessed (this process is covered later).
-
-If you have multiple encrypted pools, they can have a separate keys, or they can share the same key.
-
-The keys can also be viewed using the following _keyctl_ commands:
-
-```
-# keyctl get_persistent @s
-318044983
-# keyctl show
-Session Keyring
- 701701270 --alswrv 0 0 keyring: _ses
- 649111286 --alswrv 0 65534 \_ keyring: _uid.0
- 318044983 ---lswrv 0 65534 \_ keyring: _persistent.0
-1051260141 --alswrv 0 0 \_ user: stratis-1-key-pool1key
-```
-
-### Create the encrypted Stratis pool
-
-Now that a key has been created for Stratis, the next step is to create the encrypted Stratis pool. Encrypting a pool can only be done at pool creation. It isn’t currently possible to encrypt an existing pool.
-
-Use the _stratis pool create_ command to create a pool. Add _–key-desc_ and the key description that you provided in the previous step (_pool1key_). This will signal to Stratis that the pool should be encrypted using the provided key. The below example creates the Stratis pool on _/dev/vdb_, and names it _pool1_. Be sure to specify an empty/available device on your system.
-
-```
-# stratis pool create --key-desc pool1key pool1 /dev/vdb
-```
-
-You can verify that the pool has been created with the _stratis pool list_ command:
-
-```
-# stratis pool list
-Name Total Physical Properties
-pool1 4.98 GiB / 37.63 MiB / 4.95 GiB ~Ca, Cr
-```
-
-In the sample output shown above, _~Ca_ indicates that caching is disabled (the tilde negates the property). _Cr_ indicates that encryption is enabled. Note that caching and encryption are mutually exclusive. Both features cannot be simultaneously enabled.
-
-Next, create a filesystem. The below example, demonstrates creating a filesystem named _filesystem1_, mounting it at the _/filesystem1_ mountpoint, and creating a test file in the new filesystem:
-
-```
-# stratis filesystem create pool1 filesystem1
-# mkdir /filesystem1
-# mount /stratis/pool1/filesystem1 /filesystem1
-# cd /filesystem1
-# echo "this is a test file" > testfile
-```
-
-### Access the encrypted pool after a reboot
-
-When you reboot you’ll notice that Stratis no longer shows your encrypted pool or its block device:
-
-```
-# stratis pool list
-Name Total Physical Properties
-```
-
-```
-# stratis blockdev list
-Pool Name Device Node Physical Size Tier
-```
-
-To access the encrypted pool, first re-create the key with the same key description and key data / passphrase that you used previously:
-
-```
-# stratis key set --capture-key pool1key
-Enter desired key data followed by the return key:
-```
-
-Next, run the _stratis pool unlock_ command, and verify that you can now see the pool and its block device:
-
-```
-# stratis pool unlock
-# stratis pool list
-Name Total Physical Properties
-pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr
-# stratis blockdev list
-Pool Name Device Node Physical Size Tier
-pool1 /dev/dm-2 4.98 GiB Data
-```
-
-Next, mount the filesystem and verify that you can access the test file you created previously:
-
-```
-# mount /stratis/pool1/filesystem1 /filesystem1/
-# cat /filesystem1/testfile
-this is a test file
-```
-
-### Use a systemd unit file to automatically unlock a Stratis pool at boot
-
-It is possible to automatically unlock your Stratis pool at boot without manual intervention. However, a file containing the key must be available. Storing the key in a file might be a security concern in some environments.
-
-The systemd unit file shown below provides a simple method to unlock a Stratis pool at boot and mount the filesystem. Feedback on a better/alternative methods is welcome. You can provide suggestions in the comment section at the end of this article.
-
-Start by creating your key file with the following command. Be sure to substitute _passphrase_ with the same key data / passphrase you entered previously.
-
-```
-# echo -n passphrase > /root/pool1key
-```
-
-Make sure that the file is only readable by root:
-
-```
-# chmod 400 /root/pool1key
-# chown root:root /root/pool1key
-```
-
-Create a systemd unit file at _/etc/systemd/system/stratis-filesystem1.service_ with the following content:
-
-```
-[Unit]
-Description = stratis mount pool1 filesystem1 file system
-After = stratisd.service
-
-[Service]
-ExecStartPre=sleep 2
-ExecStartPre=stratis key set --keyfile-path /root/pool1key pool1key
-ExecStartPre=stratis pool unlock
-ExecStartPre=sleep 3
-ExecStart=mount /stratis/pool1/filesystem1 /filesystem1
-RemainAfterExit=yes
-
-[Install]
-WantedBy = multi-user.target
-```
-
-Next, enable the service so that it will run at boot:
-
-```
-# systemctl enable stratis-filesystem1.service
-```
-
-Now reboot and verify that the Stratis pool has been automatically unlocked and that its filesystem is mounted.
-
-### Summary and conclusion
-
-In today’s environment, encryption is a must for many people and organizations. This post demonstrated how to enable encryption in Stratis 2.1.
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/getting-started-with-stratis-encryption/
-
-作者:[briansmith][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://fedoramagazine.org/author/briansmith/
-[b]: https://github.com/lujun9972
-[1]: https://fedoramagazine.org/wp-content/uploads/2020/11/stratis-encryption-2-816x345.jpg
-[2]: https://stratis-storage.github.io/
-[3]: https://www.youtube.com/watch?v=CJu3kmY-f5o
diff --git a/sources/tech/20201209 Program a simple game with Elixir.md b/sources/tech/20201209 Program a simple game with Elixir.md
deleted file mode 100644
index 8304970ff0..0000000000
--- a/sources/tech/20201209 Program a simple game with Elixir.md
+++ /dev/null
@@ -1,141 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Program a simple game with Elixir)
-[#]: via: (https://opensource.com/article/20/12/elixir)
-[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
-
-Program a simple game with Elixir
-======
-Learn Elixir by programming a "guess the number" game and comparing the
-language against ones you know.
-![A die with rainbow color background][1]
-
-To you learn a new programming language, it's good to focus on the things most programming languages have in common:
-
- * Variables
- * Expressions
- * Statements
-
-
-
-These concepts are the basis of most programming languages. Because of these similarities, once you know one programming language, you can start figuring another one out by recognizing its differences.
-
-Another good tool for learning a new language is starting with a standard program. This allows you to focus on the language, not the program's logic. We're doing that in this article series using a "guess the number" program, in which the computer picks a number between one and 100 and asks you to guess it. The program loops until you guess the number correctly.
-
-The "guess the number" program exercises several concepts in programming languages:
-
- * Variables
- * Input
- * Output
- * Conditional evaluation
- * Loops
-
-
-
-It's a great practical experiment to learn a new programming language.
-
-### Guess the number in Elixir
-
-The [Elixir][2] programming language is a dynamically typed functional language designed for building stable and maintainable applications. It runs on top of the same virtual machine as [Erlang][3] and shares many of its strengths—but with slightly easier syntax.
-
-You can explore Elixir by writing a version of the "guess the number" game.
-
-Here is my implementation:
-
-
-```
-defmodule Guess do
- def guess() do
- random = Enum.random(1..100)
- IO.puts "Guess a number between 1 and 100"
- Guess.guess_loop(random)
- end
- def guess_loop(num) do
- data = IO.read(:stdio, :line)
- {guess, _rest} = Integer.parse(data)
- cond do
- guess < num ->
- IO.puts "Too low!"
- guess_loop(num)
- guess > num ->
- IO.puts "Too high!"
- guess_loop(num)
- true ->
- IO.puts "That's right!"
- end
- end
-end
-
-Guess.guess()
-```
-
-To assign a value to a variable, list the variable's name followed by the `=` sign. For example, the statement `random = 0` assigns a zero value to the `random` variable.
-
-The script starts by defining a **module**. In Elixir, only modules can have named functions in them.
-
-The next line defines the function that will serve as the entry point, `guess()`, which:
-
- * Calls the `Enum.random()` function to get a random integer
- * Prints the game prompt
- * Calls the function that will serve as the loop
-
-
-
-The rest of the game logic is implemented in the `guess_loop()` function.
-
-The `guess_loop()` function uses [tail recursion][4] to loop. There are several ways to do looping in Elixir, but using tail recursion is a common one. The last thing `guess_loop()` does is call _itself_.
-
-The first line in `guess_loop()` reads the input from the user. The next line uses `parse()` to convert the input to an integer.
-
-The `cond` statement is Elixir's version of a multi-branch statement. Unlike `if/elif` or `if/elsif` in other languages, Elixir does not treat the first nor the last branch in a different way.
-
-This `cond` statement has a three-way branch: The guess can be smaller, bigger, or equal to the random number. The first two options output the inequality's direction and then tail-call `guess_loop()`, looping back to the beginning. The last option outputs `That's right`, and the function finishes.
-
-### Sample output
-
-Now that you've written your Elixir program, you can run it to play the "guess the number" game. Every time you run the program, Elixir will pick a different random number, and you can guess until you find the correct number:
-
-
-```
-$ elixir guess.exs
-Guess a number between 1 and 100
-50
-Too high
-30
-Too high
-20
-Too high
-10
-Too low
-15
-Too high
-13
-Too low
-14
-That's right!
-```
-
-This "guess the number" game is a great introductory program for learning a new programming language because it exercises several common programming concepts in a pretty straightforward way. By implementing this simple game in different programming languages, you can demonstrate some core concepts of the languages and compare their details.
-
-Do you have a favorite programming language? How would you write the "guess the number" game in it? Follow this article series to see examples of other programming languages that might interest you.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/20/12/elixir
-
-作者:[Moshe Zadka][a]
-选题:[lujun9972][b]
-译者:[译者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/moshez
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dice_tabletop_board_gaming_game.jpg?itok=y93eW7HN (A die with rainbow color background)
-[2]: https://elixir-lang.org/
-[3]: https://www.erlang.org/
-[4]: https://en.wikipedia.org/wiki/Tail_call
diff --git a/sources/tech/20210104 Network address translation part 1 - packet tracing.md b/sources/tech/20210104 Network address translation part 1 - packet tracing.md
index a1cfd4de2c..850b4f9e1c 100644
--- a/sources/tech/20210104 Network address translation part 1 - packet tracing.md
+++ b/sources/tech/20210104 Network address translation part 1 - packet tracing.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (amwps290)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210115 Review of Container-to-Container Communications in Kubernetes.md b/sources/tech/20210115 Review of Container-to-Container Communications in Kubernetes.md
index c79503bbc9..0c18578a9c 100644
--- a/sources/tech/20210115 Review of Container-to-Container Communications in Kubernetes.md
+++ b/sources/tech/20210115 Review of Container-to-Container Communications in Kubernetes.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (MZqk)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210204 A guide to understanding Linux software libraries in C.md b/sources/tech/20210204 A guide to understanding Linux software libraries in C.md
index fe977cd22f..bfb9d0a880 100644
--- a/sources/tech/20210204 A guide to understanding Linux software libraries in C.md
+++ b/sources/tech/20210204 A guide to understanding Linux software libraries in C.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (mengxinayan)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md b/sources/tech/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md
index dcf6c9a3ae..1fd15cf3ac 100644
--- a/sources/tech/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md
+++ b/sources/tech/20210210 How to Add Fingerprint Login in Ubuntu and Other Linux Distributions.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (scvoet)
+[#]: translator: (geekpi)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210212 Network address translation part 2 - the conntrack tool.md b/sources/tech/20210212 Network address translation part 2 - the conntrack tool.md
deleted file mode 100644
index 60078eb4c5..0000000000
--- a/sources/tech/20210212 Network address translation part 2 - the conntrack tool.md
+++ /dev/null
@@ -1,139 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (cooljelly)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Network address translation part 2 – the conntrack tool)
-[#]: via: (https://fedoramagazine.org/network-address-translation-part-2-the-conntrack-tool/)
-[#]: author: (Florian Westphal https://fedoramagazine.org/author/strlen/)
-
-Network address translation part 2 – the conntrack tool
-======
-
-![][1]
-
-This is the second article in a series about network address translation (NAT). The first article introduced [how to use the iptables/nftables packet tracing feature][2] to find the source of NAT-related connectivity problems. Part 2 introduces the “conntrack” command. conntrack allows you to inspect and modify tracked connections.
-
-### Introduction
-
-NAT configured via iptables or nftables builds on top of netfilters connection tracking facility. The _conntrack_ command is used to inspect and alter the state table. It is part of the “conntrack-tools” package.
-
-### Conntrack state table
-
-The connection tracking subsystem keeps track of all packet flows that it has seen. Run “_sudo conntrack -L_” to see its content:
-
-```
-tcp 6 43184 ESTABLISHED src=192.168.2.5 dst=10.25.39.80 sport=5646 dport=443 src=10.25.39.80 dst=192.168.2.5 sport=443 dport=5646 [ASSURED] mark=0 use=1
-tcp 6 26 SYN_SENT src=192.168.2.5 dst=192.168.2.10 sport=35684 dport=443 [UNREPLIED] src=192.168.2.10 dst=192.168.2.5 sport=443 dport=35684 mark=0 use=1
-udp 17 29 src=192.168.8.1 dst=239.255.255.250 sport=48169 dport=1900 [UNREPLIED] src=239.255.255.250 dst=192.168.8.1 sport=1900 dport=48169 mark=0 use=1
-```
-
-Each line shows one connection tracking entry. You might notice that each line shows the addresses and port numbers twice and even with inverted address and port pairs! This is because each entry is inserted into the state table twice. The first address quadruple (source and destination address and ports) are those recorded in the original direction, i.e. what the initiator sent. The second quadruple is what conntrack expects to see when a reply from the peer is received. This solves two problems:
-
- 1. If a NAT rule matches, such as IP address masquerading, this is recorded in the reply part of the connection tracking entry and can then be automatically applied to all future packets that are part of the same flow.
- 2. A lookup in the state table will be successful even if its a reply packet to a flow that has any form of network or port address translation applied.
-
-
-
-The original (first shown) quadruple stored never changes: Its what the initiator sent. NAT manipulation only alters the reply (second) quadruple because that is what the receiver will see. Changes to the first quadruple would be pointless: netfilter has no control over the initiators state, it can only influence the packet as it is received/forwarded. When a packet does not map to an existing entry, conntrack may add a new state entry for it. In the case of UDP this happens automatically. In the case of TCP conntrack can be configured to only add the new entry if the TCP packet has the [SYN bit][3] set. By default conntrack allows mid-stream pickups to not cause problems for flows that existed prior to conntrack becoming active.
-
-### Conntrack state table and NAT
-
-As explained in the previous section, the reply tuple listed contains the NAT information. Its possible to filter the output to only show entries with source or destination nat applied. This allows to see which kind of NAT transformation is active on a given flow. _“sudo conntrack -L -p tcp –src-nat_” might show something like this:
-
-```
-tcp 6 114 TIME_WAIT src=10.0.0.10 dst=10.8.2.12 sport=5536 dport=80 src=10.8.2.12 dst=192.168.1.2 sport=80 dport=5536 [ASSURED]
-```
-
-This entry shows a connection from 10.0.0.10:5536 to 10.8.2.12:80. But unlike the previous example, the reply direction is not just the inverted original direction: the source address is changed. The destination host (10.8.2.12) sends reply packets to 192.168.1.2 instead of 10.0.0.10. Whenever 10.0.0.10 sends another packet, the router with this entry replaces the source address with 192.168.1.2. When 10.8.2.12 sends a reply, it changes the destination back to 10.0.0.10. This source NAT is due to a [nft masquerade][4] rule:
-
-```
-inet nat postrouting meta oifname "veth0" masquerade
-```
-
-Other types of NAT rules, such as “dnat to” or “redirect to” would be shown in a similar fashion, with the reply tuples destination different from the original one.
-
-### Conntrack extensions
-
-Two useful extensions are conntrack accounting and timestamping. _“sudo sysctl net.netfilter.nf_conntrack_acct=1”_ makes _“sudo conntrack -L_” track byte and packet counters for each flow.
-
-_“sudo sysctl net.netfilter.nf_conntrack_timestamp=1”_ records a “start timestamp” for each connection. _“sudo conntrack -L”_ then displays the seconds elapsed since the flow was first seen. Add “_–output ktimestamp_” to see the absolute start date as well.
-
-### Insert and change entries
-
-You can add entries to the state table. For example:
-
-```
-sudo conntrack -I -s 192.168.7.10 -d 10.1.1.1 --protonum 17 --timeout 120 --sport 12345 --dport 80
-```
-
-This is used by conntrackd for state replication. Entries of an active firewall are replicated to a standby system. The standby system can then take over without breaking connectivity even on established flows. Conntrack can also store metadata not related to the packet data sent on the wire, for example the conntrack mark and connection tracking labels. Change them with the “update” (-U) option:
-
-```
-sudo conntrack -U -m 42 -p tcp
-```
-
-This changes the connmark of all tcp flows to 42.
-
-### **Delete entries**
-
-In some cases, you want to delete enries from the state table. For example, changes to NAT rules have no effect on packets belonging to flows that are already in the table. For long-lived UDP sessions, such as tunneling protocols like VXLAN, it might make sense to delete the entry so the new NAT transformation can take effect. Delete entries via _“sudo conntrack -D_” followed by an optional list of address and port information. The following example removes the given entry from the table:
-
-```
-sudo conntrack -D -p udp --src 10.0.12.4 --dst 10.0.0.1 --sport 1234 --dport 53
-```
-
-### Conntrack error counters
-
-Conntrack also exports statistics:
-
-```
-# sudo conntrack -S
-cpu=0 found=0 invalid=130 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=10
-cpu=1 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0
-cpu=2 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=1
-cpu=3 found=0 invalid=0 insert=0 insert_failed=0 drop=0 early_drop=0 error=0 search_restart=0
-```
-
-Most counters will be 0. “Found” and “insert” will always be 0, they only exist for backwards compatibility. Other errors accounted for are:
-
- * invalid: packet does not match an existing connection and doesn’t create a new connection.
- * insert_failed: packet starts a new connection, but insertion into the state table failed. This can happen for example when NAT engine happened to pick identical source address and port when Masquerading.
- * drop: packet starts a new connection, but no memory is available to allocate a new state entry for it.
- * early_drop: conntrack table is full. In order to accept the new connection existing connections that did not see two-way communication were dropped.
- * error: icmp(v6) received icmp error packet that did not match a known connection
- * search_restart: lookup interrupted by an insertion or deletion on another CPU.
- * clash_resolve: Several CPUs tried to insert identical conntrack entry.
-
-
-
-These error conditions are harmless unless they occur frequently. Some can be mitigated by tuning the conntrack sysctls for the expected workload. _net.netfilter.nf_conntrack_buckets_ and _net.netfilter.nf_conntrack_max_ are typical candidates. See the [nf_conntrack-sysctl documentation][5] for a full list.
-
-Use “_sudo sysctl_ _net.netfilter.nf_conntrack_log_invalid=255″_ to get more information when a packet is invalid. For example, when conntrack logs the following when it encounters a packet with all tcp flags cleared:
-
-```
-nf_ct_proto_6: invalid tcp flag combination SRC=10.0.2.1 DST=10.0.96.7 LEN=1040 TOS=0x00 PREC=0x00 TTL=255 ID=0 PROTO=TCP SPT=5723 DPT=443 SEQ=1 ACK=0
-```
-
-### Summary
-
-This article gave an introduction on how to inspect the connection tracking table and the NAT information stored in tracked flows. The next part in the series will expand on the conntrack tool and the connection tracking event framework.
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/network-address-translation-part-2-the-conntrack-tool/
-
-作者:[Florian Westphal][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://fedoramagazine.org/author/strlen/
-[b]: https://github.com/lujun9972
-[1]: https://fedoramagazine.org/wp-content/uploads/2021/02/network-address-translation-part-2-816x345.jpg
-[2]: https://fedoramagazine.org/network-address-translation-part-1-packet-tracing/
-[3]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure
-[4]: https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT)#Masquerading
-[5]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/nf_conntrack-sysctl.rst
diff --git a/sources/tech/20210214 Why programmers love Linux packaging.md b/sources/tech/20210214 Why programmers love Linux packaging.md
index bb82a93193..837b4a2aed 100644
--- a/sources/tech/20210214 Why programmers love Linux packaging.md
+++ b/sources/tech/20210214 Why programmers love Linux packaging.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (Tracygcz)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210222 A friendly guide to the syntax of C-- method pointers.md b/sources/tech/20210222 A friendly guide to the syntax of C-- method pointers.md
index 36600f7f63..2f059ce95e 100644
--- a/sources/tech/20210222 A friendly guide to the syntax of C-- method pointers.md
+++ b/sources/tech/20210222 A friendly guide to the syntax of C-- method pointers.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (MjSeven)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210308 Cast your Android device with a Raspberry Pi.md b/sources/tech/20210308 Cast your Android device with a Raspberry Pi.md
index 189ed359d4..218bdb488e 100644
--- a/sources/tech/20210308 Cast your Android device with a Raspberry Pi.md
+++ b/sources/tech/20210308 Cast your Android device with a Raspberry Pi.md
@@ -2,7 +2,7 @@
[#]: via: (https://opensource.com/article/21/3/android-raspberry-pi)
[#]: author: (Sudeshna Sur https://opensource.com/users/sudeshna-sur)
[#]: collector: (lujun9972)
-[#]: translator: ( RiaXu)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20210331 3 reasons I use the Git cherry-pick command.md b/sources/tech/20210331 3 reasons I use the Git cherry-pick command.md
deleted file mode 100644
index 0ce31f8798..0000000000
--- a/sources/tech/20210331 3 reasons I use the Git cherry-pick command.md
+++ /dev/null
@@ -1,198 +0,0 @@
-[#]: subject: (3 reasons I use the Git cherry-pick command)
-[#]: via: (https://opensource.com/article/21/3/git-cherry-pick)
-[#]: author: (Manaswini Das https://opensource.com/users/manaswinidas)
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-3 reasons I use the Git cherry-pick command
-======
-Cherry-picking solves a lot of problems in Git repositories. Here are
-three ways to fix your mistakes with git cherry-pick.
-![Measuring and baking a cherry pie recipe][1]
-
-Finding your way around a version control system can be tricky. It can be massively overwhelming for a newbie, but being well-versed with the terminology and the basics of a version control system like Git is one of the baby steps to start contributing to open source.
-
-Being familiar with Git can also help you out of sticky situations in your open source journey. Git is powerful and makes you feel in control—there is not a single way in which you cannot revert to a working version.
-
-Here is an example to help you understand the importance of cherry-picking. Suppose you have made several commits in a branch, but you realize it's the wrong branch! What do you do now? Either you repeat all your changes in the correct branch and make a fresh commit, or you merge the branch into the correct branch. Wait, the former is too tedious, and you may not want to do the latter. So, is there a way? Yes, Git's got you covered. Here is where cherry-picking comes into play. As the term suggests, you can use it to hand-pick a commit from one branch and transfer it into another branch.
-
-There are various reasons to use cherry-picking. Here are three of them.
-
-### Avoid redundancy of efforts
-
-There's no need to redo the same changes in a different branch when you can just copy the same commits to the other branch. Please note that cherry-picking commits will create a fresh commit with a new hash in the other branch, so please don't be confused if you see a different commit hash.
-
-In case you are wondering what a commit hash is and how it is generated, here is a note to help you: A commit hash is a string generated using the [SHA-1][2] algorithm. The SHA-1 algorithm takes an input and outputs a unique 40-character hash. If you are on a [POSIX][3] system, try running this in your terminal:
-
-
-```
-`$ echo -n "commit" | openssl sha1`
-```
-
-This outputs a unique 40-character hash, `4015b57a143aec5156fd1444a017a32137a3fd0f`. This hash represents the string `commit`.
-
-A SHA-1 hash generated by Git when you make a commit represents much more than just a single string. It represents:
-
-
-```
-sha1(
- meta data
- commit message
- committer
- commit date
- author
- authoring date
- Hash of the entire tree object
-)
-```
-
-This explains why you get a unique commit hash for the slightest change you make to your code. Not even a single change goes unnoticed. This is because Git has integrity.
-
-### Undoing/restoring lost changes
-
-Cherry-picking can be handy when you want to restore to a working version. When multiple developers are working on the same codebase, it is very likely for changes to get lost and the latest version to move to a stale or non-working version. That's where cherry-picking commits to the working version can be a savior.
-
-#### How does it work?
-
-Suppose there are two branches, `feature1` and `feature2`, and you want to apply commits from `feature1` to `feature2`.
-
-On the `feature1` branch, run a `git log` command, and copy the commit hash that you want to cherry-pick. You can see a series of commits resembling the code sample below. The alphanumeric code following "commit" is the commit hash that you need to copy. You may choose to copy the first six characters (`966cf3` in this example) for the sake of convenience:
-
-
-```
-commit 966cf3d08b09a2da3f2f58c0818baa37184c9778 (HEAD -> master)
-Author: manaswinidas <[me@example.com][4]>
-Date: Mon Mar 8 09:20:21 2021 +1300
-
- add instructions
-```
-
-Then switch to `feature2` and run `git cherry-pick` on the hash you just got from the log:
-
-
-```
-$ git checkout feature2
-$ git cherry-pick 966cf3.
-```
-
-If the branch doesn't exist, use `git checkout -b feature2` to create it.
-
-Here's a catch: You may encounter the situation below:
-
-
-```
-$ git cherry-pick 966cf3
-On branch feature2
-You are currently cherry-picking commit 966cf3d.
-
-nothing to commit, working tree clean
-The previous cherry-pick is now empty, possibly due to conflict resolution.
-If you wish to commit it anyway, use:
-
- git commit --allow-empty
-
-Otherwise, please use 'git reset'
-```
-
-Do not panic. Just run `git commit --allow-empty` as suggested:
-
-
-```
-$ git commit --allow-empty
-[feature2 afb6fcb] add instructions
-Date: Mon Mar 8 09:20:21 2021 +1300
-```
-
-This opens your default editor and allows you to edit the commit message. It's acceptable to save the existing message if you have nothing to add.
-
-There you go; you did your first cherry-pick. As discussed above, if you run a `git log` on branch `feature2`, you will see a different commit hash. Here is an example:
-
-
-```
-commit afb6fcb87083c8f41089cad58deb97a5380cb2c2 (HEAD -> feature2)
-Author: manaswinidas <[me@example.com][4]>
-Date: Mon Mar 8 09:20:21 2021 +1300
- add instructions
-```
-
-Don't be confused about the different commit hash. That just distinguishes between the commits in `feature1` and `feature2`.
-
-### Cherry-pick multiple commits
-
-But what if you want to cherry-pick multiple commits? You can use:
-
-
-```
-`git cherry-pick ... `
-```
-
-Please note that you don't have to use the entire commit hash; you can use the first five or six characters.
-
-Again, this is tedious. What if the commits you want to cherry-pick are a range of continuous commits? This approach is too much work. Don't worry; there's an easier way.
-
-Assume that you have two branches:
-
- * `feature1` includes commits you want to copy (from `commitA` (older) to `commitB`).
- * `feature2` is the branch you want the commits to be transferred to from `feature1`.
-
-
-
-Then:
-
- 1. Enter `git checkout `.
- 2. Get the hashes of `commitA` and `commitB`.
- 3. Enter `git checkout `.
- 4. Enter `git cherry-pick ^..` (please note that this includes `commitA` and `commitB`).
- 5. Should you encounter a merge conflict, [solve it as usual][5] and then type `git cherry-pick --continue` to resume the cherry-pick process.
-
-
-
-### Important cherry-pick options
-
-Here are some useful options from the [Git documentation][6] that you can use with the `cherry-pick` command:
-
- * `-e`, `--edit`: With this option, `git cherry-pick` lets you edit the commit message prior to committing.
- * `-s`, `--signoff`: Add a "Signed-off-by" line at the end of the commit message. See the signoff option in git-commit(1) for more information.
- * `-S[]`, `--gpg-sign[=]`: These are GPG-sign commits. The `keyid` argument is optional and defaults to the committer identity; if specified, it must be stuck to the option without a space.
- * `--ff`: If the current HEAD is the same as the parent of the cherry-picked commit, then a fast-forward to this commit will be performed.
-
-
-
-Here are some other sequencer subcommands (apart from continue):
-
- * `--quit`: You can forget about the current operation in progress. This can be used to clear the sequencer state after a failed cherry-pick or revert.
- * `--abort`: Cancel the operation and return to the presequence state.
-
-
-
-Here are some examples of cherry-picking:
-
- * `git cherry-pick master`: Applies the change introduced by the commit at the tip of the master branch and creates a new commit with this change
- * `git cherry-pick master~4 master~2`: Applies the changes introduced by the fifth and third-last commits pointed to by master and creates two new commits with these changes
-
-
-
-Feeling overwhelmed? You needn't remember all the commands. You can always type `git cherry-pick --help` in your terminal to look at more options or help.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/21/3/git-cherry-pick
-
-作者:[Manaswini Das][a]
-选题:[lujun9972][b]
-译者:[译者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/manaswinidas
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe)
-[2]: https://en.wikipedia.org/wiki/SHA-1
-[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
-[4]: mailto:me@example.com
-[5]: https://opensource.com/article/20/4/git-merge-conflict
-[6]: https://git-scm.com/docs/git-cherry-pick
diff --git a/sources/tech/20210405 7 Git tips for managing your home directory.md b/sources/tech/20210405 7 Git tips for managing your home directory.md
deleted file mode 100644
index 1239482260..0000000000
--- a/sources/tech/20210405 7 Git tips for managing your home directory.md
+++ /dev/null
@@ -1,142 +0,0 @@
-[#]: subject: (7 Git tips for managing your home directory)
-[#]: via: (https://opensource.com/article/21/4/git-home)
-[#]: author: (Seth Kenlon https://opensource.com/users/seth)
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-7 Git tips for managing your home directory
-======
-Here is how I set up Git to manage my home directory.
-![Houses in a row][1]
-
-I have several computers. I've got a laptop at work, a workstation at home, a Raspberry Pi (or four), a [Pocket CHIP][2], a [Chromebook running various forms of Linux][3], and so on. I used to set up my user environment on each computer by more or less following the same steps, and I often told myself that I enjoyed that each one was slightly unique. For instance, I use [Bash aliases][4] more often at work than at home, and the helper scripts I use at home might not be useful at work.
-
-Over the years, my expectations across devices began to merge, and I'd forget that a feature I'd built up on my home machine wasn't ported over to my work machine, and so on. I needed a way to standardize my customized toolkit. The answer, to my surprise, was Git.
-
-Git is version-tracker software. It's famously used by the biggest and smallest open source projects and even by the largest proprietary software companies. But it was designed for source code—not a home directory filled with music and video files, games, photos, and so on. I'd heard of people managing their home directory with Git, but I assumed that it was a fringe experiment done by coders, not real-life users like me.
-
-Managing my home directory with Git has been an evolving process. I've learned and adapted along the way. Here are the things you might want to keep in mind should you decide to manage your home directory with Git.
-
-### 1\. Text and binary locations
-
-![home directory][5]
-
-(Seth Kenlon, [CC BY-SA 4.0][6])
-
-When managed by Git, your home directory becomes something of a no-man 's-land for everything but configuration files. That means when you open your home directory, you should see nothing but a list of predictable directories. There shouldn't be any stray photos or LibreOffice documents, and no "I'll put this here for just a minute" files.
-
-The reason for this is simple: when you manage your home directory with Git, everything in your home directory that's _not_ being committed becomes noise. Every time you do a `git status`, you'll have to scroll past any file that Git isn't tracking, so it's vital that you keep those files in subdirectories (which you add to your `.gitignore` file).
-
-Many Linux distributions provide a set of default directories:
-
- * Documents
- * Downloads
- * Music
- * Photos
- * Templates
- * Videos
-
-
-
-You can create more if you need them. For instance, I differentiate between the music I create (Music) and the music I purchase to listen to (Albums). Likewise, my Cinema directory contains movies by other people, while Videos contains video files I need for editing. In other words, my default directory structure has more granularity than the default set provided by most Linux distributions, but I think there's a benefit to that. Without a directory structure that works for you, you'll be more likely to just stash stuff in your home directory, for lack of a better place for it, so think ahead and plan out directories that work for you. You can always add more later, but it's best to start strong.
-
-### 2\. Setting up your very best .gitignore
-
-Once you've cleaned up your home directory, you can instantiate it as a Git repository as usual:
-
-
-```
-$ cd
-$ git init .
-```
-
-Your Git repository contains nothing yet, so everything in your home directory is untracked. Your first job is to sift through the list of untracked files and determine what you want to remain untracked. To see untracked files:
-
-
-```
-$ git status
- .AndroidStudio3.2/
- .FBReader/
- .ICEauthority
- .Xauthority
- .Xdefaults
- .android/
- .arduino15/
- .ash_history
-[...]
-```
-
-Depending on how long you've been using your home directory, this list may be long. The easy ones are the directories you decided on in the first step. By adding these to a hidden file called `.gitignore`, you tell Git to stop listing them as untracked files and never to track them:
-
-
-```
-`$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore`
-```
-
-With that done, go through the remaining untracked files shown by `git status` and determine whether any other files warrant exclusion. This process helped me discover several stale old configuration files and directories, which I ended up trashing altogether, but also some that were very specific to one computer. I was fairly strict here because many configuration files do better when they're auto-generated. For instance, I never commit my KDE configuration files because many contain information like recent documents and other elements that don't exist on another machine.
-
-I track my personalized configuration files, scripts and utilities, profile and Bash configs, and cheat sheets and other snippets of text that I refer to frequently. If the software is mostly responsible for maintaining a file, I ignore it. And when in doubt about a file, I ignore it. You can always un-ignore it later (by removing it from your `.gitignore` file).
-
-### 3\. Get to know your data
-
-I'm on KDE, so I use the open source scanner [Filelight][7] to get an overview of my data. Filelight gives you a chart that lets you see the size of each directory. You can navigate through each directory to see what's taking up all the space and then backtrack to investigate elsewhere. It's a fascinating view of your system, and it lets you see your files in a completely new light.
-
-![Filelight][8]
-
-(Seth Kenlon, [CC BY-SA 4.0][6])
-
-Use Filelight or a similar utility to find unexpected caches of data you don't need to commit. For instance, the KDE file indexer (Baloo) generates quite a lot of data specific to its host that I definitely wouldn't want to transport to another computer.
-
-### 4\. Don't ignore your .gitignore file
-
-On some projects, I tell Git to ignore my `.gitignore` file because what I want to ignore is sometimes specific to my working directory, and I don't presume other developers on the same project need me to tell them what their `.gitignore` file ought to look like. Because my home directory is for my use only, I do _not_ ignore my home's `.gitignore` file. I commit it along with other important files, so it's inherited across all of my systems. And of course, all of my systems are identical from the home directory's viewpoint: they have the same set of default folders and many of the same hidden configuration files.
-
-### 5\. Don't fear the binary
-
-I put my system through weeks and weeks of rigorous testing, convinced that it was _never_ wise to commit binary files to Git. I tried GPG encrypted password files, I tried LibreOffice documents, JPEGs, PNGs, and more. I even had a script that unarchived LibreOffice files before adding them to Git, extracted the XML inside so I could commit just the XML, and then rebuilt the LibreOffice file so that I could work on it within LibreOffice. My theory was that committing XML would render a smaller Git repository than a ZIP file (which is all a LibreOffice document really is).
-
-To my great surprise, I found that committing a few binary files every now and then did not substantially increase the size of my Git repository. I've worked with Git long enough to know that if I were to commit gigabytes of binary data, my repository would suffer, but the occasional binary file isn't an emergency to avoid at all costs.
-
-Armed with this new confidence, I add font OTF and TTF files to my standard home repo, my `.face` file for GDM, and other incidental minor binary blobs. Don't overthink it, don't waste time trying to avoid it; just commit it.
-
-### 6\. Use a private repo
-
-Don't commit your home directory to a public Git repository, even if the host offers private accounts. If you're like me, you have SSH keys and GPG keychains and GPG-encrypted files that ought not end up on anybody's server but my own.
-
-I [run a local Git server][9] on a Raspberry Pi (it's easier than you think), so I can update any computer any time I'm home. I'm a remote worker, so that's usually good enough, but I can also reach the computer when traveling over my [VPN][10].
-
-### 7\. Remember to push
-
-The thing about Git is that it only pushes changes to your server when you tell it to. If you're a longtime Git user, this process is probably natural to you. For new users who might be accustomed to the automatic synchronization in Nextcloud or Syncthing, this may take some getting used to.
-
-### Git at home
-
-Managing my common files with Git hasn't just made life more convenient across devices. Knowing that I have a full history for all my configurations and utility scripts encourages me to try out new ideas because it's always easy to roll back my changes if they turn out to be _bad_ ideas. Git has rescued me from an ill-advised umask setting in `.bashrc`, a poorly executed late-night addition to my package management script, and an it-seemed-like-a-cool-idea-at-the-time change of my [rxvt][11] color scheme—and probably a few other mistakes in my past. Try Git in your home because a home that commits together merges together.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/21/4/git-home
-
-作者:[Seth Kenlon][a]
-选题:[lujun9972][b]
-译者:[译者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/seth
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/house_home_colors_live_building.jpg?itok=HLpsIfIL (Houses in a row)
-[2]: https://opensource.com/article/17/2/pocketchip-or-pi
-[3]: https://opensource.com/article/21/2/chromebook-linux
-[4]: https://opensource.com/article/17/5/introduction-alias-command-line-tool
-[5]: https://opensource.com/sites/default/files/uploads/home-git.jpg (home directory)
-[6]: https://creativecommons.org/licenses/by-sa/4.0/
-[7]: https://utils.kde.org/projects/filelight
-[8]: https://opensource.com/sites/default/files/uploads/filelight.jpg (Filelight)
-[9]: https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6
-[10]: https://www.redhat.com/sysadmin/run-your-own-vpn-libreswan
-[11]: https://opensource.com/article/19/10/why-use-rxvt-terminal
diff --git a/sources/tech/20210407 Using network bound disk encryption with Stratis.md b/sources/tech/20210407 Using network bound disk encryption with Stratis.md
deleted file mode 100644
index becf63e533..0000000000
--- a/sources/tech/20210407 Using network bound disk encryption with Stratis.md
+++ /dev/null
@@ -1,288 +0,0 @@
-[#]: subject: (Using network bound disk encryption with Stratis)
-[#]: via: (https://fedoramagazine.org/network-bound-disk-encryption-with-stratis/)
-[#]: author: (briansmith https://fedoramagazine.org/author/briansmith/)
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-Using network bound disk encryption with Stratis
-======
-
-![][1]
-
-Photo by [iMattSmart][2] on [Unsplash][3]
-
-In an environment with many encrypted disks, unlocking them all is a difficult task. Network bound disk encryption (NBDE) helps automate the process of unlocking Stratis volumes. This is a critical requirement in large environments. Stratis version 2.1 added support for encryption, which was introduced in the article “[Getting started with Stratis encryption][4].” Stratis version 2.3 recently introduced support for Network Bound Disk Encryption (NBDE) when using encrypted Stratis pools, which is the topic of this article.
-
-The [Stratis website][5] describes Stratis as an “_easy to use local storage management for Linux_.” The short video [“Managing Storage With Stratis”][6] gives a quick demonstration of the basics. The video was recorded on a Red Hat Enterprise Linux 8 system, however, the concepts shown in the video also apply to Stratis in Fedora Linux.
-
-### Prerequisites
-
-This article assumes you are familiar with Stratis, and also Stratis pool encryption. If you aren’t familiar with these topics, refer to this [article][4] and the [Stratis overview video][6] previously mentioned.
-
-NBDE requires Stratis 2.3 or later. The examples in this article use a pre-release version of Fedora Linux 34. The Fedora Linux 34 final release will include Stratis 2.3.
-
-### Overview of network bound disk encryption (NBDE)
-
-One of the main challenges of encrypting storage is having a secure method to unlock the storage again after a system reboot. In large environments, typing in the encryption passphrase manually doesn’t scale well. NBDE addresses this and allows for encrypted storage to be unlocked in an automated manner.
-
-At a high level, NBDE requires a Tang server in the environment. Client systems (using Clevis Pin) can automatically decrypt storage as long as they can establish a network connection to the Tang server. If there is no network connectivity to the Tang server, the storage would have to be decrypted manually.
-
-The idea behind this is that the Tang server would only be available on an internal network, thus if the encrypted device is lost or stolen, it would no longer have access to the internal network to connect to the Tang server, therefore would not be automatically decrypted.
-
-For more information on Tang and Clevis, see the man pages (man tang, man clevis) , the [Tang GitHub page][7], and the [Clevis GitHub page][8].
-
-### Setting up the Tang server
-
-This example uses another Fedora Linux system as the Tang server with a hostname of tang-server. Start by installing the tang package:
-
-```
-dnf install tang
-```
-
-Then enable and start the tangd.socket with systemctl:
-
-```
-systemctl enable tangd.socket --now
-```
-
-Tang uses TCP port 80, so you also need to open that in the firewall:
-
-```
-firewall-cmd --add-port=80/tcp --permanent
-firewall-cmd --add-port=80/tcp
-```
-
-Finally, run _tang-show-keys_ to display the output signing key thumbprint. You’ll need this later.
-
-```
-# tang-show-keys
-l3fZGUCmnvKQF_OA6VZF9jf8z2s
-```
-
-### Creating the encrypted Stratis Pool
-
-The previous article on Stratis encryption goes over how to setup an encrypted Stratis pool in detail, so this article won’t cover that in depth.
-
-The first step is capturing a key that will be used to decrypt the Stratis pool. Even when using NBDE, you need to set this, as it can be used to manually unlock the pool in the event that the NBDE server is unreachable. Capture the pool1 key with the following command:
-
-```
-# stratis key set --capture-key pool1key
-Enter key data followed by the return key:
-```
-
-Then I’ll create an encrypted Stratis pool (using the pool1key just created) named pool1 using the _/dev/vdb_ device:
-
-```
-# stratis pool create --key-desc pool1key pool1 /dev/vdb
-```
-
-Next, create a filesystem in this Stratis pool named filesystem1, create a mount point, mount the filesystem, and create a testfile in it:
-
-```
-# stratis filesystem create pool1 filesystem1
-# mkdir /filesystem1
-# mount /dev/stratis/pool1/filesystem1 /filesystem1
-# cd /filesystem1
-# echo "this is a test file" > testfile
-```
-
-### Binding the Stratis pool to the Tang server
-
-At this point, we have the encrypted Stratis pool created, and also have a filesystem created in the pool. The next step is to bind your Stratis pool to the Tang server that you just setup. Do this with the _stratis pool bind nbde_ command.
-
-When you make the Tang binding, you need to pass several parameters to the command:
-
- * the pool name (in this example, pool1)
- * the key descriptor name (in this example, pool1key)
- * the Tang server name (in this example, )
-
-
-
-Recall that on the Tang server, you previously ran _tang-show-keys_ which showed the Tang output signing key thumbprint is _l3fZGUCmnvKQF_OA6VZF9jf8z2s_. In addition to the previous parameters, you either need to pass this thumbprint with the parameter _–thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s_, or skip the verification of the thumbprint with the _–trust-url_ parameter. ****
-
-It is more secure to use the _–thumbprint_ parameter. For example:
-
-```
-# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s
-```
-
-### Unlocking the Stratis Pool with NBDE
-
-Next reboot the host, and validate that you can unlock the Stratis pool with NBDE, without requiring the use of the key passphrase. After rebooting the host, the pool is no longer available:
-
-```
-# stratis pool list
-Name Total Physical Properties
-```
-
-To unlock the pool using NBDE, run the following command:
-
-```
-# stratis pool unlock clevis
-```
-
-Note that you did not need to use the key passphrase. This command could be automated to run during the system boot up.
-
-At this point, the pool is now available:
-
-```
-# stratis pool list
-Name Total Physical Properties
-pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr
-```
-
-You can mount the filesystem and access the file that was previously created:
-
-```
-# mount /dev/stratis/pool1/filesystem1 /filesystem1/
-# cat /filesystem1/testfile
-this is a test file
-```
-
-### Rotating Tang server keys
-
-Best practices recommend that you periodically rotate the Tang server keys and update the Stratis client servers to use the new Tang keys.
-
-To generate new Tang keys, start by logging in to your Tang server and look at the current status of the /var/db/tang directory. Then, run the _tang-show-keys_ command:
-
-```
-# ls -al /var/db/tang
-total 8
-drwx------. 1 tang tang 124 Mar 15 15:51 .
-drwxr-xr-x. 1 root root 16 Mar 15 15:48 ..
--rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk
--rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk
-# tang-show-keys
-l3fZGUCmnvKQF_OA6VZF9jf8z2s
-```
-
-To generate new keys, run tangd-keygen and point it to the /var/db/tang directory:
-
-```
-# /usr/libexec/tangd-keygen /var/db/tang
-```
-
-If you look at the /var/db/tang directory again, you will see two new files:
-
-```
-# ls -al /var/db/tang
-total 16
-drwx------. 1 tang tang 248 Mar 22 10:41 .
-drwxr-xr-x. 1 root root 16 Mar 15 15:48 ..
--rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk
--rw-r--r--. 1 root root 354 Mar 22 10:41 iyG5HcF01zaPjaGY6L_3WaslJ_E.jwk
--rw-r--r--. 1 root root 349 Mar 22 10:41 jHxerkqARY1Ww_H_8YjQVZ5OHao.jwk
--rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk
-```
-
-And if you run _tang-show-keys_, it will show the keys being advertised by Tang:
-
-```
-# tang-show-keys
-l3fZGUCmnvKQF_OA6VZF9jf8z2s
-iyG5HcF01zaPjaGY6L_3WaslJ_E
-```
-
-You can prevent the old key (starting with l3fZ) from being advertised by renaming the two original files to be hidden files, starting with a period. With this method, the old key will no longer be advertised, however it will still be usable by any existing clients that haven’t been updated to use the new key. Once all clients have been updated to use the new key, these old key files can be deleted.
-
-```
-# cd /var/db/tang
-# mv hbjJEDXy8G8wynMPqiq8F47nJwo.jwk .hbjJEDXy8G8wynMPqiq8F47nJwo.jwk
-# mv l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk .l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk
-```
-
-At this point, if you run _tang-show-keys_ again, only the new key is being advertised by Tang:
-
-```
-# tang-show-keys
-iyG5HcF01zaPjaGY6L_3WaslJ_E
-```
-
-Next, switch over to your Stratis system and update it to use the new Tang key. Stratis supports doing this while the filesystem(s) are online.
-
-First, unbind the pool:
-
-```
-# stratis pool unbind pool1
-```
-
-Next, set the key with the original passphrase used when the encrypted pool was created:
-
-```
-# stratis key set --capture-key pool1key
-Enter key data followed by the return key:
-```
-
-Finally, bind the pool to the Tang server with the updated key thumbprint:
-
-```
-# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint iyG5HcF01zaPjaGY6L_3WaslJ_E
-```
-
-The Stratis system is now configured to use the updated Tang key. Once any other client systems using the old Tang key have been updated, the two original key files that were renamed to hidden files in the /var/db/tang directory on the Tang server can be backed up and deleted.
-
-### What if the Tang server is unavailable?
-
-Next, shutdown the Tang server to simulate it being unavailable, then reboot the Stratis system.
-
-Again, after the reboot, the Stratis pool is not available:
-
-```
-# stratis pool list
-Name Total Physical Properties
-```
-
-If you try to unlock it with NBDE, this fails because the Tang server is unavailable:
-
-```
-# stratis pool unlock clevis
-Execution failed:
-An iterative command generated one or more errors: The operation 'unlock' on a resource of type pool failed. The following errors occurred:
-Partial action "unlock" failed for pool with UUID 4d62f840f2bb4ec9ab53a44b49da3f48: Cryptsetup error: Failed with error: Error: Command failed: cmd: "clevis" "luks" "unlock" "-d" "/dev/vdb" "-n" "stratis-1-private-42142fedcb4c47cea2e2b873c08fcf63-crypt", exit reason: 1 stdout: stderr: /dev/vdb could not be opened.
-```
-
-At this point, without the Tang server being reachable, the only option to unlock the pool is to use the original key passphrase:
-
-```
-# stratis key set --capture-key pool1key
-Enter key data followed by the return key:
-```
-
-You can then unlock the pool using the key:
-
-```
-# stratis pool unlock keyring
-```
-
-Next, verify the pool was successfully unlocked:
-
-```
-# stratis pool list
-Name Total Physical Properties
-pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr
-```
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/network-bound-disk-encryption-with-stratis/
-
-作者:[briansmith][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://fedoramagazine.org/author/briansmith/
-[b]: https://github.com/lujun9972
-[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/stratis-nbde-816x345.jpg
-[2]: https://unsplash.com/@imattsmart?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
-[3]: https://unsplash.com/s/photos/lock?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
-[4]: https://fedoramagazine.org/getting-started-with-stratis-encryption/
-[5]: https://stratis-storage.github.io/
-[6]: https://www.youtube.com/watch?v=CJu3kmY-f5o
-[7]: https://github.com/latchset/tang
-[8]: https://github.com/latchset/clevis
diff --git a/sources/tech/20210407 What is Git cherry-picking.md b/sources/tech/20210407 What is Git cherry-picking.md
deleted file mode 100644
index eede7de952..0000000000
--- a/sources/tech/20210407 What is Git cherry-picking.md
+++ /dev/null
@@ -1,200 +0,0 @@
-[#]: subject: (What is Git cherry-picking?)
-[#]: via: (https://opensource.com/article/21/4/cherry-picking-git)
-[#]: author: (Rajeev Bera https://opensource.com/users/acompiler)
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-What is Git cherry-picking?
-======
-Learn the what, why, and how of the git cherry-pick command.
-![Measuring and baking a cherry pie recipe][1]
-
-Whenever you're working with a group of programmers on a project, whether small or large, handling changes between multiple Git branches can become difficult. Sometimes, instead of combining an entire Git branch into a different one, you want to select and move a couple of specific commits. This procedure is known as "cherry-picking."
-
-This article will cover the what, why, and how of cherry-picking.
-
-So let's start.
-
-### What is cherry-pick?
-
-With the `cherry-pick` command, Git lets you incorporate selected individual commits from any branch into your current [Git HEAD][2] branch.
-
-When performing a `git merge` or `git rebase`, all the commits from a branch are combined. The `cherry-pick` command allows you to select individual commits for integration.
-
-### Benefits of cherry-pick
-
-The following situation might make it easier to comprehend the way cherry-picking functions.
-
-Imagine you are implementing new features for your upcoming weekly sprint. When your code is ready, you will push it into the remote branch, ready for testing.
-
-However, the customer is not delighted with all of the modifications and requests that you present only certain ones. Because the client hasn't approved all changes for the next launch, `git rebase` wouldn't create the desired results. Why? Because `git rebase` or `git merge` will incorporate every adjustment from the last sprint.
-
-Cherry-picking is the answer! Because it focuses only on the changes added in the commit, cherry-picking brings in only the approved changes without adding other commits.
-
-There are several other reasons to use cherry-picking:
-
- * It is essential for bug fixing because bugs are set in the development branch using their commits.
- * You can avoid unnecessary battles by using `git cherry-pick` instead of other options that apply changes in the specified commits, e.g., `git diff`.
- * It is a useful tool if a full branch unite is impossible because of incompatible versions in the various Git branches.
-
-
-
-### Using the cherry-pick command
-
-In the `cherry-pick` command's simplest form, you can just use the [SHA][3] identifier for the commit you want to integrate into your current HEAD branch.
-
-To get the commit hash, you can use the `git log` command:
-
-
-```
-`$ git log --oneline`
-```
-
-Once you know the commit hash, you can use the `cherry-pick` command.
-
-The syntax is:
-
-
-```
-`$ git cherry-pick `
-```
-
-For example:
-
-
-```
-`$ git cherry-pick 65be1e5`
-```
-
-This will dedicate the specified change to your currently checked-out branch.
-
-If you'd like to make further modifications, you can also instruct Git to add commit changes to your working copy.
-
-The syntax is:
-
-
-```
-`$ git cherry-pick --no-commit`
-```
-
-For example:
-
-
-```
-`$ git cherry-pick 65be1e5 --no-commit`
-```
-
-If you would like to select more than one commit simultaneously, add their commit hashes separated by a space:
-
-
-```
-`$ git cherry-pick hash1 hash3`
-```
-
-When cherry-picking commits, you can't use the `git pull` command because it fetches _and_ automatically merges commits from one repository into another. The `cherry-pick` command is a tool you use to specifically not do that; instead, use `git fetch`, which fetches commits but does not apply them. There's no doubt that `git pull` is convenient, but it's imprecise.
-
-### Try it yourself
-
-To try the process, launch a terminal and generate a sample project:
-
-
-```
-$ mkdir fruit.git
-$ cd fruit.git
-$ git init .
-```
-
-Create some data and commit it:
-
-
-```
-$ echo "Kiwifruit" > fruit.txt
-$ git add fruit.txt
-$ git commit -m 'First commit'
-```
-
-Now, represent a remote developer by creating a fork of your project:
-
-
-```
-$ mkdir ~/fruit.fork
-$ cd !$
-$ echo "Strawberry" >> fruit.txt
-$ git add fruit.txt
-$ git commit -m 'Added a fruit"
-```
-
-That's a valid commit. Now, create a bad commit to represent something you wouldn't want to merge into your project:
-
-
-```
-$ echo "Rhubarb" >> fruit.txt
-$ git add fruit.txt
-$ git commit -m 'Added a vegetable that tastes like a fruit"
-```
-
-Return to your authoritative repo and fetch the commits from your imaginary developer:
-
-
-```
-$ cd ~/fruit.git
-$ git remote add dev ~/fruit.fork
-$ git fetch dev
-remote: Counting objects: 6, done.
-remote: Compressing objects: 100% (2/2), done.
-remote: Total 6 (delta 0), reused 0 (delta 0)
-Unpacking objects: 100% (6/6), done...
-
-[/code] [code]
-
-$ git log –oneline dev/master
-e858ab2 Added a vegetable that tastes like a fruit
-0664292 Added a fruit
-b56e0f8 First commit
-```
-
-You've fetched the commits from your imaginary developer, but you haven't merged them into your repository yet. You want to accept the second commit but not the third, so use `cherry-pick`:
-
-
-```
-`$ git cherry-pick 0664292`
-```
-
-The second commit is now in your repository:
-
-
-```
-$ cat fruit.txt
-Kiwifruit
-Strawberry
-```
-
-Push your changes to your remote server, and you're done!
-
-### Reasons to avoid cherry-picking
-
-Cherry-picking is usually discouraged in the developer community. The primary reason is that it creates duplicate commits, but you also lose the ability to track your commit history.
-
-If you're cherry-picking a lot of commits out of order, those commits will be recorded in your branch, and it might lead to undesirable results in your Git branch.
-
-Cherry-picking is a powerful command that might cause problems if it's used without a proper understanding of what might occur. However, it may save your life (or at least your day job) when you mess up and make commits to the wrong branches.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/21/4/cherry-picking-git
-
-作者:[Rajeev Bera][a]
-选题:[lujun9972][b]
-译者:[译者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/acompiler
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/pictures/cherry-picking-recipe-baking-cooking.jpg?itok=XVwse6hw (Measuring and baking a cherry pie recipe)
-[2]: https://acompiler.com/git-head/
-[3]: https://en.wikipedia.org/wiki/Secure_Hash_Algorithms
diff --git a/sources/tech/20210407 Why I love using bspwm for my Linux window manager.md b/sources/tech/20210407 Why I love using bspwm for my Linux window manager.md
deleted file mode 100644
index c3285f24f2..0000000000
--- a/sources/tech/20210407 Why I love using bspwm for my Linux window manager.md
+++ /dev/null
@@ -1,114 +0,0 @@
-[#]: subject: (Why I love using bspwm for my Linux window manager)
-[#]: via: (https://opensource.com/article/21/4/bspwm-linux)
-[#]: author: (Stephen Adams https://opensource.com/users/stevehnh)
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-Why I love using bspwm for my Linux window manager
-======
-Install, configure, and start using the bspwm window manager on Fedora
-Linux.
-![Tall building with windows][1]
-
-Some folks like to rearrange furniture. Other folks like to try new shoes or redecorate their bedroom on the regular. Me? I try out Linux desktops.
-
-After drooling over some of the incredible desktop environments I've seen online, I got curious about one window manager in particular: [bspwm][2].
-
-![bspwm desktop][3]
-
-(Stephen Adams, [CC BY-SA 4.0][4])
-
-I've been a fan of the [i3][5] window manager for quite a while, and I enjoy the way everything is laid out and the ease of getting started. But something about bspwm called to me. There are a few reasons I decided to try it out:
-
- * It is _only_ a window manager.
- * It is managed by a few easy-to-configure scripts.
- * It supports gaps between windows by default.
-
-
-
-The first reason—that it is simply a window manager—is probably the top thing to point out. Like i3, there are no graphical bells and whistles applied by default. You can certainly customize it to your heart's content, but _you_ will be putting in all the work to make it look like you want. That's part of its appeal to me.
-
-Although it is available on many distributions, my examples use Fedora Linux.
-
-### Install bspwm
-
-Bspwm is packaged in most common distributions, so you can install it with your system's package manager. This command also installs [sxkhd][6], a daemon for the X Window System "that reacts to input events by executing commands," and [dmenu][7], a generic X Window menu:
-
-
-```
-`dnf install bspwm sxkhd dmenu`
-```
-
-Since bspwm is _just_ a window manager, there aren't any built-in shortcuts or keyboard commands. This is where it stands in contrast to something like i3. sxkhd makes it easier to get going. So, go ahead and configure sxkhd before you fire up the window manager for the first time:
-
-
-```
-systemctl start sxkhd
-systemctl enable sxkhd
-```
-
-This enables sxkhd at login, but you also need a configuration with some basic functionality ready to go:
-
-
-```
-`curl https://raw.githubusercontent.com/baskerville/bspwm/master/examples/sxhkdrc --output ~/.config/sxkhd/sxkhdrc`
-```
-
-It's worth taking a look at this file before you get much further, as some commands that the scripts call may not exist on your system. A good example is the `super + Return` shortcut that calls `urxvt`. Change this to your preferred terminal, especially if you do not have urxvt installed:
-
-
-```
-#
-# wm independent hotkeys
-#
-
-# terminal emulator
-super + Return
- urxvt
-
-# program launcher
-super + @space
- dmenu_run
-```
-
-If you are using GDM, LightDM, or another display manager, just choose bspwm before logging in.
-
-### Configure bspwm
-
-Once you are logged in, you'll see a whole lot of nothing on the screen. That's not a sense of emptiness you feel. It's possibility! You are now ready to start fiddling with all the parts of a desktop environment that you have taken for granted all these years. Building from scratch is not easy, but it's very rewarding once you get the hang of it.
-
-The most difficult thing about any window manager is getting a handle on the shortcuts. You're going to be slow to start, but in a short time, you'll be flying around your system using your keyboard alone and looking like an ultimate hacker to your friends and family.
-
-You can tailor the system as much as you want by editing `~/.config/bspwm/bspwmrc` to add apps at launch, set up your desktops and monitors, and set rules for how your windows should behave. There are a few examples set by default to get you going. Keyboard shortcuts are all managed by the **sxkhdrc** file.
-
-There are plenty more open source projects to install to really get things looking nice—like [Feh][8] for desktop backgrounds, [Polybar][9] for that all-important status bar, [Rofi][10] to really help your app launcher pop, and [Compton][11] to give you the shadows and transparency to get things nice and shiny.
-
-Happy hacking!
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/21/4/bspwm-linux
-
-作者:[Stephen Adams][a]
-选题:[lujun9972][b]
-译者:[译者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/stevehnh
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/windows_building_sky_scale.jpg?itok=mH6CAX29 (Tall building with windows)
-[2]: https://github.com/baskerville/bspwm
-[3]: https://opensource.com/sites/default/files/uploads/bspwm-desktop.png (bspwm desktop)
-[4]: https://creativecommons.org/licenses/by-sa/4.0/
-[5]: https://i3wm.org/
-[6]: https://github.com/baskerville/sxhkd
-[7]: https://linux.die.net/man/1/dmenu
-[8]: https://github.com/derf/feh
-[9]: https://github.com/polybar/polybar
-[10]: https://github.com/davatorium/rofi
-[11]: https://github.com/chjj/compton
diff --git a/sources/tech/20210409 4 ways open source gives you a competitive edge.md b/sources/tech/20210409 4 ways open source gives you a competitive edge.md
deleted file mode 100644
index a8782c3749..0000000000
--- a/sources/tech/20210409 4 ways open source gives you a competitive edge.md
+++ /dev/null
@@ -1,83 +0,0 @@
-[#]: subject: (4 ways open source gives you a competitive edge)
-[#]: via: (https://opensource.com/article/21/4/open-source-competitive-advantage)
-[#]: author: (Jason Blais https://opensource.com/users/jasonblais)
-[#]: collector: (lujun9972)
-[#]: translator: (DCOLIVERSUN)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-4 ways open source gives you a competitive edge
-======
-Using open source technology can help organizations drive better
-business outcomes.
-![Open ethernet cords.][1]
-
-Building a tech stack is a major decision for every organization. While picking the right tools will set your team up for success, picking the wrong solutions or platforms can have devastating effects on productivity and profitability. To succeed in today's fast-paced world, organizations must make smart investments in digital solutions that enable them to move faster and increase operational agility.
-
-This is precisely why more and more organizations of all sizes and across all industries are embracing open source solutions. According to a recent [McKinsey][2] report, open source adoption is the biggest differentiator for top-performing organizations.
-
-Here are four reasons why adopting open source technology can help organizations drive competitive advantage and experience better business outcomes.
-
-### 1\. Extensibility and flexibility
-
-Suffice it to say the world of technology moves quickly. For example, Kubernetes didn't exist before 2014, but today, it's impressively ubiquitous. According to the CNCF's [2020 Cloud Native Survey][3], 91% of teams are using Kubernetes in some form.
-
-One of the main reasons organizations are investing in open source is because it enables them to operate with agility and rapidly integrate new technologies into their stack. That's compared to the more traditional approach, where teams would take quarters or even years to vet, implement, and adopt software—making it impossible for them to pivot with any sense of urgency.
-
-Since open source solutions offer complete access to source code, teams can easily connect the software to the other tools they use every day.
-
-Simply put, open source enables development teams to build the perfect tool for what is at hand instead of being forced to change how they work to fit into how inflexible proprietary tools are designed.
-
-### 2\. Security and high-trust collaboration
-
-In the age of high-profile data breaches, organizations need highly secure tools that enable them to keep sensitive data secure.
-
-When vulnerabilities exist in proprietary solutions, they're often undiscovered until it's too late. Unfortunately for the teams using these platforms, the lack of visibility into source code means they're essentially outsourcing security to the specific vendor and hoping for the best.
-
-Another main driver of open source adoption is that open source tools enable organizations to take control over their own security. For example, open source projects—particularly those with large communities—tend to receive more responsible vulnerability disclosures because everyone using the product can thoroughly inspect the source code.
-
-Since the source code is freely available, such disclosures often come with detailed proposed solutions for fixing bugs. This enables dev teams to remedy issues faster, continuously strengthening the software.
-
-In the age of remote work, it's more important than ever for distributed teams to collaborate while knowing that sensitive data stays protected. Since open source solutions allow organizations to audit security while maintaining complete control over their data, they can facilitate the high-trust collaboration needed to thrive in remote environments.
-
-### 3\. Freedom from vendor lock-in
-
-According to a [recent study][4], 68% of CIOs are concerned about vendor lock-in. They should be. When you're locked into a piece of technology, you're forced to live with someone else's conclusions instead of making your own.
-
-Proprietary solutions often make it [challenging to take data with you][5] when an organization switches vendors. On the other hand, open source tools offer the freedom and flexibility needed to avoid vendor lock-in and take data wherever an organization wants to go.
-
-### 4\. Top talent and community
-
-As more and more companies [embrace remote work][6], the war for talent is becoming even more competitive.
-
-In the world of software development, landing top talent starts with giving engineers access to modern tools that enable them to reach their full potential at work. Since developers increasingly [prefer open source solutions][7] to proprietary counterparts, organizations should strongly consider open source alternatives to their commercial solutions to attract the best developers on the market.
-
-In addition to making it easier to hire and retain top talent, open source platforms also enable companies to tap into a community of contributors for advice on how to walk through problems and get the most out of the platform. Plus, members of the community also [contribute to open source projects directly][8].
-
-### Open source offers freedom
-
-Open source software is increasingly popular among enterprise teams—[for good reason][9]. It gives teams the flexibility needed to build the perfect tool for the job while enabling them to maintain a highly secure environment. At the same time, an open source approach allows teams to maintain control of their future, rather than being locked into one vendor's roadmap. And it also gives companies access to talented engineers and members of the open source community.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/21/4/open-source-competitive-advantage
-
-作者:[Jason Blais][a]
-选题:[lujun9972][b]
-译者:[译者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/jasonblais
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openwires_fromRHT_520_0612LL.png?itok=PqZi55Ab (Open ethernet cords.)
-[2]: https://www.mckinsey.com/industries/technology-media-and-telecommunications/our-insights/developer-velocity-how-software-excellence-fuels-business-performance#
-[3]: https://www.cncf.io/blog/2020/11/17/cloud-native-survey-2020-containers-in-production-jump-300-from-our-first-survey/
-[4]: https://solutionsreview.com/cloud-platforms/flexera-68-percent-of-cios-worry-about-vendor-lock-in-with-public-cloud/
-[5]: https://www.computerworld.com/article/3428679/mattermost-makes-case-for-open-source-as-team-messaging-market-booms.html
-[6]: https://mattermost.com/blog/tips-for-working-remotely/
-[7]: https://opensource.com/article/20/6/open-source-developers-survey
-[8]: https://mattermost.com/blog/100-most-popular-mattermost-features-invented-and-contributed-by-our-amazing-open-source-community/
-[9]: https://mattermost.com/open-source-advantage/
diff --git a/sources/tech/20210410 5 signs you-re a groff programmer.md b/sources/tech/20210410 5 signs you-re a groff programmer.md
deleted file mode 100644
index 6708800e7e..0000000000
--- a/sources/tech/20210410 5 signs you-re a groff programmer.md
+++ /dev/null
@@ -1,77 +0,0 @@
-[#]: subject: (5 signs you're a groff programmer)
-[#]: via: (https://opensource.com/article/21/4/groff-programmer)
-[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-5 signs you're a groff programmer
-======
-Learning groff, an old-school text processor, is like learning to ride a
-bicycle.
-![Typewriter in the grass][1]
-
-I first discovered Unix systems in the early 1990s, when I was an undergraduate at university. I liked it so much that I replaced the MS-DOS system on my home computer with the Linux operating system.
-
-One thing that Linux didn't have in the early to mid-1990s was a word processor. A standard office application on other desktop operating systems, a word processor lets you edit text easily. I often used a word processor on DOS to write my papers for class. I wouldn't find a Linux-native word processor until the late 1990s. Until then, word processing was one of the rare reasons I maintained dual-boot on my first computer, so I could occasionally boot back into DOS to write papers.
-
-Then I discovered that Linux provided kind of a word processor. GNU troff, better known as [groff][2], is a modern implementation of a classic text processing system called troff, short for "typesetter roff," which is an improved version of the nroff system. And nroff was meant to be a new implementation of the original roff (which stood for "run off," as in to "run off" a document).
-
-With text processing, you edit text in a plain text editor, and you add formatting through macros or other processing commands. You then process that text file through a text-processing system such as groff to generate formatted output suitable for a printer. Another well-known text processing system is LaTeX, but groff was simple enough for my needs.
-
-With a little practice, I found I could write my class papers just as easily in groff as I could using a word processor on Linux. While I don't use groff to write documents today, I still remember the macros and commands to generate printed documents with it. And if you're the same and you learned how to write with groff all those years ago, you probably recognize these five signs that you're a groff writer.
-
-### 1\. You have a favorite macro set
-
-You format a document in groff by writing plain text interspersed with macros. A macro in groff is a short command that starts with a single period at the beginning of a line. For example: if you want to insert a few lines into your output, the `.sp 2` macro command adds two blank lines. groff supports other basic macros for all kinds of formatting.
-
-To make formatting a document easier for the writer, groff also provides different _macro sets_, collections of macros that let you format documents your own way. The first macro set I learned was the `-me` macro set. Really, the macro set is called the `e` macro set, and you specify the `e` macro set when you process a file using the `-me` option.
-
-groff includes other macro sets, too. For example, the `-man` macro set used to be the standard macro set to format the built-in _manual_ pages on Unix systems, and the `-ms` macro set is often used to format certain other technical documents. If you learned to write with groff, you probably have a favorite macro set.
-
-### 2\. You want to focus on your content, not the formatting
-
-One great feature of writing with groff is that you can focus on your _content_ and not worry too much about what it looks like. That is a handy feature for technical writers. groff is a great "distraction-free" environment for professional writers. At least, as long as you don't mind delivering your output in any of the formats that groff supports with the `-T` command-line option, including PDF, PostScript, HTML, and plain text. You can't generate a LibreOffice ODT file or Word DOC file directly from groff.
-
-Once you get comfortable writing in groff, the macros start to _disappear_. The formatting macros become part of the background, and you focus purely on the text in front of you. I've done enough writing in groff that I don't even see the macros anymore. Maybe it's like writing programming code, and your mind just switches gears, so you think like a computer and see the code as a set of instructions. For me, writing in groff is like that; I just see my text, and my mind interprets the macros automatically into formatting.
-
-### 3\. You like the old-school feel
-
-Sure, it might be _easier_ to write your documents with a more typical word processor like LibreOffice Writer or even Google Docs or Microsoft Word. And for certain kinds of documents, a desktop word processor is the right fit. But if you want the "old-school" feel, it's hard to beat writing in groff.
-
-I'll admit that I do most of my writing with LibreOffice Writer, which does an outstanding job. But when I get that itch to do it "old-school," I'll open an editor and write my document using groff.
-
-### 4\. You like that you can use it anywhere
-
-groff (and its cousins) are a standard package on almost any Unix system. And with groff, the macros don't change. For example, the `-me` macros should be the same from system to system. So once you've learned to use the macros on one system, you can use them on the next system.
-
-And because groff documents are just plain text, you can use any editor you like to edit your documents for groff. I like to use GNU Emacs to edit my groff documents, but you can use GNOME Gedit, Vim, or your [favorite text editor][3]. Most editors include some kind of "mode" that will highlight the groff macros in a different color from the rest of your text to help you spot errors before processing the file.
-
-### 5\. You wrote this article in -me
-
-When I decided to write this article, I thought the best way would be to use groff directly. I wanted to demonstrate how flexible groff was in preparing documents. So even though you're reading this on a website, the article was originally written using groff.
-
-I hope this has interested you in learning how to use groff to write documents. If you'd like to use more advanced functions in the `-me` macro set, refer to Eric Allman's _Writing papers with groff using -me_, which you should find on your system as **meintro.me** in groff's documentation. It's a great reference document that explains other ways to format papers using the `-me` macros.
-
-I've also included a copy of the original draft of my article that uses the `-me` macros. Save the file to your system as **five-signs-groff.me**, and run it through groff to view it. The `-T` option sets the output type, such as `-Tps` to generate PostScript output or `-Thtml` to create an HTML file. For example:
-
-groff -me -Thtml five-signs-groff.me > five-signs-groff.html
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/21/4/groff-programmer
-
-作者:[Jim Hall][a]
-选题:[lujun9972][b]
-译者:[译者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/jim-hall
-[b]: https://github.com/lujun9972
-[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/doc-dish-lead.png?itok=h3fCkVmU (Typewriter in the grass)
-[2]: https://en.wikipedia.org/wiki/Groff_(software)
-[3]: https://opensource.com/article/21/2/open-source-text-editors
diff --git a/sources/tech/20210410 How to Install Steam on Fedora -Beginner-s Tip.md b/sources/tech/20210410 How to Install Steam on Fedora -Beginner-s Tip.md
deleted file mode 100644
index 7a36c9f9db..0000000000
--- a/sources/tech/20210410 How to Install Steam on Fedora -Beginner-s Tip.md
+++ /dev/null
@@ -1,117 +0,0 @@
-[#]: subject: (How to Install Steam on Fedora [Beginner’s Tip])
-[#]: via: (https://itsfoss.com/install-steam-fedora/)
-[#]: author: (John Paul https://itsfoss.com/author/john/)
-[#]: collector: (lujun9972)
-[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-
-How to Install Steam on Fedora [Beginner’s Tip]
-======
-
-Steam is the best thing that could happen to Linux gamers. Thanks to Steam, you can play hundreds and thousands of games on Linux.
-
-If you are not already aware of it, Steam is the most popular PC gaming platform. In 2013, it became available for Linux. [Steam’s latest Proton project][1] allows you to play games created for Windows platform on Linux. This enhanced Linux gaming library many folds.
-
-![][2]
-
-Steam provides a desktop client and you can use it to download or purchase games from the Steam store, install the game and play it.
-
-We have discussed [installing Steam on Ubuntu][3] in the past. In this beginner’s tutorial, I am going to show you the steps for installing Steam on Fedora Linux.
-
-### Installing Steam on Fedora
-
-To get Steam on Fedora, you’ll have to use RMPFusion repository. [RPMFusion][4] is a series of third-party repos that contain software that Fedora chooses not to ship with their operating system. They offer both free (open source) and non-free (closed source) repos. Since Steam is in the non-free repo, you will only install that one.
-
-I shall go over both the terminal and graphical installation methods.
-
-#### Method 1: Install Steam via terminal
-
-This is the easiest method because it requires the fewest steps. Just enter the following command to enable the free repo:
-
-```
-sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
-```
-
-You will be asked to enter your password. You will then be asked to verify that you want to install these repos. Once you approve it, the installation of the repo will be completed.
-
-To install Steam, simply enter the following command:
-
-```
-sudo dnf install steam
-```
-
-![Install Steam via command line][5]
-
-Enter your password and press “Y” to accept. Once installed, open Steam and play some games.
-
-#### Method 2: Install Steam via GUI
-
-You can [enable the third-party repository on Fedora][6] from the Software Center. Open the Software Center application and click on the hamburger menu:
-
-![][7]
-
-In the Software Repositories window, you will see a section at the top that says “Third Party Repositories”. Click the Install button. Enter your password when you are prompted and you are done.
-
-![][8]
-
-Once you have installed RPM Fusion repository for Steam, update your system’s software cache (if needed) and search for Steam in the software center.
-
-![Steam in GNOME Software Center][9]
-
-Once that installation is complete, open up the GNOME Software Center and search for Steam. Once you locate the Steam page, click install. Enter your password when asked and you’re done.
-
-After installing Steam, start the application, enter your Steam account details or register for it and enjoy your games.
-
-### Using Steam as Flatpak
-
-Steam is also available as a Flatpak. Flatpak is installed by default on Fedora. Before we can install Steam using that method, we have to install the Flathub repo.
-
-![Install Flathub][10]
-
-First, open the [Flatpak site][11] in your browser. Now, click the blue button marked “Flathub repository file”. The browser will ask you if you want to open the file in GNOME Software Center. Click okay. Once GNOME Software Center open, click the install button. You will be prompted to enter your password.
-
-If you get an error when you try to install the Flathub repo, run this command in the terminal:
-
-```
-flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
-```
-
-With the Flathub repo installed, all you need to do is search for Steam in the GNOME Software Center. Once you find it, install it, and you are ready to go.
-
-![Fedora Repo Select][12]
-
-The Flathub version of Steam has several add-ons you can install, as well. These include a DOS compatibility tool and a couple of tools for [Vulkan][13] and Proton.
-
-![][14]
-
-I think this should help you with Steam on Fedora. Enjoy your games :)
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/install-steam-fedora/
-
-作者:[John Paul][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/john/
-[b]: https://github.com/lujun9972
-[1]: https://itsfoss.com/steam-play-proton/
-[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2017/05/Steam-Store.jpg?resize=800%2C382&ssl=1
-[3]: https://itsfoss.com/install-steam-ubuntu-linux/
-[4]: https://rpmfusion.org/
-[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/install-steam-fedora.png?resize=800%2C588&ssl=1
-[6]: https://itsfoss.com/fedora-third-party-repos/
-[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/software-meni.png?resize=800%2C672&ssl=1
-[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/11/fedora-third-party-repo-gui.png?resize=746%2C800&ssl=1
-[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/gnome-store-steam.jpg?resize=800%2C434&ssl=1
-[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/flatpak-install-button.jpg?resize=800%2C434&ssl=1
-[11]: https://www.flatpak.org/setup/Fedora/
-[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/fedora-repo-select.jpg?resize=800%2C434&ssl=1
-[13]: https://developer.nvidia.com/vulkan
-[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/steam-flatpak-addons.jpg?resize=800%2C434&ssl=1
diff --git a/sources/tech/20210412 Scheduling tasks with cron.md b/sources/tech/20210412 Scheduling tasks with cron.md
new file mode 100644
index 0000000000..5f0e427d42
--- /dev/null
+++ b/sources/tech/20210412 Scheduling tasks with cron.md
@@ -0,0 +1,207 @@
+[#]: subject: (Scheduling tasks with cron)
+[#]: via: (https://fedoramagazine.org/scheduling-tasks-with-cron/)
+[#]: author: (Darshna Das https://fedoramagazine.org/author/climoiselle/)
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+
+Scheduling tasks with cron
+======
+
+![][1]
+
+Photo by [Yomex Owo][2] on [Unsplash][3]
+
+Cron is a scheduling daemon that executes tasks at specified intervals. These tasks are called _cron_ jobs and are mostly used to automate system maintenance or administration tasks. For example, you could set a _cron_ job to automate repetitive tasks such as backing up database or data, updating the system with the latest security patches, checking the disk space usage, sending emails, and so on. The _cron_ jobs can be scheduled to run by the minute, hour, day of the month, month, day of the week, or any combination of these.
+
+### **Some advantages of cron**
+
+These are a few of the advantages of using _cron_ jobs:
+
+ * You have much more control over when your job runs i.e. you can control the minute, the hour, the day, etc. when it will execute.
+ * It eliminates the need to write the code for the looping and logic of the task and you can shut it off when you no longer need to execute the job.
+ * Jobs do not occupy your memory when not executing so you are able to save the memory allocation.
+ * If a job fails to execute and exits for some reason it will run again when the proper time comes.
+
+
+
+### Installing the cron daemon
+
+Luckily Fedora Linux is pre-configured to run important system tasks to keep the system updated. There are several utilities that can run tasks such as _cron_, _anacron_, _at_ and _batch_. This article will focus on the installation of the _cron_ utility only. Cron is installed with the _cronie_ package that also provides the _cron_ services.
+
+To determine if the package is already present or not, use the rpm command:
+
+```
+$ rpm -q cronie
+ Cronie-1.5.2-4.el8.x86_64
+```
+
+If the _cronie_ package is installed it will return the full name of the _cronie_ package. If you do not have the package present in your system it will say the package is not installed.
+To install type this:
+
+```
+$ dnf install cronie
+```
+
+### Running the cron daemon
+
+A _cron_ job is executed by the _crond_ service based on information from a configuration file. Before adding a job to the configuration file, however, it is necessary to start the _crond_ service, or in some cases install it. What is _crond_? _Crond_ is the compressed name of cron daemon (crond). To determine if the _crond_ service is running or not, type in the following command:
+
+```
+$ systemctl status crond.service
+● crond.service - Command Scheduler
+ Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor pre>
+ Active: active (running) since Sat 2021-03-20 14:12:35 PDT; 1 day 21h ago
+ Main PID: 1110 (crond)
+```
+
+If you do not see something similar including the line “Active: active (running) since…”, you will have to start the _crond_ daemon. To run the _crond_ service in the current session, enter the following command:
+
+```
+$ systemctl run crond.service
+```
+
+To configure the service to start automatically at boot time, type the following:
+
+```
+$ systemctl enable crond.service
+```
+
+If, for some reason, you wish to stop the _crond_ service from running, use the _stop_ command as follows:
+
+```
+$ systemctl stop crond.service
+```
+
+To restart it, simply use the _restart_ command:
+
+```
+$ systemctl restart crond.service
+```
+
+### Defining a cron job
+
+#### The cron configuration
+
+Here is an example of the configuration details for a _cron_ job. This defines a simple _cron_ job to pull the latest changes of a _git_ master branch into a cloned repository:
+
+```
+*/59 * * * * username cd /home/username/project/design && git pull origin master
+```
+
+There are two main parts:
+
+ * The first part is “*/59 * * * *”. This is where the timer is set to every 59 minutes.
+ * The rest of the line is the command as it would run from the command line.
+The command itself in this example has three parts:
+ * The job will run as the user “username”
+ * It will change to the directory /home/username/project/design
+ * The git command runs to pull the latest changes in the master branch.
+
+
+
+#### **Timing syntax**
+
+The timing information is the first part of the _cron_ job string, as mentioned above. This determines how often and when the cron job is going to run. It consists of 5 parts in this order:
+
+ * minute
+ * hour
+ * day of the month
+ * month
+ * day of the week
+
+
+
+Here is a more graphic way to explain the syntax may be seen here:
+
+```
+.---------------- minute (0 - 59)
+ | .------------- hour (0 - 23)
+ | | .---------- day of month (1 - 31)
+ | | | .------- month (1 - 12) OR jan,feb,mar,apr …
+ | | | | .---- day of week (0-6) (Sunday=0 or 7)
+ | | | | | OR sun,mon,tue,wed,thr,fri,sat
+ | | | | |
+ * * * * user-name command-to-be-executed
+```
+
+#### Use of the **asterisk**
+
+An asterisk (*) may be used in place of a number to represents all possible values for that position. For example, an asterisk in the minute position would make it run every minute. The following examples may help to better understand the syntax.
+
+This cron job will run every minute, all the time:
+
+```
+* * * * [command]
+```
+
+A slash (/) indicates a multiple number of minutes The following example will run 12 times per hour, i.e., every 5 minutes:
+
+```
+*/5 * * * * [command]
+```
+
+The next example will run once a month, on the second day of the month at midnight (e.g. January 2nd 12:00am, February 2nd 12:00am, etc.):
+
+```
+0 0 2 * * [command]
+```
+
+#### Using crontab to create a cron job
+
+Cron jobs run in the background and constantly check the _/etc/crontab_ file, and the _/etc/cron.*/_ and _/var/spool/cron/_ directories. Each user has a unique crontab file in _/var/spool/cron/_ .
+
+These _cron_ files are not supposed to be edited directly. The _crontab_ command is the method you use to create, edit, install, uninstall, and list cron jobs.
+
+The same _crontab_ command is used for creating and editing cron jobs. And what’s even cooler is that you don’t need to restart cron after creating new files or editing existing ones.
+
+```
+$ crontab -e
+```
+
+This opens your existing _crontab_ file or creates one if necessary. The _vi_ editor opens by default when calling _crontab -e_. Note: To edit the _crontab_ file using Nano editor, you can optionally set the **EDITOR**=nano environment variable.
+
+List all your _cron_ jobs using the option _-l_ and specify a user using the _-u_ option, if desired.
+
+```
+$ crontab -l
+$ crontab -u username -l
+```
+
+Remove or erase all your _cron_ jobs using the following command:
+
+```
+$ crontab -r
+```
+
+To remove jobs for a specific user you must run the following command as the _root user_:
+
+```
+$ crontab -r -u username
+```
+
+Thank you for reading. _cron_ jobs may seem like a tool just for system admins, but they are actually relevant to many kinds of web applications and user tasks.
+
+#### Reference
+
+Fedora Linux documentation for [Automated Tasks][4]
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/scheduling-tasks-with-cron/
+
+作者:[Darshna Das][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/climoiselle/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2021/03/schedule_with_cron-816x345.jpg
+[2]: https://unsplash.com/@yomex4life?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[3]: https://unsplash.com/s/photos/clock?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[4]: https://docs.fedoraproject.org/en-US/Fedora/12/html/Deployment_Guide/ch-autotasks.html
diff --git a/sources/tech/20210412 Send your scans to a Linux machine over your network.md b/sources/tech/20210412 Send your scans to a Linux machine over your network.md
new file mode 100644
index 0000000000..b9479545e4
--- /dev/null
+++ b/sources/tech/20210412 Send your scans to a Linux machine over your network.md
@@ -0,0 +1,205 @@
+[#]: subject: (Send your scans to a Linux machine over your network)
+[#]: via: (https://opensource.com/article/21/4/linux-scan-samba)
+[#]: author: (Marc Skinner https://opensource.com/users/marc-skinner)
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+
+Send your scans to a Linux machine over your network
+======
+Set up a Samba share to make a scanner easily accessible by a Linux
+computer over your network.
+![Files in a folder][1]
+
+The free software movement famously got started [because of a poorly designed printer][2]. Decades later, printer and scanner manufacturers continue to reinvent the wheel, ignoring established and universal protocols. As a result, every now and again, you'll stumble onto a printer or scanner that just doesn't seem to work with your operating system.
+
+This happened to me recently with a Canon 3-in-1 scanner (the Canon Maxify MB2720). I was able to solve the scanner's problem with open source. Specifically, I set up a Samba share to make the scanner available on my network.
+
+The [Samba project][3] is a Windows interoperability suite of programs for Linux and Unix. Although it's mostly low-level code that many users never knowingly interact with, the software makes it easy to share files over your local network, regardless of what platforms are used.
+
+I'm using Fedora, so these instructions should work for any RPM-based Linux distribution. Minor modifications may be necessary for other distributions. Here's how I did it.
+
+### Get the Canon tools
+
+Download the required Windows Canon Quick Utility Toolbox software from Canon's website. The software is required because it is the only way to configure the printer's destination folder location and credentials. Once this is done, you do not need to use the tool unless you want to make a change.
+
+Before configuring the printer, you must set up a Samba share on your Linux computer or server. Install Samba with the following command:
+
+
+```
+`$ sudo dnf -y install samba`
+```
+
+Create `/etc/smb.conf` file with the following content:
+
+
+```
+[global]
+ workgroup = WORKGROUP
+ netbios name = MYSERVER
+ security = user
+ #CORE needed for CANON PRINTER SCAN FOLDER
+ min protocol = CORE
+ #NTML AUTHV1 needed for CANON PRINTER SCAN FOLDER
+ ntlm auth = yes
+ passdb backend = tdbsam
+
+ printing = cups
+ printcap name = cups
+ load printers = no
+ cups options = raw
+
+ hosts allow = 127. 192.168.33.
+ max smbd processes = 1000
+
+[homes]
+ comment = Home Directories
+ valid users = %S, %D%w%S
+ browseable = No
+ writable = yes
+ read only = No
+ inherit acls = Yes
+
+[SCANS]
+ comment = MB2720 SCANS
+ path = /mnt/SCANS
+ public = yes
+ writable = yes
+ browseable = yes
+ printable = no
+ force user = tux
+ create mask = 770
+```
+
+In the `force user` line near the end, change the username from `tux` to your own username.
+
+Unfortunately, the Canon printer won't work with Server Message Block ([SMB][4]) protocols higher than CORE or NTML authentication v2. For this reason, the Samba share must be configured with the oldest SMB protocol and NTML authentication versions. This is not ideal by any means and has security implications, so I created a separate Samba server dedicated to the scanner use case. My other Samba server, which shares all home networked files, still uses SMB protocol 3 and NTML authentication v2.
+
+Start the Samba server service and enable it for restart:
+
+
+```
+$ sudo systemctl start smb
+$ sudo systemctl enable smb
+```
+
+### Create a Samba user
+
+Create your Samba user and a password for it:
+
+
+```
+`$ sudo smbpasswd -a tux`
+```
+
+Enter your password at the prompt.
+
+Assuming you want to mount your Samba scans on a Linux system, you need to do a few steps.
+
+Create a Samba client credentials file. Mine looks like this:
+
+
+```
+$ sudo cat /root/smb-credentials.txt
+username=tux
+password=mySTRONGpassword
+```
+
+Change the permissions so that it isn't world-readable:
+
+
+```
+`$ sudo chmod 640 /root/smb-credentials.txt`
+```
+
+Create a mount point and add it to `/etc/fstab`:
+
+
+```
+`$ sudo mkdir /mnt/MB2720-SCANS`
+```
+
+Add the following line into your `/etc/fstab`:
+
+
+```
+`//192.168.33.50/SCANS /mnt/MB2720-SCANS cifs vers=3.0,credentials=/root/smb-credentials.txt,gid=1000,uid=1000,_netdev 0 0`
+```
+
+This mounts the Samba share scans to the new mount point using [CIFS][5], forcing SMBv3, and using the username and password stored in `/root/smb-credetials.txt`. It also passes the user's group identifier (GID) and the user identifier (UID), giving you full ownership of the Linux mount. The `_netdev` option is required so that the mount point is mounted after networking is fully functional (after a reboot, for instance) because this mount requires networking to be accessed.
+
+### Configure the Canon software
+
+Now that you have created the Samba share, configured it on the server, and configured the share to be mounted on your Linux client, you need to launch the Canon Quick Utility Toolbox to configure the printer. Because Canon doesn't release this toolbox for Linux, this step requires Windows. You can try [running it on WINE][6], but should that fail, you'll have to either borrow a Windows computer from someone or run a [Windows developer virtual machine][7] in [GNOME Boxes][8] or [VirtualBox][9].
+
+Power on the printer, and then start the Canon Quick Utility Toolbox. It should find your printer. If it can't see your printer, you must configure the printer for either LAN or wireless networking first.
+
+In the toolbox, click on **Destination Folder Settings**.
+
+![Canon Quick Utility Toolbox][10]
+
+(Marc Skinner, [CC BY-SA 4.0][11])
+
+Enter the printer administration password—my default password was **canon**.
+
+Click the **Add** button.
+
+![Add destination folder][12]
+
+Fill out the form with a Displayed Name, your Samba share location, and your Samba username and password.
+
+I left the PIN Code blank, but if you want to require a PIN to be entered each time you scan from the printer, you can set one. This would be useful in an office where each user has their own Samba share and PIN to protect their scans.
+
+Click **Connection Test** to validate the form data.
+
+Click the **OK** button.
+
+Click **Register to Printer** to save your configuration back to the printer.
+
+![Register to Printer ][13]
+
+(Marc Skinner, [CC BY-SA 4.0][11])
+
+Everything is set up. Click **Exit**. You're done with Windows now, and probably the toolbox, unless you need to change something.
+
+### Start scanning
+
+You can now scan from the printer and select your Destination Folder from its LCD menu. Scans are saved directly to the Samba share, which you have access to from your Linux computer.
+
+For convenience, create a symbolic link on your Linux desktop or home directory with the following command:
+
+
+```
+`$ sudo ln -sd /mnt/MB2720-SCANS /home/tux/Desktop/MB2720-SCANS`
+```
+
+That's all there is to it!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/21/4/linux-scan-samba
+
+作者:[Marc Skinner][a]
+选题:[lujun9972][b]
+译者:[译者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/marc-skinner
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder)
+[2]: https://opensource.com/article/18/2/pivotal-moments-history-open-source
+[3]: http://samba.org/
+[4]: https://en.wikipedia.org/wiki/Server_Message_Block
+[5]: https://searchstorage.techtarget.com/definition/Common-Internet-File-System-CIFS
+[6]: https://opensource.com/article/21/2/linux-wine
+[7]: https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/
+[8]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization
+[9]: https://www.virtualbox.org/
+[10]: https://opensource.com/sites/default/files/uploads/canontoolbox.png (Canon Quick Utility Toolbox)
+[11]: https://creativecommons.org/licenses/by-sa/4.0/
+[12]: https://opensource.com/sites/default/files/add_destination_folder.png (Add destination folder)
+[13]: https://opensource.com/sites/default/files/uploads/canonregistertoprinter.png (Register to Printer )
diff --git a/sources/tech/20210413 Make Conway-s Game of Life in WebAssembly.md b/sources/tech/20210413 Make Conway-s Game of Life in WebAssembly.md
new file mode 100644
index 0000000000..83ba01325d
--- /dev/null
+++ b/sources/tech/20210413 Make Conway-s Game of Life in WebAssembly.md
@@ -0,0 +1,472 @@
+[#]: subject: (Make Conway's Game of Life in WebAssembly)
+[#]: via: (https://opensource.com/article/21/4/game-life-simulation-webassembly)
+[#]: author: (Mohammed Saud https://opensource.com/users/saud)
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+
+Make Conway's Game of Life in WebAssembly
+======
+WebAssembly is a good option for computationally expensive tasks due to
+its predefined execution environment and memory granularity.
+![Woman sitting in front of her computer][1]
+
+Conway's [Game of Life][2] is a popular programming exercise to create a [cellular automaton][3], a system that consists of an infinite grid of cells. You don't play the game in the traditional sense; in fact, it is sometimes referred to as a game for zero players.
+
+Once you start the Game of Life, the game plays itself to multiply and sustain "life." In the game, digital cells representing lifeforms are allowed to change states as defined by a set of rules. When the rules are applied to cells through multiple iterations, they exhibit complex behavior and interesting patterns.
+
+The Game of Life simulation is a very good candidate for a WebAssembly implementation because of how computationally expensive it can be; every cell's state in the entire grid must be calculated for every iteration. WebAssembly excels at computationally expensive tasks due to its predefined execution environment and memory granularity, among many other features.
+
+### Compiling to WebAssembly
+
+Although it's possible to write WebAssembly by hand, it is very unintuitive and error-prone as complexity increases. Most importantly, it's not intended to be written that way. It would be the equivalent of manually writing [assembly language][4] instructions.
+
+Here's a simple WebAssembly function to add two numbers:
+
+
+```
+(func $Add (param $0 i32) (param $1 i32) (result i32)
+ local.get $0
+ local.get $1
+ i32.add
+)
+```
+
+It is possible to compile WebAssembly modules using many existing languages, including C, C++, Rust, Go, and even interpreted languages like Lua and Python. This [list][5] is only growing.
+
+One of the problems with using existing languages is that WebAssembly does not have much of a runtime. It does not know what it means to [free a pointer][6] or what a [closure][7] is. All these language-specific runtimes have to be included in the resulting WebAssembly binaries. Runtime size varies by language, but it has an impact on module size and execution time.
+
+### AssemblyScript
+
+[AssemblyScript][8] is one language that is trying to overcome some of these challenges with a different approach. AssemblyScript is designed specifically for WebAssembly, with a focus on providing low-level control, producing smaller binaries, and reducing the runtime overhead.
+
+AssemblyScript uses a strictly typed variant of [TypeScript][9], a superset of JavaScript. Developers familiar with TypeScript do not have to go through the trouble of learning an entirely new language.
+
+### Getting started
+
+The AssemblyScript compiler can easily be installed through [Node,js][10]. Start by initializing a new project in an empty directory:
+
+
+```
+npm init
+npm install --save-dev assemblyscript
+```
+
+If you don't have Node installed locally, you can play around with AssemblyScript on your browser using the nifty [WebAssembly Studio][11] application.
+
+AssemblyScript comes with `asinit`, which should be installed when you run the installation command above. It is a helpful utility to quickly set up an AssemblyScript project with the recommended directory structure and configuration files:
+
+
+```
+`npx asinit .`
+```
+
+The newly created `assembly` directory will contain all the AssemblyScript code, a simple example function in `assembly/index.ts`, and the `asbuild` command inside `package.json`. `asbuild`, which compiles the code into WebAssembly binaries.
+
+When you run `npm run asbuild` to compile the code, it creates files inside `build`. The `.wasm` files are the generated WebAssembly modules. The `.wat` files are the modules in text format and are generally used for debugging and inspection.
+
+You have to do a little bit of work to get the binaries to run on a browser.
+
+First, create a simple HTML file, `index.html`:
+
+
+```
+<[html][12]>
+ <[head][13]>
+ <[meta][14] charset=utf-8>
+ <[title][15]>Game of life</[title][15]>
+ </[head][13]>
+
+ <[body][16]>
+ <[script][17] src='./index.js'></[script][17]>
+ </[body][16]>
+</[html][12]>
+```
+
+Next, replace the contents of `index.js` with the code snippet below to load the WebAssembly modules:
+
+
+```
+const runWasm = async () => {
+ const module = await WebAssembly.instantiateStreaming(fetch('./build/optimized.wasm'));
+ const exports = module.instance.exports;
+
+ console.log('Sum = ', exports.add(20, 22));
+};
+
+runWasm();
+```
+
+This `fetches` the binary and passes it to `WebAssembly.instantiateStreaming`, the browser API that compiles a module into a ready-to-use instance. This is an asynchronous operation, so it is run inside an async function so that await can be used to wait for it to finish compiling.
+
+The `module.instance.exports` object contains all the functions exported by AssemblyScript. Use the example function in `assembly/index.ts` and log the result.
+
+You will need a simple development server to host these files. There are a lot of options listed in this [gist][18]. I used [node-static][19]:
+
+
+```
+npm install -g node-static
+static
+```
+
+You can view the result by pointing your browser to `localhost:8080` and opening the console.
+
+![console output][20]
+
+(Mohammed Saud, [CC BY-SA 4.0][21])
+
+### Drawing to a canvas
+
+You will be drawing all the cells onto a `