关于安全，开发人员需要知道的

Summary: 开发人员不需要成为安全专家, 但他们确实需要摆脱将安全视为一些不幸障碍的心态。

开发人员不需要成为安全专家, 但他们确实需要摆脱将安全视为一些不幸障碍的心态。

>
> 开发人员不需要成为安全专家, 但他们确实需要摆脱将安全视为一些不幸障碍的心态。
>
>
>

![](/data/attachment/album/201811/17/110005jlpaaqr3obzerfpr.jpg)

DevOps 并不意味着每个人都需要成为开发和运维方面的专家。尤其在大型组织中，其中角色往往更加专业化。相反，DevOps 思想在某种程度上更多地是关注问题的分离。在某种程度上，运维团队可以为开发人员（无论是在本地云还是在公共云中）部署平台，并且不受影响，这对两个团队来说都是好消息。开发人员可以获得高效的开发环境和自助服务，运维人员可以专注于保持基础管道运行和维护平台。

这是一种约定。开发者期望从运维人员那里得到一个稳定和实用的平台，运维人员希望开发者能够自己处理与开发应用相关的大部分任务。

也就是说，DevOps 还涉及更好的沟通、合作和透明度。如果它不仅仅是一种介于开发和运维之间的新型壁垒，它的效果会更好。运维人员需要对开发者想要和需要的工具类型以及他们通过监视和日志记录来编写更好应用程序所需的可见性保持敏感。另一方面，开发人员需要了解如何才能更有效地使用底层基础设施，以及什么能够使运维在夜间（字面上）保持运行。

同样的原则也适用于更广泛的 DevSecOps，这个术语明确地提醒我们，安全需要嵌入到整个 DevOps 管道中，从获取内容到编写应用程序、构建应用程序、测试应用程序以及在生产环境中运行它们。开发人员（和运维人员）除了他们已有的角色不需要突然成为安全专家。但是，他们通常可以从对安全最佳实践（这可能不同于他们已经习惯的）的更高认识中获益，并从将安全视为一些不幸障碍的心态中转变出来。

以下是一些观察结果。

<ruby> 开放式 Web 应用程序安全项目 <rt>  Open Web Application Security Project </rt></ruby>（[OWASP](https://www.owasp.org/index.php/Main_Page)）[Top 10 列表]提供了一个窗口，可以了解 Web 应用程序中的主要漏洞。列表中的许多条目对 Web 程序员来说都很熟悉。跨站脚本（XSS）和注入漏洞是最常见的。但令人震惊的是，2007 年列表中的许多漏洞仍在 2017 年的列表中（[PDF](https://www.owasp.org/images/7/72/OWASP_Top_10-2017_%28en%29.pdf.pdf)）。无论是培训还是工具，都有问题，许多同样的编码漏洞一再出现。

新的平台技术加剧了这种情况。例如，虽然容器不一定要求应用程序以不同的方式编写，但是它们与新模式（例如[微服务](https://opensource.com/tags/microservices)）相吻合，并且可以放大某些对于安全实践的影响。例如，我的同事 [Dan Walsh](https://opensource.com/users/rhatdan)（[@rhatdan](https://twitter.com/rhatdan)）写道：“计算机领域最大的误解是需要 root 权限来运行应用程序，问题是并不是所有开发者都认为他们需要 root，而是他们将这种假设构建到他们建设的服务中，即服务无法在非 root 情况下运行，而这降低了安全性。”

默认使用 root 访问是一个好的实践吗？并不是。但它可能（也许）是一个可以防御的应用程序和系统，否则就会被其它方法完全隔离。但是，由于所有东西都连接在一起，没有真正的边界，多用户工作负载，拥有许多不同级别访问权限的用户，更不用说更加危险的环境了，那么快捷方式的回旋余地就更小了。

[自动化](https://opensource.com/tags/automation)应该是 DevOps 不可分割的一部分。自动化需要覆盖整个过程中，包括安全和合规性测试。代码是从哪里来的？是否涉及第三方技术、产品或容器镜像？是否有已知的安全勘误表？是否有已知的常见代码缺陷？机密信息和个人身份信息是否被隔离？如何进行身份认证？谁被授权部署服务和应用程序？

你不是自己在写你的加密代码吧？

尽可能地自动化渗透测试。我提到过自动化没？它是使安全性持续的一个重要部分，而不是偶尔做一次的检查清单。

这听起来很难吗？可能有点。至少它是不同的。但是，一名 [DevOpsDays OpenSpaces](https://www.devopsdays.org/open-space-format/) 伦敦论坛的参与者对我说：“这只是技术测试。它既不神奇也不神秘。”他接着说，将安全作为一种更广泛地了解整个软件生命周期的方法（这是一种不错的技能）来参与进来并不难。他还建议参加事件响应练习或[夺旗练习](https://dev.to/_theycallmetoni/capture-the-flag-its-a-game-for-hacki-mean-security-professionals)。你会发现它们很有趣。

---

via: <https://opensource.com/article/18/4/what-developers-need-know-about-security>

作者：[Gordon Haff](https://opensource.com/users/ghaff) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


pydbgen：一个数据库随机生成器

Summary: 用这个简单的工具生成带有多表的大型数据库，让你更好地用 SQL 研究数据科学。

用这个简单的工具生成带有多表的大型数据库，让你更好地用 SQL 研究数据科学。

>
> 用这个简单的工具生成带有多表的大型数据库，让你更好地用 SQL 研究数据科学。
>
>
>

![](/data/attachment/album/201811/17/231200z2n5nccd5cy5rxlb.png)

在研究数据科学的过程中，最麻烦的往往不是算法或者技术，而是如何获取到一批原始数据。尽管网上有很多真实优质的数据集可以用于机器学习，然而在学习 SQL 时却不是如此。

对于数据科学来说，熟悉 SQL 的重要性不亚于了解 Python 或 R 编程。如果想收集诸如姓名、年龄、信用卡信息、地址这些信息用于机器学习任务，在 Kaggle 上查找专门的数据集比使用足够大的真实数据库要容易得多。

如果有一个简单的工具或库来帮助你生成一个大型数据库，表里还存放着大量你需要的数据，岂不美哉？

不仅仅是数据科学的入门者，即使是经验丰富的软件测试人员也会需要这样一个简单的工具，只需编写几行代码，就可以通过随机（但是是假随机）生成任意数量但有意义的数据集。

因此，我要推荐这个名为 [pydbgen](https://github.com/tirthajyoti/pydbgen) 的轻量级 Python 库。在后文中，我会简要说明这个库的相关内容，你也可以[阅读它的文档](http://pydbgen.readthedocs.io/en/latest/)详细了解更多信息。

### pydbgen 是什么

`pydbgen` 是一个轻量的纯 Python 库，它可以用于生成随机但有意义的数据记录（包括姓名、地址、信用卡号、日期、时间、公司名称、职位、车牌号等等），存放在 Pandas Dataframe 对象中，并保存到 SQLite 数据库或 Excel 文件。

### 如何安装 pydbgen

目前 1.0.5 版本的 pydbgen 托管在 PyPI（<ruby> Python 包索引存储库 <rt>  Python Package Index repository </rt></ruby>）上，并且对 [Faker](https://faker.readthedocs.io/en/latest/index.html) 有依赖关系。安装 pydbgen 只需要执行命令：

```
pip install pydbgen
```

已经在 Python 3.6 环境下测试安装成功，但在 Python 2 环境下无法正常安装。

### 如何使用 pydbgen

在使用 `pydbgen` 之前，首先要初始化 `pydb` 对象。

```
import pydbgen
from pydbgen import pydbgen
myDB=pydbgen.pydb()
```

随后就可以调用 `pydb` 对象公开的各种内部函数了。可以按照下面的例子，输出随机的美国城市和车牌号码：

```
myDB.city_real()
>> 'Otterville'
for _ in range(10):
    print(myDB.license_plate())
>> 8NVX937
   6YZH485
   XBY-564
   SCG-2185
   XMR-158
   6OZZ231
   CJN-850
   SBL-4272
   TPY-658
   SZL-0934
```

另外，如果你输入的是 `city()` 而不是 `city_real()`，返回的将会是虚构的城市名。

```
print(myDB.gen_data_series(num=8,data_type='city'))
>>
New Michelle
Robinborough
Leebury
Kaylatown
Hamiltonfort
Lake Christopher
Hannahstad
West Adamborough
```

### 生成随机的 Pandas Dataframe

你可以指定生成数据的数量和种类，但需要注意的是，返回结果均为字符串或文本类型。

```
testdf=myDB.gen_dataframe(5,['name','city','phone','date'])
testdf
```

最终产生的 Dataframe 类似下图所示。

![](/data/attachment/album/201811/17/231201lwixxlhulil7lx32.png)

### 生成数据库表

你也可以指定生成数据的数量和种类，而返回结果是数据库中的文本或者变长字符串类型。在生成过程中，你可以指定对应的数据库文件名和表名。

```
myDB.gen_table(db_file='Testdb.DB',table_name='People',

fields=['name','city','street_address','email'])
```

上面的例子种生成了一个能被 MySQL 和 SQLite 支持的 `.db` 文件。下图则显示了这个文件中的数据表在 SQLite 可视化客户端中打开的画面。

![](/data/attachment/album/201811/17/231212u9lh9ldcq8gaal3d.png)

### 生成 Excel 文件

和上面的其它示例类似，下面的代码可以生成一个具有随机数据的 Excel 文件。值得一提的是，通过将 `phone_simple` 参数设为 `False` ，可以生成较长较复杂的电话号码。如果你想要提高自己在数据提取方面的能力，不妨尝试一下这个功能。

```
myDB.gen_excel(num=20,fields=['name','phone','time','country'],
phone_simple=False,filename='TestExcel.xlsx')
```

最终的结果类似下图所示：

![](/data/attachment/album/201811/17/231229sal93a344m9dykty.png)

### 生成随机电子邮箱地址

`pydbgen` 内置了一个 `realistic_email` 方法，它基于种子来生成随机的电子邮箱地址。如果你不想在网络上使用真实的电子邮箱地址时，这个功能可以派上用场。

```
for _ in range(10):
    print(myDB.realistic_email('Tirtha Sarkar'))
>>
Tirtha_Sarkar@gmail.com
Sarkar.Tirtha@outlook.com
Tirtha_S48@verizon.com
Tirtha_Sarkar62@yahoo.com
Tirtha.S46@yandex.com
Tirtha.S@att.com
Sarkar.Tirtha60@gmail.com
TirthaSarkar@zoho.com
Sarkar.Tirtha@protonmail.com
Tirtha.S@comcast.net
```

### 未来的改进和用户贡献

目前的版本中并不完美。如果你发现了 pydbgen 的 bug 导致它在运行期间发生崩溃，请向我反馈。如果你打算对这个项目贡献代码，[也随时欢迎你](https://github.com/tirthajyoti/pydbgen)。当然现在也还有很多改进的方向：

* pydbgen 作为随机数据生成器，可以集成一些机器学习或统计建模的功能吗？
* pydbgen 是否会添加可视化功能？

一切皆有可能！

如果你有任何问题或想法想要分享，都可以通过 [tirthajyoti@gmail.com](mailto:tirthajyoti@gmail.com) 与我联系。如果你像我一样对机器学习和数据科学感兴趣，也可以添加我的 [LinkedIn](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/) 或在 [Twitter](https://twitter.com/tirthajyotiS) 上关注我。另外，还可以在我的 [GitHub](https://github.com/tirthajyoti?tab=repositories) 上找到更多 Python、R 或 MATLAB 的有趣代码和机器学习资源。

本文以 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 许可在 [Towards Data Science](https://towardsdatascience.com/introducing-pydbgen-a-random-dataframe-database-table-generator-b5c7bdc84be5) 首发。

---

via: <https://opensource.com/article/18/11/pydbgen-random-database-table-generator>

作者：[Tirthajyoti Sarkar](https://opensource.com/users/tirthajyoti) 选题：[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/) 荣誉推出


一个用于家庭项目的单用户、轻量级操作系统

Summary: 业余爱好者应该了解一下 RISC OS 的五个原因。

业余爱好者应该了解一下 RISC OS 的五个原因。

>
> 业余爱好者应该了解一下 RISC OS 的五个原因。
>
>
>

![](/data/attachment/album/201811/18/101917hepepjr5ennpaieg.jpg)

究竟什么是 RISC OS？嗯，它不是一种新的 Linux。它也不是有些人认为的 Windows。事实上，它发布于 1987 年，它比它们任何一个都要古老。但你看到它时不一定会意识到这一点。

其点击式图形用户界面在底部为活动的程序提供一个固定面板和一个图标栏。因此，它看起来像 Windows 95，并且比它早了 8 年。

这个操作系统最初是为 [Acorn Archimedes](https://en.wikipedia.org/wiki/Acorn_Archimedes) 编写的。这台机器中的 Acorn RISC Machines CPU 是全新的硬件，因此需要在其上运行全新的软件。这是最早的 ARM 芯片上的系统，早于任何人想到的 Android 或 [Armbian](https://www.armbian.com/) 之前。

虽然 Acorn 桌面最终消失了，但 ARM 芯片继续征服世界。在这里，RISC OS 一直有一个优点 —— 通常在嵌入式设备中，你从来没有真正地意识到它。RISC OS 过去长期以来一直是一个完全专有的操作系统。但近年来，该抄系统的所有者已经开始将源代码发布到一个名为 [RISC OS Open](https://www.riscosopen.org/content/) 的项目中。

### 1、你可以将它安装在树莓派上

树莓派的官方操作系统 [Raspbian](https://www.raspbian.org/) 实际上非常棒（如果你对摆弄不同技术上新奇的东西不感兴趣，那么你可能最初也不会选择树莓派）。由于 RISC OS 是专门为 ARM 编写的，因此它可以在各种小型计算机上运行，包括树莓派的各个型号。

### 2、它超轻量级

我的树莓派上安装的 RISC 系统占用了几百兆 —— 这是在我加载了数十个程序和游戏之后。它们大多数时候不超过 1 兆。

如果你真的节俭，RISC OS Pico 可用在 16MB SD 卡上。如果你要在嵌入式系统或物联网项目中鼓捣某些东西，这是很完美的。当然，16MB 实际上比压缩到 512KB 的老 Archimedes 的 ROM 要多得多。但我想 30 年间内存技术的发展，我们可以稍微放宽一下了。

### 3、它非常适合复古游戏

当 Archimedes 处于鼎盛时期时，ARM CPU 的速度比 Apple Macintosh 和 Commodore Amiga 中的 Motorola 68000 要快几倍，它也完全吸了新的 386 技术。这使得它成为对游戏开发者有吸引力的一个平台，他们希望用这个星球上最强大的桌面计算机来支撑他们的东西。

那些游戏的许多拥有者都非常慷慨，允许业余爱好者免费下载他们的老作品。虽然 RISC OS 和硬件已经发展了，但只需要进行少量的调整就可以让它们运行起来。

如果你有兴趣探索这个，[这里有一个指南](https://www.riscosopen.org/wiki/documentation/show/Introduction%20to%20RISC%20OS)让这些游戏在你的树莓派上运行。

### 4、它有 BBC BASIC

就像过去一样，按下 `F12` 进入命令行，输入 `*BASIC`，就可以看到一个完整的 BBC BASIC 解释器。

对于那些在 80 年代没有接触过它的人，请让我解释一下：BBC BASIC 是当时我们很多人的第一个编程语言，因为它专门教孩子如何编码。当时有大量的书籍和杂志文章教我们编写自己的简单但高度可玩的游戏。

几十年后，对于一个想要在学校假期做点什么的有技术头脑的孩子而言，在 BBC BASIC 上编写自己的游戏仍然是一个很棒的项目。但很少有孩子在家里有 BBC micro。那么他们应该怎么做呢？

当然，你可以在每台家用电脑上运行解释器，但是当别人需要使用它时就不能用了。那么为什么不使用装有 RISC OS 的树莓派呢？

### 5、它是一个简单的单用户操作系统

RISC OS 不像 Linux 一样有自己的用户和超级用户访问权限。它有一个用户并可以完全访问整个机器。因此，它可能不是跨企业部署的最佳日常驱动，甚至不适合给老人家做银行业务。但是，如果你正在寻找可以用来修改和鼓捣的东西，那绝对是太棒了。你和机器之间没有那么多障碍，所以你可以直接闯进去。

### 扩展阅读

如果你想了解有关此操作系统的更多信息，请查看 [RISC OS Open](https://www.riscosopen.org/content/)，或者将镜像烧到闪存到卡上并开始使用它。

---

via: <https://opensource.com/article/18/7/gentle-intro-risc-os>

作者：[James Mawson](https://opensource.com/users/dxmjames) 选题：[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/) 荣誉推出


如何使用 chkconfig 和 systemctl 命令启用或禁用 Linux 服务

![](/data/attachment/album/201811/18/105900phch0hxaxthy0mam.jpg)

对于 Linux 管理员来说这是一个重要（美妙）的话题，所以每个人都必须知道，并练习怎样才能更高效的使用它们。

在 Linux 中，无论何时当你安装任何带有服务和守护进程的包，系统默认会把这些服务的初始化及 systemd 脚本添加进去，不过此时它们并没有被启用。

我们需要手动的开启或者关闭那些服务。Linux 中有三个著名的且一直在被使用的初始化系统。

### 什么是初始化系统？

在以 Linux/Unix 为基础的操作系统上，`init` (初始化的简称) 是内核引导系统启动过程中第一个启动的进程。

`init` 的进程 id （pid）是 1，除非系统关机否则它将会一直在后台运行。

`init` 首先根据 `/etc/inittab` 文件决定 Linux 运行的级别，然后根据运行级别在后台启动所有其他进程和应用程序。

BIOS、MBR、GRUB 和内核程序在启动 `init` 之前就作为 Linux 的引导程序的一部分开始工作了。

下面是 Linux 中可以使用的运行级别（从 0～6 总共七个运行级别）：

* `0`：关机
* `1`：单用户模式
* `2`：多用户模式（没有NFS）
* `3`：完全的多用户模式
* `4`：系统未使用
* `5`：图形界面模式
* `6`：重启

下面是 Linux 系统中最常用的三个初始化系统：

* System V（Sys V）
* Upstart
* systemd

### 什么是 System V（Sys V）?

System V（Sys V）是类 Unix 系统第一个也是传统的初始化系统。`init` 是内核引导系统启动过程中第一支启动的程序，它是所有程序的父进程。

大部分 Linux 发行版最开始使用的是叫作 System V（Sys V）的传统的初始化系统。在过去的几年中，已经发布了好几个初始化系统以解决标准版本中的设计限制，例如：launchd、Service Management Facility、systemd 和 Upstart。

但是 systemd 已经被几个主要的 Linux 发行版所采用，以取代传统的 SysV 初始化系统。

### 什么是 Upstart?

Upstart 是一个基于事件的 `/sbin/init` 守护进程的替代品，它在系统启动过程中处理任务和服务的启动，在系统运行期间监视它们，在系统关机的时候关闭它们。

它最初是为 Ubuntu 而设计，但是它也能够完美的部署在其他所有 Linux系统中，用来代替古老的 System-V。

Upstart 被用于 Ubuntu 从 9.10 到 Ubuntu 14.10 和基于 RHEL 6 的系统，之后它被 systemd 取代。

### 什么是 systemd?

systemd 是一个新的初始化系统和系统管理器，它被用于所有主要的 Linux 发行版，以取代传统的 SysV 初始化系统。

systemd 兼容 SysV 和 LSB 初始化脚本。它可以直接替代 SysV 初始化系统。systemd 是被内核启动的第一个程序，它的 PID 是 1。

systemd 是所有程序的父进程，Fedora 15 是第一个用 systemd 取代 upstart 的发行版。`systemctl` 用于命令行，它是管理 systemd 的守护进程/服务的主要工具，例如：（开启、重启、关闭、启用、禁用、重载和状态）

systemd 使用 .service 文件而不是 bash 脚本（SysVinit 使用的）。systemd 将所有守护进程添加到 cgroups 中排序，你可以通过浏览 `/cgroup/systemd` 文件查看系统等级。

### 如何使用 chkconfig 命令启用或禁用引导服务?

`chkconfig` 实用程序是一个命令行工具，允许你在指定运行级别下启动所选服务，以及列出所有可用服务及其当前设置。

此外，它还允许我们从启动中启用或禁用服务。前提是你有超级管理员权限（root 或者 `sudo`）运行这个命令。

所有的服务脚本位于 `/etc/rd.d/init.d`文件中

### 如何列出运行级别中所有的服务

`--list` 参数会展示所有的服务及其当前状态（启用或禁用服务的运行级别）：

```
# chkconfig --list
NetworkManager     0:off    1:off    2:on    3:on    4:on    5:on    6:off
abrt-ccpp          0:off    1:off    2:off    3:on    4:off    5:on    6:off
abrtd              0:off    1:off    2:off    3:on    4:off    5:on    6:off
acpid              0:off    1:off    2:on    3:on    4:on    5:on    6:off
atd                0:off    1:off    2:off    3:on    4:on    5:on    6:off
auditd             0:off    1:off    2:on    3:on    4:on    5:on    6:off
.
.
```

### 如何查看指定服务的状态

如果你想查看运行级别下某个服务的状态，你可以使用下面的格式匹配出需要的服务。

比如说我想查看运行级别中 `auditd` 服务的状态

```
# chkconfig --list| grep auditd
auditd             0:off    1:off    2:on    3:on    4:on    5:on    6:off
```

### 如何在指定运行级别中启用服务

使用 `--level` 参数启用指定运行级别下的某个服务，下面展示如何在运行级别 3 和运行级别 5 下启用 `httpd` 服务。

```
# chkconfig --level 35 httpd on
```

### 如何在指定运行级别下禁用服务

同样使用 `--level` 参数禁用指定运行级别下的服务，下面展示的是在运行级别 3 和运行级别 5 中禁用 `httpd` 服务。

```
# chkconfig --level 35 httpd off
```

### 如何将一个新服务添加到启动列表中

`-–add` 参数允许我们添加任何新的服务到启动列表中，默认情况下，新添加的服务会在运行级别 2、3、4、5 下自动开启。

```
# chkconfig --add nagios
```

### 如何从启动列表中删除服务

可以使用 `--del` 参数从启动列表中删除服务，下面展示的是如何从启动列表中删除 Nagios 服务。

```
# chkconfig --del nagios
```

### 如何使用 systemctl 命令启用或禁用开机自启服务？

`systemctl` 用于命令行，它是一个用来管理 systemd 的守护进程/服务的基础工具，例如：（开启、重启、关闭、启用、禁用、重载和状态）。

所有服务创建的 unit 文件位与 `/etc/systemd/system/`。

### 如何列出全部的服务

使用下面的命令列出全部的服务（包括启用的和禁用的）。

```
# systemctl list-unit-files --type=service
UNIT FILE                                     STATE
arp-ethers.service                            disabled
auditd.service                                enabled
autovt@.service                               enabled
blk-availability.service                      disabled
brandbot.service                              static
chrony-dnssrv@.service                        static
chrony-wait.service                           disabled
chronyd.service                               enabled
cloud-config.service                          enabled
cloud-final.service                           enabled
cloud-init-local.service                      enabled
cloud-init.service                            enabled
console-getty.service                         disabled
console-shell.service                         disabled
container-getty@.service                      static
cpupower.service                              disabled
crond.service                                 enabled
.
.
150 unit files listed.
```

使用下面的格式通过正则表达式匹配出你想要查看的服务的当前状态。下面是使用 `systemctl` 命令查看 `httpd` 服务的状态。

```
# systemctl list-unit-files --type=service | grep httpd
httpd.service disabled
```

### 如何让指定的服务开机自启

使用下面格式的 `systemctl` 命令启用一个指定的服务。启用服务将会创建一个符号链接，如下可见：

```
# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
```

运行下列命令再次确认服务是否被启用。

```
# systemctl is-enabled httpd
enabled
```

### 如何禁用指定的服务

运行下面的命令禁用服务将会移除你启用服务时所创建的符号链接。

```
# systemctl disable httpd
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
```

运行下面的命令再次确认服务是否被禁用。

```
# systemctl is-enabled httpd
disabled
```

### 如何查看系统当前的运行级别

使用 `systemctl` 命令确认你系统当前的运行级别，`runlevel` 命令仍然可在 systemd 下工作，不过，运行级别对于 systemd 来说是一个历史遗留的概念。所以我建议你全部使用 `systemctl` 命令。

我们当前处于运行级别 3, 它等同于下面显示的 `multi-user.target`。

```
# systemctl list-units --type=target
UNIT                  LOAD   ACTIVE SUB    DESCRIPTION
basic.target          loaded active active Basic System
cloud-config.target   loaded active active Cloud-config availability
cryptsetup.target     loaded active active Local Encrypted Volumes
getty.target          loaded active active Login Prompts
local-fs-pre.target   loaded active active Local File Systems (Pre)
local-fs.target       loaded active active Local File Systems
multi-user.target     loaded active active Multi-User System
network-online.target loaded active active Network is Online
network-pre.target    loaded active active Network (Pre)
network.target        loaded active active Network
paths.target          loaded active active Paths
remote-fs.target      loaded active active Remote File Systems
slices.target         loaded active active Slices
sockets.target        loaded active active Sockets
swap.target           loaded active active Swap
sysinit.target        loaded active active System Initialization
timers.target         loaded active active Timers
```

---

via: <https://www.2daygeek.com/how-to-enable-or-disable-services-on-boot-in-linux-using-chkconfig-and-systemctl-command/>

作者：[Prakash Subramanian](https://www.2daygeek.com/author/prakash/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[way-ww](https://github.com/way-ww) 校对：[wxy](https://github.com/wxy)

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


8 个很棒的 pytest 插件

>
> Python 测试工具最好的一方面是其强大的生态系统。这里列出了八个最好的插件。
>
>
>

![](/data/attachment/album/201811/19/114149ufkyyfiq3n4n3y5z.jpg)

我们是 [pytest](https://docs.pytest.org/en/latest/) 的忠实粉丝，并将其作为工作和开源项目的默认 Python 测试工具。在本月的 Python 专栏中，我们分享了为什么我们喜欢 `pytest` 以及一些让 `pytest` 测试工作更有趣的插件。

### 什么是 pytest？

正如该工具的网站所说，“pytest 框架可以轻松地编写小型测试，也能进行扩展以支持应用和库的复杂功能测试。”

`pytest` 允许你在任何名为 `test_*.py` 的文件中定义测试，并将其定义为以 `test_*` 开头的函数。然后，pytest 将在整个项目中查找所有测试，并在控制台中运行 `pytest` 时自动运行这些测试。pytest 接受[标志和参数](https://docs.pytest.org/en/latest/usage.html)，它们可以在测试运行器停止时更改，这些包含如何输出结果，运行哪些测试以及输出中包含哪些信息。它还包括一个 `set_trace()` 函数，它可以进入到你的测试中。它会暂停您的测试， 并允许你与变量进行交互，不然你只能在终端中“四处翻弄”来调试你的项目。

`pytest` 最好的一方面是其强大的插件生态系统。因为 `pytest` 是一个非常流行的测试库，所以多年来创建了许多插件来扩展、定制和增强其功能。这八个插件是我们的最爱。

### 8 个很棒的插件

#### 1、pytest-sugar

[pytest-sugar](https://github.com/Frozenball/pytest-sugar) 改变了 `pytest` 的默认外观，添加了一个进度条，并立即显示失败的测试。它不需要配置，只需 `pip install pytest-sugar`，用 `pytest` 运行测试，来享受更漂亮、更有用的输出。

#### 2、pytest-cov

[pytest-cov](https://github.com/pytest-dev/pytest-cov) 在 `pytest` 中增加了覆盖率支持，来显示哪些代码行已经测试过，哪些还没有。它还将包括项目的测试覆盖率。

#### 3、pytest-picked

[pytest-picked](https://github.com/anapaulagomes/pytest-picked) 对你已经修改但尚未提交 `git` 的代码运行测试。安装库并运行 `pytest --picked` 来仅测试自上次提交后已更改的文件。

#### 4、pytest-instafail

[pytest-instafail](https://github.com/pytest-dev/pytest-instafail) 修改 `pytest` 的默认行为来立即显示失败和错误，而不是等到 `pytest` 完成所有测试。

#### 5、pytest-tldr

一个全新的 `pytest` 插件，可以将输出限制为你需要的东西。`pytest-tldr`（`tldr` 代表 “too long, didn’t read” —— 太长，不想读），就像 pytest-sugar 一样，除基本安装外不需要配置。不像 pytest 的默认输出那么详细，[pytest-tldr](https://github.com/freakboy3742/pytest-tldr) 将默认输出限制为失败测试的回溯信息，并忽略了一些令人讨厌的颜色编码。添加 `-v` 标志会为喜欢它的人返回更详细的输出。

#### 6、pytest-xdist

[pytest-xdist](https://github.com/pytest-dev/pytest-xdist) 允许你通过 `-n` 标志并行运行多个测试：例如，`pytest -n 2` 将在两个 CPU 上运行你的测试。这可以显著加快你的测试速度。它还包括 `--looponfail` 标志，它将自动重新运行你的失败测试。

#### 7、pytest-django

[pytest-django](https://pytest-django.readthedocs.io/en/latest/) 为 Django 应用和项目添加了 `pytest` 支持。具体来说，`pytest-django` 引入了使用 pytest fixture 测试 Django 项目的能力，而省略了导入 `unittest` 和复制/粘贴其他样板测试代码的需要，并且比标准的 Django 测试套件运行得更快。

#### 8、django-test-plus

[django-test-plus](https://django-test-plus.readthedocs.io/en/latest/) 并不是专门为 `pytest` 开发，但它现在支持 `pytest`。它包含自己的 `TestCase` 类，你的测试可以继承该类，并使你能够使用较少的按键来输出频繁的测试案例，例如检查特定的 HTTP 错误代码。

我们上面提到的库绝不是你扩展 `pytest` 的唯一选择。有用的 pytest 插件的前景是广阔的。查看 [pytest 插件兼容性](https://plugincompat.herokuapp.com/)页面来自行探索。你最喜欢哪些插件？

---

via: <https://opensource.com/article/18/6/pytest-plugins>

作者：[Jeff Triplett](https://opensource.com/users/jefftriplett), [Lacery Williams Henschel](https://opensource.com/users/laceynwilliams) 选题：[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/) 荣誉推出


COPR 仓库中 4 个很酷的新软件（2018.10）

Summary: COPR 是软件的个人存储库的集合，它包含那些不在标准的 Fedora 仓库中的软件。

![](/data/attachment/album/201811/19/120125j6ip4lh26fc2cii4.jpg)

COPR 是软件的个人存储库的[集合](https://copr.fedorainfracloud.org/)，它包含那些不在标准的 Fedora 仓库中的软件。某些软件不符合允许轻松打包的标准。或者它可能不符合其他 Fedora 标准，尽管它是自由开源的。COPR 可以在标准的 Fedora 包之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持，或者是由项目自己背书的。但是，它是尝试新的或实验性软件的一种很好的方法。

这是 COPR 中一组新的有趣项目。

[编者按：这些项目里面有一个并不适合通过 COPR 分发，所以从本文中 也删除了。相关的评论也删除了，以免误导读者。对此带来的不便，我们深表歉意。]

（LCTT 译注：本文后来移除了对“GitKraken”项目的介绍。）

### Music On Console

[Music On Console](http://moc.daper.net/) 播放器（简称 mocp）是一个简单的控制台音频播放器。它有一个类似于 “Midnight Commander” 的界面，并且很容易使用。你只需进入包含音乐的目录，然后选择要播放的文件或目录。此外，mocp 提供了一组命令，允许直接从命令行进行控制。

![](/data/attachment/album/201811/19/120126im5pu5llnpe65s7p.png)

#### 安装说明

该仓库目前为 Fedora 28 和 29 提供 Music On Console 播放器。要安装 mocp，请使用以下命令：

```
sudo dnf copr enable Krzystof/Moc
sudo dnf install moc
```

### cnping

[Cnping](https://github.com/cnlohr/cnping) 是小型的图形化 ping IPv4 工具，可用于可视化显示 RTT 的变化。它提供了一个选项来控制每个数据包之间的间隔以及发送的数据大小。除了显示的图表外，cnping 还提供 RTT 和丢包的基本统计数据。

![](/data/attachment/album/201811/19/120126nx2nq4tqcquvssmz.png)

#### 安装说明

该仓库目前为 Fedora 27、28、29 和 Rawhide 提供 cnping。要安装 cnping，请使用以下命令：

```
sudo dnf copr enable dreua/cnping
sudo dnf install cnping
```

### Pdfsandwich

[Pdfsandwich](http://www.tobias-elze.de/pdfsandwich/) 是将文本添加到图像形式的文本 PDF 文件 (如扫描书籍) 的工具。它使用光学字符识别 (OCR) 创建一个额外的图层, 包含了原始页面已识别的文本。这对于复制和处理文本很有用。

#### 安装说明

该仓库目前为 Fedora 27、28、29、Rawhide 以及 EPEL 7 提供 pdfsandwich。要安装 pdfsandwich，请使用以下命令：

```
sudo dnf copr enable merlinm/pdfsandwich
sudo dnf install pdfsandwich
```

---

via: <https://fedoramagazine.org/4-cool-new-projects-try-copr-october-2018/>

作者：[Dominik Turecek](https://fedoramagazine.org) 选题：[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/) 荣誉推出


gitbase：用 SQL 查询 Git 仓库

>
> gitbase 是一个使用 go 开发的的开源项目，它实现了在 Git 仓库上执行 SQL 查询。
>
>
>

![](/data/attachment/album/201811/19/131443ox250dpk3nx6fsc2.jpg)

Git 已经成为了代码版本控制的事实标准，但尽管 Git 相当普及，对代码仓库的深入分析的工作难度却没有因此而下降；而 SQL 在大型代码库的查询方面则已经是一种久经考验的语言，因此诸如 Spark 和 BigQuery 这样的项目都采用了它。

所以，source{d} 很顺理成章地将这两种技术结合起来，就产生了 gitbase（LCTT 译注：source{d} 是一家开源公司，本文作者是该公司开发者关系副总裁）。gitbase 是一个<ruby> 代码即数据 <rt>  code-as-data </rt></ruby>的解决方案，可以使用 SQL 对 git 仓库进行大规模分析。

[gitbase](https://github.com/src-d/gitbase) 是一个完全开源的项目。它站在了很多巨人的肩上，因此得到了足够的发展竞争力。下面就来介绍一下其中的一些“巨人”。

![](/data/attachment/album/201811/19/131453rqezttbxqhuut259.png)

*[gitbase playground](https://github.com/src-d/gitbase-web) 为 gitbase 提供了一个可视化的操作环境。*

### 用 Vitess 解析 SQL

gitbase 通过 SQL 与用户进行交互，因此需要能够遵循 MySQL 协议来对通过网络传入的 SQL 请求作出解析和理解，万幸由 YouTube 建立的 [Vitess](https://github.com/vitessio/vitess) 项目已经在这一方面给出了解决方案。Vitess 是一个横向扩展的 MySQL 数据库集群系统。

我们只是使用了这个项目中的部分重要代码，并将其转化为一个可以让任何人在数分钟以内编写出一个 MySQL 服务器的[开源程序](https://github.com/src-d/go-mysql-server)，就像我在 [justforfunc](http://justforfunc.com/) 视频系列中展示的 [CSVQL](https://youtu.be/bcRDXAraprk) 一样，它可以使用 SQL 操作 CSV 文件。

### 用 go-git 读取 git 仓库

在成功解析 SQL 请求之后，还需要对数据集中的 git 仓库进行查询才能返回结果。因此，我们还结合使用了 source{d} 最成功的 [go-git](https://github.com/src-d/go-git) 仓库。go-git 是使用纯 go 语言编写的具有高度可扩展性的 git 实现。

借此我们就可以很方便地将存储在磁盘上的代码仓库保存为 [siva](https://github.com/src-d/siva) 文件格式（这同样是 source{d} 的一个开源项目），也可以通过 `git clone` 来对代码仓库进行复制。

### 使用 enry 检测语言、使用 babelfish 解析文件

gitbase 集成了我们开源的语言检测项目 [enry](https://github.com/src-d/enry) 以及代码解析项目 [babelfish](https://github.com/bblfsh/bblfshd)，因此在分析 git 仓库历史代码的能力也相当强大。babelfish 是一个自托管服务，普适于各种源代码解析，并将代码文件转换为<ruby> 通用抽象语法树 <rt>  Universal Abstract Syntax Tree </rt></ruby>（UAST）。

这两个功能在 gitbase 中可以被用户以函数 `LANGUAGE` 和 `UAST` 调用，诸如“查找上个月最常被修改的函数的名称”这样的请求就需要通过这两个功能实现。

### 提高性能

gitbase 可以对非常大的数据集进行分析，例如来自 GitHub 高达 3 TB 源代码的 Public Git Archive（[公告](https://blog.sourced.tech/post/announcing-pga/)）。面临的工作量如此巨大，因此每一点性能都必须运用到极致。于是，我们也使用到了 Rubex 和 Pilosa 这两个项目。

#### 使用 Rubex 和 Oniguruma 优化正则表达式速度

[Rubex](https://github.com/moovweb/rubex) 是 go 的正则表达式标准库包的一个准替代品。之所以说它是准替代品，是因为它没有在 `regexp.Regexp` 类中实现 `LiteralPrefix` 方法，直到现在都还没有。

Rubex 的高性能是由于使用 [cgo](https://golang.org/cmd/cgo/) 调用了 [Oniguruma](https://github.com/kkos/oniguruma)，它是一个高度优化的 C 代码库。

#### 使用 Pilosa 索引优化查询速度

索引几乎是每个关系型数据库都拥有的特性，但 Vitess 由于不需要用到索引，因此并没有进行实现。

于是我们引入了 [Pilosa](https://github.com/pilosa/pilosa) 这个开源项目。Pilosa 是一个使用 go 实现的分布式位图索引，可以显著提升跨多个大型数据集的查询的速度。通过 Pilosa，gitbase 才得以在巨大的数据集中进行查询。

### 总结

我想用这一篇文章来对开源社区表达我衷心的感谢，让我们能够不负众望的在短时间内完成 gitbase 的开发。我们 source{d} 的每一位成员都是开源的拥护者，github.com/src-d 下的每一行代码都是见证。

你想使用 gitbase 吗？最简单快捷的方式是从 sourced.tech/engine 下载 source{d} 引擎，就可以通过单个命令运行 gitbase 了。

想要了解更多，可以听听我在 [Go SF 大会](https://www.meetup.com/golangsf/events/251690574/)上的演讲录音。

本文在 [Medium](https://medium.com/sourcedtech/gitbase-exploring-git-repos-with-sql-95ec0986386c) 首发，并经许可在此发布。

---

via: <https://opensource.com/article/18/11/gitbase>

作者：[Francesc Campoy](https://opensource.com/users/francesc) 选题：[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/) 荣誉推出


Chrony：一个类 Unix 系统上 NTP 客户端和服务器替代品

![](/data/attachment/album/201811/19/143408gzwwbvwcalflvvbb.jpg)

在这个教程中，我们会讨论如何安装和配置 **Chrony**，一个类 Unix 系统上 NTP 客户端和服务器的替代品。Chrony 可以更快的同步系统时钟，具有更好的时钟准确度，并且它对于那些不是一直在线的系统很有帮助。Chrony 是自由开源的，并且支持 GNU/Linux 和 BSD 衍生版（比如 FreeBSD、NetBSD）、macOS 和 Solaris 等。

### 安装 Chrony

Chrony 可以从大多数 Linux 发行版的默认软件库中获得。如果你使用的是 Arch Linux，运行下面的命令来安装它：

```
$ sudo pacman -S chrony
```

在 Debian、Ubuntu、Linux Mint 上：

```
$ sudo apt-get install chrony
```

在 Fedora 上：

```
$ sudo dnf install chrony
```

当安装完成后，如果之前没有启动过的话需启动 `chronyd.service` 守护进程：

```
$ sudo systemctl start chronyd.service
```

使用下面的命令让它每次重启系统后自动运行：

```
$ sudo systemctl enable chronyd.service
```

为了确认 `chronyd.service` 已经启动，运行：

```
$ sudo systemctl status chronyd.service
```

如果一切正常，你将看到类似下面的输出：

```
● chrony.service - chrony, an NTP client/server
Loaded: loaded (/lib/systemd/system/chrony.service; enabled; vendor preset: ena
Active: active (running) since Wed 2018-10-17 10:34:53 UTC; 3min 15s ago
Docs: man:chronyd(8)
man:chronyc(1)
man:chrony.conf(5)
Main PID: 2482 (chronyd)
Tasks: 1 (limit: 2320)
CGroup: /system.slice/chrony.service
└─2482 /usr/sbin/chronyd

Oct 17 10:34:53 ubuntuserver systemd[1]: Starting chrony, an NTP client/server...
Oct 17 10:34:53 ubuntuserver chronyd[2482]: chronyd version 3.2 starting (+CMDMON
Oct 17 10:34:53 ubuntuserver chronyd[2482]: Initial frequency -268.088 ppm
Oct 17 10:34:53 ubuntuserver systemd[1]: Started chrony, an NTP client/server.
Oct 17 10:35:03 ubuntuserver chronyd[2482]: Selected source 85.25.84.166
Oct 17 10:35:03 ubuntuserver chronyd[2482]: Source 85.25.84.166 replaced with 2403
Oct 17 10:35:03 ubuntuserver chronyd[2482]: Selected source 91.189.89.199
Oct 17 10:35:06 ubuntuserver chronyd[2482]: Selected source 106.10.186.200
```

可以看到，Chrony 服务已经启动并且正在工作！

### 配置 Chrony

NTP 客户端需要知道它要连接到哪个 NTP 服务器来获取当前时间。我们可以直接在该 NTP 配置文件中的 `server` 或者 `pool` 项指定 NTP 服务器。通常，默认的配置文件位于 `/etc/chrony/chrony.conf` 或者 `/etc/chrony.conf`，取决于 Linux 发行版版本。为了更可靠的同步时间，建议指定至少三个服务器。

下面几行是我的 Ubuntu 18.04 LTS 服务器上的一个示例。

```
[...]
# About using servers from the NTP Pool Project in general see (LP: #104525).
# Approved by Ubuntu Technical Board on 2011-02-08.
# See http://www.pool.ntp.org/join.html for more information.
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
[...]
```

从上面的输出中你可以看到，[NTP 服务器池项目](https://www.ntppool.org/en/) 已经被设置成为了默认的时间服务器。对于那些好奇的人，NTP 服务器池项目是一个时间服务器集群，用来为全世界千万个客户端提供 NTP 服务。它是 Ubuntu 以及其他主流 Linux 发行版的默认时间服务器。

在这里， \* `iburst` 选项用来加速初始的同步过程 \* `maxsources` 代表 NTP 源的最大数量

请确保你选择的 NTP 服务器是同步的、稳定的、离你的位置较近的，以便使用这些 NTP 源来提升时间准确度。

### 在命令行中管理 Chronyd

chrony 有一个命令行工具叫做 `chronyc` 用来控制和监控 chrony 守护进程（`chronyd`）。

为了检查是否 chrony 已经同步，我们可以使用下面展示的 `tracking` 命令。

```
$ chronyc tracking
Reference ID : 6A0ABAC8 (t1.time.sg3.yahoo.com)
Stratum : 3
Ref time (UTC) : Wed Oct 17 11:48:51 2018
System time : 0.000984587 seconds slow of NTP time
Last offset : -0.000912981 seconds
RMS offset : 0.007983995 seconds
Frequency : 23.704 ppm slow
Residual freq : +0.006 ppm
Skew : 1.734 ppm
Root delay : 0.089718960 seconds
Root dispersion : 0.008760406 seconds
Update interval : 515.1 seconds
Leap status : Normal
```

我们可以使用命令确认现在 chrony 使用的时间源：

```
$ chronyc sources
210 Number of sources = 8
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- chilipepper.canonical.com 2 10 377 296 +102ms[ +104ms] +/- 279ms
^- golem.canonical.com 2 10 377 302 +105ms[ +107ms] +/- 290ms
^+ pugot.canonical.com 2 10 377 297 +36ms[ +38ms] +/- 238ms
^- alphyn.canonical.com 2 10 377 279 -43ms[ -42ms] +/- 238ms
^- dadns.cdnetworks.co.kr 2 10 377 1070 +40ms[ +42ms] +/- 314ms
^* t1.time.sg3.yahoo.com 2 10 377 169 -13ms[ -11ms] +/- 80ms
^+ sin1.m-d.net 2 10 275 567 -9633us[-7826us] +/- 115ms
^- ns2.pulsation.fr 2 10 377 311 -75ms[ -73ms] +/- 250ms
```

`chronyc` 工具可以对每个源进行统计，比如使用 `sourcestats` 命令获得漂移速率和进行偏移估计。

```
$ chronyc sourcestats
210 Number of sources = 8
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
chilipepper.canonical.com 32 16 89m +6.293 14.345 +30ms 24ms
golem.canonical.com 32 17 89m +0.312 18.887 +20ms 33ms
pugot.canonical.com 32 18 89m +0.281 11.237 +3307us 23ms
alphyn.canonical.com 31 20 88m -4.087 8.910 -58ms 17ms
dadns.cdnetworks.co.kr 29 16 76m -1.094 9.895 -83ms 14ms
t1.time.sg3.yahoo.com 32 16 91m +0.153 1.952 +2835us 4044us
sin1.m-d.net 29 13 83m +0.049 6.060 -8466us 9940us
ns2.pulsation.fr 32 17 88m +0.784 9.834 -62ms 22ms
```

如果你的系统没有连接到互联网，你需要告知 Chrony 系统没有连接到 互联网。为了这样做，运行：

```
$ sudo chronyc offline
[sudo] password for sk:
200 OK
```

为了确认你的 NTP 源的状态，只需要运行：

```
$ chronyc activity
200 OK
0 sources online
8 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
```

可以看到，我的所有源此时都是离线状态。

一旦你连接到互联网，只需要使用命令告知 Chrony 你的系统已经回到在线状态：

```
$ sudo chronyc online
200 OK
```

为了查看 NTP 源的状态，运行：

```
$ chronyc activity
200 OK
8 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
```

所有选项和参数的详细解释，请参考其帮助手册。

```
$ man chronyc
$ man chronyd
```

这就是文章的所有内容。希望对你有所帮助。在随后的教程中，我们会看到如何使用 Chrony 启动一个本地的 NTP 服务器并且配置客户端来使用这个服务器同步时间。

保持关注！

---

via: <https://www.ostechnix.com/chrony-an-alternative-ntp-client-and-server-for-unix-like-systems/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zianglei](https://github.com/zianglei) 校对：[wxy](https://github.com/wxy)

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


设计更快的网页（三）：字体和 CSS 调整

Summary: 本部分会着眼于在 CSS（层叠式样式表）和字体中减掉更多的脂肪。

本部分会着眼于在 CSS（层叠式样式表）和字体中减掉更多的脂肪。

![](/data/attachment/album/201811/19/225442rooi2wcissa6dl4u.jpg)

欢迎回到我们为了构建更快网页所写的系列文章。本系列的[第一部分](/article-10166-1.html)和[第二部分](/article-10217-1.html)讲述了如何通过优化和替换图片来减少浏览器脂肪。本部分会着眼于在 CSS（[层叠式样式表](https://en.wikipedia.org/wiki/Cascading_Style_Sheets)）和字体中减掉更多的脂肪。

### 调整 CSS

首先，我们先来看看问题的源头。CSS 的出现曾是技术的一大进步。你可以用一个集中式的样式表来装饰多个网页。如今很多 Web 开发者都会使用 Bootstrap 这样的框架。

这些框架当然方便，可是很多人都会将整个框架直接复制粘贴走。Bootstrap 非常大：目前 Bootstrap 4.0 的“最小”版本也有 144.9 KB. 在这个以 TB 来计数据的时代，它可能不算多。但就像所说的那样，一头小牛也能搞出大麻烦。

我们回头来看 [getfedora.org](https://getfedora.org) 的例子。我们在[第一部分](/article-10166-1.html)中提过，第一个分析结果显示 CSS 文件占用的空间几乎比 HTML 本身还要大十倍。这里显示了所有用到的样式表：

![](/data/attachment/album/201811/19/225443ynye1kl66ybbmoo3.png)

那是九个不同的样式表。其中的很多样式在这个页面中并没有用上。

#### 移除、合并、以及压缩/缩小化

Font-awesome CSS 代表了包含未使用样式的极端。这个页面中只用到了这个字体的三个字形。如果以 KB 为单位，getfedora.org 用到的 font-awesome CSS 最初有 25.2 KB. 在清理掉所有未使用的样式后，它只有 1.3 KB 了。这只有原来体积的 4% 左右！对于 Bootstrap CSS，原来它有 118.3 KB，清理掉无用的样式后只有 13.2 KB，这就是差异。

下一个问题是，我们必须要这样一个 `bootstrap.css` 和 `font-awesome.css` 吗？或者，它们能不能合起来呢？没错，它们可以。这样虽然不会节省更多的文件空间，但浏览器成功渲染页面所需要发起的请求更少了。

最后，在合并 CSS 文件后，尝试去除无用样式并缩小它们。这样，它们只有 4.3 KB 大小，而你省掉了 10.1 KB.

不幸的是，在 Fedora 软件仓库中，还没有打包好的缩小工具。不过，有几百种在线服务可以帮到你。或者，你也可以使用 [CSS-HTML-JS Minify](https://github.com/juancarlospaco/css-html-js-minify)，它用 Python 编写，所以容易安装。现在没有一个可用的工具来净化 CSS，不过我们有 [UnCSS](https://uncss-online.com/) 这样的 Web 服务。

### 字体改进

[CSS3](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS3) 带来了很多开发人员喜欢的东西。它可以定义一些渲染页面所用的字体，并让浏览器在后台下载。此后，很多 Web 设计师都很开心，尤其是在他们发现了 Web 设计中图标字体的用法之后。像 [Font Awesome](https://fontawesome.com/) 这样的字体集现在非常流行，也被广泛使用。这是这个字体集的大小：

```
current free version 912 glyphs/icons, smallest set ttf 30.9KB, woff 14.7KB, woff2 12.2KB, svg 107.2KB, eot 31.2
```

所以问题是，你需要所有的字形吗？很可能不需要。你可以通过 [FontForge](https://fontforge.github.io/en-US/) 来去除这些无用字形，但这需要很大的工作量。你还可以用 [Fontello](http://fontello.com/). 你可以使用公共实例，也可以配置你自己的版本，因为它是自由软件，可以在 [Github](https://github.com/fontello/fontello) 上找到。

这种自定义字体集的缺点在于，你必须自己来托管字体文件。你也没法使用其它在线服务来提供更新。但与更快的性能相比，这可能算不上一个缺点。

### 总结

现在，你已经做完了所有对内容本身的操作，来最大限度地减少浏览器加载和解释的内容。从现在开始，只有服务器的管理技巧才才能帮到你了。

有一个很简单，但很多人都做错了的事情，就是使用一些智能缓存。比如，CSS 或者图片文件可以缓存一周。但无论如何，如果你用了 Cloudflare 这样的代理服务或者自己构建了代理，首先要做的都应该是缩小页面。用户喜欢可以快速加载的页面。他们会（默默地）感谢你，服务器的负载也会更小。

---

via: <https://fedoramagazine.org/design-faster-web-pages-part-3-font-css-tweaks/>

作者：[Sirko Kemter](https://fedoramagazine.org/author/gnokii/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[StdioA](https://github.com/StdioA) 校对：[wxy](https://github.com/wxy)

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


more、less 和 most 的区别

Summary: 如果你是一个 Linux 方面的新手，你可能会在 more、less、most 这三个命令行工具之间产生疑惑。

![](/data/attachment/album/201811/19/232127o6yg63g9wtgzwgtl.png)

如果你是一个 Linux 方面的新手，你可能会在 `more`、`less`、`most` 这三个命令行工具之间产生疑惑。在本文当中，我会对这三个命令行工具进行对比，以及展示它们各自在 Linux 中的一些使用例子。总的来说，这几个命令行工具之间都有相通和差异，而且它们在大部分 Linux 发行版上都有自带。

我们首先来看看 `more` 命令。

### more 命令

`more` 是一个老式的、基础的终端分页阅读器，它可以用于打开指定的文件并进行交互式阅读。如果文件的内容太长，在一屏以内无法完整显示，就会逐页显示文件内容。使用回车键或者空格键可以滚动浏览文件的内容，但有一个限制，就是只能够单向滚动。也就是说只能按顺序往下翻页，而不能进行回看。

![](/data/attachment/album/201811/19/232130w02jt4ctvcmc2rou.gif)

**更正**

有的 Linux 用户向我指出，在 `more` 当中是可以向上翻页的。不过，最原始版本的 `more` 确实只允许向下翻页，在后续出现的较新的版本中也允许了有限次数的向上翻页，只需要在浏览过程中按 `b` 键即可向上翻页。唯一的限制是 `more` 不能搭配管道使用（如 `ls | more`）。（LCTT 译注：此处原作者疑似有误，译者使用 `more` 是可以搭配管道使用的，或许与不同 `more` 版本有关）

按 `q` 即可退出 `more`。

**更多示例**

打开 `ostechnix.txt` 文件进行交互式阅读，可以执行以下命令：

```
$ more ostechnix.txt
```

在阅读过程中，如果需要查找某个字符串，只需要像下面这样输入斜杠（`/`）之后接着输入需要查找的内容：

```
/linux
```

按 `n` 键可以跳转到下一个匹配的字符串。

如果需要在文件的第 `10` 行开始阅读，只需要执行：

```
$ more +10 file
```

就可以从文件的第 `10` 行开始显示文件的内容了。

如果你需要让 `more` 提示你按空格键来翻页，可以加上 `-d` 参数：

```
$ more -d ostechnix.txt
```

![](/data/attachment/album/201811/19/232133tu7hk6snqnznk20y.png)

如上图所示，`more` 会提示你可以按空格键翻页。

如果需要查看所有选项以及对应的按键，可以按 `h` 键。

要查看 `more` 的更多详细信息，可以参考手册：

```
$ man more
```

### less 命令

`less` 命令也是用于打开指定的文件并进行交互式阅读，它也支持翻页和搜索。如果文件的内容太长，也会对输出进行分页，因此也可以翻页阅读。比 `more` 命令更好的一点是，`less` 支持向上翻页和向下翻页，也就是可以在整个文件中任意阅读。

![](/data/attachment/album/201811/19/232139maik5a3750omo5pk.gif)

在使用功能方面，`less` 比 `more` 命令具有更多优点，以下列出其中几个：

* 支持向上翻页和向下翻页
* 支持向上搜索和向下搜索
* 可以跳转到文件的末尾并立即从文件的开头开始阅读
* 在编辑器中打开指定的文件

**更多示例**

打开文件：

```
$ less ostechnix.txt
```

按空格键或回车键可以向下翻页，按 `b` 键可以向上翻页。

如果需要向下搜索，在输入斜杠（`/`）之后接着输入需要搜索的内容：

```
/linux
```

按 `n` 键可以跳转到下一个匹配的字符串，如果需要跳转到上一个匹配的字符串，可以按 `N` 键。

如果需要向上搜索，在输入问号（`?`）之后接着输入需要搜索的内容：

```
?linux
```

同样是按 `n` 键或 `N` 键跳转到下一个或上一个匹配的字符串。

只需要按 `v` 键，就会将正在阅读的文件在默认编辑器中打开，然后就可以对文件进行各种编辑操作了。

按 `h` 键可以查看 `less` 工具的选项和对应的按键。

按 `q` 键可以退出阅读。

要查看 `less` 的更多详细信息，可以参考手册：

```
$ man less
```

### most 命令

`most` 同样是一个终端阅读工具，而且比 `more` 和 `less` 的功能更为丰富。`most` 支持同时打开多个文件。你可以在打开的文件之间切换、编辑当前打开的文件、迅速跳转到文件中的某一行、分屏阅读、同时锁定或滚动多个屏幕等等功能。在默认情况下，对于较长的行，`most` 不会将其截断成多行显示，而是提供了左右滚动功能以在同一行内显示。

**更多示例**

打开文件：

```
$ most ostechnix1.txt
```

![](/data/attachment/album/201811/19/232140mrvibffi9v155j6n.png)

按 `e` 键可以编辑当前文件。

如果需要向下搜索，在斜杠（`/`）或 `S` 或 `f` 之后输入需要搜索的内容，按 `n` 键就可以跳转到下一个匹配的字符串。

![](/data/attachment/album/201811/19/232143cpd14boh58hkpqw4.gif)

如果需要向上搜索，在问号（`?`）之后输入需要搜索的内容，也是通过按 `n` 键跳转到下一个匹配的字符串。

同时打开多个文件：

```
$ most ostechnix1.txt ostechnix2.txt ostechnix3.txt
```

在打开了多个文件的状态下，可以输入 `:n` 切换到下一个文件，使用 `↑` 或 `↓` 键选择需要切换到的文件，按回车键就可以查看对应的文件。

![](/data/attachment/album/201811/19/232149gt4eqqv2grtwu4wz.gif)

要打开文件并跳转到某个字符串首次出现的位置（例如 linux），可以执行以下命令：

```
$ most file +/linux
```

按 `h` 键可以查看帮助。

**按键操作列表**

移动：

* 空格键或 `D` 键 – 向下滚动一屏
* `DELETE` 键或 `U` 键 – 向上滚动一屏
* `↓` 键 – 向下移动一行
* `↑` 键 – 向上移动一行
* `T` 键 – 移动到文件开头
* `B` 键 – 移动到文件末尾
* `>` 键或 `TAB` 键 – 向右滚动屏幕
* `<` 键 – 向左滚动屏幕
* `→` 键 – 向右移动一列
* `←` 键 – 向左移动一列
* `J` 键或 `G` 键 – 移动到某一行，例如 `10j` 可以移动到第 10 行
* `%` 键 – 移动到文件长度某个百分比的位置

窗口命令：

* `Ctrl-X 2`、`Ctrl-W 2` – 分屏
* `Ctrl-X 1`、`Ctrl-W 1` – 只显示一个窗口
* `O` 键、`Ctrl-X O` – 切换到另一个窗口
* `Ctrl-X 0` – 删除窗口

文件内搜索：

* `S` 键或 `f` 键或 `/` 键 – 向下搜索
* `?` 键 – 向上搜索
* `n` 键 – 跳转到下一个匹配的字符串

退出：

* `q` 键 – 退出 `most` ，且所有打开的文件都会被关闭
* `:N`、`:n` – 退出当前文件并查看下一个文件（使用 `↑` 键、`↓` 键选择下一个文件）

要查看 `most` 的更多详细信息，可以参考手册：

```
$ man most
```

### 总结

`more` – 传统且基础的分页阅读工具，仅支持向下翻页和有限次数的向上翻页。

`less` – 比 `more` 功能丰富，支持向下翻页和向上翻页，也支持文本搜索。在打开大文件的时候，比 `vi` 这类文本编辑器启动得更快。

`most` – 在上述两个工具功能的基础上，还加入了同时打开多个文件、同时锁定或滚动多个屏幕、分屏等等大量功能。

以上就是我的介绍，希望能让你通过我的文章对这三个工具有一定的认识。如果想了解这篇文章以外的关于这几个工具的详细功能，请参阅它们的 `man` 手册。

---

via: <https://www.ostechnix.com/the-difference-between-more-less-and-most-commands/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[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/) 荣誉推出


写直白的代码

![](/data/attachment/album/201811/20/000830bnjj4ojw6ea8e8t8.jpg)

为开源项目作贡献最好的方式是为它减少代码，我们应致力于写出让新手程序员无需注释就容易理解的代码，让维护者也无需花费太多精力就能着手维护。

在学生时代，我们会更多地用复杂巧妙的技术去挑战新的难题。首先我们会学习循环，然后是函数啊，类啊，等等。当我们到达一定高的程度，能用更高级的技术写更长的程序，我们会因此受到称赞。此刻我们发现老司机们用 monads 而新手们用 loop 作循环。

之后我们毕业找了工作，或者和他人合作开源项目。我们用在学校里学到的各种炫技寻求并骄傲地给出解决方案的代码实现。

*哈哈，我能扩展这个项目，并实现某牛 X 功能啦，我这里能用继承啦，我太聪明啦！*

我们实现了某个小的功能，并以充分的理由觉得自己做到了。现实项目中的编程却不是针对某某部分的功能而言。以我个人的经验而言，以前我很开心的去写代码，并骄傲地向世界展示我所知道的事情。有例为证，作为对某种编程技术的偏爱，这是用另一种元编程语言构建的一个 [线性代数语言](https://github.com/mrocklin/matrix-algebra)，注意，这么多年以来一直没人愿意碰它。

在维护了更多的代码后，我的观点发生了变化。

1. 我们不应去刻意探求如何构建软件。软件是我们为解决问题所付出的代价，那才是我们真实的目的。我们应努力为了解决问题而构建较小的软件。
2. 我们应使用尽可能简单的技术，那么更多的人就越可能会使用，并且无需理解我们所知的高级技术就能扩展软件的功能。当然，在我们不知道如何使用简单技术去实现时，我们也可以使用高级技术。

所有的这些例子都不是听来的故事。我遇到的大部分人会认同某些部分，但不知为什么，当我们向一个新项目贡献代码时又会忘掉这个初衷。直觉里用复杂技术去构建的念头往往会占据上风。

### 软件是种投入

你写的每行代码都要花费人力。写代码当然是需要时间的，也许你会认为只是你个人在奉献，然而这些代码在被审阅的时候也需要花时间理解，对于未来维护和开发人员来说，他们在维护和修改代码时同样要花费时间。否则他们完全可以用这时间出去晒晒太阳，或者陪伴家人。

所以，当你向某个项目贡献代码时，请心怀谦恭。就像是，你正和你的家人进餐时，餐桌上却没有足够的食物，你只索取你所需的部分，别人对你的自我约束将肃然起敬。以更少的代码去解决问题是很难的，你肩负重任的同时自然减轻了别人的重负。

### 技术越复杂越难维护

作为学生，逐渐使用高端技术证明了自己的价值。这体现在，首先我们有能力在开源项目中使用函数，接着是类，然后是高阶函数，monads 等等。我们向同行显示自己的解决方案时，常因自己所用技术高低而感到自豪或卑微。

而在现实中，和团队去解决问题时，情况发生了逆转。现在，我们致力于尽可能使用简单的代码去解决问题。简单方式解决问题使新手程序员能够以此扩展并解决其他问题。简单的代码让别人容易上手，效果立竿见影。我们藉以只用简单的技术去解决难题，从而展示自己的价值。

*看，我用循环替代了递归函数并且一样达到了我们的需求。当然我明白这是不够聪明的做法，不过我注意到新手同事在这里会遇上麻烦，我觉得这种改变将有所帮助吧。*

如果你是个好的程序员，你不需要证明你知道很多炫技。相应的，你可以通过用一个简单的方法解决一个问题来显示你的价值，并激发你的团队在未来的时间里去完善它。

### 当然，也请保持节制

话虽如此，过于遵循 “用简单的工具去构建” 的教条也会降低生产力。通常用递归会比用循环解决问题更简单，用类或 monad 才是正确的途径。还有两种情况另当别论，一是只是只为满足自我而创建的系统，或者是别人毫无构建经验的系统。

---

via: <http://matthewrocklin.com/blog/work/2018/01/27/write-dumb-code>

作者：[Matthew Rocklin](http://matthewrocklin.com) 译者：[plutoid](https://github.com/plutoid) 校对：[wxy](https://github.com/wxy)

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


Lisp 是怎么成为上帝的编程语言的

![](/data/attachment/album/201811/20/172313qm90n07uznrna1a1.jpg)

当程序员们谈论各类编程语言的相对优势时，他们通常会采用相当平淡的措词，就好像这些语言是一条工具带上的各种工具似的 —— 有适合写操作系统的，也有适合把其它程序黏在一起来完成特殊工作的。这种讨论方式非常合理；不同语言的能力不同。不声明特定用途就声称某门语言比其他语言更优秀只能导致侮辱性的无用争论。

但有一门语言似乎受到和用途无关的特殊尊敬：那就是 Lisp。即使是恨不得给每个说出形如“某某语言比其他所有语言都好”这类话的人都来一拳的键盘远征军们，也会承认 Lisp 处于另一个层次。 Lisp 超越了用于评判其他语言的实用主义标准，因为普通程序员并不使用 Lisp 编写实用的程序 —— 而且，多半他们永远也不会这么做。然而，人们对 Lisp 的敬意是如此深厚，甚至于到了这门语言会时而被加上神话属性的程度。

大家都喜欢的网络漫画合集 xkcd 就至少在两组漫画中如此描绘过 Lisp：[其中一组漫画](https://xkcd.com/224/)中，某人得到了某种 Lisp 启示，而这好像使他理解了宇宙的基本构架。

![](/data/attachment/album/201811/20/171504x6sgg5ghbxg12rey.jpg)

在[另一组漫画](https://xkcd.com/297/)中，一个穿着长袍的老程序员给他的徒弟递了一沓圆括号，说这是“文明时代的优雅武器”，暗示着 Lisp 就像原力那样拥有各式各样的神秘力量。

![](/data/attachment/album/201811/20/171505edp3pz4eytpxywsc.png)

另一个绝佳例子是 Bob Kanefsky 的滑稽剧插曲，《上帝就在人间》。这部剧叫做《永恒之火》，撰写于 1990 年代中期；剧中描述了上帝必然是使用 Lisp 创造世界的种种原因。完整的歌词可以在 [GNU 幽默合集](https://www.gnu.org/fun/jokes/eternal-flame.en.html)中找到，如下是一段摘抄：

>
> 因为上帝用祂的 Lisp 代码
>
>
> 让树叶充满绿意。
>
>
> 分形的花儿和递归的根：
>
>
> 我见过的奇技淫巧之中没什么比这更可爱。
>
>
> 当我对着雪花深思时，
>
>
> 从未见过两片相同的，
>
>
> 我知道，上帝偏爱那一门
>
>
> 名字是四个字母的语言。
>
>
>

（LCTT 译注：“四个字母”，参见：[四字神名](https://zh.wikipedia.org/wiki/%E5%9B%9B%E5%AD%97%E7%A5%9E%E5%90%8D)，致谢 [no1xsyzy](https://github.com/LCTT/TranslateProject/issues/11320)）

以下这句话我实在不好在人前说；不过，我还是觉得，这样一种 “Lisp 是奥术魔法”的文化模因实在是有史以来最奇异、最迷人的东西。Lisp 是象牙塔的产物，是人工智能研究的工具；因此，它对于编程界的俗人而言总是陌生的，甚至是带有神秘色彩的。然而，当今的程序员们[开始怂恿彼此，“在你死掉之前至少试一试 Lisp”](https://www.reddit.com/r/ProgrammerHumor/comments/5c14o6/xkcd_lisp/d9szjnc/)，就像这是一种令人恍惚入迷的致幻剂似的。尽管 Lisp 是广泛使用的编程语言中第二古老的（只比 Fortran 年轻一岁）   1  ，程序员们也仍旧在互相怂恿。想象一下，如果你的工作是为某种组织或者团队推广一门新的编程语言的话，忽悠大家让他们相信你的新语言拥有神力难道不是绝佳的策略吗？—— 但你如何能够做到这一点呢？或者，换句话说，一门编程语言究竟是如何变成人们口中“隐晦知识的载体”的呢？

Lisp 究竟是怎么成为这样的？

![Byte 杂志封面,1979年八月。](/data/attachment/album/201811/20/171510jy9911uyu1syvat1.jpg)

*Byte 杂志封面，1979年八月。*

### 理论 A ：公理般的语言

Lisp 的创造者<ruby> 约翰·麦卡锡 <rt>  John McCarthy </rt></ruby>最初并没有想过把 Lisp 做成优雅、精炼的计算法则结晶。然而，在一两次运气使然的深谋远虑和一系列优化之后，Lisp 的确变成了那样的东西。 <ruby> 保罗·格雷厄姆 <rt>  Paul Graham </rt></ruby>（我们一会儿之后才会聊到他）曾经这么写道， 麦卡锡通过 Lisp “为编程作出的贡献就像是欧几里得对几何学所做的贡献一般”    2 。人们可能会在 Lisp 中看出更加隐晦的含义 —— 因为麦卡锡创造 Lisp 时使用的要素实在是过于基础，基础到连弄明白他到底是创造了这门语言、还是发现了这门语言，都是一件难事。

最初， 麦卡锡产生要造一门语言的想法，是在 1956 年的<ruby> 达特茅斯人工智能夏季研究项目 <rt>  Darthmouth Summer Research Project on Artificial Intelligence </rt></ruby>上。夏季研究项目是个持续数周的学术会议，直到现在也仍旧在举行；它是此类会议之中最早开始举办的会议之一。 麦卡锡当初还是个达特茅斯的数学助教，而“<ruby> 人工智能 <rt>  artificial intelligence </rt></ruby>（AI）”这个词事实上就是他建议举办该会议时发明的    3 。在整个会议期间大概有十人参加    4 。他们之中包括了<ruby> 艾伦·纽厄尔 <rt>  Allen Newell </rt></ruby>和<ruby> 赫伯特·西蒙 <rt>  Herbert Simon </rt></ruby>，两名隶属于<ruby> 兰德公司 <rt>  RAND Corporation </rt></ruby>和<ruby> 卡内基梅隆大学 <rt>  Carnegie Mellon </rt></ruby>的学者。这两人不久之前设计了一门语言，叫做 IPL。

当时，纽厄尔和西蒙正试图制作一套能够在命题演算中生成证明的系统。两人意识到，用电脑的原生指令集编写这套系统会非常困难；于是他们决定创造一门语言——他们的原话是“<ruby> 伪代码 <rt>  pseudo-code </rt></ruby>”，这样，他们就能更加轻松自然地表达这台“<ruby> 逻辑理论机器 <rt>  Logic Theory Machine </rt></ruby>”的底层逻辑了    5 。这门语言叫做 IPL，即“<ruby> 信息处理语言 <rt>  Information Processing Language </rt></ruby>”；比起我们现在认知中的编程语言，它更像是一种高层次的汇编语言方言。 纽厄尔和西蒙提到，当时人们开发的其它“伪代码”都抓着标准数学符号不放 —— 也许他们指的是 Fortran    6 ；与此不同的是，他们的语言使用成组的符号方程来表示命题演算中的语句。通常，用 IPL 写出来的程序会调用一系列的汇编语言宏，以此在这些符号方程列表中对表达式进行变换和求值。

麦卡锡认为，一门实用的编程语言应该像 Fortran 那样使用代数表达式；因此，他并不怎么喜欢 IPL    7 。然而，他也认为，在给人工智能领域的一些问题建模时，符号列表会是非常好用的工具 —— 而且在那些涉及演绎的问题上尤其有用。麦卡锡的渴望最终被诉诸行动；他要创造一门代数的列表处理语言 —— 这门语言会像 Fortran 一样使用代数表达式，但拥有和 IPL 一样的符号列表处理能力。

当然，今日的 Lisp 可不像 Fortran。在会议之后的几年中，麦卡锡关于“理想的列表处理语言”的见解似乎在逐渐演化。到 1957 年，他的想法发生了改变。他那时候正在用 Fortran 编写一个能下国际象棋的程序；越是长时间地使用 Fortran ，麦卡锡就越确信其设计中存在不当之处，而最大的问题就是尴尬的 `IF` 声明    8 。为此，他发明了一个替代品，即条件表达式 `true`；这个表达式会在给定的测试通过时返回子表达式 `A` ，而在测试未通过时返回子表达式 `B` ，*而且*，它只会对返回的子表达式进行求值。在 1958 年夏天，当麦卡锡设计一个能够求导的程序时，他意识到，他发明的 `true` 条件表达式让编写递归函数这件事变得更加简单自然了    9 。也是这个求导问题让麦卡锡创造了 `maplist` 函数；这个函数会将其它函数作为参数并将之作用于指定列表的所有元素    10 。在给项数多得叫人抓狂的多项式求导时，它尤其有用。

然而，以上的所有这些，在 Fortran 中都是没有的；因此，在 1958 年的秋天，麦卡锡请来了一群学生来实现 Lisp。因为他那时已经成了一名麻省理工助教，所以，这些学生可都是麻省理工的学生。当麦卡锡和学生们最终将他的主意变为能运行的代码时，这门语言得到了进一步的简化。这之中最大的改变涉及了 Lisp 的语法本身。最初，麦卡锡在设计语言时，曾经试图加入所谓的 “M 表达式”；这是一层语法糖，能让 Lisp 的语法变得类似于 Fortran。虽然 M 表达式可以被翻译为 S 表达式 —— 基础的、“用圆括号括起来的列表”，也就是 Lisp 最著名的特征 —— 但 S 表达式事实上是一种给机器看的低阶表达方法。唯一的问题是，麦卡锡用方括号标记 M 表达式，但他的团队在麻省理工使用的 IBM 026 键盘打孔机的键盘上根本没有方括号    11 。于是 Lisp 团队坚定不移地使用着 S 表达式，不仅用它们表示数据列表，也拿它们来表达函数的应用。麦卡锡和他的学生们还作了另外几样改进，包括将数学符号前置；他们也修改了内存模型，这样 Lisp 实质上就只有一种数据类型了    12 。

到 1960 年，麦卡锡发表了他关于 Lisp 的著名论文，《用符号方程表示的递归函数及它们的机器计算》。那时候，Lisp 已经被极大地精简，而这让麦卡锡意识到，他的作品其实是“一套优雅的数学系统”，而非普通的编程语言    13 。他后来这么写道，对 Lisp 的许多简化使其“成了一种描述可计算函数的方式，而且它比图灵机或者一般情况下用于递归函数理论的递归定义更加简洁”    14 。在他的论文中，他不仅使用 Lisp 作为编程语言，也将它当作一套用于研究递归函数行为方式的表达方法。

通过“从一小撮规则中逐步实现出 Lisp”的方式，麦卡锡将这门语言介绍给了他的读者。后来，保罗·格雷厄姆在短文《<ruby>   Lisp 之根  <rt>  The Roots of Lisp </rt></ruby>》中用更易读的语言回顾了麦卡锡的步骤。格雷厄姆只用了七种原始运算符、两种函数写法，以及使用原始运算符定义的六个稍微高级一点的函数来解释 Lisp。毫无疑问，Lisp 的这种只需使用极少量的基本规则就能完整说明的特点加深了其神秘色彩。格雷厄姆称麦卡锡的论文为“使计算公理化”的一种尝试    15 。我认为，在思考 Lisp 的魅力从何而来时，这是一个极好的切入点。其它编程语言都有明显的人工构造痕迹，表现为 `While`，`typedef`，`public static void` 这样的关键词；而 Lisp 的设计却简直像是纯粹计算逻辑的鬼斧神工。Lisp 的这一性质，以及它和晦涩难懂的“递归函数理论”的密切关系，使它具备了获得如今声望的充分理由。

### 理论 B：属于未来的机器

Lisp 诞生二十年后，它成了著名的《<ruby>   黑客词典  <rt>  Hacker’s Dictionary </rt></ruby>》中所说的，人工智能研究的“母语”。Lisp 在此之前传播迅速，多半是托了语法规律的福 —— 不管在怎么样的电脑上，实现 Lisp 都是一件相对简单直白的事。而学者们之后坚持使用它乃是因为 Lisp 在处理符号表达式这方面有巨大的优势；在那个时代，人工智能很大程度上就意味着符号，于是这一点就显得十分重要。在许多重要的人工智能项目中都能见到 Lisp 的身影。这些项目包括了 [SHRDLU 自然语言程序](https://hci.stanford.edu/winograd/shrdlu/)、[Macsyma 代数系统](https://en.wikipedia.org/wiki/Macsyma) 和 [ACL2 逻辑系统](https://en.wikipedia.org/wiki/ACL2)。

然而，在 1970 年代中期，人工智能研究者们的电脑算力开始不够用了。PDP-10 就是一个典型。这个型号在人工智能学界曾经极受欢迎；但面对这些用 Lisp 写的 AI 程序，它的 18 位地址空间一天比一天显得吃紧    16 。许多的 AI 程序在设计上可以与人互动。要让这些既极度要求硬件性能、又有互动功能的程序在分时系统上优秀发挥，是很有挑战性的。麻省理工的<ruby> 彼得·杜奇 <rt>  Peter Deutsch </rt></ruby>给出了解决方案：那就是针对 Lisp 程序来特别设计电脑。就像是我那[关于 Chaosnet 的上一篇文章](https://twobithistory.org/2018/09/30/chaosnet.html)所说的那样，这些<ruby> Lisp 计算机 <rt>  Lisp machines </rt></ruby>会给每个用户都专门分配一个为 Lisp 特别优化的处理器。到后来，考虑到硬核 Lisp 程序员的需求，这些计算机甚至还配备上了完全由 Lisp 编写的开发环境。在当时那样一个小型机时代已至尾声而微型机的繁盛尚未完全到来的尴尬时期，Lisp 计算机就是编程精英们的“高性能个人电脑”。

有那么一会儿，Lisp 计算机被当成是未来趋势。好几家公司雨后春笋般出现，追着赶着要把这项技术商业化。其中最成功的一家叫做 Symbolics，由麻省理工 AI 实验室的前成员创立。上世纪八十年代，这家公司生产了所谓的 3600 系列计算机，它们当时在 AI 领域和需要高性能计算的产业中应用极广。3600 系列配备了大屏幕、位图显示、鼠标接口，以及[强大的图形与动画软件](https://youtu.be/gV5obrYaogU?t=201)。它们都是惊人的机器，能让惊人的程序运行起来。例如，之前在推特上跟我聊过的机器人研究者 Bob Culley，就能用一台 1985 年生产的 Symbolics 3650 写出带有图形演示的寻路算法。他向我解释说，在 1980 年代，位图显示和面向对象编程（能够通过 [Flavors 扩展](https://en.wikipedia.org/wiki/Flavors_(programming_language))在 Lisp 计算机上使用）都刚刚出现。Symbolics 站在时代的最前沿。

![Bob Culley 的寻路程序。](/data/attachment/album/201811/20/171510lw4x5e6sx9usgwj4.jpg)

*Bob Culley 的寻路程序。*

而以上这一切导致 Symbolics 的计算机奇贵无比。在 1983 年，一台 Symbolics 3600 能卖 111,000 美金    16 。所以，绝大部分人只可能远远地赞叹 Lisp 计算机的威力和操作员们用 Lisp 编写程序的奇妙技术。不止他们赞叹，从 1979 年到 1980 年代末，Byte 杂志曾经多次提到过 Lisp 和 Lisp 计算机。在 1979 年八月发行的、关于 Lisp 的一期特别杂志中，杂志编辑激情洋溢地写道，麻省理工正在开发的计算机配备了“大坨大坨的内存”和“先进的操作系统”    17 ；他觉得，这些 Lisp 计算机的前途是如此光明，以至于它们的面世会让 1978 和 1977 年 —— 诞生了 Apple II、Commodore PET 和 TRS-80 的两年 —— 显得黯淡无光。五年之后，在 1985 年，一名 Byte 杂志撰稿人描述了为“复杂精巧、性能强悍的 Symbolics 3670”编写 Lisp 程序的体验，并力劝读者学习 Lisp，称其为“绝大数人工智能工作者的语言选择”，和将来的通用编程语言    18 。

我问过<ruby> 保罗·麦克琼斯 <rt>  Paul McJones </rt></ruby>（他在<ruby> 山景城 <rt>  Mountain View </rt> <rt> </rt></ruby>的<ruby> 计算机历史博物馆 <rt>  Computer History Museum </rt></ruby>做了许多 Lisp 的[保护工作](http://www.softwarepreservation.org/projects/LISP/)），人们是什么时候开始将 Lisp 当作高维生物的赠礼一样谈论的呢？他说，这门语言自有的性质毋庸置疑地促进了这种现象的产生；然而，他也说，Lisp 上世纪六七十年代在人工智能领域得到的广泛应用，很有可能也起到了作用。当 1980 年代到来、Lisp 计算机进入市场时，象牙塔外的某些人由此接触到了 Lisp 的能力，于是传说开始滋生。时至今日，很少有人还记得 Lisp 计算机和 Symbolics 公司；但 Lisp 得以在八十年代一直保持神秘，很大程度上要归功于它们。

### 理论 C：学习编程

1985 年，两位麻省理工的教授，<ruby> 哈尔·阿伯尔森 <rt>  Harold  <q>   Hal  </q>  Abelson </rt></ruby>和<ruby> 杰拉尔德·瑟斯曼 <rt>  Gerald Sussman </rt></ruby>，外加瑟斯曼的妻子<ruby> 朱莉·瑟斯曼 <rt>  Julie Sussman </rt></ruby>，出版了一本叫做《<ruby> 计算机程序的构造和解释 <rt>  Structure and Interpretation of Computer Programs </rt></ruby>》的教科书。这本书用 Scheme（一种 Lisp 方言）向读者们示范了如何编程。它被用于教授麻省理工入门编程课程长达二十年之久。出于直觉，我认为 SICP（这本书的名字通常缩写为 SICP）倍增了 Lisp 的“神秘要素”。SICP 使用 Lisp 描绘了深邃得几乎可以称之为哲学的编程理念。这些理念非常普适，可以用任意一种编程语言展现；但 SICP 的作者们选择了 Lisp。结果，这本阴阳怪气、卓越不凡、吸引了好几代程序员（还成了一种[奇特的模因](https://knowyourmeme.com/forums/meme-research/topics/47038-structure-and-interpretation-of-computer-programs-hugeass-image-dump-for-evidence)）的著作臭名远扬之后，Lisp 的声望也顺带被提升了。Lisp 已不仅仅是一如既往的“麦卡锡的优雅表达方式”；它现在还成了“向你传授编程的不传之秘的语言”。

SICP 究竟有多奇怪这一点值得好好说；因为我认为，时至今日，这本书的古怪之处和 Lisp 的古怪之处是相辅相成的。书的封面就透着一股古怪。那上面画着一位朝着桌子走去，准备要施法的巫师或者炼金术士。他的一只手里抓着一副测径仪 —— 或者圆规，另一只手上拿着个球，上书“eval”和“apply”。他对面的女人指着桌子；在背景中，希腊字母 λ （lambda）漂浮在半空，释放出光芒。

![SICP 封面上的画作](/data/attachment/album/201811/20/171512jueceanmca9whatm.jpg)

*SICP 封面上的画作。*

说真的，这上面画的究竟是怎么一回事？为什么桌子会长着动物的腿？为什么这个女人指着桌子？墨水瓶又是干什么用的？我们是不是该说，这位巫师已经破译了宇宙的隐藏奥秘，而所有这些奥秘就蕴含在 eval/apply 循环和 Lambda 演算之中？看似就是如此。单单是这张图片，就一定对人们如今谈论 Lisp 的方式产生了难以计量的影响。

然而，这本书的内容通常并不比封面正常多少。SICP 跟你读过的所有计算机科学教科书都不同。在引言中，作者们表示，这本书不只教你怎么用 Lisp 编程 —— 它是关于“现象的三个焦点：人的心智、复数的计算机程序，和计算机”的作品    19 。在之后，他们对此进行了解释，描述了他们对如下观点的坚信：编程不该被当作是一种计算机科学的训练，而应该是“<ruby> 程序性认识论 <rt>  procedural epistemology </rt></ruby>”的一种新表达方式    20 。程序是将那些偶然被送入计算机的思想组织起来的全新方法。这本书的第一章简明地介绍了 Lisp，但是之后的绝大部分都在讲述更加抽象的概念。其中包括了对不同编程范式的讨论，对于面向对象系统中“时间”和“一致性”的讨论；在书中的某一处，还有关于通信的基本限制可能会如何带来同步问题的讨论 —— 而这些基本限制在通信中就像是光速不变在相对论中一样关键    21 。都是些高深难懂的东西。

以上这些并不是说这是本糟糕的书；这本书其实棒极了。在我读过的所有作品中，这本书对于重要的编程理念的讨论是最为深刻的；那些理念我琢磨了很久，却一直无力用文字去表达。一本入门编程教科书能如此迅速地开始描述面向对象编程的根本缺陷，和函数式语言“将可变状态降到最少”的优点，实在是一件让人印象深刻的事。而这种描述之后变为了另一种震撼人心的讨论：某种（可能类似于今日的 [RxJS](https://rxjs-dev.firebaseapp.com/) 的）流范式能如何同时具备两者的优秀特性。SICP 用和当初麦卡锡的 Lisp 论文相似的方式提纯出了高级程序设计的精华。你读完这本书之后，会立即想要将它推荐给你的程序员朋友们；如果他们找到这本书，看到了封面，但最终没有阅读的话，他们就只会记住长着动物腿的桌子上方那神秘的、根本的、给予魔法师特殊能力的、写着 eval/apply 的东西。话说回来，书上这两人的鞋子也让我印象颇深。

然而，SICP 最重要的影响恐怕是，它将 Lisp 由一门怪语言提升成了必要的教学工具。在 SICP 面世之前，人们互相推荐 Lisp，以学习这门语言为提升编程技巧的途径。1979 年的 Byte 杂志 Lisp 特刊印证了这一事实。之前提到的那位编辑不仅就麻省理工的新 Lisp 计算机大书特书，还说，Lisp 这门语言值得一学，因为它“代表了分析问题的另一种视角”    22 。但 SICP 并未只把 Lisp 作为其它语言的陪衬来使用；SICP 将其作为*入门*语言。这就暗含了一种论点，那就是，Lisp 是最能把握计算机编程基础的语言。可以认为，如今的程序员们彼此怂恿“在死掉之前至少试试 Lisp”的时候，他们很大程度上是因为 SICP 才这么说的。毕竟，编程语言 [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck) 想必同样也提供了“分析问题的另一种视角”；但人们学习 Lisp 而非学习 Brainfuck，那是因为他们知道，前者的那种 Lisp 视角在二十年中都被看作是极其有用的，有用到麻省理工在给他们的本科生教其它语言之前，必然会先教 Lisp。

### Lisp 的回归

在 SICP 出版的同一年，<ruby> 本贾尼·斯特劳斯特卢普 <rt>  Bjarne Stroustrup </rt></ruby>发布了 C++ 语言的首个版本，它将面向对象编程带到了大众面前。几年之后，Lisp 计算机的市场崩盘，AI 寒冬开始了。在下一个十年的变革中， C++ 和后来的 Java 成了前途无量的语言，而 Lisp 被冷落，无人问津。

理所当然地，确定人们对 Lisp 重新燃起热情的具体时间并不可能；但这多半是保罗·格雷厄姆发表他那几篇声称 Lisp 是首选入门语言的短文之后的事了。保罗·格雷厄姆是 Y-Combinator 的联合创始人和《Hacker News》的创始者，他这几篇短文有很大的影响力。例如，在短文《<ruby>   胜于平庸  <rt>  Beating the Averages </rt></ruby>》中，他声称 Lisp 宏使 Lisp 比其它语言更强。他说，因为他在自己创办的公司 Viaweb 中使用 Lisp，他得以比竞争对手更快地推出新功能。至少，[一部分程序员](https://web.archive.org/web/20061004035628/http://wiki.alu.org/Chris-Perkins)被说服了。然而，庞大的主流程序员群体并未换用 Lisp。

实际上出现的情况是，Lisp 并未流行，但越来越多 Lisp 式的特性被加入到广受欢迎的语言中。Python 有了列表推导式。C# 有了 Linq。Ruby……嗯，[Ruby 是 Lisp 的一种](http://www.randomhacks.net/2005/12/03/why-ruby-is-an-acceptable-lisp/)。就如格雷厄姆之前在 2001 年提到的那样，“在一系列常用语言中所体现出的‘默认语言’正越发朝着 Lisp 的方向演化”    23 。尽管其它语言变得越来越像 Lisp，Lisp 本身仍然保留了其作为“很少人了解但是大家都该学的神秘语言”的特殊声望。在 1980 年，Lisp 的诞生二十周年纪念日上，麦卡锡写道，Lisp 之所以能够存活这么久，是因为它具备“编程语言领域中的某种近似局部最优”    24 。这句话并未充分地表明 Lisp 的真正影响力。Lisp 能够存活超过半个世纪之久，并非因为程序员们一年年地勉强承认它就是最好的编程工具；事实上，即使绝大多数程序员根本不用它，它还是存活了下来。多亏了它的起源和它的人工智能研究用途，说不定还要多亏 SICP 的遗产，Lisp 一直都那么让人着迷。在我们能够想象上帝用其它新的编程语言创造世界之前，Lisp 都不会走下神坛。

---

via: <https://twobithistory.org/2018/10/14/lisp.html>

作者：[Two-Bit History](https://twobithistory.org) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Northurland](https://github.com/Northurland) 校对：[wxy](https://github.com/wxy)

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

---

1. John McCarthy, “History of Lisp”, 14, Stanford University, February 12, 1979, accessed October 14, 2018, <http://jmc.stanford.edu/articles/lisp/lisp.pdf> [↩](#fnref1)
2. Paul Graham, “The Roots of Lisp”, 1, January 18, 2002, accessed October 14, 2018, <http://languagelog.ldc.upenn.edu/myl/llog/jmc.pdf>. [↩](#fnref2)
3. Martin Childs, “John McCarthy: Computer scientist known as the father of AI”, The Independent, November 1, 2011, accessed on October 14, 2018, <https://www.independent.co.uk/news/obituaries/john-mccarthy-computer-scientist-known-as-the-father-of-ai-6255307.html>. [↩](#fnref3)
4. Lisp Bulletin History. <http://www.artinfo-musinfo.org/scans/lb/lb3f.pdf> [↩](#fnref4)
5. Allen Newell and Herbert Simon, “Current Developments in Complex Information Processing,” 19, May 1, 1956, accessed on October 14, 2018, <http://bitsavers.org/pdf/rand/ipl/P-850_Current_Developments_In_Complex_Information_Processing_May56.pdf>. [↩](#fnref5)
6. ibid. [↩](#fnref6)
7. Herbert Stoyan, “Lisp History”, 43, Lisp Bulletin #3, December 1979, accessed on October 14, 2018, <http://www.artinfo-musinfo.org/scans/lb/lb3f.pdf> [↩](#fnref7)
8. McCarthy, “History of Lisp”, 5. [↩](#fnref8)
9. ibid. [↩](#fnref9)
10. McCarthy “History of Lisp”, 6. [↩](#fnref10)
11. Stoyan, “Lisp History”, 45 [↩](#fnref11)
12. McCarthy, “History of Lisp”, 8. [↩](#fnref12)
13. McCarthy, “History of Lisp”, 2. [↩](#fnref13)
14. McCarthy, “History of Lisp”, 8. [↩](#fnref14)
15. Graham, “The Roots of Lisp”, 11. [↩](#fnref15)
16. Guy Steele and Richard Gabriel, “The Evolution of Lisp”, 22, History of Programming Languages 2, 1993, accessed on October 14, 2018, <http://www.dreamsongs.com/Files/HOPL2-Uncut.pdf>. [↩](#fnref16) [↩ 1](#fnref16:1)
17. Carl Helmers, “Editorial”, Byte Magazine, 154, August 1979, accessed on October 14, 2018, <https://archive.org/details/byte-magazine-1979-08/page/n153>. [↩](#fnref17)
18. Patrick Winston, “The Lisp Revolution”, 209, April 1985, accessed on October 14, 2018, <https://archive.org/details/byte-magazine-1985-04/page/n207>. [↩](#fnref18)
19. Harold Abelson, Gerald Jay. Sussman, and Julie Sussman, Structure and Interpretation of Computer Programs (Cambridge, Mass: MIT Press, 2010), xiii. [↩](#fnref19)
20. Abelson, xxiii. [↩](#fnref20)
21. Abelson, 428. [↩](#fnref21)
22. Helmers, 7. [↩](#fnref22)
23. Paul Graham, “What Made Lisp Different”, December 2001, accessed on October 14, 2018, <http://www.paulgraham.com/diff.html>. [↩](#fnref23)
24. John McCarthy, “Lisp—Notes on its past and future”, 3, Stanford University, 1980, accessed on October 14, 2018, <http://jmc.stanford.edu/articles/lisp20th/lisp20th.pdf>. [↩](#fnref24)


Dropbox 在 Linux 上终止除了 Ext4 之外所有文件系统的同步支持

>
> Dropbox 正考虑将同步支持限制为少数几种文件系统类型：Windows 的 NTFS、macOS 的 HFS+/APFS 和 Linux 的 Ext4。
>
>
>

![Dropbox ends support for various file system types](/data/attachment/album/201811/20/212232ol1yfli78q7z8z8i.png)

[Dropbox](https://www.dropbox.com/) 是最受欢迎的 [Linux 中的云服务](https://itsfoss.com/cloud-services-linux/)之一。很多人都在使用 Linux 下的 Dropbox 同步客户端。但是，最近，一些用户在他们的 Dropbox Linux 桌面客户端上收到一条警告说：

>
> “移动 Dropbox 文件夹位置， Dropbox 将在 11 月停止同步“
>
>
>

### Dropbox 将仅支持少量文件系统

一个 [Reddit 主题](https://www.reddit.com/r/linux/comments/966xt0/linux_dropbox_client_will_stop_syncing_on_any/)强调了一位用户在 [Dropbox 论坛](https://www.dropboxforum.com/t5/Syncing-and-uploads/)上查询了该消息后的公告，该消息被社区管理员标记为意外新闻。这是[回复](https://www.dropboxforum.com/t5/Syncing-and-uploads/Linux-Dropbox-client-warn-me-that-it-ll-stop-syncing-in-Nov-why/m-p/290065/highlight/true#M42255)中的内容：

>
> “大家好，在 2018 年 11 月 7 日，我们会结束 Dropbox 在某些不常见文件系统的同步支持。支持的文件系统是 Windows 的 NTFS、macOS 的 HFS+ 或 APFS，以及Linux 的 Ext4。
>
>
> [Dropbox 官方论坛](https://www.dropboxforum.com/t5/Syncing-and-uploads/Linux-Dropbox-client-warn-me-that-it-ll-stop-syncing-in-Nov-why/m-p/290065/highlight/true#M42255)
>
>
>

![Dropbox official confirmation over limitation on supported file systems](/data/attachment/album/201811/20/212235hgeeeas6nos2n6ze.jpg)

*Dropbox 官方确认支持文件系统的限制*

此举旨在提供稳定和一致的体验。Dropbox 还更新了其[桌面要求](https://www.dropbox.com/help/desktop-web/system-requirements#desktop)。

### 那你该怎么办？

如果你在不受支持的文件系统上使用 Dropbox 进行同步，那么应该考虑更改位置。

Linux 仅支持 Ext4 文件系统。但这并不是一个令人担忧的新闻，因为你可能已经在使用 Ext4 文件系统了。

在 Ubuntu 或其他基于 Ubuntu 的发行版上，打开磁盘应用并查看 Linux 系统所在分区的文件系统。

![Check file system type on Ubuntu](/data/attachment/album/201811/20/212236fuzkjo83q8683zq0.jpg)

*检查 Ubuntu 上的文件系统类型*

如果你的系统上没有安装磁盘应用，那么可以[使用命令行了解文件系统类型](https://www.thegeekstuff.com/2011/04/identify-file-system-type/)。

如果你使用的是 Ext4 文件系统并仍然收到来自 Dropbox 的警告，请检查你是否有可能收到通知的非活动计算机/设备。如果是，[将该系统与你的 Dropbox 帐户取消连接](https://www.dropbox.com/help/mobile/unlink-relink-computer-mobile)。

### Dropbox 也不支持加密的 Ext4 吗？

一些用户还报告说他们在加密 Ext4 文件系统同步时也收到了警告。那么，这是否意味着 Linux 的 Dropbox 客户端只支持未加密的 Ext4 文件系统？这方面 Dropbox 没有官方声明。

你使用的是什么文件系统？你也收到了警告吗？如果你在收到警告后仍不确定该怎么做，你应该前往该方案的[官方帮助中心页面](https://www.dropbox.com/help/desktop-web/cant-establish-secure-connection#location)。

请在下面的评论中告诉我们你的想法。

---

via: <https://itsfoss.com/dropbox-linux-ext4-only/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[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/) 荣誉推出


服务器的 LinuxBoot：告别 UEFI、拥抱开源

Summary: LinuxBoot 是私有的 UEFI 固件的开源 替代品。它发布于去年，并且现在已经得到主流的硬件生产商的认可成为他们产品的默认固件。去年，LinuxBoot 已经被 Linux 基金会接受并纳入开源家族。

不支持windows怎么和uefi竞争，扯淡。

GPL的软件。敢跟BSD的比？

[LinuxBoot](https://www.linuxboot.org/) 是私有的 [UEFI](https://itsfoss.com/check-uefi-or-bios/) 固件的开源 [替代品](https://www.phoronix.com/scan.php?page=news_item&px=LinuxBoot-OSFC-2018-State)。它发布于去年，并且现在已经得到主流的硬件生产商的认可成为他们产品的默认固件。去年，LinuxBoot 已经被 Linux 基金会接受并[纳入](https://www.linuxfoundation.org/blog/2018/01/system-startup-gets-a-boost-with-new-linuxboot-project/)开源家族。

这个项目最初是由 Ron Minnich 在 2017 年 1 月提出，它是 LinuxBIOS 的创造人，并且在 Google 领导 [coreboot](https://en.wikipedia.org/wiki/Coreboot) 的工作。

Google、Facebook、[Horizon Computing Solutions](http://www.horizon-computing.com/)、和 [Two Sigma](https://www.twosigma.com/) 共同合作，在运行 Linux 的服务器上开发 [LinuxBoot 项目](https://trmm.net/LinuxBoot_34c3)（以前叫 [NERF](https://trmm.net/NERF)）。

它的开放性允许服务器用户去很容易地定制他们自己的引导脚本、修复问题、构建他们自己的 [运行时环境](https://trmm.net/LinuxBoot_34c3#Runtimes) 和用他们自己的密钥去 [刷入固件](http://www.tech-faq.com/flashing-firmware.html)，而不需要等待供应商的更新。

下面是第一次使用 NERF BIOS 去引导 [Ubuntu Xenial](https://itsfoss.com/features-ubuntu-1604/) 的视频：

我们来讨论一下它与 UEFI 相比在服务器硬件方面的其它优势。

### LinuxBoot 超越 UEFI 的优势

![LinuxBoot vs UEFI](/data/attachment/album/201811/20/222027o6lrh88h8g9z2ap8.png)

下面是一些 LinuxBoot 超越 UEFI 的主要优势：

#### 启动速度显著加快

它能在 20 秒钟以内完成服务器启动，而 UEFI 需要几分钟的时间。

#### 显著的灵活性

LinuxBoot 可以用在 Linux 支持的各种设备、文件系统和协议上。

#### 更加安全

相比 UEFI 而言，LinuxBoot 在设备驱动程序和文件系统方面进行更加严格的检查。

我们可能争辩说 UEFI 是使用 [EDK II](https://www.tianocore.org/) 而部分开源的，而 LinuxBoot 是部分闭源的。但有人[提出](https://media.ccc.de/v/34c3-9056-bringing_linux_back_to_server_boot_roms_with_nerf_and_heads)，即便有像 EDK II 这样的代码，但也没有做适当的审查级别和像 [Linux 内核](https://medium.com/@bhumikagoyal/linux-kernel-development-cycle-52b4c55be06e) 那样的正确性检查，并且在 UEFI 的开发中还大量使用闭源组件。

另一方面，LinuxBoot 有非常小的二进制文件，它仅用了大约几百 KB，相比而言，而 UEFI 的二进制文件有 32 MB。

严格来说，LinuxBoot 与 UEFI 不一样，更适合于[可信计算基础](https://en.wikipedia.org/wiki/Trusted_computing_base)。

LinuxBoot 有一个基于 [kexec](https://en.wikipedia.org/wiki/Kexec) 的引导加载器，它不支持启动 Windows/非 Linux 内核，但这影响并不大，因为主流的云都是基于 Linux 的服务器。

### LinuxBoot 的采用者

自 2011 年， [Facebook](https://github.com/facebook) 发起了[开源计算项目（OCP）](https://en.wikipedia.org/wiki/Open_Compute_Project)，它的一些服务器是基于[开源](https://github.com/opencomputeproject)设计的，目的是构建的数据中心更加高效。LinuxBoot 已经在下面列出的几个开源计算硬件上做了测试：

* Winterfell
* Leopard
* Tioga Pass

更多 [OCP](https://www.networkworld.com/article/3266293/lan-wan/what-is-the-open-compute-project.html) 硬件在[这里](http://hyperscaleit.com/ocp-server-hardware/)有一个简短的描述。OCP 基金会通过[开源系统固件](https://www.opencompute.org/projects/open-system-firmware)运行一个专门的固件项目。

支持 LinuxBoot 的其它一些设备有：

* [QEMU](https://en.wikipedia.org/wiki/QEMU) 仿真的 [Q35](https://wiki.qemu.org/Features/Q35) 系统
* [Intel S2600wf](https://trmm.net/S2600)
* [Dell R630](https://trmm.net/NERF#Installing_on_a_Dell_R630)

上个月底（2018 年 9 月 24 日），[Equus 计算解决方案](https://www.equuscs.com/) [宣布](http://www.dcvelocity.com/products/Software_-_Systems/20180924-equus-compute-solutions-introduces-whitebox-open-m2660-and-m2760-servers/) 发行它的 [白盒开放式™](https://www.equuscs.com/servers/whitebox-open/) M2660 和 M2760 服务器，作为它们的定制的、成本优化的、开放硬件服务器和存储平台的一部分。它们都支持 LinuxBoot 灵活定制服务器的 BIOS，以提升安全性和设计一个非常快的纯净的引导体验。

### 你认为 LinuxBoot 怎么样？

LinuxBoot 在 [GitHub](https://github.com/linuxboot/linuxboot) 上有很丰富的文档。你喜欢它与 UEFI 不同的特性吗？由于 LinuxBoot 的开放式开发和未来，你愿意使用 LinuxBoot 而不是 UEFI 去启动你的服务器吗？请在下面的评论区告诉我们吧。

---

via: <https://itsfoss.com/linuxboot-uefi/>

作者：[Avimanyu Bandyopadhyay](https://itsfoss.com/author/avimanyu/) 选题：[oska874](https://github.com/oska874) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


命令行快速技巧：如何定位一个文件

Summary: Linux 命令行专门设计了很多非常有用的命令行工具在你的电脑上查找文件。下面我们看一下它们其中三个：ls、tree 和 find。

![](/data/attachment/album/201811/20/225752o2klz0gnwwmbzust.jpg)

我们都会有文件存储在电脑里 —— 目录、相片、源代码等等。它们是如此之多。也无疑超出了我的记忆范围。要是毫无目标，找到正确的那一个可能会很费时间。在这篇文章里我们来看一下如何在命令行里找到需要的文件，特别是快速找到你想要的那一个。

好消息是 Linux 命令行专门设计了很多非常有用的命令行工具在你的电脑上查找文件。下面我们看一下它们其中三个：`ls`、`tree` 和 `find`。

### ls

如果你知道文件在哪里，你只需要列出它们或者查看有关它们的信息，`ls` 就是为此而生的。

只需运行 `ls` 就可以列出当下目录中所有可见的文件和目录：

```
$ ls
Documents Music Pictures Videos notes.txt
```

添加 `-l` 选项可以查看文件的相关信息。同时再加上 `-h` 选项，就可以用一种人们易读的格式查看文件的大小：

```
$ ls -lh
total 60K
drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Documents
drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Music
drwxr-xr-x 2 adam adam 4.0K Nov 2 13:13 Pictures
drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Videos
-rw-r--r-- 1 adam adam 43K Nov 2 13:12 notes.txt
```

`ls` 也可以搜索一个指定位置：

```
$ ls Pictures/
trees.png wallpaper.png
```

或者一个指定文件 —— 即便只跟着名字的一部分：

```
$ ls *.txt
notes.txt
```

少了点什么？想要查看一个隐藏文件？没问题，使用 `-a` 选项：

```
$ ls -a
. .bash_logout .bashrc Documents Pictures notes.txt
.. .bash_profile .vimrc Music Videos
```

`ls` 还有很多其他有用的选项，你可以把它们组合在一起获得你想要的效果。可以使用以下命令了解更多：

```
$ man ls
```

### tree

如果你想查看你的文件的树状结构，`tree` 是一个不错的选择。可能你的系统上没有默认安装它，你可以使用包管理 DNF 手动安装：

```
$ sudo dnf install tree
```

如果不带任何选项或者参数地运行 `tree`，将会以当前目录开始，显示出包含其下所有目录和文件的一个树状图。提醒一下，这个输出可能会非常大，因为它包含了这个目录下的所有目录和文件：

```
$ tree
.
|-- Documents
| |-- notes.txt
| |-- secret
| | `-- christmas-presents.txt
| `-- work
| |-- project-abc
| | |-- README.md
| | |-- do-things.sh
| | `-- project-notes.txt
| `-- status-reports.txt
|-- Music
|-- Pictures
| |-- trees.png
| `-- wallpaper.png
|-- Videos
`-- notes.txt
```

如果列出的太多了，使用 `-L` 选项，并在其后加上你想查看的层级数，可以限制列出文件的层级：

```
$ tree -L 2
.
|-- Documents
| |-- notes.txt
| |-- secret
| `-- work
|-- Music
|-- Pictures
| |-- trees.png
| `-- wallpaper.png
|-- Videos
`-- notes.txt
```

你也可以显示一个指定目录的树状图：

```
$ tree Documents/work/
Documents/work/
|-- project-abc
| |-- README.md
| |-- do-things.sh
| `-- project-notes.txt
`-- status-reports.txt
```

如果使用 `tree` 列出的是一个很大的树状图，你可以把它跟 `less` 组合使用：

```
$ tree | less
```

再一次，`tree` 有很多其他的选项可以使用，你可以把他们组合在一起发挥更强大的作用。man 手册页有所有这些选项：

```
$ man tree
```

### find

那么如果不知道文件在哪里呢？就让我们来找到它们吧！

要是你的系统中没有 `find`，你可以使用 DNF 安装它：

```
$ sudo dnf install findutils
```

运行 `find` 时如果没有添加任何选项或者参数，它将会递归列出当前目录下的所有文件和目录。

```
$ find
.
./Documents
./Documents/secret
./Documents/secret/christmas-presents.txt
./Documents/notes.txt
./Documents/work
./Documents/work/status-reports.txt
./Documents/work/project-abc
./Documents/work/project-abc/README.md
./Documents/work/project-abc/do-things.sh
./Documents/work/project-abc/project-notes.txt
./.bash_logout
./.bashrc
./Videos
./.bash_profile
./.vimrc
./Pictures
./Pictures/trees.png
./Pictures/wallpaper.png
./notes.txt
./Music
```

但是 `find` 真正强大的是你可以使用文件名进行搜索：

```
$ find -name do-things.sh
./Documents/work/project-abc/do-things.sh
```

或者仅仅是名字的一部分 —— 像是文件后缀。我们来找一下所有的 .txt 文件：

```
$ find -name "*.txt"
./Documents/secret/christmas-presents.txt
./Documents/notes.txt
./Documents/work/status-reports.txt
./Documents/work/project-abc/project-notes.txt
./notes.txt
```

你也可以根据大小寻找文件。如果你的空间不足的时候，这种方法也许特别有用。现在来列出所有大于 1 MB 的文件：

```
$ find -size +1M
./Pictures/trees.png
./Pictures/wallpaper.png
```

当然也可以搜索一个具体的目录。假如我想在我的 Documents 文件夹下找一个文件，而且我知道它的名字里有 “project” 这个词：

```
$ find Documents -name "*project*"
Documents/work/project-abc
Documents/work/project-abc/project-notes.txt
```

除了文件它还显示目录。你可以限制仅搜索查询文件：

```
$ find Documents -name "*project*" -type f
Documents/work/project-abc/project-notes.txt
```

最后再一次，`find` 还有很多供你使用的选项，要是你想使用它们，man 手册页绝对可以帮到你：

```
$ man find
```

---

via: <https://fedoramagazine.org/commandline-quick-tips-locate-file/>

作者：[Adam Šamalík](https://fedoramagazine.org/author/asamalik/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[dianbanjiu](https://github.com/dianbanjiu) 校对：[wxy](https://github.com/wxy)

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


CPod：一个开源、跨平台播客应用

Summary: 播客是一个很好的娱乐和获取信息的方式。事实上，我会听十几个不同的播客，包括技术、神秘事件、历史和喜剧。当然，Linux 播客也在此列表中。

播客是一个很好的娱乐和获取信息的方式。事实上，我会听十几个不同的播客，包括技术、神秘事件、历史和喜剧。当然，[Linux 播客](https://itsfoss.com/linux-podcasts/)也在此列表中。

今天，我们将看一个简单的跨平台应用来收听你的播客。

![](/data/attachment/album/201811/21/100758m1gj1ajebibeabjj.jpg)

### 应用程序

[CPod](https://github.com/z-------------/CPod) 是 [Zack Guard（z————-）](https://github.com/z-------------) 的作品。**它是一个 [Election](https://electronjs.org/) 程序**，这使它能够在大多数操作系统（Linux、Windows、Mac OS）上运行。

>
> 一个小事：CPod 最初被命名为 Cumulonimbus。
>
>
>

应用的大部分被两个面板占用，来显示内容和选项。屏幕左侧的小条让你可以使用应用的不同功能。CPod 的不同栏目包括主页、队列、订阅、浏览和设置。

![cpod settings](/data/attachment/album/201811/21/100805sk3kcwwlrhkjphjj.png)

*设置*

### CPod 的功能

以下是 CPod 提供的功能列表：

* 简洁，干净的设计
* 可在主流计算机平台上使用
* 有 Snap 包
* 搜索 iTunes 的播客目录
* 可下载也可无需下载就播放节目
* 查看播客信息和节目
* 搜索播客的个别节目
* 深色模式
* 改变播放速度
* 键盘快捷键
* 将你的播客订阅与 gpodder.net 同步
* 导入和导出订阅
* 根据长度、日期、下载状态和播放进度对订阅进行排序
* 在应用启动时自动获取新节目
* 多语言支持

![search option in cpod application](/data/attachment/album/201811/21/100806cwpdpmwkkvedmkup.jpg)

*搜索 ZFS 节目*

### 在 Linux 上体验 CPod

我最后在两个系统上安装了 CPod：ArchLabs 和 Windows。[Arch 用户仓库](https://aur.archlinux.org/packages/?O=0&K=cpod) 中有两个版本的 CPod。但是，它们都已过时，一个是版本 1.14.0，另一个是 1.22.6。最新版本的 CPod 是 1.27.0。由于 ArchLabs 和 Windows 之间的版本差异，我的体验有所不同。在本文中，我将重点关注 1.27.0，因为它是最新且功能最多的。

我马上能够找到我最喜欢的播客。我可以粘贴 RSS 源的 URL 来添加 iTunes 列表中没有的那些播客。

找到播客的特定节目也很容易。例如，我最近在寻找 [Late Night Linux](https://latenightlinux.com/) 中的一集，这集中他们在谈论 [ZFS](https://itsfoss.com/what-is-zfs/)。我点击播客，在搜索框中输入 “ZFS” 然后找到了它。

我很快发现播放一堆播客节目的最简单方法是将它们添加到队列中。一旦它们进入队列，你可以流式传输或下载它们。你也可以通过拖放重新排序它们。每集在播放时，它会显示可视化的声波以及节目摘要。

### 安装 CPod

在 [GitHub](https://github.com/z-------------/CPod/releases) 上，你可以下载适用于 Linux 的 AppImage 或 Deb 文件，适用于 Windows 的 .exe 文件或适用于 Mac OS 的 .dmg 文件。

你可以使用 [Snap](https://snapcraft.io/cumulonimbus) 安装 CPod。你需要做的就是使用以下命令：

```
sudo snap install cpod
```

就像我之前说的那样，CPod 的 [Arch 用户仓库](https://aur.archlinux.org/packages/?O=0&K=cpod)的版本已经过时了。我已经给其中一个打包者发了消息。如果你使用 Arch（或基于 Arch 的发行版），我建议你这样做。

![cpod for Linux pidcasts](/data/attachment/album/201811/21/100807nc8iy6k6xp6pxpxk.jpg)

*播放其中一个我最喜欢的播客*

### 最后的想法

总的来说，我喜欢 CPod。它外观漂亮，使用简单。事实上，我更喜欢原来的名字（Cumulonimbus），但是它有点拗口。

我刚刚在程序中遇到两个问题。首先，我希望每个播客都有评分。其次，在打开黑暗模式后，根据长度、日期、下载状态和播放进度对剧集进行排序的菜单不起作用。

你有没有用过 CPod？如果没有，你最喜欢的播客应用是什么？你最喜欢的播客有哪些？请在下面的评论中告诉我们。

如果你发现这篇文章很有意思，请花一点时间在社交媒体、Hacker News 或 [Reddit](http://reddit.com/r/linuxusersgroup) 上分享它。

---

via: <https://itsfoss.com/cpod-podcast-app/>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[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/) 荣誉推出


使用 Docker 企业版搭建自己的私有注册服务器

![docker trusted registry](/data/attachment/album/201811/21/151718seumz52egsks5kl2.jpg)

Docker 真的很酷，特别是和使用虚拟机相比，转移 Docker 镜像十分容易。如果你已准备好使用 Docker，那你肯定已从 [Docker Hub](https://hub.docker.com/) 上拉取过完整的镜像。Docker Hub 是 Docker 的云端注册服务器服务，它包含成千上万个供选择的 Docker 镜像。如果你开发了自己的软件包并创建了自己的 Docker 镜像，那么你会想有自己私有的注册服务器。如果你有搭配着专有许可的镜像，或想为你的构建系统提供复杂的持续集成（CI）过程，则更应该拥有自己的私有注册服务器。

Docker 企业版包括 <ruby> Docker 可信注册服务器 <rt>  Docker Trusted Registry </rt></ruby>（DTR）。这是一个具有安全镜像管理功能的高可用的注册服务器，为在你自己的数据中心或基于云端的架构上运行而构建。在接下来，我们将了解到 DTR 是提供安全、可重用且连续的[软件供应链](https://blog.docker.com/2016/08/securing-enterprise-software-supply-chain-using-docker/)的一个关键组件。你可以通过我们的[免费托管小样](https://www.docker.com/trial)立即开始使用，或者通过下载安装进行 30 天的免费试用。下面是开始自己安装的步骤。

### 配置 Docker 企业版

DTR 运行于通用控制面板（UCP）之上，所以开始前要安装一个单节点集群。如果你已经有了自己的 UCP 集群，可以跳过这一步。在你的 docker 托管主机上，运行以下命令：

```
# 拉取并安装 UCP
docker run -it -rm -v /var/run/docker.sock:/var/run/docker.sock -name ucp docker/ucp:latest install
```

当 UCP 启动并运行后，在安装 DTR 之前你还有几件事要做。针对刚刚安装的 UCP 实例，打开浏览器。在日志输出的末尾应该有一个链接。如果你已经有了 Docker 企业版的许可证，那就在这个界面上输入它吧。如果你还没有，可以访问 [Docker 商店](https://store.docker.com/search?offering=enterprise&page=1&q=&type=edition)获取 30 天的免费试用版。

准备好许可证后，你可能会需要改变一下 UCP 运行的端口。因为这是一个单节点集群，DTR 和 UCP 可能会以相同的端口运行它们的 web 服务。如果你拥有不只一个节点的 UCP 集群，这就不是问题，因为 DTR 会寻找有所需空闲端口的节点。在 UCP 中，点击“管理员设置 -> 集群配置”并修改控制器端口，比如 5443。

### 安装 DTR

我们要安装一个简单的、单节点的 DTR 实例。如果你要安装实际生产用途的 DTR，那么你会将其设置为高可用（HA）模式，即需要另一种存储介质，比如基于云端的对象存储或者 NFS（LCTT 译注：Network File System，网络文件系统）。因为目前安装的是一个单节点实例，我们依然使用默认的本地存储。

首先我们需要拉取 DTR 的 bootstrap 镜像。boostrap 镜像是一个微小的独立安装程序，包括了连接到 UCP 以及设置和启动 DTR 所需的所有容器、卷和逻辑网络。

使用命令：

```
# 拉取并运行 DTR 引导程序
docker run -it -rm docker/dtr:latest install -ucp-insecure-tls
```

注意：默认情况下，UCP 和 DTR 都有自己的证书，系统无法识别。如果你已使用系统信任的 TLS 证书设置 UCP，则可以省略 `-ucp-insecure-tls` 选项。另外，你可以使用 `-ucp-ca` 选项来直接指定 UCP 的 CA 证书。

然后 DTR bootstrap 镜像会让你确定几项设置，比如 UCP 安装的 URL 地址以及管理员的用户名和密码。从拉取所有的 DTR 镜像到设置全部完成，只需要一到两分钟的时间。

### 保证一切安全

一切都准备好后，就可以向注册服务器推送或者从中拉取镜像了。在做这一步之前，让我们设置 TLS 证书，以便与 DTR 安全地通信。

在 Linux 上，我们可以使用以下命令（只需确保更改了 `DTR_HOSTNAME` 变量，来正确映射我们刚刚设置的 DTR）：

```
# 从 DTR 拉取 CA 证书（如果 curl 不可用，你可以使用 wget）
DTR_HOSTNAME=< DTR 主机名>
curl -k https://$(DTR_HOSTNAME)/ca > $(DTR_HOSTNAME).crt
sudo mkdir /etc/docker/certs.d/$(DTR_HOSTNAME)
sudo cp $(DTR_HOSTNAME) /etc/docker/certs.d/$(DTR_HOSTNAME)
# 重启 docker 守护进程（在 Ubuntu 14.04 上，使用 `sudo service docker restart` 命令）
sudo systemctl restart docker
```

对于 Mac 和 Windows 版的 Docker，我们会以不同的方式安装客户端。转入“设置 -> 守护进程”，在“不安全的注册服务器”部分，输入你的 DTR 主机名。点击“应用”，docker 守护进程应在重启后可以良好使用。

### 推送和拉取镜像

现在我们需要设置一个仓库来存放镜像。这和 Docker Hub 有一点不同，如果你做的 docker 推送仓库中不存在，它会自动创建一个。要创建一个仓库，在浏览器中打开 `https://<Your DTR hostname>` 并在出现登录提示时使用你的管理员凭据登录。如果你向 UCP 添加了许可证，则 DTR 会自动获取该许可证。如果没有，请现在确认上传你的许可证。

进入刚才的网页之后，点击“新建仓库”按钮来创建新的仓库。

我们会创建一个用于存储 Alpine linux 的仓库，所以在名字输入处键入 “alpine”，点击“保存”（在 DTR 2.5 及更高版本中叫“创建”）。

现在我们回到 shell 界面输入以下命令：

```
# 拉取 Alpine Linux 的最新版
docker pull alpine:latest
# 登入新的 DTR 实例
docker login <Your DTR hostname>
# 标记上 Alpine 使能推送其至你的 DTR
docker tag alpine:latest <Your DTR hostname>/admin/alpine:latest
# 向 DTR 推送镜像
docker push <Your DTR hostname>/admin/alpine:latest
```

就是这样！我们刚刚推送了最新的 Alpine Linux 的一份拷贝，重新打了标签以便将其存储到 DTR 中，并将其推送到我们的私有注册服务器。如果你想将镜像拉取至不同的 Docker 引擎中，按如上所示设置你的 DTR 证书，然后执行以下命令：

```
# 从 DTR 中拉取镜像
docker pull <Your DTR hostname>/admin/alpine:latest
```

DTR 具有许多优秀的镜像管理功能，例如镜像的缓存、映像、扫描、签名甚至自动化供应链策略。这些功能我们在后期的博客文章中更详细的探讨。

---

via: <https://blog.docker.com/2018/01/dtr/>

作者：[Patrick Devine](https://blog.docker.com/author/pdevine/) 译者：[fuowang](https://github.com/fuowang) 校对：[wxy](https://github.com/wxy)

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


在 Linux 中如何查找一个命令或进程的执行时间

Summary: 使用 time 程序，我们可以轻松地测量 Linux 操作系统中命令或程序的总执行时间。

![](/data/attachment/album/201811/21/155900kda1dxcmiwmimcz6.jpg)

在类 Unix 系统中，你可能知道一个命令或进程开始执行的时间，以及[一个进程运行了多久](https://www.ostechnix.com/find-long-process-running-linux/)。 但是，你如何知道这个命令或进程何时结束或者它完成运行所花费的总时长呢？ 在类 Unix 系统中，这是非常容易的! 有一个专门为此设计的程序名叫 **GNU time**。 使用 `time` 程序，我们可以轻松地测量 Linux 操作系统中命令或程序的总执行时间。 `time` 命令在大多数 Linux 发行版中都有预装，所以你不必去安装它。

### 在 Linux 中查找一个命令或进程的执行时间

要测量一个命令或程序的执行时间，运行：

```
$ /usr/bin/time -p ls
```

或者，

```
$ time ls
```

输出样例：

```
dir1 dir2 file1 file2 mcelog

real 0m0.007s
user 0m0.001s
sys 0m0.004s
```

```
$ time ls -a
. .bash_logout dir1 file2 mcelog .sudo_as_admin_successful
.. .bashrc dir2 .gnupg .profile .wget-hsts
.bash_history .cache file1 .local .stack

real 0m0.008s
user 0m0.001s
sys 0m0.005s
```

以上命令显示出了 `ls` 命令的总执行时间。 你可以将 `ls` 替换为任何命令或进程，以查找总的执行时间。

输出详解：

1. `real` —— 指的是命令或程序所花费的总时间
2. `user` —— 指的是在用户模式下程序所花费的时间
3. `sys` —— 指的是在内核模式下程序所花费的时间

我们也可以将命令限制为仅运行一段时间。参考如下教程了解更多细节：

* [在 Linux 中如何让一个命令运行特定的时长](https://www.ostechnix.com/run-command-specific-time-linux/)

### time 与 /usr/bin/time

你可能注意到了, 我们在上面的例子中使用了两个命令 `time` 和 `/usr/bin/time` 。 所以，你可能会想知道他们的不同。

首先， 让我们使用 `type` 命令看看 `time` 命令到底是什么。对于那些我们不了解的 Linux 命令，`type` 命令用于查找相关命令的信息。 更多详细信息，[请参阅本指南](https://www.ostechnix.com/the-type-command-tutorial-with-examples-for-beginners/)。

```
$ type -a time
time is a shell keyword
time is /usr/bin/time
```

正如你在上面的输出中看到的一样，`time` 是两个东西：

* 一个是 BASH shell 中内建的关键字
* 一个是可执行文件，如 `/usr/bin/time`

由于 shell 关键字的优先级高于可执行文件，当你没有给出完整路径只运行 `time` 命令时，你运行的是 shell 内建的命令。 但是，当你运行 `/usr/bin/time` 时，你运行的是真正的 **GNU time** 命令。 因此，为了执行真正的命令你可能需要给出完整路径。

在大多数 shell 中如 BASH、ZSH、CSH、KSH、TCSH 等，内建的关键字 `time` 是可用的。 `time` 关键字的选项少于该可执行文件，你可以使用的唯一选项是 `-p`。

你现在知道了如何使用 `time` 命令查找给定命令或进程的总执行时间。 想进一步了解 GNU time 工具吗？ 继续阅读吧！

### 关于 GNU time 程序的简要介绍

GNU time 程序运行带有给定参数的命令或程序，并在命令完成后将系统资源使用情况汇总到标准输出。 与 `time` 关键字不同，GNU time 程序不仅显示命令或进程的执行时间，还显示内存、I/O 和 IPC 调用等其他资源。

`time` 命令的语法是：

```
/usr/bin/time [options] command [arguments...]
```

上述语法中的 `options` 是指一组可以与 `time` 命令一起使用去执行特定功能的选项。 下面给出了可用的选项：

* `-f, –format` —— 使用此选项可以根据需求指定输出格式。
* `-p, –portability` —— 使用简要的输出格式。
* `-o file, –output=FILE` —— 将输出写到指定文件中而不是到标准输出。
* `-a, –append` —— 将输出追加到文件中而不是覆盖它。
* `-v, –verbose` —— 此选项显示 `time` 命令输出的详细信息。
* `–quiet` – 此选项可以防止 `time` 命令报告程序的状态.

当不带任何选项使用 GNU time 命令时，你将看到以下输出。

```
$ /usr/bin/time wc /etc/hosts
9 28 273 /etc/hosts
0.00user 0.00system 0:00.00elapsed 66%CPU (0avgtext+0avgdata 2024maxresident)k
0inputs+0outputs (0major+73minor)pagefaults 0swaps
```

如果你用 shell 关键字 `time` 运行相同的命令, 输出会有一点儿不同：

```
$ time wc /etc/hosts
9 28 273 /etc/hosts

real 0m0.006s
user 0m0.001s
sys 0m0.004s
```

有时，你可能希望将系统资源使用情况输出到文件中而不是终端上。 为此， 你可以使用 `-o` 选项，如下所示。

```
$ /usr/bin/time -o file.txt ls
dir1 dir2 file1 file2 file.txt mcelog
```

正如你看到的，`time` 命令不会显示到终端上。因为我们将输出写到了`file.txt` 的文件中。 让我们看一下这个文件的内容：

```
$ cat file.txt
0.00user 0.00system 0:00.00elapsed 66%CPU (0avgtext+0avgdata 2512maxresident)k
0inputs+0outputs (0major+106minor)pagefaults 0swaps
```

当你使用 `-o` 选项时, 如果你没有一个名为 `file.txt` 的文件，它会创建一个并把输出写进去。如果文件存在，它会覆盖文件原来的内容。

你可以使用 `-a` 选项将输出追加到文件后面，而不是覆盖它的内容。

```
$ /usr/bin/time -a file.txt ls
```

`-f` 选项允许用户根据自己的喜好控制输出格式。 比如说，以下命令的输出仅显示用户，系统和总时间。

```
$ /usr/bin/time -f "\t%E real,\t%U user,\t%S sys" ls
dir1 dir2 file1 file2 mcelog
0:00.00 real, 0.00 user, 0.00 sys
```

请注意 shell 中内建的 `time` 命令并不具有 GNU time 程序的所有功能。

有关 GNU time 程序的详细说明可以使用 `man` 命令来查看。

```
$ man time
```

想要了解有关 Bash 内建 `time` 关键字的更多信息，请运行：

```
$ help time
```

就到这里吧。 希望对你有所帮助。

会有更多好东西分享哦。 请关注我们！

加油哦！

---

via: <https://www.ostechnix.com/how-to-find-the-execution-time-of-a-command-or-process-in-linux/>

作者：[SK](https://www.ostechnix.com/author/sk/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[caixiangyue](https://github.com/caixiangyue) 校对：[wxy](https://github.com/wxy)

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


监测数据库的健康和行为：有哪些重要指标？

Summary: 对数据库的监测可能过于困难或者没有找到关键点。本文将讲述如何正确的监测数据库。

对数据库的监测可能过于困难或者没有找到关键点。本文将讲述如何正确的监测数据库。

>
> 对数据库的监测可能过于困难或者没有找到关键点。本文将讲述如何正确的监测数据库。
>
>
>

![](/data/attachment/album/201811/21/215135dsml8jq8q066klea.png)

我们没有对数据库讨论过多少。在这个充满监测仪器的时代，我们监测我们的应用程序、基础设施、甚至我们的用户，但有时忘记我们的数据库也值得被监测。这很大程度是因为数据库表现的很好，以至于我们单纯地信任它能把任务完成的很好。信任固然重要，但能够证明它的表现确实如我们所期待的那样就更好了。

![](/data/attachment/album/201811/21/215136ibzukqt0yuak7ab7.png)

### 为什么监测你的数据库？

监测数据库的原因有很多，其中大多数原因与监测系统的任何其他部分的原因相同：了解应用程序的各个组件中发生的什么，会让你成为更了解情况的，能够做出明智决策的开发人员。

![](/data/attachment/album/201811/21/215136qm8qlauluu0axy3u.png)

更具体地说，数据库是系统健康和行为的重要标志。数据库中的异常行为能够指出应用程序中出现问题的区域。另外，当应用程序中有异常行为时，你可以利用数据库的指标来迅速完成排除故障的过程。

### 问题

最轻微的调查揭示了监测数据库的一个问题：数据库有很多指标。说“很多”只是轻描淡写，如果你是<ruby> 史高治 <rt>  Scrooge McDuck </rt></ruby>（LCTT 译注：史高治，唐老鸭的舅舅，以一毛不拔著称），你不会放过任何一个可用的指标。如果这是<ruby> 摔角狂热 <rt>  Wrestlemania </rt></ruby> 比赛，那么指标就是折叠椅。监测所有指标似乎并不实用，那么你如何决定要监测哪些指标？

![](/data/attachment/album/201811/21/215137z6kiryk7gqbzikra.png)

### 解决方案

开始监测数据库的最好方式是认识一些基础的数据库指标。这些指标为理解数据库的行为创造了良好的开端。

### 吞吐量：数据库做了多少？

开始检测数据库的最好方法是跟踪它所接到请求的数量。我们对数据库有较高期望；期望它能稳定的存储数据，并处理我们抛给它的所有查询，这些查询可能是一天一次大规模查询，或者是来自用户一天到晚的数百万次查询。吞吐量可以告诉我们数据库是否如我们期望的那样工作。

你也可以将请求按照类型（读、写、服务器端、客户端等）分组，以开始分析流量。

### 执行时间：数据库完成工作需要多长时间？

这个指标看起来很明显，但往往被忽视了。你不仅想知道数据库收到了多少请求，还想知道数据库在每个请求上花费了多长时间。 然而，参考上下文来讨论执行时间非常重要：像 InfluxDB 这样的时间序列数据库中的慢与像 MySQL 这样的关系型数据库中的慢不一样。InfluxDB 中的慢可能意味着毫秒，而 MySQL 的 `SLOW_QUERY` 变量的默认值是 10 秒。

![](/data/attachment/album/201811/21/215138to8d8rvaitl9aiou.png)

监测执行时间和提高执行时间不一样，所以如果你的应用程序中有其他问题需要修复，那么请注意在优化上花费时间的诱惑。

### 并发性：数据库同时做了多少工作？

一旦你知道数据库正在处理多少请求以及每个请求需要多长时间，你就需要添加一层复杂性以开始从这些指标中获得实际值。

如果数据库接收到十个请求，并且每个请求需要十秒钟来完成，那么数据库是忙碌了 100 秒、10 秒，还是介于两者之间？并发任务的数量改变了数据库资源的使用方式。当你考虑连接和线程的数量等问题时，你将开始对数据库指标有更全面的了解。

并发性还能影响延迟，这不仅包括任务完成所需的时间（执行时间），还包括任务在处理之前需要等待的时间。

### 利用率：数据库繁忙的时间百分比是多少？

利用率是由吞吐量、执行时间和并发性的峰值所确定的数据库可用的频率，或者数据库太忙而不能响应请求的频率。

![](/data/attachment/album/201811/21/215139zkm88mevm8zgklv8.png)

该指标对于确定数据库的整体健康和性能特别有用。如果只能在 80% 的时间内响应请求，则可以重新分配资源、进行优化工作，或者进行更改以更接近高可用性。

### 好消息

监测和分析似乎非常困难，特别是因为我们大多数人不是数据库专家，我们可能没有时间去理解这些指标。但好消息是，大部分的工作已经为我们做好了。许多数据库都有一个内部性能数据库（Postgres：`pg_stats`、CouchDB：`Runtime_Statistics`、InfluxDB：`_internal` 等），数据库工程师设计该数据库来监测与该特定数据库有关的指标。你可以看到像慢速查询的数量一样广泛的内容，或者像数据库中每个事件的平均微秒一样详细的内容。

### 结论

数据库创建了足够的指标以使我们需要长时间研究，虽然内部性能数据库充满了有用的信息，但并不总是使你清楚应该关注哪些指标。从吞吐量、执行时间、并发性和利用率开始，它们为你提供了足够的信息，使你可以开始了解你的数据库中的情况。

![](/data/attachment/album/201811/21/215139l14s44s6e4m5m4ap.png)

你在监视你的数据库吗？你发现哪些指标有用？告诉我吧！

---

via: <https://opensource.com/article/18/10/database-metrics-matter>

作者：[Katy Farmer](https://opensource.com/users/thekatertot) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ChiZelin](https://github.com/ChiZelin) 校对：[wxy](https://github.com/wxy)

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


顶级 Linux 开发者推荐的编程书籍

![](/data/attachment/album/201811/22/165911qdu2kozkpfhnf3kp.jpg)

>
> 毫无疑问，Linux 是由那些拥有深厚计算机知识背景而且才华横溢的程序员发明的。让那些大名鼎鼎的 Linux 程序员向如今的开发者分享一些曾经带领他们登堂入室的好书和技术参考资料吧，你会不会也读过其中几本呢？
>
>
>

Linux，毫无争议的属于 21 世纪的操作系统。虽然 Linus Torvalds 在建立开源社区这件事上做了很多工作和社区决策，不过那些网络专家和开发者愿意接受 Linux 的原因还是因为它卓越的代码质量和高可用性。Torvalds 是个编程天才，同时必须承认他还是得到了很多其他同样极具才华的开发者的无私帮助。

就此我咨询了 Torvalds 和其他一些顶级 Linux 开发者，有哪些书籍帮助他们走上了成为顶级开发者的道路，下面请听我一一道来。

### 熠熠生辉的 C 语言

Linux 是在大约上世纪 90 年代开发出来的，与它一起问世的还有其他一些完成基础功能的开源软件。与此相应，那时的开发者使用的工具和语言反映了那个时代的印记，也就是说 C 语言。可能 [C 语言不再流行了](https://www.codingdojo.com/blog/7-most-in-demand-programming-languages-of-2018/)，可对于很多已经建功立业的开发者来说，C 语言是他们的第一个在实际开发中使用的语言，这一点也在他们推选的对他们有着深远影响的书单中反映出来。

Torvalds 说，“你不应该再选用我那个时代使用的语言或者开发方式”，他的开发道路始于 BASIC，然后转向机器码（“甚至都不是汇编语言，而是真真正正的‘二进制’机器码”，他解释道），再然后转向汇编语言和 C 语言。

“任何人都不应该再从这些语言开始进入开发这条路了”，他补充道。“这些语言中的一些今天已经没有什么意义（如 BASIC 和机器语言）。尽管 C 还是一个主流语言，我也不推荐你从它开始。”

并不是他不喜欢 C。不管怎样，Linux 是用 [GNU C 语言](https://www.gnu.org/software/gnu-c-manual/)写就的。“我始终认为 C 是一个伟大的语言，它有着非常简单的语法，对于很多方向的开发都很合适，但是我怀疑你会遇到重重挫折，从你的第一个‘Hello World’程序开始到你真正能开发出能用的东西当中有很大一步要走”。他认为，用现在的标准，如果作为入门语言的话，从 C 语言开始的代价太大。

在他那个时代，Torvalds 的唯一选择的书就只能是 Brian W. Kernighan 和 Dennis M. Ritchie 合著的《<ruby>   C 编程语言，第二版  <rt>  C Programming Language, 2nd Edition </rt></ruby>》，它在编程圈内也被尊称为 K&R。“这本书简单精炼，但是你要先有编程的背景才能欣赏它”，Torvalds 说到。

Torvalds 并不是唯一一个推荐 K&R 的开源开发者。以下几位也同样引用了这本他们认为值得推荐的书籍，他们有：Linux 和 Oracle 虚拟化开发副总裁 Wim Coekaerts；Linux 开发者 Alan Cox；Google 云 CTO Brian Stevens；Canonical 技术运营部副总裁 Pete Graner。

如果你今日还想同 C 语言较量一番的话，Samba 的共同创始人 Jeremy Allison 推荐《<ruby>   C 程序设计新思维  <rt>  21st Century C: C Tips from the New School </rt></ruby>》。他还建议，同时也去阅读一本比较旧但是写的更详细的《<ruby>   C 专家编程  <rt>  Expert C Programming: Deep C Secrets </rt></ruby>》和有着 20 年历史的《<ruby>   POSIX 多线程编程  <rt>  Programming with POSIX Threads </rt></ruby>》。

### 如果不选 C 语言， 那选什么？

Linux 开发者推荐的书籍自然都是他们认为适合今时今日的开发项目的语言工具。这也折射了开发者自身的个人偏好。例如，Allison 认为年轻的开发者应该在《<ruby>   Go 编程语言  <rt>  The Go Programming Language </rt></ruby>》和《<ruby>   Rust 编程  <rt>  Rust with Programming Rust </rt></ruby>》的帮助下去学习 Go 语言和 Rust 语言。

但是超越编程语言来考虑问题也不无道理（尽管这些书传授了你编程技巧）。今日要做些有意义的开发工作的话，要从那些已经完成了 99% 显而易见工作的框架开始，然后你就能围绕着它开始写脚本了， Torvalds 推荐了这种做法。

“坦率来说，语言本身远远没有围绕着它的基础架构重要”，他继续道，“可能你会从 Java 或者 Kotlin 开始，但那是因为你想为自己的手机开发一个应用，因此安卓 SDK 成为了最佳的选择，又或者，你对游戏开发感兴趣，你选择了一个游戏开发引擎来开始，而通常它们有着自己的脚本语言”。

这里提及的基础架构包括那些和操作系统本身相关的编程书籍。 Garner 在读完了大名鼎鼎的 K&R 后又拜读了 W. Richard Steven 的《<ruby>   Unix 网络编程  <rt>  Unix Network Programming </rt></ruby>》。特别是，Steven 的《<ruby>   TCP/IP 详解，卷1：协议  <rt>  TCP/IP Illustrated, Volume 1: The Protocols </rt></ruby>》在出版了 30 年之后仍然被认为是必读之书。因为 Linux 开发很大程度上和[和网络基础架构有关](https://www.hpe.com/us/en/insights/articles/how-to-see-whats-going-on-with-your-linux-system-right-now-1807.html)，Garner 也推荐了很多 O'Reilly 在 [Sendmail](http://shop.oreilly.com/product/9780596510299.do)、[Bash](http://shop.oreilly.com/product/9780596009656.do)、[DNS](http://shop.oreilly.com/product/9780596100575.do) 以及 [IMAP/POP](http://shop.oreilly.com/product/9780596000127.do) 等方面的书。

Coekaerts 也是 Maurice Bach 的《<ruby>   UNIX 操作系统设计  <rt>  The Design of the Unix Operation System </rt></ruby>》的书迷之一。James Bottomley 也是这本书的推崇者，作为一个 Linux 内核开发者，当 Linux 刚刚问世时 James 就用 Bach 的这本书所传授的知识将它研究了个底朝天。

### 软件设计知识永不过时

尽管这样说有点太局限在技术领域。Stevens 还是说到，“所有的开发者都应该在开始钻研语法前先研究如何设计，《<ruby>   设计心理学  <rt>  The Design of Everyday Things </rt></ruby>》是我的最爱”。

Coekaerts 喜欢 Kernighan 和 Rob Pike 合著的《<ruby>   程序设计实践  <rt>  The Practic of Programming </rt></ruby>》。这本关于设计实践的书当 Coekaerts 还在学校念书的时候还未出版，他说道，“但是我把它推荐给每一个人”。

不管何时，当你问一个长期从事于开发工作的开发者他最喜欢的计算机书籍时，你迟早会听到一个名字和一本书：Donald Knuth 和他所著的《<ruby>   计算机程序设计艺术（1-4A）  <rt>  The Art of Computer Programming, Volumes 1-4A </rt></ruby>》。VMware 首席开源官 Dirk Hohndel，认为这本书尽管有永恒的价值，但他也承认，“今时今日并非极其有用”。（LCTT 译注：不代表译者观点）

### 读代码。大量的读。

编程书籍能教会你很多，也请别错过另外一个在开源社区特有的学习机会：《<ruby>   代码阅读方法与实践  <rt>  Code Reading: The Open Source Perspective </rt></ruby>》。那里有不可计数的代码例子阐述如何解决编程问题（以及如何让你陷入麻烦……）。Stevens 说，谈到磨炼编程技巧，在他的书单里排名第一的“书”是 Unix 的源代码。

“也请不要忽略从他人身上学习的各种机会。” Cox 道，“我是在一个计算机俱乐部里和其他人一起学的 BASIC，在我看来，这仍然是一个学习的最好办法”，他从《<ruby>   精通 ZX81 机器码  <rt>  Mastering machine code on your ZX81 </rt></ruby>》这本书和 Honeywell L66 B 编译器手册里学习到了如何编写机器码，但是学习技术这点来说，单纯阅读和与其他开发者在工作中共同学习仍然有着很大的不同。

Cox 说，“我始终认为最好的学习方法是和一群人一起试图去解决你们共同关心的一些问题并从中找到快乐，这和你是 5 岁还是 55 岁无关”。

最让我吃惊的是这些顶级 Linux 开发者都是在非常底层级别开始他们的开发之旅的，甚至不是从汇编语言或 C 语言，而是从机器码开始开发。毫无疑问，这对帮助开发者理解计算机在非常微观的底层级别是怎么工作的起了非常大的作用。

那么现在你准备好尝试一下硬核 Linux 开发了吗？Greg Kroah-Hartman，这位 Linux 内核稳定分支的维护者，推荐了 Steve Oualline 的《<ruby>   实用 C 语言编程  <rt>  Practical C Programming </rt></ruby>》和 Samuel harbison 与 Guy Steels 合著的《<ruby>   C 语言参考手册  <rt>  C: A Reference Manual </rt></ruby>》。接下来请阅读<ruby>   如何进行 Linux 内核开发  <rt>  HOWTO do Linux kernel development </rt></ruby>，到这时，就像 Kroah-Hartman 所说，你已经准备好启程了。

于此同时，还请你刻苦学习并大量编码，最后祝你在跟随顶级 Linux 开发者脚步的道路上好运相随。

---

via: <https://www.hpe.com/us/en/insights/articles/top-linux-developers-recommended-programming-books-1808.html>

作者：[Steven Vaughan-Nichols](https://www.hpe.com/us/en/insights/contributors/steven-j-vaughan-nichols.html) 选题：[lujun9972](https://github.com/lujun9972) 译者：[DavidChenLiang](https://github.com/DavidChenLiang) 校对：[wxy](https://github.com/wxy)

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


为 Linux 选择打印机

Summary: Linux 为打印机提供了广泛的支持。学习如何利用它。

Linux 为打印机提供了广泛的支持。学习如何利用它。

>
> Linux 为打印机提供了广泛的支持。学习如何利用它。
>
>
>

![](/data/attachment/album/201811/22/202817ejjukcpimgk5idzm.jpg)

我们在传闻已久的无纸化社会方面取得了重大进展，但我们仍需要不时打印文件。如果你是 Linux 用户，并有一台没有 Linux 安装盘的打印机，或者你正准备在市场上购买新设备，那么你很幸运。因为大多数 Linux 发行版（以及 MacOS）都使用通用 Unix 打印系统（[CUPS](https://www.cups.org/)），它包含了当今大多数打印机的驱动程序。这意味着 Linux 为打印机提供了比 Windows 更广泛的支持。

### 选择打印机

如果你需要购买新打印机，了解它是否支持 Linux 的最佳方法是查看包装盒或制造商网站上的文档。你也可以搜索 [Open Printing](http://www.openprinting.org/printers) 数据库。它是检查各种打印机与 Linux 兼容性的绝佳资源。

以下是与 Linux 兼容的佳能打印机的一些 Open Printing 结果。

![](/data/attachment/album/201811/22/202843pstp9dt69hd2hb9y.png)

下面的截图是 Open Printing 的 Hewlett-Packard LaserJet 4050 的结果 —— 根据数据库，它应该可以“完美”工作。这里列出了建议驱动以及通用说明，让我了解它适用于 CUPS、行式打印守护程序（LPD）、LPRng 等。

![](/data/attachment/album/201811/22/202844dnj509qrx3egbgtj.png)

在任何情况下，最好在购买打印机之前检查制造商的网站并询问其他 Linux 用户。

### 检查你的连接

有几种方法可以将打印机连接到计算机。如果你的打印机是通过 USB 连接的，那么可以在 Bash 提示符下输入 `lsusb` 来轻松检查连接。

```
$ lsusb
```

该命令返回 “Bus 002 Device 004: ID 03f0:ad2a Hewlett-Packard” —— 这没有太多价值，但可以得知打印机已连接。我可以通过输入以下命令获得有关打印机的更多信息：

```
$ dmesg | grep -i usb
```

结果更加详细。

![](/data/attachment/album/201811/22/202845q6b5mly68wavwbl5.png)

如果你尝试将打印机连接到并口（假设你的计算机有并口 —— 如今很少见），你可以使用此命令检查连接：

```
$ dmesg | grep -i parport
```

返回的信息可以帮助我为我的打印机选择正确的驱动程序。我发现，如果我坚持使用流行的名牌打印机，大部分时间我都能获得良好的效果。

### 设置你的打印机软件

Fedora Linux 和 Ubuntu Linux 都包含简单的打印机设置工具。[Fedora](https://fedoraproject.org/wiki/Printing) 为打印问题的答案维护了一个出色的 wiki。可以在 GUI 中的设置轻松启动这些工具，也可以在命令行上调用 `system-config-printer`。

![](/data/attachment/album/201811/22/202846fa0222nc6c2rr2c2.png)

HP 支持 Linux 打印的 [HP Linux 成像和打印](https://developers.hp.com/hp-linux-imaging-and-printing) （HPLIP） 软件可能已安装在你的 Linux 系统上。如果没有，你可以为你的发行版[下载](https://developers.hp.com/hp-linux-imaging-and-printing/gethplip)最新版本。打印机制造商 [Epson](https://epson.com/Support/wa00821) 和 [Brother](https://support.brother.com/g/s/id/linux/en/index.html?c=us_ot&lang=en&comple=on&redirect=on) 也有带有 Linux 打印机驱动程序和信息的网页。

你最喜欢的 Linux 打印机是什么？请在评论中分享你的意见。

---

via: <https://opensource.com/article/18/11/choosing-printer-linux>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[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/) 荣誉推出


我们如何得知安装的包来自哪个仓库？

![](/data/attachment/album/201811/22/214120wr4nghn4rrru2oz9.jpg)

有时候你可能想知道安装的软件包来自于哪个仓库。这将帮助你在遇到包冲突问题时进行故障排除。因为[第三方仓库](https://www.2daygeek.com/category/repository/)拥有最新版本的软件包，所以有时候当你试图安装一些包的时候会出现兼容性的问题。在 Linux 上一切都是可能的，因为你可以安装一个即使在你的发行版系统上不能使用的包。你也可以安装一个最新版本的包，即使你的发行版系统仓库还没有这个版本，怎么做到的呢？这就是为什么出现了第三方仓库。它们允许用户从库中安装所有可用的包。

几乎所有的发行版系统都允许第三方软件库。一些发行版还会官方推荐一些不会取代基础仓库的第三方仓库，例如 CentOS 官方推荐安装 [EPEL 库](https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-scientific-linux-oracle-linux/)。

下面是常用的仓库列表和它们的详细信息。

* CentOS： [EPEL](https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-scientific-linux-oracle-linux/)、[ELRepo](https://www.2daygeek.com/install-enable-elrepo-on-rhel-centos-scientific-linux/) 等是 [Centos 社区认证仓库](4)。
* Fedora： [RPMfusion 仓库](https://www.2daygeek.com/install-enable-rpm-fusion-repository-on-centos-fedora-rhel/) 是经常被很多 [Fedora](https://fedoraproject.org/wiki/Third_party_repositories) 用户使用的仓库。
* ArchLinux： ArchLinux 社区仓库包含了来自于 Arch 用户仓库的可信用户审核通过的软件包。
* openSUSE： [Packman 仓库](https://www.2daygeek.com/install-enable-packman-repository-on-opensuse-leap/) 为 openSUSE 提供了各种附加的软件包，特别是但不限于那些在 openSUSE Build Service 应用黑名单上的与多媒体相关的应用和库。它是 openSUSE 软件包的最大外部软件库。
* Ubuntu：个人软件包归档（PPA）是一种软件仓库。开发者们可以创建这种仓库来分发他们的软件。你可以在 PPA 导航页面找到相关信息。同时，你也可以启用 Cananical 合作伙伴软件仓库。

### 仓库是什么？

软件仓库是存储特定的应用程序的软件包的集中场所。

所有的 Linux 发行版都在维护他们自己的仓库，并允许用户在他们的机器上获取和安装包。

每个厂商都提供了各自的包管理工具来管理它们的仓库，例如搜索、安装、更新、升级、删除等等。

除了 RHEL 和 SUSE 以外大部分 Linux 发行版都是自由软件。要访问付费的仓库，你需要购买其订阅服务。

### 为什么我们需要启用第三方仓库？

在 Linux 里，并不建议从源代码安装包，因为这样做可能会在升级软件和系统的时候产生很多问题，这也是为什么我们建议从库中安装包而不是从源代码安装。

### 在 RHEL/CentOS 系统上我们如何得知安装的软件包来自哪个仓库？

这可以通过很多方法实现。我们会给你所有可能的选择，你可以选择一个对你来说最合适的。

#### 方法-1：使用 yum 命令

RHEL 和 CentOS 系统使用 RPM 包，因此我们能够使用 [Yum 包管理器](https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/) 来获得信息。

YUM 即 “Yellodog Updater, Modified” 是适用于基于 RPM 的系统例如 RHEL 和 CentOS 的一个开源命令行前端包管理工具。

`yum` 是从发行版仓库和其他第三方库中获取、安装、删除、查询和管理 RPM 包的一个主要工具。

```
# yum info apachetop
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * epel: epel.mirror.constant.com
Installed Packages
Name        : apachetop
Arch        : x86_64
Version     : 0.15.6
Release     : 1.el7
Size        : 65 k
Repo        : installed
From repo   : epel
Summary     : A top-like display of Apache logs
URL         : https://github.com/tessus/apachetop
License     : BSD
Description : ApacheTop watches a logfile generated by Apache (in standard common or
            : combined logformat, although it doesn't (yet) make use of any of the extra
            : fields in combined) and generates human-parsable output in realtime.
```

`apachetop` 包来自 EPEL 仓库。

#### 方法-2：使用 yumdb 命令

`yumdb info` 提供了类似于 `yum info` 的信息但是它又提供了包校验和数据、类型、用户信息（谁安装的软件包）。从 yum 3.2.26 开始，yum 已经开始在 rpmdatabase 之外存储额外的信息（user 表示软件是用户安装的，dep 表示它是作为依赖项引入的）。

```
# yumdb info lighttpd
Loaded plugins: fastestmirror
lighttpd-1.4.50-1.el7.x86_64
     checksum_data = a24d18102ed40148cfcc965310a516050ed437d728eeeefb23709486783a4d37
     checksum_type = sha256
     command_line = --enablerepo=epel install lighttpd apachetop aria2 atop axel
     from_repo = epel
     from_repo_revision = 1540756729
     from_repo_timestamp = 1540757483
     installed_by = 0
     origin_url = https://epel.mirror.constant.com/7/x86_64/Packages/l/lighttpd-1.4.50-1.el7.x86_64.rpm
     reason = user
     releasever = 7
     var_contentdir = centos
     var_infra = stock
     var_uuid = ce328b07-9c0a-4765-b2ad-59d96a257dc8
```

`lighttpd` 包来自 EPEL 仓库。

#### 方法-3：使用 rpm 命令

[RPM 命令](https://www.2daygeek.com/rpm-command-examples/) 即 “Red Hat Package Manager” 是一个适用于基于 Red Hat 的系统（例如 RHEL、CentOS、Fedora、openSUSE & Mageia）的强大的命令行包管理工具。

这个工具允许你在你的 Linux 系统/服务器上安装、更新、移除、查询和验证软件。RPM 文件具有 .rpm 后缀名。RPM 包是用必需的库和依赖关系构建的，不会与系统上安装的其他包冲突。

```
# rpm -qi apachetop
Name        : apachetop
Version     : 0.15.6
Release     : 1.el7
Architecture: x86_64
Install Date: Mon 29 Oct 2018 06:47:49 AM EDT
Group       : Applications/Internet
Size        : 67020
License     : BSD
Signature   : RSA/SHA256, Mon 22 Jun 2015 09:30:26 AM EDT, Key ID 6a2faea2352c64e5
Source RPM  : apachetop-0.15.6-1.el7.src.rpm
Build Date  : Sat 20 Jun 2015 09:02:37 PM EDT
Build Host  : buildvm-22.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : https://github.com/tessus/apachetop
Summary     : A top-like display of Apache logs
Description :
ApacheTop watches a logfile generated by Apache (in standard common or
combined logformat, although it doesn't (yet) make use of any of the extra
fields in combined) and generates human-parsable output in realtime.
```

`apachetop` 包来自 EPEL 仓库。

#### 方法-4：使用 repoquery 命令

`repoquery` 是一个从 YUM 库查询信息的程序，类似于 rpm 查询。

```
# repoquery -i httpd

Name        : httpd
Version     : 2.4.6
Release     : 80.el7.centos.1
Architecture: x86_64
Size        : 9817285
Packager    : CentOS BuildSystem
Group       : System Environment/Daemons
URL         : http://httpd.apache.org/
Repository  : updates
Summary     : Apache HTTP Server
Source      : httpd-2.4.6-80.el7.centos.1.src.rpm
Description :
The Apache HTTP Server is a powerful, efficient, and extensible
web server.
```

`httpd` 包来自 CentOS updates 仓库。

### 在 Fedora 系统上我们如何得知安装的包来自哪个仓库？

DNF 是 “Dandified yum” 的缩写。DNF 是使用 hawkey/libsolv 库作为后端的下一代 yum 包管理器（yum 的分支）。从 Fedora 18 开始 Aleš Kozumplík 开始开发 DNF，并最终在 Fedora 22 上得以应用/启用。

[dnf 命令](https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/) 用于在 Fedora 22 以及之后的系统上安装、更新、搜索和删除包。它会自动解决依赖并使安装包的过程变得顺畅，不会出现任何问题。

```
$ dnf info tilix
Last metadata expiration check: 27 days, 10:00:23 ago on Wed 04 Oct 2017 06:43:27 AM IST.
Installed Packages
Name         : tilix
Version      : 1.6.4
Release      : 1.fc26
Arch         : x86_64
Size         : 3.6 M
Source       : tilix-1.6.4-1.fc26.src.rpm
Repo         : @System
From repo    : updates
Summary      : Tiling terminal emulator
URL          : https://github.com/gnunn1/tilix
License      : MPLv2.0 and GPLv3+ and CC-BY-SA
Description  : Tilix is a tiling terminal emulator with the following features:
             :
             :  - Layout terminals in any fashion by splitting them horizontally or vertically
             :  - Terminals can be re-arranged using drag and drop both within and between
             :    windows
             :  - Terminals can be detached into a new window via drag and drop
             :  - Input can be synchronized between terminals so commands typed in one
             :    terminal are replicated to the others
             :  - The grouping of terminals can be saved and loaded from disk
             :  - Terminals support custom titles
             :  - Color schemes are stored in files and custom color schemes can be created by
             :    simply creating a new file
             :  - Transparent background
             :  - Supports notifications when processes are completed out of view
             :
             : The application was written using GTK 3 and an effort was made to conform to
             : GNOME Human Interface Guidelines (HIG).
```

`tilix` 包来自 Fedora updates 仓库。

### 在 openSUSE 系统上我们如何得知安装的包来自哪个仓库？

Zypper 是一个使用 libzypp 的命令行包管理器。[Zypper 命令](https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/) 提供了存储库访问、依赖处理、包安装等功能。

```
$ zypper info nano

Loading repository data...
Reading installed packages...

Information for package nano:
-----------------------------
Repository     : Main Repository (OSS)
Name           : nano
Version        : 2.4.2-5.3
Arch           : x86_64
Vendor         : openSUSE
Installed Size : 1017.8 KiB
Installed      : No
Status         : not installed
Source package : nano-2.4.2-5.3.src
Summary        : Pico editor clone with enhancements
Description    :
    GNU nano is a small and friendly text editor. It aims to emulate
    the Pico text editor while also offering a few enhancements.
```

`nano` 包来自于 openSUSE Main 仓库（OSS）。

### 在 ArchLinux 系统上我们如何得知安装的包来自哪个仓库？

[Pacman 命令](https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/) 即包管理器工具（package manager utility ），是一个简单的用来安装、构建、删除和管理 Arch Linux 软件包的命令行工具。Pacman 使用 libalpm 作为后端来执行所有的操作。

```
# pacman -Ss chromium
extra/chromium 48.0.2564.116-1
    The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
extra/qt5-webengine 5.5.1-9 (qt qt5)
    Provides support for web applications using the Chromium browser project
community/chromium-bsu 0.9.15.1-2
    A fast paced top scrolling shooter
community/chromium-chromevox latest-1
    Causes the Chromium web browser to automatically install and update the ChromeVox screen reader extention. Note: This
    package does not contain the extension code.
community/fcitx-mozc 2.17.2313.102-1
    Fcitx Module of A Japanese Input Method for Chromium OS, Windows, Mac and Linux (the Open Source Edition of Google Japanese
    Input)
```

`chromium` 包来自 ArchLinux extra 仓库。

或者，我们可以使用以下选项获得关于包的详细信息。

```
# pacman -Si chromium
Repository      : extra
Name            : chromium
Version         : 48.0.2564.116-1
Description     : The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
Architecture    : x86_64
URL             : http://www.chromium.org/
Licenses        : BSD
Groups          : None
Provides        : None
Depends On      : gtk2  nss  alsa-lib  xdg-utils  bzip2  libevent  libxss  icu  libexif  libgcrypt  ttf-font  systemd  dbus
                  flac  snappy  speech-dispatcher  pciutils  libpulse  harfbuzz  libsecret  libvpx  perl  perl-file-basedir
                  desktop-file-utils  hicolor-icon-theme
Optional Deps   : kdebase-kdialog: needed for file dialogs in KDE
                  gnome-keyring: for storing passwords in GNOME keyring
                  kwallet: for storing passwords in KWallet
Conflicts With  : None
Replaces        : None
Download Size   : 44.42 MiB
Installed Size  : 172.44 MiB
Packager        : Evangelos Foutras
Build Date      : Fri 19 Feb 2016 04:17:12 AM IST
Validated By    : MD5 Sum  SHA-256 Sum  Signature
```

`chromium` 包来自 ArchLinux extra 仓库。

### 在基于 Debian 的系统上我们如何得知安装的包来自哪个仓库？

在基于 Debian 的系统例如 Ubuntu、LinuxMint 上可以使用两种方法实现。

#### 方法-1：使用 apt-cache 命令

[apt-cache 命令](https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/) 可以显示存储在 APT 内部数据库的很多信息。这些信息是一种缓存，因为它们是从列在 `source.list` 文件里的不同的源中获得的。这个过程发生在 apt 更新操作期间。

```
$ apt-cache policy python3
python3:
  Installed: 3.6.3-0ubuntu2
  Candidate: 3.6.3-0ubuntu3
  Version table:
     3.6.3-0ubuntu3 500
        500 http://in.archive.ubuntu.com/ubuntu artful-updates/main amd64 Packages
 *** 3.6.3-0ubuntu2 500
        500 http://in.archive.ubuntu.com/ubuntu artful/main amd64 Packages
        100 /var/lib/dpkg/status
```

`python3` 包来自 Ubuntu updates 仓库。

#### 方法-2：使用 apt 命令

[APT 命令](https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/) 即 “Advanced Packaging Tool”，是 `apt-get` 命令的替代品，就像 DNF 是如何取代 YUM 一样。它是具有丰富功能的命令行工具并将所有的功能例如 `apt-cache`、`apt-search`、`dpkg`、`apt-cdrom`、`apt-config`、`apt-ket` 等包含在一个命令（APT）中，并且还有几个独特的功能。例如我们可以通过 APT 轻松安装 .dpkg 包，但我们不能使用 `apt-get` 命令安装，更多类似的功能都被包含进了 APT 命令。`apt-get` 因缺失了很多未被解决的特性而被 `apt` 取代。

```
$ apt -a show notepadqq
Package: notepadqq
Version: 1.3.2-1~artful1
Priority: optional
Section: editors
Maintainer: Daniele Di Sarli
Installed-Size: 1,352 kB
Depends: notepadqq-common (= 1.3.2-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
Download-Size: 356 kB
APT-Sources: http://ppa.launchpad.net/notepadqq-team/notepadqq/ubuntu artful/main amd64 Packages
Description: Notepad++-like editor for Linux
 Text editor with support for multiple programming
 languages, multiple encodings and plugin support.

Package: notepadqq
Version: 1.2.0-1~artful1
Status: install ok installed
Priority: optional
Section: editors
Maintainer: Daniele Di Sarli
Installed-Size: 1,352 kB
Depends: notepadqq-common (= 1.2.0-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
Homepage: http://notepadqq.altervista.org
Download-Size: unknown
APT-Manual-Installed: yes
APT-Sources: /var/lib/dpkg/status
Description: Notepad++-like editor for Linux
 Text editor with support for multiple programming
 languages, multiple encodings and plugin support.
```

`notepadqq` 包来自 Launchpad PPA。

---

via: <https://www.2daygeek.com/how-do-we-find-out-the-installed-packages-came-from-which-repository/>

作者：[Prakash Subramanian](https://www.2daygeek.com/author/prakash/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zianglei](https://github.com/zianglei) 校对：[wxy](https://github.com/wxy)

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