在 Fedora 上为 SSH 设置双因子验证

![](/data/attachment/album/201903/24/091059htuvvhpttruuvzkh.png)

每天似乎都有一个安全漏洞的新闻报道，说我们的数据会因此而存在风险。尽管 SSH 是一种远程连接系统的安全方式，但你仍然可以使它更安全。本文将向你展示如何做到这一点。

此时<ruby> 双因子验证 <rt>  two-factor authentication </rt></ruby>（2FA）就有用武之地了。即使你禁用密码并只允许使用公钥和私钥进行 SSH 连接，但如果未经授权的用户偷窃了你的密钥，他仍然可以借此访问系统。

使用双因子验证，你不能仅仅使用 SSH 密钥连接到服务器，你还需要提供手机上的验证器应用程序随机生成的数字。

本文展示的方法是<ruby> 基于时间的一次性密码 <rt>  Time-based One-time Password </rt></ruby>（TOTP）算法。[Google Authenticator](https://en.wikipedia.org/wiki/Google_Authenticator) 用作服务器应用程序。默认情况下，Google Authenticator 在 Fedora 中是可用的。

至于手机，你可以使用与 TOTP 兼容的任何可以双路验证的应用程序。Andorid 或 iOS 有许多可以与 TOTP 和 Google Authenticator 配合使用的免费应用程序。本文与 [FreeOTP](https://freeotp.github.io/) 为例。

### 安装并设置 Google Authenticator

首先，在你的服务器上安装 Google Authenticator。 `$ sudo dnf install -y google-authenticator`

运行应用程序：

```
$ google-authenticator
```

该应用程序提供了一系列问题。下面的片段展示了如何进行合理的安全设置：

```
Do you want authentication tokens to be time-based (y/n) y
Do you want me to update your "/home/user/.google_authenticator" file (y/n)? y
```

这个应用程序为你提供一个密钥、验证码和恢复码。把它们放在安全的地方。如果你丢失了手机，恢复码是访问服务器的**唯一**方式。

### 设置手机验证

在你的手机上安装验证器应用程序（FreeOTP）。如果你有一台安卓手机，那么你可以在 Google Play 中找到它，也可以在苹果 iPhone 的 iTunes 商店中找到它。

Google Authenticator 会在屏幕上显示一个二维码。打开手机上的 FreeOTP 应用程序，选择添加新账户，在应用程序顶部选择二维码形状工具，然后扫描二维码即可。设置完成后，在每次远程连接服务器时，你必须提供验证器应用程序生成的随机数。

### 完成配置

应用程序会向你询问更多的问题。下面示例展示了如何设置合理的安全配置。

```
Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y
By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens).
Do you want to do so? (y/n) n
If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
```

现在，你必须设置 SSH 来利用新的双路验证。

### 配置 SSH

在完成此步骤之前，**确保你已使用公钥建立了一个可用的 SSH 连接**，因为我们将禁用密码连接。如果出现问题或错误，一个已经建立的连接将允许你修复问题。

在你的服务器上，使用 [sudo](https://fedoramagazine.org/howto-use-sudo/) 编辑 `/etc/pam.d/sshd` 文件。

```
$ sudo vi /etc/pam.d/ssh
```

注释掉 `auth substack password-auth` 这一行：

```
#auth       substack     password-auth
```

将以下行添加到文件底部：

```
auth sufficient pam_google_authenticator.so
```

保存并关闭文件。然后编辑 `/etc/ssh/sshd_config` 文件：

```
$ sudo vi /etc/ssh/sshd_config
```

找到 `ChallengeResponseAuthentication` 这一行并将其更改为 `yes`：

```
ChallengeResponseAuthentication yes
```

找到 `PasswordAuthentication` 这一行并将其更改为 `no`：

```
PasswordAuthentication no
```

将以下行添加到文件底部：

```
AuthenticationMethods publickey,password publickey,keyboard-interactive
```

保存并关闭文件，然后重新启动 SSH：

```
$ sudo systemctl restart sshd
```

### 测试双因子验证

当你尝试连接到服务器时，系统会提示你输入验证码：

```
[user@client ~]$ ssh user@example.com
Verification code:
```

验证码由你手机上的验证器应用程序随机生成。由于这个数字每隔几秒就会发生变化，因此你需要在它变化之前输入它。

![](/data/attachment/album/201903/24/091059twxbg02bi240aokd.png)

如果你不输入验证码，你将无法访问系统，你会收到一个权限被拒绝的错误：

```
[user@client ~]$ ssh user@example.com
Verification code:
Verification code:
Verification code:
Permission denied (keyboard-interactive).
[user@client ~]$
```

### 结论

通过添加这种简单的双路验证，现在未经授权的用户访问你的服务器将变得更加困难。

---

via: <https://fedoramagazine.org/two-factor-authentication-ssh-fedora/>

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


Python 的 ChatOps 库：Opsdroid 和 Errbot

>
> 学习一下 Python 世界里最广泛使用的 ChatOps 库：每个都能做什么，如何使用。
>
>
>

![](/data/attachment/album/201903/24/100736j64t9ts14tjtvojl.jpg)

ChatOps 是基于会话导向而进行的开发。其思路是你可以编写能够对聊天窗口中的某些输入进行回复的可执行代码。作为一个开发者，你能够用 ChatOps 从 Slack 合并拉取请求，自动从收到的 Facebook 消息中给某人分配支持工单，或者通过 IRC 检查开发状态。

在 Python 世界，最为广泛使用的 ChatOps 库是 Opsdroid 和 Errbot。在这个月的 Python 专栏，让我们一起聊聊使用它们是怎样的体验，它们各自适用于什么方面以及如何着手使用它们。

### Opsdroid

[Opsdroid](https://opsdroid.github.io/) 是一个相对年轻的（始于 2016）Python 开源聊天机器人库。它有着良好的开发文档，不错的教程，并且包含能够帮助你对接流行的聊天服务的插件。

#### 它内置了什么

库本身并没有自带所有你需要上手的东西，但这是故意的。轻量级的框架鼓励你去运用它现有的连接器（Opsdroid 所谓的帮你接入聊天服务的插件）或者去编写你自己的，但是它并不会因自带你所不需要的连接器而自贬身价。你可以轻松使用现有的 Opsdroid 连接器来接入：

* 命令行
* Cisco Spark
* Facebook
* GitHub
* Matrix
* Slack
* Telegram
* Twitter
* Websocket

Opsdroid 会调用使聊天机器人能够展现它们的“技能”的函数。这些技能其实是异步 Python 函数，并使用 Opsdroid 叫做“匹配器”的匹配装饰器。你可以设置你的 Opsdroid 项目，来使用同样从你设置文件所在的代码中的“技能”。你也可以从外面的公共或私人仓库调用这些“技能”。

你同样可以启用一些现存的 Opsdroid “技能”，包括 [seen](https://github.com/opsdroid/skill-seen) —— 它会告诉你聊天机器人上次是什么时候看到某个用户的，以及 [weather](https://github.com/opsdroid/skill-weather) —— 会将天气报告给用户。

最后，Opdroid 允许你使用现存的数据库模块设置数据库。现在 Opdroid 支持的数据库包括：

* Mongo
* Redis
* SQLite

你可以在你的 Opdroid 项目中的 `configuration.yaml` 文件设置数据库、技能和连接器。

#### Opsdroid 的优势

**Docker 支持：**从一开始 Opsdroid 就打算在 Docker 中良好运行。在 Docker 中的指导是它 [安装文档](https://opsdroid.readthedocs.io/en/stable/#docker) 中的一部分。使用 Opsdroid 和 Docker Compose 也很简单：将 Opsdroid 设置成一种服务，当你运行 `docker-compose up` 时，你的 Opsdroid 服务将会开启你的聊天机器人也将就绪。

```
version: "3"

services:
  opsdroid:
    container_name: opsdroid
    build:
      context: .
      dockerfile: Dockerfile
```

**丰富的连接器：** Opsdroid 支持九种像 Slack 和 Github 等从外部接入的服务连接器。你所要做的一切就是在你的设置文件中启用那些连接器，然后把必须的口令或者 API 密匙传过去。比如为了启用 Opsdroid 以在一个叫做 `#updates` 的 Slack 频道发帖，你需要将以下代码加入你设置文件的 `connectors` 部分：

```
 - name: slack
    api-token: "this-is-my-token"
    default-room: "#updates"
```

在设置 Opsdroid 以接入 Slack 之前你需要[添加一个机器人用户](https://api.slack.com/bot-users)。

如果你需要接入一个 Opsdroid 不支持的服务，在[文档](https://opsdroid.readthedocs.io/en/stable/extending/connectors/)里有有添加你自己的连接器的教程。

**相当不错的文档：** 特别是对于一个在积极开发中的新兴库来说，Opsdroid 的文档十分有帮助。这些文档包括一篇带你创建几个不同的基本技能的[教程](https://opsdroid.readthedocs.io/en/stable/tutorials/introduction/)。Opsdroid 在[技能](https://opsdroid.readthedocs.io/en/stable/extending/skills/)、[连接器](https://opsdroid.readthedocs.io/en/stable/extending/connectors/)、[数据库](https://opsdroid.readthedocs.io/en/stable/extending/databases/)，以及[匹配器](https://opsdroid.readthedocs.io/en/stable/matchers/overview/)方面的文档也十分清晰。

它所支持的技能和连接器的仓库为它的技能提供了富有帮助的示范代码。

**自然语言处理：** Opsdroid 的技能里面能使用正则表达式，但也同样提供了几个包括 [Dialogflow](https://opsdroid.readthedocs.io/en/stable/matchers/dialogflow/)，[luis.ai](https://opsdroid.readthedocs.io/en/stable/matchers/luis.ai/)，[Recast.AI](https://opsdroid.readthedocs.io/en/stable/matchers/recast.ai/) 以及 [wit.ai](https://opsdroid.readthedocs.io/en/stable/matchers/wit.ai/) 的 NLP API。

#### Opsdroid 可能的不足

Opsdroid 对它的一部分连接器还没有启用全部的特性。比如说，Slack API 允许你向你的消息添加颜色柱、图片以及其他的“附件”。Opsdroid Slack 连接器并没有启用“附件”特性，所以如果那些特性对你来说很重要的话，你需要编写一个自定义的 Slack 连接器。如果连接器缺少一个你需要的特性，Opsdroid 将欢迎你的[贡献](https://opsdroid.readthedocs.io/en/stable/contributing/)。文档中可以使用更多的例子，特别是对于预料到的使用场景。

#### 示例用法

```
from opsdroid.matchers import match_regex
import random

@match_regex(r'hi|hello|hey|hallo')
async def hello(opsdroid, config, message):
    text = random.choice(["Hi {}", "Hello {}", "Hey {}"]).format(message.user)
    await message.respond(text)
```

*hello/\_\_init\_\_.py*

```
connectors:
  - name: websocket

skills:
  - name: hello
    repo: "https://github.com/<user_id>/hello-skill"

```

*configuration.yaml*

### Errbot

[Errbot](http://errbot.io/en/latest/) 是一个功能齐全的开源聊天机器人。Errbot 发行于 2012 年，并且拥有人们从一个成熟的项目能期待的一切，包括良好的文档、优秀的教程以及许多帮你连入现有的流行聊天服务的插件。

#### 它内置了什么

不像采用了较轻量级方式的 Opsdroid，Errbot 自带了你需要可靠地创建一个自定义机器人的一切东西。

Errbot 包括了对于本地 XMPP、IRC、Slack、Hipchat 以及 Telegram 服务的支持。它通过社区支持的后端列出了另外十种服务。

#### Errbot 的优势

**良好的文档：** Errbot 的文档成熟易读。

**动态插件架构：** Errbot 允许你通过和聊天机器人交谈安全地安装、卸载、更新、启用以及禁用插件。这使得开发和添加特性十分简便。感谢 Errbot 的颗粒性授权系统，出于安全意识这所有的一切都可以被锁闭。

当某个人输入 `!help`，Errbot 使用你的插件的文档字符串来为可获取的命令生成文档，这使得了解每行命令的作用更加简便。

**内置的管理和安全特性：** Errbot 允许你限制拥有管理员权限的用户列表，甚至细粒度访问控制。比如说你可以限制特定用户或聊天房间访问特定命令。

**额外的插件框架：** Errbot 支持钩子、回调、子命令、webhook、轮询以及其它[更多特性](http://errbot.io/en/latest/features.html#extensive-plugin-framework)。如果那些还不够，你甚至可以编写[动态插件](http://errbot.io/en/latest/user_guide/plugin_development/dynaplugs.html)。当你需要基于在远程服务器上的可用命令来启用对应的聊天命令时，这个特性十分有用。

**自带测试框架：** Errbot 支持 [pytest](http://pytest.org/)，同时也自带一些能使你简便测试插件的有用功能。它的“[测试你的插件](http://errbot.io/en/latest/user_guide/plugin_development/testing.html)”的文档出于深思熟虑，并提供了足够的资料让你上手。

#### Errbot 可能的不足

**以 “!” 开头：** 默认情况下，Errbot 命令发出时以一个惊叹号打头（`!help` 以及 `!hello`）。一些人可能会喜欢这样，但是另一些人可能认为这让人烦恼。谢天谢地，这很容易关掉。

**插件元数据** 首先，Errbot 的 [Hello World](http://errbot.io/en/latest/index.html#simple-to-build-upon) 插件示例看上去易于使用。然而我无法加载我的插件，直到我进一步阅读了教程并发现我还需要一个 `.plug` 文档，这是一个 Errbot 用来加载插件的文档。这可能比较吹毛求疵了，但是在我深挖文档之前，这对我来说都不是显而易见的。

### 示例用法

```
import random
from errbot import BotPlugin, botcmd

class Hello(BotPlugin):

    @botcmd
    def hello(self, msg, args):
        text = random.choice(["Hi {}", "Hello {}", "Hey {}"]).format(message.user)
        return text
```

*hello.py*

```
[Core]
Name = Hello
Module = hello

[Python]
Version = 2+

[Documentation]
Description = Example "Hello" plugin
```

*hello.plug*

你用过 Errbot 或 Opsdroid 吗？如果用过请留下关于你对于这些工具印象的留言。

---

via: <https://opensource.com/article/18/3/python-chatops-libraries-opsdroid-and-errbot>

作者：[Jeff Triplett](https://opensource.com/users/laceynwilliams), [Lacey Williams Henschel](https://opensource.com/users/laceynwilliams) 译者：[tomjlw](https://github.com/tomjlw) 校对：[wxy](https://github.com/wxy)

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


开始使用 Freeplane 吧，一款开源思维导图

>
> 使用 Freeplane 进行头脑风暴，这是我们开源工具系列中的第 13 个，它将使你在 2019 年更高效。
>
>
>

![](/data/attachment/album/201903/24/213421ke792akx98ur09mr.png)

每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心，渴望开启新的一年，当然，“抛弃旧的，拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件，但事实上并不用这样。

这是我挑选出的 19 个新的（或者对你而言新的）开源工具中的第 13 个工具来帮助你在 2019 年更有效率。

### Freeplane

[思维导图](https://en.wikipedia.org/wiki/Mind_map)是我用于快速头脑风暴和捕捉数据的最有价值的工具之一。思维导图是一个灵活的过程，有助于显示事物的相关性，并可用于快速组织相互关联的信息。从规划角度来看，思维导图让你快速将大脑中的单个概念、想法或技术表达出来。

![](/data/attachment/album/201903/24/213422ecedczymeceuusec.png)

[Freeplane](https://www.freeplane.org/wiki/index.php/Home) 是一款桌面应用，可以轻松创建、查看、编辑和共享思维导图。它是 [FreeMind](https://sourceforge.net/projects/freemind/) 这款很长时间内都是思维导图首选应用的重新打造。

安装 Freeplane 非常简单。它是一个 [Java](https://java.com) 应用，并使用 ZIP 文件分发，可使用脚本在 Linux、Windows 和 MacOS 上启动。在第一次启动它时，主窗口会包含一个示例思维导图，其中包含指向你可以使用 Freeplane 执行的所有不同操作的文档的链接。

![](/data/attachment/album/201903/24/213425o7fnr88fi887cun7.png)

创建新思维导图时，你可以选择模板。标准模板（可能位于列表底部）适用于大多数情况。你只需开始输入开头的想法或短语，你的文本就会替换中心的文本。按“Insert”键将从中心添加一个分支（或节点），其中包含一个空白字段，你可以在其中填写与该想法相关的内容。再次按“Insert”将添加另一个节点到第一个上。在节点上按回车键将添加与该节点平行的节点。

![](/data/attachment/album/201903/24/213426zvzp951jm230hmz4.png)

在添加节点时，你可能会想到与主题相关的另一个想法。使用鼠标或箭头键，返回到导图的中心，然后按“Insert”键。这将在主题之外创建一个新节点。

如果你想使用 Freeplane 其他功能，请右键单击任何节点以显示该节点的“属性”菜单。工具窗口（在视图 ->控制菜单下激活）包含丰富的自定义选项，包括线条形状和粗细、边框形状、颜色等等。“日历”选项允许你在节点中插入日期，并为节点设置到期提醒。 （请注意，提醒仅在 Freeplane 运行时有效。）思维导图可以导出为多种格式，包括常见的图像、XML、Microsoft Project、Markdown 和 OPML。

![](/data/attachment/album/201903/24/213427ldyyjl97lnulzgmh.png)

Freeplane 为你提供了创建生动和实用的思维导图所需的所有工具，让你表达头脑中的想法，并可采取行动。

---

via: <https://opensource.com/article/19/1/productivity-tool-freeplane>

作者：[Kevin Sonney](https://opensource.com/users/ksonney "Kevin Sonney") 选题：[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/201903/24/220532znndzca9a92arcc0.jpg)

3 月 21 日在阿里云峰会·北京上，阿里巴巴旗下的阿里云当天即发布多款重磅产品，涵盖了超级计算、云原生数据库，以及SaaS 加速器，包括神龙异构超算集群、新版本 Polardb 可兼容 Oracle 数据库、轻量级 GPU 异构计算产品——VGN5i 实例等。阿里云总裁兼阿里巴巴 CTO 张建峰称，阿里云已经成为阿里巴巴经济体的技术基石，将继续加大投入，扩大核心技术的代际领先优势。

在本次峰会上，阿里巴巴还宣布开源 OpenJDK 长期支持版本 Alibaba Dragonwell，为全球 Java 界开发者提供了一个新的选择。该版本广泛应用于阿里巴巴旗下业务，在大规模 Java 应用部署下的稳定性、效率以及性能优化有突出的优势。

![](/data/attachment/album/201903/24/213927afvf6dboifgjfd6f.png)

Java 是全球应用最广泛的语言技术栈。据统计，全球 Java 开发工程师超过 1000 万名。而 JDK 作为 Java 语言的软件开发工具包，是整个 Java 应用的核心。当前，在 JDK 全球市场份额中，Oracle JDK 占 70%、OpenJDK 约占 21%。但 2019 年 1 月之后，Oracle 不再提供 Oracle JDK 8 免费商业版本更新。

阿里巴巴一直不遗余力地推动全球 Java 技术进步。自 2010 年起，阿里就开始基于 OpenJDK 开源软件进行开发与定制。作为全集团 Java 应用的基石，Alibaba Dragonwell 支撑了阿里经济体内所有的 Java 业务，保证了多年来“双 11”的平稳运行，积累了大量业务场景下的实践经验。在大规模 Java 应用部署情况下，Alibaba Dragonwell 可以大幅度提高稳定性、效率及性能。

![](/data/attachment/album/201903/24/214050icu1kh84f1nkrx1e.jpg)

2018 年，阿里巴巴还作为首家且唯一的中国企业，获邀加入 Java 全球管理组织 Java Community Process（JCP）的最高执行委员会，为 Java 语言规范作出贡献。

“Dragonwell 中文译为龙井，象征着中国的茶文化，又恰好是杭州特色。well 一词通常被描述为水源汇聚在一起供大家分享，这也是我们开源的初衷，希望可以集合开发者的力量，不断完善该项目并最终贡献给所有用户。”阿里云智能资深技术专家李三红在采访中表示，阿里本身就是 Alibaba Dragonwell 的最大用户之一，未来一定会持续维护，这是毫无疑问的。同时也希望有更多的开发者参与贡献，让 Java 变得更好。

作为世界顶尖技术舞台上最活跃的力量之一，阿里巴巴始终积极拥抱开源，回馈社区。截止目前，阿里巴巴已经参与了 9 家全球开源基金会及组织，包括 Linux Foundation、Cloud Native Computing Foundation、Apache Software Foundation、Continuous Delivery Foundation 等，是 Linux、MySQL、JVM、Kubernetes、etcd、containerd、Flink、Envoy 等知名开源项目的核心贡献者和维护者，并主导开源 400 多个项目，涉及中间件、框架、组件、数据库、存储、工具领域等。

就此次 Dragonwell 开源的一些情况，记者采访了阿里巴巴相关负责人。

**Dragonwell，龙井？是寓意像龙井一样的品质吗？背后的想法是什么呢？**

Java 本身就是一种咖啡的名字，AWS 开源的 Corretto 也是一种咖啡名。

在取名字的时候，我们也考虑了很多。中国的 Java 开发者将是 Alibaba Dragonwell 重要的用户群体，所以想从一些有中国特色的饮品名中寻找灵感，既能代表中国的文化，同时也希望这个名字中能有非常宏大的意愿，能够诠释她包容一切。所以我们想到了杭州的绿茶——龙井。而它的英文名字 Dragonwell 也正好符合我们想要表达的意思。其中的 well 这个单词，就有着将很多水源汇聚在一起，一同享用的寓意，正好贴合开源的协作分享的精神理念，这也是阿里开源 JDK 的初衷，希望将许多开发者的贡献汇聚在一起，让大家能够一起免费使用 Java，一起推动 Java 的进步。

**为什么要去做 Dragonwell？是否可以分享一下相关背景？**

大家都知道 Java 一直是由 Oracle 主导的，早从 2017 年开始，Oracle 开始陆陆续续转变了一些 Java 的策略。去年也宣布了将从今年开始不再提供 OracleJDK 的免费更新。

阿里可以说是全球最大的 Java 用户之一，而 JDK 又是 Java 的一个基础设施。我们其实早从 2010 年开始，就已经基于 OpenJDK 开源软件进行开发与定制，9 年来，支撑了阿里经济体内所有的 Java 业务，历经多年的“双 11”考验，积累了大量业务场景下的实践经验。

阿里作为一家这么大体量的 Java 用户，我们有一份责任，就是把我们的 JDK 开放出去，给所有的 Java 用户一个新的选择。同时，对于阿里自身来说，Alibaba Dragonwell 会针对 LTS 的两个版本 Java8 和 Java11 随阿里云 VM 镜像发布，免费提供给阿里云客户使用。

**Alibaba Dragonwell 是基于哪个版本的 JDK？什么时候 GA，目前有没有各个阶段具体的发布时间表？**

此次发布的 Alibaba Dragonwell 8 预览版本对应于上游的 OpenJDK 8 的版本。Alibaba Dragonwell 作为 OpenJDK 下游，是一款免费的 JDK 发行版。它提供长期支持，包括关键修复和安全更新。

Alibaba Dragonwell 支持 x86-64/Linux 平台。Alibaba Dragonwell 的特点，或者说她所注重和强化的是：在数据中心大规模 Java 应用部署情况下，稳定性、效率以及性能的优化与提高。

目前发布的版本是预览版。 Alibaba Dragonwell 将每季度发布一个更新。目前计划是预览版的三个月后发布 GA。Alibaba Dragonwell 11 预计年底发布。

**以后会更注重 Java 新特性的跟进还是保证提供支持呢？对它今后的发展有什么设想或者目标？**

Alibaba Dragonwell 的前身是阿里巴巴内部使用的 AJDK。作为 AJDK 的开源版本， Alibaba Dragonwell 将沿袭 AJDK 的技术优势以及实践场景下的技术经验。AJDK 有众多的技术创新， 包括多租户、Wisp 协程技术、ZenGC 等。 我们希望逐步把阿里巴巴内部积累的技术创新开源出来贡献给 OpenJDK 社区, 并在 Dragonwell 沉淀下来。

**最近出现了一些开源软件变更开源协议问题，那目前/将来 Dragonwell 会不会加入一些支持限制条款呢？**

不会。Alibaba Dragonwell 是 OpenJDK 下游，我们会严格遵循 OpenJDK 社区相关原则及协议。

**前阵子 AWS 也推出了自己的 OpenJDK 发行版 Corretto，背后甚至有 Java 之父“站台”；再往前，其实 Azul、Red Hat 等厂商也有提供 OpenJDK 版本。那么阿里的 Dragonwell 有什么优势、特点呢？**

具体来说：

* 紧密与 OpenJDK 社区保持合作，保持对社区工作的跟踪，及时同步上游更。
* Alibaba Dragonwell 发行版与 Java SE 标准兼容。
* AJDK 上孵化的创新技术，会逐步贡献 OpenJDK，并在 Dragonwell 沉淀。比如这次版本包含的 JWarmUp 功能。 具体技术细节可以参考我们的用户手册。
* 基于阿里工程实践，Alibaba Dragonwell 会选择移植高版本Java的重要功能，这些移植功能已经在阿里内部被大规模部署，用户都可以免费使用，而不用等下一个 LTS 版本。比如这次版本移植了上游 Java 11 的 Java Flight Recorder （JFR）功能，Java 开发人员可以通过 JFR 收集 JVM 运行过程中的详细的 profiling 信息，配合 Java Mission Control（JMC），大幅提高 Java 应用的问题诊断及性能优化效率。这对于仍然停留在 Java8 的客户来说，还是非常有意义的。

**很多开发者使用的都是 Oracle 官方的 OracleJDK，大家什么情况下会去使用 OpenJDK 发行版，具体到 Dragonwell 是怎样呢？**

在 2018 年 CodeOne（原 JavaOne）大会上，来自 Java Platform Group 的首席架构师 Mark Reinhold 做了“The Future of Java is Today”的主题演讲，重点阐述了 Java 发布模式的变化，重点是：从 Java11 （包含）以及以后的版本，Oracle 将不再提供免费的长期支持。如果你需要长期支持，可以通过向 Oracle 付费的方式获得。而 Java8 的更新也将会在 2019 年 1 月份停止。

所以除非你是 Oracle 的付费客户，否则唯一的选择就是社区维护的 OpenJDK 版本。可以预见 Java 开发者从 Oracle JDK 切换到开源 OpenJDK 会越来越多。

阿里作为世界顶尖技术舞台上最活跃的力量之一，始终积极拥抱开源，回馈社区。我们本身就是世界上最大 Java 用户之一，未来会持续与 OpenJDK 社区的紧密合作，做好 Alibaba Dragonwell 的维护与开发工作。对于广大的 Java 开发者而言，Alibaba Dragonwell 是一个免费的新选择**。**同时我们也希望有更多的开发者能参与到社区里来、让 Java 变得更好！


区块链 2.0：介绍（一）

Summary: 区块链现在显然被认为是一种转型技术，它将为人们使用互联网的方式带来革新。本系列文章将探讨即将到来的基于区块链 2.0 的技术和应用浪潮。不同的涉众对它表现出的极大兴趣证明了区块链的存在。

![](/data/attachment/album/201903/25/101728sdrwwww2rrr4kw2z.png)

### 区块链 2.0：下一个计算范式

**区块链**现在显然被认为是一种转型技术，它将为人们使用互联网的方式带来革新。本系列文章将探讨即将到来的基于区块链 2.0 的技术和应用浪潮。不同的涉众对它表现出的极大兴趣证明了区块链的存在。

对于任何打算使用互联网做任何事情的人来说，了解它是什么以及它是如何工作的都是至关重要的。即使你所做的只是盯着 Instagram 上朋友们的早餐照片，或者寻找下一个最好的视频片段，你也需要知道这项技术能对这些提供什么样的帮助。

尽管区块链的基本概念早在上世纪 90 年代就被学术界提及，但它之所以成为网民热词，要归功于诸如**比特币**和**以太币**等支付平台的崛起。

比特币最初是一种去中心化的数字货币。它的出现意味着你基本上可以通过互联网进行完全匿名、安全可靠的支付。不过，在比特币这个简单的金融令牌系统背后，是区块链。您可以将比特币技术或任何加密货币看作是 3 层结构。区块链基础技术可以验证、记录和确认交易，在这个基础之上是协议，本质上来讲是一个规则或在线礼仪，用来兑现、记录和确认交易，当然，最重要的是通常被称作比特币的加密货币令牌。一旦记录了协议相关的事务，则由区块链生成令牌。

虽然大多数人只看到了最顶层，即代表比特币真正含义的硬币或代币，但很少有人知道，在区块链基础技术的帮助下，金融交易只是众多此类可能性中的一种。目前正在探讨这些可能性，以产生和开发所有去中心化交易方式的新标准。

在最基本的层面上，区块链可以被认为是一个包含所有记录和交易的账簿。这实际上意味着区块链理论上可以处理所有类型的记录。未来这方面的发展可能会导致各种硬资产（如房地产契约、实物钥匙等）和软无形资产（如身份记录、专利、商标、预约等）被编码为数字资产，通过区块链进行保护和转让。

对于不熟悉区块链的人来说，区块链上的事务本质上被认为是无偏见的永久记录。这是可能的，因为协议中内置了**共识系统**。所有交易均由系统参与者确认、审核和记录，在比特币加密货币平台中，该角色由**矿工**和交易所负责。这可能因不同的平台或区块链而异。构建该平台的协议栈是由开源代码所定义的，并且对任何具有技术能力的人都是免费的。与目前互联网上运行的许多其他平台不同，公开透明被内置进了该系统。

一旦事务被记录并编码到区块链中，它们就会被看到。参与者有义务按照它们最初的执行方式履行其交易和合约。除非原来的规则禁止了它，否则执行本身将由平台自动处理，因为它是硬编码的。区块链平台对于试图篡改记录、记录的持久性等方面的恢复能力，在因特网上是闻所未闻的。当这项技术的支持者们宣称其日益重要的意义时，这种能力是经常被提及的附加信任层。

这些特性并不是最近才被发现的隐藏的平台潜力，而是从一开始就被设想出来的。传说中的比特币创造者<ruby> 中本聪 <rt>  Satoshi Nakamoto </rt></ruby>在一份公报中说**“我花了数年的时间来构造一个用来支撑巨大的各种可能事务类型的设计……如果比特币能够流行起来，这些就是我们未来要探索的……但是它们在最初就设计，以确保它们将来能够实现。”**。这些特性被设计并融入到已经存在的协议中的事实印证了这些话。关键的想法是，去中心化的事务分类账就像区块链的功能一样，可以用于传输、部署和执行各种形式的合约。

领先的机构目前正在探索重新发明股票、养老金和衍生品等金融工具的可能性，而世界各国政府更关注区块链的防篡改和永久性保存记录的潜力。该平台的支持者声称，一旦开发达到一个关键的门槛，从你的酒店钥匙卡到版权和专利，那时起，一切都将通过区块链记录和实现。

**Ledra Capital**在[这个](http://ledracapital.com/blog/2014/3/11/bitcoin-series-24-the-mega-master-blockchain-list)页面上汇编并维护了几乎完整的项目和细节列表，这些项目和细节理论上可以通过区块链模型实现。想要真正意识到区块链对我们生活的影响有多大是一项艰巨的任务，但看看这个清单就会再次证明这么做的重要性。

现在，上面提到的所有官僚和商业用途可能会让你相信，这样的技术只会出现在政府和大型私营企业领域。然而，事实远非如此。鉴于该系统的巨大潜力使其对此类用途具有吸引力，而区块链还具有其它可能性和特性。还有一些与该技术相关的更复杂的概念，如 DApp、DAO、DAC、DAS 等，本系列文章将深入讨论这些概念。

基本上，开发正在如火如荼地进行，任何人对基于区块链的系统的定义、标准和功能进行指点以便进行更广泛的推广还为时尚早，但是这种可能性及其即将产生的影响无疑是存在的。甚至有人谈到基于区块链的智能手机和选举期间的民意调查。

这只是一个简短的对这个平台能力的鸟瞰。我们将通过一系列这样详细的帖子和文章来研究这些不同的可能性。关注[本系列的下一篇文章](https://www.ostechnix.com/blockchain-2-0-revolutionizing-the-financial-system/)，它将探索区块链是如何革新交易和契约的。

---

via: <https://www.ostechnix.com/blockchain-2-0-an-introduction/>

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

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


Linux 中改变主机名的 4 种方法

Summary: 今天，我们将向你展示使用不同的方法来修改主机名。你可以从中选取最适合你的方法。

今天，我们将向你展示使用不同的方法来修改主机名。你可以从中选取最适合你的方法。

![](/data/attachment/album/201903/25/111703qtu2urrgz3r6tfro.jpg)

昨天我们已经在我们的网站中写过[如何在 Linux 中修改主机名的文章](https://www.2daygeek.com/linux-change-set-hostname/)。今天，我们将向你展示使用不同的方法来修改主机名。你可以从中选取最适合你的方法。

使用 `systemd` 的系统自带一个名为 `hostnamectl` 的好用工具，它可以使我们能够轻易地管理系统的主机名。

当你使用这个原生命令时，它可以立刻改变主机名而无需重启来生效。

但假如你通过手动修改某个配置文件来更改主机名，那么就可能需要经过重启来生效。

在这篇文章中，我们将展示在使用 `systemd` 的系统中改变主机名的 4 种方法。

`hostnamectl` 命令允许在 Linux 中设置三类主机名，它们的细节如下：

* **静态：** 这是静态主机名，由系统管理员添加。
* **瞬时/动态：** 这个由 DHCP 或者 DNS 服务器在运行时赋予。
* **易读形式：** 它可以由系统管理员赋予。这个是自由形式的主机名，以一种易读形式来表示服务器，例如 “JBOSS UAT Server” 这样的名字。

这些都可以使用下面 4 种方法来设置。

* `hostnamectl` 命令：控制系统主机名。
* `nmcli` 命令：是一个控制 NetworkManager 的命令行工具。
* `nmtui` 命令：是一个控制 NetworkManager 的文本用户界面。
* `/etc/hostname` 文件：这个文件中包含系统的静态主机名。

### 方法 1：在 Linux 中使用 hostnamectl 来改变主机名

`hostnamectl` 可被用来查询和改变系统的主机名，以及相关设定。只需运行 `hostnamectl` 便可以查看系统的主机名了。

```
$ hostnamectl
```

或者使用下面的命令：

```
$ hostnamectl status
   Static hostname: daygeek-Y700
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 31bdeb7b83230a2025d43547368d75bc
           Boot ID: 267f264c448f000ea5aed47263c6de7f
  Operating System: Manjaro Linux
            Kernel: Linux 4.19.20-1-MANJARO
      Architecture: x86-64
```

假如你想改变主机名，可以使用下面的命令格式：

语法格式：

```
$ hostnamectl set-hostname [YOUR NEW HOSTNAME]
```

使用下面的命令来使用 `hostnamectl` 更改主机名。在这个例子中，我将把主机名从 `daygeek-Y700` 改为 `magi-laptop`。

```
$ hostnamectl set-hostname magi-laptop
```

你可以使用下面的命令来查看更新后的主机名。

```
$ hostnamectl
   Static hostname: magi-laptop
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 31bdeb7b83230a2025d43547368d75bc
           Boot ID: 267f264c448f000ea5aed47263c6de7f
  Operating System: Manjaro Linux
            Kernel: Linux 4.19.20-1-MANJARO
      Architecture: x86-64
```

### 方法 2：在 Linux 中使用 nmcli 命令来更改主机名

`nmcli` 是一个命令行工具，旨在控制 NetworkManager 并报告网络状态。

`nmcli` 被用来创建、展示、编辑、删除、激活和注销网络连接，同时还可以用来控制和展示网络设备的状态。另外，它也允许我们更改主机名。

使用下面的命令来利用 `nmcli` 查看当前的主机名。

```
$ nmcli general hostname
daygeek-Y700
```

语法格式：

```
$ nmcli general hostname [YOUR NEW HOSTNAME]
```

使用下面的命令来借助 `nmcli` 命令可以更改主机名。在这个例子中，我将把主机名从 `daygeek-Y700` 变成 `magi-laptop`。

```
$ nmcli general hostname magi-laptop
```

它可以在不重启下设备的情况下生效，但为了安全目的，只需要重启 `systemd-hostnamed` 服务来使得更改生效。

```
$ sudo systemctl restart systemd-hostnamed
```

再次运行相同的 `nmcli` 命令来检查更改后的主机名。

```
$ nmcli general hostname
magi-laptop
```

### 方法 3：在 Linux 中使用 nmtui 来更改主机名

`nmtui` 是一个基于 `curses` 库的 TUI 应用，被用来和 NetworkManager 交互。当启动 `nmtui` 后，如果没有指定 `nmtui` 的第一个命令行参数，它将提醒用户选择执行某项活动。

在终端中运行下面的命令来开启文本用户界面。

```
$ nmtui
```

使用向下箭头按键来选择 “Set system hostname” 这个选项，然后敲击回车键。

![](/data/attachment/album/201903/25/112025fjgqbs7j7lal4n20.png)

下面的截图展示的是原来的主机名。

![](/data/attachment/album/201903/25/112036ucq8fgg0tttce8cq.png)

我们需要做的就是删除原来的主机名，再输入新的主机名，然后选中 “OK” 敲击回车确认就可以了。

![](/data/attachment/album/201903/25/112121i7h2i7oiqjx88ixj.png)

然后它将在屏幕中向你展示更新后的主机名，再次选中 “OK” 敲击回车确认就完成更改了。

![](/data/attachment/album/201903/25/112131j8njdjkzfnank9kp.png)

最后，选中 “Quit” 按钮来从 `nmtui` 终端界面离开。

![](/data/attachment/album/201903/25/112141n2413e2b9z29i1li.png)

它可以在不重启设备的情况下生效，但为了安全目的，需要重启 `systemd-hostnamed` 服务来使得更改生效。

```
$ sudo systemctl restart systemd-hostnamed
```

你可以运行下面的命令来查看更新后的主机名。

```
$ hostnamectl
   Static hostname: daygeek-Y700
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 31bdeb7b83230a2025d43547368d75bc
           Boot ID: 267f264c448f000ea5aed47263c6de7f
  Operating System: Manjaro Linux
            Kernel: Linux 4.19.20-1-MANJARO
      Architecture: x86-64
```

### 方法 4：在 Linux 中使用 /etc/hostname 来更改主机名

除了上面的方法外，我们还可以通过修改 `/etc/hostname` 文件来达到修改主机名的目的。但这个方法需要服务器重启才能生效。

使用下面的命令来检查 `/etc/hostname` 文件以查看当前的主机名：

```
$ cat /etc/hostname
daygeek-Y700
```

要改变主机名，只需覆写这个文件就行了，因为这个文件只包含主机名这一项内容。

```
$ sudo echo "magi-daygeek" > /etc/hostname

$ cat /etc/hostname
magi-daygeek
```

然后使用下面的命令重启系统：

```
$ sudo init 6
```

最后查看 `/etc/hostname` 文件的内容来验证主机名是否被更改了。

```
$ cat /etc/hostname
magi-daygeek
```

---

via: <https://www.2daygeek.com/four-methods-to-change-the-hostname-in-linux/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[FSSlc](https://github.com/FSSlc) 校对：[wxy](https://github.com/wxy)

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


正经的我，做了个不正经的项目 —— Pornhub 风格 Logo 生成器

Summary: Logoly.Pro 是一个在线的 PornHub 风格 Logo 生成工具，可以帮助你快速生成类似 PornHub 风格的 Logo。

厉害了

执行力很强

执行力很强

原来你是这样的一个程序员

原来你是这样的一个程序员

原来你是这样的一个程序员

你好骚啊

今天本想逛逛网站看看片儿，没想到发现了这个，我的上帝你真是个人才

来自111.41.172.228的 Chrome Mobile 76.0|Android 10 用户

purnhub地址给我

来自山东枣庄的 Chrome Mobile 62.0|Android 11 用户

>
> [Logoly.Pro](https://logoly.pro/) 是一个在线的 PornHub 风格 Logo 生成工具，可以帮助你快速生成类似 PornHub 风格的 Logo。
>
>
>

![](/data/attachment/album/201903/25/161325h4xxo8p3rr8o8q49.jpg)

目前项目已经上线：<https://logoly.pro/> 代码也已开源：<https://github.com/bestony/logoly>

**欢迎各位前来试用 && 求 Star !**

---

昨晚，我花了 5 个小时，在肝一个项目，如今，让它成功上线，我便向大家介绍一下它。

### 突发的灵感

我自己平时经常要做一些业余项目，在做业余项目的时候，就涉及到了要做 Logo ，但是作为一个没有设计感的程序员，在做 Logo 时总是会做出一些很丑的 Logo ，于是痛定思痛，想想有没有什么有用的工具可以帮助我生成好看的 Logo。对于我来说，也不需要太过复杂，能够满足我自己的要求就行。

那么这就要求这个 Logo 有一些特点

1. **设计简单**：很多带吉祥物的 Logo 就不适合我了，因为要去准备吉祥物的图片。
2. **辨识度高**：单纯的简单并没有太多的用处， Logo 需要让用户能够记住

经过一番筛选，PornHub 的 Logo 进入到我的视线。

![](/data/attachment/album/201903/25/160436b9cxba8bkc9i2qz6.png)

### 设计产品

在开发之前，我先进行了产品方面的考虑，看看我需要做哪些功能，哪些不做，最终得到了这样一个清单：

**要做的项目**

1. **项目使用 Vue 开发**，因为可以快速上线
2. **项目使用 Netlify 部署**，这样就可以使用自己的域名，并使用 SSL，速度还要比 Github Pages 快一些。
3. **项目应当支持自定义文字**，这个是最基础的功能需求，必须要做的。
4. **项目应当支持自定义颜色**，毕竟可能有其他的方面，需要类似风格，但是不同的颜色的 Logo
5. **项目应当支持自定义文字大小**，毕竟我导出的是 PNG，如果不能自定义大小，大家可能会很困扰。
6. **项目应当加入 Google Analytics**，加入统计，就知道有多少人用过我的项目了，也是一种成就感。
7. **项目应当加入我的个人信息，用来给我自己推广**，顺便刷一波脸。
8. **社会化分享**，应当有个方便的分享方法，这样才能够更好的帮助项目在前期成长。

**不做的项目**

1. **自定义字体**：原汁原味的 PH 风格，怎能瞎改字体呢？
2. **导出 JPG**： 有了透明背景的 PNG，不透明的 JPG 的需求就没那么大了。

**后续迭代实现的**

1. **其他简单的 Logo**：比如 Youtube.

### 设计布局

在完成了产品的功能，我又进行了布局的设计，这次我用的是 Adobe XD，最近很喜欢用这个工具来设计产品的界面，非常的方便。最终设计完成的版本如下：

![](/data/attachment/album/201903/25/160436ontnip757pznpg1c.png)

设计完成后，就要开始准备开始编码了。

### 找库

一开始，我考虑使用一些 UI 框架，不过，由于一开始没有引入 UI 框架，快写完了才发现基本不需要组件库，干脆将错就错，这样用了。

在完成了基本的界面后，就是涉及到的一些库的使用了，这里要感谢前端生态圈的繁荣，我从 [Picas](https://picas.now.sh/) 和 [Carbon](https://carbon.now.sh/) 的源码里找到了我想要用的库。

* **dom-to-image**：将 Dom 元素转换成为图片，以备下载。
* **file-save**：在 Vue 组件里调用系统的下载接口，下载图片

其他我用到的库还有

* **v-tooltips**：用户提醒，之前用的 Vue-Tour,但是跳跃感太强了，所以弃用了。
* **vue-analytics**：Vue 下的 Google Analytics 工具，可以很方便的调用 GA 进行统计。

### 上线

在完成了开发后，将代码上传到 Github，准备部署。

在前面提到，我考虑用 Netlify 进行部署，这里非常方便，在 Netlify 上直接创建项目，选择你的项目，然后填入命令即可。

![](/data/attachment/album/201903/25/160437o8fvtft8nfvt0855.png)

并配置一下域名，将自己的域名设置为主域名：

![](/data/attachment/album/201903/25/160437xbzxboyf550f0yjo.png)

稍等一会，就会自动为你的域名签注 Let’s Encrypt 的证书。

![](/data/attachment/album/201903/25/160438vhtuhq47gkh3ih3u.png)

### 最后

关于这个项目的故事，我已经说完了所有我能想到的了，接下来，就是你的提问时间了，欢迎你针对项目对我提问，无论是产品、设计、编码，都可以~

**希望大家能够给这个项目一个 Star： <https://github.com/bestony/logoly>**


树莓派使用入门：教孩子们用树莓派学编程的 5 种方法

>
> 这是我们的《树莓派入门指南》系列的第五篇文章，它探索了帮助孩子们学习编程的一些资源。
>
>
>

![](/data/attachment/album/201903/25/225919xqfcdduqegnqcfz5.png)

无数的学校、图书馆和家庭已经证明，树莓派是让孩子们接触编程的最好方式。在本系列的前四篇文章中，你已经学习了如何去[购买](/article-10615-1.html)、[安装](/article-10644-1.html)、和[配置](/article-10645-1.html)一个树莓派。在第五篇文章中，我们将分享一些帮助孩子们使用树莓派编程的入门级资源。

### Scratch

[Scratch](https://scratch.mit.edu/) 是让孩子们了解编程基本概念（比如变量、布尔逻辑、循环等等）的一个很好的方式。你在 Raspbian 中就可以找到它，并且在互联网上你可以找到非常多的有关 Scratch 的文章和教程，包括在 Opensource.com 上的 [今天的 Scratch 是不是像“上世纪八十年代教孩子学 LOGO 编程”?](https://opensource.com/article/17/3/logo-scratch-teach-programming-kids)。

![](/data/attachment/album/201903/25/225932wiry1yiy1xgdynkr.png)

### Code.org

[Code.org](https://code.org/) 是另一个非常好的教孩子学编程的在线资源。这个组织的使命是让更多的人通过课程、教程和流行的一小时学编程来接触编程。许多学校（包括我五年级的儿子就读的学校）都使用它，让更多的孩子学习编程和计算机科学的概念。

### 阅读

读书是学习编程的另一个很好的方式。学习如何编程并不需要你会说英语，当然，如果你会英语的话，学习起来将更容易，因为大多数的编程语言都是使用英文关键字去描述命令的。如果你的英语很好，能够轻松地阅读接下来的这个树莓派系列文章，那么你就完全有能力去阅读有关编程的书籍、论坛和其它的出版物。我推荐一本由 Jason Biggs 写的书： [儿童学 Python：非常有趣的 Python 编程入门](https://www.amazon.com/Python-Kids-Playful-Introduction-Programming/dp/1593274076)。

### Raspberry Jam

另一个让你的孩子进入编程世界的好方法是在聚会中让他与其他人互动。树莓派基金会赞助了一个称为 [Raspberry Jams](https://www.raspberrypi.org/jam/#map-section) 的活动，让世界各地的孩子和成人共同参与在树莓派上学习。如果你所在的地区没有 Raspberry Jam，基金会有一个[指南](https://static.raspberrypi.org/files/jam/Raspberry-Jam-Guidebook-2017-04-26.pdf)和其它资源帮你启动一个 Raspberry Jam。

### 游戏

最后一个（是本文的最后一个，当然还有其它的方式），[Minecraft](https://minecraft.net/en-us/edition/pi/) 有一个树莓派版本。<ruby> 我的世界 <rt>  Minecraft </rt></ruby>已经从一个多玩家的、类似于”数字乐高“这样的游戏，成长为一个任何人都能使用 Python 和其它编程语言去构建我自己的虚拟世界。更多内容查看 [Minecraft Pi 入门](https://projects.raspberrypi.org/en/projects/getting-started-with-minecraft-pi) 和 [Minecraft 一小时入门教程](https://code.org/minecraft)。

你还有教孩子用树莓派学编程的珍藏资源吗？请在下面的评论区共享出来吧。

---

via: <https://opensource.com/article/19/3/teach-kids-program-raspberry-pi>

作者：[Anderson Silva](https://opensource.com/users/ansilva) 选题：[lujun9972](https://github.com/lujun9972) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


2019 年的 19 个高效日：失败了

Summary: 以下是开源世界没有做到的一些工具。

最后一张图怎么这么酷，也不仔细讲讲，吊人胃口。

看看这个 https://linux.cn/article-10525-1.html

以下是开源世界没有做到的一些工具。

>
> 以下是开源世界没有做到的一些工具。
>
>
>

![](/data/attachment/album/201903/25/233434y2twu27vu37ajhyb.png)

每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心，渴望开启新的一年，当然，“抛弃旧的，拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件，但事实上并不用这样。

保持高效一部分是接受失败。我是 [Howard Tayler](https://www.schlockmercenary.com/) 的第 70 条座右铭的支持者：“失败不是一种选择，它是一定的。可以选择的是是否让失败成为你做的最后一件事。”在这个系列中我想谈的很多事情都没有找到好的答案。

关于我的 19 个新的（或对你而言新的）帮助你在 2019 年更高效的工具的最终版，我想到了一些我想要，但是有没有找到的。我希望读者你能够帮我找到下面这些项目的好的方案。如果你发现了，请在下面的留言中分享。

### 日历

![](/data/attachment/album/201903/25/233314uzgjo8ustdo5lboo.png)

如果开源世界有一件事缺乏，那就是日历。我尝试过的日历程序和电子邮件程序的数量一样多。共享日历基本上有三个很好的选择：[Evolution](https://wiki.gnome.org/Apps/Evolution)、[Thunderbird 中的 Lightning 附加组件](https://www.thunderbird.net/en-US/calendar/) 或 [KOrganizer](https://userbase.kde.org/KOrganizer)。我尝试过的所有其他应用 (包括 [Orage](https://github.com/xfce-mirror/orage)、[Osmo](http://clayo.org/osmo/) 以及几乎所有 [Org 模式](https://orgmode.org/)附加组件) 似乎只能可靠地支持对远程日历的只读访问。如果共享日历使用 [Google 日历](https://calendar.google.com) 或 [Microsoft Exchange](https://products.office.com/) 作为服务器，那么前三个是唯一易于配置的选择（即便如此，通常还需要其他附加组件）。

### Linux 内核的系统

![](/data/attachment/album/201903/25/233320sb5dot06tiifo06s.png)

我喜欢 [Chrome OS](https://en.wikipedia.org/wiki/Chrome_OS) 的简单性和轻量需求。我有几款 Chromebook，包括谷歌的最新型号。我发现它不会分散注意力、重量轻、易于使用。通过添加 Android 应用和 Linux 容器，几乎可以在任何地方轻松高效工作。

我想把它安装到我一些闲置的笔记本上，但除非我对 Chromium OS 进行全面编译，否则很难有相同的体验。像 [Bliss OS](https://blissroms.com/)、[Phoenix OS](http://www.phoenixos.com/) 和 [Android-x86](http://www.android-x86.org/) 这样的桌面 [Android](https://www.android.com/) 项目快要完成了，我正在关注它们的未来。

### 客户服务

![](/data/attachment/album/201903/25/233329xsqh2m33u91o9qoj.png)

对于大大小小的公司来说，客户服务是一件大事。现在，随着近来对 DevOps 的关注，有必要使用工具来弥补差距。我工作的几乎每家公司都使用 [Jira](https://www.atlassian.com/software/jira)、[GitHub](https://github.com) 或 [GitLab](https://about.gitlab.com/) 来报告代码问题，但这些工具都不是很擅长于客户支持工单（除非付出大量的工作）。虽然围绕客户支持工单和问题设计了许多应用，但大多数（如果不是全部）应用都是与其他系统不兼容的孤岛（同样除非付出了大量的工作）。

我的愿望是有一个开源解决方案，它能让客户、支持人员和开发人员一起工作，而无需笨重的代码将多个系统粘合在一起。

### 轮到你了

![](/data/attachment/album/201903/25/233339j6fgtxw98jgt1616.png)

我相信这个系列中我错过了很多选择。我经常尝试新的应用，希望它们能帮助我提高工作效率。我鼓励每个人都这样做，因为当谈到使用开源工具提高工作效率时，总会有新的选择。如果你有喜欢的开源生产力应用没有进入本系列，请务必在评论中分享它们。

---

via: <https://opensource.com/article/19/1/productivity-tool-wish-list>

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


13 个开源备份解决方案

Summary: 读者们推荐了超过一打的他们喜欢的数据保护解决方案。

读者们推荐了超过一打的他们喜欢的数据保护解决方案。

>
> 读者们推荐了超过一打的他们喜欢的数据保护解决方案。
>
>
>

![](/data/attachment/album/201903/26/092749opppzo5g409494gp.png)

最近，我发起了一个 [投票](https://opensource.com/article/19/2/linux-backup-solutions)，让读者投票选出他们最喜欢的开源备份解决方案。在我们的 [版主社区](https://opensource.com/opensourcecom-team) 上，我们提供了六个推荐的解决方案 —— Cronopete、Deja Dup、Rclone、Rdiff-backup、Restic、和 Rsync，而参与的读者也在评论区分享了一些其它的选择。并且读者提供的这 13 个其它的解决方案，（到目前为止）我们要么是没有想到，要么是没有听说过。

到目前为止，最受欢迎的推荐是 [BorgBackup](https://www.borgbackup.org/)。它是一个带有压缩和加密特性以用具有数据去重功能的备份解决方案。它基于 BSD 许可证，支持 Linux、MacOS 和 BSD。

第二个是 [UrBackup](https://www.urbackup.org/)，它可以做镜像和文件的完整和增量备份；你可以保存整个分区或单个目录。它有 Windows、Linux、和 MacOS 客户端，并且采用 GNU Affero 公共许可证。

第三个是 [LuckyBackup](http://luckybackup.sourceforge.net/)；根据其网站介绍，“它是一个易于使用、快速（只传输变化部分，而不是全部数据）、安全（在做任何数据操作之前，先检查所有需要备份的目录，以确保数据安全）、可靠和完全可定制的备份解决方案。它在 GPL 许可证下发行。

[Casync](http://0pointer.net/blog/casync-a-tool-for-distributing-file-system-images.html) 是一个可寻址内容的同步解决方案 —— 它设计用于备份、同步、存储和检索大文件系统的多个相关版本。它使用 GNU Lesser 公共许可证。

[Syncthing](https://syncthing.net/) 是用于在两台计算机之间同步文件。它基于 Mozilla 公共许可证使用，根据其网站介绍，它是安全和私密的。它可以工作于 MacOS、Windows、Linux、FreeBSD、Solaris 和 OpenBSD。

[Duplicati](https://www.duplicati.com/) 是一个可工作于 Windows、MacOS 和 Linux 上的、并且支持多种标准协议（比如 FTP、SSH、WebDAV 和云服务）、免费的备份解决方案。它的特性是强大的加密功能，并且它使用 GPL 许可证。

[Dirvish](http://dirvish.org/) 是一个基于磁盘的虚拟镜像备份系统，它使用 OSL-3.0 许可证。它要求必须安装有 Rsync、Perl5、SSH。

[Bacula](https://www.bacula.org/) 的网站上介绍说：”它是允许系统管理员去管理备份、恢复、和跨网络的不同种类计算机上的多种数据的一套计算机程序“，它支持在 Linux、FreeBSD、Windows、MacOS、OpenBSD 和 Solaris 上运行，并且它的大部分源代码都是基于 AGPLv3 许可证的。

[BackupPC](https://backuppc.github.io/backuppc/) 的网站上介绍说：”它是一个高性能的、企业级的、可以备份 Linux、Windows 和 MacOS 系统的 PC 和笔记本电脑上的数据到服务器磁盘上的备份解决方案“。它是基于 GPLv3 许可证的。

[Amanda](http://www.amanda.org/) 是一个使用 C 和 Perl 写的备份系统，它允许系统管理员去备份整个网络中的客户端到一台服务器上的磁带、磁盘或基于云的系统。它是由马里兰大学于 1991 年开发并拥有版权，并且它有一个 BSD 式的许可证。

[Back in Time](https://github.com/bit-team/backintime) 是一个为 Linux 设计的简单的备份实用程序。它提供了命令行和图形用户界面，它们都是用 Python 写的。去执行一个备份，只需要指定存储快照的位置、需要备份的文件夹，和备份频率即可。它使用的是 GPLv2 许可证。

[Timeshift](https://github.com/teejee2008/timeshift) 是一个 Linux 上的备份实用程序，它类似于 Windows 上的系统恢复和 MacOS 上的时间胶囊。它的 GitHub 仓库上介绍说：“Timeshift 通过定期递增的文件系统快照来保护你的系统。这些快照可以在日后用于数据恢复，以撤销某些对文件系统的修改。”

[Kup](https://github.com/spersson/Kup) 是一个能够帮助用户备份它们的文件到 USB 驱动器上的备份解决方案，但它也可以用于执行网络备份。它的 GitHub 仓库上介绍说：”当插入你的外部硬盘时，Kup 将自动启动并复制你的最新的修改。“

感谢大家在我们的投票中分享你们喜爱的开源备份解决方案！如果还有其它的、没有提到的开源备份解决方案，请在下面的评论区分享它们。

---

via: <https://opensource.com/article/19/3/backup-solutions>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[lujun9972](https://github.com/lujun9972) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


托管你自己的在线字体

Summary: 使用自托管的开源字体来定制你的网页。

使用自托管的开源字体来定制你的网页。

>
> 使用自托管的开源字体来定制你的网页。
>
>
>

![](/data/attachment/album/201903/27/093535ixx22d5xs7dbpmrs.jpg)

字体对许多计算机用户来说可能都是很神秘的东西。举个例子，你在制作好一张很酷的传单之后，你需要将它送到某个地方去打印，结果发现，你设计的所有字体都变成了 Arial，这多半是因为打印店没用安装你设计用到的那些字体。不过，我们仍有很多方法来避免这种情况：你可以将这些使用特定字体的单词转换为路径，你也可以将它封装为 PDF，或是把开源字体封装到你的设计文件中，或者至少列出所需字体。不过，我们总会忘记一些事情，所以这仍是一个问题。

Web 上也有类似的问题。如果你对 CSS 有所了解，你可能会见过这种声明：

```
h1 { font-family: "Times New Roman", Times, serif; }
```

这是设计师正在尝试定义网站使用要用到的特定字体，如果用户没有安装 Times New Roman 这个字体，便会回落到另一个字体；如果用户也没有安装 Times 这个字体，便再次回落。它比使用图片而不是文本更好一些，但是在没有字体托管的情况下，这仍是一种棘手且不雅观的方法。不过，在早期的互联网时代，我们不得不这样做。

### 在线字体

在线字体的登场，把字体管理从客户端搬上了服务端。如今网页上的字体通常由服务器为客户端渲染，而不是要求浏览器从用户的系统中查找字体。谷歌和其它供应商托管了许多开源字体，网站设计师们可以很轻松的用 CSS 来引用它们。

不过，问题是，引用这些字体并不是不花费任何代价的。虽然引用它们免费，但是像谷歌这样的巨头喜欢跟踪那些引用它们资源的网站，其中就包括了字体资源。如果你不想你的网站帮谷歌记录每个人的活动，你可以自己托管在线字体。别觉得这很难，它其实是很简单的，大概流程就是上传字体到你的主机，再使用一个简单的 CSS 便可完成。这样做还有个好处，你的网站能更快地加载，因为它会在加载每个页面的时候进行更少的外部调用。

### 自托管在线字体

首先，你需要一个开源字体。如果你没有了解过那些令人费解的软件协议，你可能会感到很疑惑，特别是很多字体看起来都是免费的。我们中应该很少有人有字体付费意识，但是他们却在电脑上安装了一些高价的字体。不过，由于授权协议，它使得你的电脑也许带着一些 [法律上不允许复制和再分发](https://docs.microsoft.com/en-us/typography/fonts/font-faq) 的字体。像 Arial、Verdana、Calibri、Georgia、Impact、Lucida 和 Lucida Grande、Times 和 Times New Roman、Trebuchet、Geneva 以及其它的很多字体都是被微软、苹果和 Adobe 这种大公司所拥有的。如果你购买了一台预装了 Windows 或 macOS 的电脑，你就获得了使用这些字体的权利，但是你并没有拥有那些字体，也没有被许可上传它们至服务器（除非额外说明）。

幸运的事，开源热潮在很久以前就席卷了字体界。然后就有了许多优秀的开源字体的合集和项目，比如 [The League of Moveable Type](https://www.theleagueofmoveabletype.com/)、[Font Library](https://fontlibrary.org/) 以及 [Omnibus Type](https://www.omnibus-type.com)，甚至还有一些来自 [Google](https://github.com/googlefonts) 和 [Adobe](https://github.com/adobe-fonts) 的字体。

常见的字体格式有 TTF、OTF、WOFF、EOT 等。因为 Sorts Mill Goudy 发行过 <ruby> WOFF <rt>  Web Open Font Format </rt></ruby>（互联网开放字体格式，Mozilla 参与了部分开发）版本，所以下文中我会用它来做例子。当然，其它字体的方法也是一样的。

假设你想在你的网站上使用 [Sorts Mill Goudy](https://www.theleagueofmoveabletype.com/sorts-mill-goudy) 这个字体：

1、将字体文件 `GoudyStM-webfont.woff` 上传至你的服务器：

```
scp GoudyStM-webfont.woff seth@example.com:~/www/fonts/
```

你的主机可能带有像 cPanel 这样的图形化工具，通过它们上传也是一样的。

2、在你网站的 CSS 文件中，添加 `@font-face` 语句，添加后应该和这个差不多：

```
@font-face {
  font-family: "titlefont";
  src: url("../fonts/GoudyStM-webfont.woff");
}
```

`font-family` 的值是你来决定的。这是一个易于理解的名字，它用于放在使用字体名的地方。我在这里使用 “titlefont” 作为例子，是因为我希望它被用来显示标题字体。你也可以使用 “officialfont” 和 “myfont” 这样的名字。

`src` 值是你字体文件的路径。这是你服务器上字体的路径。在这里，我用 `fonts` 目录来作为示例，它和 `css` 在一个文件夹里。你服务器的文件结构可能和我的不一样，所以你需要调整一下这个路径。记住一点，一个点意味着*工作目录*，两个点则代表*父目录*。

3、现在，你已经定义了字体的名字和目录，你可以在任何指定的 CSS 类或 ID 来调用它了。举个例子，如果你希望以 Sorts Mill Goudy 字体来渲染 `<h1>`，只需要在 CSS 规则中加入你自己的字体名称：

```
h1 { font-family: "titlefont", serif; }
```

现在，你已经成功地托管并使用你自己的字体了。

![在线字体的实际效果](/data/attachment/album/201903/27/093600qvewerziqeipyzvj.jpg "Web fonts on a website")

---

via: <https://opensource.com/article/19/3/webfonts>

作者：[Seth Kenlon (Red Hat, Community Moderator)](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zhs852](https://github.com/zhs852) 校对：[wxy](https://github.com/wxy)

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


在 Linux 终端下生成随机/强密码的五种方法

![](/data/attachment/album/201903/27/100500ke3yhefs34m41tpz.jpg)

最近我们在网站上发表过一篇关于 [检查密码复杂性/强度和评分](/article-10623-1.html) 的文章。它可以帮助你检查你的密码的强度和评分。

我们可以手工创建我们需要的密码。但如果你想要为多个用户或服务器生成密码，解决方案是什么呢？

是的，Linux 中有许多可用的工具能满足这个需求。本文中我将会介绍五种最好的密码生成器。

这些工具可以为你生成高强度随机密码。如果你想要为多个用户和服务器更新密码，请继续读下去。

这些工具易于使用，这也是我喜欢用它们的原因。默认情况下它们会生成一个足够健壮的密码，你也可以通过使用其他可用的选项来生成一个超强的密码。

它会帮助你生成符合下列要求的超强密码。密码长度至少有 12-15 个字符，包括字母（大写及小写），数字及特殊符号。

工具如下：

* `pwgen`：生成易于人类记忆并且尽可能安全的密码。
* `openssl`：是一个用来从 shell 中调用 OpenSSL 加密库提供的多种密码学函数的命令行工具。
* `gpg`：OpenPGP 加密/签名工具。
* `mkpasswd`：生成新密码，可以选择直接设置给一名用户。
* `makepasswd`：使用 `/dev/urandom` 生成真随机密码，比起好记它更重视安全性。
* `/dev/urandom` 文件：两个特殊的字符文件 `/dev/random` 和 `/dev/urandom` （自 Linux 1.3.30 起出现）提供了内核随机数生成器的接口。
* `md5sum`：是一个用来计算及校验 128 位 MD5 哈希的程序。
* `sha256sum`：被设计用来使用 SHA-256 算法（SHA-2 系列，摘要长度为 256 位）校验数据完整性。
* `sha1pass`：生成一个 SHA1 密码哈希。在命令缺少盐值的情况下，将会生成一个随机的盐值向量。

### 怎么用 pwgen 命令在 linux 下生成一个随机的强壮密码？

`pwgen` 程序生成易于人类记忆并且尽可能安全的密码。

易于人类记忆的密码永远都不会像完全随机的密码一样安全。

使用 `-s` 选项来生成完全随机，难于记忆的密码。由于我们记不住，这些密码应该只用于机器。

在 Fedora 系统中，使用 [DNF 命令](https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/) 来安装 `pwgen`。

```
$ sudo dnf install pwgen
```

在 Debian/Ubuntu 系统中，使用 [APT-GET 命令](https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/) 或 [APT 命令](https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/) 来安装 `pwgen`。

```
$ sudo apt install pwgen
```

在 Arch Linux 系统中，使用 [Pacman 命令](https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/) 来安装 `pwgen`。

```
$ sudo pacman -S pwgen
```

在 RHEL/CentOS 系统中，使用 [YUM 命令](https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/) 来安装 `pwgen`。

```
$ sudo yum install pwgen
```

在 openSUSE Leap 系统中，使用 [Zypper 命令](https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/) 来安装 `pwgen`。

```
$ sudo zypper install pwgen
```

### 在 Linux 下如何使用 pwgen 命令？

使用方法非常简单直接。使用下列示例中更适合你的那种。默认情况下，它会生成一个方便记忆的密码。

想要这样做，只要在你的终端中运行 `pwgen` 命令。将会一下生成160个密码以8列20行打印出来。

```
$ pwgen
ameiK2oo aibi3Cha EPium0Ie aisoh1Ee Nidee9ae uNga0Bee uPh9ieM1 ahn1ooNg
oc5ooTea tai7eKid tae2yieS hiecaiR8 wohY2Ohk Uab2maed heC4aXoh Ob6Nieso
Shaeriu3 uy9Juk5u hoht7Doo Fah6yah3 faz9Jeew eKiek4ju as0Xuosh Eiwo4epo
oot8teeZ Ui1yoohi Aechae7A Ohdi2ael cae5Thoh Au1aeTei ais0aiC2 Cai2quin
Oox9ohz4 neev0Che ahza8AQu Ahz7eica meiBeeW0 Av3bo7ah quoiTu3f taeNg3ae
Aiko7Aiz SheiGh8E aesaeSh7 haet6Loo AeTel3oN Ath7zeer IeYah4ie UG3ootha
Ohch9Och Phuap6su iel5Xu7s diqui7Bu ieF2dier eeluHa1u Thagei0i Ceeth3oh
OCei1ahj zei2aiYo Jahgh1ia ooqu1Cej eez2aiPo Wahd5soo noo7Mei9 Hie5ashe
Uith4Or2 Xie3uh2b fuF9Eilu eiN2sha9 zae2YaSh oGh5ephi ohvao4Ae aixu6aeM
fo4Ierah iephei6A hae9eeGa eiBeiY3g Aic8Kee9 he8AheCh ohM4bid9 eemae3Zu
eesh2EiM cheiGa4j PooV2vii ahpeeg5E aezauX2c Xe7aethu Ahvaph7a Joh2heec
Ii5EeShi aij7Uo8e ooy2Ahth mieKe2ni eiQuu8fe giedaQu0 eiPhob3E oox1uo2U
eehia4Hu ga9Ahw0a ohxuZei7 eV4OoXio Kid2wu1n ku4Ahf5s uigh8uQu AhWoh0po
vo1Eeb2u Ahth7ve5 ieje4eiL ieci1Ach Meephie9 iephieY8 Eesoom7u eakai2Bo
uo8Ieche Zai3aev5 aGhahf0E Wowoo5th Oraeb0ah Gah3nah0 ieGhah0p aeCh0OhJ
ahQu2feZ ahQu0gah foik7Ush cei1Wai1 Aivi3ooY eephei5U MooZae3O quooRoh7
aequae5U pae6Ceiv eizahF1k ohmi7ETa ahyaeK1N Mohw2no8 ooc8Oone coo7Ieve
eePhei9h Weequ8eV Vie4iezu neeMiim4 ie6aiZoh Queegh2E shahwi3N Inichie8
Sid1aeji mohj4Ko7 lieDi0pe Zeemah6a thuevu2E phi4Ohsh paiKeix1 ooz1Ceph
ahV4yore ue2laePh fu1eThui qui7aePh Fahth1nu ohk9puLo aiBeez0b Neengai5
```

生成安全的随机密码，使用 `pwgen` 命令的 `-s` 选项。

```
$ pwgen -s
CU75lgZd 7HzzKgtA 2ktBJDpR F6XJVhBs UjAm3bNL zO7Dw7JJ pxn8fUvp Ka3lLilG
ywJX7iJl D9ajxb6N 78c1HOg2 g8vtWCra Jp6pBGBw oYuev9Vl gbA6gHV8 G6XQoVO5
uQN98IU4 50GgQfrX FrTsou2t YQorO4x6 UGer8Yi2 O7DB5nw1 1ax370UR 1xVRPkA1
RVaGDr2i Nt11ekUd 9Vm3D244 ck8Lnpd0 SjDt8uWn 5ERT4tf8 4EONFzyY Jc6T83jg
WZa6bKPW H4HMo1YU bsDDRik3 gBwV7LOW 9H1QRQ4x 3Ak7RcSe IJu2RBF9 e508xrLC
SzTrW191 AslxDa6E IkWWov2b iOb6EmTy qHt82OwG 5ZFO7B53 97zmjOPu A4KZuhYV
uQpoJR4D 0eKyOiUr Rz96smeO 3HTABu3N 6W0VmEls uPsp5zpw 8UD3VkMG YTct6Rd4
VKo0cVmq E07ZX7j9 kQSlvA69 Nm3fpv3i xWvF2xMu yEfcw8uA oQGVX3l9 grTzx7Xj
s4GVEYtM uJl5sYMe n3icRPiY ED3Mup4B k3M9KHI7 IkxqoSM0 dt2cxmMU yb2tUkut
2Q9wGZQx 8Rpo11s9 I13siOHu 7GV64Fjv 3VONzD8i SCDfVD3F oiPTx239 6BQakoiJ
XUEokiC4 ybL7VGmL el2RfvWk zKc7CLcE 3FqNBSyA NjDWrvZ5 KI3NSX4h VFyo6VPr
h4q3XeqZ FDYMoX6f uTU5ZzU3 6u4ob4Ep wiYPt05n CZga66qh upzH6Z9y RuVcqbe8
taQv11hq 1xsY67a8 EVo9GLXA FCaDLGb1 bZyh0YN8 0nTKo0Qy RRVUwn9t DuU8mwwv
x96LWpCb tFLz3fBG dNb4gCKf n6VYcOiH 1ep6QYFZ x8kaJtrY 56PDWuW6 1R0If4kV
2XK0NLQK 4XQqhycl Ip08cn6c Bnx9z2Bz 7gjGlON7 CJxLR1U4 mqMwir3j ovGXWu0z
MfDjk5m8 4KwM9SAN oz0fZ5eo 5m8iRtco oP5BpLh0 Z5kvwr1W f34O2O43 hXao1Sp8
tKoG5VNI f13fuYvm BQQn8MD3 bmFSf6Mf Z4Y0o17U jT4wO1DG cz2clBES Lr4B3qIY
ArKQRND6 8xnh4oIs nayiK2zG yWvQCV3v AFPlHSB8 zfx5bnaL t5lFbenk F2dIeBr4
C6RqDQMy gKt28c9O ZCi0tQKE 0Ekdjh3P ox2vWOMI 14XF4gwc nYA0L6tV rRN3lekn
lmwZNjz1 4ovmJAr7 shPl9o5f FFsuNwj0 F2eVkqGi 7gw277RZ nYE7gCLl JDn05S5N
```

假设你想要生成 5 个 14 字符长的密码，方法如下：

```
$ pwgen -s 14 5
7YxUwDyfxGVTYD em2NT6FceXjPfT u8jlrljbrclcTi IruIX3Xu0TFXRr X8M9cB6wKNot1e
```

如果你真的想要生成 20 个超强随机密码，方法如下：

```
$ pwgen -cnys 14 20
mQ3E=vfGfZ,5[B #zmj{i5|ZS){jg Ht_8i7OqJ%N`~2 443fa5iJ\W-L?] ?Qs$o=vz2vgQBR
^'Ry0Az|J9p2+0 t2oA/n7U_'|QRx EsX*%_(4./QCRJ ACr-,8yF9&eM[* !Xz1C'bw?tv50o
8hfv-fK(VxwQGS q!qj?sD7Xmkb7^ N#Zp\_Y2kr%!)~ 4*pwYs{bq]Hh&Y |4u=-Q1!jS~8=;
]{$N#FPX1L2B{h I|01fcK.z?QTz" l~]JD_,W%5bp.E +i2=D3;BQ}p+$I n.a3,.D3VQ3~&i
```

### 如何在 Linux 下使用 openssl 命令生成随机强密码？

`openssl` 是一个用来从 shell 中调用 OpenSSL 加密库提供的多种密码学函数的命令行工具。

像下面这样运行 `openssl` 命令可以生成一个 14 字符长的随机强密码。

```
$ openssl rand -base64 14
WjzyDqdkWf3e53tJw/c=
```

如果你想要生成 10 个 14 字符长的随机强密码，将 `openssl` 命令与 `for` 循环结合起来使用。

```
$ for pw in {1..10}; do openssl rand -base64 14; done
6i0hgHDBi3ohZ9Mil8I=
gtn+y1bVFJFanpJqWaA=
rYu+wy+0nwLf5lk7TBA=
xrdNGykIzxaKDiLF2Bw=
cltejRkDPdFPC/zI0Pg=
G6aroK6d4xVVYFTrZGs=
jJEnFoOk1+UTSx/wJrY=
TFxVjBmLx9aivXB3yxE=
oQtOLPwTuO8df7dIv9I=
ktpBpCSQFOD+5kIIe7Y=
```

### 如何在 Linux 下使用 gpg 命令生成随机强密码？

`gpg` 是 Gnu Privacy Guard （GnuPG） 中的 OpenPGP 实现部分。它是一个提供 OpenPGP 标准的数字加密与签名服务的工具。`gpg` 具有完整的密钥管理功能和其他完整 OpenPGP 实现应该具备的全部功能。

下面这样执行 `gpg` 命令来生成一个 14 字符长的随机强密码。

```
$ gpg --gen-random --armor 1 14
or
$ gpg2 --gen-random --armor 1 14
jq1mtY4gBa6gIuJrggM=
```

如果想要使用 `gpg` 生成 10 个 14 字符长的随机强密码，像下面这样使用 `for` 循环。

```
$ for pw in {1..10}; do gpg --gen-random --armor 1 14; done
or
$ for pw in {1..10}; do gpg2 --gen-random --armor 1 14; done
F5ZzLSUMet2kefG6Ssc=
8hh7BFNs8Qu0cnrvHrY=
B+PEt28CosR5xO05/sQ=
m21bfx6UG1cBDzVGKcE=
wALosRXnBgmOC6+++xU=
TGpjT5xRxo/zFq/lNeg=
ggsKxVgpB/3aSOY15W4=
iUlezWxL626CPc9omTI=
pYb7xQwI1NTlM2rxaCg=
eJjhtA6oHhBrUpLY4fM=
```

### 如何在 Linux 下使用 mkpasswd 命令生成随机强密码？

`mkpasswd` 生成密码并可以自动将其为用户设置。不加任何参数的情况下，`mkpasswd` 返回一个新的密码。它是 expect 软件包的一部分，所以想要使用 `mkpasswd` 命令，你需要安装 expect 软件包。

在 Fedora 系统中，使用 [DNF 命令](https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/) 来安装 `mkpasswd`。

```
$ sudo dnf install expect
```

在 Debian/Ubuntu 系统中，使用 [APT-GET 命令](https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/) 或 [APT 命令](https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/) 来安装 `mkpasswd`。

```
$ sudo apt install expect
```

在 Arch Linux 系统中，使用 [Pacman 命令](https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/) 来安装 `mkpasswd`。

```
$ sudo pacman -S expect
```

在 RHEL/CentOS 系统中，使用 [YUM 命令](https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/) 来安装 `mkpasswd`。

```
$ sudo yum install expect
```

在 openSUSE Leap 系统中，使用 [Zypper 命令](https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/) 来安装 `mkpasswd`。

```
$ sudo zypper install expect
```

在终端中执行 `mkpasswd` 命令来生成一个随机密码。

```
$ mkpasswd
37_slQepD
```

像下面这样执行 `mkpasswd` 命令可以生成一个 14 字符长的随机强密码。

```
$ mkpasswd -l 14
W1qP1uv=lhghgh
```

像下面这样执行 `mkpasswd` 命令 来生成一个 14 字符长，包含大小写字母、数字和特殊字符的随机强密码。

```
$ mkpasswd -l 14 -d 3 -C 3 -s 3
3aad!bMWG49"t,
```

如果你想要生成 10 个 14 字符长的随机强密码（包括大小写字母、数字和特殊字符），使用 `for` 循环和 `mkpasswd` 命令。

```
$ for pw in {1..10}; do mkpasswd -l 14 -d 3 -C 3 -s 3; done
zmSwP[q9;P1r6[
E42zcvzM"i3%B\
8}1#[email protected]
0X:zB(mmU22?nj
0sqqL44M}ko(O^
43tQ(.6jG;ceRq
-jB6cp3x1GZ$e=
$of?Rj9kb2N(1J
9HCf,nn#gjO79^
Tu9m56+Ev_Yso(
```

### 如何在 Linux 下使用 makepasswd 命令生成随机强密码？

`makepasswd` 使用 `/dev/urandom` 生成真随机密码，与易于记忆相比它更注重安全性。它也可以加密命令行中给出的明文密码。

在终端中执行 `makepasswd` 命令来生成一个随机密码。

```
$ makepasswd
HdCJafVaN
```

在终端中像下面这样执行 `makepasswd` 命令来生成 14 字符长的随机强密码。

```
$ makepasswd --chars 14
HxJDv5quavrqmU
```

像下面这样执行 `makepasswd` 来生成 10 个 14 字符长的随机强密码。

```
$ makepasswd --chars 14 --count 10
TqmKVWnRGeoVNr
mPV2P98hLRUsai
MhMXPwyzYi2RLo
dxMGgLmoFpYivi
8p0G7JvJjd6qUP
7SmX95MiJcQauV
KWzrh5npAjvNmL
oHPKdq1uA9tU85
V1su9GjU2oIGiQ
M2TMCEoahzLNYC
```

### 如何在 Linux 系统中使用多个命令生成随机强密码？

如果你还在寻找其他的方案，下面的工具也可以用来在 Linux 中生成随机密码。

使用 `md5sum`：它是一个用来计算及校验 128 位 MD5 哈希的程序。

```
$ date | md5sum
9baf96fb6e8cbd99601d97a5c3acc2c4 -
```

使用 `/dev/urandom`: 两个特殊的字符文件 `/dev/random` 和 `/dev/urandom` （自 Linux 1.3.30 起出现）提供了内核随机数生成器的接口。`/dev/random` 的主设备号为 1，次设备号为 8。`/dev/urandom` 主设备号为 1，次设备号为 9。

```
$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 14
15LQB9J84Btnzz
```

使用 `sha256sum`：它被设计用来使用 SHA-256 算法（SHA-2 系列，摘要长度为 256 位）校验数据完整性。

```
$ date | sha256sum
a114ae5c458ae0d366e1b673d558d921bb937e568d9329b525cf32290478826a -
```

使用 `sha1pass`：它生成一个 SHA1 密码哈希。在命令缺少盐值的情况下，将会生成一个随机的盐值向量。

```
$ sha1pass
$4$9+JvykOv$e7U0jMJL2yBOL+RVa2Eke8SETEo$
```

---

via: <https://www.2daygeek.com/5-ways-to-generate-a-random-strong-password-in-linux-terminal/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[leommx](https://github.com/leommxj) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 中添加新磁盘

Summary: 在 Linux 机器中添加磁盘的逐步过程。

在 Linux 机器中添加磁盘的逐步过程。

>
> 在 Linux 机器中添加磁盘的逐步过程。
>
>
>

![](/data/attachment/album/201903/27/132443nlyyrr9fyydqqrf2.jpg)

本文将向你介绍在 Linux 机器中添加新磁盘的步骤。将原始磁盘添加到 Linux 机器可能非常依赖于你所拥有的服务器类型，但是一旦将磁盘提供给机器，将其添加到挂载点的过程几乎相同。

**目标**：向服务器添加新的 10GB 磁盘，并使用 lvm 和新创建的卷组创建 5GB 装载点。

### 向 Linux 机器添加原始磁盘

如果你使用的是 AWS EC2 Linux 服务器，可以 [按照以下步骤](https://kerneltalks.com/cloud-services/how-to-add-ebs-disk-on-aws-linux-server/) 添加原始磁盘。如果使用的是 VMware Linux VM，那么需要按照不同的步骤来添加磁盘。如果你正在运行物理机架设备/刀片服务器，那么添加磁盘将是一项物理任务。

一旦磁盘物理/虚拟地连接到 Linux 机器上，它将被内核识别，就可以开始了。

### 识别 Linux 最新添加的磁盘

原始磁盘连接后，需要让内核去 [扫描新磁盘](https://kerneltalks.com/disk-management/howto-scan-new-lun-disk-linux-hpux/)。在新版中，它主要是由内核自动完成。

第一件事是在内核中识别新添加的磁盘及其名称。实现这一点的方法有很多，以下作少量列举：

* 可以在添加/扫描磁盘前后观察 `lsblk` 输出，以获取新的磁盘名。
* 检查 `/dev` 文件系统中新创建的磁盘文件。匹配文件和磁盘添加时间的时间戳。
* 观察 `fdisk-l` 添加/扫描磁盘前后的输出，以获取新的磁盘名。

在本示例中，我使用的是 AWS EC2 服务器，向服务器添加了 5GB 磁盘。我的 lsblk 输出如下：

```
[root@kerneltalks ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0  10G  0 part /
xvdf    202:80   0  10G  0 disk
```

可以看到 `xvdf` 是新添加的磁盘。完整路径是 `/dev/xvdf`。

### 在 LVM 中添加新磁盘

我们这里使用 LVM，因为它是 Linux 平台上广泛使用的非常灵活的卷管理器。确认 lvm 或 lvm2 软件包[已经安装在系统上](https://kerneltalks.com/tools/check-package-installed-linux/)。如未安装，请 [安装 lvm/lvm2 程序包](https://kerneltalks.com/tools/package-installation-linux-yum-apt/)。

现在，我们将在逻辑卷管理器中添加这个原始磁盘，并从中创建 10GB 的挂接点。所用到的命令如下：

* [pvcreate](https://kerneltalks.com/disk-management/lvm-command-tutorials-pvcreate-pvdisplay/)
* [vgcreate](https://kerneltalks.com/disk-management/lvm-commands-tutorial-vgcreate-vgdisplay-vgscan/)
* [lvcreate](https://kerneltalks.com/disk-management/lvm-commands-tutorial-lvcreate-lvdisplay-lvremove/)

如果要将磁盘添加到现有挂接点，并使用其空间来[扩展挂接点](https://kerneltalks.com/disk-management/extend-file-system-online-lvm/) ，则 `vgcreate` 应替换为 `vgextend`。

会话示例输出如下：

```
[root@kerneltalks ~]# pvcreate /dev/xvdf
  Physical volume "/dev/xvdf" successfully created.
[root@kerneltalks ~]# vgcreate vgdata /dev/xvdf
  Volume group "vgdata" successfully created
[root@kerneltalks ~]# lvcreate -L 5G -n lvdata vgdata
  Logical volume "lvdata" created.
```

现在，已完成逻辑卷创建。你需要使用所选的文件系统格式化它，并将其挂载。在这里选择 ext4 文件系统，并使用 `mkfs.ext4` 进行格式化。

```
[root@kerneltalks ~]# mkfs.ext4 /dev/vgdata/lvdata
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
```

### 在挂载点上从新磁盘挂载卷

使用 `mount` 命令，在 `/data` 安装点上安装已创建并格式化的 5GB 逻辑卷。

```
[root@kerneltalks ~]# mount /dev/vgdata/lvdata /data
[root@kerneltalks ~]# df -Ph /data
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgdata-lvdata  4.8G   20M  4.6G   1% /data
```

使用 `df` 命令验证挂载点。如上所述，你都完成了！你可以在 [/etc/fstab](https://kerneltalks.com/config/understanding-etcfstab-file/) 中添加一个条目，以便在重新启动时保持此装载。

你已将 10GB 磁盘连接到 Linux 计算机，并创建了 5GB 挂载点！

---

via: <https://kerneltalks.com/hardware-config/how-to-add-new-disk-in-linux/>

作者：[kerneltalks](https://kerneltalks.com) 选题：[lujun9972](https://github.com/lujun9972) 译者：[luckyele](https://github.com/luckyele) 校对：[wxy](https://github.com/wxy)

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


如何打造更小巧的容器镜像

Summary: 五种优化 Linux 容器大小和构建更小的镜像的方法。

五种优化 Linux 容器大小和构建更小的镜像的方法。

>
> 五种优化 Linux 容器大小和构建更小的镜像的方法。
>
>
>

![](/data/attachment/album/201903/27/230706wa8s0xq01s066w60.jpg)

[Docker](https://www.docker.com/) 近几年的爆炸性发展让大家逐渐了解到容器和容器镜像的概念。尽管 Linux 容器技术在很早之前就已经出现，但这项技术近来的蓬勃发展却还是要归功于 Docker 对用户友好的命令行界面以及使用 Dockerfile 格式轻松构建镜像的方式。纵然 Docker 大大降低了入门容器技术的难度，但构建一个兼具功能强大、体积小巧的容器镜像的过程中，有很多技巧需要了解。

### 第一步：清理不必要的文件

这一步和在普通服务器上清理文件没有太大的区别，而且要清理得更加仔细。一个小体积的容器镜像在传输方面有很大的优势，同时，在磁盘上存储不必要的数据的多个副本也是对资源的一种浪费。因此，这些技术对于容器来说应该比有大量专用内存的服务器更加需要。

清理容器镜像中的缓存文件可以有效缩小镜像体积。下面的对比是使用 `dnf` 安装 [Nginx](https://www.nginx.com/) 构建的镜像，分别是清理和没有清理 yum 缓存文件的结果：

```
# Dockerfile with cache
FROM fedora:28
LABEL maintainer Chris Collins <collins.christopher@gmail.com>

RUN dnf install -y nginx

-----

# Dockerfile w/o cache
FROM fedora:28
LABEL maintainer Chris Collins <collins.christopher@gmail.com>

RUN dnf install -y nginx \
        && dnf clean all \
        && rm -rf /var/cache/yum

-----

[chris@krang] $ docker build -t cache -f Dockerfile .
[chris@krang] $ docker images --format "{{.Repository}}: {{.Size}}"
| head -n 1
cache: 464 MB

[chris@krang] $ docker build -t no-cache -f Dockerfile-wo-cache .
[chris@krang] $ docker images --format "{{.Repository}}: {{.Size}}"  | head -n 1
no-cache: 271 MB
```

从上面的结果来看，清理缓存文件的效果相当显著。和清除了元数据和缓存文件的容器镜像相比，不清除的镜像体积接近前者的两倍。除此以外，包管理器缓存文件、Ruby gem 的临时文件、nodejs 缓存文件，甚至是下载的源码 tarball 最好都全部清理掉。

### 层：一个潜在的隐患

很不幸（当你往下读，你会发现这是不幸中的万幸），根据容器中的层的概念，不能简单地向 Dockerfile 中写一句 `RUN rm -rf /var/cache/yum` 就完事儿了。因为 Dockerfile 的每一条命令都以一个层的形式存储，并一层层地叠加。所以，如果你是这样写的：

```
RUN dnf install -y nginx
RUN dnf clean all
RUN rm -rf /var/cache/yum
```

你的容器镜像就会包含三层，而 `RUN dnf install -y nginx` 这一层仍然会保留着那些缓存文件，然后在另外两层中被移除。但缓存实际上仍然是存在的，当你把一个文件系统挂载在另外一个文件系统之上时，文件仍然在那里，只不过你见不到也访问不到它们而已。

在上一节的示例中，你会看到正确的做法是将几条命令链接起来，在产生缓存文件的同一条 Dockerfile 指令里把缓存文件清理掉：

```
RUN dnf install -y nginx \
        && dnf clean all \
        && rm -rf /var/cache/yum
```

这样就把几条命令连成了一条命令，在最终的镜像中只占用一个层。这样只会浪费一点缓存的好处，稍微多耗费一点点构建容器镜像的时间，但被清理掉的缓存文件就不会留存在最终的镜像中了。作为一个折衷方法，只需要把一些相关的命令（例如 `yum install` 和 `yum clean all`、下载文件、解压文件、移除 tarball 等等）连接成一个命令，就可以在最终的容器镜像中节省出大量体积，你也能够利用 Docker 的缓存加快开发速度。

层还有一个更隐蔽的特性。每一层都记录了文件的更改，这里的更改并不仅仅已有的文件累加起来，而是包括文件属性在内的所有更改。因此即使是对文件使用了 `chmod` 操作也会被在新的层创建文件的副本。

下面是一次 `docker images` 命令的输出内容。其中容器镜像 `layer_test_1` 是在 CentOS 基础镜像中增加了一个 1GB 大小的文件后构建出来的镜像，而容器镜像 `layer_test_2` 是使用了 `FROM layer_test_1` 语句创建出来的，除了执行一条 `chmod u+x` 命令没有做任何改变。

```
layer_test_2        latest       e11b5e58e2fc           7 seconds ago           2.35 GB
layer_test_1        latest       6eca792a4ebe           2 minutes ago           1.27 GB
```

如你所见，`layer_test_2` 镜像比 `layer_test_1` 镜像大了 1GB 以上。尽管事实上 `layer_test_1` 只是 `layer_test_2` 的前一层，但隐藏在这第二层中有一个额外的 1GB 的文件。在构建容器镜像的过程中，如果在单独一层中进行移动、更改、删除文件，都会出现类似的结果。

### 专用镜像和公用镜像

有这么一个亲身经历：我们部门重度依赖于 [Ruby on Rails](https://rubyonrails.org/)，于是我们开始使用容器。一开始我们就建立了一个正式的 Ruby 的基础镜像供所有的团队使用，为了简单起见（以及在“这就是我们自己在服务器上瞎鼓捣的”想法的指导下），我们使用 [rbenv](https://github.com/rbenv/rbenv) 将 Ruby 最新的 4 个版本都安装到了这个镜像当中，目的是让开发人员只用这个单一的镜像就可以将使用不同版本 Ruby 的应用程序迁移到容器中。我们当时还认为这是一个虽然非常大但兼容性相当好的镜像，因为这个镜像可以同时满足各个团队的使用。

实际上这是费力不讨好的。如果维护独立的、版本略微不同的镜像中，可以很轻松地实现镜像的自动化维护。同时，选择特定版本的特定镜像，还有助于在引入破坏性改变，在应用程序接近生命周期结束前提前做好预防措施，以免产生不可控的后果。庞大的公用镜像也会对资源造成浪费，当我们后来将这个庞大的镜像按照 Ruby 版本进行拆分之后，我们最终得到了共享一个基础镜像的多个镜像，如果它们都放在一个服务器上，会额外多占用一点空间，但是要比安装了多个版本的巨型镜像要小得多。

这个例子也不是说构建一个灵活的镜像是没用的，但仅对于这个例子来说，从一个公共镜像创建根据用途而构建的镜像最终将节省存储资源和维护成本，而在受益于公共基础镜像的好处的同时，每个团队也能够根据需要来做定制化的配置。

### 从零开始：将你需要的内容添加到空白镜像中

有一些和 Dockerfile 一样易用的工具可以轻松创建非常小的兼容 Docker 的容器镜像，这些镜像甚至不需要包含一个完整的操作系统，就可以像标准的 Docker 基础镜像一样小。

我曾经写过一篇[关于 Buildah 的文章](https://opensource.com/article/18/6/getting-started-buildah)，我想在这里再一次推荐一下这个工具。因为它足够的灵活，可以使用宿主机上的工具来操作一个空白镜像并安装打包好的应用程序，而且这些工具不会被包含到镜像当中。

Buildah 取代了 `docker build` 命令。可以使用 Buildah 将容器的文件系统挂载到宿主机上并进行交互。

下面来使用 Buildah 实现上文中 Nginx 的例子（现在忽略了缓存的处理）：

```
#!/usr/bin/env bash
set -o errexit

# Create a container
container=$(buildah from scratch)

# Mount the container filesystem
mountpoint=$(buildah mount $container)

# Install a basic filesystem and minimal set of packages, and nginx
dnf install --installroot $mountpoint  --releasever 28 glibc-minimal-langpack nginx --setopt install_weak_deps=false -y

# Save the container to an image
buildah commit --format docker $container nginx

# Cleanup
buildah unmount $container

# Push the image to the Docker daemon’s storage
buildah push nginx:latest docker-daemon:nginx:latest

```

你会发现这里使用的已经不再是 Dockerfile 了，而是普通的 Bash 脚本，而且是从框架（或空白）镜像开始构建的。上面这段 Bash 脚本将容器的根文件系统挂载到了宿主机上，然后使用宿主机的命令来安装应用程序，这样的话就不需要把软件包管理器放置到容器镜像中了。

这样所有无关的内容（基础镜像之外的部分，例如 `dnf`）就不再会包含在镜像中了。在这个例子当中，构建出来的镜像大小只有 304 MB，比使用 Dockerfile 构建的镜像减少了 100 MB 以上。

```
[chris@krang] $ docker images |grep nginx
docker.io/nginx      buildah      2505d3597457    4 minutes ago         304 MB
```

注：这个镜像是使用上面的构建脚本构建的，镜像名称中前缀的 `docker.io` 只是在推送到镜像仓库时加上的。

对于一个 300MB 级别的容器基础镜像来说，能缩小 100MB 已经是很显著的节省了。使用软件包管理器来安装 Nginx 会带来大量的依赖项，如果能够使用宿主机直接从源代码对应用程序进行编译然后构建到容器镜像中，节省出来的空间还可以更多，因为这个时候可以精细的选用必要的依赖项，非必要的依赖项一概不构建到镜像中。

[Tom Sweeney](https://twitter.com/TSweeneyRedHat) 有一篇文章《[用 Buildah 构建更小的容器](https://opensource.com/article/18/5/containers-buildah)》，如果你想在这方面做深入的优化，不妨参考一下。

通过 Buildah 可以构建一个不包含完整操作系统和代码编译工具的容器镜像，大幅缩减了容器镜像的体积。对于某些类型的镜像，我们可以进一步采用这种方式，创建一个只包含应用程序本身的镜像。

### 使用静态链接的二进制文件来构建镜像

按照这个思路，我们甚至可以更进一步舍弃容器内部的管理和构建工具。例如，如果我们足够专业，不需要在容器中进行排错调试，是不是可以不要 Bash 了？是不是可以不要 [GNU 核心套件](https://www.gnu.org/software/coreutils/coreutils.html)了？是不是可以不要 Linux 基础文件系统了？如果你使用的编译型语言支持[静态链接库](https://en.wikipedia.org/wiki/Static_library)，将应用程序所需要的所有库和函数都编译成二进制文件，那么程序所需要的函数和库都可以复制和存储在二进制文件本身里面。

这种做法在 [Golang](https://golang.org/) 社区中已经十分常见，下面我们使用由 Go 语言编写的应用程序进行展示：

以下这个 Dockerfile 基于 golang:1.8 镜像构建一个小的 Hello World 应用程序镜像：

```
FROM golang:1.8

ENV GOOS=linux
ENV appdir=/go/src/gohelloworld

COPY ./ /go/src/goHelloWorld
WORKDIR /go/src/goHelloWorld

RUN go get
RUN go build -o /goHelloWorld -a

CMD ["/goHelloWorld"]
```

构建出来的镜像中包含了二进制文件、源代码以及基础镜像层，一共 716MB。但对于应用程序运行唯一必要的只有编译后的二进制文件，其余内容在镜像中都是多余的。

如果在编译的时候通过指定参数 `CGO_ENABLED=0` 来禁用 `cgo`，就可以在编译二进制文件的时候忽略某些函数的 C 语言库：

```
GOOS=linux CGO_ENABLED=0 go build -a goHelloWorld.go
```

编译出来的二进制文件可以加到一个空白（或框架）镜像：

```
FROM scratch
COPY goHelloWorld /
CMD ["/goHelloWorld"]
```

来看一下两次构建的镜像对比：

```
[ chris@krang ] $ docker images
REPOSITORY      TAG             IMAGE ID                CREATED                 SIZE
goHello     scratch     a5881650d6e9            13 seconds ago          1.55 MB
goHello     builder     980290a100db            14 seconds ago          716 MB
```

从镜像体积来说简直是天差地别了。基于 golang:1.8 镜像构建出来带有 goHelloWorld 二进制的镜像（带有 `builder` 标签）体积是基于空白镜像构建的只包含该二进制文件的镜像的 460 倍！后者的整个镜像大小只有 1.55MB，也就是说，有 713MB 的数据都是非必要的。

正如上面提到的，这种缩减镜像体积的方式在 Golang 社区非常流行，因此不乏这方面的文章。[Kelsey Hightower](https://twitter.com/kelseyhightower) 有一篇[文章](https://medium.com/@kelseyhightower/optimizing-docker-images-for-static-binaries-b5696e26eb07)专门介绍了如何处理这些库的依赖关系。

### 压缩镜像层

除了前面几节中讲到的将多个命令链接成一个命令的技巧，还可以对镜像进行压缩。镜像压缩的实质是导出它，删除掉镜像构建过程中的所有中间层，然后保存镜像的当前状态为单个镜像层。这样可以进一步将镜像缩小到更小的体积。

在 Docker 1.13 之前，压缩镜像层的的过程可能比较麻烦，需要用到 `docker-squash` 之类的工具来导出容器的内容并重新导入成一个单层的镜像。但 Docker 在 Docker 1.13 中引入了 `--squash` 参数，可以在构建过程中实现同样的功能：

```
FROM fedora:28
LABEL maintainer Chris Collins <collins.christopher@gmail.com>

RUN dnf install -y nginx
RUN dnf clean all
RUN rm -rf /var/cache/yum

[chris@krang] $ docker build -t squash -f Dockerfile-squash --squash .
[chris@krang] $ docker images --format "{{.Repository}}: {{.Size}}"  | head -n 1
squash: 271 MB
```

通过这种方式使用 Dockerfile 构建出来的镜像有 271MB 大小，和上面连接多条命令的方案构建出来的镜像体积一样，因此这个方案也是有效的，但也有一个潜在的问题，而且是另一种问题。

“什么？还有另外的问题？”

好吧，有点像以前一样的问题，以另一种方式引发了问题。

### 过头了：过度压缩、太小太专用了

容器镜像之间可以共享镜像层。基础镜像或许大小上有几 Mb，但它只需要拉取/存储一次，并且每个镜像都能复用它。所有共享基础镜像的实际镜像大小是基础镜像层加上每个特定改变的层的差异内容，因此，如果有数千个基于同一个基础镜像的容器镜像，其体积之和也有可能只比一个基础镜像大不了多少。

因此，这就是过度使用压缩或专用镜像层的缺点。将不同镜像压缩成单个镜像层，各个容器镜像之间就没有可以共享的镜像层了，每个容器镜像都会占有单独的体积。如果你只需要维护少数几个容器镜像来运行很多容器，这个问题可以忽略不计；但如果你要维护的容器镜像很多，从长远来看，就会耗费大量的存储空间。

回顾上面 Nginx 压缩的例子，我们能看出来这种情况并不是什么大的问题。在这个镜像中，有 Fedora 操作系统和 Nginx 应用程序，没有缓存，并且已经被压缩。但我们一般不会使用一个原始的 Nginx，而是会修改配置文件，以及引入其它代码或应用程序来配合 Nginx 使用，而要做到这些，Dockerfile 就变得更加复杂了。

如果使用普通的镜像构建方式，构建出来的容器镜像就会带有 Fedora 操作系统的镜像层、一个安装了 Nginx 的镜像层（带或不带缓存）、为 Nginx 作自定义配置的其它多个镜像层，而如果有其它容器镜像需要用到 Fedora 或者 Nginx，就可以复用这个容器镜像的前两层。

```
[   App 1 Layer (  5 MB) ]          [   App 2 Layer (6 MB) ]
[   Nginx Layer ( 21 MB) ] ------------------^
[ Fedora  Layer (249 MB) ]
```

如果使用压缩镜像层的构建方式，Fedora 操作系统会和 Nginx 以及其它配置内容都被压缩到同一层里面，如果有其它容器镜像需要使用到 Fedora，就必须重新引入 Fedora 基础镜像，这样每个容器镜像都会额外增加 249MB 的大小。

```
[ Fedora + Nginx + App 1 (275 MB)]      [ Fedora + Nginx + App 2 (276 MB) ]
```

当你构建了大量在功能上趋于分化的的小型容器镜像时，这个问题就会暴露出来了。

就像生活中的每一件事一样，关键是要做到适度。根据镜像层的实现原理，如果一个容器镜像变得越小、越专用化，就越难和其它容器镜像共享基础的镜像层，这样反而带来不好的效果。

对于仅在基础镜像上做微小变动构建出来的多个容器镜像，可以考虑共享基础镜像层。如上所述，一个镜像层本身会带有一定的体积，但只要存在于镜像仓库中，就可以被其它容器镜像复用。这种情况下，数千个镜像也许要比单个镜像占用更少的空间。

```
[ specific app   ]      [ specific app 2 ]
[ customizations ]--------------^
[ base layer     ]
```

一个容器镜像变得越小、越专用化，就越难和其它容器镜像共享基础的镜像层，最终会不必要地占用越来越多的存储空间。

```
 [ specific app 1 ]     [ specific app 2 ]      [ specific app 3 ]
```

### 总结

减少处理容器镜像时所需的存储空间和带宽的方法有很多，其中最直接的方法就是减小容器镜像本身的大小。在使用容器的过程中，要经常留意容器镜像是否体积过大，根据不同的情况采用上述提到的清理缓存、压缩到一层、将二进制文件加入在空白镜像中等不同的方法，将容器镜像的体积缩减到一个有效的大小。

---

via: <https://opensource.com/article/18/7/building-container-images>

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


树莓派使用入门：可以使用树莓派学习的 3 种流行编程语言

Summary: 通过树莓派学习编程，让你在就业市场上更值钱。

通过树莓派学习编程，让你在就业市场上更值钱。

>
> 通过树莓派学习编程，让你在就业市场上更值钱。
>
>
>

![](/data/attachment/album/201903/28/092823fkllfulvk6s5aejz.png)

在本系列的上一篇文章中，我分享了 [教孩子们使用树莓派编程](/article-10653-1.html) 的一些方式。理论上，这些资源并不局限于只适用于孩子们，成人也是可以使用的。但是学习就业市场上急需的编程语言，可以让你得到更好的机会。

这里是你可以使用树莓派学习的三种编程语言。

### Python

[Python](https://opensource.com/resources/python) 已经成为开源世界里 [最流行的编程语言](https://www.economist.com/graphic-detail/2018/07/26/python-is-becoming-the-worlds-most-popular-coding-language)。它的解释器已经打包进每个流行的 Linux 发行版中。如果你在树莓派中安装的是 Raspbian，你就会看到一个名为 [Thonny](https://thonny.org/) 的应用，它是为新手准备的 Python 集成开发环境。简单来说，一个集成开发环境就是能够提供让你的代码运行起来所需要的任何东西的一个应用程序，一般来说，包括调试器、文档、自动编译，和仿真程序。[这是一个在树莓派上使用 Thonny 和 Python 入门的非常好的小教程](https://raspberrypihq.com/getting-started-with-python-programming-and-the-raspberry-pi/)。

![](/data/attachment/album/201903/28/092824ajscjb7mza58bj8r.png)

### Java

虽然 [Java](https://opensource.com/resources/java) 已经不像以前那样引人注目了，但它仍然在世界各地的大学和企业中占据着重要的地位。因此，即便是一些人对我建议新手学习 Java 持反对意见，但我仍然强烈推荐大家去学习 Java；之所以这么做，原因之一是，它仍然很流行，原因之二是，它有大量的便于你学习的图书、课程和其它的可用信息。在树莓派上学习它，你可以从使用 Java 集成开发环境 [BlueJ](https://www.bluej.org/raspberrypi/) 开始。

![](/data/attachment/album/201903/28/092824uiioq98qq9i8uo5a.png)

### JavaScript

“我的黄金时代…" [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) 的本质是一个允许用户去组织和自动化浏览器中的用户事件以及修改 HTML 元素的客户端语言。目前，JavaScript 已经不仅限于浏览器中，它在其它类型的客户端（移动应用）中也是可以使用的，甚至也用在服务器端编程。[Node.js](https://nodejs.org/en/) 是一个流行的运行时环境，它允许开发者在客户端-浏览器范式之外写程序。想学习在树莓派上运行 Node.js 的更多知识，请查看 [W3Schools 教程](https://www.w3schools.com/nodejs/nodejs_raspberrypi.asp)。

### 其它编程语言

如果这里没有列出你想学习的编程语言，别失望。你可以使用你的树莓派去编译或解释任何你选择的语言，包括 C、C++、PHP 和 Ruby，这种可能性还是很大的。

微软的 [Visual Studio Code](https://code.visualstudio.com/) 也可以运行在 [树莓派](https://pimylifeup.com/raspberry-pi-visual-studio-code/) 上。它是来自微软的开源代码编辑器，它支持多种标记和编程语言。

---

via: <https://opensource.com/article/19/3/programming-languages-raspberry-pi>

作者：[Anderson Silva](https://opensource.com/users/ansilva) 选题：[lujun9972](https://github.com/lujun9972) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


在 Fedora 上使用 GNOME Recipes 烹饪

![](/data/attachment/album/201903/28/231055uw4l427782wgwqm2.jpg)

你喜欢烹饪吗？在 Fedora 中寻找管理食谱的更好方法么？ GNOME Recipes 是一个非常棒的应用，可以在 Fedora 中安装，用于保存和组织你的食谱。

![](/data/attachment/album/201903/28/231322gnxlxuwzssoxu5o5.jpg)

GNOME Recipes 是 GNOME 项目中的食谱管理工具。它有现代 GNOME 应用的视觉风格，类似于 GNOME “软件”，但它是针对食物的。

### 安装 GNOME Recipes

Recipes 可从第三方 Flathub 仓库安装。如果你之前从未安装过 Flathub 的应用，请使用以下指南进行设置：

* [在 Fedora 上安装 Flathub 应用](https://fedoramagazine.org/install-flathub-apps-fedora/)

正确设置 Flathub 作为软件源后，你将能够通过 GNOME “软件”搜索和安装 Recipes。

### 食谱管理

Recipes 能让你手动添加自己的食谱集合，包括照片、配料、说明，以及更多的元数据，如准备时间、烹饪风格和辛辣程度。

![](/data/attachment/album/201903/28/231335o57t35h4nwntn1dy.jpg)

当输入新的食谱时，GNOME Recipes 可为该食谱选择一系列不同的测量单位，如温度等，让你可以轻松地切换单位。

### 社区食谱

除了手动输入你喜欢的菜肴供你自己使用外，它还能让你查找、使用和贡献食谱给社区。此外，你可以标记你的喜爱的食谱，并通过大量的食谱元数据搜索菜谱。

![](/data/attachment/album/201903/28/231347g8u8q12wkdzkwz8u.jpg)

### 分步指导

GNOME Recipes 中一个非常棒的小功能是分步全屏模式。当你准备做饭时，只需激活此模式，将笔记本电脑拿到厨房，你就可以全屏显示烹饪方法中的当前步骤。此外，当食物在烤箱中时，你可以在这个模式下设置定时器。

![](/data/attachment/album/201903/28/231103h0wwj0ahvvk0ljed.png)

---

via: <https://fedoramagazine.org/get-cooking-with-gnome-recipes-on-fedora/>

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


JSON、XML、TOML、CSON、YAML 大比拼

Summary: 我们坚持使用 web 系统可以理解或不需要太多努力就能理解的特殊格式，而且对人类可读性特别有用的格式。每个都有各自的优缺点和适当的用例场景。

读起来感觉怪怪的

翻译有点难受，不过排版好评。也挺通俗易解，点赞

最终哲学看不懂

能不装逼码？有话好好说。

![](/data/attachment/album/201903/29/011449ffhh8gydrzbthadg.jpg)

### 一段超级严肃的关于样本序列化的集合、子集和超集的文字

我是一名开发者，我读代码，我写代码，我写会写代码的代码，我写会写出供其它代码读的代码的代码。这些都非常火星语，但是有其美妙之处。然而，最后一点，写会写出供其它代码读的代码的代码，可以很快变得比这段文字更费解。有很多方法可以做到这一点。一种不那么复杂而且开发者社区最爱的方式是数据序列化。对于那些不了解我刚刚抛给你的时髦词的人，数据序列化是从一个系统获取一些信息，将其转换为其它系统可以读取的格式，然后将其传递给其它系统的过程。

虽然[数据序列化格式](https://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats)多到可以埋葬哈利法塔，但它们大多分为两类：

* 易于人类读写，
* 易于机器读写。

很难两全其美，因为人类喜欢让我们更具表现力的松散类型和灵活格式标准，而机器倾向于被确切告知一切事情而没有二义性和细节缺失，并且认为“严格规范”才是它们最爱的口味。

由于我是一名 web 开发者，而且我们是一个创建网站的机构，我们将坚持使用 web 系统可以理解或不需要太多努力就能理解的特殊格式，而且对人类可读性特别有用的格式：XML、JSON、TOML、CSON 以及 YAML。每个都有各自的优缺点和适当的用例场景。

### 事实最先

回到互联网的早期，[一些非常聪明的家伙](https://en.wikipedia.org/wiki/Standard_Generalized_Markup_Language#History)决定整合一种让每个系统都能理解的标准语言，并创造性地将其命名为<ruby> 标准通用标记语言 <rt>  Standard Generalized Markup Language </rt></ruby>（简称 SGML）。SGML 非常灵活，发布者也很好地定义了它。它成为了 XML、SVG 和 HTML 等语言之父。所有这三个都符合 SGML 规范，可是它们都是规则更严格、灵活性更少的子集。

最终，人们开始看到非常小、简洁、易读且易于生成的数据的好处，这些数据可以在系统之间以编程的方式共享，而开销很小。大约在那个时候，JSON 诞生了并且能够满足所有的需求。而另一方面，其它语言也开始出现以处理更多的专业用例，如 CSON，TOML 和 YAML。

### XML：不行了

原本，XML 语言非常灵活且易于编写，但它的缺点是冗长，人类难以阅读、计算机非常难以读取，并且有很多语法对于传达信息并不是完全必要的。

今天，它在 web 上的数据序列化的用途已经消失了。除非你在编写 HTML 或者 SVG，否则你不太能在许多其它地方看到 XML。一些过时的系统今天仍在使用它，但是用它传递数据往往太重了。

我已经可以听到 XML 老爷爷开始在它们的石碑上乱写为什么 XML 是了不起的，所以我将提供一个小小的补充：XML 可以很容易地由系统和人读写。然而，真的，我的意思是荒谬的，很难创建一个可以规范的读取它的系统。这是一个简单美观的 XML 示例：

```
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
```

太棒了。易于阅读、理解、写入，也容易编码一个可以读写它的系统。但请考虑这个例子：

```
<!DOCTYPE r [ <!ENTITY y "a]>b"> ]>
<r>
<a b="&y;>" />
<![CDATA[[a>b <a>b <a]]>
<?x <a> <!-- <b> ?> c --> d
</r>
```

这上面是 100% 有效的 XML。几乎不可能阅读、理解或推理。编写可以使用和理解这个的代码将花费至少 36 根头发和 248 磅咖啡渣。我们没有那么多时间或咖啡，而且我们大多数老程序员们现在都是秃头。所以，让它活在我们的记忆里，就像 [css hacks](https://www.quirksmode.org/css/csshacks.html)、[IE 6 浏览器](http://www.ie6death.com/) 和[真空管](https://en.wikipedia.org/wiki/Vacuum_tube)一样好了。

### JSON：并列聚会

好吧，我们都同意，XML = 差劲。那么，好的替代品是什么？<ruby> JavaScript 对象表示法 <rt>  JavaScript Object Notation </rt></ruby>，简称 JSON。JSON（读起来像 Jason 这个名字） 是 Brendan Eich 发明的，并且得到了伟大而强力的 [JavaScript 意见领袖](https://twitter.com/BrendanEich/status/773403975865470976) Douglas Crockford 的推广。它现在几乎用在任何地方。这种格式很容易由人和机器编写，按规范中的严格规则[解析](https://en.wikipedia.org/wiki/Parsing#Parser)也相当容易，并且灵活 —— 允许深层嵌套数据，支持所有的原始数据类型，及将集合解释为数组或对象。JSON 成为了将数据从一个系统传输到另一个系统的事实标准。几乎所有语言都有内置读写它的功能。

JSON语法很简单。方括号表示数组，花括号表示记录，由冒号分隔的两个值分别表示属性或“键”（在左边）、值（在右边）。所有键必须用双引号括起来：

```
  {
    "books": [
      {
        "id": "bk102",
        "author": "Crockford, Douglas",
        "title": "JavaScript: The Good Parts",
        "genre": "Computer",
        "price": 29.99,
        "publish_date": "2008-05-01",
        "description": "Unearthing the Excellence in JavaScript"
      }
    ]
  }
```

这对你来说应该是完全有意义的。它简洁明了，并且从 XML 中删除了大量额外废话，并传达相同数量的信息。JSON 现在是王道，本文剩下的部分会介绍其它语言格式，这些格式只不过是 JSON 的简化版，尝试让其更简洁或对人类更易读，可结构还是非常相似的。

### TOML: 缩短到彻底的利他主义

TOML（<ruby> Tom 的显而易见的最小化语言 <rt>  Tom’s Obvious, Minimal Language </rt></ruby>）允许以相当快捷、简洁的方式定义深层嵌套的数据结构。名字中的 Tom 是指发明者 [Tom Preston Werner](https://en.wikipedia.org/wiki/Tom_Preston-Werner)，他是一位活跃于我们行业的创造者和软件开发人员。与 JSON 相比，语法有点尴尬，更类似 [ini 文件](https://en.wikipedia.org/wiki/INI_file)。这不是一个糟糕的语法，但是需要一些时间适应。

```
[[books]]
id = 'bk101'
author = 'Crockford, Douglas'
title = 'JavaScript: The Good Parts'
genre = 'Computer'
price = 29.99
publish_date = 2008-05-01T00:00:00+00:00
description = 'Unearthing the Excellence in JavaScript'
```

TOML 中集成了一些很棒的功能，例如多行字符串、保留字符的自动转义、日期、时间、整数、浮点数、科学记数法和“表扩展”等数据类型。最后一点是特别的，是 TOML 如此简洁的原因：

```
[a.b.c]
d = 'Hello'
e = 'World'
```

以上扩展到以下内容：

```
{
  "a": {
    "b": {
      "c": {
        "d": "Hello"
        "e": "World"
      }
    }
  }
}
```

使用 TOML，你可以肯定在时间和文件长度上会节省不少。很少有系统使用它或非常类似的东西作为配置，这是它最大的缺点。根本没有很多语言或库可以用来解释 TOML。

### CSON: 特定系统所包含的简单样本

首先，有两个 CSON 规范。 一个代表 CoffeeScript Object Notation，另一个代表 Cursive Script Object Notation。后者不经常使用，所以我们不会关注它。我们只关注 CoffeeScript。

[CSON](https://github.com/bevry/cson#what-is-cson) 需要一点介绍。首先，我们来谈谈 CoffeeScript。[CoffeeScript](http://coffeescript.org/) 是一种通过运行编译器生成 JavaScript 的语言。它允许你以更加简洁的语法编写 JavaScript 并[转译](https://en.wikipedia.org/wiki/Source-to-source_compiler)成实际的 JavaScript，然后你可以在你的 web 应用程序中使用它。CoffeeScript 通过删除 JavaScript 中必需的许多额外语法，使编写 JavaScript 变得更容易。CoffeeScript 摆脱的一个大问题是花括号 —— 不需要它们。同样，CSON 是没有大括号的 JSON。它依赖于缩进来确定数据的层次结构。CSON 非常易于读写，并且通常比 JSON 需要更少的代码行，因为没有括号。

CSON 还提供一些 JSON 不提供的额外细节。多行字符串非常容易编写，你可以通过使用 `#` 符号开始一行来输入[注释](https://en.wikipedia.org/wiki/Comment_(computer_programming))，并且不需要用逗号分隔键值对。

```
books: [
  id: 'bk102'
  author: 'Crockford, Douglas'
  title: 'JavaScript: The Good Parts'
  genre: 'Computer'
  price: 29.99
  publish_date: '2008-05-01'
  description: 'Unearthing the Excellence in JavaScript'
]
```

这是 CSON 的大问题。它是 <ruby> CoffeScript 对象表示法 <rt>  CoffeeScript Object Notation </rt></ruby>。也就是说你要用 CoffeeScript 解析/标记化/lex/转译或其它方式来使用 CSON。CoffeeScript 是读取数据的系统。如果数据序列化的目的是允许数据从一个系统传递到另一个系统，这里我们有一个只能由单个系统读取的数据序列化格式，这使得它与防火火柴、防水海绵或者叉匙恼人的脆弱叉子部分一样有用。

如果这种格式被其它系统也采用，那它在开发者世界中可能非常有用。但到目前为止这基本上没有发生，所以在 PHP 或 JAVA 等替代语言中使用它是不行的。

### YAML：年轻人的呼喊

开发人员感到高兴，因为 YAML 来自[一个 Python 的贡献者](http://clarkevans.com/)。YAML 具有与 CSON 相同的功能集和类似的语法，有一系列新功能，以及几乎所有 web 编程语言都可用的解析器。它还有一些额外的功能，如循环引用、软包装、多行键、类型转换标签、二进制数据、对象合并和[集合映射](http://exploringjs.com/es6/ch_maps-sets.html)。它具有非常好的可读性和可写性，并且是 JSON 的超集，因此你可以在 YAML 中使用完全合格的 JSON 语法并且一切正常工作。你几乎不需要引号，它可以解释大多数基本数据类型（字符串、整数、浮点数、布尔值等）。

```
books:
  - id: bk102
  author: Crockford, Douglas
  title: 'JavaScript: The Good Parts'
  genre: Computer
  price: 29.99
  publish_date: !!str 2008-05-01
  description: Unearthing the Excellence in JavaScript
```

业界的年轻人正在迅速采用 YAML 作为他们首选的数据序列化和系统配置格式。他们这样做很机智。YAML 具有像 CSON 一样简洁的所有好处，以及与 JSON 一样的数据类型解释的所有功能。YAML 像加拿大人容易相处一样容易阅读。

YAML 有两个问题，对我而言，第一个是大问题。在撰写本文时，YAML 解析器尚未内置于多种语言，因此你需要使用第三方库或扩展来为你选择的语言解析 .yaml 文件。这不是什么大问题，可似乎大多数为 YAML 创建解析器的开发人员都选择随机将“附加功能”放入解析器中。有些允许[标记化](https://www.tutorialspoint.com/compiler_design/compiler_design_lexical_analysis.htm)，有些允许[链引用](https://en.wikipedia.org/wiki/Fluent_interface)，有些甚至允许内联计算。这一切都很好（某种意义上），只是这些功能都不是规范的一部分，因此很难在其他语言的其他解析器中找到。这导致系统限定，你最终遇到了与 CSON 相同的问题。如果你使用仅在一个解析器中找到的功能，则其他解析器将无法解释输入。大多数这些功能都是无意义的，不属于数据集，而是属于你的应用程序逻辑，因此最好简单地忽略它们和编写符合规范的 YAML。

第二个问题是很少有解析器完全实现规范。所有的基本要素都有，但是很难找到一些更复杂和更新的东西，比如软包装、文档标记和首选语言的循环引用。我还没有看到对这些东西的刚需，所以希望它们不让你很失望。考虑到上述情况，我倾向于保持 [1.1 规范](http://yaml.org/spec/1.1/current.html) 中呈现的更成熟的功能集，而避免在 [1.2 规范](http://www.yaml.org/spec/1.2/spec.html) 中找到的新东西。然而，编程是一个不断发展的怪兽，所以当你读完这篇文章时，你或许就可以使用 1.2 规范了。

### 最终哲学

这是最后一段话。每个序列化语言都应该以个案标准的方式评价。当涉及机器的可读性时，有些<ruby> 无出其右 <rt>  the bee’s knees </rt></ruby>。对于人类可读性，有些<ruby> 名至实归 <rt>  the cat’s meow </rt></ruby>，有些只是<ruby> 金玉其外 <rt>  gilded turds </rt></ruby>。以下是最终细分：如果你要编写供其他代码阅读的代码，请使用 YAML。如果你正在编写能写出供其他代码读取的代码的代码，请使用 JSON。最后，如果你正在编写将代码转译为供其他代码读取的代码的代码，请重新考虑你的人生选择。

---

via: <https://www.zionandzion.com/json-vs-xml-vs-toml-vs-cson-vs-yaml/>

作者：[Tim Anderson](https://www.zionandzion.com) 选题：[lujun9972](https://github.com/lujun9972) 译者：[GraveAccent](https://github.com/GraveAccent) 校对：[wxy](https://github.com/wxy)

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


树莓派使用入门：如何更新树莓派

Summary: 在我们的树莓派入门指南的第七篇学习如何给树莓派打补丁。

永远不要使用 rpi-update ？？？因为被墙了吗

在我们的树莓派入门指南的第七篇学习如何给树莓派打补丁。

>
> 在我们的树莓派入门指南的第七篇学习如何给树莓派打补丁。
>
>
>

![](/data/attachment/album/201903/30/092620q8qxd1nnlwmfdx5n.png)

像平板电脑、手机和笔记本电脑一样，你需要更新树莓派。最新的增强功能不仅可以使你的派运行顺畅，还可以让它更安全，特别是在如果你连接到网络的情况下。我们的树莓派入门指南中的第七篇会分享两条关于让派良好运行的建议。

### 更新 Raspbian

更新 Raspbian 有[两步](https://www.raspberrypi.org/documentation/raspbian/updating.md)：

1. 在终端中输入：`sudo apt-get update`。

该命令的 `sudo` 让你以管理员（也就是 root）运行 `apt-get update`。请注意，`apt-get update` 不会在系统上安装任何新东西，而是将更新需要更新的包和依赖项列表。
2. 接着输入：`sudo apt-get dist-upgrade`。

摘自文档：“一般来说，定期执行此操作将使你的安装保持最新，因为它将等同于 [raspberrypi.org/downloads](https://www.raspberrypi.org/downloads/) 中发布的最新镜像。”

![](/data/attachment/album/201903/30/092621u9ahdlucacw4jjgd.png)

### 小心 rpi-update

Raspbian 带有另一个名为 [rpi-update](https://github.com/Hexxeh/rpi-update) 的更新工具。此程序可用于将派升级到最新固件，不管该固件是不是有损坏或问题。你可能会发现一些如何使用它的信息，但是建议你永远不要使用这个程序，除非你有充分的理由这样做。

一句话：保持系统更新！

---

via: <https://opensource.com/article/19/3/how-raspberry-pi-update>

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


10 款你可以通过 Wine 在 Linux 上玩的游戏

原文是2017年10月发布的，内容已经非常地过时了，WINE都4.5了，DX11早就不是问题了

关键时刻还得让WINDOWS软件上阵，这要是在linux下，两年前的软件就成了残废。

能不能发一个安装教程

![](/data/attachment/album/201903/30/111859igjv7pz2s1wvf5ps.jpg)

Linux *确实* 能玩游戏，而且还能玩不少游戏。独立游戏在 Linux 平台上蓬勃发展，顶级的独立游戏也常常会在发售首日便发布 Linux 版本。然而，3A 游戏大作的开发者们却常常忽略 Linux，所以你不会很快就能玩上身边朋友们谈论正火的那些游戏。

但情况还没有糟透。Wine —— 一个能使 Windows 应用在类似 Linux、BSD 和 OS X 上运行的兼容层，在支持的游戏数量和性能表现上都取得了巨大进步。很多游戏大作都可以在 Wine 的支持下运行。你不能完全释放本机性能，但还是可以跑起来游戏，运行也还算流畅，当然这也要取决与你的系统配置。下面我们来盘点一下这些可能会令你大吃一惊的可以通过 Wine 在 Linux 上玩的游戏。（LCTT 译注：本文原文发表于 2017 年，有些信息可能有所过时。）

### 10、魔兽世界

![World of Warcraft Wine](/data/attachment/album/201903/30/111900uwzw213w212v2hnn.jpg "World of Warcraft Wine")

这款经典的 MMORPG 之王仍旧坚挺并保持活力。虽然这不是一款以画面见长的游戏，但想要开到全画质也需要费一些功夫。魔兽世界已经在 Wine 的支持下运行了很多年。到了最新资料片发布时，魔兽世界为它的 Mac 版本提供了 OpenGL 支持，使得游戏也可以很轻松地在 Linux 下运行。这已经不再是个问题了。

你需要通过 DX9 来运行游戏并从 [Gallium Nine](https://www.maketecheasier.com/install-wine-gallium-nine-linux) 补丁来获得一些性能提升，不过你也可以放心大胆地在 Linux 中下副本了。

### 9、上古卷轴 5：天际

![Skyrim Wine](/data/attachment/album/201903/30/111900t5v2337i2i2v7vll.jpg "Skyrim Wine")

上古卷轴 5 已经不是款新游戏了，但它的 mod 社区依旧活跃。如果你的 Linux 系统有足够资源的话，你可以很轻松地加上很多很多 mod。需要记住的是 Wine 运行时要比游戏占用更多的系统资源，所以使用 mod 时也要考虑这一点。

### 8、星际争霸 II

![StarCraft II Wine](/data/attachment/album/201903/30/111901xy4yxxc7z84dzfma.jpg "StarCraft II Wine")

星际争霸 II 是成为市场上最受欢迎的 RTS 游戏之一，并且在 Wine 下运作良好。它实际上也是 Wine 下表现最好的游戏之一。

考虑到这款游戏本身的竞技性，你当然希望游戏能够流畅地运行。不过不用担心，只要你的硬件够用就绝对没问题。

这是一个你可以从 “staging” 补丁获益的例子，所以在你设置游戏时请继续使用它们。

### 7、辐射 3 / 辐射：新维加斯

![Fallout 3 Wine](/data/attachment/album/201903/30/111901nt993kn3gunbt434.jpg "Fallout 3 Wine")

在你提问之前，辐射 4 已经很快就准备就绪，也许就在你正读这篇文章的时候就可以玩了。就目前而言，辐射 3 和 辐射：新维加斯都能在有没有 mod 的情况下良好运行。这些游戏在 Wine 下运行地非常好，甚至还能加载大量 mod 来保持游戏的新鲜性和趣味性。在辐射 4 获得全面支持前玩这些旧作也不算是个很大的妥协。

### 6、Doom (2016)

![Doom Wine](/data/attachment/album/201903/30/111902pw68yh00ypw919dd.jpg "Doom Wine")

Doom（毁灭战士）是过去几年中最刺激的射击游戏之一。在 Wine 支持下并加载 “staging” 补丁可以流畅地运行最新版本。单人模式和多人模式都有很棒的游戏体验，而且也不需要花费大量时间来配置 Wine 和调整设置。所以你想在 Linux 上体验 3A 级射击游戏的话，不妨尝试一下 Doom 。

### 5、激战 2

![Guild Wars 2 Wine](/data/attachment/album/201903/30/111902vq0p3w05j6rwrm0m.jpg "Guild Wars 2 Wine")

激战 2 是一款无月卡（买断制）的融合了多人和迷宫探险元素的游戏。它在市场上很受欢迎，并自称在游戏中有着很多创新。你同样可以通过 Wine 在 Linux 上玩到这款游戏。

激战 2 也不算一款很老的 MMO 游戏。它试图以图像表现来保持现代风格，并具有着相当高分辨率的纹理和视觉效果。所有这些特点都能在 Wine 下顺利运行。

### 4、英雄联盟

![League Of Legends Wine](/data/attachment/album/201903/30/111903y6dnfflr7vzlfqfr.jpg "League Of Legends Wine")

在 MOBA 游戏的世界中有两个强者：DoTA2 和英雄联盟。Valve 已经将 DoTA2 移植到 Linux 上很久了，但玩家们却从没在 Linux 上玩过英雄联盟。如果你是 Linux 的使用者并热衷英雄联盟，你还是可以通过 Wine 来玩这款你最爱的 MOBA 游戏。

英雄联盟是个很有趣的例子。它的游戏本身运行良好，但安装程序却会因为需要 Adobe Air 而中断。一些安装程序脚本例如 Lutris 和 PlayOnLinux 能帮你通过这一步骤。一旦安装完毕，你就可以毫无困难地运行游戏，甚至在激烈的战况中依旧畅快玩耍。

### 3、炉石传说

![HearthStone Wine](/data/attachment/album/201903/30/111903guzcayfgvuub73yu.jpg "HearthStone Wine")

炉石传说是一款流行且令人上瘾的免费卡牌游戏，你可在各种平台上来一局……除了 Linux。不过别担心，在 Wine 中你可以轻松玩到这款游戏。炉石并不大，所以即使在最低配置的系统里也都能玩，这是个好消息。不过由于它的竞技性所以还是要对游戏性能有一定要求。

玩炉石不需要任何特殊配置和补丁，直接开玩！

### 2、巫师 3

![Witcher 3 Wine](/data/attachment/album/201903/30/111904r121zogj2zr2j91f.jpg "Witcher 3 Wine")

你不是唯一一个对在这份榜单中看到了巫师 3 而感到吃惊的人。在最新版 “stage” 补丁的支持下，你终于可以在 Linux 中体验这款游戏了。尽管最初承诺会有原生版本，但 Linux 玩家还是等了很久才迎来了巫师系列的第三部。

不过最好不要指望一切都能完美运行。巫师 3 *刚刚* 得到支持，有些内容可能还不会达到预期。也就是说，如果你只能用 Liux 来玩游戏，并且愿意处理一些问题。那么你也可以享受到这款完美游戏带来的初体验了。

### 1、守望先锋

![Overwatch Wine](/data/attachment/album/201903/30/111904b13axffyzxxduyqp.jpg "Overwatch Wine")

最后，让我们来谈谈 Linux 玩家心中的另一个“白鲸”。很多人认为守望先锋会像大多数暴雪游戏一样，在发售当日就能在 Wine 上获得支持。不过情况非常不同，因为守望先锋只支持 DX11，这也正是 Wine 面临的一个痛点。

守望先锋目前还不能拥有最佳性能表现，但是你还是可以通过装有特殊补丁的 Wine 和包括“staging”在内的一系列定制补丁包来运行游戏。这也说明了 Linux 玩家们真的很渴望游玩这款游戏，以至于自己开发了一套补丁来为它提供支持。

这份榜单当然会遗漏一些其他游戏。大多数是由于受欢迎程度或只能从 Wine 中得到有限的支持。其他暴雪游戏，如“风暴英雄”和“暗黑破坏神 3”也能很好地运行，但这样来写就会使暴雪游戏霸占这份榜单，这不是我们想突出的重点。

如果你正打算玩以上任一款游戏，请使用 Wine 的 [Gallium Nine](https://www.maketecheasier.com/install-wine-gallium-nine-linux) 版本并装载“staging”补丁，否则游戏可能无法正常运行。“staging”中装载的最新补丁和提升要比正式的 Wine 发行版提供的内容要早很多，使用它会令你在性能上处于领先地位。

说到进步，Wine 目前在对 DirectX11 的支持有了很大进步。对于 Windows 玩家这可能不算什么，但对于 Linux 玩家来说绝对算是一件大事。大多数游戏新作支持 DX11 和 DX12，而最新版本的 Wine 仍只是支持 DX9。有了 DX11 的支持，Wine 将会让很多过去无法在 Linux 上玩的游戏运行起来。所以，定期查看你最喜欢的 Windows 游戏是否也可以开始在 Wine 上运行，你可能会非常惊喜。

---

via: <https://www.maketecheasier.com/games-play-on-linux-with-wine/>

作者：[Nick Congleton](https://www.maketecheasier.com/author/nickcongleton/) 译者：[Modrisco](https://github.com/Modrisco) 校对：[wxy](https://github.com/wxy)

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


使用 Arch Linux 镜像列表管理器来管理你的镜像

![](/data/attachment/album/201903/30/114558fuu00t3ssu3fmm8j.jpg)

>
> Arch Linux 镜像列表管理器是一个简单的图形化程序，它让你可以方便地管理 Arch Linux 中的镜像。
>
>
>

对于 Linux 用户来说，保持镜像列表规整非常重要。今天我们来介绍一个用来管理 Arch 镜像列表的应用程序。

![Arch Linux Mirrorlist Manager](/data/attachment/album/201903/30/114608mv07om9ym088g8m0.png)

*Arch Linux Mirrorlist Manager*

### 什么是镜像？

给新手的话，Linux 操作系统有赖于分布全球的的一系列服务器。这些服务器包含了特定发行版的所有可用的软件包的一样的副本。这就是为什么它们被称为“镜像”。

这些服务器的最终目标时让每个国家都有多个镜像。这样就能让当地的用户可以快速升级系统。然而，这并不绝对。有时别国的镜像反而更快。

### ArchLinux 镜像列表管理器让在 Arch Linux 中管理镜像更简单

![Arch Linux Mirrorlist Manager](/data/attachment/album/201903/30/114610jilmui82oi0898wp.jpg)

*主界面*

在 Arch 中[管理并对有效镜像进行排序](https://wiki.archlinux.org/index.php/Mirrors) 不是个简单的事情。它需要用到很长的命令。还好，有人想出了一个解决方案。

去年，[RizwanHasan](https://github.com/Rizwan-Hasan) 用 Python 编写了一个名为 [Arch Linux 镜像列表管理器](https://github.com/Rizwan-Hasan/ArchLinux-Mirrorlist-Manager) 的 Qt 应用程序。你可能对 Rizwan 这个名字感到眼熟，因为这不是第一次我们在本站介绍他做的玩意了。一年多前，我介绍过一个名为 [MagpieOS](https://itsfoss.com/magpieos/) 的基于 Arch 的新 Linux 发行版就是 Rizwan 创造的。我想 Rizwan 创造 MagpieOS 的经历激励了他创建了这个程序。

Arch Linux 镜像列表管理器的功能并不多。它让你根据回应速度对镜像进行排序，并可以根据数量和国家进行过滤。

也就是说，若你在德国，你可以限制只保留在位于德国的最快的 3 个镜像。

### 安装 Arch Linux 镜像列表管理器

>
> **它仅适用于 Arch Linux 用户**
>
>
> 注意! Arch Linux 镜像列表管理器只能应用于 Arch linux 发行版. 不要在其他基于 Arch 的发行版中使用它，除非你能确定该发行版使用的是 Arch 镜像。否则，你将会遇到我在 Manjaro 中遇到的问题(在下面章节解释).
>
>
>

---

>
> **Manjaro 中的镜像管理器替代品**
>
>
> 当使用类 Arch 的系统时, 我选择了 Manjaro。在开始本文之前，我在 Manjaro 及其上安装了 Arch Linux 镜像列表管理器。它很快就对有效镜像进行了排序并保存到我的镜像列表中。
>
>
> 然后我尝试进行系统更新却立即遇到了问题。当 ArchLinux 镜像列表管理器对我系统使用的镜像进行排序时，它使用普通的 Arch 镜像替换了我的 Manjaro 镜像。（Manjaro 基于 Arch，但却有着自己的镜像，这是因为开发团队会在推送软件包之前对所有这些软件包进行测试以保证不会出现系统崩溃的 BUG。）还好，Manjaro 论坛帮我修复了这个错误。
>
>
> 若你是 Manjaro 用户，请不要重蹈我的覆辙。Arch Linux 镜像列表管理器 仅适用于 Arch 以及使用 Arch 镜像的衍生版本。
>
>
> 幸运的是，manjaro 有一个简单易用的终端程序来管理镜像列表。那就是 [Pacman-mirrors](https://wiki.manjaro.org/index.php?title=Pacman-mirrors)。跟 ArchLinux 镜像列表管理器一样，你可以根据回应速度进行排序。只需要运行 `sudo pacman-mirrors --fasttrack` 即可。若你像将结果局限在最快的 5 个镜像，可以运行 `sudo pacman-mirrors --fasttrack 5`。要像将结果局限在某个或某几个国家，运行 `sudo pacman-mirrors --country Germany,Spain,Austria`。你可以通过运行 `sudo pacman-mirrors --geoip` 来将结果局限在自己国家。更多关于 Pacman-mirrors 的信息请参见 [Manjaro wiki](https://wiki.manjaro.org/index.php?title=Pacman-mirrors)。
>
>
> 运行 Pacman-mirrors 后，你还需要运行 `sudo pacman -Syyu` 来同步软件包数据库并升级系统。
>
>
> 注意：Pacman-mirrors 仅仅适用于 **Manjaro**。
>
>
>

Arch Linux 镜像列表管理器包含在 [ArchUserRepository](https://aur.archlinux.org/packages/mirrorlist-manager) 中。高级 Arch 用户可以直接从 [theGitHubpage](https://github.com/Rizwan-Hasan/MagpieOS-Packages/tree/master/ArchLinux-Mirrorlist-Manager) 下载 PKGBUILD。

### 对 Arch Linux Mirrorlist Manager 的最后思考

虽然 [Arch Linux 镜像列表管理器](https://github.com/Rizwan-Hasan/ArchLinux-Mirrorlist-Manager) 对我不太有用，我很高兴有它的存在。这说明 Linux 用户正在努力让 Linux 更加易于使用。正如我之前说过的，在 Arch 中管理镜像并不容易。Rizwan 的小工具可以让 Arch 对新手更加友好。

你有用过 Arch Linux 镜像列表管理器吗？你是怎么管理 Arch 镜像的？请在下面的评论告诉我。

如果你觉的本文有趣的话，请花点时间将它分享到社交媒体中去。

---

via: <https://itsfoss.com/archlinux-mirrorlist-manager>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lujun9972](https://github.com/lujun9972) 校对：[wxy](https://github.com/wxy)

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


区块链 2.0：金融体系改革（二）

![](/data/attachment/album/201903/31/104048nuph68a80w3z9awv.png)

这是我们区块链 2.0 系列的第二部分。区块链可以改变个人和机构处理他们财务状况的方式。本文着眼于现有货币体系如何演变，以及新的区块链系统如何为货币演变的下一个关键步骤带来改变。

两个关键思想将为本文奠定基础。**PayPal** 在推出之时，其运营操作上具有革命性。该公司收集、处理和确认大量的消费者数据，以促进各种在线交易，从而切实允许 eBay 等平台成长为可信赖的商业来源，并为全球数字支付系统奠定基准。其二，虽然要强调的是更为重要的关键思想，但却是一个存在性问题。我们都使用金钱或货币来满足我们的日常需求。一张 10 美元的账单可以让你从最喜欢的咖啡店买到一两杯咖啡，从而开始美好的一天。事实上，我们各方面都依赖于各自的国家货币。

当然，自从**易货系统**开始决定你的早餐是什么起，人类已经度过了漫长的时间。但是，货币到底是什么？谁或什么赋予它的价值？正如流行的谣言所说，去银行并给他们一美元钞票就可以获得货币“符号”所代表的真正价值吗？

大多数问题的答案都不存在。即便是给出了答案，最多也是不可思议的模糊和主观。早在文明开始建立小城镇的那一天，被统治者认为是合法的本地货币，几乎总是由那个社会中宝贵的东西组成。人们认为印第安人使用干胡椒进行交易，而古希腊人和罗马人则使用[盐](https://www.seasalt.com/history-of-salt)交易。渐渐地，这些史前启蒙文明中的大部分都采用贵重金属和石头作为代币进行交易。金币、银饰和红宝石开始与“价值”同名。随着工业革命，人们开始印刷这些交易凭证，我们终于似乎看到了对纸币需求的呼吁。纸币可靠且廉价，只要国家为其用户所持纸币提供担保，纸币所代表的“价值”可以在需要时，由同等价值的黄金或硬通货作支撑，人们便乐于使用它们。但是，如果你仍然认为你现在持有的纸币具有相同的保证，那么你就错了。我们目前生活在一个几乎所有主要货币都在全球流通的时代，经济学家称之为[法定货币](https://www.investopedia.com/terms/f/fiatmoney.asp)。缺少价值的纸片只能得到你所居住的国家的保证支持。法定货币的确切性质以及为什么它们可能是一个有缺陷的系统属于经济领域，我们目前不会涉及。

事实上，所有这一历史中与本篇文章相关的唯一的一点是，文明开始使用暗示或代表商品和服务的贸易价值的代币，而不是非实际的易货系统。代币，当然，这也是加密货币背后的关键概念。它们没有任何固有的价值。它们的价值取决于采用该特定平台的人数、采用者对系统的信任，当然还有监管实体本身的背景（如果有监管实体的话）。**比特币（BTC）**的高价格和市值并非巧合，它们是业内第一个加密货币并且有很多早期采用者。加密货币背后的最终真理使其如此重要而又具有如此难以理解的复杂性。这是“金钱”自然演变的下一步。有些人理解这一点，有些人仍然认为坚实的货币概念中“真正的”货币总是由某种[内在价值支持](https://bitcoin.org/en/faq#who-created-bitcoin)。虽然已经有无数关于这种困境的辩论和研究，但仍没有着眼于区块链的未来。

例如，**厄瓜多尔**在 2015 年成为头条新闻，因为它声称计划开发和发布[自己的国家加密货币](https://99bitcoins.com/official-ecuador-cryptocurrency/)。虽然官方尝试是为了援助和支持他们现有的货币体系。从那时起，其他国家及其监管机构已经或正在起草文件来控制加密货币的“流行病”，其中一些已经发布了框架，以创建区块链和加密货币开发的路线图。[德国](https://cointelegraph.com/news/german-government-to-introduce-blockchain-strategy-in-mid-2019)被认为正在长期投资区块链项目，以简化其税收和金融系统。发展中国家的银行正在加入一个名为银行链的体系中，用以合作创建**私有区块链**以提高他们的效率并优化其运营。

现在，当我们将故事的两端结合在一起时，还记得在休闲历史课之前首次提到 PayPal 吗？专家们将比特币（BTC）的采用率与 PayPal 的采用率进行了比较。消费者最初有所犹豫，只有少数早期采用者准备好使用上述产品，但随后更广泛的采用逐渐成为类似平台的标杆态势。比特币（BTC）已经成为类似加密货币平台的基准，而主要硬币包括[以太坊（ETH）和瑞波（XRP）](https://coinmarketcap.com/currencies/bitcoin/)。采用正在稳步增加，法律和监管框架也正在制定以支持它，积极的研究和开发也在进行中。与 PayPal 不同，专家认为，利用区块链技术为其数字基础设施提供加密货币和平台将很快成为标准规范而非个例。

尽管 2018 年加密货币价格的上涨可以被称为经济泡沫，但公司和政府仍在继续投资开发自己的区块链平台和金融代币。为了抵制和预防未来发生这样的事件，并同时同时继续在该领域投资，替代传统加密货币的**稳定币**已经开发成功。

金融巨头**摩根大通**推出了他们自己的用于企业的区块链解决方案，名为**Quorum**，用来处理被称为 [JPM 硬币](https://www.jpmorgan.com/global/news/digital-coin-payments)的稳定币。每个这样的 JPM 硬币都与 1 美元挂钩，其价值由母公司在支持法律框架下保证。像这样的平台使大型金融交易更容易通过互联网瞬间传输数百万或数十亿美元，而不必依赖 SWIFT 这样的传统银行系统，这些系统有着冗长的过程，而且本身已有数十年历史。

为了让区块链的精微之处可供所有人使用，以太坊平台允许第三方利用他们的区块链，或从中派生代币以创建和管理他们自己对**区块链-协议-令牌**三元组的主张，从而推动更广泛的标准采纳，并付出更少的基础工作量。

区块链允许通过网络快速创建、记录和交易现有金融工具的数字版本，而无需第三方监控。该系统固有的安全性和安保特性使整个过程完全安全，并且不受欺诈和篡改的影响，这基本上是现有金融工具需要第三方监控的唯一原因。政府和监管机构在金融服务和工具方面涉及的另一个领域是透明度和审计。通过区块链，银行和其他金融机构将能够维护完全透明、分层，几乎永久保存和防篡改的所有交易记录，使审计任务几乎无用。通过利用区块链，可以使当前金融系统和服务行业急需的发展和变化成为可能。分布式、防篡改、接近永久性存储和快速执行的平台对于银行家和政府监管机构来说都是非常有价值的，他们在这方面的投资似乎[很有用](https://www.pwc.com/jg/en/media-release/global-fintech-survey-2017.html)。

在本系列的下一篇文章中，我们将了解公司如何使用区块链来提供下一代金融服务。纵观在行业中创造涟漪的个别公司后，我们将探讨区块链下的经济未来会如何发展。

---

via: <https://www.ostechnix.com/blockchain-2-0-revolutionizing-the-financial-system/>

作者: [Ostechnix](https://www.ostechnix.com/author/editor/) 选题: [lujun9972](https://github.com/lujun9972) 译者: [sanfusu](https://github.com/sanfusu) 校对: [wxy](https://github.com/wxy)

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


树莓派使用入门：如何用树莓派来娱乐

>
> 在我们的树莓派使用入门的第八篇文章中，我们将学习如何使用树莓派观看 Netflix 上的影片和用它来听音乐。
>
>
>

![](/data/attachment/album/201903/31/105425m44fch5dc3gc4727.png)

到目前为止，本系列文章已经学习了很多话题 — 如何 [挑选](/article-10611-1.html)、[购买](/article-10615-1.html)、[设置](/article-10644-1.html)、和 [更新](/article-10665-1.html) 你的树莓派，以及 [儿童](/article-10653-1.html) 和 [成人](/article-10661-1.html) 如何使用它来做的不同的事情（包括学习 [Linux](/article-10645-1.html)）。今天我们换一个话题，将学习一些娱乐方面的内容！我们将学习如何使用树莓派来做一些娱乐方面的事情，明天我们继续这个话题，将用它来玩游戏。

### 观看电视和电影

你可以使用你的树莓派和 [开源媒体中心](https://osmc.tv/) (OSMC) 去 [观看 Netflix](https://www.dailydot.com/upstream/netflix-raspberry-pi/)！OSMC 是一个基于 [Kodi](http://kodi.tv/) 项目的系统，你可以使用它来播放来自本地网络、附加存储以及互联网上的多媒体。它因为良好的功能特性而在媒体播放应用界中拥有非常好的口碑。

NOOBS（我们在本系列的 [第三篇文章](/article-10644-1.html) 中介绍过它）可以让你在你的树莓派中很容易地 [安装 OSMC](https://www.raspberrypi.org/documentation/usage/kodi/)。在 NOOBS 中也提供了另外一个基于 Kodi 项目的媒体播放系统，它的名字叫 [LibreELEC](https://libreelec.tv/)。

### 听音乐

![](/data/attachment/album/201903/31/105425wgg4ss3vss3pvg3h.png)

你还可以让你的树莓派借助 [Pi Music Box](https://github.com/pimusicbox/pimusicbox/tree/master) 项目通过网络来播放来自附加存储或像 Spotify 服务上的流媒体音乐。以前我 [写过关于这个主题的文章](https://opensource.com/life/15/3/pi-musicbox-guide)，但是你可以在 [Pi Music Box 网站](https://www.pimusicbox.com/) 上找到最新的指导，包括如何使用和 DIY 项目。

---

via: <https://opensource.com/article/19/3/raspberry-pi-entertainment>

作者：[Anderson Silva](https://opensource.com/users/ansilva) 选题：[lujun9972](https://github.com/lujun9972) 译者：[qhwdw](https://github.com/qhwdw) 校对：[wxy](https://github.com/wxy)

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


IRC vs IRL：如何召开一个良好的 IRC 会议

>
> 若你遵守这些最佳实践，Internet Relay Chat（IRC）会议可以很好滴推进项目进展。
>
>
>

![](/data/attachment/album/201903/31/121323dabb00rictnniadb.jpg)

开展任何形式的会议都是门艺术。很多人已经学会了开展面对面会议和电话会议，但是 [Internet Relay Chat](https://en.wikipedia.org/wiki/Internet_Relay_Chat)（IRC）会议因其特殊的性质有别于“<ruby> 现实 <rt>  in real life </rt></ruby>”（IRL） 会议。本文将会分享 IRC 这种会议形式的优势和劣势，以及帮你更有效地领导 IRC 会议的小技巧。

为什么用 IRC? 虽说现在有大量的实时聊天工具可供选择，[IRC 依然是开源项目的基石](https://opensource.com/article/16/6/getting-started-irc)。若你的项目使用其他沟通工具，也不要紧。这里大多数的建议都适用于同步的文本聊天机制，只需要进行一些微调。

### IRC 会议的挑战

与面对面会议相比，IRC 会议会遇到一些挑战。你应该知道一个人结束谈话到下一个人开始谈话之间会有间隙吧？在 IRC 中这更糟糕，因为人们需要输入他们的所想。这比说话要更慢，而且不像谈话，你不知道别人什么时候在组织消息。主持人在要求回复或转到下一主题前必须等待很长一段时间。而想要发言的人需要先插入一个简短的信息（例如，一个句号）来让主持人知道（他需要发言）。

IRC 会议还缺少其他方法中能够获得的那些元数据。你无法通过文本了解面部表情和语调。这意味着你必须小心你的措辞。

而且 IRC 会议很容易让人分心。至少在面对面会议中，当某人正在看搞笑的猫咪图片时，你可以看到他面带笑容而且在不合时宜的时候发出笑声。在 IRC 中，除非他们不小心粘贴了错误的短信，否则甚至都没有同伴的压力来让他们假装专注。你甚至可以同时参加多个 IRC 会议。我就这么做过，但如果你需要积极参与这些会议，那就很危险了。

### IRC 会议的优势

IRC 会议也有某些独一无二的优势。IRC 是一个非常轻资源的媒介。它并不怎么消耗带宽和 CPU。这降低了参与的门槛，这对贫困这和发展中的人都是有利的。对于志愿者来说，这意味着他们可以在工作日参加会议。同时它也意味着参与者无需寻找一个安静的地方来让他们沟通而不打扰到周围的人。

借助会议机器人，IRC 可以立即生成会议记录。在 Fedora 中，我们使用 Zodbot（Debian 的 [Meetbot](https://wiki.debian.org/MeetBot) 的一个实例）来记录会议并提供交互。会议结束后，会议记录和完整的日志立即可供社区使用。这减少了开展会议的管理开销。

### 这跟普通会议类似，但有所不同

通过 IRC 或其他基于文本的媒介进行会议意味着以稍微不同寻常的方式来看待会议。虽然它缺少一些更高带宽沟通模式的优点，但它也有自己的优点。开展 IRC 会议可以让你有机会开发出各种规则，而这些规则有助于你开展各种类型的会议。

与任何会议一样，IRC 会议最好有明确的日程和目的。一个好的会议主持者知道什么时候让谈话继续下去以及什么时候将话题拉回来。并没有什么硬性规定，这是一门艺术。但 IRC 在这方面有一个优势。通过设置频道主题为会议的当前主题，人们可以看到他们应该谈论的内容。

如果你的项目尚未实施过同步会议，你应该考虑一下。对于项目成员分布在不同时区的项目，找到一个大家都认可的时间来组织会议很难。你不能把会议作为你唯一的协调方式。但他们可以是项目工作的重要组成部分。

---

via: <https://opensource.com/article/19/2/irc-vs-irl-meetings>

作者：[Ben Cotton](https://opensource.com/users/bcotton) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lujun9972](https://github.com/lujun9972) 校对：[wxy](https://github.com/wxy)

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


DevOps 对你意味着什么？

Summary: 6 位专家为你解析 DevOps 及其实现、实践和哲学的关键。

6 位专家为你解析 DevOps 及其实现、实践和哲学的关键。

>
> 6 位专家为你解析 DevOps 及其实现、实践和哲学的关键。
>
>
>

![](/data/attachment/album/201903/31/184128uc2pisanr8rciz8a.png)

如果你问 10 个人关于 DevOps 的问题，你会得到 12 个答案。这是对于 DevOps 的意见和期望的多样性的结果，更不用说它在实践中的差异。

为了解读 DevOps 的悖论，我们找到了最了解它的人 —— 这个行业的顶尖从业者。这些人熟悉 DevOps，了解技术的来龙去脉，并且已经有了多年 DevOps 实践。他们的观点应该能鼓励、刺激和激发你对 DevOps 的想法。

### DevOps 对你意味着什么？

让我们从基本原理开始。我们不能只在教科书上寻找答案，而应该需要知道专家们怎么说。

简而言之，专家们说的是关于 DevOps 的原则、实践和工具。

IBM 数字企业集团 DevOps 商业平台领导者 [Ann Marie Fred](https://twitter.com/DukeAMO)，说，“对于我来说，DevOps 是一套实践和原则，旨在使团队在设计、开发、交付和操作软件方面有更好的效率。”

据红帽资深 DevOps 布道者 [Daniel Oh](https://twitter.com/danieloh30?lang=en)，“通常来说，DevOps 促使企业基于当前的 IT 发展与应用开发、IT 运维和安全协议的流程和工具。”

Tactec 战略解决方案的创始人 [Brent Reed](https://twitter.com/brentareed)，谈及了利益相关者的持续改进，“DevOps 对我来说意味着包括了一种思维方式的工作方式，它允许持续改进运维绩效，进而提升组织绩效，从而让利益相关者受益。”

许多专家也强调 DevOps 文化。Ann Marie 说，“这也是持续改进和学习的问题。它涉及的是人和文化，以及工具和技术。”

美国保监会 (NAIC) 首席架构师兼 DevOps 领导者 [Dan Barker](https://twitter.com/barkerd427)，“DevOps 主要是关于文化…它将几个独立的领域聚集在一起，如精益生产、[公正文化](https://psnet.ahrq.gov/resources/resource/1582) 和持续的学习。我认为文化是最关键和最难执行的。”

Atos 的 DevOps 负责人 [Chris Baynham-Hughes](https://twitter.com/onlychrisbh?lang=en)，说，“[DevOps] 实践是通过组织内的文化、流程和工具的发展而被采用的。重点是文化变革，DevOps 文化借鉴的关键是协作、试验、快速反馈和持续改进。”

云架构师 [Geoff Purdy](https://twitter.com/geoff_purdy)，谈及敏捷和反馈，“缩短和放大反馈回路。我们希望团队在几分钟内而不是几周内获得反馈。”

但在最后，Daniel 通过解释开源和开源文化是如何让他以简单快捷的方式实现目标来强调这点，“在推动 DevOps 中，最重要的事情应该是开源文化而不是具体的工具或复杂的解决方案。”

### 你认为哪些 DevOps 实践有效？

专家列举的那些最佳实践是普遍存在的，但又各不相同。

Ann Marie 表示：“一些十分强大灵活的项目管理[实践]，能在职能、独立的小组之间打破壁垒；全自动化持续部署，蓝/绿部署实现零时间停机状态；开发人员设置自己的监控和警告，无缝自我修复，自动化的安全性与合规性。”

Chris 说，“特别的突破是倾情合作、持续改进、开放领导、缩短业务距离、从垂直孤岛转向横向/跨功能的产品团队、工作透明化、相互影响、Mobius 循环、缩短反馈回路、自动化（从环境到 CI/CD）。”

Brent 支持“发展学习文化，包括 TTD [测试驱动开发] 和 BDD [行为驱动开发]捕获事件，并通过持续集成和持续交付从设计、构建和测试到实施在生产环境上一系列事件的自动化。测试采用故障优先的方法，能够自动化集成和交付流程，并在整个生命周期中包含快速反馈。”

Geoff 强调自动化配置。“选择一个自动化配置，对我的团队来说非常有效。更具体地说从版本控制代码库中自动配置。”

Dan 则玩的开心，“ 我们做了很多不同的事情来建立 DevOps 文化。我们举办 ‘午餐 & 学习’ 活动，提供免费的食物来鼓励大家一起学习。我们买书，分组学习。”

### 你如何激励你的团队实现 DevOps 这个目标？

Daniel 强调“自动化的问题就是为了减少 DevOps 计划中来自多个团队的异议，你应该鼓励你的团队提高开发、测试与 IT 运营的自动化能力，以及新的流程和程序。例如，Linux 容器是实现 DevOps 自动化功能的关键工具。”

Geoff 很是赞同，“机械化的劳作，你有讨厌现在做的任务吗？很棒。如果可能的话，让它们消失。不行，那就让它们自动化。它能使工作不会变得太枯燥，因为工作总是在变化。”

Dan、Ann Marie 和 Brent 强调团队的执行力。

Dan 说，“在 NAIC，我们有个很好的奖励系统来鼓励特定的行为。我们有多个级别的奖项，其中两个奖项可以由任何人颁布给某人。我们也会颁奖给完成重要任务的团队，但我们通常只奖励给个人贡献者。”

Ann Marie 表示，“我所在地区的团队最大的动力是看见其他人成功。我们每周都会彼此回放一次，其中一部分是分享我们从尝试新工具或实践中学到的东西。团队热衷于他们现在做的事情，并愿意帮助其他人开始，相信更多的团队很快也会加入进来。”

Brent 表示赞同。“让每个人学习，并掌握同样的基础知识至关重要……我喜欢从评估什么能帮助团队实现目标[以及]产品负责人和用户需要提供的内容入手。”

Chris 推荐采用双管齐下的方法。“运行可以每周可以实现的小目标，并且[在这]可以看到他们正在运做的功能工作之外的进展，庆祝你所取得的进步。”

### DevOps 和敏捷开发如何协同工作？

这是一个重要的问题，因为 DevOps 和敏捷开发都是现代软件开发的基石。

DevOps 是一个软件开发的过程，专注与沟通与协作，以促进快速部署应用程序和产品。而敏捷开发是一种开发方法，涉及持续开发、连续迭代和连续测试，以实现可预测和可交付的成果质量。

那么，它们又有怎样的联系？让我们去问问专家吧。

在 Brent 来看，“DevOps != 敏捷。其次 敏捷 != Scrum 流程……敏捷工具和工作方式支撑着 DevOps 策略和目标，它们是如此融合在一起的。”

Chris 说，“对我而言敏捷是 DevOps 的一个基本组件。当然，我们可以讨论如何在非敏捷开发环境中采用 DevOps 文化，但最终表明，提高软件设计方式的灵活性是采用 DevOps 成熟读的一个关键指标。”

Dan 将 DevOps 与更伟大的 [敏捷宣言](https://agilemanifesto.org/) 联系起来。“我在谈到敏捷时总会引用敏捷宣言来设置基准，而有许多实现中并不关注该宣言。当你阅读这份宣言时，你会发现它确实从开发的角度描述了 DevOps。因此，将敏捷融入 DevOps 文化非常容易，因为敏捷关注于沟通、协作、变化的灵活性以及快速地投入生产。”

Geoff 认为 “DevOps 是敏捷实施的众多实现之一。敏捷本质上是一套原则，而 DevOps 则是体现这些原则的文化、流程和工具链。”

Ann Marie 简洁说明，“敏捷是 DevOps 的先决条件。DevOps 使敏捷变得更加有效。”

### DevOps 是否受益于开源？

这个问题得到了所有参与者的热烈肯定，然后解释了他们看到的好处。

Ann Marie 说，“我们站在巨人的肩膀上，在已有的基础之上发展。拉取请求和代码评审的开源模式，对 DevOps 团队维护软件很有效果。”

Chris 赞同 DevOps “毫无疑问”受益于开源。“从设计和工具方面（例如，Ansible），到流程和人员方面，通分享行业内的故事和开源社区的领导。”

Geoff 提到一个好处是“基层的采纳”。免费的软件不需要签署购买申请。团队发现了满足他们需求的工具，可以自行进行修改。[然后]在它之上构建，并为更大的社区提供更好的功能。如此往复。

开源已经向 DevOps 展示着“就像开源软件开发者正在做的那样，采用更好的方式来克服新的变化”，Daniel 说。

Brent 同意道 “DevOps 从开源中获益良多。一种方法是使用这些工具来理解它们是如何加速 DevOps 的目标和策略；在自动化、自动伸缩、虚拟化和容器化等关键方面对开发人员和操作人员进行培训，如果不引入使 DevOps 更加容易的技术支持，就很难实现这些特性。”

Dan 指出了 DevOps 和开源之间的双向共生关系，“做好开源需要 DevOps 文化。大多数开源项目都具有非常开放的沟通结构，很少有不透明的地方。对于 Devops 实践者来说，这实际上是一个很好的学习机会，可以让他们了解到可能需要将什么引入自己的组织中。此外能够使用来自社区与组织类似的工具来鼓励自己的文化成长。我喜欢用 GitLab 作为这种共生关系的一个例子。当我把 GitLab 带入一家公司时，我们得到了一个很棒的工具，但我们真正购买的是他们独特的文化，通过我们与他们的互动以及我们的贡献带来了巨大价值。他们的工具也可以为 DevOps 组织提供更多东西，而他们的文化已经在我引入它的公司中引起了他们的敬畏。”

现在我们的 DevOps 专家已经参与进来了，请在评论中分享你对 DevOps 的理解，以及向我们提出其他问题。

---

via: <https://opensource.com/article/19/1/what-does-devops-mean-you>

作者：[Girish Managoli](https://opensource.com/users/gammay) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MZqk](https://github.com/MZqk) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 中不使用 CD 命令进入目录/文件夹？

Summary: 众所周知，如果没有 cd 命令，我们无法 Linux 中切换目录。这个没错，但我们有一个名为 shopt 的 Linux 内置命令能帮助我们解决这个问题。

文章不错,提供了一个直接切换目录的方法

![](/data/attachment/album/201903/31/215922psyl6azycg666dzd.jpg)

众所周知，如果没有 `cd` 命令，我们无法 Linux 中切换目录。这个没错，但我们有一个名为 `shopt` 的 Linux 内置命令能帮助我们解决这个问题。

[shopt](https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html) 是一个 shell 内置命令，用于设置和取消设置各种 bash shell 选项，由于它已安装，因此我们不需要再次安装它。

是的，我们可以在启用此选项后，可以不使用 `cd` 命令切换目录。

我们将在本文中向你展示如何操作。这是一个小的调整，但对于那些从 Windows 迁移到 Linux 的新手来说非常有用。

这对 Linux 管理员没用，因为我们不会在没有 `cd` 命令的情况下切换到该目录，因为我们对此有经验。

如果你尝试在没有 `cd` 命令的情况下切换 Linux 的目录/文件夹，你将看到以下错误消息。这在 Linux 中很常见。

```
$ Documents/
bash: Documents/: Is a directory
```

为此，我们需要在用户 `.bashrc` 中追加以下值。

### 什么是 .bashrc ？

`.bashrc` 是一个 shell 脚本，每次用户以交互模式打开新 shell 时都会运行该脚本。

你可以在该文件中添加要在命令提示符下输入的任何命令。

`.bashrc` 文件本身包含终端会话的一系列配置。包括设置和启用：着色、补全，shell 历史，命令别名等。

```
$ vi ~/.bashrc
```

加入这一行：

```
shopt -s autocd
```

运行以下命令使更改生效。

```
$ source ~/.bashrc
```

我们已完成所有配置。简单地对此进行测试以确认这是否有效。

```
$ Documents/
cd -- Documents/

$ daygeek/
cd -- daygeek/

$ /home/daygeek/Documents/daygeek
cd -- /home/daygeek/Documents/daygeek

$ pwd
/home/daygeek/Documents/daygeek
```

![](/data/attachment/album/201903/31/220026dcmridinkmrcpmiz.jpg)

是的，它正如预期的那样正常工作。

而且，它在 fish shell 中工作正常，而无需对 `.bashrc` 进行任何更改。

![](/data/attachment/album/201903/31/220038v1qmmdk5ev59q51o.jpg)

如果要暂时执行此操作，请使用以下命令（设置或取消设置）。重启系统时，它将消失。

```
# shopt -s autocd

# shopt | grep autocd
autocd  on

# shopt -u autocd

# shopt | grep autocd
autocd  off
```

`shopt` 命令提供了许多其他选项，如果要验证这些选项，请运行以下命令。

```
$ shopt
autocd  on
assoc_expand_once   off
cdable_vars     off
cdspell     on
checkhash   off
checkjobs   off
checkwinsize    on
cmdhist     on
compat31    off
compat32    off
compat40    off
compat41    off
compat42    off
compat43    off
compat44    off
complete_fullquote  on
direxpand   off
dirspell    off
dotglob     off
execfail    off
expand_aliases  on
extdebug    off
extglob     off
extquote    on
failglob    off
force_fignore   on
globasciiranges on
globstar    off
gnu_errfmt  off
histappend  on
histreedit  off
histverify  off
hostcomplete    on
huponexit   off
inherit_errexit off
interactive_comments    on
lastpipe    off
lithist     off
localvar_inherit    off
localvar_unset  off
login_shell     off
mailwarn    off
no_empty_cmd_completion off
nocaseglob  off
nocasematch     off
nullglob    off
progcomp    on
progcomp_alias  off
promptvars  on
restricted_shell    off
shift_verbose   off
sourcepath  on
xpg_echo    off
```

此外，我找到了一些其他程序，它们可以帮助我们在 Linux 中比 `cd` 命令更快地切换目录。

它们是 `pushd`、`popd`、`up` shell 脚本和 `bd` 工具。我们将在接下来的文章中介绍这些主题。

---

via: <https://www.2daygeek.com/navigate-switch-directory-without-using-cd-command-in-linux/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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