在脚本中使用 Bash 信号捕获

Summary: 无论你的脚本是否成功运行，信号捕获（trap）都能让它平稳结束。

无论你的脚本是否成功运行，信号捕获（trap）都能让它平稳结束。

>
> 无论你的脚本是否成功运行，<ruby> 信号捕获 <rt>  trap </rt></ruby>都能让它平稳结束。
>
>
>

![](/data/attachment/album/202010/13/182135f2nktcrnryncisg8.jpg)

Shell 脚本的启动并不难被检测到，但 Shell 脚本的终止检测却并不容易，因为我们无法确定脚本会按照预期地正常结束，还是由于意外的错误导致失败。当脚本执行失败时，将正在处理的内容记录下来是非常有用的做法，但有时候这样做起来并不方便。而 [Bash](https://opensource.com/resources/what-bash) 中 `trap` 命令的存在正是为了解决这个问题，它可以捕获到脚本的终止信号，并以某种预设的方式作出应对。

### 响应失败

如果出现了一个错误，可能导致发生一连串错误。下面示例脚本中，首先在 `/tmp` 中创建一个临时目录，这样可以在临时目录中执行解包、文件处理等操作，然后再以另一种压缩格式进行打包：

```
#!/usr/bin/env bash
CWD=`pwd`
TMP=${TMP:-/tmp/tmpdir}

## create tmp dir
mkdir "${TMP}"

## extract files to tmp
tar xf "${1}" --directory "${TMP}"

## move to tmpdir and run commands
pushd "${TMP}"
for IMG in *.jpg; do
  mogrify -verbose -flip -flop "${IMG}"
done
tar --create --file "${1%.*}".tar *.jpg

## move back to origin
popd

## bundle with bzip2
bzip2 --compress "${TMP}"/"${1%.*}".tar \
      --stdout > "${1%.*}".tbz

## clean up
/usr/bin/rm -r /tmp/tmpdir

```

一般情况下，这个脚本都可以按照预期执行。但如果归档文件中的文件是 PNG 文件而不是期望的 JPEG 文件，脚本就会在中途失败，这时候另一个问题就出现了：最后一步删除临时目录的操作没有被正常执行。如果你手动把临时目录删掉，倒是不会造成什么影响，但是如果没有手动把临时目录删掉，在下一次执行这个脚本的时候，它必须处理一个现有的临时目录，里面充满了不可预知的剩余文件。

其中一个解决方案是在脚本开头增加一个预防性删除逻辑用来处理这种情况。但这种做法显得有些暴力，而我们更应该从结构上解决这个问题。使用 `trap` 是一个优雅的方法。

### 使用 trap 捕获信号

我们可以通过 `trap` 捕捉程序运行时的信号。如果你使用过 `kill` 或者 `killall` 命令，那你就已经使用过名为 `SIGTERM` 的信号了。除此以外，还可以执行 `trap -l` 或 `trap --list` 命令列出其它更多的信号：

```
$ trap --list
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

```

可以被 `trap` 识别的信号除了以上这些，还包括：

* `EXIT`：进程退出时发出的信号
* `ERR`：进程以非 0 状态码退出时发出的信号
* `DEBUG`：表示调试模式的布尔值

如果要在 Bash 中实现信号捕获，只需要在 `trap` 后加上需要执行的命令，再加上需要捕获的信号列表就可以了。

例如，下面的这行语句可以捕获到在进程运行时用户按下 `Ctrl + C` 组合键发出的 `SIGINT` 信号：

```
trap "{ echo 'Terminated with Ctrl+C'; }" SIGINT

```

因此，上文中脚本的缺陷可以通过使用 `trap` 捕获 `SIGINT`、`SIGTERM`、进程错误退出、进程正常退出等信号，并正确处理临时目录的方式来修复：

```
#!/usr/bin/env bash
CWD=`pwd`
TMP=${TMP:-/tmp/tmpdir}

trap \
 "{ /usr/bin/rm -r "${TMP}" ; exit 255; }" \
 SIGINT SIGTERM ERR EXIT

## create tmp dir
mkdir "${TMP}"
tar xf "${1}" --directory "${TMP}"

## move to tmp and run commands
pushd "${TMP}"
for IMG in *.jpg; do
  mogrify -verbose -flip -flop "${IMG}"
done
tar --create --file "${1%.*}".tar *.jpg

## move back to origin
popd

## zip tar
bzip2 --compress $TMP/"${1%.*}".tar \
      --stdout > "${1%.*}".tbz

```

对于更复杂的功能，还可以用 [Bash 函数](https://opensource.com/article/20/6/how-write-functions-bash)来简化 `trap` 语句。

### Bash 中的信号捕获

信号捕获可以让脚本在无论是否成功执行所有任务的情况下都能够正确完成清理工作，能让你的脚本更加可靠，这是一个很好的习惯。尽管尝试把信号捕获加入到你的脚本里看看能够起到什么作用吧。

---

via: <https://opensource.com/article/20/6/bash-trap>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[HankChow](https://github.com/HankChow) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


《代码英雄》第二季（7）：无服务器

Summary: 无服务器Serverless到底意味着什么？当然，总得有服务器存在 —— 构建网络的基本架构不会改变。不过在将服务器交给一小部分人运维之后，开发者们会发生什么变化呢？

>
> 代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。
>
>
>

>
> **什么是《代码英雄》**
>
>
> <ruby> 代码英雄 <rt>  Command Line Heroes </rt></ruby>是世界领先的企业开源软件解决方案供应商红帽（Red Hat）精心制作的原创音频播客，讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。
>
>
>

![](/data/attachment/album/202010/14/120736ncp1z5aaooxknua3.jpg)

本文是《[代码英雄](https://www.redhat.com/en/command-line-heroes)》系列播客[第二季（7）：无服务器](https://www.redhat.com/en/command-line-heroes/season-2/at-your-serverless)的[音频](https://dts.podtrac.com/redirect.mp3/audio.simplecast.com/aebc2c45.mp3)脚本。

>
> 导语：<ruby> 无服务器Serverless</ruby>到底意味着什么？当然，总得有服务器存在 —— 构建网络的基本架构不会改变。不过在将服务器交给一小部分人运维之后，开发者们会发生什么变化呢？
>
>
> 无服务器编程让初学者们可以更加轻松简单地部署自己的应用程序，让工作更有效率，这是它的优点。Andrea Passwater 跟我们分享了抽象底层架构会给我们带来多大的便利。不过凡事必有代价，无服务器化也有很多问题。Rodric Rabbah 解释了无服务器意味着你将部署和回应问题的能力拱手献出 —— 这就是为什么他帮助创建了 Apache OpenWhisk，这是一个开源的无服务环境框架，同时 Himanshu Pant 也来分享了他对于何时应该使用无服务器服务的观点。
>
>
> 无服务器编程应该是为开发者们<ruby> 赋能授权 <rt>  empowerment </rt></ruby>的。我们也应该对于全局场景保持关注 —— 尽管我们精简了我们的工具箱。
>
>
>

>
> **00:00:03 - Al Gore 档案**：
>
>
> 现如今，当然了，在全美乃至全世界，互联网正在彻头彻尾地改变着我们的生活。
>
>
>

**00:00:13 - Saron Yitbarek**：

那是 1998 年。 Google 才刚刚雇佣了它的第一名员工，副总统 Al Gore 在接受媒体采访。

>
> **00:00:22 - Al Gore 档案**：
>
>
> 这项技术还处于起步阶段。当我和<ruby> 比尔·克林顿 <rt>  Bill Clinton </rt></ruby>总统入主白宫时，只有 50 个网站。现在看看，我在生日那天收到了一束虚拟鲜花。
>
>
>

**00:00:37 - Saron Yitbarek**：

好的。我已经感觉到你的眉毛皱起了。为什么我要向你展现某些 20 年前的互联网史？这是因为我想要提醒你，互联网的基础仍然是相同的。

**00:00:51**：

当然，现在有不止 50 个站点了，我知道。但是，我们仍然在发送虚拟鲜花。从开发人员的角度来看，如果你将我们所有的惊人进步剥离开来，你得到的仍然是相同的“<ruby> 客户端 - 服务器 <rt>  client-server </rt></ruby>”（C/S）模型，这就是一切的开始。一个提供了分布式网络的客户端 - 服务器模型。

**00:01:16**：

如今，开发人员谈论了很多有关<ruby> 无服务器 <rt>  Serverless </rt></ruby>的问题，这听起来像是 Al Gore 谈到的客户端 - 服务器模型被废弃了。而且，如果我们不小心，我们能够抽象出太多的基础架构，以至于忘记了仍然有服务器在那里做着它们的工作。

**00:01:37**：

但是，无服务器真的意味着没有服务器吗？真的吗？还是开发人员与服务器之间的关系正在变化？在这一集中，我们将与来自世界各地的人们交谈，以探索这种被称为“<ruby> 无服务器 <rt>  serverless </rt></ruby>”的东西。

**00:01:54**：

我是 Saron Yitbarek，这里是《代码英雄》，一档来自红帽的原创播客节目。

**00:02:03 - Andrea Passwater**：

你知道无线网络在某些地方还有线缆吗？

**00:02:06 - Saron Yitbarek**：

Andrea Passwater 在一家名为 …… 嗯…… “无服务器” 的公司工作。他们创建了一款流行的开源框架来开发无服务器应用程序。Andrea 注意到了各个组织是多么渴望抽象化基础架构的方法，而这正是神奇的“无服务器”一词始终给予人希望的地方。

**00:02:28 - Andrea Passwater**：

我认为这一术语主要是为了传达这样一个事实，即如果你是从事无服务器应用方面工作的开发人员，你不必考虑那些服务器。你只需要写代码并将代码部署到云提供商即可，而不必担心管理。这就是无服务器的真正含义。

**00:02:49 - Saron Yitbarek**：

对于 Andrea 来说，无服务器的吸引力很明显。

**00:02:53 - Andrea Passwater**：

倘若你以无服务器的方式开发应用程序，则可以不必去考虑部署和维护该应用程序的日常工作。这意味着你可以专注于它的商业价值，你可以专注于发挥创造力。

**00:03:12 - Saron Yitbarek**：

而无服务器的另一大好处是，你不太可能发现自己在重复造轮子。

**00:03:18 - Andrea Passwater**：

当有像 Auth0 这样可以直接使用的服务存在时，为什么要创建自己的身份验证方法呢？归根结底，无服务器就是为开发人员提供机会，使得他们能够更加轻松快速地构建起能把他们脑子里的所有的主意带到世界上的程序。

**00:03:41 - Saron Yitbarek**：

我明白了！

**00:02:27**：

想象一下，你拿了满手的东西，正跌跌撞撞地走向一扇门。这扇门滑开了，以简单、友好……

**00:03:50**：

（让我来说）

**00:03:51**：

……的方式。这就是无服务器。它为你打开了大门，使得开发工作不再那么繁琐。事实上，随着各个组织趋向于混合云环境，以及无服务器运动的发展，开发的障碍正在消失。

**00:04:09**：

Andrea 听说过很多有关非开发人员进行开发的话题。

**00:04:15 - Andrea Passwater**：

这是传统上认为自己写不了代码，而现如今由于无服务器而得以投身于软件工程的人的故事，并且能够开发这些使得他们自己的工作流程和类似的东西自动化的工具。这与你你做什么工作都没关系。

**00:04:31**：

你在工作中要做的一些事情是如此的呆板无聊，比如你每天都在做的例行事情，和那些你会想“难道计算机不能为我做这件事吗？”的事情。我开始有了这种感觉的时候，我碰巧在一家名为“无服务器”的公司工作，他们像这样：“你意识到我们制作的产品可以为你提供帮助，对吗？”

**00:04:50 - Saron Yitbarek**：

Andrea 认为，不久之后，许多从未将自己视为开发人员的人将意识到他们能够自己构建简单的应用程序，基本上免费。

**00:05:02 - Andrea Passwater**：

借助 Lambda，我从不需要为自己制作的任何小型应用程序付费。我可以让这些机器人为我做一部分工作，是的，我可以提高工作效率。但是，我也不必再做这些无聊的工作了。我可以做些更有趣的事情。

**00:05:17 - Saron Yitbarek**：

即使是对于专业开发人员来说，这种自动门效果在满手杂物的世界里也是很诱人的。

**00:05:25 - Andrea Passwater**：

我认为人们对于能够让一两个人的团队，在短时间内就让原型工作起来很感兴趣。在几天时间内，他们就可以启动并运行原型。我认为这使得人们开始意识到，他们可以专注于驱动他们的应用、产品和公司中的商业价值的部分。这非常让人兴奋，他们可以专注于商业价值。

**00:05:54 - Saron Yitbarek**：

我要再抛出一个术语给你。准备好了吗？<ruby> 功能即服务 <rt>  Functions-as-a-service </rt></ruby>（FaaS）。就像是 AWS Lambda 或 Apache OpenWhisk 之类的无服务器产品。“功能即服务”意味着，只有在被触发时程序才会执行某个功能，这效率更高。

**00:06:15**：

此外，这让我对计算能力和运行时间的担心少了很多。最终，无服务器可能会成为一个相当不错的基础配置。事实上，有些人甚至开始怀疑，我们是否要完全使用无服务器？它可以替代容器吗？

**00:06:34 - Michael Hausenblas**：

我理解这这种想法。

**00:06:35 - Saron Yitbarek**：

Michael Hausenblas 是 Red Hat OpenShift 团队的开发倡导者。

**00:06:41 - Michael Hausenblas**：

如果你看一下我们现在拥有的这些东西，包括 OpenShift 和 Cloud Foundry 和一些其他东西，你实质上就拥有了抽象化。基本上，Heroku 或多或少地倾向于向这个想法。对吗？这是非常简单的方式，无需担心程序会如何运行，无需担心它是什么样的。只需要给我们代码，我们来处理剩下的工作。

**00:07:03 - Saron Yitbarek**：

是的。听起来相当不错。这听起来有点儿像是梦想中的“<ruby> 无运维 <rt>  no-ops </rt></ruby>”环境，一切都自动化并且抽象化了，就像是开发者版本的极简主义室内设计。很棒、很干净的界面。

**00:07:21**：

但是， Michael 想要让你了解你一些现实情况。

**00:07:25 - Michael Hausenblas**：

没有运维！是吗？你知道，它只是神奇地以某种方式消失。你可以在 HackerNews 和 Twitter 以及其他任何地方看到这些笑话。无服务器？当然有服务器！我知道，当然有。而且也肯定有运维。

**00:07:39**：

总得有人去做这些，总得有人去架设服务器、给操作系统打补丁、去创建容器镜像，因为，你猜猜这些功能会在哪里执行？当然是在某种计算机上。

**00:07:54 - Saron Yitbarek**：

这不是零和博弈。功能即服务无法直接取代容器，而是在工具箱中增加了一个工具。我还有更多的事情要告诉你。通过使用这种新工具，转变成无服务器并不只是意味着运维就是其他人的事情，你仍然需要自己考虑自己的运维。

**00:08:14 - Michael Hausenblas**：

你会看到在基础架构侧有一点运维工作。但是，也有一点是开发人员的事情。如果你处在一个极端情况之下，比如说使用 Lambda，那么你是没有任何任何类型的管理员权限的，对吧？

**00:08:29**：

你不能简单地致电或是短信给一名基础架构管理员。显然，你组织之中的某一个人就必须得做这件事。但是，我担心许多组织只看到了它是如此简单而便宜。我们无需动这个，还有这个、这个，然后忘记了谁在待命，谁是真正地在待命？你对此有什么策略吗？

**00:08:52**：

如果没有的话，那么你可能会想要在进行之前，先制定一个策略。

**00:09:00 - Saron Yitbarek**：

需要有人处于待命状态。即使选择了“无服务器”，你仍然需要在头脑中萦绕更大的场景，你仍然需要让你的运维有序进行。

**00:09:24**：

在我早先时候抛出那个“功能即服务”术语时，你是不是有过些许畏缩？过去，基于云的开发为我们带来了大量的 “xx 即服务”的术语。我们有基础架构即服务（IaaS）、平台即服务（PaaS）、软件即服务（SaaS）、数据即服务（DaaS）、数据库即服务（DBaaS） …… 等等。

**00:09:48**：

如果你难以理解它们的不同，那你并不孤单。这就是我们找来了 Himanshu Pant 的原因。他是位于印度德里的苏格兰皇家银行的技术主管。他花了多年时间来分析其中的差异。

**00:10:04 - Himanshu Pant**：

这些其他的计算范例在名称上和无服务器听起来是如此的相似，以至于人们往往会忘记，或者困惑于为什么没有将它们称之为无服务器，或者为什么这个被称为无服务器。

**00:10:20 - Saron Yitbarek**：

因此，无服务器与容器不同，无服务器也不是平台即服务。但是 Himanshu 希望将其明确一下。功能即服务能够提供什么？又不能提供什么？

**00:10:35**：

他与我们分享了两件轶事，有两次他弄清楚了什么时候该使用无服务器，什么时候应该放弃。第一次来自一个 24 小时黑客马拉松。 Himanshu 当时正试图开发一个聊天机器人。

**00:10:49 - Himanshu Pant**：

有各种各样的指标会影响它的选择。例如逻辑覆盖率、可能产生的成本以及可伸缩性。而我选择在无服务器环境下完成这项工作。

**00:11:04**：

当我在开发它的时候，我意识到成本是一个层面，而这确实是我所青睐的技能。因此，即使其他所有的参与者都有更好的……我想说的是，覆盖率，或者说是逻辑覆盖率。这里讲的是 NLP 语境或其场景。

**00:11:19**：

但是，就成本和可伸缩性而言，我是手操胜券的，因为借助无服务器，这完全取决于人们在该聊天机器人上所进行调用的次数，并相应的触发该功能。这是一个我十分乐意采用无服务器的用例，因为成本 —— 没有成本。以及更快的开发时间，而且老实说，当时还并不完全是生产规模级别的工作负载。

**00:11:45**：

我可以使用平台上的某些新兴工具。这对我而言是一次胜利。

**00:11:52 - Saron Yitbarek**：

很好。那时无服务器才有了意义。但是，在 Himanshu 目前供职的银行里，人们正在将他们的系统从旧版迁移到云端。而这提出了不同的目标。

**00:12:07 - Himanshu Pant**：

我们正在尝试查看哪些工作负载适用于哪些范例。比如 IaaS、BaaS、FaaS，这显然是属于企业领域的。你要看到这些方面，比如说第一，可靠的供应商难以寻找，以及第二，该技术应该得到广泛的验证。这对于像是银行业这样的规避风险的行业而言更是如此。

**00:12:30**：

这就是平台即服务（PaaS），但是仍然需要更好的证明、更好的功能，以及它们比传统工具更优越的地方。

**00:12:40 - Saron Yitbarek**：

Himanshu 正在研究自己的需求以及他自己的舒适区，并且研究哪些工作负载在哪种云计算规范中是有意义的。

**00:12:49 - Himanshu Pant**：

假设某个听众在一家贸易商店工作，他想构建某种东西，比如说一个入口。对于他或者她来说，无服务器可能并不是真正合适的选择，因为在那种在特定机器的应用程序中，延迟可能是不该出现的。

**00:13:05 - Saron Yitbarek**：

归根结底，这是一种有节制的做法，而不是将所有东西都丢进一个桶里。当我们思索哪一种基于云的架构是真正我们所想要做的工作时，还有一件事情需要考虑。所有这些抽象的东西，所有解放你双手的东西，最终如何改变的不仅仅是我们的工作方式，还改变了完成工作本身。

**00:13:31**：

抽象掉一部分工作负载可能意味着更少的自定义选项。想象一下你购买的一辆车。它能工作，它能开。但是接着想象一下你自己组装的一辆车，这辆车会按照你决定的方式工作。

**00:13:48 - Rania Khalaf**：

这是有代价的。

**00:13:50 - Saron Yitbarek**：

Rania Khalaf 是 IBM 研究部门的 AI 工程总监。

**00:13:56 - Rania Khalaf**：

在使用这些无服务器应用程序的过程中，你可能无法完全控制所有正在发生的事情。你无法控制全盘计划，或是程序何时何地运行。

**00:14:06 - Saron Yitbarek**：

这是一种权衡，对吗？当你使用无服务器时，细粒度控制可能会失误。

**00:14:13 - Rania Khalaf**：

它对于终端用户而言，抽象化了如此之多的东西，以至于你想要拥有更多的控制权、不同的规划、更多的检查与平衡、功能可以运行多长时间的不同值，等等等等。那么，如果你真的希望能够进入系统并修补，也许你可以创建你自己的部署环境。

**00:14:32 - Saron Yitbarek**：

不过，这将需要一些新东西，一类新的无服务器环境，开源社区已经在为自己打造了它。Rania 和她的 IBM 团队参与了该运动。

**00:14:44 - Rania Khalaf**：

我们首先研究是一种语言……它基本上是 JavaScript 的扩展，可以让你创建这些多线程交互服务的组合，以此作为起点，为你提供一种更加轻量级服务的方式。大约在同一时间，云和微服务以及平台即服务开始真正兴起。

**00:15:08**：

仅仅是将这两种趋势结合起来，就可以用可能来自于你，也可能来自其他人的许多小部件，构建更加高阶的功能。

**00:15:18 - Saron Yitbarek**：

Rania 和她的团队正在构建 Apache OpenWhisk，一款开源的功能平台。

**00:15:23 - Rania Khalaf**：

对于 OpenWhisk，我们从一开始就开源了。其中很大的原因是，为了让社区和我们一起参与进来。但是同时也是为了揭掉外包装，将控制权交给想要运行自己的无服务器计算环境的人们，以便他们能够根据自己的需求对其进行自定义，也许将它们置身于自己的控制之中，看看它实际上是如何运行的，以对其进行更好的控制。

**00:15:54**：

而且，我们还可以提供更加精细的控制，如果仅仅是普通服务，人们就不会有这种控制。

**00:16:03 - Saron Yitbarek**：

将控制权交还给想要运行自己的无服务器运行环境的人。这是下一阶段的无服务器。加入 OpenWhisk，你将获得像是 Fission 和 Gestalt 之类的其它开源平台。我们开始看到无服务器领域正在演变得比原先更具适应性，而且功能更为强大。

**00:16:31**：

为了真正了解为什么开源版的无服务器很重要，我与 OpenWhisk 的创始人之一进行了谈话。

**00:16:39**：

嗨，Rodric。最近好吗？

**00:16:40 - Rodric Rabbah**：

很好。你好吗？谢谢你邀请我参与节目。

**00:16:42 - Saron Yitbarek**：

Rodric Rabbah 是构思并创立 OpenWhisk 的三位开发者之一。以下是我们的谈话。

**00:16:54 - Rodric Rabbah**：

别人可能会很困惑，也可能会窃笑，因为人们可能会想：“倘若没有服务器，你要怎么做计算呢？”

**00:17:02 - Saron Yitbarek**：

是的。服务器就在某处，只是我不必去费心考虑它。

**00:17:05 - Rodric Rabbah**：

完全正确。这就是这个模式的真正美妙之处。当你开始以无服务器的方式进行开发时，你就再也不想回到过去了。你知道的，如今我已经置身其中接近 4 年了，并且已经开发了一些达到生产质量的应用程序。

**00:17:19**：

这是我如今惟一的开发方式。如果你告诉我必须要配置一台计算机并且安装操作系统，这对我而言完完全全是陌生的。我甚至都不确定我是不是还知道该怎么做。

**00:17:29 - Saron Yitbarek**：

是的。当你这样说的时候，听起来像是减轻了很大的负担。你知道吗？当最初听说无服务器时，至少我会想：“伙计，我必须要去学习的事又多了一件。”

**00:17:38**：

但是，当你这样说的时候，听起来不错。

**00:17:41 - Rodric Rabbah**：

这确实听起来很棒。然而，你应该已经意识到你必须要从这幻想的气泡中抽出一点儿空气。它不是万能药。

**00:17:50 - Saron Yitbarek**：

有哪些令人惊讶的风险或问题是人们在起步时可能没有看到或意识到的呢？

**00:17:58 - Rodric Rabbah**：

我认为缺乏透明度可能是最大的问题。这有点儿让我想起了新语言问世时出现的，那些提高了计算机抽象水平的技术。在当今的无服务器环境中，这是一种类似的令人震惊的效果。

**00:18:16**：

在这个过程中，你通常会写一个功能，然后只需部署这个功能即可。它可以立即运行，比如在 web 上作为 APIN 点。它可以大规模伸缩。我的意思是你无需自己做任何工作即可运行数千个实例。

**00:18:32**：

但是，倘若哪里出了问题，那应该如何调试呢？或者我实际上是想要检查我的功能失败的上下文环境。通常，这些功能在进程内运行，与你隔离 —— 你甚至无法登录计算机查看你的代码在何处运行。它们可能在封闭的容器环境之中运行，你不知道里面有什么。

**00:18:53**：

获得一点儿透明度对你而言变得很困难。这是工具最终将提供帮助的地方。但是，工具的缺乏某种程度上会让人们陷入一个相当大的陷阱。

**00:19:05 - Saron Yitbarek**：

这真的很好。那么让我们回到 OpenWhisk。请给我说说关于它的事情。

**00:19:11 - Rodric Rabbah**：

该项目在 Amazon Lambda 宣布推出产品的那一刻就开始了，这实际上是无服务器开始成为术语，并且开始在该领域获得关注的时刻。当我们看到 Lambda 时，我们开始思索：“这里有许多技术需要开发。不仅仅是在新的云计算的基础层上，而且在置于其上的编程模型之上，这实际上都使得它更易于被程序员访问。”你知道，由于出自 IBM 研究所，我们拥有相当强大的技术，不只是编程语言设计、编译器专业知识以及运行时的专业知识的技能。

**00:19:54**：

我们的一个小团队，基本上三个人……

**00:19:57 - Saron Yitbarek**：

哇。

**00:19:57 - Rodric Rabbah**

……聚集在一起，做了最初的开发和原型，最终成为 OpenWhisk，带有命令行工具，这是现如今无服务器实际上的编程接口。编程模型概念，然后是它必须支持的实际架构，本质上，是服务器模型的这个功能，提供了无服务器所支持的所有好处。

**00:20:22**：

请注意，真正的起源是 Amazon Lambda 的出现，并可以说这是一种新的计算模型。

**00:20:28 - Saron Yitbarek**：

那么花了多长时间？或者说是第一个版本什么时候出现的。

**00:20:30 - Rodric Rabbah**：

实际上很快。事实上，当 IBM 宣布……好吧，那时还是 IBM OpenWhisk。从我们第一次提交到现在才一年。

**00:20:39 - Saron Yitbarek**：

哇。我的天哪。

**00:20:41 - Rodric Rabbah**：

这着实令人激动。

**00:20:43 - Saron Yitbarek**：

这确实很令人印象深刻。事实上，当它第一次启动时，它不叫 OpenWhisk，而是 Whisk。对吗？

**00:20:49 - Rodric Rabbah**：

Whisk 是内部名称，没错。我取的这个名字。这个名字背后的意思是迅速而又灵活地行动。

**00:21:00 - Saron Yitbarek**：

很好。

**00:21:01 - Rodric Rabbah**：

你“搅拌”了一个功能，就可以了。你可以将其放入烤箱中烘焙。

**00:21:07 - Saron Yitbarek**：

太好了，因为当我看到它，我肯定想的是鸡蛋。我在想，让我们“<ruby> 搅拌 <rt>  whisk </rt></ruby>”一些鸡蛋。

**00:21:12 - Rodric Rabbah**：

对。我们对该名称进行了一些正面和负面的评价。当我们开源一项技术，并将其放到 GitHub 上时，我们会在上面加上 open 前缀，以强调该技术与开源一样开放，可以自由使用、自由下载、自由贡献。

**00:21:32 - Saron Yitbarek**：

是的。

**00:21:33 - Rodric Rabbah**：

我们将其开源的目的，实际上是一定程度上提升可以在当今无服务器平台上执行标准。对我们来说，重要的是要建立一个平台，不仅可以用于生产环境，还可以与全世界共享，而且还可用于学术研究或一般性研究。也许因为出自 IBM 的研究机构，我们有点儿在意这个。

**00:22:00**：

但是，这是有所回报的，我知道一些大学 —— 从 Princeton 到 Cornell —— 在他们的研究中使用 OpenWhisk。我去过 Brown、 Williams College、 MIT、 CMU 等几所大学，并且进行了一些讲座，目的是鼓励学生真正地去研究围绕无服务器以及服务器功能的问题、工具、编程模型，并且使他们对技术感兴趣。

**00:22:26**：

向他们显示，如果他们真的为开源项目做出了贡献，那么有一条路可以让 IBM 的云功能接受它并在生产环境中运行，通常在一周之内。

**00:22:34 - Saron Yitbarek**：

哇。这么快。

**00:22:36 - Rodric Rabbah**：

这让一些人感到惊讶。

**00:22:38 - Saron Yitbarek**：

这是一个非常高效的过程。

**00:22:41 - Rodric Rabbah**：

这确实证明了我们是如何在开源环境下开发许许多多技术的。这不是一个开放核心模式，有些组件有所保留。实际上在 IBM 云之中所运行的就是 Apache OpenWhisk 项目。

**00:22:56 - Saron Yitbarek**：

当你思索无服务器的未来，以及我们所选择的前进道路时，你觉得它们将是不可避免地奔向开源吗？

**00:23:08**：

我认为最近对于开源的价值存在一场激烈的争议，尤其是在云计算领域。

**00:23:13 - Saron Yitbarek**：

是的，没错。

**00:23:15 - Rodric Rabbah**：

如果你在思考为什么人们会转向云计算，或者为什么他们可能会厌恶投身于云计算领域，这就是供应商锁定的问题……丧失透明度。开源在一定程度上缓解这些问题，发挥了重要的作用。然后再看看类似 Kubernetes 的服务，它只是在容器和系统管理方面吞噬了云，就那么的成功！

**00:23:41 - Rodric Rabbah**：

如果你正在做的事情接触到了容器，鉴于它的主导地位，保持闭源与否还值得讨论吗？我倾向于认为开放性是有帮助的，从开发人员的角度来看，这很有吸引力。

**00:23:57 - Saron Yitbarek**：

当你考虑未来的无服务器生态及其工具、项目以及服务时，你看到了什么呢？对你来说，无服务器的未来是什么样的？

**00:24:08 - Rodric Rabbah**：

我认为，你会开始越来越少思考底层技术，而变得越来越多地考虑编程体验以及围绕它的工具：用于调试的、用于部署管理的、用于性能分析的、用于安全性。

**00:24:26**：

我认为，所有这些都非常重要。你如何运行你的功能的底层机制 —— 无论它们是在容器中还是在一些未来的技术下运行，也无论你是将它们运行在一个云上或是多个云上 —— 我认为，它们都不重要。有点儿像是 Kubernetes 在容器以及容器管理方面所做的事情。

**00:24:46**：

类似的还有一层要放在上面，就是服务分层的功能，可以实现那种无服务器概念。然后，它实际上的表现取决于你在其中安放的中间件。你如何赋能授权给开发者，让他们真正利用这款新的云端计算机，以及你要在它周围投入的辛劳，让他们的体验愉快。

**00:25:07 - Saron Yitbarek**：

是的。这种赋能授权看起来怎么样？

**00:25:13 - Rodric Rabbah**：

一言以蔽之，就是高效。这是一种能力，可以只专注于对于我，作为一名开发人员而言有价值的东西，或者如果我在公司工作的话，对于我公司的价值。这样能够更快地规避问题，因为你释放了你的脑细胞，而不用去考虑基础设施和如何伸缩，以及在硬件层面如何保障事物的安全性。

**00:25:38**：

现在，你可以真正地创新，将脑力重新投入到更快的创新中去，从而为你的终端用户带来更多的价值。我想把这一切都归结于更高的效率。

**00:25:55 - Saron Yitbarek**：

Rodric Rabbah 是 OpenWhisk 的一位创始人。还记得我在这一期节目开始的时候所说的吗？互联网所基于的那种老旧的客户端 - 服务器模型并不会消失。改变的是，我是说彻底改变的是我们对服务器的思考方式。

**00:26:19**：

在所谓的无服务器世界之中，希望我们专注于代码本身，而不用担心基础架构。但是，我们所选择的抽象等级，以及如何保持对于未被抽象的工作的控制，才是使得无服务器世界变得真正有趣的地方。

**00:26:40**：

无服务器最终应当是为开发人员赋能授权的。免于打补丁、进行扩展和管理基础设施。但是，与此同时，即使我们抽象化了一些任务，依然必须对整体如何工作保持关注。我们会问，我要放弃的是哪些控制权，而我要收回的又是哪些控制权？

**00:27:07**：

下一集是我们史诗般的第二季的大结局，《代码英雄》将要前往火星。我们将会了解 NASA 的火星探测器如何开始自己的开源革命。并且我们将与 NASA 喷气推进实验室的 CTO 进行交流，了解开源是如何塑造太空探索的未来的。

**00:27:39 - Saron Yitbarek**：

与此同时，如果你想要更加深入地研究无服务器开发的问题，或是在这一季里我们所探索过的任何主题，请访问 [redhat.com/commandlineheroes](vscode-webview-resource://1aa00f58-b48b-4835-90e5-2e2fd87998ef/file///Users/xingyuwang/develop/LCRH-wxy/translated/redhat.com/commandlineheroes)，查看免费资源。当你在那里时，你甚至可以为我们自己的代码英雄游戏作出贡献。

**00:28:00 - Saron Yitbarek**：

我是 Saron Yitbarek。感谢收听，编程不已。

>
> **什么是 LCTT SIG 和 LCTT LCRH SIG**
>
>
> LCTT SIG 是 LCTT <ruby> 特别兴趣小组 <rt>  Special Interest Group </rt></ruby>，LCTT SIG 是针对特定领域、特定内容的翻译小组，翻译组成员将遵循 LCTT 流程和规范，参与翻译，并获得相应的奖励。LCRH SIG 是 LCTT 联合红帽（Red Hat）发起的 SIG，当前专注任务是《代码英雄》系列播客的脚本汉化，已有数十位贡献者加入。敬请每周三、周五期待经过我们精心翻译、校对和发布的译文。
>
>
> 欢迎[加入 LCRH SIG](/article-12436-1.html) 一同参与贡献，并领取红帽（Red Hat）和我们联合颁发的专属贡献者证书。
>
>
>

---

via: <https://www.redhat.com/en/command-line-heroes/season-2/at-your-serverless>

作者：[Red Hat](https://www.redhat.com/en/command-line-heroes) 选题：[bestony](https://github.com/bestony) 译者：[JonnieWayy](https://github.com/JonnieWayy) 校对：[acyanbird](https://github.com/acyanbird), [wxy](https://github.com/wxy)

本文由 [LCRH](https://github.com/LCTT/LCRH) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


微软能否放弃 Windows 转向 Linux？

愿景很好，可能性不大

>
> Jack Wallen 认为，Microsoft Linux 是 Microsoft 桌面操作系统的下一个演进方向。他解释了为什么这将是一个对 Microsoft、IT 专业人士、用户和 Linux 社区的双赢。
>
>
>

![](/data/attachment/album/202010/14/232324kkimyikd4zdd6e64.jpg)

我尊敬的同事 Steven J. Vaughan-Nichols 在姊妹网站 ZDNet 上发表了一篇出色的文章，名为《[基于 Linux 的 Windows 非常有意义](https://www.zdnet.com/article/linux-based-windows-makes-perfect-sense/)》，他在文中讨论了 Eric S. Raymond 的[观点](/article-12664-1.html)，即我们正接近桌面战争的最后阶段。Vaughan-Nichols 猜测，下一个合乎逻辑的步骤是在 Linux 内核上运行的 Windows 界面。

这是有道理的，尤其是考虑到微软在 [Windows 的 Linux 子系统（WSL）](https://www.techrepublic.com/article/microsoft-older-windows-10-versions-now-get-to-run-windows-subsystem-for-linux-2/) 上的努力。然而，从我过去几年所目睹的一切来看，我认为可以得出一个对微软更有意义的结论。

### Microsoft Linux: 为什么它是最好的解决方案

一度，微软的最大摇钱树是软件，确切地说是 Windows 和 Microsoft Office。但是，就像科技行业中的所有事物一样，进化也在发生，而拒绝进化的科技公司失败了。

微软明白这一点，并且它已经进化了。一个恰当的例子是：[Microsoft Azure](https://www.techrepublic.com/article/microsoft-azure-the-smart-persons-guide/)。微软的云计算服务，以及 [AWS](https://www.techrepublic.com/article/amazon-web-services-the-smart-persons-guide/) 和 [Google Cloud](https://www.techrepublic.com/article/google-cloud-platform-the-smart-persons-guide/) 已经成为这个不断变化的行业的巨大推动力。Azure 已成为微软新世界的摇钱树 —— 多到以至于这家在桌面电脑市场上享有垄断地位的公司已经开始意识到，或许还有更好的方式来利用桌面计算机。

这种优势很容易通过 Linux 来实现，但不是你可能想到的 Linux。Vaughan-Nichols 所建议的 Microsoft Linux 对于微软来说可能是一个很好的垫脚石，但我相信该公司需要做出一个更大的飞跃。我说的是登月规模的飞跃 —— 这将使所有参与者的生活变得更加轻松。

我说的是深入 Linux 领域。忘掉在 Linux 内核上运行 [Windows 10](https://www.techrepublic.com/article/windows-10-the-smart-persons-guide/) 界面的桌面版本吧，最后承认 Microsoft Linux 可能是当今世界的最佳解决方案。

微软发布一个完整的 Linux 发行版将对所有参与者来说意味着更少的挫败感。微软可以将其在 Windows 10 桌面系统上的开发工作转移到一个更稳定、更可靠、更灵活、更经考验的桌面系统上来。微软可以从任意数量的桌面系统中选择自己的官方风格：GNOME、KDE、Pantheon、Xfce、Mint、Cinnamon... 不胜枚举。微软可以按原样使用桌面，也可以为它们做出贡献，创造一些更符合用户习惯的东西。

### 开发：微软并没有摆脱困境

这并不意味着微软在开发方面将摆脱困境。微软也希望对 Wine 做出重大贡献，以确保其所有产品均可在兼容层上顺畅运行，并且默认集成到操作系统中，这样最终用户就不必为安装 Windows 应用程序做任何额外的工作。

### Windows 用户需要 Defender

微软开发团队也希望将 Windows Defender 移植到这个新的发行版中。等一等。什么？我真的是在暗示 Microsoft Linux 需要 Windows Defender 吗？是的，我确定。为什么？

最终用户仍然需要防范 <ruby>   网络钓鱼  诈骗 <rt>  phishing scams </rt></ruby>、恶意 URL 和其他类型的攻击。普通的 Windows 用户可能不会意识到，Linux 和安全使用实践的结合远比 Windows 10 和 Windows Defender 要安全得多。所以，是的，将 Windows Defender 移植到 Microsoft Linux 将是保持用户基础舒适的一个很好的步骤。

这些用户将很快了解在台式计算机上工作的感觉，而不必处理 Windows 操作系统带来的日常困扰。更新更流畅、更值得信赖、更安全，桌面更有意义。

### 微软、用户和 IT 专业人士的双赢

微软一直在尽其所能将用户从标准的基于客户端的软件迁移到云和其他托管解决方案，并且其软件摇钱树已经变成了以网络为中心和基于订阅的软件。所有这些 Linux 用户仍然可以使用 [Microsoft 365](https://www.techrepublic.com/article/microsoft-365-a-cheat-sheet/) 和它必须提供的任何其他 <ruby>   软件即服务  <rt>  Software as a Service </rt></ruby>（SaaS）解决方案——所有这些都来自于 Linux 操作系统的舒适性和安全性。

这对微软和消费者而言是双赢的，因为这样 Windows 没有那么多令人头疼的事情要处理（通过捕获漏洞和对其专有解决方案进行安全补丁），消费者可以得到一个更可靠的解决方案而不会错过任何东西。 如果微软打对了牌，他们可以对 KDE 或几乎任何 Linux 桌面环境重新设置主题，使其与 Windows 10 界面没有太大区别。

如果布局得当，消费者甚至可能都不知道其中的区别——“Windows 11” 将仅仅是 Microsoft 桌面操作系统的下一个演进版本。

说到胜利，IT 专业人员将花费更少的时间来处理病毒、恶意软件和操作系统问题，而把更多的时间用于保持网络（以及为该网络供动力的服务器）的运行和安全上。

### 大卖场怎么办？

这是个关键的地方。为了让这一做法真正发挥作用，微软将不得不完全放弃 Windows，转而使用自己风格的 Linux。基于同样的思路，微软需要确保大卖场里的 PC 都安装了 Microsoft Linux 系统。没有半途而废的余地——微软必须全力以赴，以确保这次转型的成功。

一旦大卖场开始销售安装了 Microsoft Linux 的 PC 和笔记本电脑，我预测这一举措对所有相关人员来说将会是一个巨大的成功。微软会被视为终于推出了一款值得消费者信赖的操作系统；消费者将拥有一个这样的桌面操作系统，它不会带来太多令人头疼的事情，而会带来真正的生产力和乐趣；Linux 社区最终将主导桌面计算机。

### Microsoft Linux：时机已到

你可能会认为这个想法很疯狂，但如果你真的仔细想想，微软 Windows 的演进就是朝着这个方向发展的。为什么不绕过这个时间线的中途部分，而直接跳到一个为所有参与者带来成功的终极游戏呢？ Microsoft Linux 正当其时。

---

via: <https://www.techrepublic.com/article/could-microsoft-be-en-route-to-dumping-windows-in-favor-of-linux/>

作者：[jack-wallen](https://www.techrepublic.com/meet-the-team/us/jack-wallen/) 选题：[wxy](https://github.com/wxy) 译者：[gxlct008](https://github.com/gxlct008) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 终端中展示幻灯片

![](/data/attachment/album/202010/15/000226j34xnkzzg7z7x9ka.jpg)

演示文稿往往是枯燥的。这就是为什么有些人会添加动画或漫画/meme 来增加一些幽默和风格来打破单调。

如果你需要在你的大学或公司的演示文稿中加入一些独特的风格，那么使用 Linux 终端怎么样？想象一下，这将是多么酷的事情啊！

### Present：Linux 终端中进行演示

在终端中可以做很多[有趣好玩的事情](https://itsfoss.com/funny-linux-commands/)。制作和展示幻灯片只是其中之一。

这个基于 Python 的应用名为 [Present](https://github.com/vinayak-mehta/present)，它可以让你创建基于 Markdown 和 YML 的幻灯片，你可以在你的大学或公司里演讲，并以真正的极客风格取悦人们。

我制作了一个视频，展示了在 Linux 终端中用 Present 演示一些东西的样子。

#### Present 的功能

你可以用 Present 做以下事情：

* 使用 Markdown 语法在幻灯片中添加文本
* 用箭头或 `PgUp`/`Down` 键控制幻灯片
* 改变前景和背景颜色
* 在幻灯片中添加图像
* 增加代码块
* 播放模拟代码，并用 codio YML 文件输出

#### 在 Linux 上安装 Present

Present 是一个基于 Python 的工具，你可以使用 PIP 来安装它。你应该确保用这个命令[在 Ubuntu 上安装 Pip](https://itsfoss.com/install-pip-ubuntu/)：

```
sudo apt install python3-pip

```

如果你使用的是其他发行版，请检查你的包管理器来安装 PIP3。

安装 PIP 后，你就可以以这种方式全局安装 Present：

```
sudo pip3 install present

```

你也可以只为当前用户安装，但你也必须将 `~/.local/bin` 添加到你的 `PATH` 环境变量。

#### 在 Linux 终端中使用 Present 来创建和展示幻灯片

![](/data/attachment/album/202010/15/000917g16mpo3gsf3p3gvp.png)

由于 Present 使用了 Markdown 语法，你应该用它来创建自己的幻灯片。在这里使用 [Markdown 编辑器](https://itsfoss.com/best-markdown-editors-linux/)会有帮助。

Present 需要一个 Markdown 文件来读取和播放幻灯片。你可以[下载这个示例幻灯片](https://github.com/vinayak-mehta/present/blob/master/examples/sample.md)，但你需要单独下载嵌入的图像，并将它放在图像文件夹内。

* 在 Markdown 文件中使用 `—` 来分隔幻灯片。
* 使用 Markdown 语法在幻灯片中添加文本。
* 使用以下语法添加图片 `![RC] (images/name.png)`。
* 通过添加像 `<!– fg=white bg=red –>` 这样的语法来改变幻灯片的颜色。
* 使用像 `<!– effect=fireworks –>` 这样的语法来添加带有效果的幻灯片。
* 使用 [codio 语法](https://present.readthedocs.io/en/latest/codio.html) 添加代码运行模拟。
* 使用 `q` 退出演示，并用左/右箭头或 `PgUp`/`Down` 键控制幻灯片。

请记住，在演示时调整终端窗口的大小会把东西搞乱，按回车键也是如此。

### 总结

如果你熟悉 Markdown 和终端，使用 Present 对你来说并不困难。

你不能把它和常规的用 Impress、MS Office 等制作的幻灯片相比，但偶尔使用，它是一个很酷的工具。如果你是计算机科学/网络专业的学生，或者是开发人员或系统管理员，你的同事一定会觉得很有趣。

---

via: <https://itsfoss.com/presentation-linux-terminal/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


安装 Manjaro Linux 后必做的 6 件事

Summary: 你刚刚全新安装了 Manjaro Linux，那么现在该做什么呢？

你刚刚全新安装了 Manjaro Linux，那么现在该做什么呢？

你刚刚[全新安装了 Manjaro Linux](https://itsfoss.com/install-manjaro-linux/)，那么现在该做什么呢？

下面是我推荐你在安装后进行的一些必不可少的步骤。

不过说实话，这些都是我在安装 Manjaro 后喜欢做的事，根据你的需求，步骤可能会有所不同。

### 推荐在安装完 Manjaro Linux 后去做的事

![](/data/attachment/album/202010/15/205625mnmkzucued3ux3zf.jpg)

我使用的是 Xfce 版的 Manjaro，但这些步骤也适用于 [Manjaro](https://manjaro.org) 的其它桌面环境版本。

#### 1、设置最快的镜像

在更新系统之前，我建议先整理一下镜像列表。在刷新 Manjaro 系统和从软件仓库下载软件包的时候，优化后的镜像列表会对系统的性能产生明显的影响。

打开终端模拟器并输入以下命令：

```
sudo pacman-mirrors --fasttrack

```

![](/data/attachment/album/202010/15/205641eco99z8e6oxknoaf.png)

#### 2、更新系统

保持系统更新可以降低安全漏洞的发生机率，在安装新的软件之前也建议刷新一下系统的软件仓库。

你可以用下面的命令来[更新 Manjaro 系统](https://itsfoss.com/update-arch-linux/)：

```
sudo pacman -Syu

```

![](/data/attachment/album/202010/15/205714nc7m145n7qg0le4c.png)

#### 3、启用 AUR、Snap 以及 Flatpak 支持

[<ruby> Arch 用户仓库 <rt>  Arch User Repository </rt></ruby>（AUR）](https://itsfoss.com/aur-arch-linux/)是用户选择[基于 Arch Linux 的系统](https://itsfoss.com/arch-based-linux-distros/)的一个主要理由。你可以在 AUR 中访问到大量的附加软件。

（LCTT 译注：AUR 中的 PKGBUILD 均为用户上传且未经审核，使用者需要自负责任，在构建软件包前请注意检查其中内容是否合理。）

作为可选项，你可以直接在 Pacman 图形化软件包管理器中启用对 [Snap](https://itsfoss.com/use-snap-packages-ubuntu-16-04/) 以及 [Flatpak](https://itsfoss.com/flatpak-guide/) 的支持。

![](/data/attachment/album/202010/15/205732rlxxioz2xldf59yv.png)

#### 启用 TRIM（仅 SSD）

如果你的根分区已经安装在了 SSD 上，启用 [TRIM](https://en.wikipedia.org/wiki/Trim_(computing)) 会是你在安装 Manjaro 后需要做的一件事。TRIM 会帮助清理 SSD 中的块，从而延长 SSD 的使用寿命。

要在 Manjaro 中启用 TRIM，请在终端中输入以下命令：

```
sudo systemctl enable fstrim.timer

```

![](/data/attachment/album/202010/15/205746pj8z2rghhgghg1h8.png)

#### 5、安装内核（高级用户）

我在 [Manjaro 评测](https://itsfoss.com/manjaro-linux-review/)中提到的一个话题就是，你可以在图形界面中轻易地更换内核。

喜欢使用命令行？你也可以在终端中列出系统中已安装的内核以及安装新的内核。

列出已安装的内核：

```
mhwd-kernel -li

```

安装新内核（以最新的 5.8 版本内核为例）：

```
sudo mhwd-kernel -i linux58

```

![](/data/attachment/album/202010/15/205814xvtvlpeihrtvbu0c.png)

#### 6、安装微软 TrueType 字体（如果需要）

我经常在个人电脑上编辑工作文件，因此我需要 Times New Roman 或 Arial 等微软字体。

如果你也需要使用微软字体，可以从 [AUR](https://itsfoss.com/aur-arch-linux/) 中取得这个[软件包](https://aur.archlinux.org/packages/ttf-ms-fonts)。如果你想要在命令行中管理 AUR 软件包，可以选择安装一个 [AUR 助手](https://itsfoss.com/best-aur-helpers/)。

![](/data/attachment/album/202010/15/205838b0mbbi193orz3bpi.png)

### 结论

如果你想在一个预配置、为桌面优化的发行版上享受 Arch Linux 的优点，[Manjaro 是一个很好的发行版](https://itsfoss.com/why-use-manjaro-linux/)。虽然它预置了很多东西，但由于每个人设置和需求的不同，有几个步骤是不能提前完成的。

除开已经提到的步骤，还有哪一步对你来说是必不可少的？请在下面的评论中告诉我们。

---

via: <https://itsfoss.com/things-to-do-after-installing-manjaro/>

作者：[Dimitrios Savvopoulos](https://itsfoss.com/author/dimitrios/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[rakino](https://github.com/rakino) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


构建一个即时消息应用（八）：Home 页面

Summary: 让我们在本文中完成 home 页面的开发。

让我们在本文中完成 home 页面的开发。

![](/data/attachment/album/202010/15/213116evlwzdwwv66kmldj.jpg)

本文是该系列的第八篇。

* [第一篇: 模式](/article-11396-1.html)
* [第二篇: OAuth](/article-11510-1.html)
* [第三篇: 对话](/article-12056-1.html)
* [第四篇: 消息](/article-12680-1.html)
* [第五篇: 实时消息](/article-12685-1.html)
* [第六篇: 仅用于开发的登录](/article-12692-1.html)
* [第七篇: Access 页面](/article-12704-1.html)

继续前端部分，让我们在本文中完成 `home` 页面的开发。 我们将添加一个开始对话的表单和一个包含最新对话的列表。

### 对话表单

![](/data/attachment/album/202010/15/213638ggtiy84vo4dgxoar.png)

转到 `static/ages/home-page.js` 文件，在 HTML 视图中添加一些标记。

```
<form id="conversation-form">
    <input type="search" placeholder="Start conversation with..." required>
</form>

```

将该表单添加到我们显示 “auth user” 和 “logout” 按钮部分的下方。

```
page.getElementById('conversation-form').onsubmit = onConversationSubmit

```

现在我们可以监听 “submit” 事件来创建对话了。

```
import http from '../http.js'
import { navigate } from '../router.js'

async function onConversationSubmit(ev) {
    ev.preventDefault()

    const form = ev.currentTarget
    const input = form.querySelector('input')

    input.disabled = true

    try {
        const conversation = await createConversation(input.value)
        input.value = ''
        navigate('/conversations/' + conversation.id)
    } catch (err) {
        if (err.statusCode === 422) {
            input.setCustomValidity(err.body.errors.username)
        } else {
            alert(err.message)
        }
        setTimeout(() => {
            input.focus()
        }, 0)
    } finally {
        input.disabled = false
    }
}

function createConversation(username) {
    return http.post('/api/conversations', { username })
}

```

在提交时，我们使用用户名对 `/api/conversations` 进行 POST 请求，并重定向到 `conversation` 页面（用于下一篇文章）。

### 对话列表

![](/data/attachment/album/202010/15/213715tid9ln7yniblyziy.png)

还是在这个文件中，我们将创建 `homePage()` 函数用来先异步加载对话。

```
export default async function homePage() {
    const conversations = await getConversations().catch(err => {
        console.error(err)
        return []
    })
    /\*...\*/
}

function getConversations() {
    return http.get('/api/conversations')
}

```

然后，在标记中添加一个列表来渲染对话。

```
<ol id="conversations"></ol>

```

将其添加到当前标记的正下方。

```
const conversationsOList = page.getElementById('conversations')
for (const conversation of conversations) {
    conversationsOList.appendChild(renderConversation(conversation))
}

```

因此，我们可以将每个对话添加到这个列表中。

```
import { avatar, escapeHTML } from '../shared.js'

function renderConversation(conversation) {
    const messageContent = escapeHTML(conversation.lastMessage.content)
    const messageDate = new Date(conversation.lastMessage.createdAt).toLocaleString()

    const li = document.createElement('li')
    li.dataset['id'] = conversation.id
    if (conversation.hasUnreadMessages) {
        li.classList.add('has-unread-messages')
    }
    li.innerHTML = `
 <a href="/conversations/${conversation.id}">
 <div>
 ${avatar(conversation.otherParticipant)}
 <span>${conversation.otherParticipant.username}</span>
 </div>
 <div>
 <p>${messageContent}</p>
 <time>${messageDate}</time>
 </div>
 </a>
 `
    return li
}

```

每个对话条目都包含一个指向对话页面的链接，并显示其他参与者信息和最后一条消息的预览。另外，您可以使用 `.hasUnreadMessages` 向该条目添加一个类，并使用 CSS 进行一些样式设置。也许是粗体字体或强调颜色。

请注意，我们需要转义信息的内容。该函数来自于 `static/shared.js` 文件：

```
export function escapeHTML(str) {
    return str
        .replace(/&/g, '&')
        .replace(/</g, '<')
        .replace(/>/g, '>')
        .replace(/"/g, '"')
        .replace(/'/g, ''')
}

```

这会阻止将用户编写的消息显示为 HTML。如果用户碰巧编写了类似以下内容的代码：

```
<script>alert('lololo')</script>

```

这将非常烦人，因为该脚本将被执行?。所以，永远记住要转义来自不可信来源的内容。

### 消息订阅

最后但并非最不重要的一点，我想在这里订阅消息流。

```
const unsubscribe = subscribeToMessages(onMessageArrive)
page.addEventListener('disconnect', unsubscribe)

```

在 `homePage()` 函数中添加这一行。

```
function subscribeToMessages(cb) {
    return http.subscribe('/api/messages', cb)
}

```

函数 `subscribe()` 返回一个函数，该函数一旦调用就会关闭底层连接。这就是为什么我把它传递给 <ruby> “断开连接” <rt>  disconnect </rt></ruby>事件的原因；因此，当用户离开页面时，事件流将被关闭。

```
async function onMessageArrive(message) {
    const conversationLI = document.querySelector(`li[data-id="${message.conversationID}"]`)
    if (conversationLI !== null) {
        conversationLI.classList.add('has-unread-messages')
        conversationLI.querySelector('a > div > p').textContent = message.content
        conversationLI.querySelector('a > div > time').textContent = new Date(message.createdAt).toLocaleString()
        return
    }

    let conversation
    try {
        conversation = await getConversation(message.conversationID)
        conversation.lastMessage = message
    } catch (err) {
        console.error(err)
        return
    }

    const conversationsOList = document.getElementById('conversations')
    if (conversationsOList === null) {
        return
    }

    conversationsOList.insertAdjacentElement('afterbegin', renderConversation(conversation))
}

function getConversation(id) {
    return http.get('/api/conversations/' + id)
}

```

每次有新消息到达时，我们都会在 DOM 中查询会话条目。如果找到，我们会将 `has-unread-messages` 类添加到该条目中，并更新视图。如果未找到，则表示该消息来自刚刚创建的新对话。我们去做一个对 `/api/conversations/{conversationID}` 的 GET 请求，以获取在其中创建消息的对话，并将其放在对话列表的前面。

---

以上这些涵盖了主页的所有内容 ?。 在下一篇文章中，我们将对 conversation 页面进行编码。

* [源代码](https://github.com/nicolasparada/go-messenger-demo)

---

via: <https://nicolasparada.netlify.com/posts/go-messenger-home-page/>

作者：[Nicolás Parada](https://nicolasparada.netlify.com/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[gxlct008](https://github.com/gxlct008) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


构建一个即时消息应用（九）：Conversation 页面

Summary: 在这篇文章中，我们将对对话页面进行编码。

在这篇文章中，我们将对对话页面进行编码。

![](/data/attachment/album/202010/15/220239arr978u7t7oulv73.jpg)

本文是该系列的第九篇，也是最后一篇。

* [第一篇: 模式](/article-11396-1.html)
* [第二篇: OAuth](/article-11510-1.html)
* [第三篇: 对话](/article-12056-1.html)
* [第四篇: 消息](/article-12680-1.html)
* [第五篇: 实时消息](/article-12685-1.html)
* [第六篇: 仅用于开发的登录](/article-12692-1.html)
* [第七篇: Access 页面](/article-12704-1.html)
* [第八篇: Home 页面](/article-12722-1.html)

在这篇文章中，我们将对<ruby> 对话 <rt>  conversation </rt></ruby>页面进行编码。此页面是两个用户之间的聊天室。在顶部我们将显示其他参与者的信息，下面接着的是最新消息列表，以及底部的消息表单。

### 聊天标题

![](/data/attachment/album/202010/15/220257j3897b37l238x33b.png)

让我们从创建 `static/pages/conversation-page.js` 文件开始，它包含以下内容:

```
import http from '../http.js'
import { navigate } from '../router.js'
import { avatar, escapeHTML } from '../shared.js'

export default async function conversationPage(conversationID) {
    let conversation
    try {
        conversation = await getConversation(conversationID)
    } catch (err) {
        alert(err.message)
        navigate('/', true)
        return
    }

    const template = document.createElement('template')
    template.innerHTML = `
 <div>
 <a href="/">← Back</a>
 ${avatar(conversation.otherParticipant)}
 <span>${conversation.otherParticipant.username}</span>
 </div>
 <!-- message list here -->
 <!-- message form here -->
 `
    const page = template.content
    return page
}

function getConversation(id) {
    return http.get('/api/conversations/' + id)
}

```

此页面接收路由从 URL 中提取的会话 ID。

首先，它向 `/api/ conversations/{conversationID}` 发起一个 GET 请求，以获取有关对话的信息。 如果出现错误，我们会将其显示，并重定向回 `/`。然后我们呈现有关其他参与者的信息。

### 对话列表

![](/data/attachment/album/202010/15/220310llcafw1fa777uw1a.png)

我们也会获取最新的消息并显示它们。

```
let conversation, messages
try {
    [conversation, messages] = await Promise.all([
        getConversation(conversationID),
        getMessages(conversationID),
    ])
}

```

更新 `conversationPage()` 函数以获取消息。我们使用 `Promise.all()` 同时执行这两个请求。

```
function getMessages(conversationID) {
    return http.get(`/api/conversations/${conversationID}/messages`)
}

```

发起对 `/api/conversations/{conversationID}/messages` 的 GET 请求可以获取对话中的最新消息。

```
<ol id="messages"></ol>

```

现在，将该列表添加到标记中。

```
const messagesOList = page.getElementById('messages')
for (const message of messages.reverse()) {
    messagesOList.appendChild(renderMessage(message))
}

```

这样我们就可以将消息附加到列表中了。我们以时间倒序来显示它们。

```
function renderMessage(message) {
    const messageContent = escapeHTML(message.content)
    const messageDate = new Date(message.createdAt).toLocaleString()

    const li = document.createElement('li')
    if (message.mine) {
        li.classList.add('owned')
    }
    li.innerHTML = `
 <p>${messageContent}</p>
 <time>${messageDate}</time>
 `
    return li
}

```

每个消息条目显示消息内容本身及其时间戳。使用 `.mine`，我们可以将不同的 css 类附加到条目，这样您就可以将消息显示在右侧。

### 消息表单

![](/data/attachment/album/202010/15/220323x343954xf7zczu2x.png)

```
<form id="message-form">
    <input type="text" placeholder="Type something" maxlength="480" required>
    <button>Send</button>
</form>

```

将该表单添加到当前标记中。

```
page.getElementById('message-form').onsubmit = messageSubmitter(conversationID)

```

将事件监听器附加到 “submit” 事件。

```
function messageSubmitter(conversationID) {
    return async ev => {
        ev.preventDefault()

        const form = ev.currentTarget
        const input = form.querySelector('input')
        const submitButton = form.querySelector('button')

        input.disabled = true
        submitButton.disabled = true

        try {
            const message = await createMessage(input.value, conversationID)
            input.value = ''
            const messagesOList = document.getElementById('messages')
            if (messagesOList === null) {
                return
            }

            messagesOList.appendChild(renderMessage(message))
        } catch (err) {
            if (err.statusCode === 422) {
                input.setCustomValidity(err.body.errors.content)
            } else {
                alert(err.message)
            }
        } finally {
            input.disabled = false
            submitButton.disabled = false

            setTimeout(() => {
                input.focus()
            }, 0)
        }
    }
}

function createMessage(content, conversationID) {
    return http.post(`/api/conversations/${conversationID}/messages`, { content })
}

```

我们利用 [partial application](https://en.wikipedia.org/wiki/Partial_application) 在 “submit” 事件处理程序中获取对话 ID。它 从输入中获取消息内容，并用它对 `/api/conversations/{conversationID}/messages` 发出 POST 请求。 然后将新创建的消息添加到列表中。

### 消息订阅

为了实现实时，我们还将订阅此页面中的消息流。

```
page.addEventListener('disconnect', subscribeToMessages(messageArriver(conversationID)))

```

将该行添加到 `conversationPage()` 函数中。

```
function subscribeToMessages(cb) {
    return http.subscribe('/api/messages', cb)
}

function messageArriver(conversationID) {
    return message => {
        if (message.conversationID !== conversationID) {
            return
        }

        const messagesOList = document.getElementById('messages')
        if (messagesOList === null) {
            return

        }
        messagesOList.appendChild(renderMessage(message))
        readMessages(message.conversationID)
    }
}

function readMessages(conversationID) {
    return http.post(`/api/conversations/${conversationID}/read\_messages`)
}

```

在这里我们仍然使用这个应用的部分来获取会话 ID。 当新消息到达时，我们首先检查它是否来自此对话。如果是，我们会将消息条目预先添加到列表中，并向 `/api/conversations/{conversationID}/read_messages` 发起 POST 一个请求，以更新参与者上次阅读消息的时间。

---

本系列到此结束。 消息应用现在可以运行了。

* [源代码](https://github.com/nicolasparada/go-messenger-demo)
* [演示](https://go-messenger-demo.herokuapp.com/)

---

via: <https://nicolasparada.netlify.com/posts/go-messenger-conversation-page/>

作者：[Nicolás Parada](https://nicolasparada.netlify.com/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[gxlct008](https://github.com/gxlct008) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Ubuntu 20.04 LTS 上安装深度（Deepin）桌面环境

有没有装 cinnamon桌面的教程

来自河南郑州的 Chrome Mobile 73.0|Android 10 用户

fedora 支不支持

安装成功了。然后terminal丢了！！！

我一个白兆网下载还这么慢？真有你的！

>
> 本教程向你展示在 Ubuntu 上安装深度（Deepin）桌面环境的正确步骤。还提到了移除步骤。
>
>
>

![](/data/attachment/album/202010/15/223607kqs5zguiq53fkkig.png)

毫无疑问，深度操作系统（Deepin OS）是一个 [漂亮的 Linux 发行版](https://itsfoss.com/beautiful-linux-distributions/)。最近发布的 [深度操作系统 V20](https://itsfoss.com/deepin-20-review/) 就更加美观了。

[深度操作系统](https://www.deepin.org/en/) 是基于 [Debian](https://www.debian.org/) 的，默认的存储库镜像太慢了。如果你更愿意使用 Ubuntu，可以选择 [UbuntuDDE Linux 发行版](https://itsfoss.com/ubuntudde/) 形式的 Ubuntu 的深度操作系统的变体。它还不是 [官方的 Ubuntu 风格](https://itsfoss.com/which-ubuntu-install/) 之一。

[重新安装新的发行版](https://itsfoss.com/reinstall-ubuntu/) 是一个麻烦，因为你会丢失数据，你将不得不在新安装的 UbuntuDDE 上重新安装你的应用程序。

一个更简单的选择是在现有的 Ubuntu 系统上安装深度桌面环境（DDE）。毕竟，你可以轻松地在一个系统中安装多个[桌面环境](https://itsfoss.com/what-is-desktop-environment/)。

不要烦恼，这很容易做到，如果你不喜欢，也可以恢复这些更改。让我来告诉你怎么做。

### 在 Ubuntu 20.04 上安装深度桌面环境

UbuntuDDE 团队已为他们的发行版创建了一个 PPA，你可以使用相同的 PPA 在 Ubuntu 20.04 上安装深度桌面环境。请记住，此 PPA 仅适用于 Ubuntu 20.04。请阅读有关 [在 Ubuntu 中使用 PPA](https://itsfoss.com/ppa-guide/)。

>
> 没有深度桌面环境 V20
>
>
> 你将在此处使用 PPA 安装的深度桌面环境还不是新的 V20。它可能会在 Ubuntu 20.10 发布后出现，但是我们不能担保。
>
>
>

以下是你需要遵循的步骤：

**步骤 1**：你需要首先在终端上输入以下内容，来添加 [Ubuntu DDE Remix 团队的官方 PPA](https://launchpad.net/~ubuntudde-dev/+archive/ubuntu/stable)：

```
sudo add-apt-repository ppa:ubuntudde-dev/stable

```

**步骤 2**：添加存储库以后，继而安装深度桌面环境。

```
sudo apt install ubuntudde-dde

```

![](/data/attachment/album/202010/15/223400skfft6hkztu68c87.png)

现在，安装将启动，一段时间后，将要求你选择<ruby> 显示管理器 <rt>  display manager </rt></ruby>。

![](/data/attachment/album/202010/15/223414d3ncndbzu3zb4cj8.jpg)

如果需要深度桌面主题的锁屏，则需要选择 “lightdm”。如果不需要，你可以将其设置为 “gdm3”。

如果你看不到此选项，可以通过键入以下命令来获得它，然后选择你首选的显示管理器：

```
sudo dpkg-reconfigure lightdm

```

**步骤 3**： 完成后，你必须退出并通过选择 “Deepin” 会话再次登录，或者重新启动系统。

![](/data/attachment/album/202010/15/223433w6tspf8i485ez6i7.jpg)

就是这样。马上在你的 Ubuntu 20.04 LTS 系统上享受深度桌面环境体验吧！

![](/data/attachment/album/202010/15/223449iykwyp6k561lx5bk.png)

### 从 Ubuntu 20.04 删除深度桌面

如果你不喜欢这种体验，或者由于某些原因它有 bug，可以按照以下步骤将其删除。

**步骤 1**： 如果你已将 “lightdm” 设置为显示管理器，则需要在卸载深度桌面环境之前将显示管理器设置为 “gdm3”。为此，请键入以下命令：

```
sudo dpkg-reconfigure lightdm

```

![](/data/attachment/album/202010/15/223414d3ncndbzu3zb4cj8.jpg)

然后，选择 “gdm3” 继续。

完成此操作后，你只需输入以下命令即可完全删除深度桌面环境：

```
sudo apt remove startdde ubuntudde-dde

```

你只需重启即可回到原来的 Ubuntu 桌面环境。如果图标没有响应，只需打开终端（`CTRL + ALT + T`）并输入：

```
reboot

```

### 总结

有不同的 [桌面环境选择](https://itsfoss.com/best-linux-desktop-environments/) 是件好事。如果你真的喜欢深度桌面环境的界面，那么这可能是在 Ubuntu 上体验深度操作系统的一种方式。

如果你有任何疑问或遇到任何问题，请在评论中告诉我。

---

via: <https://itsfoss.com/install-deepin-ubuntu/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[gxlct008](https://github.com/gxlct008) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


GNOME 3.38：可定制应用程序网格、性能改善

Summary: GNOME 3.36 带来大量亟需的改进，同时也带来性能的重大提升。现在，在 6 个月后，我们终于引来了 GNOME 3.38，并带来了一系列重大的变化。

当年在Arch上面用了一年多gnome，平时还是很稳定，大版本升级可能会出问题，要等一段时间才被修复

![](/data/attachment/album/202010/16/203906xys0py0nvi1d01ss.jpg)

[GNOME 3.36](https://itsfoss.com/gnome-3-36-release/) 带来大量亟需的改进，同时也带来性能的重大提升。现在，在 6 个月后，我们终于引来了 GNOME 3.38，并带来了一系列重大的变化。

### GNOME 3.38 主要特色

这里是 GNOME 3.38 (代码名称：Orbis) 的主要亮点：

#### 可定制应用程序菜单

作为 GNOME 3.38 重大更改中的一部分，应用程序网格（或称应用菜单）现在是可以可定制的。

现在，你可以通过拖拽每个应用程序图标来创建文件夹，将它们移到文件夹，或移出文件夹并将其设置回应用网格。你也可以在应用网格中随心所欲地调整图标的位置。

![](/data/attachment/album/202010/16/210620kugfvjjfvuy4myfv.jpg)

此外，这些变化是一些即将到来的设计更改的基本组成部分，因此，看到我们可以期待的东西会很令人兴奋。

#### 日历菜单更新

![](/data/attachment/album/202010/16/210636nvcjancksr8a8ckr.png)

随着最近一次的 GNOME 更新，通知区整洁了很多，但是现在随着 GNOME 3.38 的到来，你终于可以通过日历区域的正下方访问日历事件，使事情变得方便且容易访问。

它不是一个重大的视觉改造，但也是一些改善。

#### 家长控制改善

作为 GNOME 3.38 一部分，你将会注意家长控制服务。它支持与桌面、shell、设置以及其它各种各样组件的集成，来帮助你限制用户可以访问的内容。

#### 重新启动按钮

一些细微的改善导致了巨大的变化，重新启动按钮正是其中的一个变化。先单击 “关闭电源” / “关机” 按钮，再单击 “重新启动” 按钮的操作来重新启动系统总是让人很烦。

因此，随着 GNOME 3.38 的到来，你将最终会注意到一个作为单独按钮的 “重新启动” ，这将节省你的单击次数，平复你烦闷的心情。

#### 屏幕录制改善

[GNOME shell 内置的屏幕录制](https://itsfoss.com/gnome-screen-recorder/) 现在是一项独立的系统服务，这可能会使录制屏幕成为一种平滑流畅的体验。

另外，窗口截屏也有一些改善，并修复了一些错误：

#### GNOME 应用程序更新

GNOME 计算器也收到很多的错误修复。除此之外，你也将发现 [epiphany GNOME 浏览器](https://en.wikipedia.org/wiki/GNOME_Web) 的一些重大改变。

GNOME Boxes 现在允许你从一个操作系统列表中选择将要运行的操作系统，GNOME 地图也有一些图像用户界面上的更改。

当然，不仅限于这些，你页将注意到 GNOME 控制中心、联系人、照片、Nautilus，以及其它一些软件包的细微更新和修复。

#### 性能和多显示器支持改善

这里有一大堆底层的改进来全面地改善 GNOME 3.38 。例如，[Mutter](https://en.wikipedia.org/wiki/Mutter_(software)) 有一些重要的修正，它现在允许在两个显示器中使用不同的刷新频率。

![](/data/attachment/album/202010/16/210656jiudw01ww6iz6bzn.jpg)

先前，如果一台显示器的刷新频率为 60 Hz，而另一台的刷新频率为 144 Hz ，那么刷新频率较慢的显示器将限制另外一台显示器的刷新频率。但是，随着在 GNOME 3.38 中的改善，它将能够处理多个显示器，而不会使显示器相互限制。

另外，[Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=GNOME-3.38-Last-Min-Mutter) 报告的一些更改指出，在一些情况下，缩短大约 10% 的渲染时间。因此，这绝对是一个很棒的性能优化。

#### 各种各样的其它更改

* 电池百分比指示器
* 电源菜单中的重新启动选项
* 新的欢迎指引
* 指纹登录
* 二维码扫描以共享 Wi-Fi 热点
* GNOME 浏览器的隐私和其它改善
* GNOME 地图现在反应敏捷并能根据屏幕大小改变其大小
* 重新修订的图标

你可以在它们的官方 [更改日志](https://help.gnome.org/misc/release-notes/3.38) 中找到一个详细的更改列表。

### 总结

GNOME 3.38 确实是一个令人赞叹的更新，它改善了 GNOME 用户体验。尽管 GNOME 3.36 带来了性能的很大改善，但是针对 GNOME 3.38 的更多优化仍然是一件非常好的事.

GNOME 3.38 将在 Ubuntu 20.10 和 [Fedora 33](https://itsfoss.com/fedora-33/) 中可用。Arch 和 Manjaro 用户应该很快就能获得。

我认为有很多变化是朝着正确的方向发展的。你觉得呢？

---

via: <https://itsfoss.com/gnome-3-38-release/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[robsean](https://github.com/robsean) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


2020 中文学生开源年会（线上）即将召开！

Summary:
时间:  10月18日 上午 9 点

地点: bilibili 直播间 22566724

![](/data/attachment/album/202010/17/112533guuqn77r2299zbnz.png)

**时间:** 10月18日 上午 9 点

**地点:** [bilibili 直播间 22566724](https://live.bilibili.com/22566724)

### 年会简介

学生开源年会（sosconf）是首个由学生组织、面向学生的非盈利社区全球性开源技术峰会，峰会基于开放源代码的理念，致力于纯粹的技术交流和多元的思想碰撞，鼓励学生享受开源、了解开源、参与开源、贡献开源，并能从开源中得到实践和乐趣。

该会议旨在积极推动学生参与开放源代码运动的历史进程，2018 年成功地在重庆举办第0届学生开源年会。

中文学生开源年会（sosconf.zh）则是学生开源年会 X 计划中的一员，其是秉承了学生开源年会的基本精神，以中文为主要语言进行的学生开源年会版本。

本次中文学生开源年会将围绕着“开源”主题，由九场主题演讲构成，为学生开源项目、开源思想应用等广义开源技术实践提供分享与交流的平台。

### 议程安排

#### 9:10-9:30

**主题：** Welcome Speech

**讲者：** 朱芮捷

**简介：** 本次中文学生开源年会总召朱芮捷将代表年会组委会与贡献者团队进行开场致辞。

#### 9:30-10:00

**主题：** 怎样设计一个没人用的编程语言

**讲者：** 李登淳

**简介：** 中文编程? No 炫酷语法? No 坚持三年，发布数十个版本，却没啥用户的编程语言， 背后究竟有什么故事？听 CovScript 创始人为您亲自讲述。

#### 10:00-10:20

中场休息&抽奖

#### 10:20-10:50

**主题：** WebP Server Go

**讲者：** Nova Kwok

**简介：** WebP是一种同时提供了有损压缩与无损压缩的图片文件格式，目标是减少文件大小，但达到和JPEG格式几乎相同的图片质量。

为了让点的图片可以无痛地以 WebP 格式输出，部分云服务商提供了转换服务，对于个人站点而言，为了同样在不改变站点原始 URL 的的情况下将图片压缩 WebP 格式输出，且脱离云服务商的限制，做到节省流量+提升页面加载速度的效果，[WebP Server Go](https://github.com/webp-sh/webp_server_go) 应运而生。

使用 Go 编写的 WebP Server 是一个单一的 binary，性能优异，并且可以无缝转换JPG/PNG为webp。

只需要一次配置即可在不改变 URL 的情况下将站点图片以 WebP 格式输出，唯一改变的只有 `content-type` 和 `length`，无痛加速站点。原来下载10M的图片要花 10 秒钟，使用 [WebP Server Go](https://github.com/webp-sh/webp_server_go)，只需要一秒钟就够了。

#### 10:50-11:20

**主题：** 编程, 让生活更美好

**讲者：** 闫放放

**简介：** 你是否在网上，甚至周围听到过各种关于程序员的段子？你的编程生活是否真的如段子一样？

身为一名程序员，你眼中的生活是怎样的？

这次演讲，让你学会如何使生活井井有条，如何更好的享受生活。

甚至如果可以，如何看待生活与编程。

#### 11:30-12:00

**主题：** 开源软件与自由软件

**讲者：** Kiritake Kumi

**简介：** 介绍开源软件与自由软件的历史渊源

#### 12:00-14:00

午间休息

#### 14:00-15:30

**主题：** 像个抖 M 一样写代码

**讲者：** ICE1000

**简介：** 这一看就是标题党，实际上是讲两个话题，静态类型系统和设计模式的。两者尤其是设计模式在码农间褒贬不一，讲者决定站在自己的角度谈谈如何理性看待这两位限制着程序员自由发挥的抖 S 们（笑）。

#### 15:30-15:40

中场休息+抽奖

#### 15:40-16:20

**主题：** 开源之我⻅ & SimpleXX 社区介绍

**讲者：** 牛志宏

**简介：** 主要分为两个部分。

第一部分为介绍自己的开源经历，第二部分则介绍 Simple-XX 社区。

#### 16:20-16:40

**主题：** 爬虫，当斩还是当赏?

**讲者：** 李洋

**简介：** 随着人工智能的爆发，目前多以深度学习为主，样本数据的采集催生了爬虫的发展。但是爬虫就像是一个生活在阳光下的蠕虫，它有法可依也无法可依，行业内多用道德准绳来约束它。有人用它作恶，有人合法使用。没有一个标准，爬虫永远都是蠕虫。

#### 16:40-17:10

**主题：** 一款辅助外语学习的词典

**讲者：** 赵丰

**简介：** 本次演讲介绍“一款辅助外语学习的词典” 这个 Web 应用及其开发的技术栈。

这款应用让外语学习者通过浏览器添加单词，制作自己的词典。

作为一个 Web 应用，其前端主要采用了传统的 HTML + Jquery

的开发方式，数据采用 XML 保存，用 XSLT 样式表来渲染。

后端使用了 Django 用于处理 POST 表单并在服务器上修改 XML 数据文件。

目前前后端还有许多不完善的地方，欢迎有兴趣的小伙伴参与贡献。

#### 17:10-18:00

**主题：** 如何做一个好项目

**讲者：** 杨瀚淩

**简介：** “什么样的项目才是好项目”，“如何做出一个好项目”，“好项目落地前的准备”等三个方面进行阐述。结合 IT 和 MBA 相关知识，让同学们结合工商管理思维方式开发出更具影响力的程序项目。

#### 18:00-18:40

**主题：** 红岩网校的后台架构演进与自研 RPC 框架

**讲者：** Kieran / 胡仓

**简介：** 红岩网校工作站作为一个服务校内的学生组织，拥有很多围绕着学生开发的服务。当红岩网校已经走过 20 年，积累的陈旧架构与业务已经不足以支持我们向前走。

这一篇演讲将从真实的场景出发，解构业务的复杂性，一步步拆解问题，解决问题。新的技术栈替代老旧的技术栈，旧服务逐步重构为新服务，整体演变为微服务的架构。

于此同时，我们自研了 Begonia RPC 框架，来应对更换架构与技术更新的挑战。

![](/data/attachment/album/202010/17/112632pf3qzqmx3gmtwkj3.png)


如何在 Linux 上安装微软 Windows 计算器

lj snap，不用也罢

来自河南郑州的 Chrome Mobile 84.0|Android 8.0 用户

![](/data/attachment/album/202010/17/212236jkctltljj0cllxbe.jpg)

微软不再是 Linux 或开源社区的敌人。不管你信不信，Windows 的制造商现在是一个盟友。我知道这很令人震惊，但完全是事实。多亏了 WSL，Linux 现在已经内置于 Windows 中，而微软也有几款应用可供 Linux 使用。

该公司甚至将一些应用程序也开源了。例如，早在 2019 年，微软就[在 GitHub 上发布了 Windows 计算器的源代码](https://betanews.com/2019/03/06/microsoft-windows-calculator-open-source-github/)。而现在，该计算器应用已经被 Uno Platform 移植到 Linux 上。最重要的是，它的安装超简单，因为它是以 Snap 格式打包的。

“Uno Platform 社区的好人们已经将开源的 Windows 计算器移植到了 Linux 上。而且做得比微软把他们的浏览器带到 Linux 上还快。这个计算器发布在 Snap 商店中，可以马上下载。”Canonical 产品经理 Rhys Davies [解释](https://snapcraft.io/blog/the-windows-calculator-on-linux-with-uno-platform)道。

Davies 进一步解释说：“在 UnoConf 2020 期间，Uno Platform 将他们的支持带到了 Linux。Uno Platform 允许你使用 C# 和 XAML 从单一代码库中构建本地移动、桌面和 WebAssembly 应用程序。你可以使用 Visual Studio 和 Ubuntu 在 WSL 上使用 Uno Platform 构建 Linux 应用程序。你可以在 Snap 商店中抓取它们，然后在从 Linux 桌面到树莓派等各种系统上运行你的应用程序。”

那么，在 Linux 上安装 Windows 计算器有多容易呢？如果你有一个现代的操作系统，内置 Snap 支持，比如 Ubuntu 20.04，你可以从[这里的 Snap 商店](https://snapcraft.io/uno-calculator)安装它。喜欢使用命令行吗？只需在终端中输入 `snap install uno-calculator` 即可。

请注意：如果你的发行版没有原生的 Snap 支持，你可以按照[这里的说明](https://snapcraft.io/docs/installing-snapd)进行设置。

当然，你可能想知道为什么你应该在 Linux 上安装 Windows 计算器。嗯……只是因为你可以，当然！但说真的，它实际上是一个设计得非常好的应用程序，你可能会发现它比其他计算器程序更优秀 —— 包括任何预装在你的操作系统上的程序。试试吧，伙计们 —— 你可能会喜欢它。

---

via: <https://betanews.com/2020/10/15/how-to-install-windows-calculator-linux/>

作者：[Brian Fagioli](https://betanews.com/author/brianfagioli/) 选题：[wxy](https://github.com/wxy) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](/article-12726-1.html) 荣誉推出


C 语言简单编程速成

Summary: 我们将所有的 C 语言要素放置到一份易读的备忘录上。

我一个小白都看得津津有味，赞一个！！！！！！！！！

我们将所有的 C 语言要素放置到一份易读的备忘录上。

>
> 我们将所有的 C 语言要素放置到一份易读的备忘录上。
>
>
>

![](/data/attachment/album/202010/18/213610t3do3u7oev2udoyn.png)

1972 年，<ruby> 丹尼斯·里奇 <rt>  Dennis Ritchie </rt></ruby>任职于<ruby> 贝尔实验室 <rt>  Bell Labs </rt></ruby>，在几年前，他和他的团队成员发明了 Unix 。在创建了一个经久不衰的操作系统（至今仍在使用）之后，他需要一种好的方法来对这些 Unix 计算机编程，以便它们可用执行新的任务。在现在看来，这很奇怪，但在当时，编程语言相对较少，Fortran、Lisp、[Algol](https://opensource.com/article/20/6/algol68) 以及 B 语言都很流行，但是，对于贝尔实验室的研究员们想要做的事情来说，它们还是远远不够的。丹尼斯·里奇表现出一种后来被称为程序员的主要特征的特质：创造了他自己的解决方案。他称之为 C 语言，并且在近 50 年后，它仍在广泛的使用。

### 为什么你应该学习 C 语言

今天，有很多语言为程序员提供了比 C 语言更多的特性。最明显的是 C++ 语言，这是一种以相当露骨的方式命名的语言，它构建在 C 语言之上，创建了一种很好的面向对象语言。不过，许多其它语言的存在是有充分理由的。计算机擅长一致的重复，因此任何可预见的东西都可以构建在编程语言中，对程序员来说这意味着更少的工作量。为什么在 C++ 语言中用一行语句就可以将一个 `int` 转换为一个 `long` 时（`long x = long(n);`），还要在 C 语言用两行语句呢？

然而，C 语言在今天仍然有用。

首先，C 语言是一种相当简约和直接的语言。除了编程的基础知识之外，并没有很高级的概念，这很大程度上是因为 C 语言实际上就是现代编程语言的基础之一。例如，C 语言的特性之一是数组，但是它不提供字典（除非你自己写一个）。当你学习 C 语言时，你会学习编程的基础组成部分，它可以帮助你认识到如今的编程语言的改进及其的精心设计。

因为 C 语言是一种最小化的编程语言，你的应用程序很可能会获得性能上的提升，这在其它许多编程语言中是看不到的。当你考虑你的代码可以执行多快的时候，很容易陷入锱铢必较的境地，因此，重要的是要问清楚你是否*需要*为某一特定任务提供更多的速度。与 Python 或 Java 相比，使用 C 语言，你在每行代码中需要纠结的地方更少。C 语言程序运行很快。这是 Linux 内核使用 C 语言编写的一个很好的理由。

最后，C 语言很容易入门，特别是，如果你正在运行 Linux，就已经能运行 C 语言代码了，因为 Linux 系统包含 GNU C 库（`glibc`）。为了编写和构建 C 语言程序，你需要做的全部工作就是安装一个编译器，打开一个文本编辑器，开始编码。

### 开始学习 C 语言

如果你正在运行 Linux ，你可以使用你的软件包管理器安装一个 C 编译器。在 Fedora 或 RHEL 上：

```
$ sudo dnf install gcc

```

在 Debian 及其衍生系统上：

```
$ sudo apt install build-essential

```

在 macOS 上，你可以 [安装 Homebrew](https://opensource.com/article/20/6/homebrew-mac) ，并使用它来安装 [GCC](https://gcc.gnu.org/)：

```
$ brew install gcc

```

在 Windows 上, 你可以使用 [MinGW](https://opensource.com/article/20/8/gnu-windows-mingw) 安装一套最小的包含 GCC 的 GNU 实用程序集。

在 Linux 或 macOS 上验证你已经安装的 GCC：

```
$ gcc --version
gcc (GCC) x.y.z
Copyright (C) 20XX Free Software Foundation, Inc.

```

在 Windows 上，提供 EXE 文件的完整路径：

```
PS> C:\MinGW\bin\gcc.exe --version
gcc.exe (MinGW.org GCC Build-2) x.y.z
Copyright (C) 20XX Free Software Foundation, Inc.

```

### C 语法

C 语言不是一种脚本语言。它是一种编译型语言，这意味着它由 C 编译器处理来产生一个二进制可执行文件。这不同于脚本语言（如 [Bash](https://opensource.com/resources/what-bash)）或混合型语言（如 [Python](https://opensource.com/resources/python)）。

在 C 语言中，你可以创建*函数*来执行你希望做到的任务。默认情况下，执行的是一个名为 `main` 的函数。

这里是一个使用 C 语言写的简单的 “hello world” 程序：

```
#include <stdio.h>

int main() {
  printf("Hello world");
  return 0;
}

```

第一行包含一个被称为 `stdio.h`（标准输入和输出）的 *头文件*，它基本上是自由使用的、非常初级的 C 语言代码，你可以在你自己的程序中重复使用它。然后创建了一个由一条基本的输出语句构成的名为 `main` 的函数。保存这些文本到一个被称为 `hello.c` 的文件中，然后使用 GCC 编译它：

```
$ gcc hello.c --output hello

```

尝试运行你的 C 语言程序：

```
$ ./hello
Hello world$

```

#### 返回值

这是 Unix 哲学的一部分，一个函数在执行后“返回”一些东西：在成功时不返回任何东西，在失败时返回其它的一些东西（例如，一个错误信息）。这些返回的内容通常使用数字（确切地说是整数）表示：`0` 表示没有错误，任何大于 `0` 的数字都表示一些不成功的状态。

Unix 和 Linux 被设计成在运行成功时保持沉默是很明智的。这是为了让你在执行一系列命令时，假设没有任何错误或警告会妨碍你的工作，从而可以始终为成功执行做准备。类似地，在 C 语言中的函数在设计上也预期不出现错误。

你可以通过一个小的修改，让你的程序看起来是失败的，就可以看到这一点：

```
include <stdio.h>

int main() {
  printf("Hello world");
  return 1;
}

```

编译它：

```
$ gcc hello.c --output failer

```

现在使用一个内置的 Linux 测试方式来运行它。仅在*成功*时，`&&` 操作符才会执行一个命令的第二部分。例如：

```
$ echo "success" && echo "it worked"
success
it worked

```

在*失败*时，`||` 测试会执行一个命令的第二部分。

```
$ ls blah || echo "it did not work"
ls: cannot access 'blah': No such file or directory
it did not work

```

现在，尝试你的程序，在成功时，它*不*返回 `0`；而是返回 `1`：

```
$ ./failer && echo "it worked"
String is: hello

```

这个程序成功地执行了，但是没有触发第二个命令。

#### 变量和类型

在一些语言中，你可以创建变量而不具体指定变量所包含的数据的*类型*。这些语言如此设计使得解释器需要对一个变量运行一些测试来视图发现变量是什么样的数据类型。例如，`var=1` 定义了一个整型数，当你创建一个表达式将 `var` 与某些东西相加时，Python 知道显然它是一个整型数。它同样知道当你连接 `hello` 和 `world` 时，单词 `world` 是一个字符串。

C 语言不会为你做任何这些识别和调查；你必须自己定义你的变量类型。这里有几种变量类型，包括整型（`int`），字符型（`char`），浮点型（`float`），布尔型（`boolean`）。

你可能也注意到这里没有字符串类型。与 Python 和 Java 和 Lua 以及其它的编程语言不同，C 语言没有字符串类型，而是将字符串看作一个字符数组。

这里是一些简单的代码，它建立了一个 `char` 数组变量，然后使用 [printf](https://opensource.com/article/20/8/printf) 将数组变量和一段简单的信息打印到你的屏幕上：

```
#include <stdio.h>

int main() {
   char var[6] = "hello";
   printf("Your string is: %s\r\n",var);
}

```

你可能会注意到，这个代码示例向一个由五个字母组成的单词提供了六个字符的空间。这是因为在字符串的结尾有处一个隐藏的终止符，它占用了数组中的一个字节。你可以通过编译和执行代码来运行它：

```
$ gcc hello.c --output hello
$ ./hello
hello

```

### 函数

和其它的编程语言一样，C 函数也接受可选的参数。你可以通过定义你希望函数接受的数据类型，来将参数从一个函数传递到另一个函数：

```
#include <stdio.h>

int printmsg(char a[]) {
   printf("String is: %s\r\n",a);
}

int main() {
   char a[6] = "hello";
   printmsg(a);
   return 0;
}

```

简单地将一个函数分解为两个函数的这种方法并不是非常有用，但是它演示了默认运行 `main` 函数以及如何在函数之间传递数据。

### 条件语句

在真实的编程中，你通常希望你的代码根据数据做出判断。这是使用*条件*语句完成的，`if` 语句是其中最基础的一个语句。

为了使这个示例程序更具动态性，你可以包含 `string.h` 头文件，顾名思义，它包含用于检查字符串的代码。尝试使用来自 `string.h` 文件中的 `strlen` 函数测试传递给 `printmsg` 函数的字符串是否大于 `0`：

```
#include <stdio.h>
#include <string.h>

int printmsg(char a[]) {
  size_t len = strlen(a);
  if ( len > 0) {
    printf("String is: %s\r\n",a);
  }
}

int main() {
   char a[6] = "hello";
   printmsg(a);
   return 1;
}

```

正如在这个示例中所实现的，该条件永远都不会是非真的，因为所提供的字符串总是 `hello`，它的长度总是大于 `0`。这个不够认真的重新实现的 `echo` 命令的最后一点要做是接受来自用户的输入。

### 命令参数

`stdio.h` 文件包含的代码在每次程序启动时提供了两个参数: 一个是命令中包含多少项的计数（`argc`），一个是包含每个项的数组（`argv`）。例如， 假设你发出这个虚构的命令：

```
$ foo -i bar

```

`argc` 是 `3`，`argv` 的内容是：

* `argv[0] = foo`
* `argv[1] = -i`
* `argv[2] = bar`

你可以修改示例 C 语言程序来以字符串方式接受 `argv[2]`，而不是默认的 `hello` 吗？

### 命令式编程语言

C 语言是一种命令式编程语言。它不是面向对象的，也没有类结构。使用 C 语言的经验可以教你很多关于如何处理数据，以及如何更好地管理你的代码运行时生成的数据。多使用 C 语言，你最后能够编写出其它语言（例如 Python 和 Lua）可以使用的库。

想要了解更多关于 C 的知识，你需要使用它。在 `/usr/include/` 中查找有用的 C 语言头文件，并且看看你可以做什么小任务来使 C 语言对你有用。在学习的过程中，使用来自 FreeDOS 的 [Jim Hall](https://opensource.com/users/jim-hall) 编写的 [C 语言忘备录](https://opensource.com/downloads/c-programming-cheat-sheet)。它在一张双面纸忘备录上放置了所有的基本要素，所以在你练习时，可以立即访问 C 语言语法的所有要素。

---

via: <https://opensource.com/article/20/8/c-programming-cheat-sheet>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[robsean](https://github.com/robsean) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


将你的日历与 Ansible 集成，以避免与日程冲突

>
> 通过将日历应用集成到 Ansible 中，确保你的自动化工作流计划不会与其他东西冲突。
>
>
>

![](/data/attachment/album/202010/18/221110wk9kd9ewrde11zxx.jpg)

“随时”是执行自动化工作流的好时机吗？出于不同的原因，答案可能是否定的。

如果要避免同时进行更改，以最大限度地减少对关键业务流程的影响，并降低意外服务中断的风险，则在你的自动化运行的同时，其他任何人都不应该试图进行更改。

在某些情况下，可能存在一个正在进行的计划维护窗口。或者，可能有大型事件即将来临、一个关键的业务时间、或者假期（你或许不想在星期五晚上进行更改）。

![Street scene with a large calendar and people walking](/data/attachment/album/202010/18/221143fw24mm4e174z1wlp.jpg "Street scene with a large calendar and people walking")

无论出于什么原因，你都希望将此信息发送到你的自动化平台，以防止在特定时间段内执行周期性或临时任务。用变更管理的行话，我说的是当变更活动不应该发生时，指定封锁窗口。

### Ansible 中的日历集成

如何在 [Ansible](https://docs.ansible.com/ansible/latest/index.html) 中实现这个功能？虽然它本身没有日历功能，但 Ansible 的可扩展性将允许它与任何具有 API 的日历应用集成。

目标是这样的：在执行任何自动化或变更活动之前，你要执行一个 `pre-task` ，它会检查日历中是否已经安排了某些事情（目前或最近），并确认你没有在一个阻塞的时间段中。

想象一下，你有一个名为 `calendar` 的虚构模块，它可以连接到一个远程日历，比如 Google 日历，以确定你指定的时间是否已经以其他方式被标记为繁忙。你可以写一个类似这样的剧本：

```
- name: Check if timeslot is taken
  calendar:
    time: "{{ ansible_date_time.iso8601 }}"
  register: output

```

Ansible 实际会给出 `ansible_date_time`，将其传递给 `calendar` 模块，以验证时间的可用性，以便它可以注册响应 （`output`），用于后续任务。

如果你的日历是这样的：

![Google Calendar screenshot](/data/attachment/album/202010/18/221150jupznzhuu5fk5k9a.png "Google Calendar screenshot")

那么这个任务的输出就会指明这个时间段被占用的事实 （`busy: true`）：

```
ok: [localhost] => {
   "output": {
       "busy": true,
       "changed": false,
       "failed": false,
       "msg": "The timeslot 2020-09-02T17:53:43Z is busy: true"
   }
}

```

### 阻止任务运行

接下来，[Ansible Conditionals](https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html) 将帮助阻止所有之后任务的执行。一个简单的例子，你可以在下一个任务上使用 `when` 语句来强制它只有当上一个输出中的 `busy` 字段不是 `true` 时，它才会运行：

```
tasks:
  - shell: echo "Run this only when not busy!"
    when: not output.busy

```

### 总结

在[上一篇文章](https://medium.com/swlh/python-and-ansible-to-automate-a-network-security-workflow-28b9a44660c6)中，我说过 Ansible 是一个将事物连接在一起的框架，将不同的组成部分相互连接，以协调端到端自动化工作流。

这篇文章探讨了 Ansible 剧本如何与日历应用集成以检查可用性。然而，我只做了一些表面工作！例如，你的任务也可以阻止日历中的一个时间段，这里的发挥空间很大。

在我的下一篇文章中，我将深入 `calendar` 模块是如何构建的，以及其他编程语言如何与 Ansible 一起使用。如果你和我一样是 [Go](https://golang.org/) 的粉丝，请继续关注！

---

*这篇文章最初发表在 Medium 上，名为 [Ansible and Google Calendar integration for change management](https://medium.com/swlh/ansible-and-google-calendar-integration-for-change-management-7c00553b3d5a)，采用 CC BY-SA 4.0 许可，经许可后转载。*

---

via: <https://opensource.com/article/20/10/calendar-ansible>

作者：[Nicolas Leiva](https://opensource.com/users/nicolas-leiva) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


近场通信 vs. 低功耗蓝牙：如何抉择

Summary: 近场通信（NFC）和低功耗蓝牙（BLE）是适合企业不同用途的低功耗无线技术。

近场通信（NFC）和低功耗蓝牙（BLE）是适合企业不同用途的低功耗无线技术。

>
> 近场通信（NFC）和低功耗蓝牙（BLE）是适合企业不同用途的低功耗无线技术。
>
>
>

![](/data/attachment/album/202010/19/201622exomzeeem6y8ettz.jpg)

在低功率、相对短距离连接的众多选择中，有两种技术脱颖而出——近场通信（NFC）和低功耗蓝牙（BLE）。两者都具有相对低廉的部署成本且易于使用。

NFC 作为许多现代智能卡片的背后技术而为大众所熟知。NFC 芯片必须十分接近（在几厘米内）读卡器来实现连接，但这是它主要企业用例（安全性和访问控制）的一个优势。

BLE 是主要蓝牙标准的低功耗衍生品，以较低的潜在吞吐量换来了能耗的显著降低，从而能够适应更广泛的潜在用例。

接下来，我们将对每种技术及其主要用例进行更深入的描述。

### NFC 的未来

NFC 在近距离接触范围内工作（设备间必须靠近到几厘米范围内来进行连接），一个可读的无源 NFC “标签”根本不需要任何独立电源，它会从读卡器的信号中汲取能量，工作频率约为 13.5MHz，在主动读取芯片时需要 100-700µA 的电量。

“短距离实际上是它的优势。”Gartner 研究高级总监兼分析师说， “NFC 的一大优点是它不仅仅是无线电，还内置了一个庞大的安全协议。”也就是说，潜在的不良行为者必须非常接近——使用专用设备、在几米的范围内——才能检测到正在发生的 NFC 连接。NFC 还可以施行在 SSL 技术上面一层以提高安全性。

考虑到 NFC 本就起源于非接触式支付技术，这不足为奇。它在这一领域的根基在于对零售商的吸引力，零售商可以利用 NFC 让客户在购买商品前获取相关的信息、获得优惠券或者向店员寻求帮助，只需将手机接触到 NFC 热点即可。

尽管 NFC 只能在一个很近的范围内使用，这限制了使用 NFC 技术用例场景，但它不仅仅是为了开门和买一杯拿铁。NFC 可以用于引导连接，便于设备间轻松快速的配对，因此用户只需在会议室中将手机贴近配备好的投影仪，即可创建一个 NFC 连接，并验证智能手机是否是一个可连接的授权设备，并进行演示。演示文稿或者视频数据本身不会通过 NFC 来传输，但是 NFC 握手可作为另外的无线协议（例如 Wi-Fi 网络或者任何其他更高带宽可以传输数据的网络）间的验证，从而无需用户登录。

### BLE 的特点

相较之下，BLE 的工作距离要远的多（长达几十米），其最大带宽 ：1 Mbit/s 约为 NFC 连接的两倍。它是著名的蓝牙技术的产物，相较于主线标准的更低功耗，它为机器到机器的连接做了优化。在连接两端的耗电量均小于 15 mA，实用范围约为 10米，可通过 AES 加密保护连接。

然而，根据 Forrester 首席分析师 Andre Kindness 的说法，它远非 NFC 的替代品。

他说：“从信息传递角度来看， [NFC] 比 BLE 快得多。”BLE 通常需要几分之一秒或更长时间的验证并安全连接，而 NFC 几乎在瞬间完成连接。

不过，根据 IDC 高级研究分析师 Patrick Filkins 的说法，相较于 NFC，BLE 由于范围更广而有着更多的通用性。

他说：“我认为 BLE 比较适合企业”。而类似于资产追踪、室内导航和目标广告的用例只是冰山一角。

对于企业，结果是相当直接的——NFC 用例大多与公司使用蓝牙的用例是分开的，对于少有的可以选择的重叠，相对的优势和劣势显而易见。NFC 距离很短、价格便宜、可即时连接以及数据转换率较低。BLE 的工作距离更远、传输速率更高，成本也更高，连接时还需要一点时间来进行“握手”。

---

via: <https://www.networkworld.com/article/3574932/nfc-vs-bluetooth-le-when-to-use-which.html>

作者：[Jon Gold](https://www.networkworld.com/author/Jon-Gold/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[chenmu-kk](https://github.com/chenmu-kk) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Ubuntu 和其他 Linux 发行版上使用 Yarn

>
> 本速成教程向你展示了在 Ubuntu 和 Debian Linux 上安装 Yarn 包管理器的官方方法。你还将学习到一些基本的 Yarn 命令以及彻底删除 Yarn 的步骤。
>
>
>

![](/data/attachment/album/202010/21/000023d6m6nmddyldliprr.jpg)

[Yarn](https://yarnpkg.com/lang/en/) 是 Facebook 开发的开源 JavaScript 包管理器。它是流行的 npm 包管理器的一个替代品，或者应该说是改进。 [Facebook 开发团队](https://code.fb.com/) 创建 Yarn 是为了克服 [npm](https://www.npmjs.com/) 的缺点。 Facebook 声称 Yarn 比 npm 更快、更可靠、更安全。

与 npm 一样，Yarn 为你提供一种自动安装、更新、配置和删除从全局注册库中检索到的程序包的方法。

Yarn 的优点是它更快，因为它可以缓存已下载的每个包，所以无需再次下载。它还将操作并行化，以最大化资源利用率。在执行每个已安装的包代码之前，Yarn 还使用 [校验和来验证完整性](https://itsfoss.com/checksum-tools-guide-linux/)。 Yarn 还保证可以在一个系统上运行的安装，在任何其他系统上都会以完全相同地方式工作。

如果你正 [在 Ubuntu 上使用 node.js](https://itsfoss.com/install-nodejs-ubuntu/)，那么你的系统上可能已经安装了 npm。在这种情况下，你可以使用 npm 通过以下方式全局安装 Yarn：

```
sudo npm install yarn -g

```

不过，我推荐使用官方方式在 Ubuntu/Debian 上安装 Yarn。

### 在 Ubuntu 和 Debian 上安装 Yarn [官方方式]

这里提到的说明应该适用于所有版本的 Ubuntu，例如 Ubuntu 18.04、16.04 等。同样的一组说明也适用于 Debian 和其他基于 Debian 的发行版。

由于本教程使用 `curl` 来添加 Yarn 项目的 GPG 密钥，所以最好验证一下你是否已经安装了 `curl`。

```
sudo apt install curl

```

如果 `curl` 尚未安装，则上面的命令将安装它。既然有了 `curl`，你就可以使用它以如下方式添加 Yarn 项目的 GPG 密钥：

```
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -

```

在此之后，将存储库添加到源列表中，以便将来可以轻松地升级 Yarn 包，并进行其余系统更新：

```
sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list.d/yarn.list'

```

你现在可以继续了。[更新 Ubuntu](https://itsfoss.com/update-ubuntu/) 或 Debian 系统，以刷新可用软件包列表，然后安装 Yarn：

```
sudo apt update
sudo apt install yarn

```

这将一起安装 Yarn 和 node.js。该过程完成后，请验证是否已成功安装 Yarn。 你可以通过检查 Yarn 版本来做到这一点。

```
yarn --version

```

对我来说，它显示了这样的输出：

```
yarn --version
1.12.3

```

这意味着我的系统上安装了 Yarn 版本 1.12.3。

### 使用 Yarn

我假设你对 JavaScript 编程以及依赖项的工作原理有一些基本的了解。我在这里不做详细介绍。我将向你展示一些基本的 Yarn 命令，这些命令将帮助你入门。

#### 使用 Yarn 创建一个新项目

与 `npm` 一样，Yarn 也可以使用 `package.json` 文件。在这里添加依赖项。所有依赖包都缓存在项目根目录下的 `node_modules` 目录中。

在项目的根目录中，运行以下命令以生成新的 `package.json` 文件：

它会问你一些问题。你可以按回车键跳过或使用默认值。

```
yarn init
yarn init v1.12.3
question name (test_yarn): test_yarn_proect
question version (1.0.0): 0.1
question description: Test Yarn
question entry point (index.js):
question repository url:
question author: abhishek
question license (MIT):
question private:
success Saved package.json
Done in 82.42s.

```

这样，你就得到了一个如下的 `package.json` 文件：

```
{
 "name": "test_yarn_proect",
 "version": "0.1",
 "description": "Test Yarn",
 "main": "index.js",
 "author": "abhishek",
 "license": "MIT"
}

```

现在你有了 `package.json`，你可以手动编辑它以添加或删除包依赖项，也可以使用 Yarn 命令（首选）。

#### 使用 Yarn 添加依赖项

你可以通过以下方式添加对特定包的依赖关系：

```
yarn add <包名>

```

例如，如果你想在项目中使用 [Lodash](https://lodash.com/)，则可以使用 Yarn 添加它，如下所示：

```
yarn add lodash
yarn add v1.12.3
info No lockfile found.
[1/4] Resolving packages…
[2/4] Fetching packages…
[3/4] Linking dependencies…
[4/4] Building fresh packages…
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ [email protected]
info All dependencies
└─ [email protected]
Done in 2.67s.

```

你可以看到，此依赖项已自动添加到 `package.json` 文件中：

```
{
 "name": "test_yarn_proect",
 "version": "0.1",
 "description": "Test Yarn",
 "main": "index.js",
 "author": "abhishek",
 "license": "MIT",
 "dependencies": {
 "lodash": "^4.17.11"
 }
}

```

默认情况下，Yarn 将在依赖项中添加最新版本的包。如果要使用特定版本，可以在添加时指定。

```
yarn add package@version-or-tag

```

像往常一样，你也可以手动更新 `package.json` 文件。

#### 使用 Yarn 升级依赖项

你可以使用以下命令将特定依赖项升级到其最新版本：

```
yarn upgrade <包名>

```

它将查看所涉及的包是否具有较新的版本，并且会相应地对其进行更新。

你还可以通过以下方式更改已添加的依赖项的版本：

```
yarn upgrade package_name@version_or_tag

```

你还可以使用一个命令将项目的所有依赖项升级到它们的最新版本：

```
yarn upgrade

```

它将检查所有依赖项的版本，如果有任何较新的版本，则会更新它们。

#### 使用 Yarn 删除依赖项

你可以通过以下方式从项目的依赖项中删除包：

```
yarn remove <包名>

```

#### 安装所有项目依赖项

如果对你 `project.json` 文件进行了任何更改，则应该运行：

```
yarn

```

或者，

```
yarn install

```

一次安装所有依赖项。

### 如何从 Ubuntu 或 Debian 中删除 Yarn

我将通过介绍从系统中删除 Yarn 的步骤来完成本教程，如果你使用上述步骤安装 Yarn 的话。如果你意识到不再需要 Yarn 了，则可以将它删除。

使用以下命令删除 Yarn 及其依赖项。

```
sudo apt purge yarn

```

你也应该从源列表中把存储库信息一并删除掉：

```
sudo rm /etc/apt/sources.list.d/yarn.list

```

下一步删除已添加到受信任密钥的 GPG 密钥是可选的。但要做到这一点，你需要知道密钥。你可以使用 `apt-key` 命令获得它：

```
Warning: apt-key output should not be parsed (stdout is not a terminal) pub   rsa4096 2016-10-05 [SC]       72EC F46A 56B4 AD39 C907  BBB7 1646 B01B 86E5 0310 uid           [ unknown] Yarn Packaging yarn@dan.cx sub   rsa4096 2016-10-05 [E] sub   rsa4096 2019-01-02 [S] [expires: 2020-02-02]

```

这里的密钥是以 `pub` 开始的行中 GPG 密钥指纹的最后 8 个字符。

因此，对于我来说，密钥是 `86E50310`，我将使用以下命令将其删除：

```
sudo apt-key del 86E50310

```

你会在输出中看到 `OK`，并且 Yarn 包的 GPG 密钥将从系统信任的 GPG 密钥列表中删除。

我希望本教程可以帮助你在 Ubuntu、Debian、Linux Mint、 elementary OS 等操作系统上安装 Yarn。 我提供了一些基本的 Yarn 命令，以帮助你入门，并完成了从系统中删除 Yarn 的完整步骤。

希望你喜欢本教程，如果有任何疑问或建议，请随时在下面留言。

---

via: <https://itsfoss.com/install-yarn-ubuntu>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[gxlct008](https://github.com/gxlct008) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用互联网协议替代方案 Gemini 简化你的 Web 体验

Summary: 用 Gemini 协议发现更安静、更简单的互联网新角落。

用 Gemini 协议发现更安静、更简单的互联网新角落。

>
> 用 Gemini 协议发现更安静、更简单的互联网新角落。
>
>
>

![](/data/attachment/album/202010/21/070950dzph7mlm0h035h3o.jpg)

如果你很久以前就已经上网了，或者是知识非常丰富，你可能还记得一个早期的文本共享协议，叫做 [Gopher](https://en.wikipedia.org/wiki/Gopher_%28protocol%29)。Gopher 最终被 HTTP 协议所取代，当然，HTTP 协议是现代万维网的基础。对于很多人来说，“<ruby> 互联网 <rt>  internet </rt></ruby>”和“<ruby> 万维网 <rt>  World Wide Web </rt></ruby>”是一回事，因为很多人没有意识到在网上进行了*非* www 子域下的任何操作。

但一直以来，都有各种网络协议在互联网络上共享信息：Telnet、FTP、SSH、Torrent、GNUnet 等等。最近，在这一系列的替代品中又多了一个，它叫 [Gemini](https://gemini.circumlunar.space/)。

Gemini（双子座）协议，以“水星计划”和“阿波罗计划”的基础实验之间的太空任务命名，旨在和平地处在 Gopher 和 HTTP 之间。无论如何，它的目的并不是要取代现代 Web，但它确实试图创造一个简化的网络和一个现代化的 Gopher。

它的发展历史虽然可能很年轻，但意义重大，原因有很多。当然，人们会因为技术和哲学上的原因而对现代 Web 表示质疑，但它只是一般的臃肿。当你真正想要的是一个非常具体的问题的可靠答案时，那么无数次点击谷歌搜索的结果让人感觉过头了。

许多人使用 Gopher 就是因为这个原因：它的规模小到可以让小众的兴趣很容易找到。然而，Gopher 是一个旧的协议，它对编程、网络和浏览做出了一些假设，但这些假设已经不再适用了。 Gemini 的目标是将最好的网络带入一种类似于 Gopher 但易于编程的格式。一个简单的 Gemini 浏览器可以用几百行代码写成，并且有一个非常好的浏览器用 1600 行左右写成。这对于程序员、学生和极简主义者来说都是一个强大的功能。

### 如何浏览 Gemini

就像早期的网络一样，Gemini 的规模很小，所以有一个列表列出了运行 Gemini 网站的已知服务器。就像浏览 HTTP 站点需要一个网页浏览器一样，访问 Gemini 站点也需要一个 Gemini 浏览器。在 [Gemini 网站](https://gemini.circumlunar.space/clients.html)上列出了有几个可用的浏览器。

最简单的一个是 [AV-98](https://tildegit.org/solderpunk/AV-98) 客户端。它是用 Python 编写的，在终端中运行。要想试试的话，请下载它：

```
$ git clone https://tildegit.org/solderpunk/AV-98.git

```

进入下载目录，运行 AV-98：

```
$ cd AV-98.git
$ python3 ./main.py

```

客户端是一个交互式的提示符。它有有限的几个命令，主要的命令是简单的 `go`，后面跟着一个 Gemini 服务器地址。在已知的 [Gemini 服务器](https://portal.mozz.us/gemini/gemini.circumlunar.space/servers)列表中选择一个看起来很有趣的服务器，然后尝试访问它：

```
AV-98> go gemini://example.club

Welcome to the example.club Gemini server!

Here are some folders of ASCII art:

[1] Penguins
[2] Wildebeests
[3] Demons

```

导航是按照编号的链接来进行的。例如，要进入 `Penguins` 目录，输入 `1` 然后按回车键：

```
AV-98> 1

[1] Gentoo
[2] Emperor
[3] Little Blue

```

要返回，输入 `back` 并按回车键：

```
AV-98> back

```

更多命令，请输入 `help`。

### 用 Gemini 作为你的 web 替代

Gemini 协议非常简单，初级和中级程序员都可以为其编写客户端，而且它是在互联网上分享内容的一种简单快捷的方式。虽然万维网的无处不在对广泛传播是有利的，但总有替代方案的空间。看看 Gemini，发现更安静、更简单的互联网的新角落。

---

via: <https://opensource.com/article/20/10/gemini-internet-protocol>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 中减少/缩小 LVM 大小（逻辑卷调整）

Summary: 减少/缩小逻辑卷是数据损坏的最高风险。所以，如果可能的话，尽量避免这种情况，但如果没有其他选择的话，那就继续。

![](/data/attachment/album/202010/21/210459ydp5an23nfzgglyy.jpg)

减少/缩小逻辑卷是数据损坏的最高风险。

所以，如果可能的话，尽量避免这种情况，但如果没有其他选择的话，那就继续。

缩减 LVM 之前，建议先做一个备份。

当你在 LVM 中的磁盘空间耗尽时，你可以通过缩小现有的没有使用全部空间的 LVM，而不是增加一个新的物理磁盘，在卷组上腾出一些空闲空间。

**需要注意的是：** 在 GFS2 或者 XFS 文件系统上不支持缩小。

如果你是逻辑卷管理 （LVM） 的新手，我建议你从我们之前的文章开始学习。

* **第一部分：[如何在 Linux 中创建/配置 LVM（逻辑卷管理）](/article-12670-1.html)**
* **第二部分：[如何在 Linux 中扩展/增加 LVM（逻辑卷调整）](/article-12673-1.html)**

![](/data/attachment/album/202010/21/210610kikq1xynfje7hjaa.jpeg)

减少逻辑卷涉及以下步骤：

* 卸载文件系统
* 检查文件系统是否有任何错误
* 缩小文件系统的大小
* 缩小逻辑卷的大小
* 重新检查文件系统是否存在错误（可选）
* 挂载文件系统
* 检查减少后的文件系统大小

**比如：** 你有一个 **100GB** 的没有使用全部空间的 LVM，你想把它减少到 **80GB**，这样 **20GB** 可以用于其他用途。

```
# df -h /testlvm1

Filesystem              Size Used Avail Use% Mounted on
/dev/mapper/vg01-lv002  100G 15G  85G   12%  /testlvm1

```

### 卸载文件系统

使用 `umount` 命令卸载文件系统：

```
# umount /testlvm1

```

### 检查文件系统是否有任何错误

使用 `e2fsck` 命令检查文件系统是否有错误：

```
# e2fsck -f /dev/mapper/vg01-lv002

e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vg01-lv002: 13/6553600 files (0.0% non-contiguous), 12231854/26212352 blocks

```

### 缩小文件系统

下面的命令将把 `testlvm1` 文件系统从 **100GB** 缩小到 **80GB**。

**文件系统大小调整的常用语法（`resize2fs`）**：

```
resize2fs [现有逻辑卷名] [新的文件系统大小]

```

实际命令如下：

```
# resize2fs /dev/mapper/vg01-lv002 80G

resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/mapper/vg01-lv002 to 28321400 (4k) blocks.
The filesystem on /dev/mapper/vg01-lv002 is now 28321400 blocks long.

```

### 减少逻辑卷 （LVM） 容量

现在使用 `lvreduce` 命令缩小逻辑卷（LVM） 的大小。通过下面的命令， `/dev/mapper/vg01-lv002` 将把逻辑卷 （LVM） 从 100GB 缩小到 80GB。

**LVM 缩减 （`lvreduce`） 的常用语法**：

```
lvreduce [新的 LVM 大小] [现有逻辑卷名称]

```

实际命令如下：

```
# lvreduce -L 80G /dev/mapper/vg01-lv002

WARNING: Reducing active logical volume to 80.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv002? [y/n]: y
Reducing logical volume lv002 to 80.00 GiB
Logical volume lv002 successfully resized

```

### 可选：检查文件系统是否有错误

缩减 LVM 后再次检查文件系统是否有错误：

```
# e2fsck -f /dev/mapper/vg01-lv002

e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/mapper/vg01-lv002: 13/4853600 files (0.0% non-contiguous), 1023185/2021235 blocks

```

### 挂载文件系统并检查缩小后的大小

最后挂载文件系统，并检查缩小后的文件系统大小。

使用 `mount` 命令[挂载逻辑卷](https://www.2daygeek.com/mount-unmount-file-system-partition-in-linux/)：

```
# mount /testlvm1

```

使用 [df 命令](https://www.2daygeek.com/linux-check-disk-space-usage-df-command/)检查挂载的卷。

```
# df -h /testlvm1

Filesystem              Size Used Avail Use% Mounted on
/dev/mapper/vg01-lv002  80G  15G  65G   18%  /testlvm1

```

---

via: <https://www.2daygeek.com/reduce-shrink-decrease-resize-lvm-logical-volume-in-linux/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Linux 上安装 MariaDB 或 MySQL

Summary: 开始在 Linux 系统上使用开源的 SQL 数据库吧。

开始在 Linux 系统上使用开源的 SQL 数据库吧。

>
> 开始在 Linux 系统上使用开源的 SQL 数据库吧。
>
>
>

![](/data/attachment/album/202010/22/144122hkkqrs2dhi9c7kif.jpg)

[MariaDB](https://mariadb.org/) 和 [MySQL](https://www.mysql.com/) 都是使用 SQL 的开源数据库，并且共享相同的初始代码库。MariaDB 是 MySQL 的替代品，你可以使用相同的命令（`mysql`）与 MySQL 和 MariaDB 数据库进行交互。因此，本文同时适用于 MariaDB 和 MySQL。

### 安装 MariaDB

你可以使用你的 Linux 发行版的包管理器安装 MariaDB。在大多数发行版上，MariaDB 分为服务器包和客户端包。服务器包提供了数据库“引擎”，即 MariaDB 在后台运行（通常在物理服务器上）的部分，它监听数据输入或数据输出请求。客户端包提供了 `mysql` 命令，你可以用它来与服务器通信。

在 RHEL、Fedora、CentOS 或类似的发行版上：

```
$ sudo dnf install mariadb mariadb-server

```

在 Debian、Ubuntu、Elementary 或类似的发行版上：

```
$ sudo apt install mariadb-client mariadb-server

```

其他操作系统可能会以不同的打包系统封装 MariaDB，所以你可能需要搜索你的软件仓库来了解你的发行版的维护者是如何提供它的。

### 启动 MariaDB

因为 MariaDB 被设计为部分作为数据库服务器，它可以在一台计算机上运行，并从另一台计算机上进行管理。只要你能访问运行它的计算机，你就可以使用 `mysql` 命令来管理数据库。在写这篇文章时，我在本地计算机上运行了 MariaDB，但你同样可与远程系统上托管的 MariaDB 数据库进行交互。

在启动 MariaDB 之前，你必须创建一个初始数据库。在初始化其文件结构时，你应该定义你希望 MariaDB 使用的用户。默认情况下，MariaDB 使用当前用户，但你可能希望它使用一个专用的用户帐户。你的包管理器可能为你配置了一个系统用户和组。使用 `grep` 查找是否有一个 `mysql` 组：

```
$ grep mysql /etc/group
mysql:x:27:

```

你也可以在 `/etc/passwd` 中寻找这个专门的用户，但通常情况下，有组就会有用户。如果没有专门的 `mysql` 用户和组，可以在 `/etc/group` 中寻找一个明显的替代品（比如 `mariadb`）。如果没有，请阅读你的发行版文档来了解 MariaDB 是如何运行的。

假设你的安装使用 `mysql`，初始化数据库环境：

```
$ sudo mysql_install_db --user=mysql
Installing MariaDB/MySQL system tables in '/var/lib/mysql'...
OK
[...]

```

这一步的结果显示了接下来你必须执行的配置 MariaDB 的任务：

```
PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following commands:

'/usr/bin/mysqladmin' -u root password 'new-password'
'/usr/bin/mysqladmin' -u root -h $(hostname) password 'new-password'

Alternatively you can run:
'/usr/bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

```

使用你的发行版的初始化系统启动 MariaDB：

```
$ sudo systemctl start mariadb

```

在启动时启用 MariaDB 服务器：

```
$ sudo systemctl enable --now mariadb

```

现在你已经有了一个 MariaDB 服务器，为它设置一个密码：

```
mysqladmin -u root password 'myreallysecurepassphrase'
mysqladmin -u root -h $(hostname) password 'myreallysecurepassphrase'

```

最后，如果你打算在生产服务器上使用它，请在上线前运行 `mysql_secure_installation` 命令。

---

via: <https://opensource.com/article/20/10/mariadb-mysql-linux>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


《代码英雄》第二季（8）：开源好奇号

>
> 代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。
>
>
>

>
> **什么是《代码英雄》**
>
>
> <ruby> 代码英雄 <rt>  Command Line Heroes </rt></ruby>是世界领先的企业开源软件解决方案供应商红帽（Red Hat）精心制作的原创音频播客，讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。
>
>
>

![](/data/attachment/album/202010/23/002108sctlkkxt37whtxxx.jpg)

本文是《[代码英雄](https://www.redhat.com/en/command-line-heroes)》系列播客[第二季（8）：开源好奇号](https://www.redhat.com/en/command-line-heroes/season-2/open-curiosity)的[音频](https://dts.podtrac.com/redirect.mp3/audio.simplecast.com/1ebfa28a.mp3)脚本。

>
> 导语：那些最棒的、最聪明的人用袖珍计算器的计算能力把我们带到了月球。现在他们要带我们走得更远 —— 而且是用我们整季播客都在谈论的技术来实现。开源将带我们去火星。
>
>
> 第二季的结局是将我们带到美国宇航局（NASA）的<ruby> 喷气推进实验室 <rt>  Jet Propulsion Laboratory </rt></ruby>（JPL）。Tom Soderstrom 分享了 JPL 通过拥抱开源获得了多少好处。Hila Lifshitz-Assaf 解释说，NASA 正在用开源软件和众包解决一些最大的问题。Dan Wachspress 介绍了与 NASA 合作意味着专有商业需要做出一些牺牲 —— 但他们可以参与到世界上最具创新性的项目中。
>
>
> 远疆的探索者们选择在开放的环境中工作 —— 火星是他们的目的地。那么下一步呢？
>
>
>

**00:00:12 - Saron Yitbarek**：

2012 年 8 月 6 日，一枚汽车大小的<ruby> 漫游车 <rt>  rover </rt></ruby>，<ruby> 好奇号 <rt>  Curiosity </rt></ruby>，从火星大气的顶层降落到了这颗星球的地表。降落花了 7 分钟，下降的过程仿佛永无止境。漫游车携带着贵重的货物：500,000 行代码，76 台尖端科学仪器，以及另一些工具，用以开展一些前所未有的实验。先是超音速降落伞展开，接着是隔热护盾分离，然后，反冲发动机启动，甚至在半空中部署天车——最终，好奇号平稳着陆。

**00:00:59 - NASA 工程师**：

现在，是时候看看“好奇号”会将我们带向何方了。

**00:01:13 - Saron Yitbarek**：

听见那声音了吗？那就是火星车成功着陆后，满屋子工程师的欢呼声。几天后，他们将收到来自贝拉克·奥巴马总统的贺电。但现在是只属于他们的时刻。这群人一同完成的这件事，是他们中的任何一人永远都无法独自做到的。

**00:01:39**：

我是 Saron Yitbarek，这里是代码英雄，来自红帽的一档播客节目。本季以来，我们见证了开源技术对我们工作方式的重塑，及其对人们能力的拓展。作为线索，社区这个要素贯穿了整季节目。这些故事告诉我们该怎么团队协作，该怎么向行家学习，以及，如何在这同时学会听取新人的意见 —— 一言以蔽之，如何更好地与人交流。

**00:02:11**：

在第二季的终章，我们在记住所有这些道理的同时，我们将探索开源是如何为那些伟大的项目赋能的。你也许在去年的十一月观看了 NASA 的<ruby> 洞察号 <rt>  insight </rt></ruby>登陆器抵达火星地表。彼时四周皆是欢呼与拥抱。事实证明，这项向星星 —— 这颗红色的星球发射漫游车的任务，只有把宝押在众人合作上才能实现。

**00:02:45**：

我刚才说过了吗？那台火星车有它自己的推特账号。它还有 4 百万粉丝呢。这还不算什么。最近它给地球人发送了一条推文，是一封邀请函，邀请人们使用 NASA 喷气动力实验室开源的说明和代码，建造一辆属于自己的漫游车。我们跟踪采访了一个民间的组织，叫 SGVHAK 小组，他们是第一批自己建造漫游车的人。

**00:03:13 - SGVHAK 小组**：

现在我要试试从坎上开过去。

**00:03:15**：

看看她（LCTT 译注：指漫游车）这样能不能行。

**00:03:15**：

上来了——不，不行。

**00:03:15**：

不行。

**00:03:20**：

她以前很容易就能开过去的。不过我们现在对轮子做了一些改动，她就有点不乐意了。

**00:03:27 - Saron Yitbarek**：

这个小组的成员包括 Roger Cheng、Dave Flynn、Emily Velasco 以及 Lan Dang。

**00:03:34 - SGVHAK 小组**：

Dave 包揽了所有机械设计，我想我应该算是负责组装的。Roger 是我们的程序员，Dave 是机械设计师，Lan 是我们无畏的领导。

**00:03:45**：

你也是一个，你是队里的机械制造专家。

**00:03:49**：

大概吧，应该算是。

**00:03:51**：

跟他们讲讲伺服电机架子的事。

**00:03:53**：

噢，好的。

**00:03:54**：

是你把电机凑起来的，现在可以让它运行，演示一下——

**00:03:58**：

我们现在就拿——

**00:04:00 - Saron Yitbarek**：

打造这样一部漫游车可不是玩乐高玩具。它需要真正的火箭科学家花 200 小时来完成。所以，让我们给这些家伙几分钟的准备时间，稍后再回来。

**00:04:19**：

与此同时，我想了解更多关于为什么一开始 NASA 要将漫游车的技术和代码向全世界开源。我刚刚找到了回答这个问题的最佳人选。

**00:04:29 - Tom Soderstrom**：

我叫 Tom Soderstorm，我是 NASA <ruby> 喷气推进实验室 <rt>  Jet Propulsion Laboratory </rt></ruby>（JPL）的 IT 部门的<ruby> 首席技术与创新官 <rt>  technology and innovation officer </rt></ruby>。

**00:04:37 - Saron Yitbarek**：

JPL 总共有大约 6000 人。它是 NASA 的研究中心之一，由联邦政府提供资金，专注于研究如何用无人机械进行太空探索。

**00:04:48 - Tom Soderstrom**：

我们寻找地外生命，我们也探究宇宙的起源和未来。除此之外，考虑到可能的星际移民需求，我们也在寻找地球 2.0。也就是具有类似地球的环境的、另一个适宜人类居住的行星。

**00:05:33 - Saron Yitbarek**：

是的，他们肩负着伟大的使命。不过，事情是这样的。Tom 的团队并不是一群秘密进行研究、与外界全然不接触的工程师。他们与下一代的科学家们有着深厚的联系。他们常常采用全新的方式激发大众的创造性思维。事实上，这是他们工作中至关重要的一部分。漫游车开源计划释放出了部分设计，这样一来，NASA 之外的民间组织就能组建他们自己的漫游车了。这是 NASA 促进创新的宏观战略的一部分。很自然地，Tom 从开源漫游车开始，向我讲述了为何开源 NASA 的成果是如此重要。

**00:05:46**：

有很多人可能像我一样；发现这个网站时，我想，天啊，也许我可以自己打造一个漫游车呢。这真是太激动人心了。这太令人神往了。

**00:05:55 - Tom Soderstrom**：

我们打造这个开源网站，是为了能让公众和学校能够从中学习。而且我们发现，围绕漫游车开源形成的社区是非常优秀的实验平台。所以当我们想测试新鲜事物的时候，这里就是最佳的演练场，非常简单，非常快速，我们能很快就把想要的技术应用到真正的漫游车上。所以我们希望人们能够把像太阳能面板、加速度传感器、科学实验仪器，以及先进的人工智能程序等结合起来，我们只是希望这些经验能够扩散，在这些方面感兴趣的人最终也能对太空感兴趣。因为太空真的是太酷了。

**00:06:32 - Saron Yitbarek**：

所以除了刚才提到的这些之外，人们在这个项目中还做过什么让你印象深刻的，或者是让你觉得激动的事儿？

**00:06:42 - Tom Soderstrom**：

降价是一项非常令人印象深刻的工作，而现在有一堆人在试着用人工智能干这个事儿。这是目前我见到的最有趣的事情之一，我很想看到有人能为其添加一个机械臂。

**00:06:55 - Saron Yitbarek**：

真是太酷了。

**00:06:55 - Tom Soderstrom**：

也是我们正在思考的问题。

**00:06:58 - Saron Yitbarek**：

这个项目是全方位开放的吗？我是指，对于硬件部分，你们给出了一份推荐的零部件清单，但参与者如果愿意，也能自行替换，换成更便宜的，或者换成更贵的；而软件部分就完全是开源的了。这中间有任何非开源的部分吗？

**00:07:17 - Tom Soderstrom**：

没有，完全是开源的。

**00:07:19 - Saron Yitbarek**：

如果你告诉我高中生都能通过这个项目自行制作漫游车，我会觉得非常震惊。那听起来太难了；你知道吗，听起来太高大上了，高到只有 NASA 才会去做的那种。对吧？真正地组装火星车会是件容易的事吗？

**00:07:36 - Tom Soderstrom**：

我们并不想将这做成一个玩具。这个项目是货真价实的，能给参与者带来实际的经验。加利福尼亚州的几所学校已经将其纳入他们的科学、工程与编程课程中，比如所谓的<ruby> 机械电子学 <rt>  Mechatronics </rt></ruby>，就是上述几方面的结合体。这让我们非常高兴，因为这样，在不久的将来就能有一批训练有素的专业人才来到 NASA。

**00:08:04 - Saron Yitbarek**

但这似乎不仅有利于未来的 NASA 工程师、未来的科学家，也有利于你们（LCTT 译注：指目前在 NASA 工作的科学家、工程师）。跟我多说说这方面吧。

**00:08:14 - Tom Soderstrom**：

嗯……突然间，我们就有了一个非常简单易用的实验平台。我能想象到开源的漫游车在 JPL 附近行驶，还向人问好。在于艰苦环境中验证某些技术之前，我们能在后院里对它们快速地进行试验。它成为了我们可以实验的移动平台。话又说回来，我认为人工智能会是这些技术中非常有趣的一样，因为它发展得太快了，而且，向它加入新的机器人部件也很容易。

**00:08:50 - Saron Yitbarek**：

所以，理论上来说，你们也可以创建一个你们自己的移动试验场，可以进行试验，也不用将其开源，对吧？它本来可以成为一个内部项目。但它现在是开源的。这能让你们多学到什么呢？

**00:09:08 - Tom Soderstrom**：

嗯，这是一个好问题。为什么要开源？对我们来说，开源才是更困难的选择，不过那也是挑战所在。我们希望，通过将其开源，学校以及其他民间组织能够用上代码，并且将漫游车造出来。编写一本不是机器人学专家的人也能看懂的手册带来了大量额外的工作。但起码，当我们最终将一些东西真正开源的时候，它变得更整洁、更紧凑、文档更完善了；因为我们知道，其他人会来使用这些东西，所以也必须要具备一定的可扩展性。因此，项目的质量提高了。我曾经和 Netflix 的人谈过，他们也有同样的感觉，被开源的代码普遍更加整洁、质量更好。

**00:09:54 - Saron Yitbarek**：

你是怎样看待开源漫游车的？五年，十年，甚至将来的二十多年后，你觉得它们能做什么，而人们能够创造出什么？你认为这些能为身处地球的我们带来什么潜在利好？

**00:10:11 - Tom Soderstrom**：

能带来多方面的利好。现在的漫游车被设计成使用轮子行驶。我可以说，它其实也可以被设计成采用步行，也可以对它进行扩展，加上跳跃的功能。我们已经送了一架直升飞机上火星，它现在还在飞着。所以说，这些漫游车并不仅仅局限于现在我们所说的漫游车。有了全世界各地人们的实验，我们能走得更快，更远，不断探寻可能性的上限，并提出一些坦率地说我们可能没有想到的想法。未来到底会是什么样的？我迫切地想了解，不过我不知道。

**00:10:49 - Saron Yitbarek**：

通过创造这个平台，你们已经为许多人提供了打造自己的“玩具”的机会。接下来就让我们拭目以待吧。

**00:10:57 - Tom Soderstrom**：

是的，这是很重要的一点。因为我发现，我能想到的主意都已经有人做过了。但我们需要找到这些人。无论我们最开始做的是什么，一旦到最终用户手上，他们就能以我们无法想象的方式将其改进十倍。所以，向大众开放一些这样的“玩具”，任他们自由发挥，他们会因此而得到锻炼，这对将来使用更先进技术的任务也大有益处。

**00:11:23 - Saron Yitbarek**：

这真是太棒了。

**00:11:29**：

如果你想了解开源漫游车项目，你可以访问 [opensourcerover.jpl.nasa.gov](http://opensourcerover.jpl.nasa.gov) 。你能在那儿玩个尽兴。我们稍后再与 Tom Soderstrom 进行更多讨论。但首先，让我们来更深入地挖掘 NASA 与开源之间的关系。

**00:11:51 - Hila Lifshitz-Assaf**：

大家好，我是 Hila Lifshitz-Assaf，纽约大学商学院的教授。

**00:11:57 - Saron Yitbarek**：

Hila 正在研究 NASA 是如何打破知识壁垒的。

**00:12:02 - Hila Lifshitz-Assaf**：

如果你能够回到过去，回到 15 世纪，看看那些孤独的发明家，像莱昂纳多·达芬奇和其他人，他们某种程度上只在自己所在的本地社区活动。之后，有了工业革命，有了实验室。此后的两百多年里，人们都在实验室里工作。最大的变化发生在 21 世纪，数字革命之后我们有了开源的概念，而它打破了之前这类组织结构的边界。

**00:12:34 - Saron Yitbarek**：

在 NASA 工作的日子里，Hila 见证了这种巨大变革的典型例子。

**00:12:39 - Hila Lifshitz-Assaf**：

NASA 最吸引我的一点在于，他们就某种意义上来说是最勇敢的，因为他们勇于接受战略性的<ruby> 研究与开发 <rt>  research and development </rt></ruby>（R&D）事业中的挑战，他们的科学家、工程师，最优秀的一批人才为此而努力工作，并使这些挑战向大众开放。而且，我必须说，直到现在，很多其他的组织在做开源科学或是众包的时候，他们不会把最核心的、战略性的难题交给社区，而是只开放一些次要的任务。无论成功还是失败，这都不会让他们的组织蒙受多大损失。而 NASA 做的事情，一旦成功了，就真的改变了一切。

**00:13:14 - Saron Yitbarek**：

自 2009 年起，NASA 就开始使用像 Innocentive 和 Topcoder 这样的开源创新平台。而且，他们不是闹着玩的。就像 Hila 所提到的，他们甚至把他们核心的 R&D 难题都放了上去。

**00:13:29 - Hila Lifshitz-Assaf**：

这些问题上传之后，甚至没过一年，我们就已经陆续开始看到来自众包平台的解决方案。

**00:13:34 - Saron Yitbarek**：

这确实很快。我将在此举出一项研究成果，它是 NASA 开源科研的诸多喜人硕果之一。Hila 向我们将讲述，他们是如何将太阳耀斑的预测技术提升一个台阶的。

**00:13:46 - Hila Lifshitz-Assaf**：

嗯……太阳耀斑的预测是学术界研究了数十年的一项非常困难的太阳物理学问题。总的来说，他们已经完成初步的构想，以便更多的人可以参与这方面的研究。而且他们非常在意这一点。这让我觉得很惊奇，因为他们确确实实地希望能从太阳物理学圈子外的人那里找到解决方案。Bruce Kragan，一名来自新罕布什尔州乡村的、半退休的无线电工程师，只花了三个月，就给我们带来了太阳耀斑的预测方法。当 NASA 验证模型时，他们发现，这种预测方法的准确率有 80%。用传统方式需要花费数百万美元及数年时间才能获取的成果，在三个月内就被收获了，花费大概在三万和四五万美元之间。

**00:14:36 - Saron Yitbarek**：

你也许已经猜到了，这样的变化需要 NASA 内部的文化作出改变。

**00:14:44 - Hila Lifshitz-Assaf**：

他们中的有些人选择邀请外来的解决方案提供者进入项目组，还有一些选择提供实习或合作机会；他们采用了很多有意思的方法来交流知识，使其不至于淤塞。

**00:14:59 - Saron Yitbarek**：

仔细想想，这其实是很美好的。就如我们所知，很多组织仍然抵制开源活动，不愿放弃专有软件。但在这里，你可以找到这个星球上最具创新性，愿景宏大的一群科学家；而他们说，嗨，我们一起来。这样的态度有绝大的影响力。

**00:15:22 - Hila Lifshitz-Assaf**：

我们已经看到了开源给软件行业带来的变革。我们目前尚未在科学与技术方面见到太多改变，不过，我认为，现在就是最好的时机。计算物理学、计算生物学越是崛起，这就越有可能实现。我认为，像这样，就有更多人能够参与到科研中，协助处理不同的任务。以这种方式，科学技术的发展速度或许甚至能够超过应用开发。

**00:15:53 - Saron Yitbarek**：

Hila Lifshitz-Assaf 是一位来自纽约大学斯特恩商学院的教授。

**00:16:00**：

NASA 在开放他们的研究课题的道路上受益良多，但他们也通过<ruby> 中小企业创新资助计划 <rt>  Small Business Innovation Grant Program </rt></ruby>——这个项目鼓励私营经济中的创新——打造了另一种社区。所有<ruby> 大胆的计划 <rt>  blue sky projects </rt> <rt> </rt></ruby>都有风险，可能付出代价，但有时回报也尤其丰厚。

**00:16:22 - Dan Wachspress**：

大家好，我叫 Dan Wachspress，我是一名航空工程师，在 Continuum Dynamics 集团工作。

**00:16:28 - Saron Yitbarek**：

Dan 的公司专注于研究与开发旋翼飞行器，也就是直升机、旋翼飞机这类的飞行器。这可以说从是字面上看就很“<ruby> 蓝天 <rt>  blue sky </rt></ruby>”（LCTT 译注：此处呼应之前提到的 blue sky projects）了。他们一直与 NASA 合作，致力于解决垂直升降的问题，让飞行器能变得像是 Jetson 的“空中出租车”（LCTT 译注：典出《The Jetsons》，一部始播于 1962 年的系列动画，这里的 Jetson 指动画主角 George Jetson）那样。

**00:16:50 - Dan Wachspress**：

总体的构思是，只要用电动机代替车辆上的燃气涡轮发动机，你就可以安装更多推进器。它们会比现有的更安静、更安全，直升机所有恼人的问题统统消失，而我们可能会得到这样的未来：你打个的就能从达拉斯去到沃斯堡（LCTT 译注：均为美国得克萨斯州的城市），而那是一辆准乘 5 人、无人驾驶的电动飞的，而非一辆汽车，在汽车里面你还得跟堵车较劲。这就是我们的愿景。

**00:17:22 - Saron Yitbarek**：

有很多公司，比如 Uber，对这种空中出租车的设想非常感兴趣。而 NASA 在这之中扮演的角色是伟大的：它打破了不同公司本要各自为营死磕研究的壁垒。

**00:17:38 - Dan Wachspress**：

那些公司必定不想走漏风声，他们想保持商业机密，不愿共享成果。NASA 的目标就是把尽可能多的研究成果送到他们手里，让他们尽可能地获得能力。而且我敢说你如果去问他们任何一家公司，他们肯定会说，没有 NASA 长久以来的技术支持，他们没法做到这么快地开发。

**00:18:13 - Saron Yitbarek**：

我想这并不影响 NASA 拥有一些非常棒的风洞。从火星漫游车到飞行汽车，你有感觉了吗？我们谈论的是创新，天穹尚且不是我们的极限。而且这一切都归功于我们全地球级别的合作，而正是开源观念让这一切成为可能。

**00:18:41 - Saron Yitbarek**：

我们再回来和 NASA 的 Tom Soderstrom 聊聊。Tom 认为，我们两季以来探讨的开源的“魔力”已经形成了一股巨大的推动力。他称之为第四次工业革命。

**00:18:59 - Tom Soderstrom**：

创新总是与科技的潮流挂钩。当今，有好几波科技浪潮同时袭来，它们的合流将引起巨大的海啸。它们逼近得越来越快，所有事物都会为之改变，因此，我称其为第四次工业革命。

**00:19:21 - Saron Yitbarek**：

我将简单几句带过那些浪潮，虽然就它们中的每一样都可以独立讲一期节目。Tom 所说的“即将到冲击我们生活的潮流”包括了大规模的网络安全问题、量子计算之类，也包括了各类“<ruby> 软件定义的 <rt>  software-defined </rt></ruby>”东西。但这些只是其中的一小部分。他还提到了<ruby> 普适计算 <rt>  ubiquitous computing </rt></ruby>、<ruby> 自然用户界面 <rt>  natural interfaces </rt></ruby>和物联网。

**00:19:49 - Tom Soderstrom**：

这些技术都将是那场海啸的一部分，生活将因为无处不在的<ruby> 内置智能 <rt>  built-in intelligence </rt></ruby>而大为改观。

**00:19:54 - Saron Yitbarek**：

想象一下，如果这些技术合流，产生了 1+1 大于 2 的效应，“海啸”发生，情况会变成什么样？

**00:20:04 - Tom Soderstrom**：

我不认为这种变化会是突然发生的；不会有像是一个人站起来感叹“你看这个”这样的情况。就如我刚才所说，内置智能会渗透进生活的各个方面。“智能”，对吧？比如智能电视，或者智能会议室。我们生活中的事物会变得越来越智能，越来越聪明。对于企业来说，它意味着，你可以对着一个房间提出问题，然后程序会为你在数千种不同的数据源、好几 PB 的数据里找出答案。而这背后，就是自然语言处理、深度学习、机器学习这样的技术；而我们不会突然说，“哇，我们已经发展到这种地步了”。不会的，这是一个循序渐进、潜移默化的过程。

**00:20:49 - Saron Yitbarek**：

这第四次工业革命，又会如何影响你在 JPL 的工作呢？

**00:20:57 - Tom Soderstrom**：

我认为首先是实验，下一场工业革命可以帮助我们更快地完成实验，并且利用更好的组件，包括软件和硬件，也许我们不需要把所有的东西都造出来，但是我们可以更智能地使用它。然后是开源。开源真是一项颠覆我们工作方式和工作内容的事业。

**00:21:23 - Saron Yitbarek**：

此话怎讲？

**00:21:24 - Tom Soderstrom**：

说到开源这东西，我的资历足够老，我当年也经历过开源战争。当时开源还只是个玩笑。那时的开源很糟糕，开源软件似乎比商业软件低一等似的。不过，那些都已经是过去了，至少在喷气动力实验室是这样的。现在，开源的方式更适合我们。开源的研究与开发更加经济划算，也可以更快地做实验验证。另外，因为开源软件的存在，现在我们再也不用全部从头造轮子了。我们可以自己开发；在此之后，如果我们选择将之开源，就能从社区获得帮助，对成果进行改进。开源的软件和科研也能为我们招贤纳士。这就很有趣了。

**00:22:05 - Saron Yitbarek**：

确实很有意思。

**00:22:07 - Tom Soderstrom**：

我认为现在的人们，特别是新一代，可以将他们的项目开源，以此获得更多的影响力，得到尽可能多的星标。你可以看见他们的简历上写着，我开发的软件得到了多少星标。

**00:22:21 - Saron Yitbarek**：

对你来说，让你们的工作方式和内容发生变化的开源，并不是什么新鲜事物，对吧？这点让我很感兴趣。你说你经历过开源战争。你也见证了开源在这么多年来的发展。那么，当今的开源有哪些优势是十年、十五年、二十年前没有的呢？

**00:22:47 - Tom Soderstrom**：

有两点。一个就是云计算。我们不用签署一份大合同，购买一堆软件然后使用许多年。我们可以在云端简单地做个实验。这点相当重要。还有另外一点，就是开源并不比闭源的安全性差。这早就不是 —— 请原谅我的用词 —— 一个<ruby> 信仰 <rt>  religious </rt></ruby>的问题了。这更多地只是一个实用性和经济性的问题。

**00:23:15 - Saron Yitbarek**：

开源显然在你的工作当中扮演了一个重要的角色；尤其是当你谈及喷气动力实验室的未来，以及你期望它以怎样的方式前行的时候，开源似乎仍将是故事的重要组成部分。说到开源社区式的合作开发，你认为这种方式在最理想的情况下能够导向怎么样的成果？而对于人类，它的意义又是什么？

**00:23:42 - Tom Soderstrom**：

好问题。我认为你刚刚已经说出了正确答案——“人类”。它的理想结果是能让每个人都参与到这份工作中来，而它的意义也在于此。你知道，总有一天我们会把人送上火星。我们要探索更广袤的深空，去寻找地球 2.0。我们还要再开展一次载人登月。这些都需要来自世界各地的人们积极参与。

**00:24:15 - Saron Yitbarek**：

我被这场变革深深的吸引了。Tom Soderstrom 是 NASA 喷气动力实验室的首席技术与创新官。

**00:24:29**：

从地球 2.0 的话题，回到地球 1.0。我们应当铭记，“第四次工业革命”的起源，也是艰苦朴素的。开源项目固然可以变得宏大无比，但千里之行毕竟始于足下；一项伟大的事业，在其伊始，或许只是几名极客试图让漫游车正常工作。

**00:24:47 - SGVHAK 小组**：

我们再看看这样它能不能跑起来。我们会——再加一样东西，方便它从坎上过去。过去了！耶！

**00:24:59 - Saron Yitbarek**：

耶。

**00:25:02 - SGVHAK 小组**：

啊呀，我下不来了，它被卡在花坛里了。

**00:25:14**：

我们把它抬出来就行了。

**00:25:16**：

这又不是在火星。你可以直接走过去，把它拿起来。

**00:25:20 - Saron Yitbarek**：

我觉得他们有所进步。

**00:25:25**：

让我们和这些代码英雄说再见吧，他们要继续学习、探索、投入他们的工作了。他们会知道，通过开源，我们总有一天可以到达天空之外的高度。

**00:25:40**：

如果你想让你自己的开源游戏项目上一个台阶，不要忘了我们正在开发《代码英雄》游戏，开发已经持续了一整季的时间，现在你仍然可以贡献代码。

**00:25:52 - Michael Clayton**：

嗨，我是 Michael。

**00:25:52 - Jared Sprague**：

嗨，我是 Jared。我们是《代码英雄》游戏的开发人员。

**00:25:58 - Saron Yitbarek**：

我们请来了红帽的 Jared Sprague 和 Michael Clayton，看看情况怎么样。

\*\*00:26:03 - Michael Clayton\_

我有点惊讶于我们这么快就引来了这么多的感兴趣的人。反响非常好，提交的拉取请求蹭蹭上涨。

**00:26:17 - Saron Yitbarek**：

你认为是什么让大家这么激动？

**00:26:18 - Michael Clayton**：

我认为我们播客的许多听众都受到了鼓励，因此他们看到这个开源项目就迫不及待地想试试看。尤其是自从我们开始征求不限类型的贡献，让任何想要贡献的创意人员、任何类型的工程师都能够参与项目后，听众就找到事儿做了。

**00:26:39 - Saron Yitbarek**：

那么接下来希望社区能给大家带来什么？这游戏还在开发中。你最想见到什么?

**00:26:47 - Jared Sprague**：

我个人非常享受开发过程中的进入节奏的感觉，我们让大家贡献美术素材和音乐以及音频效果、故事线、代码，所有这些东西都可以并行不悖。一旦每个人都进入节奏，我们可以一起开发，共同看着游戏被开发出来，那真是太美妙了。

**00:27:14 - Saron Yitbarek**：

顺带一提，我们的游戏的公测版将会在今年的五月七日到九日，在波士顿开办的红帽峰会发布。届时，数千名像你一样的代码英雄会前来进行为期三天的创新与教育之旅。访问 [redhat.com/summit](http://redhat.com/summit) 以查看详情。

**00:27:34**：

最后一件事，这或许是第二季的最终章，但这不是真正的告别。第三季已经在筹备中！与此同时，我们也会为大家带来一期彩蛋。我们开展了一次圆桌会议，与你们最喜爱的思想家们探讨开源的未来。请锁定一月份。别忘了，如果你不想错过最新一期节目，记得点关注哦。就点一下，点一下又不会怎么样，这样你才能在第一时间收到新内容的通知哦。

**00:28:09**：

我是 Saron Yitbarek，感谢你聆听本季节目，生命不止，编码不休。

>
> **什么是 LCTT SIG 和 LCTT LCRH SIG**
>
>
> LCTT SIG 是 LCTT <ruby> 特别兴趣小组 <rt>  Special Interest Group </rt></ruby>，LCTT SIG 是针对特定领域、特定内容的翻译小组，翻译组成员将遵循 LCTT 流程和规范，参与翻译，并获得相应的奖励。LCRH SIG 是 LCTT 联合红帽（Red Hat）发起的 SIG，当前专注任务是《代码英雄》系列播客的脚本汉化，已有数十位贡献者加入。敬请每周三、周五期待经过我们精心翻译、校对和发布的译文。
>
>
> 欢迎[加入 LCRH SIG](/article-12436-1.html) 一同参与贡献，并领取红帽（Red Hat）和我们联合颁发的专属贡献者证书。
>
>
>

---

via: <https://www.redhat.com/en/command-line-heroes/season-2/open-curiosity>

作者：[Red Hat](https://www.redhat.com/en/command-line-heroes) 选题：[bestony](https://github.com/bestony) 译者：[Colin-XKL](https://github.com/Colin-XKL) 校对：[Northurland](https://github.com/Northurland), [wxy](https://github.com/wxy)

本文由 [LCRH](https://github.com/LCTT/LCRH) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


树莓派上的 Ubuntu 20.10 提供了一个完整的 Linux 桌面和微云

![](/data/attachment/album/202010/23/093617ydl2dtooo5o45it0.png)

2020 年 10 月 22 日：Canonical 今天宣布发布包含树莓派优化的 Ubuntu 20.10 桌面版和服务器版系统，以支持研究人员、发明家、教育和企业。为全世界最易可访问的硬件带来了全世界最为流行的开放平台。

“这次版本发布，我们庆祝树莓派基金会致力于将开放计算给带给全球人们所做的承诺”，Canonical CEO，Mark Shuttleworth 说到。“我们也很荣幸通过优化树莓派上的 Ubuntu 以支持上述倡议，不管是个人使用，教育用途还是作为他们未来业务的基础。”

树莓派 2、3 和 4 加入 Ubuntu 认证的一系列 X86 和 ARM 设备队列中。Ubuntu 是以公共云和桌面产品而闻名的操作系统（OS），在 AWS、微软 Azure、Google、IBM 和 Oracle Clouds 被广泛使用。戴尔、惠普和联想都对其电脑做了Ubuntu桌面认证。

Ubuntu 20.10 包含了为弹性的<ruby> 微云 <rp>  （ </rp> <rt>  micro cloud </rt> <rp>  ） </rp></ruby>，提供VM的小型服务器集群，按需供给的边缘 Kuberenetes 的 LXD 4.6 和 MicroK8s 1.19。可适用于远程办公室，分公司，仓储和分布的基础设施。

### Ubuntu 桌面 20.10

在树莓派桌面支持上方的 Ubuntu 20.10 集成了 GNOME 3.38，此版本改进了应用栅格，移除了常用标签和允许根据用户喜好对应用排列和管理。电源设置中加入了电池百分比开关，私有 WiFi 热点可通过生成的 QR（二维码）进行分享，重启选项已被添加至注销/关机菜单中。

20.10 桌面新增了对 Ubuntu 认证设备的支持。更多的 Ubuntu 工作站现获得了支持指纹识别功能支持。配备屏幕键盘的二合一设备现已获得完整支持，这使得诸如戴尔 XPS 二合一和联想 Yoga 等设备的 Ubuntu 体验得以改善。

![](/data/attachment/album/202010/23/101523l0smpgh4zpepusge.jpg)

树莓派 4GB 或 8GB 内存版本将获得 Ubuntu 桌面的完整支持。“从经典的树莓派开发板到工业级模块，这是树莓派迈向拥有长期支持和安全更新的 Ubuntu LTS（长期支持）的第一步，且符合我们将最好的计算和开源能力带给全球用户的首创精神”树莓派贸易 CEO，Eben Upton 说到。

![](/data/attachment/album/202010/23/101810tff0089a3x0x3x23.jpg)

### 什么是微云

微云是一种新类别，适用于边缘端按需供给计算的基础设施。微云是分布式的，最小化的， 规模可以为小型，也可以为大型。在 Ubuntu 20.10 中，Canonical 在 Ubuntu 上引入了其微云堆栈，即结合 MAAS、LXD、MicroK8s 和 Ceph 以提供具有弹性的口袋云，加固了 5G RAN，工业 4.0 工厂，V2X 基础设施和智慧城市及健康设施下的关键业务工作负载。

在树莓派上，用户可以从 [MicroK8s](https://ubuntu.com/tutorials/how-to-kubernetes-cluster-on-raspberry-pi#1-overview) 开始在边缘端编排[高可用的工作负载](https://cn.ubuntu.com/blog/microk8s-ha-minimal-kubernetes)，或用 LXD 的集群和虚拟机管理能力来[构建家庭实验室](https://cn.ubuntu.com/blog/lxd-raspberry-pi-micro-cloud-cluster)。Ubuntu 20.10 的发布给用户介绍了一种方式来实验，测试或者通过树莓派完整的云能力的开发。树莓派与 Ubuntu 20.10的组合使得从机器人到人工智能、机器学习的任何事情都成为可能。

![](/data/attachment/album/202010/23/101831i9uxuapq4hwv3302.jpg)

Ubuntu 20.10 现已可从[此处](https://ubuntu.com/download/desktop)下载：

|  |  |  |
| --- | --- | --- |
| [ubuntu-20.10-desktop-amd64.iso](https://releases.ubuntu.com/groovy/ubuntu-20.10-desktop-amd64.iso) | 2.7G | Desktop image for 64-bit PC (AMD64) computers (standard download) |
| [ubuntu-20.10-live-server-amd64.iso](https://releases.ubuntu.com/groovy/ubuntu-20.10-live-server-amd64.iso) | 1.0G | Server install image for 64-bit PC (AMD64) computers (standard download) |