如何利用 SSL/TLS 保护你的 Linux 邮件服务

Summary: 通过理解安全证书来保护你的 Linux 邮件服务。

通过理解安全证书来保护你的 Linux 邮件服务。

>
> 通过理解安全证书来保护你的 Linux 邮件服务。
>
>
>

![](/data/attachment/album/202005/13/215637khaogmririavnrlk.jpg)

通常，不管你是通过<ruby> 简单邮件传输协议 <rt>  Simple Mail Transport Protocol </rt></ruby>（SMTP）或者<ruby> 互联网消息访问协议 <rt>  Internet Message Access Protocol </rt></ruby>（IMAP）或<ruby> 邮局协议 <rt>  Post Office Protocol </rt></ruby>（POP）发送或者接受邮件，邮件服务默认都是以无保护的明文来传输数据。近来随着数据加密成为越来越多程序的共识，你需要<ruby> 安全套接层 <rt>  Secure Sockets Layer </rt></ruby>/<ruby> 传输层安全性 <rt>  Transport Layer Security </rt></ruby>（SSL/TLS）的安全证书来保护你的邮件服务。

首先，快速回顾一下邮件服务和协议的基本流程。邮件通过 SMTP 从 TCP 端口 25 发出。这个协议依靠 DNS <ruby> 邮件交换服务器 <rt>  Mail eXchanger </rt></ruby>（MX）记录的地址信息来传输邮件。当邮件到达邮件服务器后，可以被以下两种服务中的任意一种检索：使用 TCP 端口 143 的 IMAP，或者使用 TCP 端口 110 的 POP3（邮局协议第 3 版）。然而，以上服务都默认使用明文传输邮件和认证信息。这非常的不安全！

为了保护电子邮件数据和认证，这些服务都增加了一个安全功能，使它们可以利用 SSL/TLS 证书对数据流和通讯进行加密封装。SSL/TLS 是如何加密数据的细节不在本文讨论范围，有兴趣的话可以阅读 [Bryant Son 关于互联网安全的文章](/article-11699-1.html)了解更多细节。概括的说，SSL/TLS 加密是一种基于公钥和私钥的算法。

通过加入这些安全功能后，这些服务将监听在新的 TCP 端口：

| 服务 | 默认 TCP 端口 | SSL/TLS 端口 |
| --- | --- | --- |
| SMTP | 25 | 587 |
| IMAP | 143 | 993 |
| POP3 | 110 | 995 |

### 生成 SSL/TLS 证书

[OpenSSL](https://www.openssl.org/) 可以生成免费的 SSL/TLS 证书，或者你也可以从公共<ruby> 证书颁发机构 <rt>  Certificate Authoritie </rt></ruby>（CA）购买。过去，生成自签发证书十分简单而且通用，但是由于安全被日益重视，大部分的邮件客户端是不信任自签发证书的，除非手动设置。

如果你只是自己使用或者做做测试，那就使用自签发证书省点钱吧。但是如果很多人或者客户也需要使用的话，那最好还是从受信任的证书颁发机构购买。

不管是哪种情况，开始请求新证书的过程是使用 Linux 系统上的 OpenSSL 工具来创建一个<ruby> 证书签发请求 <rt>  Certificate Signing Request </rt> （CSR）：</ruby>

```
$ openssl req -new -newkey rsa:2048 -nodes -keyout mail.mydomain.key -out mail.mydomain.csr
```

这个命令会为你想保护的服务同时生成一个新的 CSR 文件和一个私匙。它会询问你一些证书相关的问题，如：位置、服务器的<ruby> 完全合规域名 <rt>  Fully Qualified Domain Name </rt></ruby>（FQDN）、邮件联系信息等等。当你输入完这些信息后，私钥和 CSR 文件就生成完毕了。

#### 如果你想生成自签发证书

如果你想要生成自签发证书的话，在运行以上 CSR 命令之前，你必须先创建一个[自己的根 CA](https://en.wikipedia.org/wiki/Root_certificate)。你可以通过以下方法创建自己的根 CA。

```
$ openssl genrsa -des3 -out myCA.key 2048
```

命令行会提示你输入一个密码。请输入一个复杂点的密码而且不要弄丢了，因为这将会是根 CA 私钥的密码，正如其名称所示，它是你的证书中所有信任关系的根。

接下来，生成根 CA 证书：

```
$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem
```

在回答完一些问题后，你就拥有一个有效期为 5 年的根 CA 证书了。

用之前生成的 CSR 文件，你可以请求生成一个新证书，并由您刚才创建的根 CA 签名。

```
$ openssl x509 -req -in mail.mydomain.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial -out mail.mydomain.pem -days 1825 -sha256
```

输入你的根 CA 私钥的密码来创建和签署证书。

现在你有了配置电子邮件服务以增强安全性所需的两个文件：私匙文件 `mail.mydomain.key` 和公开证书文件 `mail.mydomain.pem`。

#### 如果你愿意购买证书

如果你愿意从机构购买证书，则需要上传 CSR 文件到证书颁发机构的系统中，它将会被用于生成 SSL/TLS 证书。证书可作为文件下载，比如 `mail.mydomain.pem`。很多 SSL 机构也需要你下载一个中间证书。如果是这样的话，你必须把这个两个证书合并成一个，这样电子邮件服务就可以将这两个证书结合起来处理。可以使用以下命令把你的证书和第三方中间证书合并在一起：

```
$ cat mail.mydomain.pem gd_bundle-g2-g1.crt > mail.mydomain.pem
```

值得一提的是 `.pem` 文件后缀代表<ruby> 隐私增强邮件 <rt>  Privacy-Enhanced Mail </rt></ruby>。

现在你就有全部的设置邮件服务安全所需文件了：私匙文件 `mail.mydomain.key` 和组合的公开证书文件 `mail.mydomain.pem`。

### 为你的文件生成一个安全的文件夹

不管你是的证书是自签发的或者从机构购买，你都需要生成一个安全的，管理员拥有的文件夹用于保存这两个文件。可以使用以下命令来生成：

```
$ mkdir /etc/pki/tls
$ chown root:root /etc/pki/tls
$ chmod 700 /etc/pki/tls
```

在复制文件到 `/etc/pki/tls` 后，再次设置这些文件的权限：

```
$ chmod 600 /etc/pki/tls/*
```

### 配置你的 SMTP 和 IMAP 服务

接下来，让 SMTP 和 IMAP 服务使用新的安全证书。我们用 `postfix` 和 `dovecot` 来作为例子。

用你顺手的编辑器来编辑 `/etc/postfix/main.cf` 文件。添加以下几行：

```
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/mail.mydomain.pem
smtpd_tls_key_file = /etc/pki/tls/mail.mydomain.key
```

### 自定义选项

以下选项可以启用或禁用各种加密算法，协议等等：

```
smtpd_tls_eecdh_grade = strong
smtpd_tls_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_protocols= !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_security_level=may
smtpd_tls_ciphers = high
tls_preempt_cipherlist = yes
smtpd_tls_mandatory_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtpd_tls_exclude_ciphers = aNULL, MD5 , DES, ADH, RC4, PSD, SRP, 3DES, eNULL
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
```

编辑 `/etc/dovecot/dovecot.conf` 文件，添加以下三行：

```
ssl = required
ssl_cert = </etc/pki/tls/mail.mydomain.pem
ssl_key = </etc/pki/tls/mail.mydomain.key
```

添加下列更多选项来启用或禁用各种加密算法、协议等等（我把这些留给你来理解）：

```
ssl_cipher_list = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:ALL:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SSLv2
ssl_prefer_server_ciphers = yes
ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1
ssl_min_protocol = TLSv1.2
```

### 设置 SELinux 上下文

如果你的 Linux 发行版启用了 SELinux，请为你的新证书文件设置正确的 SELinux 上下文。

对于 Postfix 设置 SELinux：

```
$ chcon -u system_u -t cert_t mail.mydomain.*
```

对于 Dovecot 设置 SELinux：

```
$ chcon -u system_u -t dovecot_cert_t mail.mydomain.*
```

重启这些服务，并与你相应更新过的电子邮件客户端配置连接。有些电子邮件客户端会自动探测到新的端口，有些则需要你手动更新。

### 测试配置

用 `openssl` 命令行和 `s_client` 插件来简单测试一下：

```
$ openssl s_client -connect mail.mydomain.com:993
$ openssl s_client -starttls imap -connect mail.mydomain.com:143
$ openssl s_client -starttls smtp -connect mail.mydomain.com:587
```

这些测试命令会打印出很多信息，关于你使用的连接、证书、加密算法、会话和协议。这不仅是一个验证新设置的好方法，也可以确认你使用了适当的证书，以及在 postfix 或 dovecot 配置文件中定义的安全设置正确。

保持安全！

---

via: <https://opensource.com/article/20/4/securing-linux-email>

作者：[Marc Skinner](https://opensource.com/users/marc-skinner) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Acceleratorrrr](https://github.com/Acceleratorrrr) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > 华为否认提交给 Linux 内核的不安全补丁 HKSP 来自官方

Summary: 更多：阿里云自研数据仓库 AnalyticDB 再捧 TPC 全球冠军；腾讯受益于疫情收入大涨

![](/data/attachment/album/202005/14/124248uxtkxbgy29bkuxkz.jpg)

#### 华为否认提交给 Linux 内核的不安全补丁 HKSP 来自官方

上周有华为工程师为 Linux 内核提交了一个内核强化补丁 HKSP（华为内核自我防护Huawei Kernel Self Protection），不过在代码检查后，该补丁被发现存在安全漏洞。根据 ZDNet 的消息，华为已经在周一的一份声明中表示，尽管该项目的名称中使用了“华为”，并且该项目是由其一名顶级安全工程师开发的，但华为并未正式参与 HKSP 项目。华为同时也表示，该项目代码从未在任何正式的华为产品中实际使用过：“这只是个人用于与开源社区 Openwall 进行技术讨论的演示代码。”

来源：[开源中国](https://www.oschina.net/news/115632/huawei-denies-involvement-in-buggy-linux-kernel-patch-proposal?tdsourcetag=s_pctim_aiomsg)

>
> 硬核老王点评：本来是一个普普通通的代码质量问题，但在有些人解读之下却浮想联翩。不过，个人项目冠名华为这样的行为在该公司是允许的吗？
>
>
>

#### 阿里云自研数据仓库 AnalyticDB 再捧 TPC 全球冠军

5月14日，TPC 官网正式公布，阿里云自研的 AnalyticDB 通过了TPC-DS全流程测试，将前世界纪录的性能提升了29%，并把单位成本降低了三分之二，成功夺得全球数据仓库的桂冠。

来源：[CSDN](https://mp.weixin.qq.com/s/rpZ8gbEw-Ak9_7Sc2eQShg)

>
> 硬核老王点评：似乎对阿里云热衷于得到各种比赛的冠军已经有点麻木了。
>
>
>

#### 腾讯受益于疫情收入大涨

新冠病毒疫情带动“宅经济”发展，中国最大的游戏和互联网巨头腾讯控股周三公布，首季度净利按年增长 6%，而按非国际财务报告准则（Non-GAAP）净利增幅更达29%，内地防疫家居隔离带动其网络游戏及网络广告收入增长。然而，随着内地各地陆续复工复产，腾讯预期，游戏的用户使用时长及游戏内消费活动将大致回复正常水平，但公司相信，游戏行业已从结构上扩大了其长期受众及吸引力。

来源：[solidot](https://www.solidot.org/story?sid=64354)

>
> 硬核老王点评：虽然不能说游戏是邪恶的，但是一家公司因为这种情况带来的这种收入大涨，怎么也感觉有点不对味。当然，曾经有信誓旦旦不做游戏的公司最终也是投资了游戏行业，其实想想公司都是为牟利而生的，也就不足为怪了。只希望这些公司在牟利的同时不要忘记社会责任感。
>
>
>

#### Deno 1.0 发布

Deno 是作者 Ryan Dahl 在 Node 之后的又一大作，它是一个新的运行时，用于在 Web 浏览器之外执行 JavaScript 和 TypeScript，其采用 Rust 编写而成。Deno 试图提供一个独立的工具来快速编写复杂功能的脚本，它将始终是单个可执行文件。就像 Web 浏览器一样，它知道如何获取外部代码。在 Deno 中，单个文件可以定义任意复杂的行为，而无需任何其它工具。Ryan Dahl 认为过去他在设计 Node 时犯了一些错误，包括安全性、构建系统、package.json、node\_modules、index.js 等等，并表示 Node 存在的种种不足导致有许多严重问题且不可回避，当前 JavaScript 和周围的软件基础架构已经发生了巨大的变化，值得进行简化，于是他重新设计了 Deno 这门脚本语言。

来源：[开源中国](https://www.oschina.net/news/115625/deno-1-0-released)

>
> 硬核老王点评：确实 Node.JS 在取得成功的同时，也暴露出之前的一些先天不足。这个值得期待。
>
>
>

#### 最冷清的应用商店：Windows 10 商店

无论是 iOS 还是 Android，系统内置的应用商店都门庭若市。然而在 Windows 10 上，情况却截然不同——自带的应用商店门可罗雀，时至今日，绝大部分用户在 Windows 10 中安装软件的主流方式，依然是自行下载软件安装，Windows 10 商店似乎已然是一个鸡肋般的存在。

来源：[太平洋电脑网](https://www.cnbeta.com/articles/tech/978733.htm)

>
> 硬核老王点评：这样比起来，Linux 桌面的应用商店（软件中心）或许更被用户所接受。
>
>
>

#### CreepRank 算法帮助谷歌 Play 商店剔除了 813 款 Android 蠕虫应用

据悉，来自纽约大学、康奈尔科技学院、以及 NortonLifeLock（原赛门铁克）的学者们，对这些蠕虫软件展开了深入的分析。这里提到的蠕虫，特指不具有完整的间谍或追踪功能的移动 App 。即便如此，别有用心的开发者仍可借此对用户展开间接追踪、骚扰、欺诈或威胁他人。研究团队开发的 CreepRank 算法，能够识别移动 App 中疑似的蠕虫行为，然而对每款 App 进行打分。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/978495.htm)

#### UCloud 发布物联网边缘网关 IoT Edge，实现边云协同

用户可以将 UIoT Edge 运行系统直接安装到符合要求的 X86、ARM 硬件网关。该系统实现了子设备数据的采集、解析、清洗、加工、缓存，本地场景的实时控制与联动，可广泛应用于工业制造、能源电气、智慧社区、物业楼宇、智能农业、新零售等领域。UIoT Edge 边缘网关提供子设备接入、函数计算、消息路由、一键部署/远程运维和本地 Web Portal 五大功能。目前，UIoT Edge进入公测阶段。

来源：[UCloud](https://mp.weixin.qq.com/s/B6JNQvkyOca25o1V6hIMHQ)


用于各种用途的最佳树莓派操作系统

![](/data/attachment/album/202005/15/105040b17d6v7gdmj63k3k.jpg)

[树莓派](https://www.raspberrypi.org/) 是一款不可缺少的单板电脑，在很多工作中都能派上用场。不相信？只要[看看这个树莓派项目列表](https://itsfoss.com/raspberry-pi-projects/)，就能了解这个小小的设备能做什么。

考虑到树莓派用途这么多，为它选择一个合适的操作系统就极其重要。当然，你可以用 Linux 做很多事，但专门为特定目的配置的操作系统可以为你节省大量的时间和精力。

因此，本文中我要介绍一些专门为树莓派量身定制的流行且实用的操作系统。

### 由于有树莓派镜像工具，安装任何操作系统到树莓派上都很容易

[在 SD 卡上安装树莓派操作系统](/article-12136-1.html)比以前容易得多。你只需下载[树莓派镜像](https://www.raspberrypi.org/downloads/)就可以快速地安装任何树莓派操作系统。请看下面的官方视频，你就知道有多简单。

你也可以使用 [NOOBS](https://www.raspberrypi.org/downloads/noobs/)（<ruby> 新开箱即用软件 <rt>  New Out Of the Box Software </rt></ruby>）在树莓派上轻松安装各种的操作系统。你还可以从他们的 [NOOBS 官方下载页面](https://www.raspberrypi.org/downloads/noobs/)提到的支持的零售商列表中获得预装 SD 卡。

欢迎在他们的[官方文档](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)中了解更多关于安装操作系统的信息。

* [下载树莓派操作系统](https://www.raspberrypi.org/downloads/)

现在你知道了怎么安装它（以及从哪儿获取），让我来重点介绍几个有用的树莓派操作系统，希望对你有所帮助。

### 适用于树莓派的各种操作系统

请注意，我花了一些精力筛选出了那些被积极维护的树莓派操作系统项目。如果某个项目在不久的将来会停止维护，请在评论区告诉我，我会更新本文。

另一件事是，我关注到现在最新的版本是树莓派 4，但是下面的列表不应被认为是树莓派 4 的操作系统列表，这些系统应该也能用于树莓派 3、3B+ 和其他变种，但是请参照项目的官方网站了解详细信息。

**注意：** 排名不分先后。

#### 1、Raspbian OS：官方的树莓派操作系统

![](/data/attachment/album/202005/15/105447tbv3kv2ipbidkfhi.jpg)

Raspbian OS 是官方支持的树莓派板卡操作系统。它集成了很多工具，用于教育、编程以及其他广泛的用途。具体来说，它包含了 Python、Scratch、Sonic Pi、Java 和其他一些重要的包。

最初，Raspbian OS 是基于 Debian 的，并预装了大量有用的包。因此，当你安装 Raspbian OS 后，你可能就不需要特意安装基本工具了 — 你会发现大部分工具已经提前安装好了。

Raspbian OS 是被积极地维护着的，它也是最流行的树莓派操作系统之一。你可以使用 [NOOBS](https://www.raspberrypi.org/downloads/noobs/) 或参照[官方文档](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)来安装它。

* [Raspbian OS](https://www.raspbian.org/)

#### 2、Ubuntu MATE：适合通用计算需求

![](/data/attachment/album/202005/15/105448j27hkhchhs77srf7.jpg)

尽管 Raspbian 是官方支持的操作系统，但它的特点不是最新、最大的软件包。因此，如果你想更快的更新，想用最新的包，你可以试试 Ubuntu MATE 的树莓派版本。

Ubuntu MATE 的树莓派定制版是值得安装的非常不错的轻量级发行版。它还被广泛用于 [NVIDIA 的 Jetson Nano](https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-nano/)。换言之，你可以在树莓派的很多场景下使用它。

为了更好地帮助你，我们还有一份详细的教程：[怎样在树莓派上安装 Ubuntu MATE](/article-10817-1.html)。

* [Ubuntu MATE for Raspberry Pi](https://ubuntu-mate.org/raspberry-pi/)

#### 3、Ubuntu Server：把树莓派作为一台 Linux 服务器来使用

![](/data/attachment/album/202005/15/105449z0wzb0x06us6sbdu.png)

如果你计划把你的树莓派当作项目的某个服务器来使用，那么安装 Ubuntu Server 会是一个不错的选择。

Ubuntu Server 有 32 位和 64 位的镜像。你可以根据你的板卡类型（是否支持 64 位）来选择对应的操作系统。

然而，值得注意的一点是 Ubuntu Server 不是为桌面用户定制的。因此，你需要留意 Ubuntu Server 默认不会安装图形用户界面。

* [Ubuntu Server](https://ubuntu.com/download/raspberry-pi)

#### 4、LibreELEC：适合做媒体服务器

![](/data/attachment/album/202005/15/105451fwddzzc7g1fg11oo.jpg)

我们已经有一个 [Linux 下可用的媒体服务器软件](https://itsfoss.com/best-linux-media-server/)，LibreELEC 在列表中。

它是一个很棒的轻量级操作系统，让你可以在树莓派上安装 [KODI](https://kodi.tv/)。你可以尝试使用树莓派镜像工具来安装它。

你可以很容易地找到他们的[官方下载页面](https://libreelec.tv/downloads_new/)，并找到适合你板卡的安装镜像。

* [LibreELEC](https://libreelec.tv/)

#### 5、OSMC：适合做媒体服务器

![](/data/attachment/album/202005/15/105453w5mqpecpi5pe4mch.jpg)

OSMC 是另一个 Linux 下[流行的媒体服务器软件](https://itsfoss.com/best-linux-media-server/)。如果要把树莓派板作为媒体中心设备，那么 OSMC 是你可以向他人推荐的操作系统之一。

类似 LibreELEC，OSMC 也运行 KODI，可以帮助你管理你的媒体文件和欣赏你已有的素材。

OSMC 没有正式提及对树莓派 4 的支持。因此，如果你的树莓派是树莓派 3 或更早的版本，那么应该没有问题。

* [OSMC](https://osmc.tv/)

#### 6、RISC OS：最初的 ARM 操作系统

![](/data/attachment/album/202005/15/105456ne7ggldp7p141mug.jpg)

RISC OS 最初是为 ARM 设备打造的，至今已有近 30 年左右的历史。

如果你想了解，我们也有篇详细介绍 [RISC OS](https://itsfoss.com/risc-os-is-now-open-source/) 的文章。简而言之，RISC OS 也是为诸如树莓派的现代基于 ARM 的单板计算机定制的。它的用户界面很简单，更专注于性能。

同样的，这并不是为树莓派 4 量身定做的。因此，如果你的树莓派是 3 或更早的版本，你可以试一下。

* [RISC OS](https://www.riscosopen.org/content/)

#### 7、Mozilla WebThings Gateway：适合 IoT 项目

![](/data/attachment/album/202005/15/105456n6ehl5i4qs94ecqx.png)

作为 Mozilla 的 [IoT 设备的开源实现](https://iot.mozilla.org/about/)的一部分，WebThings Gateway 让你可以监控和控制所有连接的 IoT 设备。

你可以参考[官方文档](https://iot.mozilla.org/docs/gateway-getting-started-guide.html)来检查所需的环境，遵照指导把安装到树莓派上。它确实是适合 IoT 应用的最有用的树莓派操作系统之一。

* [WebThings Gateway](https://iot.mozilla.org/gateway/)

#### 8、Ubuntu Core：适合 IoT 项目

Ubuntu Core 是又一个树莓派操作系统，适用于潜在的 [IoT](https://en.wikipedia.org/wiki/Internet_of_things) 应用，或者只是测试一下 Snap。

Ubuntu Core 是专门为 IoT 设备或者具体来说是树莓派定制的。我不会刻意宣传它 —— 但是 Ubuntu Core 是一款适合树莓派板卡的安全操作系统。你可以自己尝试一下！

* [Ubuntu Core](https://ubuntu.com/download/raspberry-pi-core)

#### 9、DietPi：轻量级树莓派操作系统

![](/data/attachment/album/202005/15/105457nwp7hwouw57sqb5z.jpg)

DietPi 是一款轻量级的 [Debian](https://www.debian.org/) 操作系统，它还宣称比 “Raspbian Lite” 操作系统更轻量。

虽然它被视作一款轻量级的树莓派操作系统，但它提供了很多功能，可以在多个使用场景中派上用场。从简单的软件安装包到备份解决方案，还有很多功能值得探索。

如果你想安装一个低内存占用而性能相对更好的操作系统，你可以尝试一下 DietPi。

* [DietPi](https://dietpi.com/)

#### 10、Lakka Linux：打造复古的游戏主机

![](/data/attachment/album/202005/15/105500xyfmvllfvvetftii.jpg)

想让你的树莓派变成一个复古的游戏主机？

Lakka Linux 发行版本最初是建立在 RetroArch 模拟器上的。因此，你可以立刻在树莓派上获得所有的复古游戏。

如果你想了解，我们也有一篇介绍 [Lakka Linux](/article-10158-1.html) 的文章。或者直接上手吧！

* [Lakka](http://www.lakka.tv/)

#### 11、RetroPie：适合复古游戏

![](/data/attachment/album/202005/15/105502u9zb0mmgsofamsb9.png)

RetroPie 是另一款可以让树莓派变成复古游戏主机的树莓派操作系统。它提供了几个配置工具，让你可以自定义主题，或者调整模拟器即可拥有最好的复古游戏。

值得注意的是它不包含任何有版权的游戏。你可以试一下，看看它是怎么工作的！

* [RetroPie](https://retropie.org.uk/)

#### 12、Kali Linux：适合低成本渗透

![](/data/attachment/album/202005/15/105504s7jf4ee74y9ob6fq.png)

想要在你的树莓派上尝试和学习一些道德黑客技巧吗？[Kali Linux](/article-10690-1.html) 会是最佳选择。是的，Kali Linux 通常在最新的树莓派一发布就会支持它。

Kali Linux 不仅适合树莓派，它也支持很多其他设备。尝试一下，玩得愉快！

* [Kali Linux](https://www.offensive-security.com/kali-linux-arm-images/)

#### 13、OpenMediaVault：适合网络附加存储（NAS）

![](/data/attachment/album/202005/15/105505wxkrycg4gxrfkbyg.jpg)

如果你想在极简的硬件上搭建 [NAS](https://en.wikipedia.org/wiki/Network-attached_storage) 解决方案，树莓派可以帮助你。

OpenMediaVault 最初是基于 Debian Linux 的，提供了大量功能，如基于 Web 的管理能力、插件支持，等等。它支持大多数树莓派型号，因此你可以尝试下载并安装它！

* [OpenMediaVault](https://www.openmediavault.org/)

#### 14、ROKOS：适合加密挖矿

![](/data/attachment/album/202005/15/105507woz72h8th4tdxthd.jpg)

如果你对加密货币和比特币很感兴趣，那么 ROKOS 会吸引你。

ROKOS 是基于 Debian 的操作系统，基本上可以让你把你的树莓派变成一个节点，同时预装了相应的驱动程序和软件包。当然，在安装之前你需要了解它是怎么工作的。因此，如果你对此不太了解，我建议你先调研下。

* [ROKOS](https://rokos.space/)

#### 15、Alpine Linux：专注于安全的轻量级 Linux

当今年代，很多用户都在寻找专注于安全和[隐私的发行版本](https://itsfoss.com/privacy-focused-linux-distributions/)。如果你也是其中一员，你可以试试在树莓派上安装 Alpine Linux。

如果你是个树莓派新手，它可能不像你想象的那样对用户友好（或者说对初学者来说容易上手）。但是，如果你想尝试一些不一样的东西，那么你可以试试 Alpine Linux 这个专注于安全的 Linux 发行版本。

* [Alpine Linux](https://alpinelinux.org/)

#### 16、Kano OS：适合儿童教育的操作系统

![](/data/attachment/album/202005/15/105509hnqwc5q43hswq9ew.jpg)

如果你在寻找一款能让学习变得有趣还能教育儿童的树莓派操作系统，那么 Kano OS 是个不错的选择。

它正在积极维护中，而且 Kano OS 上的桌面集成的用户体验相当简单，玩起来也很有趣，可以让孩子们从中学习。

* [Kano OS](https://kano.me/row/downloadable)

#### 17、KDE Plasma Bigscreen：把普通电视转换为智能电视

![](/data/attachment/album/202005/15/105510xaftfq8qyaagyza4.jpg)

这是 KDE 一个正在开发中的项目。在树莓派上安装 [KDE “等离子大屏”](/article-12063-1.html) 后，你可以把普通电视变成智能电视。

你不需要特殊的遥控器来控制电视，你可以使用普通的遥控器。

“等离子大屏”也集成了 [MyCroft 开源 AI](https://itsfoss.com/mycroft-mark-2/) 作为声控。

这个项目还在测试阶段，所以如果你想尝试，可能会有一些错误和问题。

* [Plasma Bigscreen](https://plasma-bigscreen.org/#download-jumpto)

#### 18、Manjaro Linux：为你提供多功能的桌面体验

![](/data/attachment/album/202005/15/105512xxkz49e4lysxmv41.jpg)

如果你想在树莓派上寻找一个基于 Arch 的 Linux 发行版，那么 Manjaro Linux 应该是一个很好的补充，它可以做很多事情，适合一般的计算任务。

Manjaro Linux ARM 版也支持最新的树莓派 4。它为你的树莓派或任何[树莓派替代品](/article-10823-1.html)提供了 XFCE 和 KDE Plasma 变体。

此外，它似乎还提供了树莓派设备上最快/最好的体验之一。如果你还没试过，那就试试吧!

* [Manjaro ARM](https://manjaro.org/download/#raspberry-pi-4)

#### 19、Volumio：作为一个开源音乐播放器使用

![](/data/attachment/album/202005/15/105515nwwoun6x6b99jwhn.jpg)

想做一个廉价的音乐发烧友系统？Volumio 应该可以帮到你。

它是一个自由而开源的操作系统（[GitHub](https://github.com/volumio)），还支持集成多个设备的能力。你可以通过一个简单的 Web 控制界面，对所有连接的设备进行管理。除了免费版之外，它还提供了一个高级版，可以让你获得独家功能。

它也确实支持最新的树莓派 4。所以，如果你对调整已有的家庭立体声系统有一定的兴趣，想要获得最佳的音质，不妨试试这个。

* [Volumio](https://volumio.org/)

#### 20、FreeBSD

不想使用 Linux 发行版？不用担心，你也可以用 FreeBSD 在树莓派上安装一个类 UNIX 操作系统。

如果你不知道的话，我们有一篇关于 [FreeBSD 项目](https://itsfoss.com/freebsd-interview-deb-goodkin/)的详细文章。

一旦你按照他们的[官方说明](https://www.freebsdfoundation.org/freebsd/how-to-guides/installing-freebsd-for-raspberry-pi/)安装好之后，你可以利用它来进行任何 DIY 实验，或者只是把它作为一个轻量级的桌面系统来完成特定的任务。

* [FreeBSD](https://www.freebsd.org/)

#### 21、NetBSD

NetBSD 是另一个令人印象深刻的类 UNIX 操作系统，你可以在树莓派上安装。它的目标是成为一个跨多个系统的便携式操作系统。

如果你在其他系统中使用过它，你可能已经知道它的好处了。然而，它不仅仅是一个轻量级的便携式操作系统，它的特点是拥有一套有用的功能，可以完成各种任务。

* [NetBSD](https://www.netbsd.org/)

### 结语

我相信还有很多为树莓派定制的操作系统 — 但是我尽力列出了被积极维护的最流行的或最有用的操作系统。

如果你觉得我遗漏了最合适树莓派的操作系统，尽情在下面的评论去告诉我吧！

---

via: <https://itsfoss.com/raspberry-pi-os/>

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

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


无法在 Ubuntu 20.04 上安装 Deb 文件？这是你需要做的！

Summary: 双击 .deb 文件后无法通过 Ubuntu 20.04 的软件中心安装？你不是唯一遇到此问题的人。本教程展示了解决方法。

gdebi 好久每更新了。

来自39.152.20.153的 Chrome 83.0|GNU/Linux 用户

>
> 双击.deb 文件后无法通过 Ubuntu 20.04 的软件中心安装？你不是唯一遇到此问题的人。本教程展示了解决方法。
>
>
>

![](/data/attachment/album/202005/15/112149cfdyg556upv6vd66.jpg)

在“[安装 Ubuntu 20.04 之后要做的事](/article-12183-1.html)”一文中，一些读者提到他们[用 .deb 文件安装软件](https://itsfoss.com/install-deb-files-ubuntu/)遇到了麻烦。

我发现这很奇怪，因为使用 deb 文件安装程序是最简单的方法之一。你要做的就是双击下载的文件，它会在软件中心中打开（默认情况下）。单击安装，它要求你输入密码，并在几秒钟/分钟内安装了该软件。

我[从 19.10 升级到 Ubuntu 20.04](https://itsfoss.com/upgrade-ubuntu-version/)直到今天都没有遇到这个问题。

我下载了 .deb 文件来安装 [Rocket Chat Messenger](https://rocket.chat/)，然后双击该文件安装时，文件用存档管理器打开。这不是我所期望的。

![DEB files opened with Archive Manager instead of Software Center](/data/attachment/album/202005/15/112245karnndgrbt5avqru.png)

“修复”很简单，我将在本教程中向你展示。

### 在 Ubuntu 20.04 中安装 deb 文件

由于某些原因，在 Ubuntu 20.04 中 deb 文件的默认打开程序被设置为存档管理器。存档管理器是用于[解压 zip](https://itsfoss.com/unzip-linux/) 和其他压缩文件。

解决此问题的方法非常简单。[在 Ubuntu 中更改默认应用](https://itsfoss.com/change-default-applications-ubuntu/)，将打开 DEB 文件从“存档管理器”改到“软件安装”。让我告诉你步骤。

**步骤 1：**右键单击下载的 .deb 文件，然后选择**属性**：

![](/data/attachment/album/202005/15/112246vc6c9lj5gj5jpp9m.png)

**步骤 2：**进入“**打开方式**”标签，选择“**软件安装**”，然后点击“**设置为默认**”。

![](/data/attachment/album/202005/15/112248zpiwyiciyiqwl99y.png)

这样，以后所有的 .deb 文件都将通过“软件安装”即软件中心打开。

双击 .deb 文件确认，看看是否在软件中心中打开。

### 忽视的 bug 还是愚蠢的功能？

为什么会用存档管理器打开 deb 文件让人无法理解。我确实希望这是一个 bug，而不是像[在 Ubuntu 20.04 中不允许在桌面上拖放文件](https://itsfoss.com/add-files-on-desktop-ubuntu/)这样的怪异功能。

既然我们在讨论 deb 文件的安装，就让我告诉你一个不错的工具 [gdebi](https://launchpad.net/gdebi)。它是一个轻量级应用，其唯一目的是安装 DEB 文件。有时它也可以处理依赖关系。

你可以了解更多有关[使用 gdebi 并默认设为安装 deb 文件的工具](https://itsfoss.com/gdebi-default-ubuntu-software-center/)。

---

via: <https://itsfoss.com/cant-install-deb-file-ubuntu/>

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

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


新闻速读 > Ubuntu Touch OTA-12 正式发布，提供完整 Unity8 使用体验

Summary: 更多：收太多了，Zerodium 宣布暂停收买 iOS 漏洞利用；自 2016 年以来 Mandrake Android 恶意软件一直在窃取用户数据

![](/data/attachment/album/202005/15/122023naiwasw8098w5tii.jpg)

#### Ubuntu Touch OTA-12 正式发布，提供完整 Unity8 使用体验

号称“史上最大版本更新”的 Ubuntu Touch OTA-12 已正式发布。相比较此前几个版本，本次更新带来了巨大改进，其中最大的亮点就是提供了完整的 Unity8 体验，开发团队解释说，导入 Canonical 的最终修改已经完成。对于那些在手机上寻找更精致的 Linux 体验的用户来说，这是一个值得尝试的重要版本。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/979027.htm)

>
> 硬核老王点评：这真是一个值得期待的版本。或许我们该找些这方面的内容分享给大家。
>
>
>

#### 收太多了，Zerodium 宣布暂停收买 iOS 漏洞利用

Zerodium 是一个漏洞利用获取平台，旨在向研究人员支付一定的费用来收买零日安全漏洞，然后转手卖给政府和执法机构等客户。然而本周，Zerodium 竟然宣布 —— 由于短期内提交的 iOS 漏洞利用程序太多，其计划在未来 2~3 个月内不再购买此类内容。据悉，Zerodium 专注于高风险的漏洞，通常每个功能完善的 iOS 漏洞利用会被给予 10 万到 200 万美元的奖励。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/979339.htm)

>
> 硬核老王点评：iOS 也一样不安全啊。
>
>
>

#### 自 2016 年以来 Mandrake Android 恶意软件一直在窃取用户数据

Bitdefender 指出，其行为与大多数常见的威胁有所不同。Mandrake 并不致力于感染更多的设备，而是希望从用特定用户手上榨取更多的数据。之所以谷歌 Play 商店迟迟未能揪出这款恶意软件，是因为 Mandrake 并未直接将这部分内容包含在程序本体。只有在接到指示之后，才会开启加载恶意行为的过程。此外为了给维持用户眼中“可信赖”的错误印象，开发者对“正经功能”的反馈响应也很是积极，甚至某些 App 还有与之关联的社交媒体活跃账号。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/979347.htm)

>
> 硬核老王点评：某些流行安卓软件表示，用得着这么费劲么？
>
>
>

#### 我国有线数字电视缴费用户降至 1.42 亿

报告显示，今年一季度，我国有线电视用户总量净减 310.4 万户，降到了 2.06 亿户，有线电视在用户家庭电视收视的份额降至 45.58%。其中，有线数字用户净减 202 万户，总数为 1.90 亿户，有线数字电视缴费用户为 1.42 亿户，净减 196.2 万户。今年一季度，广电宽带用户总量为 4186.9 万户，季度净减少 57.7 万户，首次出现负增长；在 2019 年四季度，广电宽带用户为 4244.6 万户。

来源：[快科技](https://www.cnbeta.com/articles/tech/979191.htm)

>
> 硬核老王点评：除了疫情影响，这可能也是一种时代变化。
>
>
>

#### 世界最大主权财富基金遭遇网络攻击：被骗走 1000 万美元

作为全球最大的主权财富基金 Norfund 基金因网络诈骗，被骗子轻而易举的骗走1000万美元，而骗子是利用了所谓“泄露的付款数据”这一缺陷来作案的。挪威主权基金 Norfund（也被称为挪威国家基金）的资金来源于著名的北海油田收益，目前市值超过 1 万亿美元。该基金表示，有黑客操纵了该组织的一笔交易，将一笔原本打算借给柬埔寨一家小额信贷机构的贷款转入受骗子控制的一个账户，结果导致该基金在 3 月份被骗 1 亿克朗（约为 1000 万美元）。

来源：[凤凰网科技](https://www.cnbeta.com/articles/tech/979113.htm)

#### Reddit 推出基于以太坊的代币

知名线上论坛 Reddit 正在对两款基于以太坊的加密货币令牌展开公测，贡献内容的用户将获得相应的奖励。作为新发起的“社区积分”计划的一部分，名为 $MOONS 和 $BRICKS 的两款代币将分别发放给 reddit 上的 /r/Cryptocurrency 和 /r/FortniteBR 坛友。目前该项目仍处于公测阶段，预计会持续到 2020 年夏季。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/979075.htm)

#### LibreOffice 7.0 首个 Alpha 版本发布：增强和微软 Office 文档兼容性

本周文档基金会推出了 LibreOffice 7.0 的首个 Alpha 版本。LibreOffice 7.0 预估将会在今年8月份推出，并对该生产力套件中的每一个应用进行了大规模的改进。在该版本中有一个值得关注的改进就是对 .DOCX 文档的导入和导出过滤功能，大大提高了和微软 Office 文档的兼容性。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/979021.htm)


Ubuntu 默认壁纸历代记

Summary: 你喜欢哪张呢？

剪影的创意不错，不过某些版本感觉作画有些崩坏

![](/data/attachment/album/202005/16/160851k7tzee7lo6qsz77f.jpg)

自从 2004 年 Ubuntu 发布第一个版本 4.10 以来，到前不久[刚刚发布的 20.04 LTS](/article-12142-1.html)，Ubuntu 已经发布了 32 个大版本。在这些版本中，每个版本都会带有一张默认壁纸，这十六年来，我们可以从这些默认壁纸中感受到 Ubuntu 之美的变迁。

我们特别收集了所有这 32 个版本的默认壁纸，以飨读者。

（说明，下列壁纸是我们收集来的最高精度的壁纸，但是在上传和压缩过程中可能会损失精度，如果喜欢某一张的话，可以自行搜索合适尺寸和精度的壁纸。）

### 比较”土”的 4.10 - 7.10

最早期 Ubuntu 的这些默认壁纸，可以是说是很“土”了，不过想想那个时期的计算机审美，也略可理解。

#### Ubuntu 4.10 Warty Warthog

![](/data/attachment/album/202005/16/091130ffkyk94q9q2zpg52.jpg)

#### Ubuntu 5.04 Hoary Hedgehog

![](/data/attachment/album/202005/16/091210azzp7lv0kk2k2w07.jpg)

#### Ubuntu 5.10 Breezy Badger

![](/data/attachment/album/202005/16/091237zriw5mmirvrnvafr.jpg)

#### Ubuntu 6.06 Dapper Drake

![](/data/attachment/album/202005/16/091305taw6ledfsx10dcf1.jpg)

#### Ubuntu 6.10 Edgy Eft

![](/data/attachment/album/202005/16/091334aiuwejtfetezbuyd.jpg)

#### Ubuntu 7.04 Feisty Fawn

![](/data/attachment/album/202005/16/091404vfgg7w7ui1733niv.jpg)

#### Ubuntu 7.10 Gutsy Gibbon

![](/data/attachment/album/202005/16/091432pdmh10uq0urd1d5p.jpg)

### 试图突破的 Ubuntu 8.04 - 9.10

在经过了几代灰突突的抽象壁纸之后，在 2008 年的两个版本当中尝试使用了更具形象感的壁纸，以切合该版本的吉祥物，但很快，这种努力就被放弃了。

#### Ubuntu 8.04 Hardy Heron

![](/data/attachment/album/202005/16/091858r3133gzgzyim1lvh.jpg)

#### Ubuntu 8.10 Intrepid Ibex

![](/data/attachment/album/202005/16/091932sk2oghwt8zoxwsih.jpg)

#### Ubuntu 9.04 Jaunty Jackalope

![](/data/attachment/album/202005/16/092011w443fbev34814h39.jpg)

#### Ubuntu 9.10 Karmic Koala

![](/data/attachment/album/202005/16/092041f3uyr7hhhjczhhhy.jpg)

### 紫色滥觞的开始 Ubuntu 10.04 - 13.10

从 Ubuntu 10.04 开始，Ubuntu 壁纸就进入了紫薯，哦不，紫色时代，从此紫色就成了 Ubuntu 的形象色。

#### Ubuntu 10.04 Lucid Lynx

![](/data/attachment/album/202005/16/092506buh3m67mu6h0ufp3.jpg)

#### Ubuntu 10.10 Maverick Meerkat

![](/data/attachment/album/202005/16/092539avih34ih335lj0qt.jpg)

#### Ubuntu 11.04 Natty Narwhal

![](/data/attachment/album/202005/16/092620w2btm2o0ou8af04b.jpg)

#### Ubuntu 11.10 Oneiric Ocelot

![](/data/attachment/album/202005/16/092707ui0uchiygcy2aqqh.jpg)

#### Ubuntu 12.04 Precise Pangolin

![](/data/attachment/album/202005/16/092738t8l051yxmzmyz3cd.jpg)

#### Ubuntu 12.10 Quantal Quetzal

![](/data/attachment/album/202005/16/092822rppywy4bh555ok05.jpg)

#### Ubuntu 13.04 Raring Ringtail

![](/data/attachment/album/202005/16/092909n8b4080yl8g9hhzy.jpg)

#### Ubuntu 13.10 Saucy Salamander

![](/data/attachment/album/202005/16/092941ggtzoo9tlp41lm1l.jpg)

### “以刚克柔”的 14.04 - 17.04

从 Ubuntu 14.04 开始，Ubuntu 默认壁纸一改之前的柔性线条，开始在壁纸中大量使用各种直线、折线，这种变化一直延续到现在。此外，14.10 是唯一一个没有新壁纸的大版本，它的默认壁纸和 Ubuntu 14.04 一样（虽然很多版本的壁纸变化也很细微）。

#### Ubuntu 14.04 Trusty Tahr & Ubuntu 14.10 Utopic Unicorn

![](/data/attachment/album/202005/16/093528s0xtkfb1yeyenfnz.jpg)

#### Ubuntu 15.04 Vivid Vervet

![](/data/attachment/album/202005/16/093622oy3txcl2cdpdxpdl.jpg)

#### Ubuntu 15.10 Wily Werewolf

![](/data/attachment/album/202005/16/093656h6wjd2jmp8i2zjww.jpg)

#### Ubuntu 16.04 LTS Xenial Xerus

![](/data/attachment/album/202005/16/093735f7d27i21671m21we.jpg)

#### Ubuntu 16.10 Yakkety Yak

![](/data/attachment/album/202005/16/093808mvvqa5ivroprpgvj.jpg)

#### Ubuntu 17.04 Zesty Zapus

![](/data/attachment/album/202005/16/093923flwohwolos1ljeaz.jpg)

### 剪影动物时代 Ubuntu 17.10

从 Ubuntu 17.10 这个 AA 版本开始，Ubuntu 的默认壁纸在原来的基础上开始加入吉祥物的剪影。

#### Ubuntu 17.10 Artful Aardvark

![](/data/attachment/album/202005/16/094147uxcxisxx99ccpssz.jpg)

#### Ubuntu 18.04 LTS Bionic Beaver

![](/data/attachment/album/202005/16/094220kzntlefj05gtipx0.jpg)

#### Ubuntu 18.10 Cosmic Cuttlefish

![](/data/attachment/album/202005/16/094248u04l0yj04j40ygz0.jpg)

#### Ubuntu 19.04 Disco Dingo

![](/data/attachment/album/202005/16/094331sghatqx2v3luul2a.jpg)

#### Ubuntu 19.10 Eoan Ermine

![](/data/attachment/album/202005/16/094404chc0hcekq5mzqqwa.jpg)

#### Ubuntu 20.04 LTS Focal Fossa

![](/data/attachment/album/202005/16/094517y0zu1i904dpj2u2o.jpg)

看了这些壁纸，你喜欢那张呢？


Ubuntu Studio 将用 KDE Plasma 桌面环境替换 Xfce

Summary: Ubuntu Studio 是一个流行的 Ubuntu 官方变种，它是为从事音频制作、视频、图形、摄影和书籍出版的创意内容创建者量身定制的。它提供了许多多媒体内容创建应用，开箱即用，体验极佳。

KDE的标题栏还是太丑，太宽了

[Ubuntu Studio](https://ubuntustudio.org/) 是一个流行的 [Ubuntu 官方变种](https://itsfoss.com/which-ubuntu-install/)，它是为从事音频制作、视频、图形、摄影和书籍出版的创意内容创建者量身定制的。它提供了许多多媒体内容创建应用，开箱即用，体验极佳。

在最近的 20.04 LTS 版本发布之后，Ubuntu Studio 团队在其[官方公告](https://ubuntustudio.org/2020/04/ubuntu-studio-20-04-lts-released/)中强调了一些非常重要的内容。而且，也许不是每个人都注意到关键信息，即 Ubuntu Studio 的未来。

Ubuntu Studio 20.04 将是带有 [Xfce 桌面环境](https://xfce.org)的最后一个版本。将来的所有发行版都将改用 [KDE Plasma](https://kde.org/plasma-desktop)。

### 为什么 Ubuntu Studio 放弃 XFCE？

![](/data/attachment/album/202005/16/113713pl190wbu8788rq9q.jpg)

据他们的澄清，Ubuntu Studio 并不专注于任何特定的外观/感受，而是旨在提供最佳的用户体验。同时，KDE 被证明是一个更好的选择。

>
> 事实证明，Plasma 为图形艺术家和摄影师提供了更好的工具，例如在 Gwenview、Krita 甚至文件管理器 Dolphin 中都可以看出。此外，它对 Wacom 平板的支持比其他任何桌面环境都更好。
>
>
> 它已经变得如此之好，以至于现在大部分 Ubuntu Studio 团队成员都在使用通过 Ubuntu Studio 安装程序添加了 Ubuntu Studio 的 Kubuntu 作为日常工作使用。既然我们中的这么多人都在使用 Plasma，因此在我们的下一个版本中过渡到 Plasma 似乎是个好时机。
>
>
>

当然，每一个桌面环境都是针对不同的用户量身定制的。在此，他们认为 KDE Plasma 是最适合取代 XFCE 的桌面环境，可以为所有用户提供更好的用户体验。

尽管我不确定用户对此会有何反应，因为每个用户都有不同的偏好。如果现有用户对 KDE 没有问题，那就没什么大问题。

值得注意的是，Ubuntu Studio 还提到了为什么 KDE 可能是它们的更好选择：

>
> 在没有 Akonadi 的情况下，Plasma 桌面环境的资源使用与 Xfce 一样轻量级，甚至更轻。Fedora Jam 和 KXStudio 等其他以音频为重点的 Linux 发行版在历史上一直使用 KDE Plasma 桌面环境，并且在音频方面做得很好。
>
>
>

此外，他们还强调了 [Jason Evangelho 在福布斯杂志上的一篇文章](https://www.forbes.com/sites/jasonevangelho/2019/10/23/bold-prediction-kde-will-steal-the-lightweight-linux-desktop-crown-in-2020)，其中一些基准测试表明 KDE 几乎与 Xfce 一样轻量级。尽管这是一个好的迹象，我们仍然需要等待用户试驾 KDE 驱动的 Ubuntu Studio。只有这样，我们才能观察到 Ubuntu Studio 放弃 XFCE 桌面环境的决定是否正确。

### 更改后，Ubuntu Studio 用户将发生什么变化？

在带有 KDE 的 Ubuntu Studio 20.10 及更高版本上的整体工作流程可能会受到影响（或改善）。

但是，升级过程（从 20.04 到 20.10）会导致系统损坏。因此，全新安装 Ubuntu Studio 20.10 或更高版本将是唯一的方法。

他们还提到，他们还会不断评估与预安装的应用是否存在重复。所以，相信在未来的日子里，更多的细节也会随之而来。

Ubuntu Studio 是最近一段时间内第二个改变了主桌面环境的发行版。先前，[Lubuntu](https://itsfoss.com/lubuntu-20-04-review/) 从 LXDE 切换到 LXQt。

你如何看待这种变化？欢迎在下面的评论中分享你的想法。

---

via: <https://itsfoss.com/ubuntu-studio-opts-for-kde/>

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

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


新闻速读 > 微软总裁布拉德·史密斯坦承微软曾错误地站在 Linux 的历史对立面

Summary: 更多：上游 Linux 开发者反对 -O3 级别的内核优化；Chrome 将从 8 月起屏蔽占用过多资源的广告

![](/data/attachment/album/202005/16/132626p25grgtjgt01t424.jpg)

#### 微软总裁布拉德·史密斯坦承微软曾错误地站在 Linux 的历史对立面

近日，微软总裁布拉德·史密斯在麻省理工学院计算机科学与人工智能实验室主持的一场谈话期间承认：“我个人的观点是，当开源社区在本世纪初开始爆发时，微软曾错误地站在了历史的对立面”。事实上，微软的 Azure 云计算平台，多年来一直支持各种 Linux 发行版，甚至在 Azure Sphere 上使用了基于 Linux 的操作系统来构建物联网应用程序的开发平台。2016 年的 Build 开发者大会上，微软郑重宣布了对 Linux 的喜爱。此外在 Windows 10 操作系统上，软件巨头也提供了“Windows Linux 子系统”（简称 WSL）近年来。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/979813.htm)

>
> 硬核老王点评：微软这样大的一个公司，自从纳德拉上台之后能够迅速转向拥抱开源，非常值得钦佩。
>
>
>

#### 上游 Linux 开发者反对 -O3 级别的内核优化

WireGuard 作者 Jason A. Donenfeld 上周建议在使用新发布的 GCC 10 编译器或更高的版本时，将内核的默认编译优化级别由 -O2 设置为 -O3。Jason 解释道，GCC 10 对 -O2 进行了改进，以便在使用 -flto 时缩短编译时间，不过这似乎是以牺牲性能为代价来实现的。而现在的 -O3 优化不存在和 10 年前同样的错误，所以当 gcc >= 10 时，他提交的补丁会将 Linux 内核的编译优化默认设置为 -O3 级别。不过将内核默认编译优化级别设置为 -O3 的提案遭到了广泛的反对，因为这不一定会让内核变得更快，反而有可能会引入因优化而导致出现的特殊特性，甚至会产生让代码变得更慢的地方。Linus Torvalds 也进行了表态，他不认为这是一个明智的想法，尤其是 GCC -O3 级别的优化有时会导致出现问题。GCC 开发者 Richard Biener 也写道，他不建议在内核中使用 -O3 级别的优化。

来源：[开源中国](https://www.oschina.net/news/115696/linux-upstream-against-o3-optimize-kernal)

>
> 硬核老王点评：过犹不及，对于内核这样的复杂工程，极致优化不是最好的选择。
>
>
>

#### Chrome 将从 8 月起屏蔽占用过多资源的广告

Google 对可能遭到屏蔽的广告设定了三个阈值：消耗的网络浏览 4MB，在任意 30 秒内占用了 15 秒的 CPU 时间，总的 CPU 占用达到了 60 秒。Google 将首先在未来几个月内进行试验，然后在 8 月底释出的新 Chrome 稳定版中正式包含该功能。

来源：[solidot](https://www.solidot.org/story?sid=64377)

>
> 硬核老王点评：很多广告确实太过分了，值得期待。
>
>
>

#### Reddit 前 500 子论坛中有 92 个被 5 个人控制

Reddit 是美国最受欢迎的论坛类社交网站，根据官方博客去年底在年度总结中提供的数据，它的月活用户超过了 4.3 亿。在 Reddit 上，用户可以自由的创建子站。许多热门的子站都由相同的人管理，Reddit 用户的统计发现，在前 500 子站中，有 92 个都是由相同的五名版主管理。

来源：[solidot](https://www.solidot.org/story?sid=64367)

>
> 硬核老王点评：“专业”人士总是能控制更多资源。
>
>
>

#### Windows 初步加入对 DNS-over-HTTPS (DoH) 的支持

如果在 Windows 10 中启用了 DoH，那么操作系统将会通过 DoH 而不是传统的 DNS 去解析域名。浏览器如 Firefox 和 Chrome 已经加入了对 DoH 的支持，但受到了部分工程师和系统管理员的批评，认为会给企业系统管理员带来麻烦，是将操作系统级的控制权占为己有。通过开发 DoH 客户端，微软恢复了在操作系统层次的控制。

来源：[solidot](https://www.solidot.org/story?sid=64364)

>
> 硬核老王点评：我觉得倒是好事，不能说是恢复了在操作系统层面的控制。
>
>
>

#### Gartner 公司称 COVID-19 冲击企业钱包，IT 支出将下降 8％

Gartner 本周表示，受 COVID-19 大流行病的影响，预计 2020 年全球 IT 支出总额将达到 3.4 万亿美元，比 2019 年下降 8%。Gartner 在 1 月份曾预测 2020 年全球 IT 支出总额将达到 3.9 万亿美元，比 2019 年增长 3.4%。

来源：[networkworld](https://www.networkworld.com/article/3544008/gartner-it-spending-will-drop-8-as-covid-19-hits-enterprise-wallets.html)

>
> 硬核老王点评：由预期增长到降低，新冠病毒带来的影响不可忽视，而且这一影响可能还要很久。
>
>
>


使用 FreeBSD 作为桌面操作系统

Summary: FuryBSD 的实时桌面环境能让你在实际使用之前先尝试。

FuryBSD 的实时桌面环境能让你在实际使用之前先尝试。

>
> FuryBSD 的实时桌面环境能让你在实际使用之前先尝试。
>
>
>

![FuryBSD Post-Install XFCE Desktop](/data/attachment/album/202005/17/110252itt3prgiiesebr54.png "FuryBSD Post-Install XFCE Desktop")

[FreeBSD](https://www.freebsd.org) 是一个很棒的操作系统，但是从设计上讲，它并没有自带桌面环境。如果不从 FreeBSD 的 [ports 和软件包集](https://www.freebsd.org/ports/)安装其他软件，那么 FreeBSD 仅能体验命令行。下面的截图显示了在安装过程中选择了每个“可选系统组件”后，登录 FreeBSD 12.1 的样子。

![FreeBSD](/data/attachment/album/202005/17/110300jgqbbmmbbvlb733l.png "FreeBSD")

FreeBSD 可以用各种桌面环境中的任何一种来变成桌面操作系统，但是这需要时间、精力和[遵循大量书面说明](https://www.freebsdfoundation.org/freebsd/how-to-guides/installing-a-desktop-environment-on-freebsd/)。使用使用 desktop-installer 包（为用户提供基于文本的菜单并帮助自动执行大部分过程）仍然非常耗时。这两种方法的最大问题是，用户可能在花了很多时间进行设置之后，可能会发现他们的硬件系统与 FreeBSD 不完全兼容。

[FuryBSD](https://www.furybsd.org) 通过提供实时桌面镜像来解决此问题，用户可以在安装之前对其进行评估。目前，FuryBSD 提供 Xfce 镜像和 KDE 镜像。每个镜像都提供了一个已预安装桌面环境的 FreeBSD。如果用户试用该镜像并发现其硬件工作正常，那么他们可以安装 FuryBSD，并拥有一个由 FreeBSD 驱动的即用桌面操作系统。在本文中，我会使用 Xfce 镜像，但 KDE 镜像的工作原理完全一样。

对于安装过 Linux 发行版、BSD 或任何其他类 Unix 的开源操作系统的人，FuryBSD 的上手过程应该很熟悉。从 FuryBSD 网站下载 ISO，将它复制到闪存盘，然后从闪存盘启动计算机。如果从闪存盘引导失败，请确保“安全引导”已禁用。

![FuryBSD Live XFCE Desktop](/data/attachment/album/202005/17/110327kz9tc7q79itt76kn.png "FuryBSD Live XFCE Desktop")

从闪存盘启动后，桌面环境将自动加载。除了“家”、“文件系统”和“回收站”图标外，实时桌面还有用于配置 Xorg 的工具、入门指南、FuryBSD 安装程序和系统信息程序的图标。除了这些额外功能以及一些自定义的 Xfce 设置和壁纸外，桌面环境除了基本的 Xfce 应用和 Firefox 之外并没有其他功能。

![FuryBSD Xorg Tool](/data/attachment/album/202005/17/110342c7w8aeawwmez9cje.png "FuryBSD Xorg Tool")

此时仅加载基本的图形驱动，但足以检查 FuryBSD 是否支持系统的有线和无线网络接口。如果网络接口没有一个能自动工作，那么 `Getting Started.txt` 文件包含有关尝试配置网络接口和其他配置任务的说明。如果至少有一个网络接口有效，那么可以使用 Configure Xorg 应用安装 Intel、NVidia 或 VirtualBox 图形驱动。它将下载并安装驱动，并且需要重新启动 Xorg。如果系统未自动重新登录到实时镜像用户，那么密码为 `furybsd`（你可以使用它来登录）。配置后，图形驱动将转移到已安装的系统中。

![FuryBSD Installer - ZFS Configuration](/data/attachment/album/202005/17/110404i1szsya19a7a58au.png "FuryBSD Installer - ZFS Configuration")

如果一切都可以在实时环境中正常运行，那么 FuryBSD 安装程序可以将 FuryBSD 配置并安装到计算机上。该安装程序在终端中运行，但提供与大多数其他 BSD 和 Linux 安装程序相同的选项。系统将要求用户设置系统的主机名、配置 ZFS 存储、设置 root 密码，添加至少一个非 root 用户以及配置时间和日期。完成后，系统可以引导到预装有 Xfce （或 KDE）的 FreeBSD 中。FuryBSD 完成了所有困难的工作，甚至还花了很多精力使桌面看起来更漂亮。

如上所述，桌面环境没有大量预装软件，因此几乎肯定要安装额外的软件包。最快的方法是在终端中使用 `pkg` 命令。该命令的行为很像 `dnf` 和 `apt`，因此使用过其中之一的来自 Linux 发行版的用户在查找和安装软件包时应该感到很熟悉。FreeBSD 的软件包集合非常多，因此大多数知名的开源软件包都可用。

如果用户在没有太多 FreeBSD 经验的情况下尝试 FuryBSD，应查阅 [FreeBSD 手册](https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/)，以了解有关如何以 FreeBSD 的方式操作。有任何 Linux 发行版或其他 BSD 使用经验的用户应该能弄清很多事情，但是手册可以帮助你弄清一些差异。进一步了解 FreeBSD 的一个很好的资源是 Michael W. Lucas 的 《[Absolute FreeBSD，第三版](https://nostarch.com/absfreebsd3)》。

---

via: <https://opensource.com/article/20/5/furybsd-linux>

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


新闻速读 > 开源让软件更加安全了吗？

Summary: 更多：又一次抛弃 Windows，德国慕尼黑再次拥抱开源；欧洲多台超级计算机中毒，沦为挖矿肉鸡

![](/data/attachment/album/202005/17/130827j8e6fda7vkufoz6e.jpg)

#### 开源让软件更加安全了吗？

近日，软件和芯片设计公司 Synopsys 发布《2020年开源安全和风险分析报告》，指出不安全的开源软件已无处不在。一方面，99%的审计代码库中至少包含一个开源组件，另一方面，经过审核的代码库中有75％包含具有已知安全漏洞的开源组件，老化和废弃的开源组件也无处不在。3 月，安全和许可证合规性管理解决方案提供商 WhiteSource 同样发布了一份《2019年开源组件安全漏洞现状报告》。统计显示，2019年公开的开源软件漏洞数量激增至6000多个，增幅达近50%，原因包含开源软件应用的扩大。开源软件漏洞数量的上升可以归因于开放源组件的广泛采用，过去几年开源社区的大量增长，以及媒体对最近一些数据泄露事件的报道，（使得人们）对开放源代码安全的关注提高。

来源：[开源中国](https://my.oschina.net/editorial-story/blog/4280022)

>
> 硬核老王点评：安全与否和广泛性有关。
>
>
>

#### 又一次抛弃 Windows，德国慕尼黑再次拥抱开源

最近当选的慕尼黑执政联盟在一项联合协议中表示，在技术和经济可行的情况下，该市将重点放在开放标准和自由开源软件上。联盟将执政到 2026 年，原则是只要不涉及任何机密或个人数据，市政府相关软件都将开源，微软 Windows 与 Office 等软件再次被抛弃。这一决定受到不少批评，毕竟此前慕尼黑已经尝试过从微软系软件切换到 Linux，再从 Linux 切换到 Win 10。这一过程中的经济成本巨大，花费时间也比较长。

来源：[开源中国](https://www.oschina.net/news/115715/munich-shift-back-to-opensource-again)

>
> 硬核老王点评：反复带来的是更多的损失。
>
>
>

#### 欧洲多台超级计算机中毒，沦为挖矿肉鸡

据悉周一英国爱丁堡大学首先公布了 ARCHER 超级计算机遭到攻击的报告。同一天德国超级计算机管理组织 bwHPC 宣布因为类似的安全问题，旗下 5 台超级计算机/高性能计算集群现起关闭。周四更多被感染的超级计算机浮出水面。目前尚不清楚究竟是什么人或组织实施了这些攻击，但据安全公司分析，黑客是通过窃取 SSH 凭证获得了超级计算机的访问权限，而大学内部人士因为有权访问这些超级计算机而最有嫌疑。实际上被劫持的 SSH 登录名分别属于加拿大、中国和波兰的大学。所有恶意软件的文件名和网络指示器都证明它们的源头可能是同一个地方。

来源：[快科技](https://www.cnbeta.com/articles/tech/980035.htm)

>
> 硬核老王点评：其实就是 SSH 凭证管理不善，没有更高级别的安全管理措施，超级计算机也并不比普通服务器更安全。
>
>
>

#### NVIDIA 与开源社区合作，将 GPU 加速带入 Spark 3.0

NVIDIA 方面宣布与开源社区达成合作，为 Apache Spark 3.0 带来端到端的 GPU 加速。按照计划，随着 Spark 3.0 于春季晚些时候发布，数据科学家和机器学习工程师将首次能够把革命性的 GPU 加速应用于普遍使用 SQL 数据库操作进行的 ETL（提取、转换和加载）数据处理工作负载中。

来源：[开源中国](https://www.oschina.net/news/115712/nvidia-accelerates-apache-spark)

#### 192 个违规收集个人信息的 App 被责令改正，包括“猎豹清理大师”

今年第一季度，全国公安机关网安部门依法查处违法违规收集公民个人信息 App 服务单位 386 个，其中，97 个 App 被予以行政处罚，192 个 App 被依法责令改正违法行为，51 个 App 被下架、停运。十大案例为： 猎豹清理大师、印象笔记、好孕帮、不背单词、哈弗智家、完美校园、天然工坊、随手借、每日瑜伽、Paintly。

来源：[人民公安报](https://www.cnbeta.com/articles/tech/979903.htm)

>
> 硬核老王点评： 这些你安装几个？
>
>
>

#### 《Half-Life：Alyx》更新支持 Linux、Vulkan 和关卡编辑

在今日公布的更新中，Valve 为《Alyx》添加了许多新功能，比如原生支持 Linux（不再需要 Proton）、Vulkan 图形 API、且提供了关卡编辑工具。

来源：[cnBeta.COM](https://hot.cnbeta.com/articles/game/979889.htm)

#### 勒索软件攻击者向纽约律所勒索 4200 万美元

纽约律所 Grubman Shire Meiselas & Sacks (GSMS) 上周遭到了勒索软件 REvil (Sodinokibi) 的攻击，在加密计算机系统中的文件前勒索软件先窃取了其内部文件。攻击者 5 月 7 日在暗网发布信息，公布了一些窃取到的文件截图，给律所一周时间协商和支付赎金。14 日是截止日期，REvil 背后的运营者发布了第二则信息，称律所只愿意支付 36.5 万美元，而他们的要求是 2100万美元，因此现在他们把赎金增加了一倍至 4200 万美元。作为惩罚，REvil 黑客发布了 2.4 GB 大小的文档，其中包含了 Lady Gaga 的法律文书，大部分是演出合同。

来源：[solidot](https://www.solidot.org/story?sid=64384)

>
> 硬核老王点评：勒索者恼羞成怒。
>
>
>


9 个用于前端 Web 开发的开源 CSS 框架

Summary: 探索开源 CSS 框架，找到适合你的项目的框架。

探索开源 CSS 框架，找到适合你的项目的框架。

>
> 探索开源 CSS 框架，找到适合你的项目的框架。
>
>
>

![](/data/attachment/album/202005/18/094922of81rqfiei8x78xi.jpg)

当大多数人想到 Web 开发时，通常会想到 HTML 或 JavaScript。他们通常会忘记对网站的欣赏能力有更大影响的技术：<ruby> <a href="https://en.wikipedia.org/wiki/Cascading_Style_Sheets">  级联样式表 </a> <rt>  cascading style sheets </rt></ruby>（简称 CSS）。据维基百科的说法，CSS 既是网页中最重要的部分，也是最常被遗忘的部分，尽管它是万维网的三大基石技术之一。

本文将探讨九种流行的、强大的、开源的框架，是这些框架让构建漂亮的网站前端的 CSS 开发变得简单明了。

| 名称 | 介绍 | 许可证 |
| --- | --- | --- |
| [Bootstrap](https://github.com/twbs/bootstrap) | 最流行的 CSS 框架，来自 Twitter | MIT |
| [PatternFly](https://github.com/patternfly/patternfly) | 开源框架，来自 Red Hat | MIT |
| [MDC Web](https://github.com/material-components/material-components-web) | Material Design 组件开源框架，来自 Google | MIT |
| [Pure](https://github.com/pure-css/pure) | 开源框架，来自 Yahoo | BSD |
| [Foundation](https://github.com/foundation/foundation-sites) | 前端框架，来自 Zurb 基金会 | MIT |
| [Bulma](https://github.com/jgthms/bulma) | 现代 CSS 框架，基于 Flexbox | MIT |
| [Skeleton](https://github.com/dhg/Skeleton) | 轻量级 CSS 框架 | MIT |
| [Materialize](https://github.com/Dogfalo/materialize) | 基于 Material Design 的 CSS 框架 | MIT |
| [Bootflat](https://github.com/bootflat/bootflat.github.io) | 开源 Flat UI 工具，基于 Bootstrap 3.3.0 | MIT |

### Bootstrap

[Bootstrap](https://en.wikipedia.org/wiki/Cascading_Style_Sheets) 无疑是最流行的 CSS 框架，它是所有前端 Web 设计的开端。Bootstrap 由 Twitter 开发，提供了可用性、功能性和可扩展性。

![Bootstrap homepage](/data/attachment/album/202005/18/094946us2a8ig2qw8g8d9a.jpg "Bootstrap homepage")

Bootstrap 还提供了大量的[例子](https://getbootstrap.com/docs/4.4/examples/)来帮助你入门。

![Bootstrap examples](/data/attachment/album/202005/18/094948j0kff84cccklpb0y.jpg "Bootstrap examples")

使用 Bootstrap，你可以将不同的组件和布局拼接在一起，创造出有趣的页面设计。它还提供了大量详细的文档。

![Bootstrap documentation](/data/attachment/album/202005/18/094949ww3aznwwgpl5w4qw.jpg "Bootstrap documentation")

Bootstrap 的 [GitHub](https://github.com/twbs/bootstrap) 仓库有超过 19000 个提交和 1100 个贡献者。它基于 MIT 许可证，所以（和这个列表中的所有框架一样）你也可以加入并贡献。

![Bootstrap GitHub](/data/attachment/album/202005/18/094950wg03bc5gi4vccz8o.jpg "Bootstrap GitHub")

### PatternFly

[PatternFly](https://www.patternfly.org) 是由 Red Hat 开发的一个开源的（MIT 许可证）CSS 框架。PatternFly 采取了与 Bootstrap 不同的方法：Bootstrap 是为任何对创建一个漂亮网站感兴趣的人而设计的，而 PatternFly 主要针对企业级应用开发者，它提供的组件，如条形图、图表和导航，对于创建强大的、指标驱动的仪表盘非常有吸引力。事实上，Red Hat 在其产品（如 OpenShift）的设计中也使用了这个 CSS 框架。

![PatternFly homepage](/data/attachment/album/202005/18/094951jq9s9oaa9z92znla.jpg "PatternFly homepage")

除了静态 HTML 之外，PatternFly 还支持 ReactJS 框架，ReactJS 是 Facebook 开发的一个流行的 JavaScript 框架。

![PatternFly ReactJS support](/data/attachment/album/202005/18/094952mtgcsvcmm5aa5pap.jpg "PatternFly ReactJS support")

PatternFly 有许多高级组件，如条形图、图表、[模态窗口](https://en.wikipedia.org/wiki/Modal_window)和布局等，适用于企业级应用。

![PatternFly chart component](/data/attachment/album/202005/18/094952v4i3hah4oz3inhaa.jpg "PatternFly chart component")

PatternFly 的 [GitHub](https://github.com/patternfly/patternfly) 页面列出了超过 1050 个提交和 44 个贡献者。PatternFly 得到了很多人的关注，欢迎大家踊跃贡献。

![PatternFly GitHub](/data/attachment/album/202005/18/094953z7bvlv4g89eeq8kl.jpg "PatternFly GitHub")

### MDC Web

凭借其大获成功的安卓平台，谷歌以一个名为 [Material Design](https://material.io) 的概念制定了自己的标准设计准则。Material Design 标准旨在体现在所有谷歌的产品中，这些标准也可以面向大众，并且在 MIT 许可证下开源。

![Material Design homepage](/data/attachment/album/202005/18/094953fyz0yngo1mt0zx01.jpg "Material Design homepage")

Material Design 有许多“用于创建用户界面的交互式构建块”的[组件](https://material.io/components/)。这些按钮、卡片、背景等可用于创建网站或移动应用程序的任何类型的用户界面。

![Material Components webpage](/data/attachment/album/202005/18/094954olni3lala020qiz0.jpg "Material Components webpage")

维护人员为不同的平台提供了详尽的文档。

![Material Design documentation](/data/attachment/album/202005/18/094955k8j4dvugarms2z8a.jpg "Material Design documentation")

还有分步教程，其中包含用于实现不同目标的练习。

![Material Design tutorial](/data/attachment/album/202005/18/094956n2x774bcggznb77x.jpg "Material Design tutorial")

Material 组件的 GitHub 页面承载了面向不同平台的存储库，包括用于网站开发的 [Material Web 组件（MDC Web）](https://github.com/material-components/material-components-web)。MDC Web 有超过 5700 个提交和 349 个贡献者。

![MDC Web GitHub](/data/attachment/album/202005/18/095001fi2salug8qql2ka8.jpg "MDC Web GitHub")

### Pure

Bootstrap、Patternfly 和 MDC Web 都是非常强大的 CSS 框架，但是它们可能相当的笨重和复杂。如果你想要一个轻量级的 CSS 框架，它更接近于自己编写 CSS，但又能帮助你建立一个漂亮的网页，可以试试 [Pure.css](https://purecss.io)。Pure 是一个轻量级的 CSS 框架，它的体积很小。它是由 Yahoo 开发的，在 BSD 许可证下开源。

![Pure.css homepage](/data/attachment/album/202005/18/095003wasgsqmafqa9fnc5.jpg "Pure.css homepage")

尽管体积小，但 Pure 提供了建立一个漂亮网页的很多必要的组件。

![Pure.css components](/data/attachment/album/202005/18/095005h0kttxtguz3wgxk3.jpg "Pure.css components")

Pure 的 [GitHub](https://github.com/pure-css/pure) 页面显示它有超过 565 个提交和 59 个贡献者。

![Pure.css GitHub](/data/attachment/album/202005/18/095008ew9i9a9zqpjhyqaf.jpg "Pure.css GitHub")

### Foundation

[Foundation](https://get.foundation) 号称是世界上最先进的响应式前端框架。它提供了先进的功能和教程，用于构建专业网站。

![Foundation homepage](/data/attachment/album/202005/18/095011km82sdxsrbcskc33.jpg "Foundation homepage")

该框架被许多公司、组织甚至政客[使用](https://zurb.com/responsive)，并且有大量的文档可用。

![Foundation documentation](/data/attachment/album/202005/18/095013kabduevhvmbeq5ed.jpg "Foundation documentation")

Foundation 的 [GitHub](https://github.com/foundation/foundation-sites) 页面显示有近 17000 个提交和 1000 个贡献者。和这个列表中的大多数其他框架一样，它也是在 MIT 许可证下提供的。

![Foundation GitHub](/data/attachment/album/202005/18/095018q7yakuiikllvz1vq.jpg "Foundation GitHub")

### Bulma

[Bulma](https://bulma.io) 是一个基于 Flexbox 的开源框架，在 MIT 许可证下提供。Bulma 是一个相当轻量级的框架，因为它只需要一个 CSS 文件。

![Bulma homepage](/data/attachment/album/202005/18/095021xgvrnwwfvobbivz7.jpg "Bulma homepage")

Bulma 有简洁明快的文档，让你可以很容易地选择你想要探索的主题。它也有很多网页组件，你可以直接拿起来在设计中使用。

![Bulma documentation](/data/attachment/album/202005/18/095022ib1ujq5xuxhtxujj.jpg "Bulma documentation")

Bulma 的 [GitHub](https://github.com/jgthms/bulma) 页面列出了 1400 多个提交和 300 多个贡献者。

![Bulma GitHub](/data/attachment/album/202005/18/095025ycn2cn888snn2x48.jpg "Bulma GitHub")

### Skeleton

如果连 Pure 都觉得太重了，那么还有一个叫 [Skeleton](http://getskeleton.com) 的更轻量级框架。Skeleton 库只有 400 行左右的长度，而且这个框架只提供了开始你的 CSS 框架之旅的基本组件。

![Skeleton homepage](/data/attachment/album/202005/18/095026ceyylpuyzfvuelr7.jpg "Skeleton homepage")

尽管它很简单，但 Skeleton 提供了详细的文档，可以帮助你马上上手。

![Skeleton documentation](/data/attachment/album/202005/18/095029j8q20nqri8kkx8tr.jpg "Skeleton documentation")

Skeleton 的 [GitHub](https://github.com/dhg/Skeleton) 列出了 167 个提交和 22 个贡献者。然而，它不是很活跃，它的最后一次更新是在 2014 年，所以在使用之前可能需要一些维护。由于它是在 MIT 许可证下发布的，你可以自行维护。

![Skeleton GitHub](/data/attachment/album/202005/18/095032l4o3bwc39bz3uuga.jpg "Skeleton GitHub")

### Materialize

[Materialize](https://materializecss.com) 是一个基于 Google 的 Material Design 的响应式前端框架，带有由 Materialize 的贡献者开发的附加主题和组件。

![Materialize homepage](/data/attachment/album/202005/18/095033kha6kis3rsraqwct.jpg "Materialize homepage")

Materialize 的文档页面非常全面，而且相当容易理解。它的组件页面包括按钮、卡片、导航等等。

![Materialize documentation](/data/attachment/album/202005/18/095035or00l5bf65jbksrr.jpg "Materialize documentation")

Materialize 是 MIT 许可证下的开源项目，它的 [GitHub](https://github.com/Dogfalo/materialize) 列出了超过 3800 个提交和 250 个贡献者。

![Materialize GitHub](/data/attachment/album/202005/18/095037fqb2ebzu2kwzz9yk.jpg "Materialize GitHub")

### Bootflat

[Bootflat](http://bootflat.github.io) 是由 Twitter 的 Bootstrap 衍生出来的一个开源 CSS 框架。与 Bootstrap 相比， Bootflat 更简单，框架组件更轻量级。

![Bootflat homepage](/data/attachment/album/202005/18/095039c813elddde867hk9.jpg "Bootflat homepage")

Bootflat 的[文档](http://bootflat.github.io/documentation.html)几乎像是受到了宜家的启发 —— 它显示的是每个组件的图片，没有太多的文字。

![Bootflat docs](/data/attachment/album/202005/18/095041x437z9uh7uo5252q.jpg "Bootflat docs")

Bootflat 是在 MIT 许可证下提供的，其 [GitHub](https://github.com/bootflat/bootflat.github.io) 页面包括 159 个提交和 8 个贡献者。

![Bootflat GitHub](/data/attachment/album/202005/18/095044rdcc0353bfyhsa6h.jpg "Bootflat GitHub")

### 你应该选择哪个 CSS 框架？

对于开源的 CSS 框架，你有很多选择，这取决于你想要的工具功能有多丰富或简单。就像所有的技术决定一样，没有一个正确的答案，只有在给定的时间和项目中才有正确的选择。

尝试一下其中的一些，看看要在下一个项目中使用哪个。另外，我有没有错过任何有趣的开源 CSS 框架？请在下面的评论中分享你的反馈和想法。

---

via: <https://opensource.com/article/20/4/open-source-css-frameworks>

作者：[Bryant Son](https://opensource.com/users/brson) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


我的 Linux 故事：从 8 位发烧友到 Unix 系统管理员

Summary: 我是如何从一个电脑爱好者成为职业系统管理员和 Linux 粉丝的。

我是如何从一个电脑爱好者成为职业系统管理员和 Linux 粉丝的。

>
> 我是如何从一个电脑爱好者成为职业系统管理员和 Linux 粉丝的。
>
>
>

![](/data/attachment/album/202005/18/132731pnnzy7t5tz7hvc6z.jpg)

故事得从 1980 年中期我父母给家里购买[苹果 ][c](https://en.wikipedia.org/wiki/Apple_IIc) 开始。尽管很喜欢打游戏，但我还是很快被实用又好玩的 BASIC 编程迷住了。那个年代的人们还是把电脑当作小一点的打字机对待，所以拥有“高级电脑技能”的人可以轻松使用他们的魔法。

以用 BASIC 和点阵打印机自动生成惩罚作业来举个例子。被罚写两百遍道歉时，我问老师我可不可以用打字代替手写。经过同意后，我写了 5 行 BASIC 语句来自动生成作业。另外一个小技巧是用非可视化文本编辑器，比如用 AppleWorks 微调字体、行距和边距，把学期论文“拉长”到要求的篇幅。

对电脑的痴迷很快让我得到了带有内存驱动卡和 x86 协处理器的苹果 ][gs。那时候，调制解调器和 BBS 刚开始火起来，有了这样的双处理器系统后，我就可以安装各种琳琅满目的软件。但是由于调制解调器 2400bps 的速度限制，对我每天都要下载几 KB 的有趣东西形成了阻碍。我对苹果痴迷一段时间，不久之后就换了。

### 探索 Unix

我的本科专业是计算机信息系统，研究生专业是计算机科学。本科教育主要使用个人电脑，很少涉及大型分时系统。研究生的时候才开始真正有意思起来，拨号进入带有互联网连接的 Unix 简直打开了新世界的大门。尽管我依然用着我的双处理器 ][gs 来使用调制解调器还有写写论文，不过 Unix 系统真正吸引了我的注意力，因为它可以访问通用的 Telnet 游戏、文件传输协议（FTP）、在线邮箱和进行 C 语言编程。当时 Gopher 非常受欢迎，特别是在我们这群终端用户当中。

被分到学院计算机部门是我研究生命运的转折点，这个部门主管学校的计算机服务。学生们可以使用 X Window 终端来登录基于 [Ultrix](https://en.wikipedia.org/wiki/Ultrix) 的系统。大部分都是灰度的黑白界面，彩色处理在当时非常占用 CPU，也很影响系统性能。也有一些彩色系统还不错，但是这些机器都很慢。

我很喜欢那个时候，我有系统管理员权限而且工作是维护系统和网络。我有一些很好的导师，他们对我选择从事系统管理员而不是程序员起了关键作用（尽管我至今仍然热爱编程）。

### 从 Unix 到 Linux

稀缺是创造之母，当需要分享匮乏的学校电脑系统资源的时候，我们学生们变得富有创造力。需要用电脑的学生是 Ultrix 工作站承受量的三到五倍，所以寻找资源往往是个难题（特别是要交付项目的时候）。在不需要图形化显示的时候，我们有一个 56k 的点对点协议的调制解调器池可供远程系统访问接入。但是找到一个有空余资源的机器并共享系统进行源码编译通常会导致进度缓慢。和大部分人一样，我发现晚上工作通常会有所帮助，但我还需要其它一些东西让我的项目迭代快一点。

后来学校的一个系统管理员建议我去看一个免费提供的 Unix 系统。那就是 Linux，它被装在 3.5 英寸的软盘里。多亏我们学校超快的 T1 线路，我很容易就搜索到新闻组和其他资源来学习如何下载它。它全是基于 32 位的英特尔 PC 机的，而我并没有这一类的设备。

幸运的是，我在学校的工作让我有机会接触到堆积如山的废旧电脑，所以命运的齿轮又开始旋转起来。

我找到了足够多的废旧 PC 组装了一个可靠的 80386 PC，带有足够内存（我确定不到 1GB），它有一个能用的显卡、一个细缆（同轴）以太网卡和一个硬盘。我所用的镜像是 Linux 内核 0.98，我不记得它是不是正式发行版的一部分了（可能是 SLS）。我所记得的是，它有一系列的软盘镜像，第一张软盘启动内核和一个最小安装程序，然后格式化硬盘，接着要求插入每个后续的软盘来安装 GNU 核心实用程序。在核心实用程序装好并引导系统之后，你可以下载和安装其他的软件包镜像，比如编译器之类的。

这是我学术道路上巨大的福音。在没有运行 X Window 显示服务器的情况下，这台电脑性能比学校的 Ultrix 工作站强很多。学校允许我把这台机器连到校园网络，挂载学校的学生网络文件系统（NFS）共享，并且能直接访问互联网。因为我的研究生课程用 [GCC](https://en.wikipedia.org/wiki/GNU_Compiler_Collection)（还有 Perl 4）来完成大部分学生作业，所以我可以在本地进行开发工作。这使得我可以独享关键资源，从而使我能够更快速地迭代我的项目。

但是，这个方案不是完美的。硬件有时会有点不稳定（这可能就是它们被丢弃的原因），但我都能搞定。真正让我感受到的是 Linux 和 Ultrix 在操作系统和系统库层面的差异。我开始理解移植软件到其他操作系统的意义，我可以自由地在任何地方开发，但是我必须以 Ultrix 编译的二进制文件交付项目。在一个平台上完美运行的 C 语言代码可能在另一个平台出错。这非常令人沮丧，但是我可能本能的察觉到了早期 Linux 解引用空指针的方法。Linux 倾向于把它作为空操作处理，但是 Ultrix 会立即触发核心转储和段错误 [SIGSEGV](https://en.wikipedia.org/wiki/Segmentation_fault)。这是我第一次程序移植时的重大发现，正好在要交作业的几天之前。这同时对我研究 C++ 造成了一些麻烦，因为我粗心地同时使用了 `malloc()`/`free()` 和自动[构造函数和析构函数](https://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm)处理，让我的项目到处都是空指针炸弹。

研究生课程快结束的时候，我升级到了一台性能野兽工作站：一颗英特尔 486DX2 66MHz 芯片、一块 SCSI 硬盘、一块光驱和一个 1024x768 RGB 显示器，并且还用一个 16550 UART 串口卡完美地匹配了我的新 US Robotics V.Everything 牌调制解调器。它可以双启动 Windows 和 Linux 系统，但更重要的是显卡和 CPU 的速度让我的开发环境幸福感倍增。那台旧的 386 依然在学校服役，不过我我现在大部分繁重的功课和钻研都转移到了家里。

和 [Mike Harris](/article-11831-1.html) 关于 90 年代的 Linux 故事类似，我真的对当时流行的 CD 集合很着迷。我住的附近有家新开的 Micro Center 计算机商店，这个宝库充满了电脑配件、高级专业书籍和你能想到的各种 Linux（以及免费的 Unix）CD。我还记得 [Yggdrasil](https://en.wikipedia.org/wiki/Yggdrasil_Linux/GNU/X) 和 [Slackware](http://slackware.com) 是我最喜欢的发行版。真正让人难以置信的是 CD 存储空间的巨大容量 —— 650MB！使它成为获得软件的必不可少的载体。是的，你可以用 56k 的速度下载，但是真的很慢。更别提大部分人负担不起存档这么多供以后使用的闲置数据。

### 而到了今天

就是这些开启了我长达 25 年的系统管理员的职业生涯和开源软件的乐趣。Linux 一直是我事业和个人开发中的重要组成部分。最近我依旧醉心于 Linux（主要是 CentOS、RedHat 和 Ubuntu)，但也经常从 [FreeBSD](https://www.freebsd.org/) 和其他炫酷开源软件中得到乐趣。

Linux 让我来到了 Opensource.com，我希望在这里能回馈社区，为新一代电脑爱好者出一份力。

---

via: <https://opensource.com/article/20/4/linux-story>

作者：[James Farrell](https://opensource.com/users/jamesf) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Accelerator](https://github.com/Acceleratorrrr) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > 你以后从爸妈那继承的可能是游戏装备

Summary: 更多：OpenBSD 在新的微软 Surface Go 2 找到了宾至如归的感觉；Mozilla Firefox 84 将彻底删除 Flash

放新闻不就行了，后面硬核老王说点废话真影响阅读体验

嗯，有点短

老王，点评。非常好。我喜欢。

![](/data/attachment/album/202005/18/142723dkuukfzqxfk2gxjx.jpg)

#### 你以后从爸妈那继承的可能是游戏装备

此次民法典草案继承编对继承遗产的范围做了改变，“遗产是自然人死亡时遗留的个人合法财产”，将《继承法》中遗产范围，采取了概括的方式，只要是自然人合法取得的财产，都属于遗产，可以被继承，最大限度地保障私有财产继承的需要。网络财产、虚拟货币等都概括其中。

来源：[央视财经](https://www.cnbeta.com/articles/tech/980165.htm)

>
> 硬核老王点评：数字遗产可能是更重要的资产了，你的 QQ /微信和游戏账号会留给孩子吗？
>
>
>

#### OpenBSD 在新的微软 Surface Go 2 找到了宾至如归的感觉

开发人员解释说，几乎所有东西都能正常工作。虽然微软的 Surface Go 开箱即送的是 Windows 10，但有些人宁愿把操作系统换成自己觉得更有用的东西，不一定要成为他们的日常座驾，也是为了尝试一下。比如说开发者 Joshua Stein，他在之前在原来的型号上安装了 OpenBSD 操作系统后，又在 Surface Go 2 上进行了尝试。

来源：[softpedia](https://news.softpedia.com/news/openbsd-feels-almost-like-home-on-the-new-microsoft-surface-go-2-530011.shtml)

>
> 硬核老王点评：我觉得微软可以推出预装 OpenBSD 或 Linux 发行版的 Surface 平板了。
>
>
>

#### Mozilla Firefox 84 将彻底删除 Flash

Adobe 预计将在今年晚些时候彻底放弃对 Flash 的支持，而浏览器制造商们已经为这一历史性的时刻准备了好几年了。近日，Mozilla 宣布了最后一步预计将于何时进行，将在 2020 年 12 月推出的 Firefox 84 浏览器中完全放弃 Flash。这个版本的浏览器将无法再运行 Flash 内容。目前，Mozilla Firefox 自带的 Flash 支持默认是禁用的，但用户可以在必要时手动启用该插件。

来源：[softpedia](https://news.softpedia.com/news/mozilla-firefox-84-to-remove-flash-once-and-for-all-530010.shtml)

>
> 硬核老王点评：似乎终于要等到了这一天，臭名昭著的 Flash 的时代看来要过去了，但是那些依旧残留着 Flash 支持的网站怎么办呢？
>
>
>

#### 马斯克称数字货币更可靠，但只是说说而已

近日，《哈利·波特》作者 JK·罗琳在社交网络上表示，自己不相信比特币。马斯克表示了认同，但称相比之下，美国中央银行发行大量货币使得比特币这种网络货币看起来更稳定、可靠。马斯克还透露，自己仍然只持有 0.25 个比特币。两年多以前，马斯克曾自曝，自己持有 0.25 个比特币，还是一个朋友很多年前送给他的。不过，马斯克表示，他不知道把比特币放哪里了。

来源：[TechWeb](https://www.cnbeta.com/articles/tech/980399.htm)

>
> 硬核老王点评：说明马斯克根本不认可数字货币，你怎么看数字货币呢。
>
>
>

#### Linux 平板 PineTab 即将开启预订，承诺可运行多数 Linux 发行版

在经历多次延期之后，Pine64 今天正式宣布将会在本月晚些时候开启 PineTab Linux 平板电脑的预订工作。PineTab 是一款廉价的 Linux 平板电脑，搭载 UBports 的 Ubuntu Touch 系统，并且承诺在未来能够运行大多数 GNU/Linux 发行版。零售价格为 99.99 美元，此外磁性背光键盘零售价格为 19.99 美元。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/980285.htm)

>
> 硬核老王点评：结合前一条，或许在微软 Surface 平板上运行更好？不过这个 Linux 平板比较便宜。
>
>
>

#### 华为 Mate30 的美国零部件使用率降至 1%

对华为旗舰手机 Mate30 5G 的拆解分析显示，在受到美国制裁之后，华为手机的中国产零部件的使用率按金额计算已经从 25％ 左右大幅上升到 41.8％，而美国产零部件则从 11％ 左右降到了约 1.5％，主要是玻璃壳。

来源：[solidot](https://www.solidot.org/story?sid=64392)

>
> 硬核老王点评：如果只剩下玻璃壳，我觉得这个目标还是能完成的。
>
>
>


COPR 仓库中 4 个很酷的新项目（2020.05）

Summary: 本文介绍了 COPR 中一些有趣的新项目。

本文介绍了 COPR 中一些有趣的新项目。

![](/data/attachment/album/202005/18/174929vv14oo60jtqjh93n.jpg)

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

本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR，请参阅 [COPR 用户文档](https://docs.pagure.org/copr.copr/user_documentation.html#)。

### Ytop

[ytop](https://github.com/cjbassi/ytop) 是类似于 `htop` 的命令行系统监视器。它们之间的主要区别是，`ytop` 在显示进程及其 CPU 和内存使用率的顶部显示了系统的 CPU、内存和网络使用率随时间变化的图表。此外，`ytop` 还显示磁盘使用情况和计算机温度。最后，`ytop` 支持多种配色方案以及创建新配色的选项。

![](/data/attachment/album/202005/18/174930v2d72oszdvs8kt7w.png)

#### 安装说明

[该仓库](https://copr.fedorainfracloud.org/coprs/atim/ytop/)当前为 Fedora 30、31、32 和 Rawhide 以及 EPEL 7 提供了 `ytop`。要安装 `ytop`，请[带上 sudo](https://fedoramagazine.org/howto-use-sudo/) 使用以下命令：

```
sudo dnf copr enable atim/ytop
sudo dnf install ytop
```

### Ctop

[ctop](https://github.com/bcicen/ctop) 是另一个命令行系统监视器。但是，与 `htop` 和 `ytop` 不同，`ctop` 专注于显示容器的资源使用情况。`ctop` 同时显示计算机上运行的所有容器的 CPU、内存、网络和磁盘使用情况的概要，以及单个容器的更全面的信息，包括一段时间内资源使用情况的图表。当前，`ctop` 支持 Docker 和 runc 容器。

![](/data/attachment/album/202005/18/174931pnbiet5f50b5met1.png)

#### 安装说明

[该仓库](https://copr.fedorainfracloud.org/coprs/fuhrmann/ctop/)当前为 Fedora 31、32 和 Rawhide 以及 EPEL 7 还有其他发行版提供了安装包。要安装 `ctop`，请使用以下命令：

```
sudo dnf copr enable fuhrmann/ctop
sudo dnf install ctop
```

### Shortwave

[shortwave](https://github.com/ranfdev/shortwave) 是用于收听广播电台的程序。`shortwave` 使用广播电台的社区数据库 [www.radio-browser.info](http://www.radio-browser.info/gui/#!/)。在此数据库中，你可以发现或搜索广播电台，将它们添加到库中，然后收听。此外，`shortwave` 还提供有关当前播放歌曲的信息，并且还可以记录这些歌曲。

![](/data/attachment/album/202005/18/174931gqk8ezk9dki8f1yi.png)

#### 安装说明

[该仓库](https://copr.fedorainfracloud.org/coprs/atim/shortwave/) 当前为 Fedora 31、32 和 Rawhide 提供了 shortwave。要安装 `shortwave`，请使用以下命令：

```
sudo dnf copr enable atim/shortwave
sudo dnf install shortwave
```

### Setzer

[setzer](https://www.cvfosammmm.org/setzer/) 是 LaTeX 编辑器，它可以构建 pdf 文档并查看它们。它提供了各种类型文档（例如文章或幻灯片）的模板。此外，`setzer` 还有许多特殊符号、数学符号和希腊字母的按钮。

![](/data/attachment/album/202005/18/174932x5aekfuicaqphn5z.png)

#### 安装说明

[该仓库](https://copr.fedorainfracloud.org/coprs/lyessaadi/setzer/) 当前为 Fedora 30、31、32 和 Rawhide 提供了 `setzer`。要安装 `setzer`，请使用以下命令：

```
sudo dnf copr enable lyessaadi/setzer
sudo dnf install setzer
```

---

via: <https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-april-2020/>

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


完美生活：git rebase -i

Summary: 让大家觉得你一次就能写出完美的代码，并让你的补丁更容易审核和合并。

让大家觉得你一次就能写出完美的代码，并让你的补丁更容易审核和合并。

>
> 让大家觉得你一次就能写出完美的代码，并让你的补丁更容易审核和合并。
>
>
>

![](/data/attachment/album/202005/18/185911fvwztwyp4lvbzkw4.jpg)

软件开发是混乱的。有很多错误的转折、有需要修复的错别字、有需要修正的错误、有需要稍后纠正的临时和粗陋的代码，还有在以后的开发过程中发现一次又一次的问题。有了版本控制，在创建“完美”的最终产品（即准备提交给上游的补丁）的过程中，你会有一个记录着每一个错误转折和修正的原始记录。就像电影中的花絮一样，它们会让人有点尴尬，有时也会让人觉得好笑。

如果你使用版本控制来定期保存你的工作线索，然后当你准备提交审核的东西时，又可以隐藏所有这些私人草稿工作，并只提交一份单一的、完美的补丁，那不是很好吗？`git rebase -i`，是重写历史记录的完美方法，可以让大家觉得你一次就写出了完美的代码！

### git rebase 的作用是什么？

如果你不熟悉 Git 的复杂性，这里简单介绍一下。在幕后，Git 将项目的不同版本与唯一标识符关联起来，这个标识符由父节点的唯一标识符的哈希以及新版本与其父节点的差异组成。这样就形成了一棵修订树，每个签出项目的人都会得到自己的副本。不同的人可以把项目往不同的方向发展，每个方向都可能从不同的分支点开始。

![Master branch vs. private branch](/data/attachment/album/202005/18/185954e6u9qgo89fm1iqus.png "Master branch vs. private branch")

*左边是 origin 版本库中的主分支，右边是你个人副本中的私有分支。*

有两种方法可以将你的工作与原始版本库中的主分支整合起来：一种是使用合并：`git merge`，另一种是使用变基：`git rebase`。它们的工作方式非常不同。

当你使用 `git merge` 时，会在主分支（`master`）上创建一个新的提交，其中包括所有来自原始位置（`origin`）的修改和所有本地的修改。如果有任何冲突（例如，如果别人修改了你也在修改的文件），则将这些冲突标记出来，并且你有机会在将这个“合并提交”提交到本地版本库之前解决这些冲突。当你将更改推送回父版本库时，所有的本地工作都会以分支的形式出现在 Git 版本库的其他用户面前。

但是 `git rebase` 的工作方式不同。它会回滚你的提交，并从主分支（`master`）的顶端再次重放这些提交。这导致了两个主要的变化。首先，由于你的提交现在从一个不同的父节点分支出来，它们的哈希值会被重新计算，并且任何克隆了你的版本库的人都可能得到该版本库的一个残破副本。第二，你没有“合并提交”，所以在将更改重放到主分支上时会识别出任何合并冲突，因此，你需要在进行<ruby> 变基 <rt>  rebase </rt></ruby>之前先修复它们。现在，当你现在推送你的修改时，你的工作不会出现在分支上，并且看起来像是你是在主分支的最新的提交上写入了所有的修改。

![Merge commits preserve history, and rebase rewrites history.](/data/attachment/album/202005/18/190001rh770g6a6r7hra0z.png "Merge commits preserve history, and rebase rewrites history.")

*合并提交（左）保留了历史，而变基（右）重写历史。*

然而，这两种方式都有一个缺点：在你准备好分享代码之前，每个人都可以看到你在本地处理问题时的所有涂鸦和编辑。这就是 `git rebase` 的 `--interactive`（或简写 `-i`）标志发挥作用的地方。

### git rebase -i 登场

`git rebase` 的最大优点是它可以重写历史。但是，为什么仅止于假装你从后面的点分支出来呢？有一种更进一步方法可以重写你是如何准备就绪这些代码的：`git rebase -i`，即交互式的 `git rebase`。

这个功能就是 Git 中的 “魔术时光机” 功能。这个标志允许你在做变基时对修订历史记录进行复杂的修改。你可以隐藏你的错误! 将许多小的修改合并到一个崭新的功能补丁中! 重新排列修改历史记录中的显示顺序！

![output of git rebase -i](/data/attachment/album/202005/18/190007un3ink2h5nyciz3p.png "output of git rebase -i")

当你运行 `git rebase -i` 时，你会进入一个编辑器会话，其中列出了所有正在被变基的提交，以及可以对其执行的操作的多个选项。默认的选择是选择（`Pick`）。

* `Pick`：会在你的历史记录中保留该提交。
* `Reword`：允许你修改提交信息，可能是修复一个错别字或添加其它注释。
* `Edit`：允许你在重放分支的过程中对提交进行修改。
* `Squash`：可以将多个提交合并为一个。
* 你可以通过在文件中移动来重新排序提交。

当你完成后，只需保存最终结果，变基操作就会执行。在你选择修改提交的每个阶段（无论是用 `reword`、`edit`、`squash` 还是发生冲突时），变基都会停止，并允许你在继续提交之前进行适当的修改。

上面这个例子的结果是 “One-liner bug fix” 和 “Integate new header everywhere” 被合并到一个提交中，而 “New header for docs website” 和 “D'oh - typo. Fixed” 合并到另一个提交中。就像变魔术一样，其他提交的工作还在你的分支中，但相关的提交已经从你的历史记录中消失了！

这使得使用 `git send-email` 或者用你新整理好的补丁集在父版本库中创建一个拉取请求，然后来提交一个干净的补丁给上游项目变得很容易。这有很多好处，包括让你的代码更容易审核，更容易接受，也更容易合并。

---

via: <https://opensource.com/article/20/4/git-rebase-i>

作者：[Dave Neary](https://opensource.com/users/dneary) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


对构建系统进行容器化的指南

Summary: 搭建一个通过容器分发应用的可复用系统可能很复杂，但这儿有个好方法。

搭建一个通过容器分发应用的可复用系统可能很复杂，但这儿有个好方法。

>
> 搭建一个通过容器分发应用的可复用系统可能很复杂，但这儿有个好方法。
>
>
>

![](/data/attachment/album/202005/19/085248ausakkjfu05akqr2.jpg)

一个用于将源代码转换成可运行的应用的构建系统是由工具和流程共同组成。在转换过程中还涉及到代码的受众从软件开发者转变为最终用户，无论最终用户是运维的同事还是部署的同事。

在使用容器搭建了一些构建系统后，我觉得有一个不错的可复用的方法值得分享。虽然这些构建系统被用于编译机器学习算法和为嵌入式硬件生成可加载的软件镜像，但这个方法足够抽象，可用于任何基于容器的构建系统。

这个方法是以一种易于使用和维护的方式搭建或组织构建系统，但并不涉及处理特定编译器或工具容器化的技巧。它适用于软件开发人员构建软件，并将可维护镜像交给其他技术人员（无论是系统管理员、运维工程师或者其他一些头衔）的常见情况。该构建系统被从终端用户中抽象出来，这样他们就可以专注于软件。

### 为什么要容器化构建系统？

搭建基于容器的可复用构建系统可以为软件团队带来诸多好处：

* **专注**：我希望专注于应用的开发。当我调用一个工具进行“构建”时，我希望这个工具集能生成一个随时可用的二进制文件。我不想浪费时间在构建系统的查错上。实际上，我宁愿不了解，或者说不关心构建系统。
* **一致的构建行为**：无论在哪种使用情况下，我都想确保整个团队使用相同版本的工具集并在构建时得到相同的结果。否则，我就得不断地处理“我这咋就是好的”的麻烦。在团队项目中，使用相同版本的工具集并对给定的输入源文件集产生一致的输出是非常重要。
* **易于部署和升级**：即使向每个人都提供一套详细说明来安装一个项目的工具集，也可能会有人翻车。问题也可能是由于每个人对自己的 Linux 环境的个性化修改导致的。在团队中使用不同的 Linux 发行版（或者其他操作系统），情况可能还会变得更复杂。当需要将工具集升级到下一版本时，问题很快就会变得更糟糕。使用容器和本指南将使得新版本升级非常简单。

对我在项目中使用的构建系统进行容器化的这些经验显然很有价值，因为它可以缓解上述问题。我倾向于使用 Docker 作为容器工具，虽然在相对特殊的环境中安装和网络配置仍可能出现问题，尤其是当你在一个使用复杂代理的企业环境中工作时。但至少现在我需要解决的构建系统问题已经很少了。

### 漫步容器化的构建系统

我创建了一个[教程存储库](https://github.com/ravi-chandran/dockerize-tutorial)，随后你可以克隆并检查它，或者按照本文内容进行操作。我将逐个介绍存储库中的文件。这个构建系统非常简单（它运行 `gcc`），从而可以让你专注于这个构建系统结构上。

### 构建系统需求

我认为构建系统中有两个关键点：

* **标准化构建调用**：我希望能够指定一些形如 `/path/to/workdir` 的工作目录来构建代码。我希望以如下形式调用构建：

```
./build.sh /path/to/workdir
```

为了使得示例的结构足够简单（以便说明），我将假定输出也在 `/path/to/workdir` 路径下的某处生成。（否则，将增加容器中显示的卷的数量，虽然这并不困难，但解释起来比较麻烦。）
* **通过 shell 自定义构建调用**：有时，工具集会以出乎意料的方式被调用。除了标准的工具集调用 `build.sh` 之外，如果需要还可以为 `build.sh` 添加一些选项。但我一直希望能够有一个可以直接调用工具集命令的 shell。在这个简单的示例中，有时我想尝试不同的 `gcc` 优化选项并查看效果。为此，我希望调用：

```
./shell.sh /path/to/workdir
```

这将让我得到一个容器内部的 Bash shell，并且可以调用工具集和访问我的工作目录（`workdir`），从而我可以根据需要尝试使用这个工具集。

### 构建系统的架构

为了满足上述基本需求，这是我的构架系统架构：

![Container build system architecture](/data/attachment/album/202005/19/085620czamgvs3hpzzyzy3.jpg "Container build system architecture")

在底部的 `workdir` 代表软件开发者用于构建的任意软件源码。通常，这个 `workdir` 是一个源代码的存储库。在构建之前，最终用户可以通过任何方式来操纵这个存储库。例如，如果他们使用 `git` 作为版本控制工具的话，可以使用 `git checkout` 切换到他们正在工作的功能分支上并添加或修改文件。这样可以使得构建系统独立于 `workdir` 之外。

顶部的三个模块共同代表了容器化的构建系统。最左边的黄色模块代表最终用户与构建系统交互的脚本（`build.sh` 和 `shell.sh`）。

在中间的红色模块是 Dockerfile 和相关的脚本 `build_docker_image.sh`。开发运营者（在这个例子中指我）通常将执行这个脚本并生成容器镜像（事实上我多次执行它直到一切正常为止，但这是另一回事）。然后我将镜像分发给最终用户，例如通过<ruby> 容器信任注册库 <rt>  container trusted registry </rt></ruby>进行分发。最终用户将需要这个镜像。另外，他们将克隆构建系统的存储库（即一个与[教程存储库](https://github.com/ravi-chandran/dockerize-tutorial)等效的存储库）。

当最终用户调用 `build.sh` 或者 `shell.sh` 时，容器内将执行右边的 `run_build.sh` 脚本。接下来我将详细解释这些脚本。这里的关键是最终用户不需要为了使用而去了解任何关于红色或者蓝色模块或者容器工作原理的知识。

### 构建系统细节

把教程存储库的文件结构映射到这个系统结构上。我曾将这个原型结构用于相对复杂构建系统，因此它的简单并不会造成任何限制。下面我列出存储库中相关文件的树结构。文件夹 `dockerize-tutorial` 能用构建系统的其他任何名称代替。在这个文件夹下，我用 `workdir` 的路径作参数调用 `build.sh` 或 `shell.sh`。

```
dockerize-tutorial/
├── build.sh
├── shell.sh
└── swbuilder
    ├── build_docker_image.sh
    ├── install_swbuilder.dockerfile
    └── scripts
        └── run_build.sh
```

请注意，我上面特意没列出 `example_workdir`，但你能在教程存储库中找到它。实际的源码通常存放在单独的存储库中，而不是构建工具库中的一部分；本教程为了不必处理两个存储库，所以我将它包含在这个存储库中。

如果你只对概念感兴趣，本教程并非必须的，因为我将解释所有文件。但是如果你继续本教程（并且已经安装 Docker），首先使用以下命令来构建容器镜像 `swbuilder:v1`：

```
cd dockerize-tutorial/swbuilder/
./build_docker_image.sh
docker image ls  # resulting image will be swbuilder:v1
```

然后调用 `build.sh`：

```
cd dockerize-tutorial
./build.sh ~/repos/dockerize-tutorial/example_workdir
```

下面是 [build.sh](https://github.com/ravi-chandran/dockerize-tutorial/blob/master/build.sh) 的代码。这个脚本从容器镜像 `swbuilder:v1` 实例化一个容器。而这个容器实例映射了两个卷：一个将文件夹 `example_workdir` 挂载到容器内部路径 `/workdir` 上，第二个则将容器外的文件夹 `dockerize-tutorial/swbuilder/scripts` 挂载到容器内部路径 `/scripts` 上。

```
docker container run                              \
    --volume $(pwd)/swbuilder/scripts:/scripts    \
    --volume $1:/workdir                          \
    --user $(id -u ${USER}):$(id -g ${USER})      \
    --rm -it --name build_swbuilder swbuilder:v1  \
    build
```

另外，`build.sh` 还会用你的用户名（以及组，本教程假设两者一致）去运行容器，以便在访问构建输出时不出现文件权限问题。

请注意，[shell.sh](https://github.com/ravi-chandran/dockerize-tutorial/blob/master/shell.sh) 和 `build.sh` 大体上是一致的，除了两点不同：`build.sh` 会创建一个名为 `build_swbuilder` 的容器，而 `shell.sh` 则会创建一个名为 `shell_swbuilder` 的容器。这样一来，当其中一个脚本运行时另一个脚本被调用也不会产生冲突。

两个脚本之间的另一处关键不同则在于最后一个参数：`build.sh` 传入参数 `build` 而 `shell.sh` 则传入 `shell`。如果你看了用于构建容器镜像的 [Dockerfile](https://github.com/ravi-chandran/dockerize-tutorial/blob/master/swbuilder/install_swbuilder.dockerfile)，就会发现最后一行包含了下面的 `ENTRYPOINT` 语句。这意味着上面的 `docker container run` 调用将使用 `build` 或 `shell` 作为唯一的输入参数来执行 `run_build.sh` 脚本。

```
# run bash script and process the input command
ENTRYPOINT [ "/bin/bash", "/scripts/run_build.sh"]
```

[run\_build.sh](https://github.com/ravi-chandran/dockerize-tutorial/blob/master/swbuilder/scripts/run_build.sh) 使用这个输入参数来选择启动 Bash shell 还是调用 `gcc` 来构建 `helloworld.c` 项目。一个真正的构建系统通常会使用 Makefile 而非直接运行 `gcc`。

```
cd /workdir

if [ $1 = "shell" ]; then
    echo "Starting Bash Shell"
    /bin/bash
elif [ $1 = "build" ]; then
    echo "Performing SW Build"
    gcc helloworld.c -o helloworld -Wall
fi
```

在使用时，如果你需要传入多个参数，当然也是可以的。我处理过的构建系统，构建通常是对给定的项目调用 `make`。如果一个构建系统有非常复杂的构建调用，则你可以让 `run_build.sh` 调用 `workdir` 下最终用户编写的特定脚本。

### 关于 scripts 文件夹的说明

你可能想知道为什么 `scripts` 文件夹位于目录树深处而不是位于存储库的顶层。两种方法都是可行的，但我不想鼓励最终用户到处乱翻并修改里面的脚本。将它放到更深的地方是一个让他们更难乱翻的方法。另外，我也可以添加一个 `.dockerignore` 文件去忽略 `scripts` 文件夹，因为它不是容器必需的部分。但因为它很小，所以我没有这样做。

### 简单而灵活

尽管这一方法很简单，但我在几个相当不同的构建系统中使用过，发现它相当灵活。相对稳定的部分（例如，一年仅修改数次的给定工具集）被固定在容器镜像内。较为灵活的部分则以脚本的形式放在镜像外。这使我能够通过修改脚本并将更改推送到构建系统存储库中，轻松修改调用工具集的方式。用户所需要做的是将更改拉到本地的构建系统存储库中，这通常是非常快的（与更新 Docker 镜像不同）。这种结构使其能够拥有尽可能多的卷和脚本，同时使最终用户摆脱复杂性。

---

via: <https://opensource.com/article/20/4/how-containerize-build-system>

作者：[Ravi Chandran](https://opensource.com/users/ravichandran) 选题：[lujun9972](https://github.com/lujun9972) 译者：[LazyWolfLin](https://github.com/LazyWolfLin) 校对：[wxy](https://github.com/wxy)

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


新闻速读 > MIT “AI 种菜”项目失败，还因环保问题被罚 25125 美元

Summary: 更多：梅赛德斯奔驰 OLU 源代码在网上曝光；Rust 发布 5 周年

hhh，rust啥都好，就是学不会

来自111.18.70.88的 Firefox 77.0|Windows 10 用户

更多：梅赛德斯奔驰 OLU 源代码在网上曝光；Rust 发布 5 周年

![](/data/attachment/album/202005/19/115240qz8t644tt1hs441l.jpg)

#### MIT “AI 种菜”项目失败，还因环保问题被罚 25125 美元

4 月 30 日消息，麻省理工 MIT 永久关停由原麻省理工媒体实验室首席研究科学家 Caleb Harper 牵头的“开放农业计划（OpenAg）”项目。同一天，Caleb Harper 从 MIT 正式离职。OpenAg 项目始于2015年，其核心产品形态类似迷你培育室，是一个四方的便携密闭箱，被称作个人食品计算机（PFC）。PFC 的硬件和软件全部开源，以便更多人做室内农业试验。这个“开源食物计算机”PFC 一大的技术特色，就是利用深度学习来种菜。项目会搜集来自世界各地的食物计算机数据，然后利用机器学习算法，给植物生长提供更适合其习性的环境“食谱”。Harper 还给这个产品规划了一个充满人情味的发展路线：从帮助叙利亚难民种菜开始，逐步延伸到对未来农业发展的探索，最后建造一个全球化的数字农场，让人们都能自由种植自己喜欢的植物。但 IEEE Spectrum 的一份调查结果显示，2017 至 2019 年期间，Harper 关于 PFC 在难民营的部署的言论被证明是在说谎。PFC 的产品功能也没得到实现。

来源：[开源中国](https://www.oschina.net/news/115772/mit-openag-project-failed)

>
> 硬核老王点评：理想是好的，现实是残酷的。
>
>
>

#### 梅赛德斯奔驰 OLU 源代码在网上曝光

瑞士软件工程师 Till Kottmann 发现了一个属于戴姆勒公司的 Git 门户网站。Kottmann 在戴姆勒的代码托管门户上注册一个帐户然后下载 580 多个 Git 存储库，其中包含了戴姆勒的梅赛德斯奔驰货车上安装的车载逻辑单元（OLU）的源代码。OLU 是介于汽车硬件和软件之间的一个组件，它负责将车辆连接到云端。戴姆勒未能实施账户确认流程，而这使其能使用一个不存在的戴姆勒公司电子邮件在公司的官方 GitLab 服务器上注册一个账户。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/980757.htm)

>
> 硬核老王点评：GitLab 是好用，但是无防护的实例可能造成的信息泄漏可能更危险。
>
>
>

#### Rust 发布 5 周年

Rust 核心团队发布博客庆祝发行五周年，并反思了自 2015 年以来该语言经历的所有重大变化。自 2015 年发布 1.0 版以来，Rust 曾在 Stack Overflow 开发者调查中连续四年被评为“最受欢迎的”编程语言。微软也在 2019 年 7 月讨论了对 Rust 的探索，希望将其作为 C、C++ 和其他语言的替代方案，以此来改善应用程序的安全状况。

来源：[开源中国](https://www.oschina.net/news/115771/five-years-of-rust)

>
> 硬核老王点评：Rust 就是太难学了。
>
>
>


新闻速读 > 微软在其云服务上打造全新超算

Summary: 更多：WSL 2 计划支持 Linux GUI 应用，可和 Windows 应用同时使用；Windows 10 终于也迎来了一款软件包管理器

![](/data/attachment/album/202005/20/174639fvvtzwpp747t4l6d.jpg)

#### 微软在其云服务上打造全新超算

微软与 OpenA 合作，专门为 OpenAI 在 Azure 上构建了一台新的超级计算机，拥有超过 28.5 万个 CPU 核心和 1 万个 GPU。按照世界超级计算机 TOP500 的排名，微软打造的这款新型超级计算机位列前五名。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/981083.htm)

>
> 硬核老王点评：不知道国内的云服务商会不会也打造一个基于云服务器的超算？
>
>
>

#### WSL 2 计划支持 Linux GUI 应用，可和 Windows 应用同时使用

微软计划在本月底在 WSL 2 中为 Windows 10 系统添加完整的 Linux 内核，而现在又有新计划将支持 Linux 的 GUI 应用，使其能够和常规 Windows 应用一起运行。目前可以使用第三方 X 显示服务器在 Windows 中运行 Linux GUI 应用程序，不过存在性能表现不佳的情况。一旦该功能上线，这就意味着 Windows 用户不需要使用 X11 转发的情况下就能启用 Linux GUI 应用程序，和 Windows 应用一同运行。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/981187.htm)

>
> 硬核老王点评：所以以后在 Windows 上会有越来越多的 Linux 应用出现，无论是命令行的还是图形界面的，或许有一天连内核都换成 Linux 内核，而用户或许会感觉不到变化。嗯，欢迎 Windows “主题”上线。
>
>
>

#### Windows 10 终于也迎来了一款软件包管理器

微软终于在今日宣布了一项新功能 —— 为 Windows 10 带来了一款内置的软件包管理器。简而言之，其使得用户无需在窗口中频繁点击，即可轻松完成桌面程序的安装工作。Windows 软件包管理器已支持如下命令：`install`：安装应用程序；`show`：显示有关应用程序的信息；`source`：管理应用程序的可用来源；`search`：查找应用程序的基本信息。感兴趣的朋友可加入 Windows Insider 测试项目，并通过 Microsoft Store 获取 Windows 软件包管理器。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/981255.htm)

>
> 硬核老王点评：在 Linux 等系统中司空见惯的包管理器终于在 Windows 中出现了，这应该算是微软拥抱开源和 Linux，甚至内嵌了 WSL 的系统而带给 Windows 产品线的影响了。
>
>
>

#### 华为 HMS 全球注册开发者达 140 万，接入应用数量超 6 万

目前，全球 170 多个国家和地区的用户已经能够使用华为应用市场、华为浏览器、华为云空间、华为智慧助手·今天等。

来源：[网易科技](https://tech.163.com/20/0519/16/FD0JPFOI00097U7S.html)

>
> 硬核老王点评：加油！
>
>
>


自定义用于 Web 开发的开源 PHP 框架 Codeigniter

>
> Codeigniter 是一个 PHP 框架，可以使公司进行开发具有灵活性和便捷性的高性能网站。
>
>
>

![](/data/attachment/album/202005/21/102637vslj5zqk52x98a52.jpg)

PHP Codeigniter 是一个开源框架，为商业应用提供易于使用的 PHP 编程语言和强大的编码工具。它还提供商务智能、服务器监视、开发和应用集成功能。这是一个相对冷清的项目，你很少听到它，但它功能强大，许多刚接触的开发人员都对此感到惊讶和耳目一新。

我在新加坡的一家在线学习服务提供商处使用 [Codeigniter](https://codeigniter.com/)。我们提供的服务并不算常见，没有可以作为模板的默认功能集或现有后台管理系统，所以我需要一个能提供良好的、可靠的、可以建立在此基础上的原始材料。最初，我考虑用其他平台（如 Wordpress）用于我们的网站。但是，我决定使用 Codeigniter，因为它的灵活性，以及集成了在我们的补课匹配过程中需要的功能。

以下是打动我使用 Codeigniter 的原因：

* 与 MySQL 数据库的集成 —— 主要功能是允许客户端浏览导师的数据库并添加导师，例如类似于电子商务平台的“购物车”。
* 客户端界面系统 —— 用户可以登录来管理偏好并编辑详细信息，修改所教的科目、旅游的地区、手机号码、地址等。
* 定制的管理员面板 —— 管理员可以使用定制的管理面板访问客户提交的资料，它与客户服务功能集成在一起，因此管理员可以单独跟进。
* 付款系统 —— 管理面板带有与 Paypal 集成的发票和付款网关。
* CMS 编辑器界面 —— 管理员能够编辑博客和文章中的文本和图像，以及添加新页面。

该项目花费了大约六个月的时间来完成，另外花了两个月的调试时间。如果我需要从头开始构建所有，或者尝试重新设计现有的框架以满足我们的需求，那将花费更长的时间，而且可能最终无法满足客户需求。

### 功能和优点

PHP Codeigniter还有很多吸引开发者的功能，包括错误处理和代码格式化，这些功能在各种编码情景下都非常有用。它支持模板，可用于向现有网站添加功能或生成新网站。有许多基于 web 系统商业需要的功能，包括使用自定义标签。即使没有编程经验的普通开发人员也可以使用大多数工具。

Codeigniter 的主要功能是：

* XML 核心服务，
* HTTP/FTP 核心服务
* AppData 和 PHP 沙箱功能
* XSLT 和 HTML 模板
* 加密的信息传输
* PCM Codeigniter 服务器监控
* 应用集成
* 文件传输协议（FTP）
* 服务台支持
* Apache POI（用于托管网站的内容管理基础架构）

#### 兼容性

Codeigniter 与许多领先的软件程序兼容，例如 PHP、MySQL、[MariaDB](http://mariadb.org/)、[phpMyAdmin](https://www.phpmyadmin.net/)、[Apache](http://apache.org/)、OpenBSD、XSLT、[SQLite](http://sqlite.org/) 等。许多公司更喜欢使用 Codeigniter 产品来满足网站要求，因为它们易于使用和集成。如果你不想创建自己的网站，你可以找到许多提供自定义 Web 开发服务的开发人员和设计机构。

#### 安全

Codeigniter 还通过 SSL 加密提供数据安全性。加密可以保护数据免受入侵者和防火墙外部威胁的侵害。数据存储功能还允许对公司网站进行安全审核。

#### 其它功能

一家优秀的 PHP Web 开发公司会使用几种高级技术和第三方技术，例如 XML 和 PHP。它为企业提供了一个完整的平台，可以开发出具有看起来专业的、好用的商业网站。Codeigniter 使得第三方技术的使用变得容易，并可以与常见的 Web 开发软件一起使用。这使得 Web 公司可以轻松地使用所选模块创建网站。大多数 PHP 开发者也为个人提供支持和培训服务。

### 使用 PHP 框架 Codeigniter

Codeigniter 给企业提供了完整的 PHP 开发包，它将提供强大的功能、灵活性和性能完美结合在一起。到目前为止，我很满意我们的网站，并不断地升级和添加新的功能。并不断升级和增加新的功能。我期待着发现我们的网站还能用 Codeigniter 做些什么。你也是这样么？

---

via: <https://opensource.com/article/20/5/codeigniter>

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


5 种拆分 Linux 终端的方法

tmux +1

Guake Terminal 用户路过

>
> 本文介绍了 Linux 提供的拆分终端的方法，它能够帮助你完成多任务工作。那么，你最喜欢哪一款终端复用工具呢？
>
>
>

![](/data/attachment/album/202005/21/132437ypzpqqppqh1qfznh.jpg)

没有什么问题是不能用一个 Linux 终端解决的，如果不行，那就用两个。

很早以前，[终端其实是一个物理设备](https://www.redhat.com/sysadmin/terminals-shells-consoles)，而现在的终端实际上是在计算机上被模拟出来的一个应用程序。当你使用终端和计算机进行交互的时候，就会发现，只打开一个终端是不够用的。在进行编译、数据处理等长时间任务的时候，你不得不打开一个新终端或新<ruby> 选项卡 <rt>  tab </rt></ruby>来同时进行其它工作。

如果你是系统管理员，你就需要更多的终端窗口，以便连接到多个不同的主机上并行工作了。

在 Linux 系统中，终端应用程序在很久之前就已经开始带有选项卡功能了。而现在的终端应用程序里，选项卡已经是标配功能了，这是非常流行的趋势。尽管如此，工作的时候在多个选项卡之间来回切换，或多或少也会分散我们的注意力，甚至带来不便。

而最好的解决方案就是将整个屏幕划分为多个部分，这样多个终端就可以在同一个终端应用程序窗口中同时存在。Linux 发行版中也有很多相关的工具可以实现这一功能。

### Shell、终端和控制台

在此之前，我们首先要明确 Shell、<ruby> 终端 <rt>  terminal </rt></ruby>、<ruby> 控制台 <rt>  console </rt></ruby>这三个概念。想要详细了解的话，请参阅 [Enable Sysadmin](https://www.redhat.com/sysadmin/terminals-shells-consoles) 博客上的相关文章。

简而言之：

* **Shell** 是带有<ruby> 命令提示符 <rt>  prompt </rt></ruby>的用于输入、输出的界面。准确地说，[POSIX](https://opensource.com/article/19/7/what-posix-richard-stallman-explains) 桌面底层也运行着一个 Shell，即使这个 Shell 对用户不可见，因为用户会话就是由这个 Shell 启动的。
* **终端**是在图形界面服务器（例如 X11 或 Wayland）中运行的应用程序，其中加载了一个 Shell。只有在终端窗口启动之后，才算是运行了一个终端。终端可以认为是操作 Shell 的一个入口。
* **控制台**（或称“虚拟控制台”）通常表示在桌面环境以外使用的 Shell，你可以通过 `Alt+Ctrl+F2` 进入控制台，通常情况下从 `F3` 到 `F7` 都是不同的控制台，其中桌面环境有可能是 `F1` 或者 `F7`，这在不同的发行版中可能会有所不同。

因此，有些应用程序提供的功能是拆分 Shell 或者控制台，有些应用程序的功能则是拆分终端。

### tmux

![tmux terminal](/data/attachment/album/202005/21/132609upfsopddjaaadkjd.png "tmux terminal")

[tmux](https://github.com/tmux/tmux) 可以说是最灵活、最强大的屏幕拆分工具了，它通过键盘控制对多个终端的复用，因此你可以将一个控制台叠放在另一个控制台上面，并在两个控制台之间切换。你还可以将整个屏幕等分为多个控制台，以便同时观察不同控制台上的状况。

`tmux` 的所有操作都是通过键盘完成的，这就意味着你的手不需要离开键盘去寻找鼠标。为此，你需要记住一些按键组合。

如果你只用 `tmux` 来做屏幕拆分，那你只需要记住一下这些命令：

* `Ctrl-B %` 竖直拆分屏幕（两个 Shell 分别位于左右）
* `Ctrl-B "` 水平拆分屏幕（两个 Shell 分别位于上下）
* `Ctrl-B O` 切换到另一个 Shell
* `Ctrl-B ?` 查看帮助
* `Ctrl-B d` 断开 `tmux` 并让其在后台运行（可以使用 `tmux attach` 重新进入）

`tmux` 的一大好处是，在一台计算机上启动 `tmux` 会话之后，也可以从另一台计算机上进入到这个会话，由此可以看出，`tmux` 对 Shell 进行了<ruby> 守护进程化 <rt>  daemonize </rt></ruby>。

例如，当我在树莓派上运行 `tmux`，我就可以从计算机上连接到树莓派并登录 IRC，当我断开连接时，树莓派上的 `tmux` 会继续运行，并等待我的下一次连接，在此期间 IRC 是处于持续登录状态的。

### GNU Screen

![GNU Screen terminal](/data/attachment/album/202005/21/132542q2a10vnvyupo09u5.png "GNU Screen terminal")

[GNU Screen](https://www.gnu.org/software/screen/) 也是一个 Shell 复用工具，类似于 `tmux`，你可以在断开一个活动会话后重连到其中，它也支持竖直或水平拆分屏幕。

`screen` 的灵活性比 `tmux` 要弱一些。它默认的绑定按键组合是 `Ctrl-A`，和 Bash 中光标移动到行首的快捷键是一样的。因此，当你正在运行 `screen` 的时候，如果想要将光标移动到行首，就需要多按一次 `Ctrl-A`。而我自己的做法是，在 `$HOME/.screenrc` 文件中将绑定按键组合重新设置为 `Ctrl-J`。

```
escape ^jJ
```

尽管 `screen` 在屏幕拆分功能上做得很好，但 `tmux` 上的一些缺点在 Screen 上也同样存在。例如在拆分 Shell 时，在一个新的面板中不会启动新的 Shell ，而是需要使用 `Ctrl-A Tab` 导航到另一个面板（如果你按照我的方式重新设置了按键组合，需要对应地把 `Ctrl-A` 改为 `Ctrl-J`），然后通过 `Ctrl-A C` 手动创建一个新的 Shell。

和 `tmux` 不同的是，`screen` 在退出一个 Shell 的时候，屏幕拆分状态不会改变，这样的设计在某些情况下是比较适合的，但麻烦之处在于需要手动管理屏幕拆分状态。

尽管如此，`screen` 还是一个相当可靠灵活的应用程序，在无法使用 `tmux` 的时候，你可以选择 `screen` 作为备选方案。

在默认按键方案下，`screen` 常用的基本命令包括：

* `Ctrl-A |` 竖直拆分屏幕（两个 Shell 分别位于左右）
* `Ctrl-A S` 水平拆分屏幕（两个 Shell 分别位于上下）
* `Ctrl-A Tab` 切换到另一个 Shell
* `Ctrl-A ?` 查看帮助
* `Ctrl-A d` 断开 `screen` 并让其在后台运行（可以使用 `screen -r` 重新进入）

### Konsole

![Konsole screen](/data/attachment/album/202005/21/132546d07pbn70p2nbbp0b.jpg "Konsole screen")

[Konsole](https://konsole.kde.org) 是 KDE Plasma 桌面使用的终端应用程序。和 KDE 一样，Konsole 也以高度可定制、功能强大的特点而著称。

和 `tmux`、GNU Screen 类似，Konsole 也具有拆分屏幕的功能。由于 Konsole 是图形界面的终端，因此还可以用鼠标来控制它的屏幕拆分。

Konsole 的屏幕拆分功能在“<ruby> 查看 <rt>  View </rt></ruby>”菜单中。它也支持竖直和水平方向的拆分，只要点击鼠标就可以切换到另一个面板上。每个面板都是一个独立的终端，因此都可以拥有独立的主题和标签页。

Konsole 和 `tmux`、GNU Screen 最大的不同之处在于不能断开和重新连接 Konsole。除非使用远程桌面软件，否则只能在打开 Konsole 时使用，这一点和大多数图形界面应用程序是一样的。

### Emacs

![Emacs rpg](/data/attachment/album/202005/21/132549hh9czonx0jc8l49r.jpg "Emacs rpg")

严格来说，Emacs 并不算是一个终端复用工具，但它的使用界面支持拆分和调整大小，同时还带有一个内建的终端。

如果 Emacs 是你日常使用的文本编辑器，你就可以在不关闭编辑器的情况下，在不同的应用程序之间轻松互相切换。由于 Emacs eshell 模块是通过 eLISP 实现的，因此你可以在 Emacs 中使用相同的命令进行交互，让一些繁琐的操作变得更为简单。

如果你是在图形界面中使用 Emacs，还可以使用鼠标进行操作。例如通过点击切换面板、用鼠标调整拆分屏幕的的大小等等。尽管如此，键盘的操作速度还是更快，因此记住一些键盘快捷键还是很有必要的。

Emacs 的一些重要快捷键包括：

* `Ctrl-X 3` 竖直拆分屏幕（两个 Shell 分别位于左右）
* `Ctrl-X 2` 水平拆分屏幕（两个 Shell 分别位于上下）
* `Ctrl-X O` （大写字母 `O`）切换到另一个 Shell（你也可以使用鼠标操作）
* `Ctrl-X 0` （数字 `0`）关闭当前面板

如果你运行了 emacs-client 的话，就可以像 tmux 和 GNU Screen 一样断开和重新连接到 Emacs 了。

### 窗口管理器

![Ratpoison split screen](/data/attachment/album/202005/21/132556rbqd7dujnmddud7d.jpg "Ratpoison split screen")

除了文本编辑器之外，一些 Linux 桌面也同样具有拆分屏幕、加载终端这样的功能。例如 [Ratpoison](https://opensource.com/article/19/12/ratpoison-linux-desktop)、[Herbsluftwm](https://opensource.com/article/19/12/herbstluftwm-linux-desktop)、i3、Awesome，甚至是启用了特定设置的 KDE Plasma 桌面，都可以将多个应用程序在桌面上分块显示。

这些桌面可以让各个应用程序占据屏幕的固定位置，而不是浮在你的桌面“之上”，因此你可以在多个应用程序窗口之间轻松切换。你还可以打开多个终端，排布成网格，就像终端复用工具一样。更进一步，你还可以在你的桌面复用工具中加载一个终端复用工具。

而且，没有什么可以阻止你在里面载入 Emacs 并分割缓冲区。没有人知道，如果你把它更进一步，会发生什么，大多数 Linux 用户不会外传这种秘密。

和 `tmux`、GNU Screen 不同，你在断开与桌面的连接后无法重新连接到同一个桌面会话，除非你使用了远程桌面软件进行连接。

### 更多选择

除了上面介绍到的工具以外，还有诸如 [Tilix](https://gnunn1.github.io/tilix-web/)、Terminator 这样的终端模拟器，它们同样可以实现屏幕拆分、嵌入终端组件等功能。欢迎在评论区分享你喜欢的终端拆分工具。

---

via: <https://opensource.com/article/20/5/split-terminal>

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

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


新闻速读 > 百度输入法 Linux 版本发布

Summary: • Chrome 83 稳定版发布 • EA 将在 GPL 下公开《红警》和《泰伯利亚黎明》的源代码 • OpenBSD 6.7 发布 • DirectX 将进入 WSL 2

![](/data/attachment/album/202005/21/152407zytz3r1cwycmm695.jpg)

#### 百度输入法 Linux 版本发布

百度发布了其输入法的 Linux 版本，官方称支持 Ubuntu 18.04 - 19.10、Deepin 1510、1511，应该也可以支持更多 Linux 发行版版本，如 Ubuntu 20.04 LTS 和优麒麟。官网：<http://srf.baidu.com/site/guanwang_linux/> 。安装说明称，“本输入法输入面板程序与其他输入法如搜狗输入法、讯飞输入法冲突，可能会受其他输入法影响而无法正常启动，若已安装其他输入法并导致百度输入法输入面板无法正常启动，应关闭其他输入法相关进程并重启百度输入法输入面板程序”。

来源：[百度](http://srf.baidu.com/site/guanwang_linux/)

>
> 硬核老王点评：不知道会有多少 Linux 用户会信任和使用百度的软件。顺便说一句，这个“guanwang”的 URL 地址真不愧是拼音输入法的网址。
>
>
>

#### Chrome 83 稳定版发布

谷歌跳过了 Chrome 82，直接向最终用户推送了 Chrome 83。主要更新内容：有助于防止跨站点脚本漏洞的可信类型；新的表单元素外观；新的跨域政策；支持条形码检测 API，提供了检测和解码条形码的功能；Preferreds-Color-Scheme 媒体查询使作者能够选择自己的深色主题。

来源：[开源中国](https://www.oschina.net/news/115834/chrome-83-released?tdsourcetag=s_pctim_aiomsg)

>
> 硬核老王点评：直接跳过了一个大版本，带来的变化非常多。
>
>
>

#### EA 将在 GPL 下公开《红警》和《泰伯利亚黎明》的源代码

EA 游戏制作人 Jim Vessella 在 Reddit 上宣布，将在 GPLv3 许可证下公开泰伯利亚黎明和红警的源代码。Vessella 称《命令与征服》应该是第一个在 GPL 下公开源代码的大型即时战略游戏。采用 GPL 是为了确保它与开源项目如 CnCNet 和 Open RA 相互兼容。

来源：[solidot](https://www.solidot.org/story?sid=64425)

>
> 硬核老王点评：作为当年的顶级游戏，能够开源还是非常赞的，希望开源社区可以在此基础上发展出更多的衍生品。
>
>
>

#### OpenBSD 6.7 发布

主要更新内容：改进 FFS2 文件系统并成为默认文件系统，包括在新安装时默认使用 64 位时间戳和区块号；为 ARM64 设备提供对树莓派 4 的支持，同时改进对树莓派 3 的支持。对于 OpenBSD ARMv7，还改进了对树莓派 2/3 的支持；针对 SMP 的多项改进，包括更好的 AMD SMT/Core/Package 检测；引入 FIDO 驱动，支持 FIDO/U2F 安全密钥；PowerPC OpenBSD 构建切换到 Clang 作为其默认代码编译器。

来源：[开源中国](https://www.oschina.net/news/115823/openbsd-6-7-released)

>
> 硬核老王点评：OpenBSD 是 BSD 家族的重要成员，在广大的 BSD 爱好者眼中，BSD 才是最好的发行版。
>
>
>

#### DirectX 将进入 WSL 2

在 //build 2020 上，微软宣布 GPU 硬件加速将加入到 WSL 2 中。WSL 是一个允许用户在 Windows PC 上运行 Linux 应用的环境。现在，这些 Linux 应用和工具将能使用 GPU 加速。微软称，对 GPU 的访问，Linux 环境中的应用将和 Windows 原生应用一样，它不会对 Linux 应用进行限制，将根据需要对 GPU 提供动态的分享。微软表示它将完整的 D3D12 API 带到了 Linux。除了 D3D12 和 DxCore 外，它还将其机器学习 API DirectML 移植到了 Linux。

来源：[solidot](https://www.solidot.org/story?sid=64415)

>
> 硬核老王点评：自打微软将开源当成了新欢，现在微软开个开发者大会，都满满是值得大书一笔的开源新动向。DirectX 进入 WSL ，想必可以为 Linux 下的 GPU 应用提供很好的支持。
>
>
>

#### Signal 不再将电话号码作为用户的唯一 ID

主打安全的即时通信应用 Signal，本周推出了一项名叫“Signal PINs”的新功能。该公司称，此举有助于用户在设备间迁移账户数据。此外从长远来看，新功能也算是向着摆脱使用电话号码作为用户 ID 的目标迈出了重要一步。启用之后，用户将被要求创建一个与之账户相关联的 PIN 码，且可使用 4 位数及以上的字符串。当用户不慎遗失了设备、或想将资料转移到新手机时，Signal PIN 便允许其轻松实现数据迁移。

来源：[cnBeta.COM](https://www.cnbeta.com/articles/tech/981607.htm)

#### 广告商因疫情放弃百度

与搜索和视频相比，信息流广告是“短期而言广告商的首选渠道，而这正是百度未能吸引广告商的地方”。广告商们纷纷放弃这家中国搜索巨头，转而使用更灵活的竞争对手的应用。百度表示，第一季度营收同比下降 7%，至 225 亿元人民币，原因是旅游、汽车和医疗行业广告客户在公共卫生危机期间削减支出。其核心的搜索和新闻推送业务的营收下滑速度更快，同比下降 13%。净利润较上一季度暴跌 99%，至 4100 万元人民币。

来源：[solidot](https://www.solidot.org/story?sid=64419)

>
> 硬核老王点评：没什么好说的。
>
>
>


通过禁止比较让 Go 二进制文件变小

Summary: 本文中我会深入讲解在 Go 程序的上下文中“相等”的意义，以及为什么像这样的修改会对 Go 程序的大小有重大的影响。

![](/data/attachment/album/202005/22/101617lcha7vvqzhh7d565.jpg)

大家常规的认知是，Go 程序中声明的类型越多，生成的二进制文件就越大。这个符合直觉，毕竟如果你写的代码不去操作定义的类型，那么定义一堆类型就没有意义了。然而，链接器的部分工作就是检测没有被程序引用的函数（比如说它们是一个库的一部分，其中只有一个子集的功能被使用），然后把它们从最后的编译产出中删除。常言道，“类型越多，二进制文件越大”，对于多数 Go 程序还是正确的。

本文中我会深入讲解在 Go 程序的上下文中“相等”的意义，以及为什么[像这样](https://github.com/golang/net/commit/e0ff5e5a1de5b859e2d48a2830d7933b3ab5b75f)的修改会对 Go 程序的大小有重大的影响。

### 定义两个值相等

Go 的语法定义了“赋值”和“相等”的概念。赋值是把一个值赋给一个标识符的行为。并不是所有声明的标识符都可以被赋值，如常量和函数就不可以。相等是通过检查标识符的内容是否相等来比较两个标识符的行为。

作为强类型语言，“相同”的概念从根源上被植入标识符的类型中。两个标识符只有是相同类型的前提下，才有可能相同。除此之外，值的类型定义了如何比较该类型的两个值。

例如，整型是用算数方法进行比较的。对于指针类型，是否相等是指它们指向的地址是否相同。映射和通道等引用类型，跟指针类似，如果它们指向相同的地址，那么就认为它们是相同的。

上面都是按位比较相等的例子，即值占用的内存的位模式是相同的，那么这些值就相等。这就是所谓的 memcmp，即内存比较，相等是通过比较两个内存区域的内容来定义的。

记住这个思路，我过会儿再来谈。

### 结构体相等

除了整型、浮点型和指针等标量类型，还有复合类型：结构体。所有的结构体以程序中的顺序被排列在内存中。因此下面这个声明：

```
type S struct {
    a, b, c, d int64
}
```

会占用 32 字节的内存空间；`a` 占用 8 个字节，`b` 占用 8 个字节，以此类推。Go 的规则说如果结构体所有的字段都是可以比较的，那么结构体的值就是可以比较的。因此如果两个结构体所有的字段都相等，那么它们就相等。

```
a := S{1, 2, 3, 4}
b := S{1, 2, 3, 4}
fmt.Println(a == b) // 输出 true
```

编译器在底层使用 memcmp 来比较 `a` 的 32 个字节和 `b` 的 32 个字节。

### 填充和对齐

然而，在下面的场景下过分简单化的按位比较的策略会返回错误的结果：

```
type S struct {
    a byte
    b uint64
    c int16
    d uint32
}

func main()
    a := S{1, 2, 3, 4}
    b := S{1, 2, 3, 4}
    fmt.Println(a == b) // 输出 true
}
```

编译代码后，这个比较表达式的结果还是 `true`，但是编译器在底层并不能仅依赖比较 `a` 和 `b` 的位模式，因为结构体有*填充*。

Go 要求结构体的所有字段都对齐。2 字节的值必须从偶数地址开始，4 字节的值必须从 4 的倍数地址开始，以此类推    1 。编译器根据字段的类型和底层平台加入了填充来确保字段都*对齐*。在填充之后，编译器实际上看到的是    2 ：

```
type S struct {
    a byte
    _ [7]byte // 填充
    b uint64
    c int16
    _ [2]int16 // 填充
    d uint32
}
```

填充的存在保证了字段正确对齐，而填充确实占用了内存空间，但是填充字节的内容是未知的。你可能会认为在 Go 中 填充字节都是 0，但实际上并不是 — 填充字节的内容是未定义的。由于它们并不是被定义为某个确定的值，因此按位比较会因为分布在 `s` 的 24 字节中的 9 个填充字节不一样而返回错误结果。

Go 通过生成所谓的相等函数来解决这个问题。在这个例子中，`s` 的相等函数只比较函数中的字段略过填充部分，这样就能正确比较类型 `s` 的两个值。

### 类型算法

呵，这是个很大的设置，说明了为什么，对于 Go 程序中定义的每种类型，编译器都会生成几个支持函数，编译器内部把它们称作类型的算法。如果类型是一个映射的键，那么除相等函数外，编译器还会生成一个哈希函数。为了维持稳定，哈希函数在计算结果时也会像相等函数一样考虑诸如填充等因素。

凭直觉判断编译器什么时候生成这些函数实际上很难，有时并不明显，（因为）这超出了你的预期，而且链接器也很难消除没有被使用的函数，因为反射往往导致链接器在裁剪类型时变得更保守。

### 通过禁止比较来减小二进制文件的大小

现在，我们来解释一下 Brad 的修改。向类型添加一个不可比较的字段    3 ，结构体也随之变成不可比较的，从而强制编译器不再生成相等函数和哈希函数，规避了链接器对那些类型的消除，在实际应用中减小了生成的二进制文件的大小。作为这项技术的一个例子，下面的程序：

```
package main

import "fmt"

func main() {
    type t struct {
        // _ [0][]byte // 取消注释以阻止比较
        a byte
        b uint16
        c int32
        d uint64
    }
    var a t
    fmt.Println(a)
}
```

用 Go 1.14.2（darwin/amd64）编译，大小从 2174088 降到了 2174056，节省了 32 字节。单独看节省的这 32 字节似乎微不足道，但是考虑到你的程序中每个类型及其传递闭包都会生成相等和哈希函数，还有它们的依赖，这些函数的大小随类型大小和复杂度的不同而不同，禁止它们会大大减小最终的二进制文件的大小，效果比之前使用 `-ldflags="-s -w"` 还要好。

最后总结一下，如果你不想把类型定义为可比较的，可以在源码层级强制实现像这样的奇技淫巧，会使生成的二进制文件变小。

---

附录：在 Brad 的推动下，[Cherry Zhang](https://go-review.googlesource.com/c/go/+/231397) 和 [Keith Randall](https://go-review.googlesource.com/c/go/+/191198) 已经在 Go 1.15 做了大量的改进，修复了最严重的故障，消除了无用的相等和哈希函数（虽然我猜想这也是为了避免这类 CL 的扩散）。

#### 相关文章：

1. [Go 运行时如何高效地实现映射（不使用泛型）](https://dave.cheney.net/2018/05/29/how-the-go-runtime-implements-maps-efficiently-without-generics "How the Go runtime implements maps efficiently (without generics)")
2. [空结构体](https://dave.cheney.net/2014/03/25/the-empty-struct "The empty struct")
3. [填充很难](https://dave.cheney.net/2015/10/09/padding-is-hard "Padding is hard")
4. [Go 中有类型的 nil（2）](https://dave.cheney.net/2017/08/09/typed-nils-in-go-2 "Typed nils in Go 2")

---

1. 在 32 位平台上 `int64` 和 `unit64` 的值可能不是按 8 字节对齐的，因为平台原生的是以 4 字节对齐的。查看 [议题 599](https://github.com/golang/go/issues/599) 了解内部详细信息。 [↩](#fnref1)
2. 32 位平台会在 `a` 和 `b` 的声明中填充 `_ [3]byte`。参见前一条。 [↩](#fnref2)
3. Brad 使用的是`[0]func()`，但是所有能限制和禁止比较的类型都可以。添加了一个有 0 个元素的数组的声明后，结构体的大小和对齐不会受影响。 [↩](#fnref3)

---

via: <https://dave.cheney.net/2020/05/09/ensmallening-go-binaries-by-prohibiting-comparisons>

作者：[Dave Cheney](https://dave.cheney.net/author/davecheney) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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


在 Linux 文件系统中导航的技巧

>
> cd 命令可能是任何 Linux 用户学习的前 10 个命令之一，但这并不是在 Linux 文件系统中导航的唯一方法，这里还有其他一些方法。
>
>
>

![](/data/attachment/album/202005/22/114058yrzlx94rz9lbx974.jpg)

无论你是在文件系统中四处查看、寻找文件还是尝试进入重要目录，Linux 都可以提供很多帮助。在本文中，我们将介绍一些技巧，使你可以在文件系统中移动，查找和使用所需的命令也更加轻松。

### 添加到 $PATH

确保你不必花费大量时间在 Linux 系统上查找命令的最简单、最有用的方法之一就是在 `$PATH` 变量中添加适当的目录。但是，添加到 `$PATH` 变量中的目录顺序非常重要。它们确定系统在目录中查找要运行命令的目录顺序–在找到第一个匹配项时停止。

例如，你可能希望将家目录放在第一个，这样，如果你创建的脚本与其他可执行文件有相同的名称，那么只要输入该脚本的名称，它便会运行。

要将家目录添加到 `$PATH` 变量中，可以执行以下操作：

```
$ export PATH=~:$PATH
```

`~` 字符代表家目录。

如果将脚本保存在 `bin` 目录中，下面的会有效：

```
$ export PATH=~/bin:$PATH
```

然后，你可以运行位于家目录中的脚本，如下所示：

```
$ myscript
Good morning, you just ran /home/myacct/bin/myscript
```

**重要提示：**上面显示的命令会添加到你的搜索路径中，因为 `$PATH`（当前路径）被包含在内。它们不会覆盖它。你的搜索路径应该在你的 `.bashrc` 文件中配置，任何你打算永久化的更改也应该添加到那里。

### 使用符号链接

符号链接提供了一种简单而明显的方式来记录可能经常需要使用的目录的位置。例如，如果你管理网站的内容，那么可能需要通过创建如下链接来使你的帐户“记住”网页文件的位置：

```
ln -s /var/www/html www
```

参数的顺序很重要。第一个（`/var/www/html`）是目标，第二个是你创建的链接的名称。如果你当前不在家目录中，那么以下命令将执行相同的操作：

```
ln -s /var/www/html ~/www
```

设置好之后，你可以使用 `cd www` 进入 `/var/www/html`。

### 使用 shopt

`shopt` 命令还提供了一种让移动到其他目录更加容易的方法。当你使用 `shopt` 的 `autocd` 选项时，只需输入名称即可转到目录。例如：

```
$ shopt -s autocd
$ www
cd -- www
/home/myacct/www
$ pwd -P
/var/www/html

$ ~/bin
cd -- /home/myacct/bin
$ pwd
/home/myacct/bin
```

在上面的第一组命令中，启用了 `shopt` 命令的 `autocd` 选项。输入 `www`，就会调用 `cd www` 命令。由于此符号链接是在上面的 `ln` 命令示例之一中创建的，因此将我们移至 `/var/www/html`。 `pwd -P` 命令显示实际位置。

在第二组中，键入 `~/bin` 会调用 `cd` 进入在用户家目录的 `bin` 目录。

请注意，当你输入的是命令时，`autocd` 行为将*不会*生效，即使它也是目录的名称。

`shopt` 是 bash 内置命令，它有很多选项。这只是意味着你不必在要进入每个目录的名称之前输入 `cd`。

要查看 `shopt` 的其他选项，只需输入 `shopt`。

### 使用 $CDPATH

可能进入特定目录的最有用技巧之一，就是将你希望能够轻松进入的路径添加到 `$CDPATH` 中。这将创建一个目录列表，只需输入完整路径名的一部分即可进入。

一方面，这可能有点棘手。你的 `$CDPATH` 需要包含要移动到的目录的父目录，而不是目录本身。

例如，假设你希望仅通过输入 `cd html` 就可以移至 `/var/www/html` 目录，并仅使用 `cd` 和简单目录名即可移至 `/var/log` 中的子目录。在这种情况下，此 `$CDPATH` 就可以起作用：

```
$ CDPATH=.:/var/log:/var/www
```

你将看到：

```
$ cd journal
/var/log/journal
$ cd html
/var/www/html
```

当你输入的不是完整路径时，`$CDPATH` 就会生效。它向下查看其目录列表，以查看指定的目录是否存在于其中一个目录中。找到匹配项后，它将带你到那里。

在 `$CDPATH` 开头保持 `.` 意味着你可以进入本地目录，而不必在 `$CDPATH` 中定义它们。

```
$ export CDPATH=".:$CDPATH"
$ Videos
cd -- Videos
/home/myacct/Videos
```

在 Linux 文件系统键切换并不难，但是如果你使用一些方便的技巧轻松地到达各个位置，那你可以节省一些大脑细胞。

---

via: <https://www.networkworld.com/article/3533421/tricks-for-getting-around-your-linux-file-system.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 选题：[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/) 荣誉推出


新闻速读 > 初代 Xbox 主机操作系统和 Windows NT 3.5 源码泄露

Summary: • 性能提升 10 倍，蚂蚁金服的 OceanBase 二次 TPC-C 测试结果公布

![](/data/attachment/album/202005/22/132619ail3kwynd33id8un.jpg)

#### 初代 Xbox 主机操作系统和 Windows NT 3.5 源码泄露

据外媒 The Verge 的报道，微软初代 Xbox 游戏主机操作系统和 Windows NT 3.5 的源码已被泄露，在本月早些时候被泄露的代码已出现在互联网上。前者被泄露的代码包括初代 Xbox 主机操作系统的部分内容——操作系统内核（Windows 2000 的定制版本）。此外，Windows NT 3.5 接近最终版本的源码也出现在了互联网上。源代码包括了所有必要的构建工具，由于对 Windows NT 3.5 的支持已在 2001 年 12 月结束，而且该内核只在全球范围内的少数系统中使用，相信不会造成严重的安全问题。

来源：[开源中国](https://www.oschina.net/news/115858/xbox-source-code-leak-original-console-windows-3-5)

>
> 硬核老王点评：即便以现在的眼光，当年的 Windows NT 3.5 依然很棒。
>
>
>

#### 性能提升 10 倍，蚂蚁金服的 OceanBase 二次 TPC-C 测试结果公布

时隔半年，蚂蚁金服的自研数据库 OceanBase 又去做了 TPC-C 测试。TPC 去年 10 月 2 日和今年 5 月 20 日公布的测试结果显示，OceanBase 都是榜单第一。性能方面，去年 OceanBase 的测试结果是 6088万 tpmC，今年则是 7.07亿 tpmC；TPC-C benchmark 价格也从 ￥6.25/tpmC 降低到 ￥3.98/tpmC。不过，一些数据库公司，如 Oracle 并未参与这两次测试。之所以在短时间内做两次测试，是因为 OceanBase 团队认为首次测试尚未充分发挥 OceanBase 分布式架构的真正实力。

来源：[开源中国](https://www.oschina.net/news/115846/oceanbase-second-tpcc-news)

>
> 硬核老王点评：之前有人质疑 OceanBase 取得高评分是由于硬件的进步，所以这次重新参加测试应该是来证明其本身软件的提升。
>
>
>


如何在 Mac 上使用 pyenv 运行多个版本的 Python

>
> 如果你在 macOS 上运行的项目需要没有安装的 Python 版本，请试试 pyenv。
>
>
>

![](/data/attachment/album/202005/23/112041pawp65alw6tmea6l.jpg)

即使对于有经验的开发人员，管理本地 Python 开发环境仍然是一个挑战。尽管有详细的[软件包管理策略](https://opensource.com/article/19/4/managing-python-packages)，但仍需要采取另外的步骤来确保你在需要时运行所需的 Python 版本。

### 为什么 Python 版本重要？

起初这是一个奇怪的概念，但是编程语言会像其他任何软件一样发生变化。它们有错误、修复和更新，就像你喜欢的 [API](https://opensource.com/article/19/5/api-evolution-right-way) 和任何其他软件一样。同样，不同的发行版由称为[语义化版本](https://semver.org/)的三位数标识。

>
> ??? [pic.twitter.com/yt1Z2439W8](https://t.co/yt1Z2439W8)
>
>
> — Denny Perez (@dennyperez18) [May 28, 2019](https://twitter.com/dennyperez18/status/1133505310516232203?ref_src=twsrc%5Etfw)
>
>
>

多年来，Python 2 是该语言的常用主要版本。在 2020 年 1 月，Python 2 [到达最后寿命](https://opensource.com/article/19/11/end-of-life-python-2)，此后，Python 的核心维护者将仅支持 Python 3。Python 3 稳步发展，并定期发布新更新。对我来说定期获取这些更新很重要。

最近，我试图在 macOS 上运行一个依赖于 Python 3.5.9 的项目，而我的系统上并没有安装这个版本。我认为 Python 包管理器 `pip` 可以安装它，但事实并非如此：

```
$ pip install python3.5.9
Collecting python3.5.9
  ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none)
ERROR: No matching distribution found for python3.5.9
```

或者，我也可以从官方 Python 网站下载该版本，但我如何在我的 Mac 上与现有的 Python 版本一起运行？每次运行时指定 Python 解释器版本（例如 python3.7 或 python3.5）似乎很容易出错。一定会有更好的方法。

（说明：我知道这对经验丰富的 Python 开发人员没有意义，但对当时的我来说是有意义的。我很乐意谈一谈为什么我仍然认为它应该这样做。）

### 安装和设置 pyenv

值得庆幸的是，`pyenv` 可以绕开这一系列复杂的问题。首先，我需要安装 `pyenv`。我可以[从源码](https://github.com/pyenv/pyenv)克隆并编译它，但是我更喜欢通过 Homebrew 包管理器来管理软件包：

```
$ brew install pyenv
```

为了通过 `pyenv` 使用 Python 版本，必须了解 shell 的 `PATH` 变量。`PATH` 决定了 shell 通过命令的名称来搜索文件的位置。你必须确保 shell 程序能够找到通过 `pyenv` 运行的 Python 版本，而不是默认安装的版本（通常称为*系统版本*）。如果不更改路径，那么结果如下：

```
$ which python
/usr/bin/python
```

这是 Python 的系统版本。

要正确设置 `pyenv`，可以在 Bash 或 zsh 中运行以下命令：

```
$ PATH=$(pyenv root)/shims:$PATH
```

现在，如果你检查 Python 的版本，你会看到它是 `pyenv` 管理的版本：

```
$ which python
/Users/my_username/.pyenv/shims/python
```

该导出语句（`PATH=`）仅会对该 shell 实例进行更改，为了使更改永久生效，你需要将它添加到点文件当中。由于 zsh 是 macOS 的默认 shell，因此我将重点介绍它。将相同的语法添加到 `~/.zshrc` 文件中：

```
$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc
```

现在，每次我们在 zsh 中运行命令时，它将使用 `pyenv` 版本的 Python。请注意，我在 `echo` 中使用了单引号，因此它不会评估和扩展命令。

`.zshrc` 文件仅管理 zsh 实例，因此请确保检查你的 shell 程序并编辑关联的点文件。如果需要再次检查默认 shell 程序，可以运行 `echo $SHELL`。如果是 zsh，请使用上面的命令。如果你使用 Bash，请将 `~/.zshrc` 更改为 `~/.bashrc`。如果你想了解更多信息，可以在 `pyenv` 的 `README` 中深入研究[路径设置](https://github.com/pyenv/pyenv#understanding-path)。

### 使用 pyenv 管理 Python 版本

现在 `pyenv` 已经可用，我们可以看到它只有系统 Python 可用：

```
$ pyenv versions
system
```

如上所述，你绝对不想使用此版本（[阅读更多有关信息](https://opensource.com/article/19/5/python-3-default-mac)）。现在 `pyenv` 已正确设置，我希望它能有我经常使用的几个不同版本的 Python。

有一种方法可以通过运行 `pyenv install --list` 来查看 pyenv 可以访问的所有仓库中的所有 Python 版本。这是一个很长的列表，将来回顾的时候可能会有所帮助。目前，我决定在 [Python 下载页面](https://www.python.org/downloads/)找到的每个最新的“点版本”（3.5.x 或 3.6.x，其中 x 是最新的）。因此，我将安装 3.5.9 和 3.8.0：

```
$ pyenv install 3.5.9
$ pyenv install 3.8.0
```

这将需要一段时间，因此休息一会（或阅读上面的链接之一）。有趣的是，输出中显示了该版本的 Python 的下载和构建。例如，输出显示文件直接来自 [Python.org](http://python.org)。

安装完成后，你可以设置默认值。我喜欢最新的，因此将全局默认 Python 版本设置为最新版本：

```
$ pyenv global 3.8.0
```

该版本立即在我的 shell 中设置完成。确认一下：

```
$ python -V
Python 3.8.0
```

我要运行的项目仅适于 Python 3.5，因此我将在本地设置该版本并确认：

```
$ pyenv local 3.5.9
$ python -V
Python 3.5.9
```

因为我在 `pyenv` 中使用了 `local` 选项，所以它向当前目录添加了一个文件来跟踪该信息。

```
$ cat .python-version
3.5.9
```

现在，我终于可以为想要的项目设置虚拟环境，并确保运行正确版本的 Python。

```
$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python
```

要了解更多信息，请查看有关[在 Mac 上管理虚拟环境](/article-11086-1.html)的教程。

### 总结

默认情况下，运行多个 Python 版本可能是一个挑战。我发现 `pyenv` 可以确保在我需要时可以有我需要的 Python 版本。

你还有其他初学者或中级 Python 问题吗？ 请发表评论，我们将在以后的文章中考虑介绍它们。

---

via: <https://opensource.com/article/20/4/pyenv>

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


Lubuntu 20.04 点评：轻量、简约、文雅

>
> Lubuntu 20.04 LTS 与之前的 LTS 版本有很大的不同。它旨在给你一个更完善的体验，而不仅仅是关注旧电脑。请阅读更多关于 Lubuntu 20.04 的内容。
>
>
>

### Lubuntu 20.04 点评：第一个基于 LXQt 的长期支持版

我在 Lubuntu 20.04 发行前几天就已经开始使用它了。我通常使用 Arch 阵营中 Manjaro 和 Cinnamon 桌面，所以使用 Lubuntu 对我来说是一个愉快的改变。

以下是我在使用 Lubuntu 20.04.时的一些感受和注记。

#### 再见 LXDE，你好 LXQt！

长期以来，[Lubuntu](https://lubuntu.me/) 都依靠 [LXDE](https://github.com/lxde) 来提供轻量级的 Linux 体验。但现在，它使用的是 LXQt 桌面环境。

[LXDE](https://lxde.org/) 是基于 GTK（GNOME 所使用的库），更具体地说是基于 2020 年的 GTK+ 2。由于对 GTK+ 3 不满意，LXDE 开发人员 Hong Jen Yee 决定将整个桌面移植到 Qt（KDE 所使用的库）。LXDE 的 Qt 移植版本和 [Razor-qt](https://web.archive.org/web/20160220061334/http://razor-qt.org/) 项目合并形成 [LXQt](https://lxqt.org/)。所以现在，LXDE 和 LXQt 作为单独的项目而共存。

既然 LXDE 开发者本身专注于 LXQt，那么 Lubuntu 坚持使用三年多前上一次稳定发布版的桌面环境 LXDE 是没有意义的。

因此，Lubuntu 18.04 是使用 [LXDE](https://lxde.org/) 的最后一个版本。幸运的是，这是一个长期支持版本。Lubuntu 团队将提供支持直到 2021 年。

![](/data/attachment/album/202005/23/133454ngy7a35ja5a73z5e.jpg)

#### 不仅适于老机器

随着在 2020 年“老机器”的定义发生了变化，Lubuntu 18.04 成为了最后一个 32 位版本。现在，即使是一台 10 年前的老机器也至少有 2G 的内存和一个双核 64 位处理器。

因此，Lubuntu 团队将不再设置最低的系统需求，也不再主要关注旧硬件。尽管 LXQt 仍然是一个轻量级的、经典而不失精致的、功能丰富的桌面环境。

在 Lubuntu 20.04 LTS 发布之前，Lubuntu 的第一个 LXQt 发行版是 18.10，开发人员经历了三个标准发行版来完善 LXQt 桌面，这是一个很好的开发策略。

#### 不用常规的 Ubiquity，Lubuntu 20.04 使用的是 Calamares 安装程序

![](/data/attachment/album/202005/23/133509wg8nmgfx9pnaugcg.jpg)

在新版本中使用了全新的 [Calamares](https://calamares.io/) 安装程序，取代了其它 [Ubuntu 官方版本](https://itsfoss.com/which-ubuntu-install/)使用的 Ubiquity 安装程序。

整个安装过程在大约能在 10 分钟内完成，比之前 Lubuntu 的版本稍微快一些。

由于镜像文件附带了预先安装的基本应用程序，所以你可以很快就可以完成系统的完全配置。

#### 不要直接从 Lubuntu 18.04 升级到 Lubuntu 20.04

通常，你可以[将 Ubuntu 从一个 LTS 版本升级到另一个 LTS 版本](https://itsfoss.com/upgrade-ubuntu-version/)。但是 Lubuntu 团队建议不要从 Lubuntu 18.04 升级到 20.04。他们建议重新安装，这才是正确的。

Lubuntu 18.04 使用 LXDE 桌面，20.04 使用 LXQt。由于桌面环境的巨大变化，从 18.04 升级到 20.04 将导致系统崩溃。

#### 更多的 KDE 和 Qt 应用程序

![](/data/attachment/album/202005/23/133546ytjfqniuacatucir.gif)

下面是在这个新版本中默认提供的一些应用程序，正如我们所看到的，并非所有应用程序都是轻量级的，而且大多数应用程序都是基于 Qt 的。

甚至使用的软件中心也是 KDE 的 Discover，而不是 Ubuntu 的 GNOME 软件中心。

* Ark – 归档文件管理器
* Bluedevil – 蓝牙连接管理
* Discover 软件中心 – 包管理系统
* FeatherPad – 文本编辑器
* FireFox – 浏览器
* K3b – CD/DVD 刻录器
* Kcalc – 计算器
* KDE 分区管理器 – 分区管理工具
* LibreOffice – 办公套件（Qt 界面版本）
* LXimage-Qt – 图片查看器及截图制作
* Muon – 包管理器
* Noblenote – 笔记工具
* PCManFM-Qt – 文件管理器
* Qlipper – 剪贴板管理工具
* qPDFview – PDF 阅读器
* PulseAudio – 音频控制器
* Qtransmission – BT 下载工具（Qt 界面版本）
* Quassel – IRC 客户端
* ScreenGrab – 截屏制作工具
* Skanlite – 扫描工具
* 启动盘创建工具 – USB 启动盘制作工具
* Trojita – 邮件客户端
* VLC – 媒体播放器
* [MPV 视频播放器](https://itsfoss.com/mpv-video-player/)

#### 测试 Lubuntu 20.04 LTS

LXQt 版 Lubuntu 的启动时间不到一分钟，虽然是从 SSD 启动的。

LXQt 目前需要的内存比基于 Gtk+ 2 的 LXDE 稍微多一点，但是另一种 Gtk+ 3 工具包也需要更多的内存。

在重新启动之后，系统以非常低的内存占用情况运行，大约只有 340 MB（按照现代标准），比 LXDE 多 100 MB。

![](/data/attachment/album/202005/23/133558asy8t83t74763a7a.jpg)

LXQt 不仅适用于硬件较旧的用户，也适用于那些希望在新机器上获得简约经典体验的用户。

桌面布局看起来类似于 KDE 的 Plasma 桌面，你觉得呢?

![](/data/attachment/album/202005/23/133612eszrsd3oocoendpu.jpg)

在左下角有一个应用程序菜单，一个用于显示固定和活动的应用程序的任务栏，右下角有一个系统托盘。

Lubuntu 的 LXQt 版本可以很容易的定制，所有的东西都在菜单的首选项下，大部分的关键项目都在 LXQt “设置”中。

值得一提的是，LXQt 在默认情况下使用流行的 [Openbox 窗口管理器](https://en.wikipedia.org/wiki/Openbox)。

与前三个发行版一样，20.04 LTS 附带了一个默认的黑暗主题 Lubuntu Arc，但是如果不适合你的口味，可以快速更换，也很方便。

就日常使用而言，事实证明，Lubuntu 20.04 向我证明，其实每一个 Ubuntu 的分支版本都完全没有问题。

#### 结论

Lubuntu 团队已经成功地过渡到一个现代的、依然轻量级的、极简的桌面环境。LXDE 看起来被遗弃了，迁移到一个活跃的项目也是一件好事。

我希望 Lubuntu 20.04 能够让你和我一样热爱，如果是这样，请在下面的评论中告诉我。请继续关注!

---

via: <https://itsfoss.com/lubuntu-20-04-review/>

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

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


新闻速读 > Twitter CEO：自动化会甚至会对编程工作构成威胁

Summary: • 多个 DNS 解析程序漏洞允许攻击者发动拒绝服务攻击 • GNOME 基金会和 RPI 的专利诉讼案达成和解 • 安全研究人员分析过去几年发生的开源软件供应链攻击 • 微软开源 1983 年的 GW-BASIC

![](/data/attachment/album/202005/23/150140tniu1p1sirpinbvi.jpg)

#### Twitter CEO：自动化会甚至会对编程工作构成威胁

Twitter CEO Jack Dorsey 表示，“机器学习和深度学习的许多目标是随着时间的发展编写软件本身，因此许多初级级编程工作将不再那么重要了，”

来源：[新浪科技](https://www.cnbeta.com/articles/tech/982339.htm)

>
> 硬核老王点评：毕竟“初级”编程工作也是要被取代的初级工种之一。
>
>
>

#### 多个 DNS 解析程序漏洞允许攻击者发动拒绝服务攻击

该漏洞被称为 NXNSAttack。DNS 解析程序不能向“名字”发送域名查询，因此解析器首先需要获得权威 DNS 服务器的 IPv4 或 IPv6 地址，之后才能继续查询域名。NXNSAttack 就是基于这一原理，攻击者发送的委托包含了假的权威服务器名字，指向受害者的 DNS 服务器，迫使解析程序对受害者的 DNS 服务器生成查询。一次查询会被放大数十次乃至数百次，对受害者服务器发动了拒绝服务攻击。众多 DNS 软件都受到影响，其中包括 BIND、 Unbound、PowerDNS、Cloudflare、Google、Amazon、Microsoft、Oracle（DYN）、Verisign、IBM Quad9 和 ICANN。

来源：[solidot](https://www.solidot.org/story?sid=64443)

>
> 硬核老王点评：互联网建设和设计之初，并没有考虑到这么复杂的安全隐患，或者说考虑到了在当时也只能暂时忽视。随着互联网的发展，这种早期的协议上的漏洞会逐一被发现、修补和迭代。
>
>
>

#### GNOME 基金会和 RPI 的专利诉讼案达成和解

去年 9 月，Rothschild Patent Imaging LLC（RPI）的公司对 GNOME 基金会提起了专利侵权诉讼，指控 GNOME 桌面环境项目中的一个组件 Shotwell 照片管理器侵犯了它于 2008 年申请的专利，该专利描述了无线连接图像捕捉设备和接收设备的系统和方法。现在，GNOME 与 RPI 达成和解，RPI 并承诺不再对 GNOME 提起任何专利诉讼。此外，RPI 和 Leigh Rothschild 的专利免除和承诺覆盖了在 OSI 批准的所有开源许可证下发布的软件。

来源：[solidot](https://www.solidot.org/story?sid=64439)

>
> 硬核老王点评：妄想从开源社区/开源组织身上咬下一块肉，先要看看是否能承受社会压力。
>
>
>

#### 安全研究人员分析过去几年发生的开源软件供应链攻击

软件供应链攻击有两类：其一是在软件产品中植入恶意代码去感染终端用户，此类攻击的一个例子是 CCleaner 的恶意版本通过官网传播给终端用户，它在长达一个多月时间里被下载了 230 万次。另一类软件供应链攻击是向软件产品的依赖包植入恶意代码。随着开源软件开发模式的流行，此类的攻击日益常见。研究人员分析了 npm、PyPI 和 RubyGems 软件包管理系统发现的 174 个恶意依赖包，他们发现 56% 的软件包在安装时触发恶意行为，41% 使用额外的条件去判断是否运行。61% 的恶意软件包利用了名字相似性向开源生态系统植入恶意包。攻击者的主要目的是析取数据。

来源：[solidot](https://www.solidot.org/story?sid=64445)

>
> 硬核老王点评：开源软件本身这个模式并不能决定是否安全，只是给用户一个安全的可能性。所以，在享受开源软件的福利时，其带来的可能的隐患也需要重视，并可能付出不菲的成本和代价。
>
>
>

#### 微软开源 1983 年的 GW-BASIC

微软在历史参考和教育目的的名义下开源了 1983 年的 GW-BASIC，源代码托管在 GitHub 上，采用 MIT 许可证。微软表示他们不接受修改任何代码的 PR 请求。GW-BASIC 是源自 IBM Advanced BASIC/BASICA 的 BASIC 解释器。微软不同的 BASIC 实现都可以上溯到比尔盖茨和保罗艾伦完成的微软首个产品：Altair 8800 BASIC 解释器。和 70/80 年代的众多软件一样，GW-BASIC 的源代码是百分之百的汇编语言。

来源：[solidot](https://www.solidot.org/story?sid=64444)

>
> 硬核老王点评：反正放家里也是烂着，就当成古董给大家把玩吧。
>
>
>


使用子模块和子树来管理 Git 项目

Summary: 使用子模块和子树来帮助你管理多个存储库中共有的子项目。

使用子模块和子树来帮助你管理多个存储库中共有的子项目。

>
> 使用子模块和子树来帮助你管理多个存储库中共有的子项目。
>
>
>

![](/data/attachment/album/202005/23/201323myyhob22eg2y2jqt.jpg)

如果你参与了开源项目的开发，那么你很可能已经用了 Git 来管理你的源码。你可能遇到过有很多依赖和/或子项目的项目。你是如何管理它们的？

对于一个开源组织，要实现社区**和**产品的单一来源文档和依赖管理比较棘手。文档和项目往往会碎片化和变得冗余，这致使它们很难维护。

### 必要性

假设你想把单个项目作为一个存储库内的子项目，传统的方法是把该项目复制到父存储库中，但是，如果你想要在多个父项目中使用同一个子项目呢？如果把子项目复制到所有父项目中，当有更新时，你都要在每个父项目中做修改，这是不太可行的。这会导致父项目中的冗余和数据不一致，使更新和维护子项目变得很困难。

### Git 子模块和子树

如果你可以用一条命令把一个项目放进另一个项目中，会怎样呢？如果你随时可以把一个项目作为子项目添加到任意数目的项目中，并可以同步更新修改呢？Git 提供了这类问题的解决方案：Git <ruby> 子模块 <rt>  submodule </rt></ruby>和 Git <ruby> 子树 <rt>  subtree </rt></ruby>。创建这些工具的目的是以更加模块化的水平来支持共用代码的开发工作流，旨在 Git 存储库<ruby> 源码管理 <rt>  source-code management </rt></ruby>（SCM）与它下面的子树之间架起一座桥梁。

![Cherry tree growing on a mulberry tree](/data/attachment/album/202005/23/201448jcxlcci1f1z4c2l2.jpg "Cherry tree growing on a mulberry tree")

*生长在桑树上的樱桃树*

下面是本文要详细介绍的概念的一个真实应用场景。如果你已经很熟悉树形结构，这个模型看起来是下面这样：

![Tree with subtrees](/data/attachment/album/202005/23/201451xllv5o14lc4344tp.png "Tree with subtrees")

### Git 子模块是什么？

Git 在它默认的包中提供了子模块，子模块可以把 Git 存储库嵌入到其他存储库中。确切地说，Git 子模块指向子树中的某次提交。下面是我 [Docs-test](https://github.com/manaswinidas/Docs-test/) GitHub 存储库中的 Git 子模块的样子：

![Git submodules screenshot](/data/attachment/album/202005/23/201452dliztziziialcmbq.png "Git submodules screenshot")

[文件夹@提交 Id](mailto:folder@commitId) 格式表明这个存储库是一个子模块，你可以直接点击文件夹进入该子树。名为 `.gitmodules` 的配置文件包含所有子模块存储库的详细信息。我的存储库的 `.gitmodules` 文件如下：

![Screenshot of .gitmodules file](/data/attachment/album/202005/23/201454khhen8n8cpe698hp.png "Screenshot of .gitmodules file")

你可以用下面的命令在你的存储库中使用 Git 子模块：

#### 克隆一个存储库并加载子模块

克隆一个含有子模块的存储库：

```
$ git clone --recursive <URL to Git repo>
```

如果你之前已经克隆了存储库，现在想加载它的子模块：

```
$ git submodule update --init
```

如果有嵌套的子模块：

```
$ git submodule update --init --recursive
```

#### 下载子模块

串行地连续下载多个子模块是很枯燥的工作，所以 `clone` 和 `submodule update` 会支持 `--jobs` （或 `-j`）参数：

例如，想一次下载 8 个子模块，使用：

```
$ git submodule update --init --recursive -j 8
$ git clone --recursive --jobs 8 <URL to Git repo>
```

#### 拉取子模块

在运行或构建父项目之前，你需要确保依赖的子项目都是最新的。

拉取子模块的所有修改：

```
$ git submodule update --remote
```

#### 使用子模块创建存储库：

向一个父存储库添加子树：

```
$ git submodule add <URL to Git repo>
```

初始化一个已存在的 Git 子模块：

```
$ git submodule init
```

你也可以通过为 `submodule update` 命令添加 `--update` 参数在子模块中创建分支和追踪提交：

```
$ git submodule update --remote
```

#### 更新子模块的提交

上面提到过，一个子模块就是一个指向子树中某次提交的链接。如果你想更新子模块的提交，不要担心。你不需要显式地指定最新的提交。你只需要使用通用的 `submodule update` 命令：

```
$ git submodule update
```

就像你平时创建父存储库和把父存储库推送到 GitHub 那样添加和提交就可以了。

#### 从一个父存储库中删除一个子模块

仅仅手动删除一个子项目文件夹不会从父项目中移除这个子项目。想要删除名为 `childmodule` 的子模块，使用：

```
$ git rm -f childmodule
```

虽然 Git 子模块看起来很容易上手，但是对于初学者来说，有一定的使用门槛。

### Git 子树是什么？

Git <ruby> 子树 <rt>  subtree </rt></ruby>，是在 Git 1.7.11 引入的，让你可以把任何存储库的副本作为子目录嵌入另一个存储库中。它是 Git 项目可以注入和管理项目依赖的几种方法之一。它在常规的提交中保存了外部依赖信息。Git 子树提供了整洁的集成点，因此很容易复原它们。

如果你参考 [GitHub 提供的子树教程](https://help.github.com/en/github/using-git/about-git-subtree-merges)来使用子树，那么无论你什么时候添加子树，在本地都不会看到 `.gittrees` 配置文件。这让我们很难分辨哪个是子树，因为它们看起来很像普通的文件夹，但是它们却是子树的副本。默认的 Git 包中不提供带 `.gittrees` 配置文件的 Git 子树版本，因此如果你想要带 `.gittrees` 配置文件的 git-subtree 命令，必须从 Git 源码存储库的 [/contrib/subtree 文件夹](https://github.com/git/git/tree/master/contrib/subtree) 下载 git-subtree。

你可以像克隆其他常规的存储库那样克隆任何含有子树的存储库，但由于在父存储库中有整个子树的副本，因此克隆过程可能会持续很长时间。

你可以用下面的命令在你的存储库中使用 Git 子树。

#### 向父存储库中添加一个子树

想要向父存储库中添加一个子树，首先你需要执行 `remote add`，之后执行 `subtree add` 命令：

```
$ git remote add remote-name <URL to Git repo>
$ git subtree add --prefix=folder/ remote-name <URL to Git repo> subtree-branchname
```

上面的命令会把整个子项目的提交历史合并到父存储库。

#### 向子树推送修改以及从子树拉取修改

```
$ git subtree push-all
```

或者

```
$ git subtree pull-all
```

### 你应该使用哪个？

任何工具都有优缺点。下面是一些可能会帮助你决定哪种最适合你的特性：

* Git 子模块的存储库占用空间更小，因为它们只是指向子项目的某次提交的链接，而 Git 子树保存了整个子项目及其提交历史。
* Git 子模块需要在服务器中可访问，但子树是去中心化的。
* Git 子模块大量用于基于组件的开发，而 Git 子树多用于基于系统的开发。

Git 子树并不是 Git 子模块的直接可替代项。有明确的说明来指导我们该使用哪种。如果有一个归属于你的外部存储库，使用场景是向它回推代码，那么就使用 Git 子模块，因为推送代码更容易。如果你有第三方代码，且不会向它推送代码，那么使用 Git 子树，因为拉取代码更容易。

自己尝试使用 Git 子树和子模块，然后在评论中留下你的使用感想。

---

via: <https://opensource.com/article/20/5/git-submodules-subtrees>

作者：[Manaswini Das](https://opensource.com/users/manaswinidas) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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