mirror of
https://github.com/LCTT/TranslateProject.git
synced 2026-08-20 03:53:30 +08:00
归档 201906
This commit is contained in:
@@ -0,0 +1,484 @@
|
||||
从零写一个时间序列数据库
|
||||
==================
|
||||
|
||||
编者按:Prometheus 是 CNCF 旗下的开源监控告警解决方案,它已经成为 Kubernetes 生态圈中的核心监控系统。本文作者 Fabian Reinartz 是 Prometheus 的核心开发者,这篇文章是其于 2017 年写的一篇关于 Prometheus 中的时间序列数据库的设计思考,虽然写作时间有点久了,但是其中的考虑和思路非常值得参考。长文预警,请坐下来慢慢品味。
|
||||
|
||||
---
|
||||
|
||||

|
||||
|
||||
我从事监控工作。特别是在 [Prometheus][2] 上,监控系统包含一个自定义的时间序列数据库,并且集成在 [Kubernetes][3] 上。
|
||||
|
||||
在许多方面上 Kubernetes 展现出了 Prometheus 所有的设计用途。它使得<ruby>持续部署<rt>continuous deployments</rt></ruby>,<ruby>弹性伸缩<rt>auto scaling</rt></ruby>和其他<ruby>高动态环境<rt>highly dynamic environments</rt></ruby>下的功能可以轻易地访问。查询语句和操作模型以及其它概念决策使得 Prometheus 特别适合这种环境。但是,如果监控的工作负载动态程度显著地增加,这就会给监控系统本身带来新的压力。考虑到这一点,我们就可以特别致力于在高动态或<ruby>瞬态服务<rt>transient services</rt></ruby>环境下提升它的表现,而不是回过头来解决 Prometheus 已经解决的很好的问题。
|
||||
|
||||
Prometheus 的存储层在历史以来都展现出卓越的性能,单一服务器就能够以每秒数百万个时间序列的速度摄入多达一百万个样本,同时只占用了很少的磁盘空间。尽管当前的存储做的很好,但我依旧提出一个新设计的存储子系统,它可以修正现存解决方案的缺点,并具备处理更大规模数据的能力。
|
||||
|
||||
> 备注:我没有数据库方面的背景。我说的东西可能是错的并让你误入歧途。你可以在 Freenode 的 #prometheus 频道上对我(fabxc)提出你的批评。
|
||||
|
||||
## 问题,难题,问题域
|
||||
|
||||
首先,快速地概览一下我们要完成的东西和它的关键难题。我们可以先看一下 Prometheus 当前的做法 ,它为什么做的这么好,以及我们打算用新设计解决哪些问题。
|
||||
|
||||
### 时间序列数据
|
||||
|
||||
我们有一个收集一段时间数据的系统。
|
||||
|
||||
```
|
||||
identifier -> (t0, v0), (t1, v1), (t2, v2), (t3, v3), ....
|
||||
```
|
||||
|
||||
每个数据点是一个时间戳和值的元组。在监控中,时间戳是一个整数,值可以是任意数字。64 位浮点数对于计数器和测量值来说是一个好的表示方法,因此我们将会使用它。一系列严格单调递增的时间戳数据点是一个序列,它由标识符所引用。我们的标识符是一个带有<ruby>标签维度<rt>label dimensions</rt></ruby>字典的度量名称。标签维度划分了单一指标的测量空间。每一个指标名称加上一个唯一标签集就成了它自己的时间序列,它有一个与之关联的<ruby>数据流<rt>value stream</rt></ruby>。
|
||||
|
||||
这是一个典型的<ruby>序列标识符<rt>series identifier</rt></ruby>集,它是统计请求指标的一部分:
|
||||
|
||||
```
|
||||
requests_total{path="/status", method="GET", instance=”10.0.0.1:80”}
|
||||
requests_total{path="/status", method="POST", instance=”10.0.0.3:80”}
|
||||
requests_total{path="/", method="GET", instance=”10.0.0.2:80”}
|
||||
```
|
||||
|
||||
让我们简化一下表示方法:度量名称可以当作另一个维度标签,在我们的例子中是 `__name__`。对于查询语句,可以对它进行特殊处理,但与我们存储的方式无关,我们后面也会见到。
|
||||
|
||||
```
|
||||
{__name__="requests_total", path="/status", method="GET", instance=”10.0.0.1:80”}
|
||||
{__name__="requests_total", path="/status", method="POST", instance=”10.0.0.3:80”}
|
||||
{__name__="requests_total", path="/", method="GET", instance=”10.0.0.2:80”}
|
||||
```
|
||||
|
||||
我们想通过标签来查询时间序列数据。在最简单的情况下,使用 `{__name__="requests_total"}` 选择所有属于 `requests_total` 指标的数据。对于所有选择的序列,我们在给定的时间窗口内获取数据点。
|
||||
|
||||
在更复杂的语句中,我们或许想一次性选择满足多个标签的序列,并且表示比相等条件更复杂的情况。例如,非语句(`method!="GET"`)或正则表达式匹配(`method=~"PUT|POST"`)。
|
||||
|
||||
这些在很大程度上定义了存储的数据和它的获取方式。
|
||||
|
||||
### 纵与横
|
||||
|
||||
在简化的视图中,所有的数据点可以分布在二维平面上。水平维度代表着时间,序列标识符域经纵轴展开。
|
||||
|
||||
```
|
||||
series
|
||||
^
|
||||
| . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="GET"}
|
||||
| . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="POST"}
|
||||
| . . . . . . .
|
||||
| . . . . . . . . . . . . . . . . . . . ...
|
||||
| . . . . . . . . . . . . . . . . . . . . .
|
||||
| . . . . . . . . . . . . . . . . . . . . . {__name__="errors_total", method="POST"}
|
||||
| . . . . . . . . . . . . . . . . . {__name__="errors_total", method="GET"}
|
||||
| . . . . . . . . . . . . . .
|
||||
| . . . . . . . . . . . . . . . . . . . ...
|
||||
| . . . . . . . . . . . . . . . . . . . .
|
||||
v
|
||||
<-------------------- time --------------------->
|
||||
```
|
||||
|
||||
Prometheus 通过定期地抓取一组时间序列的当前值来获取数据点。我们从中获取到的实体称为目标。因此,写入模式完全地垂直且高度并发,因为来自每个目标的样本是独立摄入的。
|
||||
|
||||
这里提供一些测量的规模:单一 Prometheus 实例从数万个目标中收集数据点,每个数据点都暴露在数百到数千个不同的时间序列中。
|
||||
|
||||
在每秒采集数百万数据点这种规模下,批量写入是一个不能妥协的性能要求。在磁盘上分散地写入单个数据点会相当地缓慢。因此,我们想要按顺序写入更大的数据块。
|
||||
|
||||
对于旋转式磁盘,它的磁头始终得在物理上向不同的扇区上移动,这是一个不足为奇的事实。而虽然我们都知道 SSD 具有快速随机写入的特点,但事实上它不能修改单个字节,只能写入一页或更多页的 4KiB 数据量。这就意味着写入 16 字节的样本相当于写入满满一个 4Kib 的页。这一行为就是所谓的[写入放大][4],这种特性会损耗你的 SSD。因此它不仅影响速度,而且还毫不夸张地在几天或几个周内破坏掉你的硬件。
|
||||
|
||||
关于此问题更深层次的资料,[“Coding for SSDs”系列][5]博客是极好的资源。让我们想想主要的用处:顺序写入和批量写入分别对于旋转式磁盘和 SSD 来说都是理想的写入模式。大道至简。
|
||||
|
||||
查询模式比起写入模式明显更不同。我们可以查询单一序列的一个数据点,也可以对 10000 个序列查询一个数据点,还可以查询一个序列几个周的数据点,甚至是 10000 个序列几个周的数据点。因此在我们的二维平面上,查询范围不是完全水平或垂直的,而是二者形成矩形似的组合。
|
||||
|
||||
[记录规则][6]可以减轻已知查询的问题,但对于<ruby>点对点<rt>ad-hoc</rt></ruby>查询来说并不是一个通用的解决方法。
|
||||
|
||||
我们知道我们想要批量地写入,但我们得到的仅仅是一系列垂直数据点的集合。当查询一段时间窗口内的数据点时,我们不仅很难弄清楚在哪才能找到这些单独的点,而且不得不从磁盘上大量随机的地方读取。也许一条查询语句会有数百万的样本,即使在最快的 SSD 上也会很慢。读入也会从磁盘上获取更多的数据而不仅仅是 16 字节的样本。SSD 会加载一整页,HDD 至少会读取整个扇区。不论哪一种,我们都在浪费宝贵的读取吞吐量。
|
||||
|
||||
因此在理想情况下,同一序列的样本将按顺序存储,这样我们就能通过尽可能少的读取来扫描它们。最重要的是,我们仅需要知道序列的起始位置就能访问所有的数据点。
|
||||
|
||||
显然,将收集到的数据写入磁盘的理想模式与能够显著提高查询效率的布局之间存在着明显的抵触。这是我们 TSDB 需要解决的一个基本问题。
|
||||
|
||||
#### 当前的解决方法
|
||||
|
||||
是时候看一下当前 Prometheus 是如何存储数据来解决这一问题的,让我们称它为“V2”。
|
||||
|
||||
我们创建一个时间序列的文件,它包含所有样本并按顺序存储。因为每几秒附加一个样本数据到所有文件中非常昂贵,我们在内存中打包 1Kib 样本序列的数据块,一旦打包完成就附加这些数据块到单独的文件中。这一方法解决了大部分问题。写入目前是批量的,样本也是按顺序存储的。基于给定的同一序列的样本相对之前的数据仅发生非常小的改变这一特性,它还支持非常高效的压缩格式。Facebook 在他们 Gorilla TSDB 上的论文中描述了一个相似的基于数据块的方法,并且[引入了一种压缩格式][7],它能够减少 16 字节的样本到平均 1.37 字节。V2 存储使用了包含 Gorilla 变体等在内的各种压缩格式。
|
||||
|
||||
```
|
||||
+----------+---------+---------+---------+---------+ series A
|
||||
+----------+---------+---------+---------+---------+
|
||||
+----------+---------+---------+---------+---------+ series B
|
||||
+----------+---------+---------+---------+---------+
|
||||
. . .
|
||||
+----------+---------+---------+---------+---------+---------+ series XYZ
|
||||
+----------+---------+---------+---------+---------+---------+
|
||||
chunk 1 chunk 2 chunk 3 ...
|
||||
```
|
||||
|
||||
尽管基于块存储的方法非常棒,但为每个序列保存一个独立的文件会给 V2 存储带来麻烦,因为:
|
||||
|
||||
* 实际上,我们需要的文件比当前收集数据的时间序列数量要多得多。多出的部分在<ruby>序列分流<rt>Series Churn</rt></ruby>上。有几百万个文件,迟早会使用光文件系统中的 [inode][1]。这种情况我们只能通过重新格式化来恢复磁盘,这种方式是最具有破坏性的。我们通常不想为了适应一个应用程序而格式化磁盘。
|
||||
* 即使是分块写入,每秒也会产生数千块的数据块并且准备持久化。这依然需要每秒数千次的磁盘写入。尽管通过为每个序列打包好多个块来缓解,但这反过来还是增加了等待持久化数据的总内存占用。
|
||||
* 要保持所有文件打开来进行读写是不可行的。特别是因为 99% 的数据在 24 小时之后不再会被查询到。如果查询它,我们就得打开数千个文件,找到并读取相关的数据点到内存中,然后再关掉。这样做就会引起很高的查询延迟,数据块缓存加剧会导致新的问题,这一点在“资源消耗”一节另作讲述。
|
||||
* 最终,旧的数据需要被删除,并且数据需要从数百万文件的头部删除。这就意味着删除实际上是写密集型操作。此外,循环遍历数百万文件并且进行分析通常会导致这一过程花费数小时。当它完成时,可能又得重新来过。喔天,继续删除旧文件又会进一步导致 SSD 产生写入放大。
|
||||
* 目前所积累的数据块仅维持在内存中。如果应用崩溃,数据就会丢失。为了避免这种情况,内存状态会定期的保存在磁盘上,这比我们能接受数据丢失窗口要长的多。恢复检查点也会花费数分钟,导致很长的重启周期。
|
||||
|
||||
我们能够从现有的设计中学到的关键部分是数据块的概念,我们当然希望保留这个概念。最新的数据块会保持在内存中一般也是好的主意。毕竟,最新的数据会大量的查询到。
|
||||
|
||||
一个时间序列对应一个文件,这个概念是我们想要替换掉的。
|
||||
|
||||
### 序列分流
|
||||
|
||||
在 Prometheus 的<ruby>上下文<rt>context</rt></ruby>中,我们使用术语<ruby>序列分流<rt>series churn</rt></ruby>来描述一个时间序列集合变得不活跃,即不再接收数据点,取而代之的是出现一组新的活跃序列。
|
||||
|
||||
例如,由给定微服务实例产生的所有序列都有一个相应的“instance”标签来标识其来源。如果我们为微服务执行了<ruby>滚动更新<rt>rolling update</rt></ruby>,并且为每个实例替换一个新的版本,序列分流便会发生。在更加动态的环境中,这些事情基本上每小时都会发生。像 Kubernetes 这样的<ruby>集群编排<rt>Cluster orchestration</rt></ruby>系统允许应用连续性的自动伸缩和频繁的滚动更新,这样也许会创建成千上万个新的应用程序实例,并且伴随着全新的时间序列集合,每天都是如此。
|
||||
|
||||
```
|
||||
series
|
||||
^
|
||||
| . . . . . .
|
||||
| . . . . . .
|
||||
| . . . . . .
|
||||
| . . . . . . .
|
||||
| . . . . . . .
|
||||
| . . . . . . .
|
||||
| . . . . . .
|
||||
| . . . . . .
|
||||
| . . . . .
|
||||
| . . . . .
|
||||
| . . . . .
|
||||
v
|
||||
<-------------------- time --------------------->
|
||||
```
|
||||
|
||||
所以即便整个基础设施的规模基本保持不变,过一段时间后数据库内的时间序列还是会成线性增长。尽管 Prometheus 很愿意采集 1000 万个时间序列数据,但要想在 10 亿个序列中找到数据,查询效果还是会受到严重的影响。
|
||||
|
||||
#### 当前解决方案
|
||||
|
||||
当前 Prometheus 的 V2 存储系统对所有当前保存的序列拥有基于 LevelDB 的索引。它允许查询语句含有给定的<ruby>标签对<rt>label pair</rt></ruby>,但是缺乏可伸缩的方法来从不同的标签选集中组合查询结果。
|
||||
|
||||
例如,从所有的序列中选择标签 `__name__="requests_total"` 非常高效,但是选择 `instance="A" AND __name__="requests_total"` 就有了可伸缩性的问题。我们稍后会重新考虑导致这一点的原因和能够提升查找延迟的调整方法。
|
||||
|
||||
事实上正是这个问题才催生出了对更好的存储系统的最初探索。Prometheus 需要为查找亿万个时间序列改进索引方法。
|
||||
|
||||
### 资源消耗
|
||||
|
||||
当试图扩展 Prometheus(或其他任何事情,真的)时,资源消耗是永恒不变的话题之一。但真正困扰用户的并不是对资源的绝对渴求。事实上,由于给定的需求,Prometheus 管理着令人难以置信的吞吐量。问题更在于面对变化时的相对未知性与不稳定性。通过其架构设计,V2 存储系统缓慢地构建了样本数据块,这一点导致内存占用随时间递增。当数据块完成之后,它们可以写到磁盘上并从内存中清除。最终,Prometheus 的内存使用到达稳定状态。直到监测环境发生了改变——每次我们扩展应用或者进行滚动更新,序列分流都会增加内存、CPU、磁盘 I/O 的使用。
|
||||
|
||||
如果变更正在进行,那么它最终还是会到达一个稳定的状态,但比起更加静态的环境,它的资源消耗会显著地提高。过渡时间通常为数个小时,而且难以确定最大资源使用量。
|
||||
|
||||
为每个时间序列保存一个文件这种方法也使得一个单个查询就很容易崩溃 Prometheus 进程。当查询的数据没有缓存在内存中,查询的序列文件就会被打开,然后将含有相关数据点的数据块读入内存。如果数据量超出内存可用量,Prometheus 就会因 OOM 被杀死而退出。
|
||||
|
||||
在查询语句完成之后,加载的数据便可以被再次释放掉,但通常会缓存更长的时间,以便更快地查询相同的数据。后者看起来是件不错的事情。
|
||||
|
||||
最后,我们看看之前提到的 SSD 的写入放大,以及 Prometheus 是如何通过批量写入来解决这个问题的。尽管如此,在许多地方还是存在因为批量太小以及数据未精确对齐页边界而导致的写入放大。对于更大规模的 Prometheus 服务器,现实当中会发现缩减硬件寿命的问题。这一点对于高写入吞吐量的数据库应用来说仍然相当普遍,但我们应该放眼看看是否可以解决它。
|
||||
|
||||
### 重新开始
|
||||
|
||||
到目前为止我们对于问题域、V2 存储系统是如何解决它的,以及设计上存在的问题有了一个清晰的认识。我们也看到了许多很棒的想法,这些或多或少都可以拿来直接使用。V2 存储系统相当数量的问题都可以通过改进和部分的重新设计来解决,但为了好玩(当然,在我仔细的验证想法之后),我决定试着写一个完整的时间序列数据库——从头开始,即向文件系统写入字节。
|
||||
|
||||
性能与资源使用这种最关键的部分直接影响了存储格式的选取。我们需要为数据找到正确的算法和磁盘布局来实现一个高性能的存储层。
|
||||
|
||||
这就是我解决问题的捷径——跳过令人头疼、失败的想法,数不尽的草图,泪水与绝望。
|
||||
|
||||
### V3—宏观设计
|
||||
|
||||
我们存储系统的宏观布局是什么?简而言之,是当我们在数据文件夹里运行 `tree` 命令时显示的一切。看看它能给我们带来怎样一副惊喜的画面。
|
||||
|
||||
```
|
||||
$ tree ./data
|
||||
./data
|
||||
+-- b-000001
|
||||
| +-- chunks
|
||||
| | +-- 000001
|
||||
| | +-- 000002
|
||||
| | +-- 000003
|
||||
| +-- index
|
||||
| +-- meta.json
|
||||
+-- b-000004
|
||||
| +-- chunks
|
||||
| | +-- 000001
|
||||
| +-- index
|
||||
| +-- meta.json
|
||||
+-- b-000005
|
||||
| +-- chunks
|
||||
| | +-- 000001
|
||||
| +-- index
|
||||
| +-- meta.json
|
||||
+-- b-000006
|
||||
+-- meta.json
|
||||
+-- wal
|
||||
+-- 000001
|
||||
+-- 000002
|
||||
+-- 000003
|
||||
```
|
||||
|
||||
在最顶层,我们有一系列以 `b-` 为前缀编号的<ruby>块<rt>block</rt></ruby>。每个块中显然保存了索引文件和含有更多编号文件的 `chunk` 文件夹。`chunks` 目录只包含不同序列<ruby>数据点的原始块<rt>raw chunks of data points</rt><ruby>。与 V2 存储系统一样,这使得通过时间窗口读取序列数据非常高效并且允许我们使用相同的有效压缩算法。这一点被证实行之有效,我们也打算沿用。显然,这里并不存在含有单个序列的文件,而是一堆保存着许多序列的数据块。
|
||||
|
||||
`index` 文件的存在应该不足为奇。让我们假设它拥有黑魔法,可以让我们找到标签、可能的值、整个时间序列和存放数据点的数据块。
|
||||
|
||||
但为什么这里有好几个文件夹都是索引和块文件的布局?并且为什么存在最后一个包含 `wal` 文件夹?理解这两个疑问便能解决九成的问题。
|
||||
|
||||
#### 许多小型数据库
|
||||
|
||||
我们分割横轴,即将时间域分割为不重叠的块。每一块扮演着完全独立的数据库,它包含该时间窗口所有的时间序列数据。因此,它拥有自己的索引和一系列块文件。
|
||||
|
||||
```
|
||||
|
||||
t0 t1 t2 t3 now
|
||||
+-----------+ +-----------+ +-----------+ +-----------+
|
||||
| | | | | | | | +------------+
|
||||
| | | | | | | mutable | <--- write ---- ┤ Prometheus |
|
||||
| | | | | | | | +------------+
|
||||
+-----------+ +-----------+ +-----------+ +-----------+ ^
|
||||
+--------------+-------+------+--------------+ |
|
||||
| query
|
||||
| |
|
||||
merge -------------------------------------------------+
|
||||
```
|
||||
|
||||
每一块的数据都是<ruby>不可变的<rt>immutable</rt></ruby>。当然,当我们采集新数据时,我们必须能向最近的块中添加新的序列和样本。对于该数据块,所有新的数据都将写入内存中的数据库中,它与我们的持久化的数据块一样提供了查找属性。内存中的数据结构可以高效地更新。为了防止数据丢失,所有传入的数据同样被写入临时的<ruby>预写日志<rt>write ahead log</rt></ruby>中,这就是 `wal` 文件夹中的一些列文件,我们可以在重新启动时通过它们重新填充内存数据库。
|
||||
|
||||
所有这些文件都带有序列化格式,有我们所期望的所有东西:许多标志、偏移量、变体和 CRC32 校验和。纸上得来终觉浅,绝知此事要躬行。
|
||||
|
||||
这种布局允许我们扩展查询范围到所有相关的块上。每个块上的部分结果最终合并成完整的结果。
|
||||
|
||||
这种横向分割增加了一些很棒的功能:
|
||||
|
||||
* 当查询一个时间范围,我们可以简单地忽略所有范围之外的数据块。通过减少需要检查的数据集,它可以初步解决序列分流的问题。
|
||||
* 当完成一个块,我们可以通过顺序的写入大文件从内存数据库中保存数据。这样可以避免任何的写入放大,并且 SSD 与 HDD 均适用。
|
||||
* 我们延续了 V2 存储系统的一个好的特性,最近使用而被多次查询的数据块,总是保留在内存中。
|
||||
* 很好,我们也不再受限于 1KiB 的数据块尺寸,以使数据在磁盘上更好地对齐。我们可以挑选对单个数据点和压缩格式最合理的尺寸。
|
||||
* 删除旧数据变得极为简单快捷。我们仅仅只需删除一个文件夹。记住,在旧的存储系统中我们不得不花数个小时分析并重写数亿个文件。
|
||||
|
||||
每个块还包含了 `meta.json` 文件。它简单地保存了关于块的存储状态和包含的数据,以便轻松了解存储状态及其包含的数据。
|
||||
|
||||
##### mmap
|
||||
|
||||
将数百万个小文件合并为少数几个大文件使得我们用很小的开销就能保持所有的文件都打开。这就解除了对 [mmap(2)][8] 的使用的阻碍,这是一个允许我们通过文件透明地回传虚拟内存的系统调用。简单起见,你可以将其视为<ruby>交换空间<rt>swap space</rt></ruby>,只是我们所有的数据已经保存在了磁盘上,并且当数据换出内存后不再会发生写入。
|
||||
|
||||
这意味着我们可以当作所有数据库的内容都视为在内存中却不占用任何物理内存。仅当我们访问数据库文件某些字节范围时,操作系统才会从磁盘上<ruby>惰性加载<rt>lazy load</rt></ruby>页数据。这使得我们将所有数据持久化相关的内存管理都交给了操作系统。通常,操作系统更有资格作出这样的决定,因为它可以全面了解整个机器和进程。查询的数据可以相当积极的缓存进内存,但内存压力会使得页被换出。如果机器拥有未使用的内存,Prometheus 目前将会高兴地缓存整个数据库,但是一旦其他进程需要,它就会立刻返回那些内存。
|
||||
|
||||
因此,查询不再轻易地使我们的进程 OOM,因为查询的是更多的持久化的数据而不是装入内存中的数据。内存缓存大小变得完全自适应,并且仅当查询真正需要时数据才会被加载。
|
||||
|
||||
就个人理解,这就是当今大多数数据库的工作方式,如果磁盘格式允许,这是一种理想的方式,——除非有人自信能在这个过程中超越操作系统。我们做了很少的工作但确实从外面获得了很多功能。
|
||||
|
||||
#### 压缩
|
||||
|
||||
存储系统需要定期“切”出新块并将之前完成的块写入到磁盘中。仅在块成功的持久化之后,才会被删除之前用来恢复内存块的日志文件(wal)。
|
||||
|
||||
我们希望将每个块的保存时间设置的相对短一些(通常配置为 2 小时),以避免内存中积累太多的数据。当查询多个块,我们必须将它们的结果合并为一个整体的结果。合并过程显然会消耗资源,一个星期的查询不应该由超过 80 个的部分结果所组成。
|
||||
|
||||
为了实现两者,我们引入<ruby>压缩<rt>compaction</rt></ruby>。压缩描述了一个过程:取一个或更多个数据块并将其写入一个可能更大的块中。它也可以在此过程中修改现有的数据。例如,清除已经删除的数据,或重建样本块以提升查询性能。
|
||||
|
||||
```
|
||||
|
||||
t0 t1 t2 t3 t4 now
|
||||
+------------+ +----------+ +-----------+ +-----------+ +-----------+
|
||||
| 1 | | 2 | | 3 | | 4 | | 5 mutable | before
|
||||
+------------+ +----------+ +-----------+ +-----------+ +-----------+
|
||||
+-----------------------------------------+ +-----------+ +-----------+
|
||||
| 1 compacted | | 4 | | 5 mutable | after (option A)
|
||||
+-----------------------------------------+ +-----------+ +-----------+
|
||||
+--------------------------+ +--------------------------+ +-----------+
|
||||
| 1 compacted | | 3 compacted | | 5 mutable | after (option B)
|
||||
+--------------------------+ +--------------------------+ +-----------+
|
||||
```
|
||||
|
||||
在这个例子中我们有顺序块 `[1,2,3,4]`。块 1、2、3 可以压缩在一起,新的布局将会是 `[1,4]`。或者,将它们成对压缩为 `[1,3]`。所有的时间序列数据仍然存在,但现在整体上保存在更少的块中。这极大程度地缩减了查询时间的消耗,因为需要合并的部分查询结果变得更少了。
|
||||
|
||||
#### 保留
|
||||
|
||||
我们看到了删除旧的数据在 V2 存储系统中是一个缓慢的过程,并且消耗 CPU、内存和磁盘。如何才能在我们基于块的设计上清除旧的数据?相当简单,只要删除我们配置的保留时间窗口里没有数据的块文件夹即可。在下面的例子中,块 1 可以被安全地删除,而块 2 则必须一直保留,直到它落在保留窗口边界之外。
|
||||
|
||||
```
|
||||
|
|
||||
+------------+ +----+-----+ +-----------+ +-----------+ +-----------+
|
||||
| 1 | | 2 | | | 3 | | 4 | | 5 | . . .
|
||||
+------------+ +----+-----+ +-----------+ +-----------+ +-----------+
|
||||
|
|
||||
|
|
||||
retention boundary
|
||||
```
|
||||
|
||||
随着我们不断压缩先前压缩的块,旧数据越大,块可能变得越大。因此必须为其设置一个上限,以防数据块扩展到整个数据库而损失我们设计的最初优势。
|
||||
|
||||
方便的是,这一点也限制了部分存在于保留窗口内部分存在于保留窗口外的块的磁盘消耗总量。例如上面例子中的块 2。当设置了最大块尺寸为总保留窗口的 10% 后,我们保留块 2 的总开销也有了 10% 的上限。
|
||||
|
||||
总结一下,保留与删除从非常昂贵到了几乎没有成本。
|
||||
|
||||
> 如果你读到这里并有一些数据库的背景知识,现在你也许会问:这些都是最新的技术吗?——并不是;而且可能还会做的更好。
|
||||
>
|
||||
> 在内存中批量处理数据,在预写日志中跟踪,并定期写入到磁盘的模式在现在相当普遍。
|
||||
>
|
||||
> 我们看到的好处无论在什么领域的数据里都是适用的。遵循这一方法最著名的开源案例是 LevelDB、Cassandra、InfluxDB 和 HBase。关键是避免重复发明劣质的轮子,采用经过验证的方法,并正确地运用它们。
|
||||
>
|
||||
> 脱离场景添加你自己的黑魔法是一种不太可能的情况。
|
||||
|
||||
### 索引
|
||||
|
||||
研究存储改进的最初想法是解决序列分流的问题。基于块的布局减少了查询所要考虑的序列总数。因此假设我们索引查找的复杂度是 `O(n^2)`,我们就要设法减少 n 个相当数量的复杂度,之后就相当于改进 `O(n^2)` 复杂度。——恩,等等……糟糕。
|
||||
|
||||
快速回顾一下“算法 101”课上提醒我们的,在理论上它并未带来任何好处。如果之前就很糟糕,那么现在也一样。理论是如此的残酷。
|
||||
|
||||
实际上,我们大多数的查询已经可以相当快响应。但是,跨越整个时间范围的查询仍然很慢,尽管只需要找到少部分数据。追溯到所有这些工作之前,最初我用来解决这个问题的想法是:我们需要一个更大容量的[倒排索引][9]。
|
||||
|
||||
倒排索引基于数据项内容的子集提供了一种快速的查找方式。简单地说,我可以通过标签 `app="nginx"` 查找所有的序列而无需遍历每个文件来看它是否包含该标签。
|
||||
|
||||
为此,每个序列被赋上一个唯一的 ID ,通过该 ID 可以恒定时间内检索它(`O(1)`)。在这个例子中 ID 就是我们的正向索引。
|
||||
|
||||
> 示例:如果 ID 为 10、29、9 的序列包含标签 `app="nginx"`,那么 “nginx”的倒排索引就是简单的列表 `[10, 29, 9]`,它就能用来快速地获取所有包含标签的序列。即使有 200 多亿个数据序列也不会影响查找速度。
|
||||
|
||||
简而言之,如果 `n` 是我们序列总数,`m` 是给定查询结果的大小,使用索引的查询复杂度现在就是 `O(m)`。查询语句依据它获取数据的数量 `m` 而不是被搜索的数据体 `n` 进行缩放是一个很好的特性,因为 `m` 一般相当小。
|
||||
|
||||
为了简单起见,我们假设可以在恒定时间内查找到倒排索引对应的列表。
|
||||
|
||||
实际上,这几乎就是 V2 存储系统具有的倒排索引,也是提供在数百万序列中查询性能的最低需求。敏锐的人会注意到,在最坏情况下,所有的序列都含有标签,因此 `m` 又成了 `O(n)`。这一点在预料之中,也相当合理。如果你查询所有的数据,它自然就会花费更多时间。一旦我们牵扯上了更复杂的查询语句就会有问题出现。
|
||||
|
||||
#### 标签组合
|
||||
|
||||
与数百万个序列相关的标签很常见。假设横向扩展着数百个实例的“foo”微服务,并且每个实例拥有数千个序列。每个序列都会带有标签 `app="foo"`。当然,用户通常不会查询所有的序列而是会通过进一步的标签来限制查询。例如,我想知道服务实例接收到了多少请求,那么查询语句便是 `__name__="requests_total" AND app="foo"`。
|
||||
|
||||
为了找到满足两个标签选择子的所有序列,我们得到每一个标签的倒排索引列表并取其交集。结果集通常会比任何一个输入列表小一个数量级。因为每个输入列表最坏情况下的大小为 `O(n)`,所以在嵌套地为每个列表进行<ruby>暴力求解<rt>brute force solution</rt><ruby>下,运行时间为 `O(n^2)`。相同的成本也适用于其他的集合操作,例如取并集(`app="foo" OR app="bar"`)。当在查询语句上添加更多标签选择子,耗费就会指数增长到 `O(n^3)`、`O(n^4)`、`O(n^5)`……`O(n^k)`。通过改变执行顺序,可以使用很多技巧以优化运行效率。越复杂,越是需要关于数据特征和标签之间相关性的知识。这引入了大量的复杂度,但是并没有减少算法的最坏运行时间。
|
||||
|
||||
这便是 V2 存储系统使用的基本方法,幸运的是,看似微小的改动就能获得显著的提升。如果我们假设倒排索引中的 ID 都是排序好的会怎么样?
|
||||
|
||||
假设这个例子的列表用于我们最初的查询:
|
||||
|
||||
```
|
||||
__name__="requests_total" -> [ 9999, 1000, 1001, 2000000, 2000001, 2000002, 2000003 ]
|
||||
app="foo" -> [ 1, 3, 10, 11, 12, 100, 311, 320, 1000, 1001, 10002 ]
|
||||
|
||||
intersection => [ 1000, 1001 ]
|
||||
```
|
||||
|
||||
它的交集相当小。我们可以为每个列表的起始位置设置游标,每次从最小的游标处移动来找到交集。当二者的数字相等,我们就添加它到结果中并移动二者的游标。总体上,我们以锯齿形扫描两个列表,因此总耗费是 `O(2n)=O(n)`,因为我们总是在一个列表上移动。
|
||||
|
||||
两个以上列表的不同集合操作也类似。因此 `k` 个集合操作仅仅改变了因子 `O(k*n)` 而不是最坏情况下查找运行时间的指数 `O(n^k)`。
|
||||
|
||||
我在这里所描述的是几乎所有[全文搜索引擎][10]使用的标准搜索索引的简化版本。每个序列描述符都视作一个简短的“文档”,每个标签(名称 + 固定值)作为其中的“单词”。我们可以忽略搜索引擎索引中通常遇到的很多附加数据,例如单词位置和和频率。
|
||||
|
||||
关于改进实际运行时间的方法似乎存在无穷无尽的研究,它们通常都是对输入数据做一些假设。不出意料的是,还有大量技术来压缩倒排索引,其中各有利弊。因为我们的“文档”比较小,而且“单词”在所有的序列里大量重复,压缩变得几乎无关紧要。例如,一个真实的数据集约有 440 万个序列与大约 12 个标签,每个标签拥有少于 5000 个单独的标签。对于最初的存储版本,我们坚持使用基本的方法而不压缩,仅做微小的调整来跳过大范围非交叉的 ID。
|
||||
|
||||
尽管维持排序好的 ID 听起来很简单,但实践过程中不是总能完成的。例如,V2 存储系统为新的序列赋上一个哈希值来当作 ID,我们就不能轻易地排序倒排索引。
|
||||
|
||||
另一个艰巨的任务是当磁盘上的数据被更新或删除掉后修改其索引。通常,最简单的方法是重新计算并写入,但是要保证数据库在此期间可查询且具有一致性。V3 存储系统通过每块上具有的独立不可变索引来解决这一问题,该索引仅通过压缩时的重写来进行修改。只有可变块上的索引需要被更新,它完全保存在内存中。
|
||||
|
||||
## 基准测试
|
||||
|
||||
我从存储的基准测试开始了初步的开发,它基于现实世界数据集中提取的大约 440 万个序列描述符,并生成合成数据点以输入到这些序列中。这个阶段的开发仅仅测试了单独的存储系统,对于快速找到性能瓶颈和高并发负载场景下的触发死锁至关重要。
|
||||
|
||||
在完成概念性的开发实施之后,该基准测试能够在我的 Macbook Pro 上维持每秒 2000 万的吞吐量 —— 并且这都是在打开着十几个 Chrome 的页面和 Slack 的时候。因此,尽管这听起来都很棒,它这也表明推动这项测试没有的进一步价值(或者是没有在高随机环境下运行)。毕竟,它是合成的数据,因此在除了良好的第一印象外没有多大价值。比起最初的设计目标高出 20 倍,是时候将它部署到真正的 Prometheus 服务器上了,为它添加更多现实环境中的开销和场景。
|
||||
|
||||
我们实际上没有可重现的 Prometheus 基准测试配置,特别是没有对于不同版本的 A/B 测试。亡羊补牢为时不晚,[不过现在就有一个了][11]!
|
||||
|
||||
我们的工具可以让我们声明性地定义基准测试场景,然后部署到 AWS 的 Kubernetes 集群上。尽管对于全面的基准测试来说不是最好环境,但它肯定比 64 核 128GB 内存的专用<ruby>裸机服务器<rt>bare metal servers</rt></ruby>更能反映出我们的用户群体。
|
||||
|
||||
我们部署了两个 Prometheus 1.5.2 服务器(V2 存储系统)和两个来自 2.0 开发分支的 Prometheus (V3 存储系统)。每个 Prometheus 运行在配备 SSD 的专用服务器上。我们将横向扩展的应用部署在了工作节点上,并且让其暴露典型的微服务度量。此外,Kubernetes 集群本身和节点也被监控着。整套系统由另一个 Meta-Prometheus 所监督,它监控每个 Prometheus 的健康状况和性能。
|
||||
|
||||
为了模拟序列分流,微服务定期的扩展和收缩来移除旧的 pod 并衍生新的 pod,生成新的序列。通过选择“典型”的查询来模拟查询负载,对每个 Prometheus 版本都执行一次。
|
||||
|
||||
总体上,伸缩与查询的负载以及采样频率极大的超出了 Prometheus 的生产部署。例如,我们每隔 15 分钟换出 60% 的微服务实例去产生序列分流。在现代的基础设施上,一天仅大约会发生 1-5 次。这就保证了我们的 V3 设计足以处理未来几年的工作负载。就结果而言,Prometheus 1.5.2 和 2.0 之间的性能差异在极端的环境下会变得更大。
|
||||
|
||||
总而言之,我们每秒从 850 个目标里收集大约 11 万份样本,每次暴露 50 万个序列。
|
||||
|
||||
在此系统运行一段时间之后,我们可以看一下数字。我们评估了两个版本在 12 个小时之后到达稳定时的几个指标。
|
||||
|
||||
> 请注意从 Prometheus 图形界面的截图中轻微截断的 Y 轴
|
||||
|
||||

|
||||
|
||||
*堆内存使用(GB)*
|
||||
|
||||
内存资源的使用对用户来说是最为困扰的问题,因为它相对的不可预测且可能导致进程崩溃。
|
||||
|
||||
显然,查询的服务器正在消耗内存,这很大程度上归咎于查询引擎的开销,这一点可以当作以后优化的主题。总的来说,Prometheus 2.0 的内存消耗减少了 3-4 倍。大约 6 小时之后,在 Prometheus 1.5 上有一个明显的峰值,与我们设置的 6 小时的保留边界相对应。因为删除操作成本非常高,所以资源消耗急剧提升。这一点在下面几张图中均有体现。
|
||||
|
||||

|
||||
|
||||
*CPU 使用(核心/秒)*
|
||||
|
||||
类似的模式也体现在 CPU 使用上,但是查询的服务器与非查询的服务器之间的差异尤为明显。每秒获取大约 11 万个数据需要 0.5 核心/秒的 CPU 资源,比起评估查询所花费的 CPU 时间,我们的新存储系统 CPU 消耗可忽略不计。总的来说,新存储需要的 CPU 资源减少了 3 到 10 倍。
|
||||
|
||||

|
||||
|
||||
*磁盘写入(MB/秒)*
|
||||
|
||||
迄今为止最引人注目和意想不到的改进表现在我们的磁盘写入利用率上。这就清楚的说明了为什么 Prometheus 1.5 很容易造成 SSD 损耗。我们看到最初的上升发生在第一个块被持久化到序列文件中的时期,然后一旦删除操作引发了重写就会带来第二个上升。令人惊讶的是,查询的服务器与非查询的服务器显示出了非常不同的利用率。
|
||||
|
||||
在另一方面,Prometheus 2.0 每秒仅向其预写日志写入大约一兆字节。当块被压缩到磁盘时,写入定期地出现峰值。这在总体上节省了:惊人的 97-99%。
|
||||
|
||||

|
||||
|
||||
*磁盘大小(GB)*
|
||||
|
||||
与磁盘写入密切相关的是总磁盘空间占用量。由于我们对样本(这是我们的大部分数据)几乎使用了相同的压缩算法,因此磁盘占用量应当相同。在更为稳定的系统中,这样做很大程度上是正确地,但是因为我们需要处理高的序列分流,所以还要考虑每个序列的开销。
|
||||
|
||||
如我们所见,Prometheus 1.5 在这两个版本达到稳定状态之前,使用的存储空间因其保留操作而急速上升。Prometheus 2.0 似乎在每个序列上的开销显著降低。我们可以清楚的看到预写日志线性地充满整个存储空间,然后当压缩完成后瞬间下降。事实上对于两个 Prometheus 2.0 服务器,它们的曲线并不是完全匹配的,这一点需要进一步的调查。
|
||||
|
||||
前景大好。剩下最重要的部分是查询延迟。新的索引应当优化了查找的复杂度。没有实质上发生改变的是处理数据的过程,例如 `rate()` 函数或聚合。这些就是查询引擎要做的东西了。
|
||||
|
||||

|
||||
|
||||
*第 99 个百分位查询延迟(秒)*
|
||||
|
||||
数据完全符合预期。在 Prometheus 1.5 上,查询延迟随着存储的序列而增加。只有在保留操作开始且旧的序列被删除后才会趋于稳定。作为对比,Prometheus 2.0 从一开始就保持在合适的位置。
|
||||
|
||||
我们需要花一些心思在数据是如何被采集上,对服务器发出的查询请求通过对以下方面的估计来选择:范围查询和即时查询的组合,进行更轻或更重的计算,访问更多或更少的文件。它并不需要代表真实世界里查询的分布。也不能代表冷数据的查询性能,我们可以假设所有的样本数据都是保存在内存中的热数据。
|
||||
|
||||
尽管如此,我们可以相当自信地说,整体查询效果对序列分流变得非常有弹性,并且在高压基准测试场景下提升了 4 倍的性能。在更为静态的环境下,我们可以假设查询时间大多数花费在了查询引擎上,改善程度明显较低。
|
||||
|
||||

|
||||
|
||||
*摄入的样本/秒*
|
||||
|
||||
最后,快速地看一下不同 Prometheus 服务器的摄入率。我们可以看到搭载 V3 存储系统的两个服务器具有相同的摄入速率。在几个小时之后变得不稳定,这是因为不同的基准测试集群节点由于高负载变得无响应,与 Prometheus 实例无关。(两个 2.0 的曲线完全匹配这一事实希望足够具有说服力)
|
||||
|
||||
尽管还有更多 CPU 和内存资源,两个 Prometheus 1.5.2 服务器的摄入率大大降低。序列分流的高压导致了无法采集更多的数据。
|
||||
|
||||
那么现在每秒可以摄入的<ruby>绝对最大<rt>absolute maximum</rt></ruby>样本数是多少?
|
||||
|
||||
但是现在你可以摄取的每秒绝对最大样本数是多少?
|
||||
|
||||
我不知道 —— 虽然这是一个相当容易的优化指标,但除了稳固的基线性能之外,它并不是特别有意义。
|
||||
|
||||
有很多因素都会影响 Prometheus 数据流量,而且没有一个单独的数字能够描述捕获质量。最大摄入率在历史上是一个导致基准出现偏差的度量,并且忽视了更多重要的层面,例如查询性能和对序列分流的弹性。关于资源使用线性增长的大致猜想通过一些基本的测试被证实。很容易推断出其中的原因。
|
||||
|
||||
我们的基准测试模拟了高动态环境下 Prometheus 的压力,它比起真实世界中的更大。结果表明,虽然运行在没有优化的云服务器上,但是已经超出了预期的效果。最终,成功将取决于用户反馈而不是基准数字。
|
||||
|
||||
> 注意:在撰写本文的同时,Prometheus 1.6 正在开发当中,它允许更可靠地配置最大内存使用量,并且可能会显著地减少整体的消耗,有利于稍微提高 CPU 使用率。我没有重复对此进行测试,因为整体结果变化不大,尤其是面对高序列分流的情况。
|
||||
|
||||
## 总结
|
||||
|
||||
Prometheus 开始应对高基数序列与单独样本的吞吐量。这仍然是一项富有挑战性的任务,但是新的存储系统似乎向我们展示了未来的一些好东西。
|
||||
|
||||
第一个配备 V3 存储系统的 [alpha 版本 Prometheus 2.0][12] 已经可以用来测试了。在早期阶段预计还会出现崩溃,死锁和其他 bug。
|
||||
|
||||
存储系统的代码可以在[这个单独的项目中找到][13]。Prometheus 对于寻找高效本地存储时间序列数据库的应用来说可能非常有用,这一点令人非常惊讶。
|
||||
|
||||
> 这里需要感谢很多人作出的贡献,以下排名不分先后:
|
||||
|
||||
> Bjoern Rabenstein 和 Julius Volz 在 V2 存储引擎上的打磨工作以及 V3 存储系统的反馈,这为新一代的设计奠定了基础。
|
||||
|
||||
> Wilhelm Bierbaum 对新设计不断的建议与见解作出了很大的贡献。Brian Brazil 不断的反馈确保了我们最终得到的是语义上合理的方法。与 Peter Bourgon 深刻的讨论验证了设计并形成了这篇文章。
|
||||
|
||||
> 别忘了我们整个 CoreOS 团队与公司对于这项工作的赞助与支持。感谢所有那些听我一遍遍唠叨 SSD、浮点数、序列化格式的同学。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fabxc.org/blog/2017-04-10-writing-a-tsdb/
|
||||
|
||||
作者:[Fabian Reinartz][a]
|
||||
译者:[LuuMing](https://github.com/LuuMing)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://twitter.com/fabxc
|
||||
[1]:https://en.wikipedia.org/wiki/Inode
|
||||
[2]:https://prometheus.io/
|
||||
[3]:https://kubernetes.io/
|
||||
[4]:https://en.wikipedia.org/wiki/Write_amplification
|
||||
[5]:http://codecapsule.com/2014/02/12/coding-for-ssds-part-1-introduction-and-table-of-contents/
|
||||
[6]:https://prometheus.io/docs/practices/rules/
|
||||
[7]:http://www.vldb.org/pvldb/vol8/p1816-teller.pdf
|
||||
[8]:https://en.wikipedia.org/wiki/Mmap
|
||||
[9]:https://en.wikipedia.org/wiki/Inverted_index
|
||||
[10]:https://en.wikipedia.org/wiki/Search_engine_indexing#Inverted_indices
|
||||
[11]:https://github.com/prometheus/prombench
|
||||
[12]:https://prometheus.io/blog/2017/04/10/promehteus-20-sneak-peak/
|
||||
[13]:https://github.com/prometheus/tsdb
|
||||
149
published/201906/20170414 5 projects for Raspberry Pi at home.md
Normal file
149
published/201906/20170414 5 projects for Raspberry Pi at home.md
Normal file
@@ -0,0 +1,149 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (warmfrog)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10936-1.html)
|
||||
[#]: subject: (5 projects for Raspberry Pi at home)
|
||||
[#]: via: (https://opensource.com/article/17/4/5-projects-raspberry-pi-home)
|
||||
[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall)
|
||||
|
||||
5 个可在家中使用的树莓派项目
|
||||
======================================
|
||||
|
||||
![5 projects for Raspberry Pi at home][1]
|
||||
|
||||
[树莓派][2] 电脑可被用来进行多种设置用于不同的目的。显然它在教育市场帮助学生在教室和创客空间中学习编程与创客技巧方面占有一席之地,它在工作场所和工厂中有大量行业应用。我打算介绍五个你可能想要在你的家中构建的项目。
|
||||
|
||||
### 媒体中心
|
||||
|
||||
在家中人们常用树莓派作为媒体中心来服务多媒体文件。它很容易搭建,树莓派提供了大量的 GPU(图形处理单元)运算能力来在大屏电视上渲染你的高清电视节目和电影。将 [Kodi][3](从前的 XBMC)运行在树莓派上是一个很棒的方式,它可以播放你的硬盘或网络存储上的任何媒体。你同样可以安装一个插件来播放 YouTube 视频。
|
||||
|
||||
还有几个略微不同的选择,最常见的是 [OSMC][4](开源媒体中心)和 [LibreELEC][5],都是基于 Kodi 的。它们在放映媒体内容方面表现的都非常好,但是 OSMC 有一个更酷炫的用户界面,而 LibreElec 更轻量级。你要做的只是选择一个发行版,下载镜像并安装到一个 SD 卡中(或者仅仅使用 [NOOBS][6]),启动,然后就准备好了。
|
||||
|
||||
![LibreElec ][7]
|
||||
|
||||
*LibreElec;树莓派基金会, CC BY-SA*
|
||||
|
||||
![OSMC][8]
|
||||
|
||||
*OSMC.tv, 版权所有, 授权使用*
|
||||
|
||||
在往下走之前,你需要决定[使用哪种树莓派][9]。这些发行版在任何树莓派(1、2、3 或 Zero)上都能运行,视频播放在这些树莓派中的任何一个上都能胜任。除了 Pi 3(和 Zero W)有内置 Wi-Fi,唯一可察觉的不同是用户界面的反应速度,在 Pi 3 上更快。Pi 2 也不会慢太多,所以如果你不需要 Wi-Fi 它也是可以的,但是当切换菜单时,你会注意到 Pi 3 比 Pi 1 和 Zero 表现的更好。
|
||||
|
||||
### SSH 网关
|
||||
|
||||
如果你想从外部网络访问你的家庭局域网的电脑和设备,你必须打开这些设备的端口来允许外部访问。在互联网中开放这些端口有安全风险,意味着你总是你总是处于被攻击、滥用或者其他各种未授权访问的风险中。然而,如果你在你的网络中安装一个树莓派,并且设置端口映射来仅允许通过 SSH 访问树莓派,你可以这么用来作为一个安全的网关来跳到网络中的其他树莓派和 PC。
|
||||
|
||||
大多数路由允许你配置端口映射规则。你需要给你的树莓派一个固定的内网 IP 地址来设置你的路由器端口 22 映射到你的树莓派端口 22。如果你的网络服务提供商给你提供了一个静态 IP 地址,你能够通过 SSH 和主机的 IP 地址访问(例如,`ssh pi@123.45.56.78`)。如果你有一个域名,你可以配置一个子域名指向这个 IP 地址,所以你没必要记住它(例如,`ssh pi@home.mydomain.com`)。
|
||||
|
||||
![][11]
|
||||
|
||||
然而,如果你不想将树莓派暴露在互联网上,你应该非常小心,不要让你的网络处于危险之中。如果你遵循一些简单的步骤来使它更安全:
|
||||
|
||||
1. 大多数人建议你更换你的登录密码(有道理,默认密码 “raspberry” 是众所周知的),但是这不能阻挡暴力攻击。你可以改变你的密码并添加一个双重验证(所以你需要你的密码*和*一个手机生成的与时间相关的密码),这么做更安全。但是,我相信最好的方法阻止入侵者访问你的树莓派是在你的 SSH 配置中[禁止密码认证][12],这样只能通过 SSH 密匙进入。这意味着任何试图猜测你的密码尝试登录的人都不会成功。只有你的私有密匙可以访问。简单来说,很多人建议将 SSH 端口从默认的 22 换成其他的,但是通过简单的 [Nmap][13] 扫描你的 IP 地址,你信任的 SSH 端口就会暴露。
|
||||
2. 最好,不要在这个树莓派上运行其他的软件,这样你不会意外暴露其他东西。如果你想要运行其他软件,你最好在网络中的其他树莓派上运行,它们没有暴露在互联网上。确保你经常升级来保证你的包是最新的,尤其是 `openssh-server` 包,这样你的安全缺陷就被打补丁了。
|
||||
3. 安装 [sshblack][14] 或 [fail2ban][15] 来将任何表露出恶意的用户加入黑名单,例如试图暴力破解你的 SSH 密码。
|
||||
|
||||
使树莓派安全后,让它在线,你将可以在世界的任何地方登录你的网络。一旦你登录到你的树莓派,你可以用 SSH 访问本地网络上的局域网地址(例如,192.168.1.31)访问其他设备。如果你在这些设备上有密码,用密码就好了。如果它们同样只允许 SSH 密匙,你需要确保你的密匙通过 SSH 转发,使用 `-A` 参数:`ssh -A pi@123.45.67.89`。
|
||||
|
||||
### CCTV / 宠物相机
|
||||
|
||||
另一个很棒的家庭项目是安装一个相机模块来拍照和录视频,录制并保存文件,在内网或者外网中进行流式传输。你想这么做有很多原因,但两个常见的情况是一个家庭安防相机或监控你的宠物。
|
||||
|
||||
[树莓派相机模块][16] 是一个优秀的配件。它提供全高清的相片和视频,包括很多高级配置,很[容易编程][17]。[红外线相机][18]用于这种目的是非常理想的,通过一个红外线 LED(树莓派可以控制的),你就能够在黑暗中看见东西。
|
||||
|
||||
如果你想通过一定频率拍摄静态图片来留意某件事,你可以仅仅写一个简短的 [Python][19] 脚本或者使用命令行工具 [raspistill][20], 在 [Cron][21] 中规划它多次运行。你可能想将它们保存到 [Dropbox][22] 或另一个网络服务,上传到一个网络服务器,你甚至可以创建一个[web 应用][23]来显示他们。
|
||||
|
||||
如果你想要在内网或外网中流式传输视频,那也相当简单。在 [picamera 文档][24]中(在 “web streaming” 章节)有一个简单的 MJPEG(Motion JPEG)例子。简单下载或者拷贝代码到文件中,运行并访问树莓派的 IP 地址的 8000 端口,你会看见你的相机的直播输出。
|
||||
|
||||
有一个更高级的流式传输项目 [pistreaming][25] 也可以,它通过在网络服务器中用 [JSMpeg][26] (一个 JavaScript 视频播放器)和一个用于相机流的单独运行的 websocket。这种方法性能更好,并且和之前的例子一样简单,但是如果要在互联网中流式传输,则需要包含更多代码,并且需要你开放两个端口。
|
||||
|
||||
一旦你的网络流建立起来,你可以将你的相机放在你想要的地方。我用一个来观察我的宠物龟:
|
||||
|
||||
![Tortoise ][27]
|
||||
|
||||
*Ben Nuttall, CC BY-SA*
|
||||
|
||||
如果你想控制相机位置,你可以用一个舵机。一个优雅的方案是用 Pimoroni 的 [Pan-Tilt HAT][28],它可以让你简单的在二维方向上移动相机。为了与 pistreaming 集成,可以看看该项目的 [pantilthat 分支][29].
|
||||
|
||||
![Pan-tilt][30]
|
||||
|
||||
*Pimoroni.com, Copyright, 授权使用*
|
||||
|
||||
如果你想将你的树莓派放到户外,你将需要一个防水的外围附件,并且需要一种给树莓派供电的方式。POE(通过以太网提供电力)电缆是一个不错的实现方式。
|
||||
|
||||
### 家庭自动化或物联网
|
||||
|
||||
现在是 2017 年(LCTT 译注:此文发表时间),到处都有很多物联网设备,尤其是家中。我们的电灯有 Wi-Fi,我们的面包烤箱比过去更智能,我们的茶壶处于俄国攻击的风险中,除非你确保你的设备安全,不然别将没有必要的设备连接到互联网,之后你可以在家中充分的利用物联网设备来完成自动化任务。
|
||||
|
||||
市场上有大量你可以购买或订阅的服务,像 Nest Thermostat 或 Philips Hue 电灯泡,允许你通过你的手机控制你的温度或者你的亮度,无论你是否在家。你可以用一个树莓派来催动这些设备的电源,通过一系列规则包括时间甚至是传感器来完成自动交互。用 Philips Hue,你做不到的当你进房间时打开灯光,但是有一个树莓派和一个运动传感器,你可以用 Python API 来打开灯光。类似地,当你在家的时候你可以通过配置你的 Nest 打开加热系统,但是如果你想在房间里至少有两个人时才打开呢?写一些 Python 代码来检查网络中有哪些手机,如果至少有两个,告诉 Nest 来打开加热器。
|
||||
|
||||
不用选择集成已存在的物联网设备,你可以用简单的组件来做的更多。一个自制的窃贼警报器,一个自动化的鸡笼门开关,一个夜灯,一个音乐盒,一个定时的加热灯,一个自动化的备份服务器,一个打印服务器,或者任何你能想到的。
|
||||
|
||||
### Tor 协议和屏蔽广告
|
||||
|
||||
Adafruit 的 [Onion Pi][31] 是一个 [Tor][32] 协议来使你的网络通讯匿名,允许你使用互联网而不用担心窥探者和各种形式的监视。跟随 Adafruit 的指南来设置 Onion Pi,你会找到一个舒服的匿名的浏览体验。
|
||||
|
||||
![Onion-Pi][33]
|
||||
|
||||
*Onion-pi from Adafruit, Copyright, 授权使用*
|
||||
|
||||
![Pi-hole][34]
|
||||
|
||||
可以在你的网络中安装一个树莓派来拦截所有的网络交通并过滤所有广告。简单下载 [Pi-hole][35] 软件到 Pi 中,你的网络中的所有设备都将没有广告(甚至屏蔽你的移动设备应用内的广告)。
|
||||
|
||||
树莓派在家中有很多用法。你在家里用树莓派来干什么?你想用它干什么?
|
||||
|
||||
在下方评论让我们知道。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/17/4/5-projects-raspberry-pi-home
|
||||
|
||||
作者:[Ben Nuttall][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[warmfrog](https://github.com/warmfrog)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/bennuttall
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/raspberry_pi_home_automation.png?itok=2TnmJpD8 (5 projects for Raspberry Pi at home)
|
||||
[2]: https://www.raspberrypi.org/
|
||||
[3]: https://kodi.tv/
|
||||
[4]: https://osmc.tv/
|
||||
[5]: https://libreelec.tv/
|
||||
[6]: https://www.raspberrypi.org/downloads/noobs/
|
||||
[7]: https://opensource.com/sites/default/files/libreelec_0.png (LibreElec )
|
||||
[8]: https://opensource.com/sites/default/files/osmc.png (OSMC)
|
||||
[9]: https://opensource.com/life/16/10/which-raspberry-pi-should-you-choose-your-project
|
||||
[10]: mailto:pi@home.mydomain.com
|
||||
[11]: https://opensource.com/sites/default/files/resize/screenshot_from_2017-04-07_15-13-01-700x380.png
|
||||
[12]: http://stackoverflow.com/questions/20898384/ssh-disable-password-authentication
|
||||
[13]: https://nmap.org/
|
||||
[14]: http://www.pettingers.org/code/sshblack.html
|
||||
[15]: https://www.fail2ban.org/wiki/index.php/Main_Page
|
||||
[16]: https://www.raspberrypi.org/products/camera-module-v2/
|
||||
[17]: https://opensource.com/life/15/6/raspberry-pi-camera-projects
|
||||
[18]: https://www.raspberrypi.org/products/pi-noir-camera-v2/
|
||||
[19]: http://picamera.readthedocs.io/
|
||||
[20]: https://www.raspberrypi.org/documentation/usage/camera/raspicam/raspistill.md
|
||||
[21]: https://www.raspberrypi.org/documentation/linux/usage/cron.md
|
||||
[22]: https://github.com/RZRZR/plant-cam
|
||||
[23]: https://github.com/bennuttall/bett-bot
|
||||
[24]: http://picamera.readthedocs.io/en/release-1.13/recipes2.html#web-streaming
|
||||
[25]: https://github.com/waveform80/pistreaming
|
||||
[26]: http://jsmpeg.com/
|
||||
[27]: https://opensource.com/sites/default/files/tortoise.jpg (Tortoise)
|
||||
[28]: https://shop.pimoroni.com/products/pan-tilt-hat
|
||||
[29]: https://github.com/waveform80/pistreaming/tree/pantilthat
|
||||
[30]: https://opensource.com/sites/default/files/pan-tilt.gif (Pan-tilt)
|
||||
[31]: https://learn.adafruit.com/onion-pi/overview
|
||||
[32]: https://www.torproject.org/
|
||||
[33]: https://opensource.com/sites/default/files/onion-pi.jpg (Onion-Pi)
|
||||
[34]: https://opensource.com/sites/default/files/resize/pi-hole-250x250.png (Pi-hole)
|
||||
[35]: https://pi-hole.net/
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
为 man 手册页编写解析器的备忘录
|
||||
======
|
||||

|
||||
|
||||
我一般都很喜欢无所事事,但有时候太无聊了也不行 —— 2015 年的一个星期天下午就是这样,我决定开始写一个开源项目来让我不那么无聊。
|
||||
|
||||
在我寻求创意时,我偶然发现了一个请求,要求构建一个由 [Mathias Bynens][2] 提出的“[按 Web 标准构建的 Man 手册页查看器][1]”。没有考虑太多,我开始使用 JavaScript 编写一个手册页解析器,经过大量的反复思考,最终做出了一个 [Jroff][3]。
|
||||
|
||||
那时候,我非常熟悉手册页这个概念,而且使用过很多次,但我知道的仅止于此,我不知道它们是如何生成的,或者是否有一个标准。在经过两年后,我有了一些关于此事的想法。
|
||||
|
||||
### man 手册页是如何写的
|
||||
|
||||
当时令我感到惊讶的第一件事是,手册页的核心只是存储在系统某处的纯文本文件(你可以使用 `manpath` 命令检查这些目录)。
|
||||
|
||||
此文件中不仅包含文档,还包含使用了 20 世纪 70 年代名为 `troff` 的排版系统的格式化信息。
|
||||
|
||||
> troff 及其 GNU 实现 groff 是处理文档的文本描述以生成适合打印的排版版本的程序。**它更像是“你所描述的即你得到的”,而不是你所见即所得的。**
|
||||
>
|
||||
> - 摘自 [troff.org][4]
|
||||
|
||||
如果你对排版格式毫不熟悉,可以将它们视为 steroids 期刊用的 Markdown,但其灵活性带来的就是更复杂的语法:
|
||||
|
||||
![groff-compressor][5]
|
||||
|
||||
`groff` 文件可以手工编写,也可以使用许多不同的工具从其他格式生成,如 Markdown、Latex、HTML 等。
|
||||
|
||||
为什么 `groff` 和 man 手册页绑在一起是有历史原因的,其格式[随时间有变化][6],它的血统由一系列类似命名的程序组成:RUNOFF > roff > nroff > troff > groff。
|
||||
|
||||
但这并不一定意味着 `groff` 与手册页有多紧密的关系,它是一种通用格式,已被用于[书籍][7],甚至用于[照相排版][8]。
|
||||
|
||||
此外,值得注意的是 `groff` 也可以调用后处理器将其中间输出结果转换为最终格式,这对于终端显示来说不一定是 ascii !一些支持的格式是:TeX DVI、HTML、Canon、HP LaserJet4 兼容格式、PostScript、utf8 等等。
|
||||
|
||||
### 宏
|
||||
|
||||
该格式的其他很酷的功能是它的可扩展性,你可以编写宏来增强其基本功能。
|
||||
|
||||
鉴于 *nix 系统的悠久历史,有几个可以根据你想要生成的输出而将特定功能组合在一起的宏包,例如 `man`、`mdoc`、`mom`、`ms`、`mm` 等等。
|
||||
|
||||
手册页通常使用 `man` 和 `mdoc` 宏包编写。
|
||||
|
||||
区分原生的 `groff` 命令和宏的方式是通过标准 `groff` 包大写其宏名称。对于 `man` 宏包,每个宏的名称都是大写的,如 `.PP`、`.TH`、`.SH` 等。对于 `mdoc` 宏包,只有第一个字母是大写的: `.Pp`、`.Dt`、`.Sh`。
|
||||
|
||||
![groff-example][9]
|
||||
|
||||
### 挑战
|
||||
|
||||
无论你是考虑编写自己的 `groff` 解析器,还是只是好奇,这些都是我发现的一些更具挑战性的问题。
|
||||
|
||||
#### 上下文敏感的语法
|
||||
|
||||
表面上,`groff` 的语法是上下文无关的,遗憾的是,因为宏描述的是主体不透明的令牌,所以包中的宏集合本身可能不会实现上下文无关的语法。
|
||||
|
||||
这导致我在那时做不出来一个解析器生成器(不管好坏)。
|
||||
|
||||
#### 嵌套的宏
|
||||
|
||||
`mdoc` 宏包中的大多数宏都是可调用的,这差不多意味着宏可以用作其他宏的参数,例如,你看看这个:
|
||||
|
||||
* 宏 `Fl`(Flag)会在其参数中添加破折号,因此 `Fl s` 会生成 `-s`
|
||||
* 宏 `Ar`(Argument)提供了定义参数的工具
|
||||
* 宏 `Op`(Optional)会将其参数括在括号中,因为这是将某些东西定义为可选的标准习惯用法
|
||||
* 以下组合 `.Op Fl s Ar file ` 将生成 `[-s file]`,因为 `Op` 宏可以嵌套。
|
||||
|
||||
#### 缺乏适合初学者的资源
|
||||
|
||||
让我感到困惑的是缺乏一个规范的、定义明确的、清晰的来源,网上有很多信息,这些信息对读者来说很重要,需要时间来掌握。
|
||||
|
||||
### 有趣的宏
|
||||
|
||||
总结一下,我会向你提供一个非常简短的宏列表,我在开发 jroff 时发现它很有趣:
|
||||
|
||||
`man` 宏包:
|
||||
|
||||
* `.TH`:用 `man` 宏包编写手册页时,你的第一个不是注释的行必须是这个宏,它接受五个参数:`title`、`section`、`date`、`source`、`manual`。
|
||||
* `.BI`:粗体加斜体(特别适用于函数格式)
|
||||
* `.BR`:粗体加正体(特别适用于参考其他手册页)
|
||||
|
||||
`mdoc` 宏包:
|
||||
|
||||
* `.Dd`、`.Dt`、`.Os`:类似于 `man` 宏包需要 `.TH`,`mdoc` 宏也需要这三个宏,需要按特定顺序使用。它们的缩写分别代表:文档日期、文档标题和操作系统。
|
||||
* `.Bl`、`.It`、`.El`:这三个宏用于创建列表,它们的名称不言自明:开始列表、项目和结束列表。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://monades.roperzh.com/memories-writing-parser-man-pages/
|
||||
|
||||
作者:[Roberto Dip][a]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://monades.roperzh.com
|
||||
[1]:https://github.com/h5bp/lazyweb-requests/issues/114
|
||||
[2]:https://mathiasbynens.be/
|
||||
[3]:jroff
|
||||
[4]:https://www.troff.org/
|
||||
[5]:https://user-images.githubusercontent.com/4419992/37868021-2e74027c-2f7f-11e8-894b-80829ce39435.gif
|
||||
[6]:https://manpages.bsd.lv/history.html
|
||||
[7]:https://rkrishnan.org/posts/2016-03-07-how-is-gopl-typeset.html
|
||||
[8]:https://en.wikipedia.org/wiki/Phototypesetting
|
||||
[9]:https://user-images.githubusercontent.com/4419992/37866838-e602ad78-2f6e-11e8-97a9-2a4494c766ae.jpg
|
||||
@@ -0,0 +1,191 @@
|
||||
如何使用 GParted 实用工具缩放根分区
|
||||
======
|
||||
|
||||
今天,我们将讨论磁盘分区。这是 Linux 中的一个好话题。这允许用户来重新调整在 Linux 中的活动 root 分区。
|
||||
|
||||
在这篇文章中,我们将教你如何使用 GParted 缩放在 Linux 上的活动根分区。
|
||||
|
||||
比如说,当我们安装 Ubuntu 操作系统时,并没有恰当地配置,我们的系统仅有 30 GB 磁盘。我们需要安装另一个操作系统,因此我们想在其中制作第二个分区。
|
||||
|
||||
虽然不建议重新调整活动分区。然而,我们要执行这个操作,因为没有其它方法来释放系统分区。
|
||||
|
||||
> 注意:在执行这个动作前,确保你备份了重要的数据,因为如果一些东西出错(例如,电源故障或你的系统重启),你可以得以保留你的数据。
|
||||
|
||||
### Gparted 是什么
|
||||
|
||||
[GParted][1] 是一个自由的分区管理器,它使你能够缩放、复制和移动分区,而不丢失数据。通过使用 GParted 的 Live 可启动镜像,我们可以使用 GParted 应用程序的所有功能。GParted Live 可以使你能够在 GNU/Linux 以及其它的操作系统上使用 GParted,例如,Windows 或 Mac OS X 。
|
||||
|
||||
#### 1) 使用 df 命令检查磁盘空间利用率
|
||||
|
||||
我只是想使用 `df` 命令向你显示我的分区。`df` 命令输出清楚地表明我仅有一个分区。
|
||||
|
||||
```
|
||||
$ df -h
|
||||
Filesystem Size Used Avail Use% Mounted on
|
||||
/dev/sda1 30G 3.4G 26.2G 16% /
|
||||
none 4.0K 0 4.0K 0% /sys/fs/cgroup
|
||||
udev 487M 4.0K 487M 1% /dev
|
||||
tmpfs 100M 844K 99M 1% /run
|
||||
none 5.0M 0 5.0M 0% /run/lock
|
||||
none 498M 152K 497M 1% /run/shm
|
||||
none 100M 52K 100M 1% /run/user
|
||||
```
|
||||
|
||||
#### 2) 使用 fdisk 命令检查磁盘分区
|
||||
|
||||
我将使用 `fdisk` 命令验证这一点。
|
||||
|
||||
```
|
||||
$ sudo fdisk -l
|
||||
[sudo] password for daygeek:
|
||||
|
||||
Disk /dev/sda: 33.1 GB, 33129218048 bytes
|
||||
255 heads, 63 sectors/track, 4027 cylinders, total 64705504 sectors
|
||||
Units = sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disk identifier: 0x000473a3
|
||||
|
||||
Device Boot Start End Blocks Id System
|
||||
/dev/sda1 * 2048 62609407 31303680 83 Linux
|
||||
/dev/sda2 62611454 64704511 1046529 5 Extended
|
||||
/dev/sda5 62611456 64704511 1046528 82 Linux swap / Solaris
|
||||
```
|
||||
|
||||
#### 3) 下载 GParted live ISO 镜像
|
||||
|
||||
使用下面的命令来执行下载 GParted live ISO。
|
||||
|
||||
```
|
||||
$ wget https://downloads.sourceforge.net/gparted/gparted-live-0.31.0-1-amd64.iso
|
||||
```
|
||||
|
||||
#### 4) 使用 GParted Live 安装介质启动你的系统
|
||||
|
||||
使用 GParted Live 安装介质(如烧录的 CD/DVD 或 USB 或 ISO 镜像)启动你的系统。你将获得类似于下面屏幕的输出。在这里选择 “GParted Live (Default settings)” ,并敲击回车按键。
|
||||
|
||||
![][3]
|
||||
|
||||
#### 5) 键盘选择
|
||||
|
||||
默认情况下,它选择第二个选项,按下回车即可。
|
||||
|
||||
![][4]
|
||||
|
||||
#### 6) 语言选择
|
||||
|
||||
默认情况下,它选择 “33” 美国英语,按下回车即可。
|
||||
|
||||
![][5]
|
||||
|
||||
#### 7) 模式选择(图形用户界面或命令行)
|
||||
|
||||
默认情况下,它选择 “0” 图形用户界面模式,按下回车即可。
|
||||
|
||||
![][6]
|
||||
|
||||
#### 8) 加载 GParted Live 屏幕
|
||||
|
||||
现在,GParted Live 屏幕已经加载,它显示我以前创建的分区列表。
|
||||
|
||||
![][7]
|
||||
|
||||
#### 9) 如何重新调整根分区大小
|
||||
|
||||
选择你想重新调整大小的根分区,在这里仅有一个分区,所以我将编辑这个分区以便于安装另一个操作系统。
|
||||
|
||||
![][8]
|
||||
|
||||
为做到这一点,按下 “Resize/Move” 按钮来重新调整分区大小。
|
||||
|
||||
![][9]
|
||||
|
||||
现在,在第一个框中输入你想从这个分区中取出的大小。我将索要 “10GB”,所以,我添加 “10240MB”,并让该对话框的其余部分为默认值,然后点击 “Resize/Move” 按钮。
|
||||
|
||||
![][10]
|
||||
|
||||
它将再次要求你确认重新调整分区的大小,因为你正在编辑活动的系统分区,然后点击 “Ok”。
|
||||
|
||||
![][11]
|
||||
|
||||
分区从 30GB 缩小到 20GB 已经成功。也显示 10GB 未分配的磁盘空间。
|
||||
|
||||
![][12]
|
||||
|
||||
最后点击 “Apply” 按钮来执行下面剩余的操作。
|
||||
|
||||
![][13]
|
||||
|
||||
`e2fsck` 是一个文件系统检查实用程序,自动修复文件系统中与 HDD 相关的坏扇道、I/O 错误。
|
||||
|
||||
![][14]
|
||||
|
||||
`resize2fs` 程序将重新调整 ext2、ext3 或 ext4 文件系统的大小。它可以被用于扩大或缩小一个位于设备上的未挂载的文件系统。
|
||||
|
||||
![][15]
|
||||
|
||||
`e2image` 程序将保存位于设备上的关键的 ext2、ext3 或 ext4 文件系统的元数据到一个指定文件中。
|
||||
|
||||
![][16]
|
||||
|
||||
所有的操作完成,关闭对话框。
|
||||
|
||||
![][17]
|
||||
|
||||
现在,我们可以看到未分配的 “10GB” 磁盘分区。
|
||||
|
||||
![][18]
|
||||
|
||||
重启系统来检查这一结果。
|
||||
|
||||
![][19]
|
||||
|
||||
#### 10) 检查剩余空间
|
||||
|
||||
重新登录系统,并使用 `fdisk` 命令来查看在分区中可用的空间。是的,我可以看到这个分区上未分配的 “10GB” 磁盘空间。
|
||||
|
||||
```
|
||||
$ sudo parted /dev/sda print free
|
||||
[sudo] password for daygeek:
|
||||
Model: ATA VBOX HARDDISK (scsi)
|
||||
Disk /dev/sda: 32.2GB
|
||||
Sector size (logical/physical): 512B/512B
|
||||
Partition Table: msdos
|
||||
Disk Flags:
|
||||
|
||||
Number Start End Size Type File system Flags
|
||||
32.3kB 10.7GB 10.7GB Free Space
|
||||
1 10.7GB 32.2GB 21.5GB primary ext4 boot
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
译者:[robsean](https://github.com/robsean)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.2daygeek.com/author/magesh/
|
||||
[1]:https://gparted.org/
|
||||
[2]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
|
||||
[3]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-1.png
|
||||
[4]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-2.png
|
||||
[5]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-3.png
|
||||
[6]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-4.png
|
||||
[7]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-5.png
|
||||
[8]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-6.png
|
||||
[9]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-7.png
|
||||
[10]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-8.png
|
||||
[11]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-9.png
|
||||
[12]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-10.png
|
||||
[13]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-11.png
|
||||
[14]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-12.png
|
||||
[15]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-13.png
|
||||
[16]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-14.png
|
||||
[17]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-15.png
|
||||
[18]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-16.png
|
||||
[19]:https://www.2daygeek.com/wp-content/uploads/2014/08/how-to-resize-active-primary-root-partition-in-linux-using-gparted-utility-17.png
|
||||
@@ -0,0 +1,172 @@
|
||||
BootISO:从 ISO 文件中创建一个可启动的 USB 设备
|
||||
======
|
||||
|
||||

|
||||
|
||||
为了安装操作系统,我们中的大多数人(包括我)经常从 ISO 文件中创建一个可启动的 USB 设备。为达到这个目的,在 Linux 中有很多自由可用的应用程序。甚至在过去我们写了几篇介绍这种实用程序的文章。
|
||||
|
||||
每个人使用不同的应用程序,每个应用程序有它们自己的特色和功能。在这些应用程序中,一些应用程序属于 CLI 程序,一些应用程序则是 GUI 的。
|
||||
|
||||
今天,我们将讨论名为 BootISO 的实用程序类似工具。它是一个简单的 bash 脚本,允许用户来从 ISO 文件中创建一个可启动的 USB 设备。
|
||||
|
||||
很多 Linux 管理员使用 `dd` 命令开创建可启动的 ISO ,它是一个著名的原生方法,但是与此同时,它也是一个非常危险的命令。因此,小心,当你用 `dd` 命令执行一些动作时。
|
||||
|
||||
建议阅读:
|
||||
|
||||
- [Etcher:从一个 ISO 镜像中创建一个可启动的 USB 驱动器 & SD 卡的简单方法][1]
|
||||
- [在 Linux 上使用 dd 命令来从一个 ISO 镜像中创建一个可启动的 USB 驱动器][2]
|
||||
|
||||
### BootISO 是什么
|
||||
|
||||
[BootISO][3] 是一个简单的 bash 脚本,允许用户来安全的从一个 ISO 文件中创建一个可启动的 USB 设备,它是用 bash 编写的。
|
||||
|
||||
它不提供任何图形用户界面而是提供了大量的选项,可以让初学者顺利地在 Linux 上来创建一个可启动的 USB 设备。因为它是一个智能工具,能自动地选择连接到系统上的 USB 设备。
|
||||
|
||||
当系统有多个 USB 设备连接,它将打印出列表。当你手动选择了另一个硬盘而不是 USB 时,在这种情况下,它将安全地退出,而不会在硬盘上写入任何东西。
|
||||
|
||||
这个脚本也将检查依赖关系,并提示用户安装,它可以与所有的软件包管理器一起工作,例如 apt-get、yum、dnf、pacman 和 zypper。
|
||||
|
||||
### BootISO 的功能
|
||||
|
||||
* 它检查选择的 ISO 是否是正确的 mime 类型。如果不是,那么退出。
|
||||
* 如果你选择除 USB 设备以外的任何其它的磁盘(本地硬盘),BootISO 将自动地退出。
|
||||
* 当你有多个驱动器时,BootISO 允许用户选择想要使用的 USB 驱动器。
|
||||
* 在擦除和分区 USB 设备前,BootISO 会提示用户确认。
|
||||
* BootISO 将正确地处理来自一个命令的任何错误,并退出。
|
||||
* BootISO 在遇到问题退出时将调用一个清理例行程序。
|
||||
|
||||
### 如何在 Linux 中安装 BootISO
|
||||
|
||||
在 Linux 中安装 BootISO 有几个可用的方法,但是,我建议用户使用下面的方法安装。
|
||||
|
||||
```
|
||||
$ curl -L https://git.io/bootiso -O
|
||||
$ chmod +x bootiso
|
||||
$ sudo mv bootiso /usr/local/bin/
|
||||
```
|
||||
|
||||
一旦 BootISO 已经安装,运行下面的命令来列出可用的 USB 设备。
|
||||
|
||||
```
|
||||
$ bootiso -l
|
||||
|
||||
Listing USB drives available in your system:
|
||||
NAME HOTPLUG SIZE STATE TYPE
|
||||
sdd 1 32G running disk
|
||||
```
|
||||
|
||||
如果你仅有一个 USB 设备,那么简单地运行下面的命令来从一个 ISO 文件中创建一个可启动的 USB 设备。
|
||||
|
||||
```
|
||||
$ bootiso /path/to/iso file
|
||||
```
|
||||
|
||||
```
|
||||
$ bootiso /opt/iso_images/archlinux-2018.05.01-x86_64.iso
|
||||
Granting root privileges for bootiso.
|
||||
Listing USB drives available in your system:
|
||||
NAME HOTPLUG SIZE STATE TYPE
|
||||
sdd 1 32G running disk
|
||||
Autoselecting `sdd' (only USB device candidate)
|
||||
The selected device `/dev/sdd' is connected through USB.
|
||||
Created ISO mount point at `/tmp/iso.vXo'
|
||||
`bootiso' is about to wipe out the content of device `/dev/sdd'.
|
||||
Are you sure you want to proceed? (y/n)>y
|
||||
Erasing contents of /dev/sdd...
|
||||
Creating FAT32 partition on `/dev/sdd1'...
|
||||
Created USB device mount point at `/tmp/usb.0j5'
|
||||
Copying files from ISO to USB device with `rsync'
|
||||
Synchronizing writes on device `/dev/sdd'
|
||||
`bootiso' took 250 seconds to write ISO to USB device with `rsync' method.
|
||||
ISO succesfully unmounted.
|
||||
USB device succesfully unmounted.
|
||||
USB device succesfully ejected.
|
||||
You can safely remove it !
|
||||
```
|
||||
|
||||
当你有多个 USB 设备时,可以使用 `--device` 选项指明你的设备名称。
|
||||
|
||||
```
|
||||
$ bootiso -d /dev/sde /opt/iso_images/archlinux-2018.05.01-x86_64.iso
|
||||
```
|
||||
|
||||
默认情况下,BootISO 使用 `rsync` 命令来执行所有的动作,如果你想使用 `dd` 命令代替它,使用下面的格式。
|
||||
|
||||
```
|
||||
$ bootiso --dd -d /dev/sde /opt/iso_images/archlinux-2018.05.01-x86_64.iso
|
||||
```
|
||||
|
||||
如果你想跳过 mime 类型检查,BootISO 实用程序带有下面的选项。
|
||||
|
||||
```
|
||||
$ bootiso --no-mime-check -d /dev/sde /opt/iso_images/archlinux-2018.05.01-x86_64.iso
|
||||
```
|
||||
|
||||
为 BootISO 添加下面的选项来跳过在擦除和分区 USB 设备前的用户确认。
|
||||
|
||||
```
|
||||
$ bootiso -y -d /dev/sde /opt/iso_images/archlinux-2018.05.01-x86_64.iso
|
||||
```
|
||||
|
||||
连同 `-y` 选项一起,启用自动选择 USB 设备。
|
||||
|
||||
```
|
||||
$ bootiso -y -a /opt/iso_images/archlinux-2018.05.01-x86_64.iso
|
||||
```
|
||||
|
||||
为知道更多的 BootISO 选项,运行下面的命令。
|
||||
|
||||
```
|
||||
$ bootiso -h
|
||||
Create a bootable USB from any ISO securely.
|
||||
Usage: bootiso [...]
|
||||
|
||||
Options
|
||||
|
||||
-h, --help, help Display this help message and exit.
|
||||
-v, --version Display version and exit.
|
||||
-d, --device Select block file as USB device.
|
||||
If is not connected through USB, `bootiso' will fail and exit.
|
||||
Device block files are usually situated in /dev/sXX or /dev/hXX.
|
||||
You will be prompted to select a device if you don't use this option.
|
||||
-b, --bootloader Install a bootloader with syslinux (safe mode) for non-hybrid ISOs. Does not work with `--dd' option.
|
||||
-y, --assume-yes `bootiso' won't prompt the user for confirmation before erasing and partitioning USB device.
|
||||
Use at your own risks.
|
||||
-a, --autoselect Enable autoselecting USB devices in conjunction with -y option.
|
||||
Autoselect will automatically select a USB drive device if there is exactly one connected to the system.
|
||||
Enabled by default when neither -d nor --no-usb-check options are given.
|
||||
-J, --no-eject Do not eject device after unmounting.
|
||||
-l, --list-usb-drives List available USB drives.
|
||||
-M, --no-mime-check `bootiso' won't assert that selected ISO file has the right mime-type.
|
||||
-s, --strict-mime-check Disallow loose application/octet-stream mime type in ISO file.
|
||||
-- POSIX end of options.
|
||||
--dd Use `dd' utility instead of mounting + `rsync'.
|
||||
Does not allow bootloader installation with syslinux.
|
||||
--no-usb-check `bootiso' won't assert that selected device is a USB (connected through USB bus).
|
||||
Use at your own risks.
|
||||
|
||||
Readme
|
||||
|
||||
Bootiso v2.5.2.
|
||||
Author: Jules Samuel Randolph
|
||||
Bugs and new features: https://github.com/jsamr/bootiso/issues
|
||||
If you like bootiso, please help the community by making it visible:
|
||||
* star the project at https://github.com/jsamr/bootiso
|
||||
* upvote those SE post: https://goo.gl/BNRmvm https://goo.gl/YDBvFe
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/bootiso-a-simple-bash-script-to-securely-create-a-bootable-usb-device-in-linux-from-iso-file/
|
||||
|
||||
作者:[Prakash Subramanian][a]
|
||||
选题:[lujun9972](https://github.com/lujun9972)
|
||||
译者:[robsean](https://github.com/robsean)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.2daygeek.com/author/prakash/
|
||||
[1]:https://www.2daygeek.com/etcher-easy-way-to-create-a-bootable-usb-drive-sd-card-from-an-iso-image-on-linux/
|
||||
[2]:https://www.2daygeek.com/create-a-bootable-usb-drive-from-an-iso-image-using-dd-command-on-linux/
|
||||
[3]:https://github.com/jsamr/bootiso
|
||||
@@ -0,0 +1,67 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (lujun9972)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10977-1.html)
|
||||
[#]: subject: (Get desktop notifications from Emacs shell commands ·)
|
||||
[#]: via: (https://blog.hoetzel.info/post/eshell-notifications/)
|
||||
[#]: author: (Jürgen Hötzel https://blog.hoetzel.info)
|
||||
|
||||
让 Emacs shell 命令发送桌面通知
|
||||
======
|
||||
|
||||
我总是使用 [Eshell][1] 来与操作系统进行交互,因为它与 Emacs 无缝整合、支持处理 (远程) [TRAMP][2] 文件,而且在 Windows 上也能工作得很好。
|
||||
|
||||
启动 shell 命令后 (比如耗时严重的构建任务) 我经常会由于切换缓冲区而忘了追踪任务的运行状态。
|
||||
|
||||
多亏了 Emacs 的 [钩子][3] 机制,你可以配置 Emacs 在某个外部命令完成后调用一个 elisp 函数。
|
||||
|
||||
我使用 [John Wiegleys][4] 所编写的超棒的 [alert][5] 包来发送桌面通知:
|
||||
|
||||
```
|
||||
(require 'alert)
|
||||
|
||||
(defun eshell-command-alert (process status)
|
||||
"Send `alert' with severity based on STATUS when PROCESS finished."
|
||||
(let* ((cmd (process-command process))
|
||||
(buffer (process-buffer process))
|
||||
(msg (format "%s: %s" (mapconcat 'identity cmd " ") status)))
|
||||
(if (string-prefix-p "finished" status)
|
||||
(alert msg :buffer buffer :severity 'normal)
|
||||
(alert msg :buffer buffer :severity 'urgent))))
|
||||
|
||||
(add-hook 'eshell-kill-hook #'eshell-command-alert)
|
||||
```
|
||||
|
||||
[alert][5] 的规则可以用程序来设置。就我这个情况来看,我只需要当对应的缓冲区不可见时得到通知:
|
||||
|
||||
```
|
||||
(alert-add-rule :status '(buried) ;only send alert when buffer not visible
|
||||
:mode 'eshell-mode
|
||||
:style 'notifications)
|
||||
```
|
||||
|
||||
|
||||
这甚至对于 [TRAMP][2] 也一样生效。下面这个截屏展示了失败的 `make` 命令产生的 Gnome 桌面通知。
|
||||
|
||||
![../../img/eshell.png][6]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://blog.hoetzel.info/post/eshell-notifications/
|
||||
|
||||
作者:[Jürgen Hötzel][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lujun9972](https://github.com/lujun9972)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://blog.hoetzel.info
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.gnu.org/software/emacs/manual/html_mono/eshell.html (Eshell)
|
||||
[2]: https://www.gnu.org/software/tramp/ (TRAMP)
|
||||
[3]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html (hooks)
|
||||
[4]: https://github.com/jwiegley (John Wiegleys)
|
||||
[5]: https://github.com/jwiegley/alert (alert)
|
||||
[6]: https://blog.hoetzel.info/img/eshell.png
|
||||
@@ -0,0 +1,56 @@
|
||||
一条日志消息的现代生活
|
||||
======
|
||||
|
||||
> 从一条日志消息的角度来巡览现代分布式系统。
|
||||
|
||||

|
||||
|
||||
混沌系统往往是不可预测的。在构建像分布式系统这样复杂的东西时,这一点尤其明显。如果不加以控制,这种不可预测性会无止境的浪费时间。因此,分布式系统的每个组件,无论多小,都必须设计成以简化的方式组合在一起。
|
||||
|
||||
[Kubernetes][1] 为抽象计算资源提供了一个很有前景的模型 —— 但即使是它也必须与其他分布式平台(如 [Apache Kafka][2])协调一致,以确保可靠的数据传输。如果有人要整合这两个平台,它会如何运作?此外,如果你通过这样的系统跟踪像日志消息这么简单的东西,它会是什么样子?本文将重点介绍来自在 [OKD][3] 内运行的应用程序的日志消息如何通过 Kafka 进入数据仓库(OKD 是为 Red Hat OpenShift 提供支持的 Kubernetes 的原初社区发行版)。
|
||||
|
||||
### OKD 定义的环境
|
||||
|
||||
这样的旅程始于 OKD,因为该容器平台完全覆盖了它抽象的硬件。这意味着日志消息等待由驻留在容器中的应用程序写入 stdout 或 stderr 流。从那里,日志消息被容器引擎(例如 [CRI-O][4])重定向到节点的文件系统。
|
||||
|
||||

|
||||
|
||||
在 OpenShift 中,一个或多个容器封装在称为 pod(豆荚)的虚拟计算节点中。实际上,在 OKD 中运行的所有应用程序都被抽象为 pod。这允许应用程序以统一的方式操纵。这也大大简化了分布式组件之间的通信,因为 pod 可以通过 IP 地址和[负载均衡服务][5]进行系统寻址。因此,当日志消息由日志收集器应用程序从节点的文件系统获取时,它可以很容易地传递到在 OpenShift 中运行的另一个 pod 中。
|
||||
|
||||
### 在豆荚里的两个豌豆
|
||||
|
||||
为了确保可以在整个分布式系统中四处传播日志消息,日志收集器需要将日志消息传递到在 OpenShift 中运行的 Kafka 集群数据中心。通过 Kafka,日志消息可以以可靠且容错的方式低延迟传递给消费应用程序。但是,为了在 OKD 定义的环境中获得 Kafka 的好处,Kafka 需要完全集成到 OKD 中。
|
||||
|
||||
运行 [Strimzi 操作子][6]将所有 Kafka 组件实例化为 pod,并将它们集成在 OKD 环境中运行。 这包括用于排队日志消息的 Kafka 代理,用于从 Kafka 代理读取和写入的 Kafka 连接器,以及用于管理 Kafka 集群状态的 Zookeeper 节点。Strimzi 还可以将日志收集器实例化兼做 Kafka 连接器,允许日志收集器将日志消息直接提供给在 OKD 中运行的 Kafka 代理 pod。
|
||||
|
||||
### 在 OKD 内的 Kafka
|
||||
|
||||
当日志收集器 pod 将日志消息传递给 Kafka 代理时,收集器会写到单个代理分区,并将日志消息附加到该分区的末尾。使用 Kafka 的一个优点是它将日志收集器与日志的最终目标分离。由于解耦,日志收集器不关心日志最后是放在 [Elasticsearch][7]、Hadoop、Amazon S3 中的某个还是全都。Kafka 与所有基础设施连接良好,因此 Kafka 连接器可以在任何需要的地方获取日志消息。
|
||||
|
||||
一旦写入 Kafka 代理的分区,该日志消息就会在 Kafka 集群内的跨代理分区复制。这是它的一个非常强大的概念;结合平台的自愈功能,它创建了一个非常有弹性的分布式系统。例如,当节点变得不可用时,(故障)节点上运行的应用程序几乎立即在健康节点上生成。因此,即使带有 Kafka 代理的节点丢失或损坏,日志消息也能保证存活在尽可能多的节点上,并且新的 Kafka 代理将快速原位取代。
|
||||
|
||||
### 存储起来
|
||||
|
||||
在日志消息被提交到 Kafka 主题后,它将等待 Kafka 连接器使用它,该连接器将日志消息中继到分析引擎或日志记录仓库。在传递到其最终目的地时,可以分析日志消息以进行异常检测,也可以查询日志以立即进行根本原因分析,或用于其他目的。无论哪种方式,日志消息都由 Kafka 以安全可靠的方式传送到目的地。
|
||||
|
||||
OKD 和 Kafka 是正在迅速发展的功能强大的分布式平台。创建能够在不影响性能的情况下抽象出分布式计算的复杂特性的系统至关重要。毕竟,如果我们不能简化单一日志消息的旅程,我们怎么能夸耀全系统的效率呢?
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/9/life-log-message
|
||||
|
||||
作者:[Josef Karásek][a]
|
||||
选题:[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/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jkarasek
|
||||
[1]: https://kubernetes.io/
|
||||
[2]: https://kafka.apache.org/
|
||||
[3]: https://www.okd.io/
|
||||
[4]: http://cri-o.io/
|
||||
[5]: https://kubernetes.io/docs/concepts/services-networking/service/
|
||||
[6]: http://strimzi.io/
|
||||
[7]: https://www.elastic.co/
|
||||
@@ -0,0 +1,178 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10969-1.html)
|
||||
[#]: subject: (GoAccess – A Real-Time Web Server Log Analyzer And Interactive Viewer)
|
||||
[#]: via: (https://www.2daygeek.com/goaccess-a-real-time-web-server-log-analyzer-and-interactive-viewer/)
|
||||
[#]: author: (Vinoth Kumar https://www.2daygeek.com/author/vinoth/)
|
||||
|
||||
GoAccess:一个实时的 Web 日志分析器及交互式查看器
|
||||
======
|
||||
|
||||

|
||||
|
||||
分析日志文件对于 Linux 管理员来说是一件非常令人头疼的事情,因为它记录了很多东西。大多数新手和初级管理员都不知道如何分析。如果你在分析日志方面拥有很多知识,那么你就成了 *NIX 系统高手。
|
||||
|
||||
Linux 中有许多工具可以轻松分析日志。GoAccess 是允许用户轻松分析 Web 服务器日志的工具之一。我们将在本文中详细讨论 GoAccess 工具。
|
||||
|
||||
### GoAccess
|
||||
|
||||
GoAccess 是一个实时 Web 日志分析器和交互式查看器,可以在 *nix 系统中的终端运行或通过浏览器访问。
|
||||
|
||||
GoAccess 需要的依赖极少,它是用 C 语言编写的,只需要 ncurses。
|
||||
|
||||
它支持 Apache、Nginx 和 Lighttpd 日志。它为需要动态可视化服务器报告的系统管理员即时提供了快速且有价值的 HTTP 统计信息。
|
||||
|
||||
GoAccess 可以解析指定的 Web 日志文件并将数据输出到 X 终端和浏览器。
|
||||
|
||||
GoAccess 被设计成一个基于终端的快速日志分析器。其核心思想是实时快速分析和查看 Web 服务器统计信息,而无需使用浏览器。
|
||||
|
||||
默认输出是在终端输出,它也能够生成完整的、自包含的实时 HTML 报告,以及 JSON 和 CSV 报告。
|
||||
|
||||
GoAccess 支持任何自定义日志格式,并包含以下预定义日志格式选项:Apache/Nginx 中的组合日志格式 XLF/ELF,Apache 中的通用日志格式 CLF,但不限于此。
|
||||
|
||||
### GoAccess 功能
|
||||
|
||||
* 完全实时:所有指标在终端上每 200 毫秒更新一次,在 HTML 输出上每秒更新一次。
|
||||
* 跟踪应用程序响应时间:跟踪服务请求所需的时间。如果你想跟踪减慢了网站速度的网页,则非常有用。
|
||||
* 访问者:按小时或日期确定最慢运行的请求的点击量、访问者数、带宽数和指标。
|
||||
* 按虚拟主机的度量标准:如果有多个虚拟主机(`Server`),它提供了一个面板,可显示哪些虚拟主机正在消耗大部分 Web 服务器资源。
|
||||
|
||||
### 如何安装 GoAccess?
|
||||
|
||||
我建议用户在包管理器的帮助下从发行版官方的存储库安装 GoAccess。它在大多数发行版官方存储库中都可用。
|
||||
|
||||
我们知道,我们在标准发行方式的发行版中得到的是过时的软件包,而滚动发行方式的发行版总是包含最新的软件包。
|
||||
|
||||
如果你使用标准发行方式的发行版运行操作系统,我建议你检查替代选项,如 PPA 或 GoAccess 官方维护者存储库等,以获取最新的软件包。
|
||||
|
||||
对于 Debian / Ubuntu 系统,使用 [APT-GET 命令][1]或 [APT 命令][2]在你的系统上安装 GoAccess。
|
||||
|
||||
```
|
||||
# apt install goaccess
|
||||
```
|
||||
|
||||
要获取最新的 GoAccess 包,请使用以下 GoAccess 官方存储库。
|
||||
|
||||
```
|
||||
$ echo "deb https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
|
||||
$ wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install goaccess
|
||||
```
|
||||
|
||||
对于 RHEL / CentOS 系统,使用 [YUM 包管理器][3]在你的系统上安装 GoAccess。
|
||||
|
||||
```
|
||||
# yum install goaccess
|
||||
```
|
||||
|
||||
对于 Fedora 系统,使用 [DNF 包管理器][4]在你的系统上安装 GoAccess。
|
||||
|
||||
```
|
||||
# dnf install goaccess
|
||||
```
|
||||
|
||||
对于基于 ArchLinux / Manjaro 的系统,使用 [Pacman 包管理器][5]在你的系统上安装 GoAccess。
|
||||
|
||||
```
|
||||
# pacman -S goaccess
|
||||
```
|
||||
|
||||
对于 openSUSE Leap 系统,使用[Zypper 包管理器][6]在你的系统上安装 GoAccess。
|
||||
|
||||
```
|
||||
# zypper install goaccess
|
||||
# zypper ar -f obs://server:http
|
||||
# zypper ref && zypper in goaccess
|
||||
```
|
||||
|
||||
### 如何使用 GoAccess?
|
||||
|
||||
成功安装 GoAccess 后。只需输入 `goaccess` 命令,然后输入 Web 服务器日志位置即可查看。
|
||||
|
||||
```
|
||||
# goaccess [options] /path/to/Web Server/access.log
|
||||
# goaccess /var/log/apache/2daygeek_access.log
|
||||
```
|
||||
|
||||
执行上述命令时,它会要求您选择日志格式配置。
|
||||
|
||||
![][8]
|
||||
|
||||
我用 Apache 访问日志对此进行了测试。Apache 日志被分为十五个部分。详情如下。主要部分显示了这十五个部分的摘要。
|
||||
|
||||
以下屏幕截图包括四个部分,例如唯一身份访问者、请求的文件、静态请求、未找到的网址。
|
||||
|
||||
![][10]
|
||||
|
||||
以下屏幕截图包括四个部分,例如访客主机名和 IP、操作系统、浏览器、时间分布。
|
||||
|
||||
![][10]
|
||||
|
||||
以下屏幕截图包括四个部分,例如来源网址、来源网站,Google 的搜索引擎结果、HTTP状态代码。
|
||||
|
||||
![][11]
|
||||
|
||||
如果要生成 html 报告,请使用以下命令。最初我在尝试生成 html 报告时遇到错误。
|
||||
|
||||
```
|
||||
# goaccess 2daygeek_access.log -a > report.html
|
||||
|
||||
GoAccess - version 1.3 - Nov 23 2018 11:28:19
|
||||
Config file: No config file used
|
||||
|
||||
Fatal error has occurred
|
||||
Error occurred at: src/parser.c - parse_log - 2764
|
||||
No time format was found on your conf file.Parsing... [0] [0/s]
|
||||
```
|
||||
|
||||
它说“你的 conf 文件没有找到时间格式”。要解决此问题,请为其添加 “COMBINED” 日志格式选项。
|
||||
|
||||
```
|
||||
# goaccess -f 2daygeek_access.log --log-format=COMBINED -o 2daygeek.html
|
||||
Parsing...[0,165] [50,165/s]
|
||||
```
|
||||
|
||||
![][12]
|
||||
|
||||
GoAccess 也允许你访问和分析实时日志并进行过滤和解析。
|
||||
|
||||
```
|
||||
# tail -f /var/log/apache/2daygeek_access.log | goaccess -
|
||||
```
|
||||
|
||||
更多细节请参考其 man 手册页或帮助。
|
||||
|
||||
```
|
||||
# man goaccess
|
||||
或
|
||||
# goaccess --help
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/goaccess-a-real-time-web-server-log-analyzer-and-interactive-viewer/
|
||||
|
||||
作者:[Vinoth Kumar][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.2daygeek.com/author/vinoth/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
|
||||
[2]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
|
||||
[3]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
|
||||
[4]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
|
||||
[5]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
|
||||
[6]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
|
||||
[7]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
|
||||
[8]: https://www.2daygeek.com/wp-content/uploads/2019/01/goaccess-a-real-time-web-server-log-analyzer-and-interactive-viewer-1.png
|
||||
[9]: https://www.2daygeek.com/wp-content/uploads/2019/01/goaccess-a-real-time-web-server-log-analyzer-and-interactive-viewer-2.png
|
||||
[10]: https://www.2daygeek.com/wp-content/uploads/2019/01/goaccess-a-real-time-web-server-log-analyzer-and-interactive-viewer-3.png
|
||||
[11]: https://www.2daygeek.com/wp-content/uploads/2019/01/goaccess-a-real-time-web-server-log-analyzer-and-interactive-viewer-4.png
|
||||
[12]: https://www.2daygeek.com/wp-content/uploads/2019/01/goaccess-a-real-time-web-server-log-analyzer-and-interactive-viewer-5.png
|
||||
@@ -0,0 +1,140 @@
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "qfzy1233"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-11028-1.html"
|
||||
[#]: subject: "Top 5 Linux Distributions for Productivity"
|
||||
[#]: via: "https://www.linux.com/blog/learn/2019/1/top-5-linux-distributions-productivity"
|
||||
[#]: author: "Jack Wallen https://www.linux.com/users/jlwallen"
|
||||
|
||||
5 个最具生产力的 Linux 发行版
|
||||
======
|
||||
|
||||
> 如果你正在寻找一个适合开发工作的完美环境,我敢说你找不到比 Pop!_OS 更好的选择。
|
||||
|
||||

|
||||
|
||||
必须承认的是,这样的一个热门话题其实很难被总结的话题。为什么呢?首先,Linux 在就是一种有生产力的操作系统。由于它极强的可靠性和稳定的平台,使得完成工作变得很容易。其次为了衡量工作的效率,你需要考虑到哪项工作需要得到生产力方面的助推。是日常办公?开发类工作?学校事务?数据挖掘?或者是人力资源?你可以看到这个问题有多复杂。
|
||||
|
||||
然而,这并不意味着某些发行版无法更好地配置将底层操作系统呈现为一个有效的平台来完成工作。恰恰相反,许多发行版在偏离生产力这条道路上越走越远,所以你不会意识到你自己处在工作的窘境中,而是继续挖掘自己的潜力在工期结束之前拼命赶上进度。这些 Linux 发行版可以帮助你化繁为简,因此或许可以减少你工作流程中的痛点。
|
||||
|
||||
让我们来看一下这些发行版并为你找出适合你的最佳选择。为了更具条理,我按照生产力诉求把它们分成了几类。这项任务本身也是一种挑战,因为每个人在生产力提升上的需要是千差万别的。然而,我所关注的是下列的几项:
|
||||
|
||||
* 常规:适于那些只需要有效地完成多项工作的人。
|
||||
* 设计:适于那些从事设计创造和图像处理的人。
|
||||
* 开发:适于那些使用 Linux 桌面发行版来进行编程工作的人。
|
||||
* 运维:适于那些需要一个发行版来促进其执行系统管理任务的人。
|
||||
* 教育:适于那些需要桌面发行版可以助力他们在教育领域更高效的人。
|
||||
|
||||
诚然,有很多很多类别的发行版可供挑选,其中的很多可能用起来十分得心应手,但这五种或许是你最为需要的。
|
||||
|
||||
### 常规
|
||||
|
||||
对于常规的生产力诉求来说,你不会找到比 [Ubuntu][1] 更为高效的了。在这个类别中首推 Ubuntu 最主要的原因是因为它实现了桌面操作系统、软件、服务的无缝集成。你可能会问为什么我不选择同类别的 Linux Mint 呢?因为 Ubuntu 现在默认的的桌面环境为 GNOME 桌面,而它拥有 GNOME 许多扩展程序的优势的加成(图 1)。
|
||||
|
||||
![GNOME Clipboard][3]
|
||||
|
||||
*图 1:运行中的 GNOME 桌面的剪切板管理工具。*
|
||||
|
||||
这些扩展程序在提升生产力方面做了很多努力(所以 Ubuntu 比 Linux Mint 获得了更多的认可)。但是 Ubuntu 不仅仅是装了一个普通的 GNOME 桌面。事实上,他们致力于将它改进的更为轻量化、更为高效、以及用户友好度更高、开箱即用。总而言之,由于 Ubuntu 正确的融合了多种特性,开箱即用,完善的软件支持(仅对工作方面而言),这些特性使它几乎成为了生产力领域最为完美的一个平台。
|
||||
|
||||
不管你是要写一篇文档,制作一张电子表格,写一个新的软件,开发公司的网站,设计商用的图形,管理一个服务器或是网络,抑或是在你的公司内从事人力资源管理工作,Ubuntu 都可以满足你的需求。Ubuntu 桌面发行版也并不要求你耗费很大的精力才能开始开始开展工作……它直接就能使用(并且工作的十分优秀)。最后,得益于它是基于 Debian 的,使得在 Ubuntu 上安装第三方的软件十分简便。
|
||||
|
||||
很难不支持这一发行版独占生产力发行版列表的鳌头,尽管 Ubuntu 几乎已经成为几乎所有“某某类顶级发行版”列表的榜首。
|
||||
|
||||
### 设计
|
||||
|
||||
如果你正在寻求提升你的平面设计效率,你不能错过 [Fedora 设计套件][5]。这一 Fedora 衍生版是由负责 Fedora 相关的艺术作品的团队亲自操刀制作的。虽然其默认选择的应用程序并不是一个庞大的工具集合,但它所包含的工具都是创建和处理图像专用的。
|
||||
|
||||
有了 GIMP、Inkscape、Darktable、Krita、Entangle、Blender、Pitivi、Scribus 等应用程序(图 2),你可以找到完成图像编辑工作所需要的一切。但是 Fedora 设计套件并不仅限于此。这个桌面平台还包括一堆教程,涵盖了许多已安装的应用程序。对于任何想要尽可能提高效率的人来说,这将是一些非常有用的信息。不过,我要说的是,GNOME 收藏夹中的教程并没有超乎[此页中][6]链接的内容。
|
||||
|
||||
![Fedora Design Suite Favorites][8]
|
||||
|
||||
*图 2:Fedora 设计套件收藏夹菜单包含了许多工具,可以让你用于图形设计。*
|
||||
|
||||
那些使用数码相机的用户肯定会喜欢 Entangle 应用程序,它可以让你在电脑上控制单反相机。
|
||||
|
||||
### 开发
|
||||
|
||||
几乎所有的 Linux 发行版都是程序员的绝佳平台。然而,有一种特定的发行版脱颖而出,并超越了其他发行版,它将是你见过的用于编程类最有效率的工具之一。这个操作系统来自 [System76][9](LCTT 译注:一家美国的计算机制造商),名为 [Pop!\_OS][10]。Pop!\_OS 是专门为创作者定制的,但不是针对艺术类。相反,Pop!\_OS 面向专门从事开发、编程和软件制作的程序员。如果你需要一个既能完美的胜任开发工作又包含符合使用习惯的桌面操作系统的开发环境,Pop!\_OS 将会是你的不二选择。(图 3)
|
||||
|
||||
可能会让你感到惊讶(考虑到这个操作系统是多么“年轻”)的是 Pop!\_OS 也是你将使用的基于 GNOME 平台的最稳定系统的之一。这意味着 Pop!\_OS 不只是为创作者和创客准备的,也是为任何想要一个可靠的操作系统的人准备的。你可以下载针对你的硬件的专门 ISO 文件,这一点是许多用户十分欣赏的。如果你有英特尔硬件,[下载][10] Intel 或 AMD 的版本。如果你的显卡是 NVIDIA,请下载该特定版本。不管怎样,你肯定会得到针对不同平台进行特殊定制的稳定版本。
|
||||
|
||||
![Pop!_OS][12]
|
||||
|
||||
*图 3:装有 GNOME 桌面的 Pop!_OS 一览。*
|
||||
|
||||
有趣的是,在 Pop!\_OS 中,你不会找到太多预装的开发工具。你也不会找到 IDE 或许多其他开发工具。但是,你可以在 Pop 商店中中找到所需的所有开发工具。
|
||||
|
||||
### 运维
|
||||
|
||||
如果你正在寻找适合系统管理的最具生产力的发行版,[Debian][13] 将会是你的不二之选。为什么这么说呢?因为 Debian 不仅仅拥有无与伦比的可靠性,它也是众多能从苦海中将你解救出来的最好的一个发行版。Debian 是易用性和无限可能性的完美结合。最重要的是,因为它是许多其他发行版的基础,所以可以打赌,如果你需要一个任务的管理工具,那么它一定支持 Debian 系统。当然,我们讨论的是一般的系统管理任务,这意味着大多数时候你需要使用终端窗口 SSH 连接到服务器(图 4),或者在浏览器上使用网络上基于 web 的 GUI 工具。既然如此为什么还要使用一个增加复杂性的桌面呢(比如 Fedora 中的 SELinux 或 openSUSE 中的 YaST)呢?所以,应选择更为简洁易用的那一种。
|
||||
|
||||
![Debian][15]
|
||||
|
||||
*图 4:在 Debian 系统上通过 SSH 连接到远程服务器。*
|
||||
|
||||
你可以选择你想要的不同的桌面(包括 GNOME、Xfce、KDE、Cinnamon、MATE、LXDE),可以确保你所使用的桌面外观最适合你的工作习惯。
|
||||
|
||||
### 教育
|
||||
|
||||
如果你是一名老师或学生,抑或是其他从事与教育相关工作的人士,你需要适当的工具来提高生产力。之前,有 Edubuntu 这样的版本。这一版本位列教育类相关发行版排名的前列。然而,自从 Ubuntu 14.04 版之后这一发行版就再也没有更新。还好,现在有一款基于 openSUSE 的新的以教育为基础的发行版有望夺摘得桂冠。这一改版叫做 [openSUSE:Education-Li-f-e][16](Li-f-e:Linux For Education - 图 5),它基于 openSUSE Leap 42.1 (所以它可能稍微有一点过时)。
|
||||
|
||||
openSUSE:Education-Li-f-e 包含了以下工具:
|
||||
|
||||
* Brain Workshop(大脑工坊):一种基于 dual n-back 模式的大脑训练软件(LCTT 译注:dual n-back 训练是一种科学的智力训练方法,可以改善人的工作记忆和流体智力)
|
||||
* GCompris:一种针对青少年的教育软件包
|
||||
* gElemental:一款元素周期表查看工具
|
||||
* iGNUit:一款通用的记忆卡片工具
|
||||
* Little Wizard:基于 Pascal 语言的少儿编程开发环境
|
||||
* Stellarium:天文模拟器
|
||||
* TuxMath:数学入门游戏
|
||||
* TuxPaint:一款少儿绘画软件
|
||||
* TuxType:一款为少儿准备的打字入门软件
|
||||
* wxMaxima:一个跨平台的计算机代数系统
|
||||
* Inkscape:矢量图形编辑软件
|
||||
* GIMP:图像处理软件(LCTT 译注:被誉为 Linux 上的 PhotoShop)
|
||||
* Pencil:GUI 模型制作工具
|
||||
* Hugin:全景照片拼接及 HDR 效果混合软件
|
||||
|
||||
|
||||
![Education][18]
|
||||
|
||||
*图 5:openSUSE:Education-Li-f-e 发行版拥有大量的工具可以帮你在学校中变得更为高效。*
|
||||
|
||||
同时还集成在 openSUSE:Education-Li-f-e 中的还有 [KIWI-LTSP Server][19] 。KIWI-LTSP 服务器是一个灵活的、经济高效的解决方案,旨在使全世界的学校、企业和组织能够轻松地安装和部署桌面工作站。虽然这可能不会直接帮助学生变得更具生产力,但它肯定会使教育机构在部署供学生使用的桌面时更有效率。有关配置 KIWI-LTSP 的更多信息,请查看 openSUSE [KIWI-LTSP 快速入门指南][20]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/blog/learn/2019/1/top-5-linux-distributions-productivity
|
||||
|
||||
作者:[Jack Wallen][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[qfzy1233](https://github.com/qfzy1233)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.linux.com/users/jlwallen
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ubuntu.com/
|
||||
[2]: /files/images/productivity1jpg
|
||||
[3]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/productivity_1.jpg?itok=yxez3X1w "GNOME Clipboard"
|
||||
[4]: /licenses/category/used-permission
|
||||
[5]: https://labs.fedoraproject.org/en/design-suite/
|
||||
[6]: https://fedoraproject.org/wiki/Design_Suite/Tutorials
|
||||
[7]: /files/images/productivity2jpg
|
||||
[8]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/productivity_2.jpg?itok=ke0b8qyH "Fedora Design Suite Favorites"
|
||||
[9]: https://system76.com/
|
||||
[10]: https://system76.com/pop
|
||||
[11]: /files/images/productivity3jpg-0
|
||||
[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/productivity_3_0.jpg?itok=8UkCUfsD "Pop!_OS"
|
||||
[13]: https://www.debian.org/
|
||||
[14]: /files/images/productivity4jpg
|
||||
[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/productivity_4.jpg?itok=c9yD3Xw2 "Debian"
|
||||
[16]: https://en.opensuse.org/openSUSE:Education-Li-f-e
|
||||
[17]: /files/images/productivity5jpg
|
||||
[18]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/productivity_5.jpg?itok=oAFtV8nT "Education"
|
||||
[19]: https://en.opensuse.org/Portal:KIWI-LTSP
|
||||
[20]: https://en.opensuse.org/SDB:KIWI-LTSP_quick_start
|
||||
[21]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
|
||||
@@ -0,0 +1,126 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (luuming)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11004-1.html)
|
||||
[#]: subject: (5 Good Open Source Speech Recognition/Speech-to-Text Systems)
|
||||
[#]: via: (https://fosspost.org/lists/open-source-speech-recognition-speech-to-text)
|
||||
[#]: author: (Simon James https://fosspost.org/author/simonjames)
|
||||
|
||||
5 款不错的开源语音识别/语音文字转换系统
|
||||
======
|
||||
|
||||

|
||||
|
||||
<ruby>语音文字转换<rt>speech-to-text</rt></ruby>(STT)系统就像它名字所蕴含的意思那样,是一种将说出的单词转换为文本文件以供后续用途的方式。
|
||||
|
||||
语音文字转换技术非常有用。它可以用到许多应用中,例如自动转录,使用自己的声音写书籍或文本,用生成的文本文件和其他工具做复杂的分析等。
|
||||
|
||||
在过去,语音文字转换技术以专有软件和库为主导,要么没有开源替代品,要么有着严格的限制,也没有社区。这一点正在发生改变,当今有许多开源语音文字转换工具和库可以让你随时使用。
|
||||
|
||||
这里我列出了 5 个。
|
||||
|
||||
### 开源语音识别库
|
||||
|
||||
#### DeepSpeech 项目
|
||||
|
||||
![5 Good Open Source Speech Recognition/Speech-to-Text Systems 15 open source speech recognition][1]
|
||||
|
||||
该项目由 Firefox 浏览器的开发组织 Mozilla 团队开发。它是 100% 的自由开源软件,其名字暗示使用了 TensorFlow 机器学习框架实现去功能。
|
||||
|
||||
换句话说,你可以用它训练自己的模型获得更好的效果,甚至可以用它来转换其它的语言。你也可以轻松的将它集成到自己的 Tensorflow 机器学习项目中。可惜的是项目当前默认仅支持英语。
|
||||
|
||||
它也支持许多编程语言,例如 Python(3.6)。可以让你在数秒之内完成工作:
|
||||
|
||||
```
|
||||
pip3 install deepspeech
|
||||
deepspeech --model models/output_graph.pbmm --alphabet models/alphabet.txt --lm models/lm.binary --trie models/trie --audio my_audio_file.wav
|
||||
```
|
||||
|
||||
你也可以通过 `npm` 安装它:
|
||||
|
||||
```
|
||||
npm install deepspeech
|
||||
```
|
||||
|
||||
- [项目主页][2]
|
||||
|
||||
#### Kaldi
|
||||
|
||||
![5 Good Open Source Speech Recognition/Speech-to-Text Systems 17 open source speech recognition][3]
|
||||
|
||||
Kaldi 是一个用 C++ 编写的开源语音识别软件,并且在 Apache 公共许可证下发布。它可以运行在 Windows、macOS 和 Linux 上。它的开发始于 2009。
|
||||
|
||||
Kaldi 超过其他语音识别软件的主要特点是可扩展和模块化。社区提供了大量的可以用来完成你的任务的第三方模块。Kaldi 也支持深度神经网络,并且在它的网站上提供了[出色的文档][4]。
|
||||
|
||||
虽然代码主要由 C++ 完成,但它通过 Bash 和 Python 脚本进行了封装。因此,如果你仅仅想使用基本的语音到文字转换功能,你就会发现通过 Python 或 Bash 能够轻易的实现。
|
||||
|
||||
- [项目主页][5]
|
||||
|
||||
#### Julius
|
||||
|
||||
![5 Good Open Source Speech Recognition/Speech-to-Text Systems 19 open source speech recognition][6]
|
||||
|
||||
它可能是有史以来最古老的语音识别软件之一。它的开发始于 1991 年的京都大学,之后在 2005 年将所有权转移到了一个独立的项目组。
|
||||
|
||||
Julius 的主要特点包括了执行实时 STT 的能力,低内存占用(20000 单词少于 64 MB),能够输出<ruby>最优词<rt>N-best word</rt></ruby>和<ruby>词图<rt>Word-graph</rt></ruby>,能够作为服务器单元运行等等。这款软件主要为学术和研究所设计。由 C 语言写成,并且可以运行在 Linux、Windows、macOS 甚至 Android(在智能手机上)。
|
||||
|
||||
它当前仅支持英语和日语。软件应该能够从 Linux 发行版的仓库中轻松安装。只要在软件包管理器中搜索 julius 即可。最新的版本[发布][7]于本文发布前大约一个半月之前。
|
||||
|
||||
- [项目主页][8]
|
||||
|
||||
#### Wav2Letter++
|
||||
|
||||
![5 Good Open Source Speech Recognition/Speech-to-Text Systems 21 open source speech recognition][9]
|
||||
|
||||
如果你在寻找一个更加时髦的,那么这款一定适合。Wav2Letter++ 是一款由 Facebook 的 AI 研究团队于 2 个月之前发布的开源语言识别软件。代码在 BSD 许可证下发布。
|
||||
|
||||
Facebook 描述它的库是“最快、<ruby>最先进<rt>state-of-the-art</rt></ruby>的语音识别系统”。构建它时的理念使其默认针对性能进行了优化。Facebook 最新的机器学习库 [FlashLight][11] 也被用作 Wav2Letter++ 的底层核心。
|
||||
|
||||
Wav2Letter++ 需要你先为所描述的语言建立一个模型来训练算法。没有任何一种语言(包括英语)的预训练模型,它仅仅是个机器学习驱动的文本语音转换工具,它用 C++ 写成,因此被命名为 Wav2Letter++。
|
||||
|
||||
- [项目主页][12]
|
||||
|
||||
#### DeepSpeech2
|
||||
|
||||
![5 Good Open Source Speech Recognition/Speech-to-Text Systems 23 open source speech recognition][13]
|
||||
|
||||
中国软件巨头百度的研究人员也在开发他们自己的语音文字转换引擎,叫做“DeepSpeech2”。它是一个端对端的开源引擎,使用“PaddlePaddle”深度学习框架进行英语或汉语的文字转换。代码在 BSD 许可证下发布。
|
||||
|
||||
该引擎可以在你想用的任何模型和任何语言上训练。模型并未随代码一同发布。你要像其他软件那样自己建立模型。DeepSpeech2 的源代码由 Python 写成,如果你使用过就会非常容易上手。
|
||||
|
||||
- [项目主页][14]
|
||||
|
||||
### 总结
|
||||
|
||||
语音识别领域仍然主要由专有软件巨头所占据,比如 Google 和 IBM(它们为此提供了闭源商业服务),但是开源同类软件很有前途。这 5 款开源语音识别引擎应当能够帮助你构建应用,随着时间推移,它们会不断地发展。在几年之后,我们希望开源成为这些技术中的常态,就像其他行业那样。
|
||||
|
||||
如果你对清单有其他的建议或评论,我们很乐意在下面听到。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fosspost.org/lists/open-source-speech-recognition-speech-to-text
|
||||
|
||||
作者:[Simon James][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[LuuMing](https://github.com/LuuMing)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fosspost.org/author/simonjames
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i0.wp.com/fosspost.org/wp-content/uploads/2019/02/hero_speech-machine-learning2.png?resize=820%2C280&ssl=1 (5 Good Open Source Speech Recognition/Speech-to-Text Systems 16 open source speech recognition)
|
||||
[2]: https://github.com/mozilla/DeepSpeech
|
||||
[3]: https://i0.wp.com/fosspost.org/wp-content/uploads/2019/02/Screenshot-at-2019-02-19-1134.png?resize=591%2C138&ssl=1 (5 Good Open Source Speech Recognition/Speech-to-Text Systems 18 open source speech recognition)
|
||||
[4]: http://kaldi-asr.org/doc/index.html
|
||||
[5]: http://kaldi-asr.org
|
||||
[6]: https://i2.wp.com/fosspost.org/wp-content/uploads/2019/02/mic_web.png?resize=385%2C100&ssl=1 (5 Good Open Source Speech Recognition/Speech-to-Text Systems 20 open source speech recognition)
|
||||
[7]: https://github.com/julius-speech/julius/releases
|
||||
[8]: https://github.com/julius-speech/julius
|
||||
[9]: https://i2.wp.com/fosspost.org/wp-content/uploads/2019/02/fully_convolutional_ASR.png?resize=850%2C177&ssl=1 (5 Good Open Source Speech Recognition/Speech-to-Text Systems 22 open source speech recognition)
|
||||
[10]: https://code.fb.com/ai-research/wav2letter/
|
||||
[11]: https://github.com/facebookresearch/flashlight
|
||||
[12]: https://github.com/facebookresearch/wav2letter
|
||||
[13]: https://i2.wp.com/fosspost.org/wp-content/uploads/2019/02/ds2.png?resize=850%2C313&ssl=1 (5 Good Open Source Speech Recognition/Speech-to-Text Systems 24 open source speech recognition)
|
||||
[14]: https://github.com/PaddlePaddle/DeepSpeech
|
||||
@@ -0,0 +1,163 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10956-1.html)
|
||||
[#]: subject: (Blockchain 2.0 – Explaining Smart Contracts And Its Types [Part 5])
|
||||
[#]: via: (https://www.ostechnix.com/blockchain-2-0-explaining-smart-contracts-and-its-types/)
|
||||
[#]: author: (editor https://www.ostechnix.com/author/editor/)
|
||||
|
||||
区块链 2.0:智能合约及其类型(五)
|
||||
======
|
||||
|
||||
![Explaining Smart Contracts And Its Types][1]
|
||||
|
||||
这是 区块链 2.0 系列的第 5 篇文章。本系列的前一篇文章探讨了我们如何[在房地产行业实现区块链][2]。本文简要探讨了区块链及相关技术领域内的<ruby>智能合约<rt>Smart Contract</rt></ruby>主题。智能合约是在区块链上验证和创建新“数据块”的基本协议,它被吹捧为该系统未来发展和应用的焦点。 然而,像所有“万灵药”一样,它不是一切的答案。我们将从基础知识中探索这个概念,以了解“智能合约”是什么以及它们不是什么。
|
||||
|
||||
### 不断发展的合同
|
||||
|
||||
这个世界建立在合同(合约)之上。在当前社会,没有合约的使用和再利用,地球上任何个人或公司都无法运作。订立、维护和执行合同的任务变得如此复杂,以至于整个司法和法律系统都必须以“合同法”的名义建立起来以支持它。事实上,大多数合同都是由一个“可信的”第三方监督,以确保最终的利益攸关者按照达成的条件得到妥善处理。有些合同甚至涉及到了第三方受益人。此类合同旨在对不是合同的活跃(或参与)方的第三方产生影响。解决和争论合同义务占据了民事诉讼所涉及的大部分法律纠纷。当然,更好的处理合同的方式来对于个人和企业来说都是天赐之物。更不用说它将以核查和证明的名义节省政府的巨大的[文书工作][7] [^1]。
|
||||
|
||||
本系列中的大多数文章都研究了如何利用现有的区块链技术。相比之下,这篇文章将更多地讲述对未来几年的预期。关于“智能合约”的讨论源于前一篇文章中提出的财产讨论。当前这篇文章旨在概述区块链自动执行“智能”可执行程序的能力。务实地处理这个问题意味着我们首先必须定义和探索这些“智能合约”是什么,以及它们如何适应现有的合同系统。我们将在下一篇题为“区块链 2.0:正在进行的项目”的文章中查看当前该领域正在进行的主要应用和项目。
|
||||
|
||||
### 定义智能合约
|
||||
|
||||
[本系列的第一篇文章][3]从基本的角度来看待区块链,将其看作由数据块组成的“分布式分类账本”,这些数据块是:
|
||||
|
||||
* 防篡改
|
||||
* 不可否认(意味着每个数据块都是由某人显式创建的,并且该人不能否认相同的责任)
|
||||
* 安全,且能抵御传统的网络攻击方法
|
||||
* 几乎是永久性的(当然这取决于区块链协议层)
|
||||
* 高度冗余,通过存在于多个网络节点或参与者系统上,其中一个节点的故障不会以任何方式影响系统的功能,并且,
|
||||
* 根据应用的不同可以提供更快的处理速度。
|
||||
|
||||
由于每个数据实例都是安全存储和通过适当的凭证访问的,因此区块链网络可以为精确验证事实和信息提供简便的基础,而无需第三方监督。区块链 2.0 开发也允许“分布式应用程序(DApp)”(我们将在接下来的文章中详细介绍这个术语)。这些分布式应用程序要求存在网络上并在其上运行。当用户需要它们时就会调用它们,并通过使用已经过审核并存储在区块链上的信息来执行它们。
|
||||
|
||||
上面的最后一段为智能合约的定义提供了基础。<ruby>数字商会<rt>The Chamber for Digital Commerce</rt></ruby>提供了一个许多专家都同意的智能合约定义。
|
||||
|
||||
> “(智能合约是一种)计算机代码,在发生指定条件时,能够根据预先指定的功能自动运行。该代码可以在分布式分类帐本上存储和处理,并将产生的任何更改写入分布式分类帐本” [^2]。
|
||||
|
||||
智能合约如上所述是一种简单的计算机程序,就像 “if-then” 或 “if-else if” 语句一样工作。关于其“智能”的方面来自这样一个事实,即该程序的预定义输入来自区块链分类账本,如上所述,它是一个记录信息的安全可靠的来源。如有必要,程序可以调用外部服务或来源以获取信息,以验证操作条款,并且仅在满足所有预定义条件后才执行。
|
||||
|
||||
必须记住,与其名称所暗示的不同,智能合约通常不是自治实体,严格来说,也不是合同。1996 年,Nick Szabo 很早就提到了智能合约,他将其与接受付款并交付用户选择的产品的自动售货机进行了比较。可以在[这里][4]查看全文。此外,人们正在制定允许智能合约进入主流合同使用的法律框架,因此目前该技术的使用仅限于法律监督不那么明确和严格的领域 [^4]。
|
||||
|
||||
### 智能合约的主要类型
|
||||
|
||||
假设读者对合同和计算机编程有基本的了解,并且基于我们对智能合约的定义,我们可以将智能合约和协议粗略地分类为以下主要类别。
|
||||
|
||||
#### 1、智能法律合约
|
||||
|
||||
这大概是最明显的一种。大多数(如果不是全部)合同都具有法律效力。在不涉及太多技术问题的情况下,智能法律合约是涉及到严格的法律追索权的合同,以防参与合同的当事人不履行其交易的目的。如前所述,不同国家和地区的现行法律框架对区块链上的智能和自动化合约缺乏足够的支持,其法律地位也不明确。但是,一旦制定了法律,就可以订立智能合约,以简化目前涉及严格监管的流程,如金融和房地产市场交易、政府补贴、国际贸易等。
|
||||
|
||||
#### 2、DAO
|
||||
|
||||
<ruby>去中心化自治组织<rt>Decentralized Autonomous Organization</rt></ruby>,即DAO,可以粗略地定义为区块链上存在的社区。该社区可以通过一组规则来定义,这些规则通过智能合约来体现并放入代码中。然后,每个参与者的每一个行动都将受到这些规则的约束,其任务是在程序中断的情况下执行并获得追索权。许多智能合约构成了这些规则,它们协同监管和监督参与者。
|
||||
|
||||
名为“创世纪 DAO” 的 DAO 是由以太坊参与者于 2016 年 5 月创建。该社区旨在成为众筹和风险投资平台。在极短的时间内,他们设法筹集了惊人的 1.5 亿美元。然而,由于黑客在系统中发现了漏洞,并设法从众筹投资者手中窃取价值约 5000 万美元的以太币。这次黑客破坏的后果导致以太坊区块链[分裂为两个][8],以太坊和以太坊经典。
|
||||
|
||||
#### 3、应用逻辑合约(ALC)
|
||||
|
||||
如果你已经听说过与区块链相结合的物联网,那么很可能它涉及到了<ruby>应用逻辑合约<rt>Application logic contract</rt></ruby>,即 ALC。此类智能合约包含特定于应用的代码,这些代码可以与区块链上的其他智能合约和程序一起工作。它们有助于与设备进行通信并验证设备之间的通信(在物联网领域)。ALC 是每个多功能智能合约的关键部分,并且大多数都是在一个管理程序下工作。在这里引用的大多数例子中,它们到处都能找到[应用][9] [^6]。
|
||||
|
||||
*由于该领域还在开发中,因此目前所说的任何定义或标准最多只能说是变化而模糊的。*
|
||||
|
||||
### 智能合约是如何工作的?
|
||||
|
||||
为简化起见,让我们用个例子来说明。
|
||||
|
||||
约翰和彼得是两个争论足球比赛得分的人。他们对比赛结果持有相互矛盾的看法,他们都支持不同的球队(这是背景情况)。由于他们两个都需要去其他地方并且无法看完比赛,所以约翰认为如果 A 队在比赛中击败 B 队,他就*支付*给彼得 100 美元。彼得*考虑*之后*接受*了该赌注,同时明确表示他们必须接受这些条款。但是,他们没有兑现该赌注的相互信任,也没有时间和钱来指定第三方监督赌注。
|
||||
|
||||
假设约翰和彼得都使用像 [Etherparty][5] 这样的智能合约平台,它可以在合约谈判时自动结算赌注,他们都会将基于区块链的身份链接到该合约,并设置条款,明确表示一旦比赛结束,该程序将找出获胜方是谁,并自动将该金额从输家中归入获胜者银行账户。一旦比赛结束并且媒体报道同样的结果,该程序将在互联网上搜索规定的来源,确定哪支球队获胜,将其与合约条款联系起来,在这种情况下,如果 A 队赢了彼得将从约翰哪里得到钱,也就是说将约翰的 100 美元转移到彼得的账户。执行完毕后,除非另有说明,否则智能合约将终止并在未来所有的时间内处于非活动状态。
|
||||
|
||||
抛开例子的简单不说,这种情况涉及到一个经典的合同,而参与者选择使用智能合约实现了相同目的。所有的智能合约基本上都遵循类似的原则,对程序进行编码,以便在预定义的参数上执行,并且只抛出预期的输出。智能合同咨询的外部来源可以是有时被称为 IT 世界中的<ruby>神谕<rt>Oracle</rt></ruby>。神谕是当今全球许多智能合约系统的常见部分。
|
||||
|
||||
在这种情况下使用智能合约使参与者可以获得以下好处:
|
||||
|
||||
* 它比在一起并手动结算更快。
|
||||
* 从其中删除了信任问题。
|
||||
* 消除了受信任的第三方代表有关各方处理和解的必要性。
|
||||
* 执行时无需任何费用。
|
||||
* 在如何处理参数和敏感数据方面是安全的。
|
||||
* 相关数据将永久保留在他们运行的区块链平台中,未来可以通过调用相同的函数并为其提供更多输入来设置投注。
|
||||
* 随着时间的推移,假设约翰和彼得变得赌博成瘾,该程序可以帮助他们开发可靠的统计数据来衡量他们的连胜纪录。
|
||||
|
||||
现在我们知道**什么是智能合约**和**它们如何工作**,我们还没有解决**为什么我们需要它们**。
|
||||
|
||||
### 智能合约的需要
|
||||
|
||||
正如之前的例子我们重点提到过的,出于各种原因,我们需要智能合约。
|
||||
|
||||
#### 透明度
|
||||
|
||||
交易对手非常清楚所涉及的条款和条件。此外,由于程序或智能合约的执行涉及某些明确的输入,因此用户可以非常直接地核实会影响他们和合约受益人的因素。
|
||||
|
||||
#### 时间效率
|
||||
|
||||
如上所述,智能合约一旦被控制变量或用户调用所触发,就立即开始工作。由于数据是通过区块链和网络中的其它来源即时提供给系统,因此执行不需要任何时间来验证和处理信息并解决交易。例如,转移土地所有权契约,这是一个涉及手工核实大量文书工作并且需要数周时间的过程,可以在几分钟甚至几秒钟内通过智能合约程序来处理文件和相关各方。
|
||||
|
||||
#### 精度
|
||||
|
||||
由于平台基本上只是计算机代码和预定义的内容,因此不存在主观错误,所有结果都是精确的,完全没有人为错误。
|
||||
|
||||
#### 安全
|
||||
|
||||
区块链的一个固有特征是每个数据块都是安全加密的。这意味着为了实现冗余,即使数据存储在网络上的多个节点上,**也只有数据所有者才能访问以查看和使用数据**。类似地,利用区块链在过程中存储重要变量和结果,所有过程都将是完全安全和防篡改的。同样也通过按时间顺序为审计人员提供原始的、未经更改的和不可否认的数据版本,简化了审计和法规事务。
|
||||
|
||||
#### 信任
|
||||
|
||||
这个文章系列开篇说到区块链为互联网及其上运行的服务增加了急需的信任层。智能合约在任何情况下都不会在执行协议时表现出偏见或主观性,这意味着所涉及的各方对结果完全有约束力,并且可以不附带任何条件地信任该系统。这也意味着,在具有重要价值的传统合同中所需的“可信第三方”,在此处不需要。当事人之间的犯规和监督将成为过去的问题。
|
||||
|
||||
#### 成本效益
|
||||
|
||||
如示例中所强调的,使用智能合约需要最低的成本。企业通常有专门从事使其交易合法并遵守法规的行政人员。如果交易涉及多方,则重复工作是不可避免的。智能合约基本上使前者无关紧要,并且消除了重复,因为双方可以同时完成尽职调查。
|
||||
|
||||
### 智能合约的应用
|
||||
|
||||
基本上,如果两个或多个参与方使用共同的区块链平台,并就一组原则或业务逻辑达成一致,他们可以一起在区块链上创建一个智能合约,并且在没有人为干预的情况下执行。没有人可以篡改所设置的条件,如果原始代码允许,任何更改都会加上时间戳并带有编辑者的指纹,从而增加了问责制。想象一下,在更大的企业级规模上出现类似的情况,你就会明白智能合约的能力是什么,实际上从 2016 年开始的 **Capgemini 研究** 发现智能合约实际上可能是**“未来几年的”** [^8] 商业主流。商业的应用涉及保险、金融市场、物联网、贷款、身份管理系统、托管账户、雇佣合同以及专利和版税合同等用途。像以太坊这样的区块链平台,是一个设计时就考虑了智能合约的系统,它允许个人私人用户免费使用智能合约。
|
||||
|
||||
通过对处理智能合约的公司的探讨,本系列的下一篇文章中将更全面地概述智能合约在当前技术问题上的应用。
|
||||
|
||||
### 那么,它有什么缺点呢?
|
||||
|
||||
这并不是说对智能合约的使用没有任何顾虑。这种担忧实际上也减缓了这方面的发展。所有区块链的防篡改性质实质上使得,如果所涉及的各方需要在没有重大改革或法律追索的情况下,几乎不可能修改或添加现有条款的新条款。
|
||||
|
||||
其次,即使公有链上的活动是开放的,所有人都可以看到和观察。交易中涉及的各方的个人身份并不总是已知的。这种匿名性造成在任何一方违约的情况下法律有罪不罚的问题,特别是因为现行法律和立法者并不完全适应现代技术。
|
||||
|
||||
第三,区块链和智能合约在很多方面仍然存在安全缺陷,因为对其所以涉及的技术仍处于发展的初期阶段。 对代码和平台的这种缺乏经验最终导致了 2016 年的 DAO 事件。
|
||||
|
||||
所有这些都可能导致企业或公司在需要调整区块链以供其使用时需要大量的初始投资。然而,这些是最初的一次性投资,并且随之而来的是潜在的节约,这才是人们感兴趣的。
|
||||
|
||||
### 结论
|
||||
|
||||
目前的法律框架并没有真正支持一个全面的智能合约的社会,并且由于显然的原因,在不久的将来也不会支持。一个解决方案是选择**“混合”合约**,它将传统的法律文本和文件与在为此目的设计的区块链上运行的智能合约代码相结合。然而,即使是混合合约仍然很大程度上尚未得到探索,因为需要创新的立法机构才能实现这些合约。这里简要提到的应用以及更多内容将在[本系列的下一篇文章][6]中详细探讨。
|
||||
|
||||
[^1]: S. C. A. Chamber of Digital Commerce, “Smart contracts – Is the law ready,” no. September, 2018.
|
||||
[^2]: S. C. A. Chamber of Digital Commerce, “Smart contracts – Is the law ready,” no. September, 2018.
|
||||
[^4]: Cardozo Blockchain Project, “‘Smart Contracts’ & Legal Enforceability,” vol. 2, p. 28, 2018.
|
||||
[^6]: F. Idelberger, G. Governatori, R. Riveret, and G. Sartor, “Evaluation of Logic-Based Smart Contracts for Blockchain Systems,” 2016, pp. 167–183.
|
||||
[^8]: B. Cant et al., “Smart Contracts in Financial Services : Getting from Hype to Reality,” Capgemini Consult., pp. 1–24, 2016.
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/blockchain-2-0-explaining-smart-contracts-and-its-types/
|
||||
|
||||
作者:[ostechnix][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/editor/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2019/03/smart-contracts-720x340.png
|
||||
[2]: https://linux.cn/article-10914-1.html
|
||||
[3]: https://linux.cn/article-10650-1.html
|
||||
[4]: http://www.fon.hum.uva.nl/rob/Courses/InformationInSpeech/CDROM/Literature/LOTwinterschool2006/szabo.best.vwh.net/smart_contracts_2.html
|
||||
[5]: https://etherparty.com/
|
||||
[6]: https://www.ostechnix.com/blockchain-2-0-ongoing-projects-the-state-of-smart-contracts-now/
|
||||
[7]: http://www.legal-glossary.org/
|
||||
[8]: https://futurism.com/the-dao-heist-undone-97-of-eth-holders-vote-for-the-hard-fork/
|
||||
[9]: https://www.everestgrp.com/2016-10-types-smart-contracts-based-applications-market-insights-36573.html/
|
||||
@@ -0,0 +1,127 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (tomjlw)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10939-1.html)
|
||||
[#]: subject: (How to build a mobile particulate matter sensor with a Raspberry Pi)
|
||||
[#]: via: (https://opensource.com/article/19/3/mobile-particulate-matter-sensor)
|
||||
[#]: author: (Stephan Tetzel https://opensource.com/users/stephan)
|
||||
|
||||
如何用树莓派搭建一个颗粒物传感器
|
||||
======
|
||||
|
||||
> 用树莓派、一个廉价的传感器和一个便宜的屏幕监测空气质量。
|
||||
|
||||

|
||||
|
||||
大约一年前,我写了一篇关于如何使用树莓派和廉价传感器测量[空气质量][2]的文章。我们这几年已在学校里和私下使用了这个项目。然而它有一个缺点:由于它基于无线/有线网,因此它不是便携的。如果你的树莓派、你的智能手机和电脑不在同一个网络的话,你甚至都不能访问传感器测量的数据。
|
||||
|
||||
为了弥补这一缺陷,我们给树莓派添加了一块小屏幕,这样我们就可以直接从该设备上读取数据。以下是我们如何为我们的移动细颗粒物传感器搭建并配置好屏幕。
|
||||
|
||||
### 为树莓派搭建好屏幕
|
||||
|
||||
在[亚马逊][3]、阿里巴巴以及其它来源有许多可以买到的树莓派屏幕,从 ePaper 屏幕到可触控 LCD。我们选择了一个便宜的带触控功能且分辨率为 320*480 像素的[3.5英寸 LCD][3],可以直接插进树莓派的 GPIO 引脚。3.5 英寸屏幕和树莓派几乎一样大,这一点不错。
|
||||
|
||||
当你第一次启动屏幕打开树莓派的时候,会因为缺少驱动屏幕会保持白屏。你得首先为屏幕安装[合适的驱动][5]。通过 SSH 登入并执行以下命令:
|
||||
|
||||
```
|
||||
$ rm -rf LCD-show
|
||||
$ git clone <https://github.com/goodtft/LCD-show.git>
|
||||
$ chmod -R 755 LCD-show
|
||||
$ cd LCD-show/
|
||||
```
|
||||
|
||||
为你的屏幕执行合适的命令以安装驱动。例如这是给我们 MPI3501 型屏幕的命令:
|
||||
|
||||
```
|
||||
$ sudo ./LCD35-show
|
||||
```
|
||||
|
||||
这行命令会安装合适的驱动并重启树莓派。
|
||||
|
||||
### 安装 PIXEL 桌面并设置自动启动
|
||||
|
||||
以下是我们想要我们项目能够做到的事情:如果树莓派启动,我们想要展现一个有我们空气质量测量数据的网站。
|
||||
|
||||
首先,安装树莓派的[PIXEL 桌面环境][6]:
|
||||
|
||||
```
|
||||
$ sudo apt install raspberrypi-ui-mods
|
||||
```
|
||||
|
||||
然后安装 Chromium 浏览器以显示网站:
|
||||
|
||||
```
|
||||
$ sudo apt install chromium-browser
|
||||
```
|
||||
|
||||
需要自动登录以使测量数据在启动后直接显示;否则你将只会看到登录界面。然而树莓派用户并没有默认设置好自动登录。你可以用 `raspi-config` 工具设置自动登录:
|
||||
|
||||
```
|
||||
$ sudo raspi-config
|
||||
```
|
||||
|
||||
在菜单中,选择:“3 Boot Options → B1 Desktop / CLI → B4 Desktop Autologin”。
|
||||
|
||||
在启动后用 Chromium 打开我们的网站这块少了一步。创建文件夹 `/home/pi/.config/lxsession/LXDE-pi/`:
|
||||
|
||||
```
|
||||
$ mkdir -p /home/pi/config/lxsession/LXDE-pi/
|
||||
```
|
||||
|
||||
然后在该文件夹里创建 `autostart` 文件:
|
||||
|
||||
```
|
||||
$ nano /home/pi/.config/lxsession/LXDE-pi/autostart
|
||||
```
|
||||
|
||||
并粘贴以下代码:
|
||||
|
||||
```
|
||||
#@unclutter
|
||||
@xset s off
|
||||
@xset -dpms
|
||||
@xset s noblank
|
||||
|
||||
# Open Chromium in Full Screen Mode
|
||||
@chromium-browser --incognito --kiosk <http://localhost>
|
||||
```
|
||||
|
||||
如果你想要隐藏鼠标指针,你得安装 `unclutter` 包并移除 `autostart` 文件开头的注释。
|
||||
|
||||
```
|
||||
$ sudo apt install unclutter
|
||||
```
|
||||
|
||||
![移动颗粒物传感器][7]
|
||||
|
||||
我对去年的代码做了些小修改。因此如果你之前搭建过空气质量项目,确保用[原文章][2]中的指导为 AQI 网站重新下载脚本和文件。
|
||||
|
||||
通过添加触摸屏,你现在拥有了一个便携的颗粒物传感器!我们在学校用它来检查教室里的空气质量或者进行比较测量。使用这种配置,你无需再依赖网络连接或 WLAN。你可以在任何地方使用这个小型测量站——你甚至可以使用移动电源以摆脱电网。
|
||||
|
||||
* * *
|
||||
|
||||
这篇文章原来在<ruby>[开源学校解决方案][8]<rt>Open Scool Solutions</rt></ruby>上发表,获得许可重新发布。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/3/mobile-particulate-matter-sensor
|
||||
|
||||
作者:[Stephan Tetzel][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[tomjlw](https://github.com/tomjlw)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/stephan
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/talk_chat_team_mobile_desktop.png?itok=d7sRtKfQ (Team communication, chat)
|
||||
[2]: https://linux.cn/article-9620-1.html
|
||||
[3]: https://www.amazon.com/gp/search/ref=as_li_qf_sp_sr_tl?ie=UTF8&tag=openschoolsol-20&keywords=lcd%20raspberry&index=aps&camp=1789&creative=9325&linkCode=ur2&linkId=51d6d7676e10d6c7db203c4a8b3b529a
|
||||
[4]: https://amzn.to/2CcvgpC
|
||||
[5]: https://github.com/goodtft/LCD-show
|
||||
[6]: https://linux.cn/article-8459-1.html
|
||||
[7]: https://opensource.com/sites/default/files/uploads/mobile-aqi-sensor.jpg (Mobile particulate matter sensor)
|
||||
[8]: https://openschoolsolutions.org/mobile-particulate-matter-sensor/
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10984-1.html)
|
||||
[#]: subject: (Running LEDs in reverse could cool computers)
|
||||
[#]: via: (https://www.networkworld.com/article/3386876/running-leds-in-reverse-could-cool-computers.html#tk.rss_all)
|
||||
[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/)
|
||||
|
||||
反向运行 LED 能够冷却计算机
|
||||
======
|
||||
|
||||
> 电子产品的小型化正在触及其极限,部分原因在于热量管理。许多人现在都在积极地尝试解决这个问题。其中一种正在探索的途径是反向运行的 LED。
|
||||
|
||||
![monsitj / Getty Images][1]
|
||||
|
||||
寻找更有效的冷却计算机的方法,几乎与渴望发现更好的电池化学成分一样,在科学家的研究日程中也处于重要位置。
|
||||
|
||||
更多的冷却手段对于降低成本至关重要。冷却技术也使得在较小的空间中可以进行更强大的处理,其有限的处理能力应该是进行计算而不是浪费热量。冷却技术可以阻止热量引起的故障,从而延长部件的使用寿命,并且可以促进环保的数据中心 —— 更少的热量意味着对环境的影响更小。
|
||||
|
||||
如何从微处理器中消除热量是科学家们一直在探索的一个方向,他们认为他们已经提出了一个简单而不寻常、且反直觉的解决方案。他们说可以运行一个发光二极管(LED)的变体,其电极反转可以迫使该元件表现得像处于异常低温下工作一样。如果将其置于较热的电子设备旁边,然后引入纳米级间隙,可以使 LED 吸收热量。
|
||||
|
||||
“一旦 LED 反向偏置,它就会像一个非常低温的物体一样,吸收光子,”密歇根大学机械工程教授埃德加·梅霍夫在宣布了这一突破的[新闻稿][4]中说。 “与此同时,该间隙可防止热量返回,从而产生冷却效果。”
|
||||
|
||||
研究人员表示,LED 和相邻的电子设备(在这种情况下是热量计,通常用于测量热能)必须非常接近。他们说他们已经能够证明达到了每平方米 6 瓦的冷却功率。他们解释说,这是差不多是地球表面所接受到的阳光的能量。
|
||||
|
||||
物联网(IoT)设备和智能手机可能是最终将受益于这种 LED 改造的电子产品。这两种设备都需要在更小的空间中容纳更多的计算功率。
|
||||
|
||||
“从微处理器中可以移除的热量开始限制在给定空间内容纳的功率,”密歇根大学的公告说。
|
||||
|
||||
### 材料科学和冷却计算机
|
||||
|
||||
[我之前写过关于新形式的计算机冷却的文章][5]。源自材料科学的外来材料是正在探索的想法之一。美国能源部劳伦斯伯克利国家实验室表示,钠铋(Na3Bi)可用于晶体管设计。这种新物质带电荷,重要的是具有可调节性;但是,它不需要像超导体那样进行冷却。
|
||||
|
||||
事实上,这是超导体的一个问题。不幸的是,它们比大多数电子设备需要更多的冷却 —— 通过极端冷却消除电阻。
|
||||
|
||||
另外,[康斯坦茨大学的德国研究人员][6]表示他们很快将拥有超导体驱动的计算机,没有废热。他们计划使用电子自旋 —— 一种新的电子物理维度,可以提高效率。该大学去年在一份新闻稿中表示,这种方法“显著降低了计算中心的能耗”。
|
||||
|
||||
另一种减少热量的方法可能是用嵌入在微处理器上的[螺旋和回路来取代传统的散热器][7]。宾汉姆顿大学的科学家们表示,印在芯片上的微小通道可以为冷却剂提供单独的通道。
|
||||
|
||||
康斯坦茨大学说:“半导体技术的小型化正在接近其物理极限。”热管理现在被科学家提上了议事日程。这是“小型化的一大挑战”。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3386876/running-leds-in-reverse-could-cool-computers.html#tk.rss_all
|
||||
|
||||
作者:[Patrick Nelson][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Patrick-Nelson/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/02/big_data_center_server_racks_storage_binary_analytics_by_monsitj_gettyimages-944444446_3x2-100787357-large.jpg
|
||||
[2]: https://www.networkworld.com/article/3242807/data-center/top-10-data-center-predictions-idc.html#nww-fsb
|
||||
[3]: https://www.networkworld.com/newsletters/signup.html#nww-fsb
|
||||
[4]: https://news.umich.edu/running-an-led-in-reverse-could-cool-future-computers/
|
||||
[5]: https://www.networkworld.com/article/3326831/computers-could-soon-run-cold-no-heat-generated.html
|
||||
[6]: https://www.uni-konstanz.de/en/university/news-and-media/current-announcements/news/news-in-detail/Supercomputer-ohne-Abwaerme/
|
||||
[7]: https://www.networkworld.com/article/3322956/chip-cooling-breakthrough-will-reduce-data-center-power-costs.html
|
||||
[8]: https://www.facebook.com/NetworkWorld/
|
||||
[9]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,100 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11013-1.html)
|
||||
[#]: subject: (Blockchain 2.0 – Ongoing Projects (The State Of Smart Contracts Now) [Part 6])
|
||||
[#]: via: (https://www.ostechnix.com/blockchain-2-0-ongoing-projects-the-state-of-smart-contracts-now/)
|
||||
[#]: author: (editor https://www.ostechnix.com/author/editor/)
|
||||
|
||||
区块链 2.0:智能合约如今的发展(六)
|
||||
======
|
||||
|
||||
![The State Of Smart Contracts Now][1]
|
||||
|
||||
继续我们的[前面的关于智能合约的文章][2],这篇文章旨在讨论智能合约的发展形势,重点介绍目前正在该领域进行开发的一些项目和公司。如本系列前一篇文章中讨论的,智能合约是在区块链网络上存在并执行的程序。我们探讨了智能合约的工作原理以及它们优于传统数字平台的原因。这里描述的公司分布于各种各样的行业中,但是大多涉及到身份管理系统、金融服务、众筹系统等,因为这些是被认为最适合切换到基于区块链的数据库系统的领域。
|
||||
|
||||
### 开放平台
|
||||
|
||||
诸如 [Counterparty][8] 和 Solidity(以太坊)等平台是完全公用的构建模块,开发者可以以之创建自己的智能合约。大量的开发人员参与此类项目使这些项目成为开发智能合约、设计自己的加密货币令牌系统,以及创建区块链运行协议的事实标准。许多值得称赞的项目都来源于它们。摩根大通派生自以太坊的 [Quorum][9],就是一个例子。而瑞波是另一个例子。
|
||||
|
||||
### 管理金融交易
|
||||
|
||||
通过互联网转账加密货币被吹捧为在未来几年会成为常态。与此相关的不足之处是:
|
||||
|
||||
* 身份和钱包地址是匿名的。如果接收方不履行交易,则付款人没有任何第一追索权。
|
||||
* 错误交易(如果无法追踪任何交易)。
|
||||
* 密码生成的哈希密钥很难用于人类,人为错误是主要关注点。
|
||||
|
||||
在这种情况下,可以让其他人暂时接受该交易并在接受尽职调查后与接收方结算。
|
||||
|
||||
[EscrowMyEther][10] 和 [PAYFAIR][11] 是两个这样的托管平台。基本上,托管公司采用商定的金额并向接收方发送令牌。一旦接收方通过相同的托管平台提供付款人想要的内容,两者都会确认并最终付款。 这些得到了自由职业者和业余爱好者收藏家广泛在线使用。
|
||||
|
||||
### 金融服务
|
||||
|
||||
小额融资和小额保险项目的发展将改善世界上大多数贫穷或没有银行账户的人的银行金融服务。据估计,社会中较贫穷的“无银行账户”人群可以为银行和机构的增加 3800 亿美元收入 [^5]。这一金额要远远超过银行切换到区块链分布式账本技术(DLT)预期可以节省的运营费用。
|
||||
|
||||
位于美国中西部的 BankQu Inc. 的口号是“通过身份而尊严”。他们的平台允许个人建立他们自己的数字身份记录,其中所有交易将在区块链上实时审查和处理。在底层代码上记录并为其用户构建唯一的在线标识,从而实现超快速的交易和结算。BankQu 案例研究探讨了他们如何以这种方式帮助个人和公司,可以在[这里][3]看到。
|
||||
|
||||
[Stratumn][12] 正在帮助保险公司通过自动化早期由人类微观管理的任务来提供更好的保险服务。通过自动化、端到端可追溯性和高效的数据隐私方法,他们彻底改变了保险索赔的结算方式。改善客户体验以及显著降低成本为客户和相关的公司带来双赢局面。
|
||||
|
||||
法国保险公司 [AXA][14] 目前正在试行类似的努力。其产品 [fizzy][13] 允许用户以少量费用订阅其服务并输入他们的航班详细信息。如果航班延误或遇到其他问题,该程序会自动搜索在线数据库,检查保险条款并将保险金额记入用户的帐户。这样就用户或客户无需在手动检查条款后提出索赔,并且就长期而言,一旦这样的系统成为主流,就增加了航空公司的责任心。
|
||||
|
||||
### 跟踪所有权
|
||||
|
||||
理论上可以利用 DLT 中的带时间戳的数据块来跟踪媒体的创建到最终用户消费。Peertracks 公司和 Mycelia 公司目前正在帮助音乐家发布内容,而不必担心其内容被盗或被滥用。他们帮助艺术家直接向粉丝和客户销售,同时获得工作报酬,而无需通过权利和唱片公司 [^9]。
|
||||
|
||||
### 身份管理平台
|
||||
|
||||
基于区块链的身份管理平台可以将你的身份存储在分布式分类帐本中。设置帐户后,会对其进行安全加密,然后将其发送给所有参与节点。但是,作为数据块的所有者,只有该用户才能访问该数据。一旦你在网络上建立身份并开始交易,网络中的自动程序将验证与你的帐户关联的先前所有的交易,在检查要求后将其发送给监管备案,并在程序认为交易合法时自动执行结算。这里的好处是,由于区块链上的数据是防篡改的,而智能合约以零偏差(或主观性)检查输入,如前所述,交易不需要任何人的监督或批准,并且需要小心是即刻生效的。
|
||||
|
||||
像 [ShoCard][15] 、[Credits][16] 和 [OneName][17] 这样的初创公司目前正在推出类似的服务,目前正在与政府和社会机构进行谈判,以便将它们整合到主流用途中。
|
||||
|
||||
开发商的其他独立项目如 Chris Ellis 和 David Duccini 分别开发或提出了替代的身份管理系统,分别是 “[世界公民][4]”和 [IDCoin][5]。Ellis 先生甚至通过在区块链网络上创建护照来证明他的工作能力。
|
||||
|
||||
### 资源共享
|
||||
|
||||
[Share & Charge][18] ([Slock.It][19]) 是一家欧洲的区块链初创公司。他们的移动应用程序允许房主和其他个人投入资金建立充电站与其他正在寻找快速充电的人分享他们的资源。这不仅使业主能够收回他们的一些投资,而且还允许 EV 司机在其近地域获得更多的充电点,从而允许供应商以方便的方式满足需求。一旦“客户”完成对其车辆的充电,相关的硬件就会创建一个由数据组成的安全时间戳块,并且在该平台上工作的智能合约会自动将相应的金额记入所有者账户。记录所有此类交易的跟踪并保持适当的安全验证。有兴趣的读者可以看一下[这里][6],了解他们产品背后的技术角度。该公司的平台将逐步使用户能够与有需要的个人分享其他产品和服务,并从中获得被动收入。
|
||||
|
||||
我们在这里看到的公司,以及一个很短的正在进行中的项目的清单,这些项目利用智能合约和区块链数据库系统。诸如此类的平台有助于构建一个安全的“盒子”,其中包含仅由用户自己、其上的代码或智能合约访问的信息。基于触发器对信息进行实时审查、检查,并且算法由系统执行。这样的平台人为监督最小化,这是在安全数字自动化方面朝着正确方向迈出的急需的一步,这在以前从未被考虑过如此规模。
|
||||
|
||||
下一篇文章将阐述不同类型的区块链。单击以下链接以了解有关此主题的更多信息。
|
||||
|
||||
* [区块链 2.0:公有链与私有链的比较][7]
|
||||
|
||||
|
||||
[^5]: B. Pani, “Blockchain Powered Financial Inclusion,” 2016.
|
||||
[^9]: M. Gates, “Blockchain. Ultimate guide to understanding blockchain bitcoin cryptocurrencies smart-contracts and the future of money.pdf.” 2017.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/blockchain-2-0-ongoing-projects-the-state-of-smart-contracts-now/
|
||||
|
||||
作者:[ostechnix][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/editor/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2019/04/State-Of-Smart-Contracts-720x340.png
|
||||
[2]: https://linux.cn/article-10956-1.html
|
||||
[3]: https://banqu.co/case-study/
|
||||
[4]: https://github.com/MrChrisJ/World-Citizenship
|
||||
[5]: https://github.com/IDCoin/IDCoin
|
||||
[6]: https://blog.slock.it/share-charge-smart-contracts-the-technical-angle-58b93ce80f15
|
||||
[7]: https://www.ostechnix.com/blockchain-2-0-public-vs-private-blockchain-comparison/
|
||||
[8]: https://counterparty.io/platform/
|
||||
[9]: https://www.jpmorgan.com/global/Quorum
|
||||
[10]: http://escrowmyether.com/
|
||||
[11]: https://payfair.io/
|
||||
[12]: https://stratumn.com/business-case/insurance-claim-automation-across-europe/
|
||||
[13]: https://fizzy.axa/en-gb/
|
||||
[14]: https://group.axa.com/en/newsroom/news/axa-goes-blockchain-with-fizzy
|
||||
[15]: https://techcrunch.com/2015/05/05/shocard-is-a-digital-identity-card-on-the-blockchain/
|
||||
[16]: https://techcrunch.com/2014/10/31/your-next-passport-could-be-on-the-blockchain/
|
||||
[17]: https://wiki.namecoin.org/index.php?title=OneName
|
||||
[18]: https://blog.slock.it/share-charge-launches-its-app-on-boards-over-1-000-charging-stations-on-the-blockchain-ba8275390309
|
||||
[19]: https://slock.it/
|
||||
56
published/201906/20190409 5 Linux rookie mistakes.md
Normal file
56
published/201906/20190409 5 Linux rookie mistakes.md
Normal file
@@ -0,0 +1,56 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10952-1.html)
|
||||
[#]: subject: (5 Linux rookie mistakes)
|
||||
[#]: via: (https://opensource.com/article/19/4/linux-rookie-mistakes)
|
||||
[#]: author: (Jen Wike Huger https://opensource.com/users/jen-wike/users/bcotton/users/petercheer/users/greg-p/users/greg-p)
|
||||
|
||||
5 个 Linux 新手会犯的失误
|
||||
======
|
||||
|
||||
> Linux 爱好者们分享了他们犯下的一些最大错误。
|
||||
|
||||

|
||||
|
||||
终身学习是明智的 —— 它可以让你的思维敏捷,让你在就业市场上更具竞争力。但是有些技能比其他技能更难学,尤其是那些小菜鸟错误,当你尝试修复它们时可能会花费你很多时间,给你带来很大困扰。
|
||||
|
||||
以学习 [Linux][2] 为例。如果你习惯于在 Windows 或 MacOS 图形界面中工作,那么转移到 Linux,要将不熟悉的命令输入到终端中,可能会有很大的学习曲线。但是,其回报是值得的,因为已经有数以百万计的人们已经证明了这一点。
|
||||
|
||||
也就是说,这趟学习之旅并不是一帆风顺的。我们让一些 Linux 爱好者回想了一下他们刚开始使用 Linux 的时候,并告诉我们他们犯下的最大错误。
|
||||
|
||||
“不要进入[任何类型的命令行界面(CLI)工作]时就期望命令会以合理或一致的方式工作,因为这可能会导致你感到挫折。这不是因为设计选择不当 —— 虽然当你在键盘上敲击时就像在敲在你的脑袋上一样 —— 而是反映了这些系统是历经了几代的软件和操作系统的发展而陆续添加完成的事实。顺其自然,写下或记住你需要的命令,并且(尽量不要)在[事情不是你所期望的][3]时感到沮丧。” —— [Gina Likins] [4]
|
||||
|
||||
“尽可能简单地复制和粘贴命令以使事情顺利进行,首先阅读命令,至少对将要执行的操作有一个大致的了解,特别是如果有管道命令时,如果有多个管道更要特别注意。有很多破坏性的命令看起来无害 —— 直到你意识到它们能做什么(例如 `rm`、`dd`),而你不会想要意外破坏什么东西(别问我怎么知道)。” —— [Katie McLaughlin] [5]
|
||||
|
||||
“在我的 Linux 之旅的早期,我并不知道我所处在文件系统中的位置的重要性。我正在删除一些我认为是我的主目录的文件,我输入了 `sudo rm -rf *`,然后就删除了我系统上的所有启动文件。现在,我经常使用 `pwd` 来确保我在发出这样的命令之前确认我在哪里。幸运的是,我能够使用 USB 驱动器启动被搞坏的笔记本电脑并恢复我的文件。” —— [Don Watkins] [6]
|
||||
|
||||
“不要因为你认为‘权限很难理解’而你希望应用程序可以访问某些内容时就将整个文件系统的权限重置为 [777][7]。”—— [Matthew Helmke] [8]
|
||||
|
||||
“我从我的系统中删除一个软件包,而我没有检查它依赖的其他软件包。我只是让它删除它想删除要的东西,最终导致我的一些重要程序崩溃并变得不可用。” —— [Kedar Vijay Kulkarni] [9]
|
||||
|
||||
你在学习使用 Linux 时犯过什么错误?请在评论中分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/linux-rookie-mistakes
|
||||
|
||||
作者:[Jen Wike Huger][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jen-wike/users/bcotton/users/petercheer/users/greg-p/users/greg-p
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga (magnifying glass on computer screen, finding a bug in the code)
|
||||
[2]: https://opensource.com/resources/linux
|
||||
[3]: https://lintqueen.com/2017/07/02/learning-while-frustrated/
|
||||
[4]: https://opensource.com/users/lintqueen
|
||||
[5]: https://opensource.com/users/glasnt
|
||||
[6]: https://opensource.com/users/don-watkins
|
||||
[7]: https://www.maketecheasier.com/file-permissions-what-does-chmod-777-means/
|
||||
[8]: https://twitter.com/matthewhelmke
|
||||
[9]: https://opensource.com/users/kkulkarn
|
||||
108
published/201906/20190409 5 open source mobile apps.md
Normal file
108
published/201906/20190409 5 open source mobile apps.md
Normal file
@@ -0,0 +1,108 @@
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "fuzheng1998"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-10931-1.html"
|
||||
[#]: subject: "5 open source mobile apps"
|
||||
[#]: via: "https://opensource.com/article/19/4/mobile-apps"
|
||||
[#]: author: "Chris Hermansen https://opensource.com/users/clhermansen/users/bcotton/users/clhermansen/users/bcotton/users/clhermansen"
|
||||
|
||||
5 个可以满足你的生产力、沟通和娱乐需求的开源手机应用
|
||||
======
|
||||
|
||||
> 你可以依靠这些应用来满足你的生产力、沟通和娱乐需求。
|
||||
|
||||

|
||||
|
||||
像世界上大多数人一样,我的手似乎就没有离开过手机。多亏了我从 Google Play 和 F-Droid 安装的开源移动应用程序,让我的 Android 设备好像提供了无限的沟通、生产力和娱乐服务一样。
|
||||
|
||||
在我的手机上的许多开源应用程序中,当想听音乐、与朋友/家人和同事联系、或者在旅途中完成工作时,以下五个是我一直使用的。
|
||||
|
||||
### MPDroid
|
||||
|
||||
一个音乐播放器进程 (MPD)的 Android 控制器。
|
||||
|
||||
![MPDroid][2]
|
||||
|
||||
MPD 是将音乐从小型音乐服务器电脑传输到大型的黑色立体声音箱的好方法。它直连 ALSA,因此可以通过 ALSA 硬件接口与数模转换器(DAC)对话,它可以通过我的网络进行控制——但是用什么东西控制呢?好吧,事实证明 MPDroid 是一个很棒的 MPD 控制器。它可以管理我的音乐数据库,显示专辑封面,处理播放列表,并支持互联网广播。而且它是开源的,所以如果某些东西不好用的话……
|
||||
|
||||
MPDroid 可在 [Google Play][4] 和 [F-Droid][5] 上找到。
|
||||
|
||||
### RadioDroid
|
||||
|
||||
一台能单独使用及与 Chromecast 搭配使用的 Android 网络收音机。
|
||||
|
||||
![RadioDroid][6]
|
||||
|
||||
RadioDroid 是一个网络收音机,而 MPDroid 则管理我音乐的数据库;从本质上讲,RadioDroid 是 [Internet-Radio.com][7] 的一个前端。此外,通过将耳机插入 Android 设备,通过耳机插孔或 USB 将 Android 设备直接连接到立体声系统,或通过兼容设备使用其 Chromecast 功能,可以享受 RadioDroid。这是一个查看芬兰天气情况,听取排名前 40 的西班牙语音乐,或收到到最新新闻消息的好方法。
|
||||
|
||||
RadioDroid 可在 [Google Play][8] 和 [F-Droid][9] 上找到。
|
||||
|
||||
### Signal
|
||||
|
||||
一个支持 Android、iOS,还有桌面系统的安全即时消息客户端。
|
||||
|
||||
![Signal][10]
|
||||
|
||||
如果你喜欢 WhatsApp,但是因为它与 Facebook [日益密切][11]的关系而感到困扰,那么 Signal 应该是你的下一个产品。Signal 的唯一问题是说服你的朋友们最好用 Signal 取代 WhatsApp。但除此之外,它有一个与 WhatsApp 类似的界面;很棒的语音和视频通话;很好的加密;恰到好处的匿名;并且它受到了一个不打算通过使用软件来获利的基金会的支持。为什么不喜欢它呢?
|
||||
|
||||
Signal 可用于 [Android][12]、[iOS][13] 和 [桌面][14]。
|
||||
|
||||
### ConnectBot
|
||||
|
||||
Android SSH 客户端。
|
||||
|
||||
![ConnectBot][15]
|
||||
|
||||
有时我离电脑很远,但我需要登录服务器才能办事。[ConnectBot][16] 是将 SSH 会话搬到手机上的绝佳解决方案。
|
||||
|
||||
ConnectBot 可在 [Google Play][17] 上找到。
|
||||
|
||||
### Termux
|
||||
|
||||
有多种熟悉的功能的安卓终端模拟器。
|
||||
|
||||
![Termux][18]
|
||||
|
||||
你是否需要在手机上运行 `awk` 脚本?[Termux][19] 是个解决方案。如果你需要做终端类的工作,而且你不想一直保持与远程计算机的 SSH 连接,请使用 ConnectBot 将文件放到手机上,然后退出会话,在 Termux 中执行你的操作,用 ConnectBot 发回结果。
|
||||
|
||||
Termux 可在 [Google Play][20] 和 [F-Droid][21] 上找到。
|
||||
|
||||
* * *
|
||||
|
||||
你最喜欢用于工作或娱乐的开源移动应用是什么呢?请在评论中分享它们。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/mobile-apps
|
||||
|
||||
作者:[Chris Hermansen][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[fuzheng1998](https://github.com/fuzheng1998)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/clhermansen/users/bcotton/users/clhermansen/users/bcotton/users/clhermansen
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolserieshe_rh_041x_0.png?itok=tfg6_I78
|
||||
[2]: https://opensource.com/sites/default/files/uploads/mpdroid.jpg "MPDroid"
|
||||
[3]: https://opensource.com/article/17/4/fun-new-gadget
|
||||
[4]: https://play.google.com/store/apps/details?id=com.namelessdev.mpdroid&hl=en_US
|
||||
[5]: https://f-droid.org/en/packages/com.namelessdev.mpdroid/
|
||||
[6]: https://opensource.com/sites/default/files/uploads/radiodroid.png "RadioDroid"
|
||||
[7]: https://www.internet-radio.com/
|
||||
[8]: https://play.google.com/store/apps/details?id=net.programmierecke.radiodroid2
|
||||
[9]: https://f-droid.org/en/packages/net.programmierecke.radiodroid2/
|
||||
[10]: https://opensource.com/sites/default/files/uploads/signal.png "Signal"
|
||||
[11]: https://opensource.com/article/19/3/open-messenger-client
|
||||
[12]: https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms
|
||||
[13]: https://itunes.apple.com/us/app/signal-private-messenger/id874139669?mt=8
|
||||
[14]: https://signal.org/download/
|
||||
[15]: https://opensource.com/sites/default/files/uploads/connectbot.png "ConnectBot"
|
||||
[16]: https://connectbot.org/
|
||||
[17]: https://play.google.com/store/apps/details?id=org.connectbot
|
||||
[18]: https://opensource.com/sites/default/files/uploads/termux.jpg "Termux"
|
||||
[19]: https://termux.com/
|
||||
[20]: https://play.google.com/store/apps/details?id=com.termux
|
||||
[21]: https://f-droid.org/packages/com.termux/
|
||||
@@ -0,0 +1,118 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11023-1.html)
|
||||
[#]: subject: (VSCodium: 100% Open Source Version of Microsoft VS Code)
|
||||
[#]: via: (https://itsfoss.com/vscodium/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
VSCodium:100% 开源的 VS Code
|
||||
======
|
||||
|
||||
> VSCodium 是微软流行的 Visual Studio Code 编辑器的一个分支。它与 VS Code 完全相同,唯一不同的是,VSCodium 不跟踪你的使用数据。
|
||||
|
||||
微软的 [Visual Studio Code][1] 是一个出色的编辑器,不仅对于 Web 开发人员,也适合其他程序员。由于它的功能,它被认为是最好的开源代码编辑器之一。
|
||||
|
||||
是的,它是微软众多开源产品之一。因为有 DEB、RPM 和 Snap 包形式的二进制文件,你可以[在 Linux 中轻松安装 Visual Studio Code][2]。
|
||||
|
||||
但它存在一个问题,对于普通用户而言可能不是问题,但对于纯粹开源主义者而言是重要的。
|
||||
|
||||
Microsoft 说提供的二进制文件是不开源的。
|
||||
|
||||
感到困惑么?让我解释下。
|
||||
|
||||
VS Code 的源码是在 MIT 许可下开源的。你可以在 [GitHub][3] 上访问它。但是,[Microsoft 创建的安装包含专有的跟踪程序][4]。
|
||||
|
||||
此跟踪基本上用来收集使用数据并将其发送给 Microsoft 以“帮助改进其产品和服务”。如今,远程报告在软件产品中很常见。即使 [Ubuntu 也这样做,但它透明度更高][5]。
|
||||
|
||||
你可以[在 VS Code 中禁用远程报告][6],但是你能完全信任微软吗?如果答案是否定的,那你有什么选择?
|
||||
|
||||
你可以从源代码构建它,从而保持全都是开源的。但是如今[从源代码安装][7]并不总是最好的选择,因为我们习惯于使用二进制文件。
|
||||
|
||||
另一种选择是使用 VSCodium !
|
||||
|
||||
### VSCodium:100% 开源形式的 Visual Studio Code
|
||||
|
||||
![][8]
|
||||
|
||||
[VSCodium][9] 是微软 Visual Studio Code 的一个分支。该项目的唯一目的是为你提供现成的二进制文件,而没有 Microsoft 的远程收集代码。
|
||||
|
||||
这解决了你想在去掉 Microsoft 的专有代码的情况下使用 VS Code ,而你又不习惯从源代码构建它的问题。
|
||||
|
||||
由于 [VSCodium 是 VS Code 的一个分支][11],它的外观和功能与 VS Code 完全相同。
|
||||
|
||||
这是 Ubuntu 中第一次运行 VS Code 和 VSCodium 的截图。你能分辨出来吗?
|
||||
|
||||
![Can you guess which is VSCode and VSCodium?][12]
|
||||
|
||||
如果你无法区分这两者,请看下面。
|
||||
|
||||
![That’s Microsoft][13]
|
||||
|
||||
除此之外,还有两个应用的 logo,没有其他明显的区别。
|
||||
|
||||
![VSCodium and VS Code in GNOME Menu][14]
|
||||
|
||||
#### 在 Linux 上安装 VSCodium
|
||||
|
||||
虽然 VSCodium 存在于某些发行版(如 Parrot OS)中,但你必须在其他 Linux 发行版中添加额外的仓库。
|
||||
|
||||
在基于 Ubuntu 和 Debian 的发行版上,你可以使用以下命令安装 VSCodium。
|
||||
|
||||
首先,添加仓库的 GPG 密钥:
|
||||
|
||||
```
|
||||
wget -qO - https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg | sudo apt-key add -
|
||||
```
|
||||
|
||||
然后添加仓库:
|
||||
|
||||
```
|
||||
echo 'deb https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/repos/debs/ vscodium main' | sudo tee --append /etc/apt/sources.list.d/vscodium.list
|
||||
```
|
||||
|
||||
现在更新你的系统并安装 VSCodium:
|
||||
|
||||
```
|
||||
sudo apt update && sudo apt install codium
|
||||
```
|
||||
|
||||
你可以在它的页面上找到[其他发行版的安装说明][15]。你还应该阅读[有关从 VS Code 迁移到 VSCodium 的说明][16]。
|
||||
|
||||
### 你如何看待 VSCodium?
|
||||
|
||||
就个人而言,我喜欢 VSCodium 的概念。说的老套一点,它的初心是好的。我认为,致力于开源的 Linux 发行版甚至可能开始将其包含在官方仓库中。
|
||||
|
||||
你怎么看?是否值得切换到 VSCodium 或者你选择关闭远程报告并继续使用 VS Code?
|
||||
|
||||
请不要出现“我使用 Vim” 的评论 :D
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/vscodium/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://code.visualstudio.com/
|
||||
[2]: https://itsfoss.com/install-visual-studio-code-ubuntu/
|
||||
[3]: https://github.com/Microsoft/vscode
|
||||
[4]: https://github.com/Microsoft/vscode/issues/60#issuecomment-161792005
|
||||
[5]: https://itsfoss.com/ubuntu-data-collection-stats/
|
||||
[6]: https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting
|
||||
[7]: https://itsfoss.com/install-software-from-source-code/
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/04/vscodium.png?resize=800%2C450&ssl=1
|
||||
[9]: https://vscodium.com/
|
||||
[11]: https://github.com/VSCodium/vscodium
|
||||
[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/04/vscodium-vs-vscode.png?resize=800%2C450&ssl=1
|
||||
[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/04/microsoft-vscode-tracking.png?resize=800%2C259&ssl=1
|
||||
[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/vscodium-and-vscode.jpg?resize=800%2C220&ssl=1
|
||||
[15]: https://vscodium.com/#install
|
||||
[16]: https://vscodium.com/#migrate
|
||||
@@ -0,0 +1,98 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10957-1.html)
|
||||
[#]: subject: (How we built a Linux desktop app with Electron)
|
||||
[#]: via: (https://opensource.com/article/19/4/linux-desktop-electron)
|
||||
[#]: author: (Nils Ganther https://opensource.com/users/nils-ganther)
|
||||
|
||||
我们是如何使用 Electron 构建 Linux 桌面应用程序的
|
||||
======
|
||||
|
||||
> 这是借助 Electron 框架,构建一个在 Linux 桌面上原生运行的开源电子邮件服务的故事。
|
||||
|
||||

|
||||
|
||||
[Tutanota][2] 是一种安全的开源电子邮件服务,它可通过浏览器使用,也有 iOS 和 Android 应用。其客户端代码在 GPLv3 下发布,Android 应用程序可在 [F-Droid][3] 上找到,以便每个人都可以使用完全与 Google 无关的版本。
|
||||
|
||||
由于 Tutanota 关注开源和 Linux 客户端开发,因此我们希望为 Linux 和其他平台发布一个桌面应用程序。作为一个小团队,我们很快就排除了为 Linux、Windows 和 MacOS 构建原生应用程序的可能性,并决定使用 [Electron][4] 来构建我们的应用程序。
|
||||
|
||||
对于任何想要快速交付视觉一致的跨平台应用程序的人来说,Electron 是最适合的选择,尤其是如果你已经有一个 Web 应用程序,想要从浏览器 API 的束缚中摆脱出来时。Tutanota 就是这样一个案例。
|
||||
|
||||
Tutanota 基于 [SystemJS][5] 和 [Mithril][6],旨在为每个人提供简单、安全的电子邮件通信。 因此,它必须提供很多用户期望从电子邮件客户端获得的标准功能。
|
||||
|
||||
由于采用了现代 API 和标准,其中一些功能(如基本的推送通知、搜索文本和联系人以及支持双因素身份验证)很容易在浏览器中提供。其它功能(例如自动备份或无需我们的服务器中转的 IMAP 支持)需要对系统资源的限制性访问,而这正是 Electron 框架提供的功能。
|
||||
|
||||
虽然有人批评 Electron “只是一个基本的包装”,但它有明显的好处:
|
||||
|
||||
* Electron 可以使你能够快速地为 Linux、Windows 和 MacOS 桌面构造 Web 应用。事实上,大多数 Linux 桌面应用都是使用 Electron 构建的。
|
||||
* Electron 可以轻松地将桌面客户端与 Web 应用程序达到同样的功能水准。
|
||||
* 发布桌面应用程序后,你可以自由使用开发功能添加桌面端特定的功能,从而增强可用性和安全性。
|
||||
* 最后但同样重要的是,这是让应用程序具备原生的感觉、融入用户系统,而同时保持其识别度的好方法。
|
||||
|
||||
### 满足用户的需求
|
||||
|
||||
Tutanota 不依靠于大笔的投资资金,而是依靠社区驱动的项目。基于越来越多的用户升级到我们的免费服务的付费计划,我们有机地发展我们的团队。倾听用户的需求不仅对我们很重要,而且对我们的成功至关重要。
|
||||
|
||||
提供桌面客户端是 Tutanota 用户[最想要的功能][7],我们感到自豪的是,我们现在可以为所有用户提供免费的桌面客户端测试版。(我们还实现了另一个高度要求的功能 —— [搜索加密数据][8] —— 但这是另一个主题了。)
|
||||
|
||||
我们喜欢为用户提供签名版本的 Tutanota 并支持浏览器中无法实现的功能,例如通过后台进程推送通知。 现在,我们计划添加更多特定于桌面的功能,例如 IMAP 支持(而不依赖于我们的服务器充当代理),自动备份和离线可用性。
|
||||
|
||||
我们选择 Electron 是因为它的 Chromium 和 Node.js 的组合最适合我们的小型开发团队,因为它只需要对我们的 Web 应用程序进行最小的更改。在我们开始使用时,可以将浏览器 API 用于所有功能特别有用,随着我们的进展,慢慢地用更多原生版本替换这些组件。这种方法对附件下载和通知特别方便。
|
||||
|
||||
### 调整安全性
|
||||
|
||||
我们知道有些人关注 Electron 的安全问题,但我们发现 Electron 在 Web 应用程序中微调访问的选项非常令人满意。你可以使用 Electron 的[安全文档][9]和 Luca Carettoni 的[Electron 安全清单][10]等资源,来帮助防止 Web 应用程序中不受信任的内容发生灾难性事故。
|
||||
|
||||
### 实现特定功能
|
||||
|
||||
Tutanota Web 客户端从一开始就构建了一个用于进程间通信的可靠协议。我们利用 Web 线程在加密和请求数据时保持用户界面(UI)响应性。当我们开始实现我们的移动应用时,这就派上用场,这些应用程序使用相同的协议在原生部分和 Web 视图之间进行通信。
|
||||
|
||||
这就是为什么当我们开始构建桌面客户端时,很多用于本机推送通知、打开邮箱和使用文件系统的部分等已经存在,因此只需要实现原生端(Node.js)。
|
||||
|
||||
另一个便利是我们的构建过程使用 [Babel 转译器][11],它允许我们以现代 ES6 JavaScript 编写整个代码库,并在不同环境之间混合和匹配功能模块。这使我们能够快速调整基于 Electron 的桌面应用程序的代码。但是,我们也遇到了一些挑战。
|
||||
|
||||
### 克服挑战
|
||||
|
||||
虽然 Electron 允许我们很容易地与不同平台的桌面环境集成,但你不能低估投入的时间!最后,正是这些小事情占用了比我们预期更多的时间,但对完成桌面客户端项目也至关重要。
|
||||
|
||||
特定于平台的代码导致了大部分阻碍:
|
||||
|
||||
* 例如,窗口管理和托盘仍然在三个平台上以略有不同的方式处理。
|
||||
* 注册 Tutanota 作为默认邮件程序并设置自动启动需要深入 Windows 注册表,同时确保以 [UAC] [12] 兼容的方式提示用户进行管理员访问。
|
||||
* 我们需要使用 Electron 的 API 作为快捷方式和菜单,以提供复制、粘贴、撤消和重做等标准功能。
|
||||
|
||||
由于用户对不同平台上的应用程序的某些(有时不直接兼容)行为的期望,此过程有点复杂。使三个版本感觉像原生的需要一些迭代,甚至需要对 Web 应用程序进行一些适度的补充,以提供类似于浏览器中的文本搜索的功能。
|
||||
|
||||
### 总结
|
||||
|
||||
我们在 Electron 方面的经验基本上是积极的,我们在不到四个月的时间内完成了该项目。尽管有一些相当耗时的功能,但我们感到惊讶的是,我们可以轻松地为 Linux 提供一个测试版的 [Tutanota 桌面客户端][13]。如果你有兴趣,可以深入了解 [GitHub][14] 上的源代码。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/linux-desktop-electron
|
||||
|
||||
作者:[Nils Ganther][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/nils-ganther
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/email_paper_envelope_document.png?itok=uPj_kouJ (document sending)
|
||||
[2]: https://tutanota.com/
|
||||
[3]: https://f-droid.org/en/packages/de.tutao.tutanota/
|
||||
[4]: https://electronjs.org/
|
||||
[5]: https://github.com/systemjs/systemjs
|
||||
[6]: https://mithril.js.org/
|
||||
[7]: https://tutanota.uservoice.com/forums/237921-general/filters/top?status_id=1177482
|
||||
[8]: https://tutanota.com/blog/posts/first-search-encrypted-data/
|
||||
[9]: https://electronjs.org/docs/tutorial/security
|
||||
[10]: https://www.blackhat.com/docs/us-17/thursday/us-17-Carettoni-Electronegativity-A-Study-Of-Electron-Security-wp.pdf
|
||||
[11]: https://babeljs.io/
|
||||
[12]: https://en.wikipedia.org/wiki/User_Account_Control
|
||||
[13]: https://tutanota.com/blog/posts/desktop-clients/
|
||||
[14]: https://www.github.com/tutao/tutanota
|
||||
135
published/201906/20190411 Be your own certificate authority.md
Normal file
135
published/201906/20190411 Be your own certificate authority.md
Normal file
@@ -0,0 +1,135 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10921-1.html)
|
||||
[#]: subject: (Be your own certificate authority)
|
||||
[#]: via: (https://opensource.com/article/19/4/certificate-authority)
|
||||
[#]: author: (Moshe Zadka https://opensource.com/users/moshez/users/elenajon123)
|
||||
|
||||
|
||||
自己成为一个证书颁发机构(CA)
|
||||
======
|
||||
|
||||
> 为你的微服务架构或者集成测试创建一个简单的内部 CA。
|
||||
|
||||

|
||||
|
||||
传输层安全([TLS][2])模型(有时也称它的旧名称 SSL)基于<ruby>[证书颁发机构][3]<rt>certificate authoritie</rt></ruby>(CA)的概念。这些机构受到浏览器和操作系统的信任,从而*签名*服务器的的证书以用于验证其所有权。
|
||||
|
||||
但是,对于内部网络,微服务架构或集成测试,有时候*本地 CA*更有用:一个只在内部受信任的 CA,然后签名本地服务器的证书。
|
||||
|
||||
这对集成测试特别有意义。获取证书可能会带来负担,因为这会占用服务器几分钟。但是在代码中使用“忽略证书”可能会被引入到生产环境,从而导致安全灾难。
|
||||
|
||||
CA 证书与常规服务器证书没有太大区别。重要的是它被本地代码信任。例如,在 Python `requests` 库中,可以通过将 `REQUESTS_CA_BUNDLE` 变量设置为包含此证书的目录来完成。
|
||||
|
||||
在为集成测试创建证书的例子中,不需要*长期的*证书:如果你的集成测试需要超过一天,那么你应该已经测试失败了。
|
||||
|
||||
因此,计算**昨天**和**明天**作为有效期间隔:
|
||||
|
||||
```
|
||||
>>> import datetime
|
||||
>>> one_day = datetime.timedelta(days=1)
|
||||
>>> today = datetime.date.today()
|
||||
>>> yesterday = today - one_day
|
||||
>>> tomorrow = today - one_day
|
||||
```
|
||||
|
||||
现在你已准备好创建一个简单的 CA 证书。你需要生成私钥,创建公钥,设置 CA 的“参数”,然后自签名证书:CA 证书*总是*自签名的。最后,导出证书文件以及私钥文件。
|
||||
|
||||
```
|
||||
from cryptography.hazmat.primitives.asymmetric import rsa
|
||||
from cryptography.hazmat.primitives import hashes, serialization
|
||||
from cryptography import x509
|
||||
from cryptography.x509.oid import NameOID
|
||||
|
||||
|
||||
private_key = rsa.generate_private_key(
|
||||
public_exponent=65537,
|
||||
key_size=2048,
|
||||
backend=default_backend()
|
||||
)
|
||||
public_key = private_key.public_key()
|
||||
builder = x509.CertificateBuilder()
|
||||
builder = builder.subject_name(x509.Name([
|
||||
x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
|
||||
]))
|
||||
builder = builder.issuer_name(x509.Name([
|
||||
x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
|
||||
]))
|
||||
builder = builder.not_valid_before(yesterday)
|
||||
builder = builder.not_valid_after(tomorrow)
|
||||
builder = builder.serial_number(x509.random_serial_number())
|
||||
builder = builder.public_key(public_key)
|
||||
builder = builder.add_extension(
|
||||
x509.BasicConstraints(ca=True, path_length=None),
|
||||
critical=True)
|
||||
certificate = builder.sign(
|
||||
private_key=private_key, algorithm=hashes.SHA256(),
|
||||
backend=default_backend()
|
||||
)
|
||||
private_bytes = private_key.private_bytes(
|
||||
encoding=serialization.Encoding.PEM,
|
||||
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
||||
encryption_algorithm=serialization.NoEncrption())
|
||||
public_bytes = certificate.public_bytes(
|
||||
encoding=serialization.Encoding.PEM)
|
||||
with open("ca.pem", "wb") as fout:
|
||||
fout.write(private_bytes + public_bytes)
|
||||
with open("ca.crt", "wb") as fout:
|
||||
fout.write(public_bytes)
|
||||
```
|
||||
|
||||
通常,真正的 CA 会需要[证书签名请求][4](CSR)来签名证书。但是,当你是自己的 CA 时,你可以制定自己的规则!可以径直签名你想要的内容。
|
||||
|
||||
继续集成测试的例子,你可以创建私钥并立即签名相应的公钥。注意 `COMMON_NAME` 需要是 `https` URL 中的“服务器名称”。如果你已配置名称查询,你需要服务器能响应对 `service.test.local` 的请求。
|
||||
|
||||
```
|
||||
service_private_key = rsa.generate_private_key(
|
||||
public_exponent=65537,
|
||||
key_size=2048,
|
||||
backend=default_backend()
|
||||
)
|
||||
service_public_key = service_private_key.public_key()
|
||||
builder = x509.CertificateBuilder()
|
||||
builder = builder.subject_name(x509.Name([
|
||||
x509.NameAttribute(NameOID.COMMON_NAME, 'service.test.local')
|
||||
]))
|
||||
builder = builder.not_valid_before(yesterday)
|
||||
builder = builder.not_valid_after(tomorrow)
|
||||
builder = builder.public_key(public_key)
|
||||
certificate = builder.sign(
|
||||
private_key=private_key, algorithm=hashes.SHA256(),
|
||||
backend=default_backend()
|
||||
)
|
||||
private_bytes = service_private_key.private_bytes(
|
||||
encoding=serialization.Encoding.PEM,
|
||||
format=serialization.PrivateFormat.TraditionalOpenSSL,
|
||||
encryption_algorithm=serialization.NoEncrption())
|
||||
public_bytes = certificate.public_bytes(
|
||||
encoding=serialization.Encoding.PEM)
|
||||
with open("service.pem", "wb") as fout:
|
||||
fout.write(private_bytes + public_bytes)
|
||||
```
|
||||
|
||||
现在 `service.pem` 文件有一个私钥和一个“有效”的证书:它已由本地的 CA 签名。该文件的格式可以给 Nginx、HAProxy 或大多数其他 HTTPS 服务器使用。
|
||||
|
||||
通过将此逻辑用在测试脚本中,只要客户端配置信任该 CA,那么就可以轻松创建看起来真实的 HTTPS 服务器。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/certificate-authority
|
||||
|
||||
作者:[Moshe Zadka][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/moshez/users/elenajon123
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_commun_4604_02_mech_connections_rhcz0.5x.png?itok=YPPU4dMj
|
||||
[2]: https://en.wikipedia.org/wiki/Transport_Layer_Security
|
||||
[3]: https://en.wikipedia.org/wiki/Certificate_authority
|
||||
[4]: https://en.wikipedia.org/wiki/Certificate_signing_request
|
||||
@@ -0,0 +1,374 @@
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "FSSlc"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-10930-1.html"
|
||||
[#]: subject: "Inter-process communication in Linux: Sockets and signals"
|
||||
[#]: via: "https://opensource.com/article/19/4/interprocess-communication-linux-networking"
|
||||
[#]: author: "Marty Kalin https://opensource.com/users/mkalindepauledu"
|
||||
|
||||
Linux 下的进程间通信:套接字和信号
|
||||
======
|
||||
|
||||
> 学习在 Linux 中进程是如何与其他进程进行同步的。
|
||||
|
||||

|
||||
|
||||
本篇是 Linux 下[进程间通信][1](IPC)系列的第三篇同时也是最后一篇文章。[第一篇文章][2]聚焦在通过共享存储(文件和共享内存段)来进行 IPC,[第二篇文章][3]则通过管道(无名的或者命名的)及消息队列来达到相同的目的。这篇文章将目光从高处(套接字)然后到低处(信号)来关注 IPC。代码示例将用力地充实下面的解释细节。
|
||||
|
||||
### 套接字
|
||||
|
||||
正如管道有两种类型(命名和无名)一样,套接字也有两种类型。IPC 套接字(即 Unix 套接字)给予进程在相同设备(主机)上基于通道的通信能力;而网络套接字给予进程运行在不同主机的能力,因此也带来了网络通信的能力。网络套接字需要底层协议的支持,例如 TCP(传输控制协议)或 UDP(用户数据报协议)。
|
||||
|
||||
与之相反,IPC 套接字依赖于本地系统内核的支持来进行通信;特别的,IPC 通信使用一个本地的文件作为套接字地址。尽管这两种套接字的实现有所不同,但在本质上,IPC 套接字和网络套接字的 API 是一致的。接下来的例子将包含网络套接字的内容,但示例服务器和客户端程序可以在相同的机器上运行,因为服务器使用了 `localhost`(127.0.0.1)这个网络地址,该地址表示的是本地机器上的本地机器地址。
|
||||
|
||||
套接字以流的形式(下面将会讨论到)被配置为双向的,并且其控制遵循 C/S(客户端/服务器端)模式:客户端通过尝试连接一个服务器来初始化对话,而服务器端将尝试接受该连接。假如万事顺利,来自客户端的请求和来自服务器端的响应将通过管道进行传输,直到其中任意一方关闭该通道,从而断开这个连接。
|
||||
|
||||
一个迭代服务器(只适用于开发)将一直和连接它的客户端打交道:从最开始服务第一个客户端,然后到这个连接关闭,然后服务第二个客户端,循环往复。这种方式的一个缺点是处理一个特定的客户端可能会挂起,使得其他的客户端一直在后面等待。生产级别的服务器将是并发的,通常使用了多进程或者多线程的混合。例如,我台式机上的 Nginx 网络服务器有一个 4 个<ruby>工人<rt>worker</rt></ruby>的进程池,它们可以并发地处理客户端的请求。在下面的代码示例中,我们将使用迭代服务器,使得我们将要处理的问题保持在一个很小的规模,只关注基本的 API,而不去关心并发的问题。
|
||||
|
||||
最后,随着各种 POSIX 改进的出现,套接字 API 随着时间的推移而发生了显著的变化。当前针对服务器端和客户端的示例代码特意写的比较简单,但是它着重强调了基于流的套接字中连接的双方。下面是关于流控制的一个总结,其中服务器端在一个终端中开启,而客户端在另一个不同的终端中开启:
|
||||
|
||||
* 服务器端等待客户端的连接,对于给定的一个成功连接,它就读取来自客户端的数据。
|
||||
* 为了强调是双方的会话,服务器端会对接收自客户端的数据做回应。这些数据都是 ASCII 字符代码,它们组成了一些书的标题。
|
||||
* 客户端将书的标题写给服务器端的进程,并从服务器端的回应中读取到相同的标题。然后客户端和服务器端都在屏幕上打印出标题。下面是服务器端的输出,客户端的输出也和它完全一样:
|
||||
|
||||
```
|
||||
Listening on port 9876 for clients...
|
||||
War and Peace
|
||||
Pride and Prejudice
|
||||
The Sound and the Fury
|
||||
```
|
||||
|
||||
#### 示例 1. 使用套接字的客户端程序
|
||||
|
||||
```c
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "sock.h"
|
||||
|
||||
void report(const char* msg, int terminate) {
|
||||
perror(msg);
|
||||
if (terminate) exit(-1); /* failure */
|
||||
}
|
||||
|
||||
int main() {
|
||||
int fd = socket(AF_INET, /* network versus AF_LOCAL */
|
||||
SOCK_STREAM, /* reliable, bidirectional: TCP */
|
||||
0); /* system picks underlying protocol */
|
||||
if (fd < 0) report("socket", 1); /* terminate */
|
||||
|
||||
/* bind the server's local address in memory */
|
||||
struct sockaddr_in saddr;
|
||||
memset(&saddr, 0, sizeof(saddr)); /* clear the bytes */
|
||||
saddr.sin_family = AF_INET; /* versus AF_LOCAL */
|
||||
saddr.sin_addr.s_addr = htonl(INADDR_ANY); /* host-to-network endian */
|
||||
saddr.sin_port = htons(PortNumber); /* for listening */
|
||||
|
||||
if (bind(fd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0)
|
||||
report("bind", 1); /* terminate */
|
||||
|
||||
/* listen to the socket */
|
||||
if (listen(fd, MaxConnects) < 0) /* listen for clients, up to MaxConnects */
|
||||
report("listen", 1); /* terminate */
|
||||
|
||||
fprintf(stderr, "Listening on port %i for clients...\n", PortNumber);
|
||||
/* a server traditionally listens indefinitely */
|
||||
while (1) {
|
||||
struct sockaddr_in caddr; /* client address */
|
||||
int len = sizeof(caddr); /* address length could change */
|
||||
|
||||
int client_fd = accept(fd, (struct sockaddr*) &caddr, &len); /* accept blocks */
|
||||
if (client_fd < 0) {
|
||||
report("accept", 0); /* don't terminated, though there's a problem */
|
||||
continue;
|
||||
}
|
||||
|
||||
/* read from client */
|
||||
int i;
|
||||
for (i = 0; i < ConversationLen; i++) {
|
||||
char buffer[BuffSize + 1];
|
||||
memset(buffer, '\0', sizeof(buffer));
|
||||
int count = read(client_fd, buffer, sizeof(buffer));
|
||||
if (count > 0) {
|
||||
puts(buffer);
|
||||
write(client_fd, buffer, sizeof(buffer)); /* echo as confirmation */
|
||||
}
|
||||
}
|
||||
close(client_fd); /* break connection */
|
||||
} /* while(1) */
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
上面的服务器端程序执行典型的 4 个步骤来准备回应客户端的请求,然后接受其他的独立请求。这里每一个步骤都以服务器端程序调用的系统函数来命名。
|
||||
|
||||
1. `socket(…)`:为套接字连接获取一个文件描述符
|
||||
2. `bind(…)`:将套接字和服务器主机上的一个地址进行绑定
|
||||
3. `listen(…)`:监听客户端请求
|
||||
4. `accept(…)`:接受一个特定的客户端请求
|
||||
|
||||
上面的 `socket` 调用的完整形式为:
|
||||
|
||||
```
|
||||
int sockfd = socket(AF_INET, /* versus AF_LOCAL */
|
||||
SOCK_STREAM, /* reliable, bidirectional */
|
||||
0); /* system picks protocol (TCP) */
|
||||
```
|
||||
|
||||
第一个参数特别指定了使用的是一个网络套接字,而不是 IPC 套接字。对于第二个参数有多种选项,但 `SOCK_STREAM` 和 `SOCK_DGRAM`(数据报)是最为常用的。基于流的套接字支持可信通道,在这种通道中如果发生了信息的丢失或者更改,都将会被报告。这种通道是双向的,并且从一端到另外一端的有效载荷在大小上可以是任意的。相反的,基于数据报的套接字大多是不可信的,没有方向性,并且需要固定大小的载荷。`socket` 的第三个参数特别指定了协议。对于这里展示的基于流的套接字,只有一种协议选择:TCP,在这里表示的 `0`。因为对 `socket` 的一次成功调用将返回相似的文件描述符,套接字可以被读写,对应的语法和读写一个本地文件是类似的。
|
||||
|
||||
对 `bind` 的调用是最为复杂的,因为它反映出了在套接字 API 方面上的各种改进。我们感兴趣的点是这个调用将一个套接字和服务器端所在机器中的一个内存地址进行绑定。但对 `listen` 的调用就非常直接了:
|
||||
|
||||
```
|
||||
if (listen(fd, MaxConnects) < 0)
|
||||
```
|
||||
|
||||
第一个参数是套接字的文件描述符,第二个参数则指定了在服务器端处理一个拒绝连接错误之前,有多少个客户端连接被允许连接。(在头文件 `sock.h` 中 `MaxConnects` 的值被设置为 `8`。)
|
||||
|
||||
`accept` 调用默认将是一个阻塞等待:服务器端将不做任何事情直到一个客户端尝试连接它,然后进行处理。`accept` 函数返回的值如果是 `-1` 则暗示有错误发生。假如这个调用是成功的,则它将返回另一个文件描述符,这个文件描述符被用来指代另一个可读可写的套接字,它与 `accept` 调用中的第一个参数对应的接收套接字有所不同。服务器端使用这个可读可写的套接字来从客户端读取请求然后写回它的回应。接收套接字只被用于接受客户端的连接。
|
||||
|
||||
在设计上,服务器端可以一直运行下去。当然服务器端可以通过在命令行中使用 `Ctrl+C` 来终止它。
|
||||
|
||||
#### 示例 2. 使用套接字的客户端
|
||||
|
||||
```c
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <netdb.h>
|
||||
#include "sock.h"
|
||||
|
||||
const char* books[] = {"War and Peace",
|
||||
"Pride and Prejudice",
|
||||
"The Sound and the Fury"};
|
||||
|
||||
void report(const char* msg, int terminate) {
|
||||
perror(msg);
|
||||
if (terminate) exit(-1); /* failure */
|
||||
}
|
||||
|
||||
int main() {
|
||||
/* fd for the socket */
|
||||
int sockfd = socket(AF_INET, /* versus AF_LOCAL */
|
||||
SOCK_STREAM, /* reliable, bidirectional */
|
||||
0); /* system picks protocol (TCP) */
|
||||
if (sockfd < 0) report("socket", 1); /* terminate */
|
||||
|
||||
/* get the address of the host */
|
||||
struct hostent* hptr = gethostbyname(Host); /* localhost: 127.0.0.1 */
|
||||
if (!hptr) report("gethostbyname", 1); /* is hptr NULL? */
|
||||
if (hptr->h_addrtype != AF_INET) /* versus AF_LOCAL */
|
||||
report("bad address family", 1);
|
||||
|
||||
/* connect to the server: configure server's address 1st */
|
||||
struct sockaddr_in saddr;
|
||||
memset(&saddr, 0, sizeof(saddr));
|
||||
saddr.sin_family = AF_INET;
|
||||
saddr.sin_addr.s_addr =
|
||||
((struct in_addr*) hptr->h_addr_list[0])->s_addr;
|
||||
saddr.sin_port = htons(PortNumber); /* port number in big-endian */
|
||||
|
||||
if (connect(sockfd, (struct sockaddr*) &saddr, sizeof(saddr)) < 0)
|
||||
report("connect", 1);
|
||||
|
||||
/* Write some stuff and read the echoes. */
|
||||
puts("Connect to server, about to write some stuff...");
|
||||
int i;
|
||||
for (i = 0; i < ConversationLen; i++) {
|
||||
if (write(sockfd, books[i], strlen(books[i])) > 0) {
|
||||
/* get confirmation echoed from server and print */
|
||||
char buffer[BuffSize + 1];
|
||||
memset(buffer, '\0', sizeof(buffer));
|
||||
if (read(sockfd, buffer, sizeof(buffer)) > 0)
|
||||
puts(buffer);
|
||||
}
|
||||
}
|
||||
puts("Client done, about to exit...");
|
||||
close(sockfd); /* close the connection */
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
客户端程序的设置代码和服务器端类似。两者主要的区别既不是在于监听也不在于接收,而是连接:
|
||||
|
||||
```
|
||||
if (connect(sockfd, (struct sockaddr*) &saddr, sizeof(saddr)) < 0)
|
||||
```
|
||||
|
||||
对 `connect` 的调用可能因为多种原因而导致失败,例如客户端拥有错误的服务器端地址或者已经有太多的客户端连接上了服务器端。假如 `connect` 操作成功,客户端将在一个 `for` 循环中,写入它的请求然后读取返回的响应。在会话后,服务器端和客户端都将调用 `close` 去关闭这个可读可写套接字,尽管任何一边的关闭操作就足以关闭它们之间的连接。此后客户端可以退出了,但正如前面提到的那样,服务器端可以一直保持开放以处理其他事务。
|
||||
|
||||
从上面的套接字示例中,我们看到了请求信息被回显给客户端,这使得客户端和服务器端之间拥有进行丰富对话的可能性。也许这就是套接字的主要魅力。在现代系统中,客户端应用(例如一个数据库客户端)和服务器端通过套接字进行通信非常常见。正如先前提及的那样,本地 IPC 套接字和网络套接字只在某些实现细节上面有所不同,一般来说,IPC 套接字有着更低的消耗和更好的性能。它们的通信 API 基本是一样的。
|
||||
|
||||
### 信号
|
||||
|
||||
信号会中断一个正在执行的程序,在这种意义下,就是用信号与这个程序进行通信。大多数的信号要么可以被忽略(阻塞)或者被处理(通过特别设计的代码)。`SIGSTOP` (暂停)和 `SIGKILL`(立即停止)是最应该提及的两种信号。这种符号常量有整数类型的值,例如 `SIGKILL` 对应的值为 `9`。
|
||||
|
||||
信号可以在与用户交互的情况下发生。例如,一个用户从命令行中敲了 `Ctrl+C` 来终止一个从命令行中启动的程序;`Ctrl+C` 将产生一个 `SIGTERM` 信号。`SIGTERM` 意即终止,它可以被阻塞或者被处理,而不像 `SIGKILL` 信号那样。一个进程也可以通过信号和另一个进程通信,这样使得信号也可以作为一种 IPC 机制。
|
||||
|
||||
考虑一下一个多进程应用,例如 Nginx 网络服务器是如何被另一个进程优雅地关闭的。`kill` 函数:
|
||||
|
||||
```
|
||||
int kill(pid_t pid, int signum); /* declaration */
|
||||
```
|
||||
|
||||
可以被一个进程用来终止另一个进程或者一组进程。假如 `kill` 函数的第一个参数是大于 `0` 的,那么这个参数将会被认为是目标进程的 `pid`(进程 ID),假如这个参数是 `0`,则这个参数将会被视作信号发送者所属的那组进程。
|
||||
|
||||
`kill` 的第二个参数要么是一个标准的信号数字(例如 `SIGTERM` 或 `SIGKILL`),要么是 `0` ,这将会对信号做一次询问,确认第一个参数中的 `pid` 是否是有效的。这样优雅地关闭一个多进程应用就可以通过向组成该应用的一组进程发送一个终止信号来完成,具体来说就是调用一个 `kill` 函数,使得这个调用的第二个参数是 `SIGTERM` 。(Nginx 主进程可以通过调用 `kill` 函数来终止其他工人进程,然后再停止自己。)就像许多库函数一样,`kill` 函数通过一个简单的可变语法拥有更多的能力和灵活性。
|
||||
|
||||
#### 示例 3. 一个多进程系统的优雅停止
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
void graceful(int signum) {
|
||||
printf("\tChild confirming received signal: %i\n", signum);
|
||||
puts("\tChild about to terminate gracefully...");
|
||||
sleep(1);
|
||||
puts("\tChild terminating now...");
|
||||
_exit(0); /* fast-track notification of parent */
|
||||
}
|
||||
|
||||
void set_handler() {
|
||||
struct sigaction current;
|
||||
sigemptyset(¤t.sa_mask); /* clear the signal set */
|
||||
current.sa_flags = 0; /* enables setting sa_handler, not sa_action */
|
||||
current.sa_handler = graceful; /* specify a handler */
|
||||
sigaction(SIGTERM, ¤t, NULL); /* register the handler */
|
||||
}
|
||||
|
||||
void child_code() {
|
||||
set_handler();
|
||||
|
||||
while (1) { /` loop until interrupted `/
|
||||
sleep(1);
|
||||
puts("\tChild just woke up, but going back to sleep.");
|
||||
}
|
||||
}
|
||||
|
||||
void parent_code(pid_t cpid) {
|
||||
puts("Parent sleeping for a time...");
|
||||
sleep(5);
|
||||
|
||||
/* Try to terminate child. */
|
||||
if (-1 == kill(cpid, SIGTERM)) {
|
||||
perror("kill");
|
||||
exit(-1);
|
||||
}
|
||||
wait(NULL); /` wait for child to terminate `/
|
||||
puts("My child terminated, about to exit myself...");
|
||||
}
|
||||
|
||||
int main() {
|
||||
pid_t pid = fork();
|
||||
if (pid < 0) {
|
||||
perror("fork");
|
||||
return -1; /* error */
|
||||
}
|
||||
if (0 == pid)
|
||||
child_code();
|
||||
else
|
||||
parent_code(pid);
|
||||
return 0; /* normal */
|
||||
}
|
||||
```
|
||||
|
||||
上面的停止程序模拟了一个多进程系统的优雅退出,在这个例子中,这个系统由一个父进程和一个子进程组成。这次模拟的工作流程如下:
|
||||
|
||||
* 父进程尝试去 `fork` 一个子进程。假如这个 `fork` 操作成功了,每个进程就执行它自己的代码:子进程就执行函数 `child_code`,而父进程就执行函数 `parent_code`。
|
||||
* 子进程将会进入一个潜在的无限循环,在这个循环中子进程将睡眠一秒,然后打印一个信息,接着再次进入睡眠状态,以此循环往复。来自父进程的一个 `SIGTERM` 信号将引起子进程去执行一个信号处理回调函数 `graceful`。这样这个信号就使得子进程可以跳出循环,然后进行子进程和父进程之间的优雅终止。在终止之前,进程将打印一个信息。
|
||||
* 在 `fork` 一个子进程后,父进程将睡眠 5 秒,使得子进程可以执行一会儿;当然在这个模拟中,子进程大多数时间都在睡眠。然后父进程调用 `SIGTERM` 作为第二个参数的 `kill` 函数,等待子进程的终止,然后自己再终止。
|
||||
|
||||
下面是一次运行的输出:
|
||||
|
||||
```
|
||||
% ./shutdown
|
||||
Parent sleeping for a time...
|
||||
Child just woke up, but going back to sleep.
|
||||
Child just woke up, but going back to sleep.
|
||||
Child just woke up, but going back to sleep.
|
||||
Child just woke up, but going back to sleep.
|
||||
Child confirming received signal: 15 ## SIGTERM is 15
|
||||
Child about to terminate gracefully...
|
||||
Child terminating now...
|
||||
My child terminated, about to exit myself...
|
||||
```
|
||||
|
||||
对于信号的处理,上面的示例使用了 `sigaction` 库函数(POSIX 推荐的用法)而不是传统的 `signal` 函数,`signal` 函数有移植性问题。下面是我们主要关心的代码片段:
|
||||
|
||||
* 假如对 `fork` 的调用成功了,父进程将执行 `parent_code` 函数,而子进程将执行 `child_code` 函数。在给子进程发送信号之前,父进程将会等待 5 秒:
|
||||
|
||||
```
|
||||
puts("Parent sleeping for a time...");
|
||||
sleep(5);
|
||||
if (-1 == kill(cpid, SIGTERM)) {
|
||||
...sleepkillcpidSIGTERM...
|
||||
```
|
||||
|
||||
假如 `kill` 调用成功了,父进程将在子进程终止时做等待,使得子进程不会变成一个僵尸进程。在等待完成后,父进程再退出。
|
||||
|
||||
* `child_code` 函数首先调用 `set_handler` 然后进入它的可能永久睡眠的循环。下面是我们将要查看的 `set_handler` 函数:
|
||||
|
||||
```
|
||||
void set_handler() {
|
||||
struct sigaction current; /* current setup */
|
||||
sigemptyset(¤t.sa_mask); /* clear the signal set */
|
||||
current.sa_flags = 0; /* for setting sa_handler, not sa_action */
|
||||
current.sa_handler = graceful; /* specify a handler */
|
||||
sigaction(SIGTERM, ¤t, NULL); /* register the handler */
|
||||
}
|
||||
```
|
||||
|
||||
上面代码的前三行在做相关的准备。第四个语句将为 `graceful` 设定为句柄,它将在调用 `_exit` 来停止之前打印一些信息。第 5 行和最后一行的语句将通过调用 `sigaction` 来向系统注册上面的句柄。`sigaction` 的第一个参数是 `SIGTERM` ,用作终止;第二个参数是当前的 `sigaction` 设定,而最后的参数(在这个例子中是 `NULL` )可被用来保存前面的 `sigaction` 设定,以备后面的可能使用。
|
||||
|
||||
使用信号来作为 IPC 的确是一个很轻量的方法,但确实值得尝试。通过信号来做 IPC 显然可以被归入 IPC 工具箱中。
|
||||
|
||||
### 这个系列的总结
|
||||
|
||||
在这个系列中,我们通过三篇有关 IPC 的文章,用示例代码介绍了如下机制:
|
||||
|
||||
* 共享文件
|
||||
* 共享内存(通过信号量)
|
||||
* 管道(命名和无名)
|
||||
* 消息队列
|
||||
* 套接字
|
||||
* 信号
|
||||
|
||||
甚至在今天,在以线程为中心的语言,例如 Java、C# 和 Go 等变得越来越流行的情况下,IPC 仍然很受欢迎,因为相比于使用多线程,通过多进程来实现并发有着一个明显的优势:默认情况下,每个进程都有它自己的地址空间,除非使用了基于共享内存的 IPC 机制(为了达到安全的并发,竞争条件在多线程和多进程的时候必须被加上锁),在多进程中可以排除掉基于内存的竞争条件。对于任何一个写过即使是基本的通过共享变量来通信的多线程程序的人来说,他都会知道想要写一个清晰、高效、线程安全的代码是多么具有挑战性。使用单线程的多进程的确是很有吸引力的,这是一个切实可行的方式,使用它可以利用好今天多处理器的机器,而不需要面临基于内存的竞争条件的风险。
|
||||
|
||||
当然,没有一个简单的答案能够回答上述 IPC 机制中的哪一个更好。在编程中每一种 IPC 机制都会涉及到一个取舍问题:是追求简洁,还是追求功能强大。以信号来举例,它是一个相对简单的 IPC 机制,但并不支持多个进程之间的丰富对话。假如确实需要这样的对话,另外的选择可能会更合适一些。带有锁的共享文件则相对直接,但是当要处理大量共享的数据流时,共享文件并不能很高效地工作。管道,甚至是套接字,有着更复杂的 API,可能是更好的选择。让具体的问题去指导我们的选择吧。
|
||||
|
||||
尽管所有的示例代码(可以在[我的网站][4]上获取到)都是使用 C 写的,其他的编程语言也经常提供这些 IPC 机制的轻量包装。这些代码示例都足够短小简单,希望这样能够鼓励你去进行实验。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/interprocess-communication-linux-networking
|
||||
|
||||
作者:[Marty Kalin][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[FSSlc](https://github.com/FSSlc)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/mkalindepauledu
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://en.wikipedia.org/wiki/Inter-process_communication
|
||||
[2]: https://linux.cn/article-10826-1.html
|
||||
[3]: https://linux.cn/article-10845-1.html
|
||||
[4]: http://condor.depaul.edu/mkalin
|
||||
@@ -0,0 +1,69 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10926-1.html)
|
||||
[#]: subject: (4 open source apps for plant-based diets)
|
||||
[#]: via: (https://opensource.com/article/19/4/apps-plant-based-diets)
|
||||
[#]: author: (Joshua Allen Holm https://opensource.com/users/holmja)
|
||||
|
||||
4 款“吃草”的开源应用
|
||||
======
|
||||
|
||||
> 这些应用使素食者、纯素食主义者和那些想吃得更健康的杂食者找到可以吃的食物。
|
||||
|
||||

|
||||
|
||||
减少对肉类、乳制品和加工食品的消费对地球来说更好,也对你的健康更有益。改变你的饮食习惯可能很困难,但是一些开源的 Android 应用可以让你吃的更清淡。无论你是参加[无肉星期一][2]、践行 Mark Bittman 的 [6:00 前的素食][3]指南,还是完全切换到<ruby>[植物全食饮食][4]<rt>whole-food, plant-based diet</rt></ruby>(WFPB),这些应用能帮助你找出要吃什么、发现素食和素食友好的餐馆,并轻松地将你的饮食偏好传达给他人,来助你更好地走这条路。所有这些应用都是开源的,可从 [F-Droid 仓库][5]下载。
|
||||
|
||||
### Daily Dozen
|
||||
|
||||
![Daily Dozen app][6]
|
||||
|
||||
[Daily Dozen][7] 提供了医学博士、美国法医学会院士(FACLM) Michael Greger 推荐的项目清单作为健康饮食和生活方式的一部分。Greger 博士建议食用由多种食物组成的基于植物的全食饮食,并坚持日常锻炼。该应用可以让你跟踪你吃的每种食物的份数,你喝了多少份水(或其他获准的饮料,如茶),以及你是否每天锻炼。每类食物都提供食物分量和属于该类别的食物清单。例如,十字花科蔬菜类包括白菜、花椰菜、抱子甘蓝等许多其他建议。
|
||||
|
||||
### Food Restrictions
|
||||
|
||||
![Food Restrictions app][8]
|
||||
|
||||
[Food Restrictions][9] 是一个简单的应用,它可以帮助你将你的饮食限制传达给他人,即使这些人不会说你的语言。用户可以输入七种不同类别的食物限制:鸡肉、牛肉、猪肉、鱼、奶酪、牛奶和辣椒。每种类别都有“我不吃”和“我过敏”选项。“不吃”选项会显示带有红色 X 的图标。“过敏” 选项显示 “X” 和小骷髅图标。可以使用文本而不是图标显示相同的信息,但文本仅提供英语和葡萄牙语。还有一个选项可以显示一条文字信息,说明用户是素食主义者或纯素食主义者,它比选择选项更简洁、更准确地总结了这些饮食限制。纯素食主义者的文本清楚地提到不吃鸡蛋和蜂蜜,这在选择选项中是没有的。但是,就像选择选项方式的文字版本一样,这些句子仅提供英语和葡萄牙语。
|
||||
|
||||
### OpenFoodFacts
|
||||
|
||||
![Open Food Facts app][10]
|
||||
|
||||
购买杂货时避免买入不必要的成分可能令人沮丧,但 [OpenFoodFacts][11] 可以帮助简化流程。该应用可让你扫描产品上的条形码,以获得有关产品成分和是否健康的报告。即使产品符合纯素产品的标准,产品仍然可能非常不健康。拥有成分列表和营养成分可让你在购物时做出明智的选择。此应用的唯一缺点是数据是用户贡献的,因此并非每个产品都可有数据,但如果你想回馈项目,你可以贡献新数据。
|
||||
|
||||
### OpenVegeMap
|
||||
|
||||
![OpenVegeMap app][12]
|
||||
|
||||
使用 [OpenVegeMap][13] 查找你附近的纯素食或素食主义餐厅。此应用可以通过手机的当前位置或者输入地址来搜索。餐厅分类为仅限纯素食者、适合纯素食者,仅限素食主义者,适合素食者,非素食和未知。该应用使用来自 [OpenStreetMap][14] 的数据和用户提供的有关餐馆的信息,因此请务必仔细检查以确保所提供的信息是最新且准确的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/apps-plant-based-diets
|
||||
|
||||
作者:[Joshua Allen Holm][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/holmja
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolserieshe_rh_041x_0.png?itok=tfg6_I78
|
||||
[2]: https://www.meatlessmonday.com/
|
||||
[3]: https://www.amazon.com/dp/0385344740/
|
||||
[4]: https://nutritionstudies.org/whole-food-plant-based-diet-guide/
|
||||
[5]: https://f-droid.org/
|
||||
[6]: https://opensource.com/sites/default/files/uploads/daily_dozen.png (Daily Dozen app)
|
||||
[7]: https://f-droid.org/en/packages/org.nutritionfacts.dailydozen/
|
||||
[8]: https://opensource.com/sites/default/files/uploads/food_restrictions.png (Food Restrictions app)
|
||||
[9]: https://f-droid.org/en/packages/br.com.frs.foodrestrictions/
|
||||
[10]: https://opensource.com/sites/default/files/uploads/openfoodfacts.png (Open Food Facts app)
|
||||
[11]: https://f-droid.org/en/packages/openfoodfacts.github.scrachx.openfood/
|
||||
[12]: https://opensource.com/sites/default/files/uploads/openvegmap.png (OpenVegeMap app)
|
||||
[13]: https://f-droid.org/en/packages/pro.rudloff.openvegemap/
|
||||
[14]: https://www.openstreetmap.org/
|
||||
@@ -0,0 +1,59 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (ninifly)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11009-1.html)
|
||||
[#]: subject: (Edge computing is in most industries’ future)
|
||||
[#]: via: (https://www.networkworld.com/article/3391016/edge-computing-is-in-most-industries-future.html)
|
||||
[#]: author: (Anne Taylor https://www.networkworld.com/author/Anne-Taylor/)
|
||||
|
||||
边缘计算是大多数行业的未来
|
||||
======
|
||||
|
||||
> 几乎每个行业都可以利用边缘计算来加速数字化转型。
|
||||
|
||||

|
||||
|
||||
边缘计算的发展将取得一次巨大的飞跃。[据 Gartner 数据][2],现在公司有 10% 的数据是在传统数据中心或云之外生成的。但在未来六年内,这一比例将升至 75%。
|
||||
|
||||
这很大程度上取决于处理来自设备数据的需要,比如物联网(IoT)数据传感器。早期采用这一方法的包括:
|
||||
|
||||
* **制造商**:设备与传感器似乎是这个行业特有的,因此需要为产生的数据找到更快速的方法也就不足为奇。一份 [Automation World][3] 最近的研究发现 43% 的制造商已经部署了边缘计算项目。最常用用途包括生产/制造数据分析与设备数据分析。
|
||||
* **零售商**:与大多数深受数字化运营需求影响的产业一样,零售商也不得不革新了其客户体验。为此,这些组织“正在积极投资贴近于买家的计算能力”,施耐德电气公司 IT 部门执行副总裁 [Dave Johnson][4] 如是说。他列举了一些例子,例如在试衣间的增强现实(AR)镜子,提供了不同的服装选择,而不用顾客试用这些服装。又如用于显示店内导航的基于信标的热图。
|
||||
* **医疗保健机构**:随着医疗保健成本的不断上升,这一行业已经具备了提高生产能力与成本效率方面的创新能力。管理咨询公司[麦肯锡已经确定][5],至少有 11 个有益于患者、医疗机构或两者的医疗保健用例。举两个例子:提高护理效率并有助于优化设备的跟踪移动医疗设备;跟踪用户锻炼并提供健康建议的可穿戴设备。
|
||||
|
||||
虽然以上这些是明显的用例,随着边缘计算市场的扩大,采用它的行业也会增加。
|
||||
|
||||
### 数字化转型的优势
|
||||
|
||||
随着边缘计算的快速处理能力完全符合数字化转型的目标:提高效率、生产能力和加速产品上市和客户体验。以下是一些有潜力的应用及将被边缘计算改变的行业:
|
||||
|
||||
**农业**:农民和组织已经使用无人机将农田和气候环境传给灌溉设备。其他的应用可能包括了对工人、牲畜和设备的监测与位置跟踪,从而改善生产能力、效率和成本。
|
||||
|
||||
**能源**:在这一领域有许多的潜在的应用,可以使消费者与供应商都受益。例如,智能电表有助于业主更好地管理能源使用,同时减少电网运营商对手动抄表的需求。同样的,水管上的传感器能够监测到漏水,同时提供实时漏水数据。
|
||||
|
||||
**金融服务**:银行正在采取交互式 ATM 机,这种交互式 ATM 机能够快速地处理数据以提供更好的用户体验。在管理层次,可以更快速地分析交易数据中的欺诈行为。
|
||||
|
||||
**物流**:由于消费者需要更快速地交付商品和服务,物流公司将需要转换其地图和寻路功能以获取实时数据,尤其在最后一公里计划和跟踪方面。这可能涉及到基于街道、包裹及汽车的传感器数据传输处理过程。
|
||||
|
||||
得益于边缘计算,所有行业都有转型的潜力。但是,这将取决于他们如何处理计算基础设施。可以在 [APC.com][6] 找到如何克服任何 IT 阻碍的解决方案。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3391016/edge-computing-is-in-most-industries-future.html
|
||||
|
||||
作者:[Anne Taylor][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[ninifly](https://github.com/ninifly)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Anne-Taylor/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/04/istock-1019389496-100794424-large.jpg
|
||||
[2]: https://www.gartner.com/smarterwithgartner/what-edge-computing-means-for-infrastructure-and-operations-leaders/
|
||||
[3]: https://www.automationworld.com/article/technologies/cloud-computing/its-not-edge-vs-cloud-its-both
|
||||
[4]: https://blog.schneider-electric.com/datacenter/2018/07/10/why-brick-and-mortar-retail-quickly-establishing-leadership-edge-computing/
|
||||
[5]: https://www.mckinsey.com/industries/high-tech/our-insights/new-demand-new-markets-what-edge-computing-means-for-hardware-companies
|
||||
[6]: https://www.apc.com/us/en/solutions/business-solutions/edge-computing.jsp
|
||||
@@ -0,0 +1,137 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Modrisco)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10968-1.html)
|
||||
[#]: subject: (Epic Games Store is Now Available on Linux Thanks to Lutris)
|
||||
[#]: via: (https://itsfoss.com/epic-games-lutris-linux/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
有了 Lutris,Linux 现在也可以启动 Epic 游戏商城
|
||||
======
|
||||
|
||||
> 开源游戏平台 Lutris 现在使你能够在 Linux 上使用 Epic 游戏商城。我们使用 Ubuntu 19.04 版本进行了测试,以下是我们的使用体验。
|
||||
|
||||
[在 Linux 上玩游戏][1] 正变得越来越容易。Steam [正在开发中的][3] 特性可以帮助你实现 [在 Linux 上玩 Windows 游戏][2]。
|
||||
|
||||
如果说 Steam 在 Linux 运行 Windows 游戏领域还是新玩家,而 Lutris 却已从事多年。
|
||||
|
||||
[Lutris][4] 是一款为 Linux 开发的开源游戏平台,提供诸如 Origin、Steam、战网等平台的游戏安装器。它使用 Wine 来运行 Linux 不能支持的程序。
|
||||
|
||||
Lutris 近期宣布你可以通过它来运行 Epic 游戏商店。
|
||||
|
||||
### Lutris 为 Linux 带来了 Epic 游戏
|
||||
|
||||
![Epic Games Store Lutris Linux][5]
|
||||
|
||||
[Epic 游戏商城][6] 是一个类似 Steam 的电子游戏分销平台。它目前只支持 Windows 和 macOS。
|
||||
|
||||
Lutris 团队付出了大量努力使 Linux 用户可以通过 Lutris 使用 Epic 游戏商城。虽然我不用 Epic 商城,但可以通过 Lutris 在 Linux 上运行 Epic 商城终归是个好消息。
|
||||
|
||||
> 好消息! 你现在可以通过 Lutris 安装获得 [@EpicGames][7] 商城在 Linux 下的全功能支持!没有发现任何问题。 <https://t.co/cYmd7PcYdG>[@TimSweeneyEpic][8] 可能会很喜欢 😊
|
||||
>
|
||||
> ![pic.twitter.com/7mt9fXt7TH][9]
|
||||
>
|
||||
> — Lutris Gaming (@LutrisGaming) [April 17, 2019][10]
|
||||
|
||||
作为一名狂热的游戏玩家和 Linux 用户,我立即得到了这个消息,并安装了 Lutris 来运行 Epic 游戏。
|
||||
|
||||
**备注:** 我使用 [Ubuntu 19.04][11] 来测试 Linux 环境下的游戏运行情况。
|
||||
|
||||
### 通过 Lutris 在 Linux 下使用 Epic 游戏商城
|
||||
|
||||
为了在你的 Linux 系统中安装 Epic 游戏商城,请确保你已经安装了 Wine 和 Python 3。接下来,[在 Ubuntu 中安装 Wine][12] ,或任何你正在使用的 Linux 发行版本也都可以。然后, [从官方网站下载 Lutris][13].
|
||||
|
||||
#### 安装 Epic 游戏商城
|
||||
|
||||
Lutris 安装成功后,直接启动它。
|
||||
|
||||
当我尝试时,我遇到了一个问题(当我用 GUI 启动时却没有遇到)。当我尝试在命令行输入 `lutris` 来启动时,我发现了下图所示的错误:
|
||||
|
||||
![][15]
|
||||
|
||||
感谢 Abhishek,我了解到了这是一个常见问题 (你可以在 [GitHub][16] 上查看这个问题)。
|
||||
|
||||
总之,为了解决这个问题,我需要在命令行中输入以下命令:
|
||||
|
||||
```
|
||||
export LC_ALL=C
|
||||
```
|
||||
|
||||
当你遇到同样的问题时,只要你输入这个命令,就能正常启动 Lutris 了。
|
||||
|
||||
**注意**:每次启动 Lutris 时都必须输入这个命令。因此,最好将其添加到 `.bashrc` 文件或环境变量列表中。
|
||||
|
||||
上述操作完成后,只要启动并搜索 “Epic Games Store” 会显示以下图片中的内容:
|
||||
|
||||
![Epic Games Store in Lutris][17]
|
||||
|
||||
在这里,我已经安装过了,所以你将会看到“安装”选项,它会自动询问你是否需要安装需要的包。只需要继续操作就可以成功安装。就是这样,不需要任何黑科技。
|
||||
|
||||
#### 玩一款 Epic 游戏商城中的游戏
|
||||
|
||||
![Epic Games Store][18]
|
||||
|
||||
现在我们已经通过 Lutris 在 Linux 上安装了 Epic 游戏商城,启动它并登录你的账号就可以开始了。
|
||||
|
||||
但这真会奏效吗?
|
||||
|
||||
*是的,Epic 游戏商城可以运行。* **但是所有游戏都不能玩。**(LCTT 译注:莫生气,请看文末的进一步解释!)
|
||||
|
||||
好吧,我并没有尝试过所有内容,但是我拿了一个免费的游戏(Transistor —— 一款回合制 ARPG 游戏)来检查它是否工作。
|
||||
|
||||
![Transistor – Epic Games Store][19]
|
||||
|
||||
很不幸,游戏没有启动。当我运行时界面显示了 “Running” 不过什么都没有发生。
|
||||
|
||||
到目前为止,我还不知道有什么解决方案 —— 所以如果我找到解决方案,我会尽力让你们知道最新情况。
|
||||
|
||||
### 总结
|
||||
|
||||
通过 Lutris 这样的工具使 Linux 的游戏场景得到了改善,这终归是个好消息 。不过,仍有许多工作要做。
|
||||
|
||||
对于在 Linux 上运行的游戏来说,无障碍运行仍然是一个挑战。其中可能就会有我遇到的这种问题,或者其它类似的。但它正朝着正确的方向发展 —— 即使还存在着一些问题。
|
||||
|
||||
你有什么看法吗?你是否也尝试用 Lutris 在 Linux 上启动 Epic 游戏商城?在下方评论让我们看看你的意见。
|
||||
|
||||
### 补充
|
||||
|
||||
Transistor 实际上有一个原生的 Linux 移植版。到目前为止,我从 Epic 获得的所有游戏都是如此。所以我会试着压下我的郁闷,而因为 Epic 只让你玩你通过他们的商店/启动器购买的游戏,所以在 Linux 机器上用 Lutris 玩这个原生的 Linux 游戏是不可能的。这简直愚蠢极了。Steam 有一个原生的 Linux 启动器,虽然不是很理想,但它可以工作。GOG 允许你从网站下载购买的内容,可以在你喜欢的任何平台上玩这些游戏。他们的启动器完全是可选的。
|
||||
|
||||
我对此非常恼火,因为我在我的 Epic 库中的游戏都是可以在我的笔记本电脑上运行得很好的游戏,当我坐在桌面前时,玩起来很有趣。但是因为那台桌面机是我唯一拥有的 Windows 机器……
|
||||
|
||||
我选择使用 Linux 时已经知道会存在兼容性问题,并且我有一个专门用于游戏的 Windows 机器,而我通过 Epic 获得的游戏都是免费的,所以我在这里只是表示一下不满。但是,他们两个作为最著名的竞争对手,Epic 应该有在我的 Linux 机器上玩原生 Linux 移植版的机制。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/epic-games-lutris-linux/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Modrisco](https://github.com/Modrisco)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://linux.cn/article-7316-1.html
|
||||
[2]: https://linux.cn/article-10061-1.html
|
||||
[3]: https://linux.cn/article-10054-1.html
|
||||
[4]: https://lutris.net/
|
||||
[5]: https://itsfoss.com/wp-content/uploads/2019/04/epic-games-store-lutris-linux-800x450.png
|
||||
[6]: https://www.epicgames.com/store/en-US/
|
||||
[7]: https://twitter.com/EpicGames?ref_src=twsrc%5Etfw
|
||||
[8]: https://twitter.com/TimSweeneyEpic?ref_src=twsrc%5Etfw
|
||||
[9]: https://pbs.twimg.com/media/D4XkXafX4AARDkW?format=jpg&name=medium
|
||||
[10]: https://twitter.com/LutrisGaming/status/1118552969816018948?ref_src=twsrc%5Etfw
|
||||
[11]: https://itsfoss.com/ubuntu-19-04-release-features/
|
||||
[12]: https://itsfoss.com/install-latest-wine/
|
||||
[13]: https://lutris.net/downloads/
|
||||
[14]: https://itsfoss.com/ubuntu-mate-entroware/
|
||||
[15]: https://itsfoss.com/wp-content/uploads/2019/04/lutris-error.jpg
|
||||
[16]: https://github.com/lutris/lutris/issues/660
|
||||
[17]: https://itsfoss.com/wp-content/uploads/2019/04/lutris-epic-games-store-800x520.jpg
|
||||
[18]: https://itsfoss.com/wp-content/uploads/2019/04/epic-games-store-800x450.jpg
|
||||
[19]: https://itsfoss.com/wp-content/uploads/2019/04/transistor-game-epic-games-store-800x410.jpg
|
||||
[20]: https://itsfoss.com/skpe-alpha-linux/
|
||||
@@ -0,0 +1,256 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (tomjlw)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10955-1.html)
|
||||
[#]: subject: (How to identify same-content files on Linux)
|
||||
[#]: via: (https://www.networkworld.com/article/3390204/how-to-identify-same-content-files-on-linux.html#tk.rss_all)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
如何在 Linux 上识别同样内容的文件
|
||||
======
|
||||
> 有时文件副本相当于对硬盘空间的巨大浪费,并会在你想要更新文件时造成困扰。以下是用来识别这些文件的六个命令。
|
||||
|
||||
![Vinoth Chandar \(CC BY 2.0\)][1]
|
||||
|
||||
在最近的帖子中,我们看了[如何识别并定位硬链接的文件][2](即,指向同一硬盘内容并共享 inode)。在本文中,我们将查看能找到具有相同*内容*,却不相链接的文件的命令。
|
||||
|
||||
硬链接很有用是因为它们能够使文件存放在文件系统内的多个地方却不会占用额外的硬盘空间。另一方面,有时文件副本相当于对硬盘空间的巨大浪费,在你想要更新文件时也会有造成困扰之虞。在本文中,我们将看一下多种识别这些文件的方式。
|
||||
|
||||
### 用 diff 命令比较文件
|
||||
|
||||
可能比较两个文件最简单的方法是使用 `diff` 命令。输出会显示你文件的不同之处。`<` 和 `>` 符号代表在当参数传过来的第一个(`<`)或第二个(`>`)文件中是否有额外的文字行。在这个例子中,在 `backup.html` 中有额外的文字行。
|
||||
|
||||
```
|
||||
$ diff index.html backup.html
|
||||
2438a2439,2441
|
||||
> <pre>
|
||||
> That's all there is to report.
|
||||
> </pre>
|
||||
```
|
||||
|
||||
如果 `diff` 没有输出那代表两个文件相同。
|
||||
|
||||
```
|
||||
$ diff home.html index.html
|
||||
$
|
||||
```
|
||||
|
||||
`diff` 的唯一缺点是它一次只能比较两个文件并且你必须指定用来比较的文件,这篇帖子中的一些命令可以为你找到多个重复文件。
|
||||
|
||||
### 使用校验和
|
||||
|
||||
`cksum`(checksum) 命令计算文件的校验和。校验和是一种将文字内容转化成一个长数字(例如2819078353 228029)的数学简化。虽然校验和并不是完全独有的,但是文件内容不同校验和却相同的概率微乎其微。
|
||||
|
||||
```
|
||||
$ cksum *.html
|
||||
2819078353 228029 backup.html
|
||||
4073570409 227985 home.html
|
||||
4073570409 227985 index.html
|
||||
```
|
||||
|
||||
在上述示例中,你可以看到产生同样校验和的第二个和第三个文件是如何可以被默认为相同的。
|
||||
|
||||
### 使用 find 命令
|
||||
|
||||
虽然 `find` 命令并没有寻找重复文件的选项,它依然可以被用来通过名字或类型寻找文件并运行 `cksum` 命令。例如:
|
||||
|
||||
```
|
||||
$ find . -name "*.html" -exec cksum {} \;
|
||||
4073570409 227985 ./home.html
|
||||
2819078353 228029 ./backup.html
|
||||
4073570409 227985 ./index.html
|
||||
```
|
||||
|
||||
### 使用 fslint 命令
|
||||
|
||||
`fslint` 命令可以被特地用来寻找重复文件。注意我们给了它一个起始位置。如果它需要遍历相当多的文件,这就需要花点时间来完成。注意它是如何列出重复文件并寻找其它问题的,比如空目录和坏 ID。
|
||||
|
||||
```
|
||||
$ fslint .
|
||||
-----------------------------------file name lint
|
||||
-------------------------------Invalid utf8 names
|
||||
-----------------------------------file case lint
|
||||
----------------------------------DUPlicate files <==
|
||||
home.html
|
||||
index.html
|
||||
-----------------------------------Dangling links
|
||||
--------------------redundant characters in links
|
||||
------------------------------------suspect links
|
||||
--------------------------------Empty Directories
|
||||
./.gnupg
|
||||
----------------------------------Temporary Files
|
||||
----------------------duplicate/conflicting Names
|
||||
------------------------------------------Bad ids
|
||||
-------------------------Non Stripped executables
|
||||
```
|
||||
|
||||
你可能需要在你的系统上安装 `fslint`。你可能也需要将它加入你的命令搜索路径:
|
||||
|
||||
```
|
||||
$ export PATH=$PATH:/usr/share/fslint/fslint
|
||||
```
|
||||
|
||||
### 使用 rdfind 命令
|
||||
|
||||
`rdfind` 命令也会寻找重复(相同内容的)文件。它的名字意即“重复数据搜寻”,并且它能够基于文件日期判断哪个文件是原件——这在你选择删除副本时很有用因为它会移除较新的文件。
|
||||
|
||||
```
|
||||
$ rdfind ~
|
||||
Now scanning "/home/shark", found 12 files.
|
||||
Now have 12 files in total.
|
||||
Removed 1 files due to nonunique device and inode.
|
||||
Total size is 699498 bytes or 683 KiB
|
||||
Removed 9 files due to unique sizes from list.2 files left.
|
||||
Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
|
||||
Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
|
||||
Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left.
|
||||
It seems like you have 2 files that are not unique
|
||||
Totally, 223 KiB can be reduced.
|
||||
Now making results file results.txt
|
||||
```
|
||||
|
||||
你可以在 `dryrun` 模式中运行这个命令 (换句话说,仅仅汇报可能会另外被做出的改动)。
|
||||
|
||||
```
|
||||
$ rdfind -dryrun true ~
|
||||
(DRYRUN MODE) Now scanning "/home/shark", found 12 files.
|
||||
(DRYRUN MODE) Now have 12 files in total.
|
||||
(DRYRUN MODE) Removed 1 files due to nonunique device and inode.
|
||||
(DRYRUN MODE) Total size is 699352 bytes or 683 KiB
|
||||
Removed 9 files due to unique sizes from list.2 files left.
|
||||
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
|
||||
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
|
||||
(DRYRUN MODE) Now eliminating candidates based on sha1 checksum:removed 0 files from list.2 files left.
|
||||
(DRYRUN MODE) It seems like you have 2 files that are not unique
|
||||
(DRYRUN MODE) Totally, 223 KiB can be reduced.
|
||||
(DRYRUN MODE) Now making results file results.txt
|
||||
```
|
||||
|
||||
`rdfind` 命令同样提供了类似忽略空文档(`-ignoreempty`)和跟踪符号链接(`-followsymlinks`)的功能。查看 man 页面获取解释。
|
||||
|
||||
```
|
||||
-ignoreempty ignore empty files
|
||||
-minsize ignore files smaller than speficied size
|
||||
-followsymlinks follow symbolic links
|
||||
-removeidentinode remove files referring to identical inode
|
||||
-checksum identify checksum type to be used
|
||||
-deterministic determiness how to sort files
|
||||
-makesymlinks turn duplicate files into symbolic links
|
||||
-makehardlinks replace duplicate files with hard links
|
||||
-makeresultsfile create a results file in the current directory
|
||||
-outputname provide name for results file
|
||||
-deleteduplicates delete/unlink duplicate files
|
||||
-sleep set sleep time between reading files (milliseconds)
|
||||
-n, -dryrun display what would have been done, but don't do it
|
||||
```
|
||||
|
||||
注意 `rdfind` 命令提供了 `-deleteduplicates true` 的设置选项以删除副本。希望这个命令语法上的小问题不会惹恼你。;-)
|
||||
|
||||
```
|
||||
$ rdfind -deleteduplicates true .
|
||||
...
|
||||
Deleted 1 files. <==
|
||||
```
|
||||
|
||||
你将可能需要在你的系统上安装 `rdfind` 命令。试验它以熟悉如何使用它可能是一个好主意。
|
||||
|
||||
### 使用 fdupes 命令
|
||||
|
||||
`fdupes` 命令同样使得识别重复文件变得简单。它同时提供了大量有用的选项——例如用来迭代的 `-r`。在这个例子中,它像这样将重复文件分组到一起:
|
||||
|
||||
```
|
||||
$ fdupes ~
|
||||
/home/shs/UPGRADE
|
||||
/home/shs/mytwin
|
||||
|
||||
/home/shs/lp.txt
|
||||
/home/shs/lp.man
|
||||
|
||||
/home/shs/penguin.png
|
||||
/home/shs/penguin0.png
|
||||
/home/shs/hideme.png
|
||||
```
|
||||
|
||||
这是使用迭代的一个例子,注意许多重复文件是重要的(用户的 `.bashrc` 和 `.profile` 文件)并且不应被删除。
|
||||
|
||||
```
|
||||
# fdupes -r /home
|
||||
/home/shark/home.html
|
||||
/home/shark/index.html
|
||||
|
||||
/home/dory/.bashrc
|
||||
/home/eel/.bashrc
|
||||
|
||||
/home/nemo/.profile
|
||||
/home/dory/.profile
|
||||
/home/shark/.profile
|
||||
|
||||
/home/nemo/tryme
|
||||
/home/shs/tryme
|
||||
|
||||
/home/shs/arrow.png
|
||||
/home/shs/PNGs/arrow.png
|
||||
|
||||
/home/shs/11/files_11.zip
|
||||
/home/shs/ERIC/file_11.zip
|
||||
|
||||
/home/shs/penguin0.jpg
|
||||
/home/shs/PNGs/penguin.jpg
|
||||
/home/shs/PNGs/penguin0.jpg
|
||||
|
||||
/home/shs/Sandra_rotated.png
|
||||
/home/shs/PNGs/Sandra_rotated.png
|
||||
```
|
||||
|
||||
`fdupe` 命令的许多选项列如下。使用 `fdupes -h` 命令或者阅读 man 页面获取详情。
|
||||
|
||||
```
|
||||
-r --recurse recurse
|
||||
-R --recurse: recurse through specified directories
|
||||
-s --symlinks follow symlinked directories
|
||||
-H --hardlinks treat hard links as duplicates
|
||||
-n --noempty ignore empty files
|
||||
-f --omitfirst omit the first file in each set of matches
|
||||
-A --nohidden ignore hidden files
|
||||
-1 --sameline list matches on a single line
|
||||
-S --size show size of duplicate files
|
||||
-m --summarize summarize duplicate files information
|
||||
-q --quiet hide progress indicator
|
||||
-d --delete prompt user for files to preserve
|
||||
-N --noprompt when used with --delete, preserve the first file in set
|
||||
-I --immediate delete duplicates as they are encountered
|
||||
-p --permissions don't soncider files with different owner/group or
|
||||
permission bits as duplicates
|
||||
-o --order=WORD order files according to specification
|
||||
-i --reverse reverse order while sorting
|
||||
-v --version display fdupes version
|
||||
-h --help displays help
|
||||
```
|
||||
|
||||
`fdupes` 命令是另一个你可能需要安装并使用一段时间才能熟悉其众多选项的命令。
|
||||
|
||||
### 总结
|
||||
|
||||
Linux 系统提供能够定位并(潜在地)能移除重复文件的一系列的好工具,以及能让你指定搜索区域及当对你所发现的重复文件时的处理方式的选项。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3390204/how-to-identify-same-content-files-on-linux.html#tk.rss_all
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[tomjlw](https://github.com/tomjlw)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/04/chairs-100794266-large.jpg
|
||||
[2]: https://www.networkworld.com/article/3387961/how-to-identify-duplicate-files-on-linux.html
|
||||
[3]: https://www.youtube.com/playlist?list=PL7D2RMSmRO9J8OTpjFECi8DJiTQdd4hua
|
||||
[4]: https://www.networkworld.com/article/3242170/linux/invaluable-tips-and-tricks-for-troubleshooting-linux.html
|
||||
[5]: https://www.facebook.com/NetworkWorld/
|
||||
[6]: https://www.linkedin.com/company/network-world
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (cycoe)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10929-1.html)
|
||||
[#]: subject: (Monitoring CPU and GPU Temperatures on Linux)
|
||||
[#]: via: (https://itsfoss.com/monitor-cpu-gpu-temp-linux/)
|
||||
[#]: author: (It's FOSS Community https://itsfoss.com/author/itsfoss/)
|
||||
|
||||
在 Linux 上监控 CPU 和 GPU 温度
|
||||
======
|
||||
|
||||
> 本篇文章讨论了在 Linux 命令行中监控 CPU 和 GPU 温度的两种简单方式。
|
||||
|
||||
由于 [Steam][1](包括 [Steam Play][2],即 Proton)和一些其他的发展,GNU/Linux 正在成为越来越多计算机用户的日常游戏平台的选择。也有相当一部分用户在遇到像[视频编辑][3]或图形设计等(Kdenlive 和 [Blender][4] 是这类应用程序中很好的例子)资源消耗型计算任务时,也会使用 GNU/Linux。
|
||||
|
||||
不管你是否是这些用户中的一员或其他用户,你也一定想知道你的电脑 CPU 和 GPU 能有多热(如果你想要超频的话更会如此)。如果是这样,那么继续读下去。我们会介绍两个非常简单的命令来监控 CPU 和 GPU 温度。
|
||||
|
||||
我的装置包括一台 [Slimbook Kymera][5] 和两台显示器(一台 TV 和一台 PC 监视器),使得我可以用一台来玩游戏,另一台来留意监控温度。另外,因为我使用 [Zorin OS][6],我会将关注点放在 Ubuntu 和 Ubuntu 的衍生发行版上。
|
||||
|
||||
为了监控 CPU 和 GPU 的行为,我们将利用实用的 `watch` 命令在每几秒钟之后动态地得到读数。
|
||||
|
||||
![][7]
|
||||
|
||||
### 在 Linux 中监控 CPU 温度
|
||||
|
||||
对于 CPU 温度,我们将结合使用 `watch` 与 `sensors` 命令。一篇关于[此工具的图形用户界面版本][8]的有趣文章已经在 It's FOSS 中介绍过了。然而,我们将在此处使用命令行版本:
|
||||
|
||||
```
|
||||
watch -n 2 sensors
|
||||
```
|
||||
|
||||
`watch` 保证了读数会在每 2 秒钟更新一次(当然,这个周期值能够根据你的需要去更改):
|
||||
|
||||
```
|
||||
Every 2,0s: sensors
|
||||
|
||||
iwlwifi-virtual-0
|
||||
Adapter: Virtual device
|
||||
temp1: +39.0°C
|
||||
|
||||
acpitz-virtual-0
|
||||
Adapter: Virtual device
|
||||
temp1: +27.8°C (crit = +119.0°C)
|
||||
temp2: +29.8°C (crit = +119.0°C)
|
||||
|
||||
coretemp-isa-0000
|
||||
Adapter: ISA adapter
|
||||
Package id 0: +37.0°C (high = +82.0°C, crit = +100.0°C)
|
||||
Core 0: +35.0°C (high = +82.0°C, crit = +100.0°C)
|
||||
Core 1: +35.0°C (high = +82.0°C, crit = +100.0°C)
|
||||
Core 2: +33.0°C (high = +82.0°C, crit = +100.0°C)
|
||||
Core 3: +36.0°C (high = +82.0°C, crit = +100.0°C)
|
||||
Core 4: +37.0°C (high = +82.0°C, crit = +100.0°C)
|
||||
Core 5: +35.0°C (high = +82.0°C, crit = +100.0°C)
|
||||
```
|
||||
|
||||
除此之外,我们还能得到如下信息:
|
||||
|
||||
* 我们有 5 个核心正在被使用(并且当前的最高温度为 37.0℃)。
|
||||
* 温度超过 82.0℃ 会被认为是过热。
|
||||
* 超过 100.0℃ 的温度会被认为是超过临界值。
|
||||
|
||||
根据以上的温度值我们可以得出结论,我的电脑目前的工作负载非常小。
|
||||
|
||||
### 在 Linux 中监控 GPU 温度
|
||||
|
||||
现在让我们来看看显卡。我从来没使用过 AMD 的显卡,因此我会将重点放在 Nvidia 的显卡上。我们需要做的第一件事是从 [Ubuntu 的附加驱动][10] 中下载合适的最新驱动。
|
||||
|
||||
在 Ubuntu(Zorin 或 Linux Mint 也是相同的)中,进入“软件和更新 > 附加驱动”选项,选择最新的可用驱动。另外,你可以添加或启用显示卡的官方 ppa(通过命令行或通过“软件和更新 > 其他软件”来实现)。安装驱动程序后,你将可以使用 “Nvidia X Server” 的 GUI 程序以及命令行工具 `nvidia-smi`(Nvidia 系统管理界面)。因此我们将使用 `watch` 和 `nvidia-smi`:
|
||||
|
||||
```
|
||||
watch -n 2 nvidia-smi
|
||||
```
|
||||
|
||||
与 CPU 的情况一样,我们会在每两秒得到一次更新的读数:
|
||||
|
||||
```
|
||||
Every 2,0s: nvidia-smi
|
||||
|
||||
Fri Apr 19 20:45:30 2019
|
||||
+-----------------------------------------------------------------------------+
|
||||
| Nvidia-SMI 418.56 Driver Version: 418.56 CUDA Version: 10.1 |
|
||||
|-------------------------------+----------------------+----------------------+
|
||||
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
|
||||
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|
||||
|===============================+======================+======================|
|
||||
| 0 GeForce GTX 106... Off | 00000000:01:00.0 On | N/A |
|
||||
| 0% 54C P8 10W / 120W | 433MiB / 6077MiB | 4% Default |
|
||||
+-------------------------------+----------------------+----------------------+
|
||||
|
||||
+-----------------------------------------------------------------------------+
|
||||
| Processes: GPU Memory |
|
||||
| GPU PID Type Process name Usage |
|
||||
|=============================================================================|
|
||||
| 0 1557 G /usr/lib/xorg/Xorg 190MiB |
|
||||
| 0 1820 G /usr/bin/gnome-shell 174MiB |
|
||||
| 0 7820 G ...equest-channel-token=303407235874180773 65MiB |
|
||||
+-----------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
从这个表格中我们得到了关于显示卡的如下信息:
|
||||
|
||||
* 它正在使用版本号为 418.56 的开源驱动。
|
||||
* 显示卡的当前温度为 54.0℃,并且风扇的使用量为 0%。
|
||||
* 电量的消耗非常低:仅仅 10W。
|
||||
* 总量为 6GB 的 vram(视频随机存取存储器),只使用了 433MB。
|
||||
* vram 正在被 3 个进程使用,他们的 ID 分别为 1557、1820 和 7820。
|
||||
|
||||
大部分这些事实或数值都清晰地表明,我们没有在玩任何消耗系统资源的游戏或处理大负载的任务。当我们开始玩游戏、处理视频或其他类似任务时,这些值就会开始上升。
|
||||
|
||||
#### 结论
|
||||
|
||||
即便我们有 GUI 工具,但我还是发现这两个命令对于实时监控硬件非常的顺手。
|
||||
|
||||
你将如何去使用它们呢?你可以通过阅读他们的 man 手册来学习更多关于这些工具的使用技巧。
|
||||
|
||||
你有其他偏爱的工具吗?在评论里分享给我们吧 ;)。
|
||||
|
||||
玩得开心!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/monitor-cpu-gpu-temp-linux/
|
||||
|
||||
作者:[Alejandro Egea-Abellán][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[cycoe](https://github.com/cycoe)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/itsfoss/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/install-steam-ubuntu-linux/
|
||||
[2]: https://itsfoss.com/steam-play-proton/
|
||||
[3]: https://itsfoss.com/best-video-editing-software-linux/
|
||||
[4]: https://www.blender.org/
|
||||
[5]: https://slimbook.es/
|
||||
[6]: https://zorinos.com/
|
||||
[7]: https://itsfoss.com/wp-content/uploads/2019/04/monitor-cpu-gpu-temperature-linux-800x450.png
|
||||
[8]: https://itsfoss.com/check-laptop-cpu-temperature-ubuntu/
|
||||
[9]: https://itsfoss.com/best-command-line-games-linux/
|
||||
[10]: https://itsfoss.com/install-additional-drivers-ubuntu/
|
||||
[11]: https://itsfoss.com/review-googler-linux/
|
||||
[12]: https://itsfoss.com/wp-content/uploads/2019/04/EGEA-ABELLAN-Alejandro.jpg
|
||||
@@ -0,0 +1,112 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10919-1.html)
|
||||
[#]: subject: (Installing Budgie Desktop on Ubuntu [Quick Guide])
|
||||
[#]: via: (https://itsfoss.com/install-budgie-ubuntu/)
|
||||
[#]: author: (Atharva Lele https://itsfoss.com/author/atharva/)
|
||||
|
||||
在 Ubuntu 上安装 Budgie 桌面
|
||||
======
|
||||
|
||||
> 在这个逐步的教程中学习如何在 Ubuntu 上安装 Budgie 桌面。
|
||||
|
||||
在所有[各种 Ubuntu 版本][1]中,[Ubuntu Budgie][2] 是最被低估的版本。它外观优雅,而且需要的资源也不多。
|
||||
|
||||
阅读这篇 《[Ubuntu Budgie 点评][3]》或观看下面的视频,了解 Ubuntu Budgie 18.04 的外观如何。
|
||||
|
||||
- [Ubuntu 18.04 Budgie Desktop Tour [It's Elegant]](https://youtu.be/KXgreWOK33k)
|
||||
|
||||
如果你喜欢 [Budgie 桌面][5]但你正在使用其他版本的 Ubuntu,例如默认 Ubuntu 带有 GNOME 桌面,我有个好消息。你可以在当前的 Ubuntu 系统上安装 Budgie 并切换桌面环境。
|
||||
|
||||
在这篇文章中,我将告诉你到底该怎么做。但首先,对那些不了解 Budgie 的人进行一点介绍。
|
||||
|
||||
Budgie 桌面环境主要由 [Solus Linux 团队开发][6]。它的设计注重优雅和现代使用。Budgie 适用于所有主流 Linux 发行版,可以让用户在其上尝试体验这种新的桌面环境。Budgie 现在非常成熟,并提供了出色的桌面体验。
|
||||
|
||||
> 警告
|
||||
>
|
||||
> 在同一系统上安装多个桌面可能会导致冲突,你可能会遇到一些问题,如面板中缺少图标或同一程序的多个图标。
|
||||
>
|
||||
> 你也许不会遇到任何问题。是否要尝试不同桌面由你决定。
|
||||
|
||||
### 在 Ubuntu 上安装 Budgie
|
||||
|
||||
此方法未在 Linux Mint 上进行测试,因此我建议你 Mint 上不要按照此指南进行操作。
|
||||
|
||||
对于正在使用 Ubuntu 的人,Budgie 现在默认是 Ubuntu 仓库的一部分。因此,我们不需要添加任何 PPA 来下载 Budgie。
|
||||
|
||||
要安装 Budgie,只需在终端中运行此命令即可。我们首先要确保系统已完全更新。
|
||||
|
||||
```
|
||||
sudo apt update && sudo apt upgrade
|
||||
sudo apt install ubuntu-budgie-desktop
|
||||
```
|
||||
|
||||
下载完成后,你将看到选择显示管理器的提示。选择 “lightdm” 以获得完整的 Budgie 体验。
|
||||
|
||||
![Select lightdm][7]
|
||||
|
||||
安装完成后,重启计算机。然后,你会看到 Budgie 的登录页面。输入你的密码进入主屏幕。
|
||||
|
||||
![Budgie Desktop Home][8]
|
||||
|
||||
### 切换到其他桌面环境
|
||||
|
||||
![Budgie login screen][9]
|
||||
|
||||
你可以单击登录名旁边的 Budgie 图标获取登录选项。在那里,你可以在已安装的桌面环境(DE)之间进行选择。就我而言,我看到了 Budgie 和默认的 Ubuntu(GNOME)桌面。
|
||||
|
||||
![Select your DE][10]
|
||||
|
||||
因此,无论何时你想登录 GNOME,都可以使用此菜单执行此操作。
|
||||
|
||||
### 如何删除 Budgie
|
||||
|
||||
如果你不喜欢 Budgie 或只是想回到常规的以前的 Ubuntu,你可以如上节所述切换回常规桌面。
|
||||
|
||||
但是,如果你真的想要删除 Budgie 及其组件,你可以按照以下命令回到之前的状态。
|
||||
|
||||
**在使用这些命令之前先切换到其他桌面环境:**
|
||||
|
||||
```
|
||||
sudo apt remove ubuntu-budgie-desktop ubuntu-budgie* lightdm
|
||||
sudo apt autoremove
|
||||
sudo apt install --reinstall gdm3
|
||||
```
|
||||
|
||||
成功运行所有命令后,重启计算机。
|
||||
|
||||
现在,你将回到 GNOME 或其他你有的桌面。
|
||||
|
||||
### 你对 Budgie 有什么看法?
|
||||
|
||||
Budgie 是[最佳 Linux 桌面环境][12]之一。希望这个简短的指南帮助你在 Ubuntu 上安装了很棒的 Budgie 桌面。
|
||||
|
||||
如果你安装了 Budgie,你最喜欢它的什么?请在下面的评论中告诉我们。像往常一样,欢迎任何问题或建议。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/install-budgie-ubuntu/
|
||||
|
||||
作者:[Atharva Lele][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/atharva/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/which-ubuntu-install/
|
||||
[2]: https://ubuntubudgie.org/
|
||||
[3]: https://itsfoss.com/ubuntu-budgie-18-review/
|
||||
[4]: https://www.youtube.com/c/itsfoss?sub_confirmation=1
|
||||
[5]: https://github.com/solus-project/budgie-desktop
|
||||
[6]: https://getsol.us/home/
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/04/budgie_install_select_dm.png?fit=800%2C559&ssl=1
|
||||
[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/04/budgie_homescreen.jpg?fit=800%2C500&ssl=1
|
||||
[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/04/budgie_install_lockscreen.png?fit=800%2C403&ssl=1
|
||||
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/04/budgie_install_lockscreen_select_de.png?fit=800%2C403&ssl=1
|
||||
[11]: https://itsfoss.com/snapd-error-ubuntu/
|
||||
[12]: https://itsfoss.com/best-linux-desktop-environments/
|
||||
@@ -0,0 +1,331 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (way-ww)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10923-1.html)
|
||||
[#]: subject: (How To Install/Uninstall Listed Packages From A File In Linux?)
|
||||
[#]: via: (https://www.2daygeek.com/how-to-install-uninstall-listed-packages-from-a-file-in-linux/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
如何在 Linux 上安装/卸载一个文件中列出的软件包?
|
||||
======
|
||||
|
||||
在某些情况下,你可能想要将一个服务器上的软件包列表安装到另一个服务器上。例如,你已经在服务器 A 上安装了 15 个软件包并且这些软件包也需要被安装到服务器 B、服务器 C 上等等。
|
||||
|
||||
我们可以手动去安装这些软件但是这将花费大量的时间。你可以手动安装一俩个服务器,但是试想如果你有大概十个服务器呢。在这种情况下你无法手动完成工作,那么怎样才能解决问题呢?
|
||||
|
||||
不要担心我们可以帮你摆脱这样的情况和场景。我们在这篇文章中增加了四种方法来克服困难。
|
||||
|
||||
我希望这可以帮你解决问题。我已经在 Centos7 和 Ubuntu 18.04 上测试了这些命令。
|
||||
|
||||
我也希望这可以在其他发行版上工作。这仅仅需要使用该发行版的官方包管理器命令替代本文中的包管理器命令就行了。
|
||||
|
||||
如果想要 [检查 Linux 系统上已安装的软件包列表][1],请点击链接。
|
||||
|
||||
例如,如果你想要在基于 RHEL 系统上创建软件包列表请使用以下步骤。其他发行版也一样。
|
||||
|
||||
```
|
||||
# rpm -qa --last | head -15 | awk '{print $1}' > /tmp/pack1.txt
|
||||
|
||||
# cat /tmp/pack1.txt
|
||||
mariadb-server-5.5.60-1.el7_5.x86_64
|
||||
perl-DBI-1.627-4.el7.x86_64
|
||||
perl-DBD-MySQL-4.023-6.el7.x86_64
|
||||
perl-PlRPC-0.2020-14.el7.noarch
|
||||
perl-Net-Daemon-0.48-5.el7.noarch
|
||||
perl-IO-Compress-2.061-2.el7.noarch
|
||||
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64
|
||||
mariadb-5.5.60-1.el7_5.x86_64
|
||||
perl-Data-Dumper-2.145-3.el7.x86_64
|
||||
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64
|
||||
httpd-2.4.6-88.el7.centos.x86_64
|
||||
mailcap-2.1.41-2.el7.noarch
|
||||
httpd-tools-2.4.6-88.el7.centos.x86_64
|
||||
apr-util-1.5.2-6.el7.x86_64
|
||||
apr-1.4.8-3.el7_4.1.x86_64
|
||||
```
|
||||
|
||||
### 方法一:如何在 Linux 上使用 cat 命令安装文件中列出的包?
|
||||
|
||||
为实现这个目标,我将使用简单明了的第一种方法。为此,创建一个文件并添加上你想要安装的包列表。
|
||||
|
||||
出于测试的目的,我们将只添加以下的三个软件包名到文件中。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt
|
||||
|
||||
apache2
|
||||
mariadb-server
|
||||
nano
|
||||
```
|
||||
|
||||
只要简单的运行 [apt 命令][2] 就能在 Ubuntu/Debian 系统上一次性安装所有的软件包。
|
||||
|
||||
```
|
||||
# apt -y install $(cat /tmp/pack1.txt)
|
||||
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
The following packages were automatically installed and are no longer required:
|
||||
libopts25 sntp
|
||||
Use 'sudo apt autoremove' to remove them.
|
||||
Suggested packages:
|
||||
apache2-doc apache2-suexec-pristine | apache2-suexec-custom spell
|
||||
The following NEW packages will be installed:
|
||||
apache2 mariadb-server nano
|
||||
0 upgraded, 3 newly installed, 0 to remove and 24 not upgraded.
|
||||
Need to get 339 kB of archives.
|
||||
After this operation, 1,377 kB of additional disk space will be used.
|
||||
Get:1 http://in.archive.ubuntu.com/ubuntu bionic-updates/main amd64 apache2 amd64 2.4.29-1ubuntu4.6 [95.1 kB]
|
||||
Get:2 http://in.archive.ubuntu.com/ubuntu bionic/main amd64 nano amd64 2.9.3-2 [231 kB]
|
||||
Get:3 http://in.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 mariadb-server all 1:10.1.38-0ubuntu0.18.04.1 [12.9 kB]
|
||||
Fetched 339 kB in 19s (18.0 kB/s)
|
||||
Selecting previously unselected package apache2.
|
||||
(Reading database ... 290926 files and directories currently installed.)
|
||||
Preparing to unpack .../apache2_2.4.29-1ubuntu4.6_amd64.deb ...
|
||||
Unpacking apache2 (2.4.29-1ubuntu4.6) ...
|
||||
Selecting previously unselected package nano.
|
||||
Preparing to unpack .../nano_2.9.3-2_amd64.deb ...
|
||||
Unpacking nano (2.9.3-2) ...
|
||||
Selecting previously unselected package mariadb-server.
|
||||
Preparing to unpack .../mariadb-server_1%3a10.1.38-0ubuntu0.18.04.1_all.deb ...
|
||||
Unpacking mariadb-server (1:10.1.38-0ubuntu0.18.04.1) ...
|
||||
Processing triggers for ufw (0.36-0ubuntu0.18.04.1) ...
|
||||
Setting up apache2 (2.4.29-1ubuntu4.6) ...
|
||||
Processing triggers for ureadahead (0.100.0-20) ...
|
||||
Processing triggers for install-info (6.5.0.dfsg.1-2) ...
|
||||
Setting up nano (2.9.3-2) ...
|
||||
update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode
|
||||
update-alternatives: using /bin/nano to provide /usr/bin/pico (pico) in auto mode
|
||||
Processing triggers for systemd (237-3ubuntu10.20) ...
|
||||
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
|
||||
Setting up mariadb-server (1:10.1.38-0ubuntu0.18.04.1) ...
|
||||
```
|
||||
|
||||
至于删除,需要使用相同的命令格式和适当的选项。
|
||||
|
||||
```
|
||||
# apt -y remove $(cat /tmp/pack1.txt)
|
||||
Reading package lists... Done
|
||||
Building dependency tree
|
||||
Reading state information... Done
|
||||
The following packages were automatically installed and are no longer required:
|
||||
apache2-bin apache2-data apache2-utils galera-3 libaio1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libconfig-inifiles-perl libdbd-mysql-perl libdbi-perl libjemalloc1 liblua5.2-0
|
||||
libmysqlclient20 libopts25 libterm-readkey-perl mariadb-client-10.1 mariadb-client-core-10.1 mariadb-common mariadb-server-10.1 mariadb-server-core-10.1 mysql-common sntp socat
|
||||
Use 'apt autoremove' to remove them.
|
||||
The following packages will be REMOVED:
|
||||
apache2 mariadb-server nano
|
||||
0 upgraded, 0 newly installed, 3 to remove and 24 not upgraded.
|
||||
After this operation, 1,377 kB disk space will be freed.
|
||||
(Reading database ... 291046 files and directories currently installed.)
|
||||
Removing apache2 (2.4.29-1ubuntu4.6) ...
|
||||
Removing mariadb-server (1:10.1.38-0ubuntu0.18.04.1) ...
|
||||
Removing nano (2.9.3-2) ...
|
||||
update-alternatives: using /usr/bin/vim.tiny to provide /usr/bin/editor (editor) in auto mode
|
||||
Processing triggers for ufw (0.36-0ubuntu0.18.04.1) ...
|
||||
Processing triggers for install-info (6.5.0.dfsg.1-2) ...
|
||||
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
|
||||
```
|
||||
|
||||
使用 [yum 命令][3] 在基于 RHEL (如 Centos、RHEL (Redhat) 和 OEL (Oracle Enterprise Linux)) 的系统上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# yum -y install $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
使用以命令在基于 RHEL (如 Centos、RHEL (Redhat) 和 OEL (Oracle Enterprise Linux)) 的系统上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# yum -y remove $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
使用以下 [dnf 命令][4] 在 Fedora 系统上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# dnf -y install $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
使用以下命令在 Fedora 系统上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# dnf -y remove $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
使用以下 [zypper 命令][5] 在 openSUSE 系统上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# zypper -y install $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
使用以下命令从 openSUSE 系统上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# zypper -y remove $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
使用以下 [pacman 命令][6] 在基于 Arch Linux (如 Manjaro 和 Antergos) 的系统上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# pacman -S $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
使用以下命令从基于 Arch Linux (如 Manjaro 和 Antergos) 的系统中卸载文件中列出的软件包。
|
||||
|
||||
|
||||
```
|
||||
# pacman -Rs $(cat /tmp/pack1.txt)
|
||||
```
|
||||
|
||||
### 方法二:如何使用 cat 和 xargs 命令在 Linux 中安装文件中列出的软件包。
|
||||
|
||||
甚至,我更喜欢使用这种方法,因为这是一种非常简单直接的方法。
|
||||
|
||||
使用以下 `apt` 命令在基于 Debian 的系统 (如 Debian、Ubuntu 和 Linux Mint) 上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs apt -y install
|
||||
```
|
||||
|
||||
使用以下 `apt` 命令 从基于 Debian 的系统 (如 Debian、Ubuntu 和 Linux Mint) 上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs apt -y remove
|
||||
```
|
||||
|
||||
使用以下 `yum` 命令在基于 RHEL (如 Centos,RHEL (Redhat) 和 OEL (Oracle Enterprise Linux)) 的系统上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs yum -y install
|
||||
```
|
||||
|
||||
使用以命令从基于 RHEL (如 Centos、RHEL (Redhat) 和 OEL (Oracle Enterprise Linux)) 的系统上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs yum -y remove
|
||||
```
|
||||
|
||||
使用以下 `dnf` 命令在 Fedora 系统上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs dnf -y install
|
||||
```
|
||||
|
||||
使用以下命令从 Fedora 系统上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs dnf -y remove
|
||||
```
|
||||
|
||||
使用以下 `zypper` 命令在 openSUSE 系统上安装文件中列出的软件包。
|
||||
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs zypper -y install
|
||||
```
|
||||
|
||||
使用以下命令从 openSUSE 系统上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs zypper -y remove
|
||||
```
|
||||
|
||||
使用以下 `pacman` 命令在基于 Arch Linux (如 Manjaro 和 Antergos) 的系统上安装文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs pacman -S
|
||||
```
|
||||
|
||||
使用下以命令从基于 Arch Linux (如 Manjaro 和 Antergos) 的系统上卸载文件中列出的软件包。
|
||||
|
||||
```
|
||||
# cat /tmp/pack1.txt | xargs pacman -Rs
|
||||
```
|
||||
|
||||
### 方法三 : 如何使用 For 循环在 Linux 上安装文件中列出的软件包
|
||||
|
||||
我们也可以使用 `for` 循环命令来实现此目的。
|
||||
|
||||
安装批量包可以使用以下一条 `for` 循环的命令。
|
||||
|
||||
```
|
||||
# for pack in `cat /tmp/pack1.txt` ; do apt -y install $i; done
|
||||
```
|
||||
|
||||
要使用 shell 脚本安装批量包,请使用以下 `for` 循环。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/bulk-package-install.sh
|
||||
|
||||
#!/bin/bash
|
||||
for pack in `cat /tmp/pack1.txt`
|
||||
do apt -y remove $pack
|
||||
done
|
||||
```
|
||||
|
||||
为 `bulk-package-install.sh` 设置可执行权限。
|
||||
|
||||
```
|
||||
# chmod + bulk-package-install.sh
|
||||
```
|
||||
|
||||
最后运行这个脚本。
|
||||
|
||||
```
|
||||
# sh bulk-package-install.sh
|
||||
```
|
||||
|
||||
### 方法四:如何使用 While 循环在 Linux 上安装文件中列出的软件包
|
||||
|
||||
我们也可以使用 `while` 循环命令来实现目的。
|
||||
|
||||
安装批量包可以使用以下一条 `while` 循环的命令。
|
||||
|
||||
```
|
||||
# file="/tmp/pack1.txt"; while read -r pack; do apt -y install $pack; done < "$file"
|
||||
```
|
||||
|
||||
要使用 shell 脚本安装批量包,请使用以下 `while` 循环。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/bulk-package-install.sh
|
||||
|
||||
#!/bin/bash
|
||||
file="/tmp/pack1.txt"
|
||||
while read -r pack
|
||||
do apt -y remove $pack
|
||||
done < "$file"
|
||||
```
|
||||
|
||||
为 `bulk-package-install.sh` 设置可执行权限。
|
||||
|
||||
```
|
||||
# chmod + bulk-package-install.sh
|
||||
```
|
||||
|
||||
最后运行这个脚本。
|
||||
|
||||
```
|
||||
# sh bulk-package-install.sh
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/how-to-install-uninstall-listed-packages-from-a-file-in-linux/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[way-ww](https://github.com/way-ww)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.2daygeek.com/author/magesh/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://linux.cn/article-10116-1.html
|
||||
[2]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
|
||||
[3]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
|
||||
[4]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
|
||||
[5]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
|
||||
[6]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (chen-ni)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11000-1.html)
|
||||
[#]: subject: (Why startups should release their code as open source)
|
||||
[#]: via: (https://opensource.com/article/19/5/startups-release-code)
|
||||
[#]: author: (Clément Flipo https://opensource.com/users/cl%C3%A9ment-flipo)
|
||||
|
||||
为什么初创公司应该将代码开源
|
||||
======
|
||||
|
||||
> Dokit 曾经怀疑将自己的知识开源可能是一个失败的商业决策,然而正是这个选择奠定了它的成功。
|
||||
|
||||
![open source button on keyboard][1]
|
||||
|
||||
回想一个项目开展最初期的细节并不是一件容易的事情,但这有时候可以帮助你更清晰地理解这个项目。如果让我来说,关于 [Dokit][2] 这个用来创建用户手册和文档的平台的最早的想法来自我的童年。小时候我家里都是 Meccano(LCTT 译注:一种类似乐高的拼装玩具)和飞机模型之类的玩具,对于我来说,游戏中很重要的一部分就是动手制作,把独立的零件组装在一起来创造一个新的东西。我父亲在一家 DIY 公司工作,所以家里到处都建筑、修理,以及使用说明书。小的时候父母还让我参加了童子军,在那里我们制作桌子和帐篷,还有泥巴做的烧烤炉,这些事情都培养了我在共同学习中感受到的乐趣,就像我在开源活动中感受到的一样。
|
||||
|
||||
在童年学到的修理东西和回收产品的本领成为了我工作的一部分。后来我决心要用线上的方式,还原这种在家里或者小组里学习如何制作和修理东西时的那种非常棒的感觉。Dokit 就从这个想法中诞生了。
|
||||
|
||||
### 创业初期
|
||||
|
||||
事情并非一帆风顺,在我们的公司于 2017 年成立之后,我很快就意识到那些最庞大、最值得奋斗的目标一般来说也总是最困难的。如果想要实现我们的计划 —— 彻底改变 [老式的说明书和用户手册的编写和发行方式][3],并且在这个细分市场(我们非常清楚这一点)里取得最大的影响力 —— 那么确立一个主导任务就十分关键,它关乎项目的组织方式。我们据此做出了第一个重要决策:首先 [在短时间内使用一个已有的开源框架 MediaWiki 制作产品原型来验证我们的想法][4],然后将我们的全部代码都作为开源项目发布。
|
||||
|
||||
当时 [MediaWiki][5] 已经在正常运作了,事后看来,这一点让我们的决策变得容易了许多。这个平台已经拥有我们设想的最小可用产品(MVP)所需要的 90% 的功能,并且在全世界范围内有 15000 名活跃的开发者。MediaWiki 因为是维基百科的驱动引擎而小有名气,如果没有来自它的支持,事情对我们来说无疑会困难很多。还有一个许多公司都在使用的文档平台 Confluence 也有一些不错的功能,但是最终在这两者之间做出选择还是很容易的。
|
||||
|
||||
出于对社区的信赖,我们把自己平台的初始版本完全放在了 GitHub 上。我们甚至还没有真正开始进行推广,就已经可以看到世界各地的创客们开始使用我们的平台,这种令人激动的感觉似乎说明我们的选择是正确的。尽管 [创客以及 Fablab 运动][6](LCTT 译注:Fablab 是一种向个人提供包括 3D 打印在内的电子化制造服务的小型工坊)都在鼓励用户积极分享说明材料,并且在 [Fablab 章程][7] 中也写明了这一点,但现实中像模像样的文档还是不太多见。
|
||||
|
||||
人们喜欢使用我们这个平台的首要原因是它可以解决一个非常实在的问题:一个本来还不错的项目,却使用了非常糟糕的文档 —— 其实这个项目本来可以变得更好的。对我们来说,这有点儿像是在修复创客及 DIY 社区里的一个裂缝。在我们的平台发布后的一年之内,Fablabs、[Wikifab][8]、[Open Source Ecology][9]、[Les Petits Debrouillards][10]、[Ademe][11] 以及 [Low-Tech Lab][12] 都在他们的服务器上安装了我们的工具,用来制作逐步引导的教程。
|
||||
|
||||
甚至在我们还没有发新闻稿之前,我们的其中一个用户 Wikifab 就开始在全国性媒体上收到“DIY 界的维基百科”这样的称赞了。短短两年之内,我们看到有数百的社区都在他们自己的 Dokits 上开展了项目,从有意思的、搞笑的,到那种很正式的产品手册都有。这种社区的力量正是我们想要驾驭的,并且有这么多的项目 —— 从风力涡轮机到宠物喂食器 —— 都在使用我们创建的平台编写非常有吸引力的产品手册,这件事情真的令我们赞叹不已。
|
||||
|
||||
### 项目开源
|
||||
|
||||
回头看看前两年的成功,很明显选择开源是我们能迅速取得成果的关键因素。最有价值的事情就是在开源项目中获得反馈的能力了。如果一段代码无法正常运行,[会有人立刻告诉我们][14]。如果可以从这些已经在使用你提供的服务的人那里学到这么多东西,为什么还要需要等着和顾问们开会呢?
|
||||
|
||||
社区对我们这个项目的关注程度也反映出了这个市场的潜力(包括利润上的潜力)。[巴黎有一个非常好的、成长迅速的开发者社区][15](LCTT 译注:Dokit 是一家设立在巴黎的公司),但是开源将我们从一个只有数千当地人的小池子里带到了全世界数百万的开发者身边,他们都将成为我们的创作中的一部分。与此同时,代码的开放性也让我们的用户和客户更加放心,因为即使我们这个公司不在了,代码仍然会存续下去。
|
||||
|
||||
如果说上面这些都是在我们之前对开源的预期之中的话,其实这一路上也有不少惊喜。因为开源,我们获得了更多的客户、声望以及精准推广,这种推广本来以我们有限的预算是负担不起的,现在却不需要我们支付费用。我们发现开源代码还改善了我们的招聘流程,因为在雇佣之前就可以通过我们的代码来测试候选人,并且被雇佣之后的入职过程也会更加顺利。
|
||||
|
||||
开发者在完全公开的情况下写代码,既有一点尴尬,同时也很团结,这对我们提升产品质量很有帮助。人们可以互相发表意见和反馈,并且因为工作都是完全公开的,人们似乎会尽可能地想做到最好。为了不断优化、不断重构 Dokit 的运行方式,我们明白未来应该在对社区的支持上做得更好。
|
||||
|
||||
### 下一步是什么?
|
||||
|
||||
尽管我们对正在做的事情一直都很有信念,并且看到很多出色的产品说明书都是用我们的软件制作出来的,我们还是会对这个项目的成长不断地感到兴奋,并且非常确信未来一定会很好。
|
||||
|
||||
在创业初期,我们对将自己的知识免费分发出去这件事还是非常担心的。事实证明正好相反 —— 正是开源让我们能够迅速构建起一个可持续的初创企业。Dokit 平台的设计初衷是通过社区的支持,让它的用户有信心去构建、组装、修理和创造全新的发明。事后看来,我们用开源的方式去构建了 Dokit 这个平台,这和 Dokit 本身想做的其实正好是同一件事情。
|
||||
|
||||
如同修理或者组装一件实体产品一样,只有当你对自己的方法有信心的时候,事情才会越来越顺利。现在,在我们创业的第三个年头,我们开始注意到全世界对这个领域的兴趣在增加,因为它迎合了出于不断变化的居家和生活方式的需求而 [想要使用或重复利用以及组装产品的新一代客户][16]。我们正是在通过线上社区的支持,创造一个让大家能够在自己动手做东西的时候感到更加有信心的平台。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/startups-release-code
|
||||
|
||||
作者:[Clément Flipo][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[chen-ni](https://github.com/chen-ni)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/cl%C3%A9ment-flipo
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/button_push_open_keyboard_file_organize.png?itok=KlAsk1gx (open source button on keyboard)
|
||||
[2]: https://dokit.io/
|
||||
[3]: https://dokit.io/9-reasons-to-stop-writing-your-user-manuals-or-work-instructions-with-word-processors/
|
||||
[4]: https://medium.com/@gofloaters/5-cheap-ways-to-build-your-mvp-71d6170d5250
|
||||
[5]: https://en.wikipedia.org/wiki/MediaWiki
|
||||
[6]: https://en.wikipedia.org/wiki/Maker_culture
|
||||
[7]: http://fab.cba.mit.edu/about/charter/
|
||||
[8]: https://wikifab.org/
|
||||
[9]: https://www.opensourceecology.org/
|
||||
[10]: http://www.lespetitsdebrouillards.org/
|
||||
[11]: https://www.ademe.fr/en
|
||||
[12]: http://lowtechlab.org/
|
||||
[13]: https://www.20minutes.fr/magazine/economie-collaborative-mag/2428995-20160919-pour-construire-leurs-meubles-eux-memes-ils-creent-le-wikipedia-du-bricolage
|
||||
[14]: https://opensource.guide/how-to-contribute/
|
||||
[15]: https://www.rudebaguette.com/2013/03/here-are-the-details-on-the-new-developer-school-that-xavier-niel-is-launching-tomorrow/?lang=en
|
||||
[16]: https://www.inc.com/ari-zoldan/why-now-is-the-best-time-to-start-a-diy-home-based.html
|
||||
@@ -0,0 +1,83 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (arrowfeng)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10992-1.html)
|
||||
[#]: subject: (5 essential values for the DevOps mindset)
|
||||
[#]: via: (https://opensource.com/article/19/5/values-devops-mindset)
|
||||
[#]: author: (Brent Aaron Reed https://opensource.com/users/brentaaronreed/users/wpschaub/users/wpschaub/users/wpschaub/users/cobiacomm/users/marcobravo/users/brentaaronreed)
|
||||
|
||||
DevOps 思维模式的 5 个基本价值观
|
||||
======
|
||||
|
||||
> 人和流程比在解决的业务问题的任何技术“银弹”更重要,且需要花更多的时间。
|
||||
|
||||
![human head, brain outlined with computer hardware background][1]
|
||||
|
||||
今天的许多 IT 专业人士都在努力适应变化和扰动。这么说吧,你是否正在努力适应变化?你觉得不堪重负吗?这并不罕见。今天,IT 的现状还不够好,所以需要不断尝试重新自我演进。
|
||||
|
||||
凭借 30 多年的IT综合经验,我们见证了人员与关系对于 IT 企业提高效率和帮助企业蓬勃发展的重要性。但是,在大多数情况下,我们关于 IT 解决方案的对话始于技术,而不是从人员和流程开始。寻找“银弹”来解决业务和 IT 挑战的倾向过于普遍。但你不能想着可以买到创新、DevOps 或有效的团队和工作方式;他们需要得到培养,支持和引导。
|
||||
|
||||
由于扰动如此普遍,并且对变革速度存在如此迫切的需求,我们需要纪律和围栏。下面描述的 DevOps 思维模式的五个基本价值观将支持将我们的实践。这些价值观不是新观念;正如我们从经验中学到的那样,它们被重构了。一些价值观可以互换的,它们是灵活的,并且它们如支柱一样导向了支持这五个价值观的整体原则。
|
||||
|
||||
![5 essential values for the DevOps mindset][2]
|
||||
|
||||
### 1、利益相关方的反馈至关重要
|
||||
|
||||
我们如何知道我们是否为我们创造了比利益相关方更多的价值?我们需要持久的质量数据来分析、通知并推动更好的决策。来自可靠来源的相关信息对于任何业务的蓬勃发展至关重要。我们需要倾听并理解我们的利益相关方所说的,而不是说我们需要以一种方式实施变革,使我们能够调整我们的思维、流程和技术,并根据需要对其进行调整以使我们的利益相关者满意。由于信息(数据)不正确,我们常常看到的变化过少,或者由于错误的原因而发生了很多变化。因此,将变更与利益相关方的反馈结合起来是一项基本价值观,并有助我们专注于使公司成功最重要的事情。
|
||||
|
||||
> 关注我们的利益相关方及其反馈,而不仅仅是为了改变而改变。
|
||||
|
||||
### 2、超越当今流程的极限进行改进
|
||||
|
||||
我们希望我们的产品和服务能够不断让客户满意,他们是我们最重要的利益相关方。因此,我们需要不断改进。这不仅仅是关系到质量;它还可能意味着成本、可用性、相关性以及许多其他目标和因素。创建可重复的流程或使用通用框架是非常棒的,它们可以改善治理和许多其他问题。但是,这不应该是我们的最终目标。在寻找改进方法时,我们必须调整我们的流程,并辅以正确的技术和工具。可能有理由抛出一个“所谓的”框架,因为不这样做可能会增加浪费,更糟糕的是只是“货物结果”(做一些没有价值或目的的东西)。
|
||||
|
||||
> 力争始终创新并改进可重复的流程和框架。
|
||||
|
||||
### 3、不要用新的孤岛来打破旧的孤岛
|
||||
|
||||
孤岛和 DevOps 是不兼容的。我们经常能看到:IT 主管带来了所谓的“专家”来实施敏捷和 DevOps,他们做了什么?这些“专家”在现有问题的基础上创建了一个新问题,这是 IT 部门和业务中又增加了一个孤岛。创造“DevOps”职位违背了敏捷和 DevOps 基于打破孤岛的原则。在敏捷和 DevOps 中,团队合作是必不可少的,如果你不在自组织团队中工作,那么你就不会做任何事情。
|
||||
|
||||
> 相互激励和共享,而不是成为英雄或创建一个孤岛。
|
||||
|
||||
### 4、了解你的客户意味着跨组织协作
|
||||
|
||||
企业的任何一个部分都不是一个独立的实体,因为它们都有利益相关方,主要利益相关方始终是客户。“客户永远是对的”(或国王,我喜欢这样说)。关键是,没有客户就真的没有业务,而且为了保持业务,如今我们需要与竞争对手“区别对待”。我们还需要了解客户对我们的看法以及他们对我们的期望。了解客户的需求势在必行,需要及时反馈,以确保业务能够快速、负责地满足这些主要利益相关者的需求和关注。
|
||||
|
||||
![Minimize time spent with build-measure-learn process][3]
|
||||
|
||||
无论是想法、概念、假设还是直接利益相关方的反馈,我们都需要通过使用探索、构建、测试和交付生命周期来识别和衡量我们的产品提供的功能或服务。从根本上说,这意味着我们需要在整个组织中“插入”我们的组织。在持续创新、学习和 DevOps 方面没有任何边界。因此,当我们在整个企业中进行衡量时,我们可以理解整体并采取可行的、有意义的步骤来改进。
|
||||
|
||||
> 衡量整个组织的绩效,而不仅仅是在业务范围内。
|
||||
|
||||
### 5、通过热情鼓励采纳
|
||||
|
||||
不是每个人都要被驱使去学习、适应和改变;然而,就像微笑可能具有传染性一样,学习和意愿成为变革文化的一部分也是如此。在学习文化中适应和演化为一群人提供了学习和传递信息(即文化传播)的自然机制。学习风格、态度、方法和过程不断演化,因此我们可以改进它们。下一步是应用所学和改进的内容并与同事分享信息。学习不会自动发生;它需要努力、评估、纪律、意识,特别是沟通;遗憾的是,这些都是工具和自动化无法提供的。检查你的流程、自动化、工具策略和实施工作,使其透明化,并与你的同事协作重复使用和改进。
|
||||
|
||||
> 通过精益交付促进学习文化,而不仅仅是工具和自动化。
|
||||
|
||||
### 总结
|
||||
|
||||
![Continuous goals of DevOps mindset][4]
|
||||
|
||||
随着我们的公司采用 DevOps,我们继续在各种书籍、网站或自动化软件上倡导这五个价值观。采用这种思维方式需要时间,这与我们以前作为系统管理员所做的完全不同。这是一种全新的工作方式,需要很多年才能成熟。这些原则是否与你自己的原则一致?在评论或我们的网站 [Agents of chaos][5] 上分享。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/values-devops-mindset
|
||||
|
||||
作者:[Brent Aaron Reed][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[arrowfeng](https://github.com/arrowfeng)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/brentaaronreed/users/wpschaub/users/wpschaub/users/wpschaub/users/cobiacomm/users/marcobravo/users/brentaaronreed
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_data.png?itok=RH6NA32X (human head, brain outlined with computer hardware background)
|
||||
[2]: https://opensource.com/sites/default/files/uploads/devops_mindset_values.png (5 essential values for the DevOps mindset)
|
||||
[3]: https://opensource.com/sites/default/files/uploads/devops_mindset_minimze-time.jpg (Minimize time spent with build-measure-learn process)
|
||||
[4]: https://opensource.com/sites/default/files/uploads/devops_mindset_continuous.png (Continuous goals of DevOps mindset)
|
||||
[5]: http://agents-of-chaos.org
|
||||
@@ -0,0 +1,133 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (yizhuoyan)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11010-1.html)
|
||||
[#]: subject: (How To Check Whether The Given Package Is Installed Or Not On Debian/Ubuntu System?)
|
||||
[#]: via: (https://www.2daygeek.com/how-to-check-whether-the-given-package-is-installed-or-not-on-ubuntu-debian-system/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
|
||||
如何在 Debian/Ubuntu 系统中检查程序包是否安装?
|
||||
======
|
||||
|
||||

|
||||
|
||||
我们近期发布了一篇关于批量程序包安装的文章。在此同时,关于如何获取系统上已安装了的程序包信息,我也做了些调查然后找到了些方法。我会把这些方法分享在我们的网站上,希望能帮助到其他人。
|
||||
|
||||
有很多种方法可以检查程序包是否已安装,我找到了 7 种命令,你可以从中选择你喜欢的使用。
|
||||
|
||||
如下:
|
||||
|
||||
* `apt-cache`:可用于查询 APT 缓存或程序包的元数据。
|
||||
* `apt`:是基于 Debian 的系统中的安装、下载、删除、搜索和管理包的强有力的工具。
|
||||
* `dpkg-query`:一个查询 dpkg 数据库的工具。
|
||||
* `dpkg`:基于 Debian 的系统的包管理工具。
|
||||
* `which`:返回在终端中输入命令时执行的可执行文件的全路径。
|
||||
* `whereis`:可用于搜索指定命令的二进制文件、源码文件和帮助文件。
|
||||
* `locate`:比 `find` 命令快,因为其使用 `updatedb` 数据库搜索,而 `find`命令在实际系统中搜索。
|
||||
|
||||
### 方法一、使用 apt-cache 命令
|
||||
|
||||
`apt-cache` 命令用于从 APT 内部数据库中查询**APT 缓存**和**包的元数据**,将会搜索和显示指定包的信息,包括是否安装、程序包版本、源码仓库信息等。
|
||||
|
||||
下面的示例清楚的显示 `nano` 包已经在系统中安装了以及对应安装的版本号。
|
||||
|
||||
```
|
||||
# apt-cache policy nano
|
||||
nano:
|
||||
Installed: 2.9.3-2
|
||||
Candidate: 2.9.3-2
|
||||
Version table:
|
||||
*** 2.9.3-2 500
|
||||
500 http://in.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
|
||||
100 /var/lib/dpkg/status
|
||||
```
|
||||
|
||||
### 方法二、使用 apt 命令
|
||||
|
||||
`apt` 是一个功能强大的命令行工具,可用于安装、下载、删除、搜索、管理程序包以及查询关于程序包的信息,类似对于 `libapt-pkg` 库的所有功能的底层访问。其包含一些与包管理相关的但很少用到的命令行功能。
|
||||
|
||||
```
|
||||
# apt -qq list nano
|
||||
nano/bionic,now 2.9.3-2 amd64 [installed]
|
||||
```
|
||||
|
||||
### 方法三、使用 dpkg-query 命令
|
||||
|
||||
`dpkg-query` 是显示 `dpkg` 数据库中程序包信息列表的一个工具。
|
||||
|
||||
下面示例中的输出的第一列 `ii`,表示查询的程序包已安装了。
|
||||
|
||||
```
|
||||
# dpkg-query --list | grep -i nano
|
||||
ii nano 2.9.3-2 amd64 small, friendly text editor inspired by Pico
|
||||
```
|
||||
|
||||
### 方法四、使用 dpkg 命令
|
||||
|
||||
`dpkg`(**d**ebian **p**ac**k**a**g**e)是一个安装、构建、删除和管理 Debian 包的工具,但和其他包管理系统不同的是,其不能自动下载和安装包或包依赖。
|
||||
|
||||
下面示例中的输出的第一列 `ii`,表示查询的包已安装了。
|
||||
|
||||
```
|
||||
# dpkg -l | grep -i nano
|
||||
ii nano 2.9.3-2 amd64 small, friendly text editor inspired by Pico
|
||||
```
|
||||
|
||||
### 方法五、使用 which 命令
|
||||
|
||||
`which` 命令返回在终端中输入命令时执行的可执行文件的全路径。这对于你想要给可执行文件创建桌面快捷方式或符号链接时非常有用。
|
||||
|
||||
`which` 命令仅在当前用户 `PATH` 环境变量配置的目录列表中搜索,而不是在所有用户的目录中搜索。这意思是当你登入你自己账号时,其不会在 `root` 用户文件或目录中搜索。
|
||||
|
||||
如果对于指定的程序包或可执行文件路径有如下输出,则表示已安装了,否则没有。
|
||||
|
||||
```
|
||||
# which nano
|
||||
/bin/nano
|
||||
```
|
||||
|
||||
### 方法六、使用 whereis 命令
|
||||
|
||||
`whereis` 命令用于针对指定命令搜索对应的程序二进制文件、源码文件以及帮助文件等。
|
||||
|
||||
如果对于指定的程序包或可执行文件路径有如下输出,则表示已安装了,否则没有。
|
||||
|
||||
```
|
||||
# whereis nano
|
||||
nano: /bin/nano /usr/share/nano /usr/share/man/man1/nano.1.gz /usr/share/info/nano.info.gz
|
||||
```
|
||||
|
||||
### 方法七、使用 locate 命令
|
||||
|
||||
`locate` 命令比 `find` 命令快,因为其在 `updatedb` 数据库中搜索,而 `find` 命令在实际系统中进行搜索。
|
||||
|
||||
对于获取指定文件,其使用数据库而不是在特定目录路径中搜索。
|
||||
|
||||
`locate` 命令不会预安装在大多数系统中,需要手动安装。
|
||||
|
||||
`locate` 使用的数据库会根据定时任务定期更新。当然,我们也可以手动更新。
|
||||
|
||||
如果对于指定的程序包或可执行文件路径有如下输出,则表示已安装了,否则没有。
|
||||
|
||||
```
|
||||
# locate --basename '\nano'
|
||||
/usr/bin/nano
|
||||
/usr/share/nano
|
||||
/usr/share/doc/nano
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/how-to-check-whether-the-given-package-is-installed-or-not-on-ubuntu-debian-system/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[yizhuoyan](https://github.com/yizhuoyan)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.2daygeek.com/author/magesh/
|
||||
[b]: https://github.com/lujun9972
|
||||
@@ -0,0 +1,299 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (chen-ni)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10982-1.html)
|
||||
[#]: subject: (10 Places Where You Can Buy Linux Computers)
|
||||
[#]: via: (https://itsfoss.com/get-linux-laptops/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
可以买到 Linux 电脑的 10 个地方
|
||||
======
|
||||
|
||||
> 你在找 Linux 笔记本吗? 这里列出一些出售 Linux 电脑或者是专注于 Linux 系统的电商。
|
||||
|
||||
如今市面上几乎所有的电脑(苹果除外)都预装了 Windows 系统。Linux 使用者的惯常做法就是买一台这样的电脑,然后要么删除 Windows 系统并安装 Linux,要么[安装 Linux 和 Windows 的双系统][1]。
|
||||
|
||||
但 Windows 系统并非无法避免。你其实也可以买到 Linux 电脑。
|
||||
|
||||
不过,既然可以轻松地在任何一台电脑上安装 Linux,为什么还要买一台预装了 Linux 的电脑呢?下面列举几个原因:
|
||||
|
||||
* 预装 Windows 系统意味着你额外支付了 Windows 许可证的费用。你可以节省这笔开销。
|
||||
* 预装 Linux 的电脑都经过了硬件适配测试。你不需要担心系统无法正常运行 WiFi 或者蓝牙,也不再需要亲自去搞定这些事情了。
|
||||
* 购买 Linux 电脑相当于间接地支持了 Linux。更多的销售额可以反应出对 Linux 产品的需求,也就可能会有更多商家提供 Linux 作为一种可以选择的操作系统。
|
||||
|
||||
如果你正想买一台 Linux 的笔记本,不妨考虑一下我的建议。下面这些制造商或者商家都提供开箱即用的 Linux 系统。
|
||||
|
||||
![][2]
|
||||
|
||||
### 可以买到 Linux 笔记本或者台式机的 10 个地方
|
||||
|
||||
在揭晓这个提供预装 Linux 电脑的商家的清单之前,需要先声明一下。
|
||||
|
||||
请根据你的独立决策购买。我在这里只是简单地列出一些售卖 Linux 电脑的商家,并不保证他们的产品质量、售后服务等等这些事情。
|
||||
|
||||
这也并不是一个排行榜。清单并不是按照某个特定次序排列的,每一项前面的数字只是为了方便计数,而并不代表名次。
|
||||
|
||||
让我们看看你可以在哪儿买到预装 Linux 的台式机或者笔记本吧。
|
||||
|
||||
#### 1、戴尔
|
||||
|
||||
![戴尔 XPS Ubuntu | 图片所有权: Lifehacker][3]
|
||||
|
||||
戴尔提供 Ubuntu 笔记本已经有好几年了。他们的旗舰产品 XPS 系列的亮点之一就是预装了 Ubuntu 的开发者版本系列产品。
|
||||
|
||||
如果你读过我的 [戴尔 XPS Ubuntu 版本评测][4]就知道我是很喜欢这款笔记本的。两年多过去了,这个笔记本依然状况良好,没有性能恶化的迹象。
|
||||
|
||||
戴尔 XPS 是售价超过 1000 美元的昂贵设备。如果你的预算没有这么多,可以考虑戴尔更加亲民的 Inspiron 系列笔记本。
|
||||
|
||||
值得一提的是,戴尔并没有在它的官网上展示 Ubuntu 或者 Linux 笔记本产品。除非你知道戴尔提供 Linux 笔记本,你是不会找到它们的。
|
||||
|
||||
所以,去戴尔的官网上搜索关键字 “Ubuntu” 来获取预装 Ubuntu 的产品的信息吧。
|
||||
|
||||
**支持范围**:世界上大部分地区。
|
||||
|
||||
- [戴尔][5]
|
||||
|
||||
#### 2、System76
|
||||
|
||||
[System76][6] 是 Linux 计算机世界里的一个响亮的名字。这家总部设在美国的企业专注于运行 Linux 的高端技术设备。他们的目标用户群体是软件开发者。
|
||||
|
||||
最初,System76 在自己的机器上提供的是 Ubuntu 系统。2017 年,他们发布了属于自己的 Linux 发行版,基于 Ubuntu 的 [Pop!\_OS][7]。从此以后,Pop!\_OS 就是他们机器上的默认操作系统了,但是仍然保留了 Ubuntu 这个选择。
|
||||
|
||||
除了性能之外,System76 还格外重视设计。他们的 [Thelio 系列台式机][8] 采用纯手工木制设计。
|
||||
|
||||
![System76 Thelio 台式机][9]
|
||||
|
||||
你可以在 [这里][10] 查看他们提供的 Linux 笔记本。他们同时也提供 [基于 Linux 的迷你电脑][11] 和 [服务器][12]。
|
||||
|
||||
值得一提的是,System76 在美国制造他们的电脑,而没有使用中国大陆或者台湾这种常规的选择。也许是出于这个原因,他们产品的售价较为高昂。
|
||||
|
||||
**支持范围**:美国以及其它 60 个国家。在美国境外可能会有额外的关税。更多信息见[这里][13].
|
||||
|
||||
- [System76][6]
|
||||
|
||||
#### 3、Purism
|
||||
|
||||
Purism 是一个总部设在美国的企业,以提供确保数据安全和隐私的产品和服务为荣。这就是为什么 Purism 称自己为 “效力社会的公司”。
|
||||
|
||||
Purism 是从一个众筹项目开始的,该项目旨在创造一个几乎没有任何专有软件的高端开源笔记本。2015年,从这个 [成功的 25 万美元的众筹项目][15] 中诞生了 [Librem 15][16] 笔记本。
|
||||
|
||||
![Purism Librem 13][17]
|
||||
|
||||
后来 Purism 发布了一个 13 英寸的版本 [Librem 13][18]。Purism 还开发了一个自己的 Linux 发行版 [Pure OS][19],该发行版非常注重隐私和安全问题。
|
||||
|
||||
[Pure OS 在台式设备和移动设备上都可以运行][20],并且是 Librem 笔记本和[Librem 5 Linux 手机][21] 的默认操纵系统。
|
||||
|
||||
Purism 的零部件来自中国大陆、台湾、日本以及美国,并在美国完成组装。他们的所有设备都有可以直接关闭的硬件开关,用来关闭麦克风、摄像头、无线连接或者是蓝牙。
|
||||
|
||||
**支持范围**:全世界范围国际免邮。可能需要支付额外的关税。
|
||||
|
||||
- [Purism][22]
|
||||
|
||||
#### 4、Slimbook
|
||||
|
||||
Slimbook 是一个总部设在西班牙的 Linux 电脑销售商。Slimbook 在发行了 [第一款 KDE 品牌笔记本][23]之后成为了人们关注的焦点。
|
||||
|
||||
他们的产品不仅限于 KDE Neon。他们还提供 Ubuntu、Kubuntu、Ubuntu MATE、Linux Mint 以及包括 [Lliurex][24] 和 [Max][25] 这样的西班牙发行版。你也可以选择 Windows(需要额外付费)或者不预装任何操作系统。
|
||||
|
||||
Slimbook 有众多 Linux 笔记本、台式机和迷你电脑可供选择。他们另外一个非常不错的产品是一个类似于 iMac 的 24 英寸 [拥有内置 CPU 的曲面显示屏][26]。
|
||||
|
||||
![Slimbook Kymera Aqua 水冷 Linux 电脑][27]
|
||||
|
||||
想要一台水冷 Linux 电脑吗?Slimbook 的 [Kymera Aqua][28] 是合适之选。
|
||||
|
||||
**支持范围**:全世界范围,不过在邮费和关税上都可能产生额外费用。
|
||||
|
||||
- [Slimbook][29]
|
||||
|
||||
#### 5、TUXEDO
|
||||
|
||||
作为这个 Linux 电脑销售商清单里的另一个欧洲成员,[TUXEDO][30] 总部设在德国,主要服务德国用户,其次是欧洲用户。
|
||||
|
||||
TUXEDO 只使用 Linux 系统,产品都是“德国制造”,并且提供 5 年保修和终生售后支持。
|
||||
|
||||
TUXEDO 在 Linux 系统的硬件适配上下了很大功夫。并且如果你遇到了麻烦或者是想从头开始,可以通过系统恢复选项,自动恢复出厂设置。
|
||||
|
||||
![Tuxedo 电脑支持众多发行版][31]
|
||||
|
||||
TUXEDO 有许多 Linux 笔记本、台式机和迷你电脑产品可供选择。他们还同时支持 Intel 和 AMD 的处理器。除了电脑,TUXEDO 还提供一系列 Linux 支持的附件,比如扩展坞、DVD 和蓝光刻录机、移动电源以及其它外围设备。
|
||||
|
||||
**支持范围**:150 欧元以上的订单在德国和欧洲范围内免邮。欧洲外国家会有额外的运费和关税。更多信息见 [这里][32].
|
||||
|
||||
- [TUXEDO][33]
|
||||
|
||||
#### 6、Vikings
|
||||
|
||||
[Vikings][34] 的总部设在德国(而不是斯堪的纳维亚半岛,哈哈)。Vikings 拥有[自由软件基金会][35]的认证,专注于自由友好的硬件。
|
||||
|
||||
![Vikings 的产品经过了自由软件基金会认证][36]
|
||||
|
||||
Vikings 的 Linux 笔记本和台式机使用的是 [coreboot][37] 或者 [Libreboot][38],而不是像 BIOS 和 UEFI 这样的专有启动系统。你还可以购买不运行任何专有软件的 [硬件服务器][39]。
|
||||
|
||||
Vikings 还有包括路由器、扩展坞等在内的其它配件。他们的产品都是在德国组装完成的。
|
||||
|
||||
**支持范围**:全世界(除了朝鲜)。非欧洲国家可能会有额外关税费用。更多信息见[这里][40]。
|
||||
|
||||
- [Vikings][41]
|
||||
|
||||
#### 7、Ubuntushop.be
|
||||
|
||||
不不!尽管名字里有 Ubuntu,但这不是官方的 Ubuntu 商店。Ubuntushop 总部位于比利时,最初是销售安装了 Ubuntu 的电脑。
|
||||
|
||||
如今,你可以买到预装了包括 Mint、Manjaro、elementrayOS 在内的 Linux 发行版的笔记本电脑。你还可以要求所购买的设备上安装你所选择的发行版。
|
||||
|
||||
![][42]
|
||||
|
||||
Ubuntushop 的一个独特之处在于,它的所有电脑都带有默认的 Tails OS live 选项。即使你安装了某个其它的 Linux 发行版作为日常使用的系统,也随时可以选择启动到 Tails OS(不需要使用 live USB)。[Tails OS][43] 是一个基于 Debian 的发行版,它在用户注销后会删除所有使用痕迹,并且在默认情况下使用 Tor 网络。
|
||||
|
||||
和此列表中的许多其他重要玩家不同,我觉得 Ubuntushop 所提供的更像是一种“家庭工艺”。商家手动组装一个电脑,安装 Linux 然后卖给你。不过他们也在一些可选项上下了功夫,比如说轻松的重装系统,拥有自己的云服务器等等。
|
||||
|
||||
你可以找一台旧电脑快递给他们,就可以变成一台新安装 Linux 的电脑,他们就会在你的旧电脑上安装 [轻量级 Linux][45] 系统然后快递回来,这样你这台旧电脑就可以重新投入使用了。
|
||||
|
||||
**支持范围**:比利时以及欧洲的其它地区。
|
||||
|
||||
- [Ubuntushop.be][46]
|
||||
|
||||
#### 8、Minifree
|
||||
|
||||
[Minifree][47],是<ruby>自由部门<rt>Ministry of Freedom</rt></ruby>的缩写,他们是一家注册在英格兰的公司。
|
||||
|
||||
你可以猜到 Minifree 非常注重自由。他们提供安全以及注重隐私的电脑,预装 [Libreboot][38] 而不是 BIOS 或者 UEFI。
|
||||
|
||||
Minifree 的设备经过了 [自由软件基金会][48] 的认证,所以你可以放心买到的电脑都遵循了自由开源软件的指导规则。
|
||||
|
||||
![][49]
|
||||
|
||||
和这个清单中许多其它 Linux 笔记本销售商不同,Minifree 的电脑并不是特别贵。花 200 欧元就可以买到一台预装了 Libreboot 和 [Trisquel GNU/Linux][50] 的 Linux 电脑。
|
||||
|
||||
除了笔记本以外,Minifree 还有一系列的配件,比如 Libre 路由器、平板电脑、扩展坞、电池、键盘、鼠标等等。
|
||||
|
||||
如果你和 [Richard Stallman][51] 一样,希望只运行 100% 自由的软件的话,Minifree 就再适合不过了。
|
||||
|
||||
**支持范围**:全世界。运费信息见 [这里][52]。
|
||||
|
||||
- [Minifree][47]
|
||||
|
||||
#### 9、Entroware
|
||||
|
||||
[Entroware][53] 是另一个总部设在英国的销售商,专注基于 Linux 系统的笔记本、台式机和服务器。
|
||||
|
||||
和这个清单里的很多其它商家一样,Entroware 也选择 Ubuntu 作为 Linux 发行版。[Ubuntu MATE 也是 Entroware Linux 笔记本的一种可选系统][54].
|
||||
|
||||
![][55]
|
||||
|
||||
除了笔记本、台式机和服务器之外,Entroware 还拥有自己的 [迷你电脑 Aura][56],以及一个 iMac 风格的[内置 CPU 的显示器 Ares][57].
|
||||
|
||||
支持范围: 英国、爱尔兰、法国、德国、意大利、西班牙。
|
||||
|
||||
- [Entroware][58]
|
||||
|
||||
#### 10、Juno
|
||||
|
||||
这是我们清单上的一个新的 Linux 笔记本销售商。Juno 的总部同样设在英国,提供预装 Linux 的电脑。可选择的 Linux 发行版包括 elementary OS、Ubuntu 和 Solus OS。
|
||||
|
||||
Juno 提供一系列的笔记本,以及一款叫做 Olympia 迷你电脑。和列表里其它商家提供的大多数迷你电脑一样,Olympia 也基本上相当于一个 [Intel NUC][59]。
|
||||
|
||||
Juno 的主要特色是 Juve,一款售价 299 美元的 Chromebook 的低成本替代品。它运行一个双系统,包括 Solus 或者 elementray,以及一个基于安卓的电脑操作系统 [Prime OS][60]。
|
||||
|
||||
![Juve With Android-based Prime Os][61]
|
||||
|
||||
支持范围:英国、美国、加拿大、墨西哥、南美和欧洲的大部分地区、新西兰、亚洲和非洲的某些地区。更多信息见 [这里][62]。
|
||||
|
||||
- [Juno Computers][63]
|
||||
|
||||
#### 荣誉奖
|
||||
|
||||
我列举了 10 个可以买到 Linux 电脑的地方,但其实还有一些其它类似的商店。清单里放不下这么多,并且它们其中的几个似乎大多数商品都缺货。不过我还是要在这里稍微提一下它们,方便你自己查找相关信息:
|
||||
|
||||
* [ZaReason][64]
|
||||
* [Libiquity][65]
|
||||
* [StationX][66]
|
||||
* [Linux Certified][67]
|
||||
* [Think Penguin][68]
|
||||
|
||||
包括宏碁和联想在内的其它主流电脑生产商可能也有基于 Linux 系统的产品,所以你不妨也查看一下他们的产品目录吧。
|
||||
|
||||
你有没有买过 Linux 电脑?在哪儿买的?使用体验怎么样?Linux 笔记本值不值得买?分享一下你的想法吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/get-linux-laptops/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[chen-ni](https://github.com/chen-ni)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/guide-install-linux-mint-16-dual-boot-windows/
|
||||
[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/buy-linux-laptops.jpeg?resize=800%2C450&ssl=1
|
||||
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/dell-xps-ubuntu.jpg?resize=800%2C450&ssl=1
|
||||
[4]: https://itsfoss.com/dell-xps-13-ubuntu-review/
|
||||
[5]: https://www.dell.com
|
||||
[6]: https://system76.com/
|
||||
[7]: https://itsfoss.com/pop-os-linux-review/
|
||||
[8]: https://system76.com/desktops
|
||||
[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/system76-thelio-desktop.jpg?ssl=1
|
||||
[10]: https://system76.com/laptops
|
||||
[11]: https://itsfoss.com/4-linux-based-mini-pc-buy-2015/
|
||||
[12]: https://system76.com/servers
|
||||
[13]: https://system76.com/shipping
|
||||
[14]: https://itsfoss.com/use-google-drive-linux/
|
||||
[15]: https://www.crowdsupply.com/purism/librem-15
|
||||
[16]: https://puri.sm/products/librem-15/
|
||||
[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/purism-librem-13.jpg?resize=800%2C471&ssl=1
|
||||
[18]: https://puri.sm/products/librem-13/
|
||||
[19]: https://www.pureos.net/
|
||||
[20]: https://itsfoss.com/pureos-convergence/
|
||||
[21]: https://itsfoss.com/librem-linux-phone/
|
||||
[22]: https://puri.sm/
|
||||
[23]: https://itsfoss.com/slimbook-kde/
|
||||
[24]: https://distrowatch.com/table.php?distribution=lliurex
|
||||
[25]: https://en.wikipedia.org/wiki/MAX_(operating_system)
|
||||
[26]: https://slimbook.es/en/aio-curve-all-in-one-for-gnu-linux
|
||||
[27]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/Slimbook-Kymera-Aqua-Liquid-Cool-Linux-Computer.jpg?ssl=1
|
||||
[28]: https://slimbook.es/en/kymera-aqua-the-gnu-linux-computer-with-custom-water-cooling
|
||||
[29]: https://slimbook.es/en/
|
||||
[30]: https://www.tuxedocomputers.com/
|
||||
[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/tuxedo-computers.jpeg?resize=800%2C400&ssl=1
|
||||
[32]: https://www.tuxedocomputers.com/en/Shipping-Returns.tuxedo
|
||||
[33]: https://www.tuxedocomputers.com/en#
|
||||
[34]: https://store.vikings.net/index.php?route=common/home
|
||||
[35]: https://www.fsf.org
|
||||
[36]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/vikings-computer.jpeg?resize=800%2C450&ssl=1
|
||||
[37]: https://www.coreboot.org/
|
||||
[38]: https://libreboot.org/
|
||||
[39]: https://store.vikings.net/libre-friendly-hardware/the-server-1u
|
||||
[40]: https://store.vikings.net/index.php?route=information/information&information_id=8
|
||||
[41]: https://store.vikings.net/libre-friendly-hardware
|
||||
[42]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/manjarobook-by-ubuntushop.jpeg?ssl=1
|
||||
[43]: https://tails.boum.org/
|
||||
[44]: https://itsfoss.com/things-to-do-after-installing-ubuntu-18-04/
|
||||
[45]: https://itsfoss.com/lightweight-linux-beginners/
|
||||
[46]: https://www.ubuntushop.be/index.php/en/
|
||||
[47]: https://minifree.org/
|
||||
[48]: https://www.fsf.org/
|
||||
[49]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/minifree.jpg?resize=800%2C550&ssl=1
|
||||
[50]: https://trisquel.info/
|
||||
[51]: https://en.wikipedia.org/wiki/Richard_Stallman
|
||||
[52]: https://minifree.org/shipping-costs/
|
||||
[53]: https://www.entroware.com/
|
||||
[54]: https://itsfoss.com/ubuntu-mate-entroware/
|
||||
[55]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/entroware.jpg?resize=800%2C450&ssl=1
|
||||
[56]: https://itsfoss.com/ubuntu-entroware-aura-mini-pc/
|
||||
[57]: https://www.entroware.com/store/ares
|
||||
[58]: https://www.entroware.com/store/index.php?route=common/home
|
||||
[59]: https://www.amazon.com/Intel-NUC-Mainstream-Kit-NUC8i3BEH/dp/B07GX4X4PW?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B07GX4X4PW (Intel NUC)
|
||||
[60]: https://primeos.in/
|
||||
[61]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/juve-with-prime-os.jpeg?ssl=1
|
||||
[62]: https://junocomputers.com/shipping
|
||||
[63]: https://junocomputers.com/
|
||||
[64]: https://zareason.com/
|
||||
[65]: https://libiquity.com/
|
||||
[66]: https://stationx.rocks/
|
||||
[67]: https://www.linuxcertified.com/linux_laptops.html
|
||||
[68]: https://www.thinkpenguin.com/
|
||||
@@ -0,0 +1,154 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10943-1.html)
|
||||
[#]: subject: (Using Testinfra with Ansible to verify server state)
|
||||
[#]: via: (https://opensource.com/article/19/5/using-testinfra-ansible-verify-server-state)
|
||||
[#]: author: (Clement Verna https://opensource.com/users/cverna/users/paulbischoff/users/dcritch/users/cobiacomm/users/wgarry155/users/kadinroob/users/koreyhilpert)
|
||||
|
||||
使用 Testinfra 和 Ansible 验证服务器状态
|
||||
======
|
||||
|
||||
> Testinfra 是一个功能强大的库,可用于编写测试来验证基础设施的状态。另外它与 Ansible 和 Nagios 相结合,提供了一个用于架构即代码 (IaC) 的简单解决方案。
|
||||
|
||||
![Terminal command prompt on orange background][1]
|
||||
|
||||
根据设计,[Ansible][2] 传递机器的期望状态,以确保 Ansible 剧本或角色的内容部署到目标机器上。但是,如果你需要确保所有基础架构更改都在 Ansible 中,该怎么办?或者想随时验证服务器的状态?
|
||||
|
||||
[Testinfra][3] 是一个基础架构测试框架,它可以轻松编写单元测试来验证服务器的状态。它是一个 Python 库,使用强大的 [pytest][4] 测试引擎。
|
||||
|
||||
### 开始使用 Testinfra
|
||||
|
||||
可以使用 Python 包管理器(`pip`)和 Python 虚拟环境轻松安装 Testinfra。
|
||||
|
||||
```
|
||||
$ python3 -m venv venv
|
||||
$ source venv/bin/activate
|
||||
(venv) $ pip install testinfra
|
||||
```
|
||||
|
||||
Testinfra 也可以通过 Fedora 和 CentOS 的 EPEL 仓库中使用。例如,在 CentOS 7 上,你可以使用以下命令安装它:
|
||||
|
||||
```
|
||||
$ yum install -y epel-release
|
||||
$ yum install -y python-testinfra
|
||||
```
|
||||
|
||||
#### 一个简单的测试脚本
|
||||
|
||||
在 Testinfra 中编写测试很容易。使用你选择的代码编辑器,将以下内容添加到名为 `test_simple.py` 的文件中:
|
||||
|
||||
```
|
||||
import testinfra
|
||||
|
||||
def test_os_release(host):
|
||||
assert host.file("/etc/os-release").contains("Fedora")
|
||||
|
||||
def test_sshd_inactive(host):
|
||||
assert host.service("sshd").is_running is False
|
||||
```
|
||||
|
||||
默认情况下,Testinfra 为测试用例提供了一个 `host` 对象,该对象能访问不同的辅助模块。例如,第一个测试使用 `file` 模块来验证主机上文件的内容,第二个测试用例使用 `service` 模块来检查 systemd 服务的状态。
|
||||
|
||||
要在本机运行这些测试,请执行以下命令:
|
||||
|
||||
```
|
||||
(venv)$ pytest test_simple.py
|
||||
================================ test session starts ================================
|
||||
platform linux -- Python 3.7.3, pytest-4.4.1, py-1.8.0, pluggy-0.9.0
|
||||
rootdir: /home/cverna/Documents/Python/testinfra
|
||||
plugins: testinfra-3.0.0
|
||||
collected 2 items
|
||||
test_simple.py ..
|
||||
|
||||
================================ 2 passed in 0.05 seconds ================================
|
||||
```
|
||||
|
||||
有关 Testinfra API 的完整列表,你可以参考[文档][5]。
|
||||
|
||||
### Testinfra 和 Ansible
|
||||
|
||||
Testinfra 支持的后端之一是 Ansible,这意味着 Testinfra 可以直接使用 Ansible 的清单文件和清单中定义的一组机器来对它们进行测试。
|
||||
|
||||
我们使用以下清单文件作为示例:
|
||||
|
||||
```
|
||||
[web]
|
||||
app-frontend01
|
||||
app-frontend02
|
||||
|
||||
[database]
|
||||
db-backend01
|
||||
```
|
||||
|
||||
我们希望确保我们的 Apache Web 服务器在 `app-frontend01` 和 `app-frontend02` 上运行。让我们在名为 `test_web.py` 的文件中编写测试:
|
||||
|
||||
```
|
||||
def check_httpd_service(host):
|
||||
"""Check that the httpd service is running on the host"""
|
||||
assert host.service("httpd").is_running
|
||||
```
|
||||
|
||||
要使用 Testinfra 和 Ansible 运行此测试,请使用以下命令:
|
||||
|
||||
|
||||
```
|
||||
(venv) $ pip install ansible
|
||||
(venv) $ py.test --hosts=web --ansible-inventory=inventory --connection=ansible test_web.py
|
||||
```
|
||||
|
||||
在调用测试时,我们使用 Ansible 清单文件的 `[web]` 组作为目标计算机,并指定我们要使用 Ansible 作为连接后端。
|
||||
|
||||
#### 使用 Ansible 模块
|
||||
|
||||
Testinfra 还为 Ansible 提供了一个很好的可用于测试的 API。该 Ansible 模块能够在测试中运行 Ansible 动作,并且能够轻松检查动作的状态。
|
||||
|
||||
```
|
||||
def check_ansible_play(host):
|
||||
"""
|
||||
Verify that a package is installed using Ansible
|
||||
package module
|
||||
"""
|
||||
assert not host.ansible("package", "name=httpd state=present")["changed"]
|
||||
```
|
||||
|
||||
默认情况下,Ansible 的[检查模式][6]已启用,这意味着 Ansible 将报告在远程主机上执行动作时会发生的变化。
|
||||
|
||||
### Testinfra 和 Nagios
|
||||
|
||||
现在我们可以轻松地运行测试来验证机器的状态,我们可以使用这些测试来触发监控系统上的警报。这是捕获意外的更改的好方法。
|
||||
|
||||
Testinfra 提供了与 [Nagios][7] 的集成,它是一种流行的监控解决方案。默认情况下,Nagios 使用 [NRPE][8] 插件对远程主机进行检查,但使用 Testinfra 可以直接从 Nagios 主控节点上运行测试。
|
||||
|
||||
要使 Testinfra 输出与 Nagios 兼容,我们必须在触发测试时使用 `--nagios` 标志。我们还使用 `-qq` 这个 pytest 标志来启用 pytest 的静默模式,这样就不会显示所有测试细节。
|
||||
|
||||
```
|
||||
(venv) $ py.test --hosts=web --ansible-inventory=inventory --connection=ansible --nagios -qq line test.py
|
||||
TESTINFRA OK - 1 passed, 0 failed, 0 skipped in 2.55 seconds
|
||||
```
|
||||
|
||||
Testinfra 是一个功能强大的库,可用于编写测试以验证基础架构的状态。 另外与 Ansible 和 Nagios 相结合,提供了一个用于架构即代码 (IaC) 的简单解决方案。 它也是使用 [Molecule][9] 开发 Ansible 角色过程中添加测试的关键组件。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/using-testinfra-ansible-verify-server-state
|
||||
|
||||
作者:[Clement Verna][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/cverna/users/paulbischoff/users/dcritch/users/cobiacomm/users/wgarry155/users/kadinroob/users/koreyhilpert
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/terminal_command_linux_desktop_code.jpg?itok=p5sQ6ODE (Terminal command prompt on orange background)
|
||||
[2]: https://www.ansible.com/
|
||||
[3]: https://testinfra.readthedocs.io/en/latest/
|
||||
[4]: https://pytest.org/
|
||||
[5]: https://testinfra.readthedocs.io/en/latest/modules.html#modules
|
||||
[6]: https://docs.ansible.com/ansible/playbooks_checkmode.html
|
||||
[7]: https://www.nagios.org/
|
||||
[8]: https://en.wikipedia.org/wiki/Nagios#NRPE
|
||||
[9]: https://github.com/ansible/molecule
|
||||
471
published/201906/20190520 Getting Started With Docker.md
Normal file
471
published/201906/20190520 Getting Started With Docker.md
Normal file
@@ -0,0 +1,471 @@
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "zhang5788"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-10940-1.html"
|
||||
[#]: subject: "Getting Started With Docker"
|
||||
[#]: via: "https://www.ostechnix.com/getting-started-with-docker/"
|
||||
[#]: author: "sk https://www.ostechnix.com/author/sk/"
|
||||
|
||||
Docker 入门指南
|
||||
======
|
||||
|
||||
![Getting Started With Docker][1]
|
||||
|
||||
在我们的上一个教程中,我们已经了解[如何在 Ubuntu 上安装 Docker][1],和如何在 [CentOS 上安装 Docker][2]。今天,我们将会了解 Docker 的一些基础用法。该教程包含了如何创建一个新的 Docker 容器,如何运行该容器,如何从现有的 Docker 容器中创建自己的 Docker 镜像等 Docker 的一些基础知识、操作。所有步骤均在 Ubuntu 18.04 LTS server 版本下测试通过。
|
||||
|
||||
### 入门指南
|
||||
|
||||
在开始指南之前,不要混淆 Docker 镜像和 Docker 容器这两个概念。在之前的教程中,我就解释过,Docker 镜像是决定 Docker 容器行为的一个文件,Docker 容器则是 Docker 镜像的运行态或停止态。(LCTT 译注:在 macOS 下使用 Docker 终端时,不需要加 `sudo`)
|
||||
|
||||
#### 1、搜索 Docker 镜像
|
||||
|
||||
我们可以从 Docker 仓库中获取镜像,例如 [Docker hub][3],或者自己创建镜像。这里解释一下,Docker hub 是一个云服务器,用来提供给 Docker 的用户们创建、测试,和保存他们的镜像。
|
||||
|
||||
Docker hub 拥有成千上万个 Docker 镜像文件。你可以通过 `docker search`命令在这里搜索任何你想要的镜像。
|
||||
|
||||
例如,搜索一个基于 Ubuntu 的镜像文件,只需要运行:
|
||||
|
||||
```shell
|
||||
$ sudo docker search ubuntu
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
![][5]
|
||||
|
||||
搜索基于 CentOS 的镜像,运行:
|
||||
|
||||
```shell
|
||||
$ sudo docker search centos
|
||||
```
|
||||
|
||||
搜索 AWS 的镜像,运行:
|
||||
|
||||
```shell
|
||||
$ sudo docker search aws
|
||||
```
|
||||
|
||||
搜索 WordPress 的镜像:
|
||||
|
||||
```shell
|
||||
$ sudo docker search wordpress
|
||||
```
|
||||
|
||||
Docker hub 拥有几乎所有种类的镜像,包含操作系统、程序和其他任意的类型,这些你都能在 Docker hub 上找到已经构建完的镜像。如果你在搜索时,无法找到你想要的镜像文件,你也可以自己构建一个,将其发布出去,或者仅供你自己使用。
|
||||
|
||||
#### 2、下载 Docker 镜像
|
||||
|
||||
下载 Ubuntu 的镜像,你需要在终端运行以下命令:
|
||||
|
||||
```shell
|
||||
$ sudo docker pull ubuntu
|
||||
```
|
||||
|
||||
这条命令将会从 Docker hub 下载最近一个版本的 Ubuntu 镜像文件。
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
Using default tag: latest
|
||||
latest: Pulling from library/ubuntu
|
||||
6abc03819f3e: Pull complete
|
||||
05731e63f211: Pull complete
|
||||
0bd67c50d6be: Pull complete
|
||||
Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5
|
||||
Status: Downloaded newer image for ubuntu:latest
|
||||
```
|
||||
|
||||
![下载 Docker 镜像][6]
|
||||
|
||||
你也可以下载指定版本的 Ubuntu 镜像。运行以下命令:
|
||||
|
||||
```shell
|
||||
$ docker pull ubuntu:18.04
|
||||
```
|
||||
|
||||
Docker 允许在任意的宿主机操作系统下,下载任意的镜像文件,并运行。
|
||||
|
||||
例如,下载 CentOS 镜像:
|
||||
|
||||
```shell
|
||||
$ sudo docker pull centos
|
||||
```
|
||||
|
||||
所有下载的镜像文件,都被保存在 `/var/lib/docker` 文件夹下。(LCTT 译注:不同操作系统存放的文件夹并不是一致的,具体存放位置请在官方查询)
|
||||
|
||||
查看已经下载的镜像列表,可以使用以下命令:
|
||||
|
||||
```shell
|
||||
$ sudo docker images
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```shell
|
||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||
ubuntu latest 7698f282e524 14 hours ago 69.9MB
|
||||
centos latest 9f38484d220f 2 months ago 202MB
|
||||
hello-world latest fce289e99eb9 4 months ago 1.84kB
|
||||
```
|
||||
|
||||
正如你看到的那样,我已经下载了三个镜像文件:`ubuntu`、`centos` 和 `hello-world`。
|
||||
|
||||
现在,让我们继续,来看一下如何运行我们刚刚下载的镜像。
|
||||
|
||||
#### 3、运行 Docker 镜像
|
||||
|
||||
运行一个容器有两种方法。我们可以使用标签或者是镜像 ID。标签指的是特定的镜像快照。镜像 ID 是指镜像的唯一标识。
|
||||
|
||||
正如上面结果中显示,`latest` 是所有镜像的一个标签。`7698f282e524` 是 Ubuntu Docker 镜像的镜像 ID,`9f38484d220f`是 CentOS 镜像的镜像 ID,`fce289e99eb9` 是 hello_world 镜像的 镜像 ID。
|
||||
|
||||
下载完 Docker 镜像之后,你可以通过下面的命令来使用其标签来启动:
|
||||
|
||||
```shell
|
||||
$ sudo docker run -t -i ubuntu:latest /bin/bash
|
||||
```
|
||||
|
||||
在这条语句中:
|
||||
|
||||
* `-t`:在该容器中启动一个新的终端
|
||||
* `-i`:通过容器中的标准输入流建立交互式连接
|
||||
* `ubuntu:latest`:带有标签 `latest` 的 Ubuntu 容器
|
||||
* `/bin/bash`:在新的容器中启动 BASH Shell
|
||||
|
||||
或者,你可以通过镜像 ID 来启动新的容器:
|
||||
|
||||
```shell
|
||||
$ sudo docker run -t -i 7698f282e524 /bin/bash
|
||||
```
|
||||
|
||||
在这条语句里:
|
||||
|
||||
* `7698f282e524` — 镜像 ID
|
||||
|
||||
在启动容器之后,将会自动进入容器的 shell 中(注意看命令行的提示符)。
|
||||
|
||||
![][7]
|
||||
|
||||
*Docker 容器的 Shell*
|
||||
|
||||
如果想要退回到宿主机的终端(在这个例子中,对我来说,就是退回到 18.04 LTS),并且不中断该容器的执行,你可以按下 `CTRL+P`,再按下 `CTRL+Q`。现在,你就安全的返回到了你的宿主机系统中。需要注意的是,Docker 容器仍然在后台运行,我们并没有中断它。
|
||||
|
||||
可以通过下面的命令来查看正在运行的容器:
|
||||
|
||||
```shell
|
||||
$ sudo docker ps
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```shell
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
32fc32ad0d54 ubuntu:latest "/bin/bash" 7 minutes ago Up 7 minutes modest_jones
|
||||
```
|
||||
|
||||
![][8]
|
||||
|
||||
*列出正在运行的容器*
|
||||
|
||||
可以看到:
|
||||
|
||||
* `32fc32ad0d54` – 容器 ID
|
||||
* `ubuntu:latest` – Docker 镜像
|
||||
|
||||
需要注意的是,容器 ID 和 Docker 的镜像 ID是不同的。
|
||||
|
||||
可以通过以下命令查看所有正在运行和停止运行的容器:
|
||||
|
||||
```shell
|
||||
$ sudo docker ps -a
|
||||
```
|
||||
|
||||
在宿主机中断容器的执行:
|
||||
|
||||
```shell
|
||||
$ sudo docker stop <container-id>
|
||||
```
|
||||
|
||||
例如:
|
||||
|
||||
```shell
|
||||
$ sudo docker stop 32fc32ad0d54
|
||||
```
|
||||
|
||||
如果想要进入正在运行的容器中,你只需要运行:
|
||||
|
||||
```shell
|
||||
$ sudo docker attach 32fc32ad0d54
|
||||
```
|
||||
|
||||
正如你看到的,`32fc32ad0d54` 是一个容器的 ID。当你在容器中想要退出时,只需要在容器内的终端中输入命令:
|
||||
|
||||
```shell
|
||||
# exit
|
||||
```
|
||||
|
||||
你可以使用这个命令查看后台正在运行的容器:
|
||||
|
||||
```shell
|
||||
$ sudo docker ps
|
||||
```
|
||||
|
||||
#### 4、构建自己的 Docker 镜像
|
||||
|
||||
Docker 不仅仅可以下载运行在线的容器,你也可以创建你的自己的容器。
|
||||
|
||||
想要创建自己的 Docker 镜像,你需要先运行一个你已经下载完的容器:
|
||||
|
||||
```shell
|
||||
$ sudo docker run -t -i ubuntu:latest /bin/bash
|
||||
```
|
||||
|
||||
现在,你运行了一个容器,并且进入了该容器。然后,在该容器安装任意一个软件或做任何你想做的事情。
|
||||
|
||||
例如,我们在容器中安装一个 Apache web 服务器。
|
||||
|
||||
当你完成所有的操作,安装完所有的软件之后,你可以执行以下的命令来构建你自己的 Docker 镜像:
|
||||
|
||||
```shell
|
||||
# apt update
|
||||
# apt install apache2
|
||||
```
|
||||
|
||||
同样的,在容器中安装和测试你想要安装的所有软件。
|
||||
|
||||
当你安装完毕之后,返回的宿主机的终端。记住,不要关闭容器。想要返回到宿主机而不中断容器。请按下`CTRL+P`,再按下 `CTRL+Q`。
|
||||
|
||||
从你的宿主机的终端中,运行以下命令如寻找容器的 ID:
|
||||
|
||||
```shell
|
||||
$ sudo docker ps
|
||||
```
|
||||
|
||||
最后,从一个正在运行的容器中创建 Docker 镜像:
|
||||
|
||||
```shell
|
||||
$ sudo docker commit 3d24b3de0bfc ostechnix/ubuntu_apache
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```shell
|
||||
sha256:ce5aa74a48f1e01ea312165887d30691a59caa0d99a2a4aa5116ae124f02f962
|
||||
```
|
||||
|
||||
在这里:
|
||||
|
||||
* `3d24b3de0bfc` — 指 Ubuntu 容器的 ID。
|
||||
* `ostechnix` — 我们创建的容器的用户名称
|
||||
* `ubuntu_apache` — 我们创建的镜像
|
||||
|
||||
让我们检查一下我们新创建的 Docker 镜像:
|
||||
|
||||
```shell
|
||||
$ sudo docker images
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```shell
|
||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||
ostechnix/ubuntu_apache latest ce5aa74a48f1 About a minute ago 191MB
|
||||
ubuntu latest 7698f282e524 15 hours ago 69.9MB
|
||||
centos latest 9f38484d220f 2 months ago 202MB
|
||||
hello-world latest fce289e99eb9 4 months ago 1.84kB
|
||||
```
|
||||
|
||||
![][9]
|
||||
|
||||
*列出所有的 Docker 镜像*
|
||||
|
||||
正如你看到的,这个新的镜像就是我们刚刚在本地系统上从运行的容器上创建的。
|
||||
|
||||
现在,你可以从这个镜像创建一个新的容器。
|
||||
|
||||
```shell
|
||||
$ sudo docker run -t -i ostechnix/ubuntu_apache /bin/bash
|
||||
```
|
||||
|
||||
#### 5、删除容器
|
||||
|
||||
如果你在 Docker 上的工作已经全部完成,你就可以删除那些你不需要的容器。
|
||||
|
||||
想要删除一个容器,首先,你需要停止该容器。
|
||||
|
||||
我们先来看一下正在运行的容器有哪些
|
||||
|
||||
```shell
|
||||
$ sudo docker ps
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```shell
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
3d24b3de0bfc ubuntu:latest "/bin/bash" 28 minutes ago Up 28 minutes goofy_easley
|
||||
```
|
||||
|
||||
使用容器 ID 来停止该容器:
|
||||
|
||||
```shell
|
||||
$ sudo docker stop 3d24b3de0bfc
|
||||
```
|
||||
|
||||
现在,就可以删除该容器了。
|
||||
|
||||
```shell
|
||||
$ sudo docker rm 3d24b3de0bfc
|
||||
```
|
||||
|
||||
你就可以按照这样的方法来删除那些你不需要的容器了。
|
||||
|
||||
当需要删除的容器数量很多时,一个一个删除也是很麻烦的,我们可以直接删除所有的已经停止的容器。只需要运行:
|
||||
|
||||
```shell
|
||||
$ sudo docker container prune
|
||||
```
|
||||
|
||||
按下 `Y`,来确认你的操作:
|
||||
|
||||
```sehll
|
||||
WARNING! This will remove all stopped containers.
|
||||
Are you sure you want to continue? [y/N] y
|
||||
Deleted Containers:
|
||||
32fc32ad0d5445f2dfd0d46121251c7b5a2aea06bb22588fb2594ddbe46e6564
|
||||
5ec614e0302061469ece212f0dba303c8fe99889389749e6220fe891997f38d0
|
||||
|
||||
Total reclaimed space: 5B
|
||||
```
|
||||
|
||||
这个命令仅支持最新的 Docker。(LCTT 译注:仅支持 1.25 及以上版本的 Docker)
|
||||
|
||||
#### 6、删除 Docker 镜像
|
||||
|
||||
当你删除了不要的 Docker 容器后,你也可以删除你不需要的 Docker 镜像。
|
||||
|
||||
列出已经下载的镜像:
|
||||
|
||||
```shell
|
||||
$ sudo docker images
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```shell
|
||||
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||
ostechnix/ubuntu_apache latest ce5aa74a48f1 5 minutes ago 191MB
|
||||
ubuntu latest 7698f282e524 15 hours ago 69.9MB
|
||||
centos latest 9f38484d220f 2 months ago 202MB
|
||||
hello-world latest fce289e99eb9 4 months ago 1.84kB
|
||||
```
|
||||
|
||||
由上面的命令可以知道,在本地的系统中存在三个镜像。
|
||||
|
||||
使用镜像 ID 来删除镜像。
|
||||
|
||||
```shell
|
||||
$ sudo docekr rmi ce5aa74a48f1
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```shell
|
||||
Untagged: ostechnix/ubuntu_apache:latest
|
||||
Deleted: sha256:ce5aa74a48f1e01ea312165887d30691a59caa0d99a2a4aa5116ae124f02f962
|
||||
Deleted: sha256:d21c926f11a64b811dc75391bbe0191b50b8fe142419f7616b3cee70229f14cd
|
||||
```
|
||||
|
||||
#### 解决问题
|
||||
|
||||
Docker 禁止我们删除一个还在被容器使用的镜像。
|
||||
|
||||
例如,当我试图删除 Docker 镜像 `b72889fa879c` 时,我只能获得一个错误提示:
|
||||
|
||||
```shell
|
||||
Error response from daemon: conflict: unable to delete b72889fa879c (must be forced) - image is being used by stopped container dde4dd285377
|
||||
```
|
||||
|
||||
这是因为这个 Docker 镜像正在被一个容器使用。
|
||||
|
||||
所以,我们来检查一个正在运行的容器:
|
||||
|
||||
```shell
|
||||
$ sudo docker ps
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
![][10]
|
||||
|
||||
注意,现在并没有正在运行的容器!!!
|
||||
|
||||
查看一下所有的容器(包含所有的正在运行和已经停止的容器):
|
||||
|
||||
```shell
|
||||
$ sudo docker pa -a
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
![][11]
|
||||
|
||||
可以看到,仍然有一些已经停止的容器在使用这些镜像。
|
||||
|
||||
让我们把这些容器删除:
|
||||
|
||||
```shell
|
||||
$ sudo docker rm 12e892156219
|
||||
```
|
||||
|
||||
我们仍然使用容器 ID 来删除这些容器。
|
||||
|
||||
当我们删除了所有使用该镜像的容器之后,我们就可以删除 Docker 的镜像了。
|
||||
|
||||
例如:
|
||||
|
||||
```shell
|
||||
$ sudo docekr rmi b72889fa879c
|
||||
```
|
||||
|
||||
我们再来检查一下本机存在的镜像:
|
||||
|
||||
```shell
|
||||
$ sudo docker images
|
||||
```
|
||||
|
||||
想要知道更多的细节,请参阅本指南末尾给出的官方资源的链接或者在评论区进行留言。
|
||||
|
||||
这就是全部的教程了,希望你可以了解 Docker 的一些基础用法。
|
||||
|
||||
更多的教程马上就会到来,敬请关注。
|
||||
|
||||
---
|
||||
|
||||
via: https://www.ostechnix.com/getting-started-with-docker/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[zhang5788](https://github.com/zhang5788)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2016/04/docker-basics-720x340.png
|
||||
[2]: http://www.ostechnix.com/install-docker-ubuntu/
|
||||
[3]: https://www.ostechnix.com/install-docker-centos/
|
||||
[4]: https://hub.docker.com/
|
||||
[5]: http://www.ostechnix.com/wp-content/uploads/2016/04/Search-Docker-images.png
|
||||
[6]: http://www.ostechnix.com/wp-content/uploads/2016/04/Download-docker-images.png
|
||||
[7]: http://www.ostechnix.com/wp-content/uploads/2016/04/Docker-containers-shell.png
|
||||
[8]: http://www.ostechnix.com/wp-content/uploads/2016/04/List-running-containers.png
|
||||
[9]: http://www.ostechnix.com/wp-content/uploads/2016/04/List-docker-images.png
|
||||
[10]: http://www.ostechnix.com/wp-content/uploads/2016/04/sk@sk-_005-1-1.jpg
|
||||
[11]: http://www.ostechnix.com/wp-content/uploads/2016/04/sk@sk-_006-1.jpg
|
||||
[12]: https://ostechnix.tradepub.com/free/w_java39/prgm.cgi?a=1
|
||||
[13]: https://ostechnix.tradepub.com/free/w_pacb32/prgm.cgi?a=1
|
||||
[14]: https://ostechnix.tradepub.com/free/w_pacb31/prgm.cgi?a=1
|
||||
[15]: https://ostechnix.tradepub.com/free/w_pacb29/prgm.cgi?a=1
|
||||
[16]: https://ostechnix.tradepub.com/free/w_pacb28/prgm.cgi?a=1
|
||||
@@ -0,0 +1,75 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (chen-ni)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10961-1.html)
|
||||
[#]: subject: (When IoT systems fail: The risk of having bad IoT data)
|
||||
[#]: via: (https://www.networkworld.com/article/3396230/when-iot-systems-fail-the-risk-of-having-bad-iot-data.html)
|
||||
[#]: author: (Fredric Paul https://www.networkworld.com/author/Fredric-Paul/)
|
||||
|
||||
当物联网系统出现故障:使用低质量物联网数据的风险
|
||||
======
|
||||
|
||||
> 伴随着物联网设备使用量的增长,这些设备产生的数据可以让消费者节约巨大的开支,也给商家带来新的机遇。但是当故障不可避免地出现的时候,会发生什么呢?
|
||||
|
||||
![Oonal / Getty Images][1]
|
||||
|
||||
不管你看的是什么统计数字,很明显物联网正在走进个人和私人生活的方方面面。这种增长虽然有不少好处,但是也带来了新的风险。一个很重要的问题是,出现问题的时候谁来负责呢?
|
||||
|
||||
也许最大的问题出在基于物联网数据进行的个性化营销以及定价策略上。[保险公司长期以来致力于寻找利用物联网数据的最佳方式][2],我去年写过家庭财产保险公司是如何开始利用物联网传感器减少水灾带来的损失的。一些公司正在研究保险公司竞购消费者的可能性:这种业务基于智能家居数据所揭示的风险的高低。
|
||||
|
||||
但是最大的进步出现在汽车保险领域。许多汽车保险公司已经可以让客户在车辆上安装追踪设备,如果数据证明他们的驾驶习惯良好就可以获取保险折扣。
|
||||
|
||||
- 延伸阅读:[保险公司终于有了一个利用智能家居物联网的好办法][3]
|
||||
|
||||
### UBI 车险的崛起
|
||||
|
||||
UBI(<ruby>基于使用的保险<rt>usage-based insurance</rt></ruby>)车险是一种“按需付费”的业务,可以通过追踪速度、位置,以及其他因素来评估风险并计算车险保费。到 2020 年,预计有 [5000 万美国司机][4]会加入到 UBI 车险的项目中。
|
||||
|
||||
不出所料,保险公司对 UBI 车险青睐有加,因为 UBI 车险可以帮助他们更加精确地计算风险。事实上,[AIG 爱尔兰已经在尝试让国家向 25 岁以下的司机强制推行 UBI 车险][5]。并且,被认定为驾驶习惯良好的司机自然也很乐意节省一笔费用。当然也有反对的声音了,大多数是来自于隐私权倡导者,以及会因此支付更多费用的群体。
|
||||
|
||||
### 出了故障会发生什么?
|
||||
|
||||
但是还有一个更加令人担忧的潜在问题:当物联网设备提供的数据有错误,或者在传输过程中出了问题会发生什么?因为尽管有自动化程序、错误检查等等,还是不可避免地会偶尔发生一些故障。
|
||||
|
||||
不幸的是,这并不是一个理论上某天会给细心的司机不小心多扣几块钱保费的问题。这已经是一个会带来严重后果的现实问题。就像[保险行业仍然没有想清楚谁应该“拥有”面向客户的物联网设备产生的数据][6]一样,我们也不清楚谁将对这些数据所带来的问题负责。
|
||||
|
||||
计算机“故障”据说曾导致赫兹的出租车辆被误报为被盗(虽然在这个例子中这并不是一个严格意义上的物联网问题),并且导致无辜的租车人被逮捕并扣留。结果呢?刑事指控,多年的诉讼官司,以及舆论的指责。非常强烈的舆论指责。
|
||||
|
||||
我们非常容易想象一些类似的情况,比如说一个物联网传感器出了故障,然后报告说某辆车超速了,然而事实上并没有超速。想想为这件事打官司的麻烦吧,或者想想和你的保险公司如何争执不下。
|
||||
|
||||
(当然,这个问题还有另外一面:消费者可能会想办法篡改他们的物联网设备上的数据,以获得更低的费率或者转移事故责任。我们同样也没有可行的办法来应对*这个问题*。)
|
||||
|
||||
### 政府监管是否有必要
|
||||
|
||||
考虑到这些问题的潜在影响,以及所涉及公司对处理这些问题的无动于衷,我们似乎有理由猜想政府干预的必要性。
|
||||
|
||||
这可能是美国众议员 Bob Latta(俄亥俄州,共和党)[重新引入 SMART IOT(物联网现代应用、研究及趋势的现状)法案][7]背后的一个动机。这项由 Latta 和美国众议员 Peter Welch(佛蒙特州,民主党)领导的两党合作物联网工作组提出的[法案][8],于去年秋天通过美国众议院,但被美国参议院驳回了。美国商务部需要研究物联网行业的状况,并在两年后向美国众议院能源与商业部和美国参议院商务委员会报告。
|
||||
|
||||
Latta 在一份声明中表示,“由于预计会有数万亿美元的经济影响,我们需要考虑物联网所带来的的政策,机遇和挑战。SMART IoT 法案会让人们更容易理解美国政府在物联网政策上的做法、可以改进的地方,以及美国联邦政策如何影响尖端技术的研究和发明。”
|
||||
|
||||
这项研究受到了欢迎,但该法案甚至可能不会被通过。即便通过了,物联网在两年的等待时间里也可能会翻天覆地,让美国政府还是无法跟上。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3396230/when-iot-systems-fail-the-risk-of-having-bad-iot-data.html
|
||||
|
||||
作者:[Fredric Paul][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[chen-ni](https://github.com/chen-ni)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Fredric-Paul/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2018/08/cloud_connected_smart_cars_by_oonal_gettyimages-692819426_1200x800-100767788-large.jpg
|
||||
[2]: https://www.networkworld.com/article/3264655/most-insurance-carriers-not-ready-to-use-iot-data.html
|
||||
[3]: https://www.networkworld.com/article/3296706/finally-a-smart-way-for-insurers-to-leverage-iot-in-smart-homes.html
|
||||
[4]: https://www.businessinsider.com/iot-is-changing-the-auto-insurance-industry-2015-8
|
||||
[5]: https://www.iotforall.com/iot-data-is-disrupting-the-insurance-industry/
|
||||
[6]: https://www.sas.com/en_us/insights/articles/big-data/5-challenges-for-iot-in-insurance-industry.html
|
||||
[7]: https://www.multichannel.com/news/latta-re-ups-smart-iot-act
|
||||
[8]: https://latta.house.gov/uploadedfiles/smart_iot_116th.pdf
|
||||
[9]: https://www.facebook.com/NetworkWorld/
|
||||
[10]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,109 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10922-1.html)
|
||||
[#]: subject: (Zettlr – Markdown Editor for Writers and Researchers)
|
||||
[#]: via: (https://itsfoss.com/zettlr-markdown-editor/)
|
||||
[#]: author: (John Paul https://itsfoss.com/author/john/)
|
||||
|
||||
Zettlr:适合写作者和研究人员的 Markdown 编辑器
|
||||
======
|
||||
|
||||
有很多[适用于 Linux 的 Markdown 编辑器][1],并且还在继续增加。问题是,像 [Boostnote][2] 一样,大多数是为编码人员设计的,可能不会受到非技术人员的欢迎。让我们看一个想要替代 Word 和昂贵的文字处理器,适用于非技术人员的 Markdown 编辑器。我们来看看 Zettlr 吧。
|
||||
|
||||
### Zettlr Markdown 编辑器
|
||||
|
||||
![Zettlr Light Mode][3]
|
||||
|
||||
我可能在网站上提到过一两次,我更喜欢用 [Markdown][4] 写下我的所有文档。它易于学习,不会让你受困于专有文档格式。我还在我的[适合作者的开源工具列表][5]中提到了 Markdown 编辑器。
|
||||
|
||||
我用过许多 Markdown 编辑器,但是我一直有兴趣尝试新的。最近,我遇到了 Zettlr,一个开源 Markdown 编辑器。
|
||||
|
||||
[Zettlr][6] 是一位名叫 [Hendrik Erz][7] 的德国社会学家/政治理论家创建的。Hendrik 创建了 Zettlr,因为他对目前的文字处理器感到不满意。他想要可以让他“专注于写作和阅读”的编辑器。
|
||||
|
||||
在发现 Markdown 之后,他在不同的操作系统上尝试了几个 Markdown 编辑器。但它们都没有他想要的东西。[根据 Hendrik 的说法][8],“但我不得不意识到没有为高效组织大量文本而写的编辑器。大多数编辑都是由编码人员编写的,因此可以满足工程师和数学家的需求。没有为我这样的社会科学、历史或政治学的学生的编辑器。“
|
||||
|
||||
所以他决定创造自己的。2017 年 11 月,他开始编写 Zettlr。
|
||||
|
||||
![Zettlr About][9]
|
||||
|
||||
#### Zettlr 功能
|
||||
|
||||
Zettlr 有许多简洁的功能,包括:
|
||||
|
||||
* 从 [Zotero 数据库][10]导入源并在文档中引用它们
|
||||
* 使用可选的行屏蔽,让你无打扰地专注于写作
|
||||
* 支持代码高亮
|
||||
* 使用标签对信息进行排序
|
||||
* 能够为该任务设定写作目标
|
||||
* 查看一段时间的写作统计
|
||||
* 番茄钟计时器
|
||||
* 浅色/深色主题
|
||||
* 使用 [reveal.js][11] 创建演示文稿
|
||||
* 快速预览文档
|
||||
* 可以在一个项目文件夹中搜索 Markdown 文档,并用热图展示文字搜索密度。
|
||||
* 将文件导出为 HTML、PDF、ODT、DOC、reStructuredText、LaTex、TXT、Emacs ORG、[TextBundle][12] 和 Textpack
|
||||
* 将自定义 CSS 添加到你的文档
|
||||
|
||||
当我写这篇文章时,一个对话框弹出来告诉我最近发布了 [1.3.0 beta][14]。此测试版将包括几个新的主题,以及一大堆修复,新功能和改进。
|
||||
|
||||
![Zettlr Night Mode][15]
|
||||
|
||||
#### 安装 Zettlr
|
||||
|
||||
目前,唯一可安装 Zettlr 的 Linux 存储库是 [AUR][16]。如果你的 Linux 发行版不是基于 Arch 的,你可以从网站上下载 macOS、Windows、Debian 和 Fedora 的[安装程序][17]。
|
||||
|
||||
#### 对 Zettlr 的最后一点想法
|
||||
|
||||
注意:为了测试 Zettlr,我用它来写这篇文章。
|
||||
|
||||
Zettlr 有许多我希望我之前选择的编辑器 (ghostwriter) 有的简洁的功能,例如为文档设置字数目标。我也喜欢在不打开文档的情况下预览文档的功能。
|
||||
|
||||
![Zettlr Settings][18]
|
||||
|
||||
我也遇到了几个问题,但这些更多的是因为 Zettlr 与 ghostwriter 的工作方式略有不同。例如,当我尝试从网站复制引用或名称时,它会将内嵌样式粘贴到 Zettlr 中。幸运的是,它有一个“不带样式粘贴”的选项。有几次我在打字时有轻微的延迟。但那可能是因为它是一个 Electron 程序。
|
||||
|
||||
总的来说,我认为 Zettlr 是第一次使用 Markdown 用户的好选择。它有许多 Markdown 编辑器已有的功能,并为那些只使用过文字处理器的用户增加了一些功能。
|
||||
|
||||
正如 Hendrik 在 [Zettlr 网站][8]中所说的那样,“让自己摆脱文字处理器的束缚,看看你的写作过程如何通过身边的技术得到改善!”
|
||||
|
||||
如果你觉得 Zettlr 有用,请考虑支持 [Hendrik][19]。正如他在网站上所说,“它是免费的,因为我不相信激烈竞争、早逝的创业文化。我只是想帮忙。”
|
||||
|
||||
你有没有用过 Zettlr?你最喜欢的 Markdown 编辑器是什么?请在下面的评论中告诉我们。
|
||||
|
||||
如果你觉得这篇文章有趣,请在社交媒体,Hacker News 或 [Reddit][21] 上分享它。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/zettlr-markdown-editor/
|
||||
|
||||
作者:[John Paul][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/john/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/best-markdown-editors-linux/
|
||||
[2]: https://itsfoss.com/boostnote-linux-review/
|
||||
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/Zettlr-light-mode.png?fit=800%2C462&ssl=1
|
||||
[4]: https://daringfireball.net/projects/markdown/
|
||||
[5]: https://itsfoss.com/open-source-tools-writers/
|
||||
[6]: https://www.zettlr.com/
|
||||
[7]: https://github.com/nathanlesage
|
||||
[8]: https://www.zettlr.com/about
|
||||
[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/zettlr-about.png?fit=800%2C528&ssl=1
|
||||
[10]: https://www.zotero.org/
|
||||
[11]: https://revealjs.com/#/
|
||||
[12]: http://textbundle.org/
|
||||
[13]: https://itsfoss.com/great-little-book-shelf-review/
|
||||
[14]: https://github.com/Zettlr/Zettlr/releases/tag/v1.3.0-beta
|
||||
[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/Zettlr-night-mode.png?fit=800%2C469&ssl=1
|
||||
[16]: https://aur.archlinux.org/packages/zettlr-bin/
|
||||
[17]: https://www.zettlr.com/download
|
||||
[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/zettlr-settings.png?fit=800%2C353&ssl=1
|
||||
[19]: https://www.zettlr.com/supporters
|
||||
[21]: http://reddit.com/r/linuxusersgroup
|
||||
@@ -0,0 +1,62 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (chen-ni)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10934-1.html)
|
||||
[#]: subject: (French IT giant Atos enters the edge-computing business)
|
||||
[#]: via: (https://www.networkworld.com/article/3397139/atos-is-the-latest-to-enter-the-edge-computing-business.html)
|
||||
[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/)
|
||||
|
||||
法国 IT 巨头 Atos 进军边缘计算
|
||||
======
|
||||
|
||||
> Atos 另辟蹊径,通过一种只有行李箱大小的设备 BullSequana Edge 进军边缘计算。
|
||||
|
||||
![iStock][1]
|
||||
|
||||
法国 IT 巨头 Atos 是最近才开展边缘计算业务的,他们的产品是一个叫做 BullSequana Edge 的小型设备。和竞争对手们的集装箱大小的设备不同(比如说 Vapor IO 和 Schneider Electronics 的产品),Atos 的边缘设备完全可以被放进衣柜里。
|
||||
|
||||
Atos 表示,他们的这个设备使用人工智能应用提供快速响应,适合需要快速响应的领域比如生产 4.0、自动驾驶汽车、健康管理,以及零售业和机场的安保系统。在这些领域,数据需要在边缘进行实时处理和分析。
|
||||
|
||||
[延伸阅读:[什么是边缘计算?][2] 以及 [边缘网络和物联网如何重新定义数据中心][3]]
|
||||
|
||||
BullSequana Edge 可以作为独立的基础设施单独采购,也可以和 Atos 的边缘软件捆绑采购,并且这个软件还是非常出色的。Atos 表示 BullSequana Edge 主要支持三种使用场景:
|
||||
|
||||
* AI(人工智能):Atos 的边缘计算机视觉软件为监控摄像头提供先进的特征抽取和分析技术,包括人像、人脸、行为等特征。这些分析可以支持系统做出自动化响应。
|
||||
* 大数据:Atos 边缘数据分析系统通过预测性和规范性的解决方案,帮助机构优化商业模型。它使用数据湖的功能,确保数据的可信度和可用性。
|
||||
* 容器:Atos 边缘数据容器(EDC)是一种一体化容器解决方案。它可以作为一个去中心化的 IT 系统在边缘运行,并且可以在没有数据中心的环境下自动运行,而不需要现场操作。
|
||||
|
||||
由于体积小,BullSequana Edge 并不具备很强的处理能力。它装载一个 16 核的 Intel Xeon 中央处理器,可以装备最多两枚英伟达 Tesla T4 图形处理器或者是 FPGA(现场可编程门阵列)。Atos 表示,这就足够让复杂的 AI 模型在边缘进行低延迟的运行了。
|
||||
|
||||
考虑到数据的敏感性,BullSequana Edge 同时装备了一个入侵感应器,用来在遭遇物理入侵的时候禁用机器。
|
||||
|
||||
虽然大多数边缘设备都被安放在信号塔附近,但是考虑到边缘系统可能被安放在任何地方,BullSequana Edge 还支持通过无线电、全球移动通信系统(GSM),或者 Wi-Fi 来进行通信。
|
||||
|
||||
Atos 在美国也许不是一个家喻户晓的名字,但是在欧洲它可以和 IBM 相提并论,并且在过去的十年里已经收购了诸如 Bull SA、施乐 IT 外包以及西门子 IT 等 IT 巨头们。
|
||||
|
||||
关于边缘网络的延伸阅读:
|
||||
|
||||
* [边缘网络和物联网如何重新定义数据中心][3]
|
||||
* [边缘计算的最佳实践][4]
|
||||
* [边缘计算如何提升物联网安全][5]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3397139/atos-is-the-latest-to-enter-the-edge-computing-business.html
|
||||
|
||||
作者:[Andy Patrizio][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[chen-ni](https://github.com/chen-ni)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Andy-Patrizio/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/01/huawei-18501-edge-gartner-100786331-large.jpg
|
||||
[2]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html
|
||||
[3]: https://www.networkworld.com/article/3291790/data-center/how-edge-networking-and-iot-will-reshape-data-centers.html
|
||||
[4]: https://www.networkworld.com/article/3331978/lan-wan/edge-computing-best-practices.html
|
||||
[5]: https://www.networkworld.com/article/3331905/internet-of-things/how-edge-computing-can-help-secure-the-iot.html
|
||||
[6]: https://www.facebook.com/NetworkWorld/
|
||||
[7]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,201 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10945-1.html)
|
||||
[#]: subject: (Securing telnet connections with stunnel)
|
||||
[#]: via: (https://fedoramagazine.org/securing-telnet-connections-with-stunnel/)
|
||||
[#]: author: (Curt Warfield https://fedoramagazine.org/author/rcurtiswarfield/)
|
||||
|
||||
使用 stunnel 保护 telnet 连接
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
Telnet 是一种客户端-服务端协议,通过 TCP 的 23 端口连接到远程服务器。Telnet 并不加密数据,因此它被认为是不安全的,因为数据是以明文形式发送的,所以密码很容易被嗅探。但是,仍有老旧系统需要使用它。这就是用到 **stunnel** 的地方。
|
||||
|
||||
stunnel 旨在为使用不安全连接协议的程序增加 SSL 加密。本文将以 telnet 为例介绍如何使用它。
|
||||
|
||||
### 服务端安装
|
||||
|
||||
[使用 sudo][2] 安装 stunnel 以及 telnet 的服务端和客户端:
|
||||
|
||||
```
|
||||
sudo dnf -y install stunnel telnet-server telnet
|
||||
```
|
||||
|
||||
添加防火墙规则,在提示时输入你的密码:
|
||||
|
||||
```
|
||||
firewall-cmd --add-service=telnet --perm
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
接下来,生成 RSA 私钥和 SSL 证书:
|
||||
|
||||
```
|
||||
openssl genrsa 2048 > stunnel.key
|
||||
openssl req -new -key stunnel.key -x509 -days 90 -out stunnel.crt
|
||||
```
|
||||
|
||||
系统将一次提示你输入以下信息。当询问 `Common Name` 时,你必须输入正确的主机名或 IP 地址,但是你可以按回车键跳过其他所有内容。
|
||||
|
||||
```
|
||||
You are about to be asked to enter information that will be
|
||||
incorporated into your certificate request.
|
||||
What you are about to enter is what is called a Distinguished Name or a DN.
|
||||
There are quite a few fields but you can leave some blank
|
||||
For some fields there will be a default value,
|
||||
If you enter '.', the field will be left blank.
|
||||
-----
|
||||
Country Name (2 letter code) [XX]:
|
||||
State or Province Name (full name) []:
|
||||
Locality Name (eg, city) [Default City]:
|
||||
Organization Name (eg, company) [Default Company Ltd]:
|
||||
Organizational Unit Name (eg, section) []:
|
||||
Common Name (eg, your name or your server's hostname) []:
|
||||
Email Address []
|
||||
```
|
||||
|
||||
将 RSA 密钥和 SSL 证书合并到单个 `.pem` 文件中,并将其复制到 SSL 证书目录:
|
||||
|
||||
```
|
||||
cat stunnel.crt stunnel.key > stunnel.pem
|
||||
sudo cp stunnel.pem /etc/pki/tls/certs/
|
||||
```
|
||||
|
||||
现在可以定义服务和用于加密连接的端口了。选择尚未使用的端口。此例使用 450 端口进行隧道传输 telnet。编辑或创建 `/etc/stunnel/telnet.conf`:
|
||||
|
||||
```
|
||||
cert = /etc/pki/tls/certs/stunnel.pem
|
||||
sslVersion = TLSv1
|
||||
chroot = /var/run/stunnel
|
||||
setuid = nobody
|
||||
setgid = nobody
|
||||
pid = /stunnel.pid
|
||||
socket = l:TCP_NODELAY=1
|
||||
socket = r:TCP_NODELAY=1
|
||||
[telnet]
|
||||
accept = 450
|
||||
connect = 23
|
||||
```
|
||||
|
||||
`accept` 选项是服务器将监听传入 telnet 请求的接口。`connect` 选项是 telnet 服务器的内部监听接口。
|
||||
|
||||
接下来,创建一个 systemd 单元文件的副本来覆盖原来的版本:
|
||||
|
||||
```
|
||||
sudo cp /usr/lib/systemd/system/stunnel.service /etc/systemd/system
|
||||
```
|
||||
|
||||
编辑 `/etc/systemd/system/stunnel.service` 来添加两行。这些行在启动时为服务创建 chroot 监狱。
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=TLS tunnel for network daemons
|
||||
After=syslog.target network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/stunnel
|
||||
Type=forking
|
||||
PrivateTmp=true
|
||||
ExecStartPre=-/usr/bin/mkdir /var/run/stunnel
|
||||
ExecStartPre=/usr/bin/chown -R nobody:nobody /var/run/stunnel
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
接下来,配置 SELinux 以在你刚刚指定的新端口上监听 telnet:
|
||||
|
||||
```
|
||||
sudo semanage port -a -t telnetd_port_t -p tcp 450
|
||||
```
|
||||
|
||||
最后,添加新的防火墙规则:
|
||||
|
||||
```
|
||||
firewall-cmd --add-port=450/tcp --perm
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
现在你可以启用并启动 telnet 和 stunnel。
|
||||
|
||||
```
|
||||
systemctl enable telnet.socket stunnel@telnet.service --now
|
||||
```
|
||||
|
||||
要注意 `systemctl` 命令是有顺序的。systemd 和 stunnel 包默认提供额外的[模板单元文件][3]。该模板允许你将 stunnel 的多个配置文件放到 `/etc/stunnel` 中,并使用文件名启动该服务。例如,如果你有一个 `foobar.conf` 文件,那么可以使用 `systemctl start stunnel@foobar.service` 启动该 stunnel 实例,而无需自己编写任何单元文件。
|
||||
|
||||
如果需要,可以将此 stunnel 模板服务设置为在启动时启动:
|
||||
|
||||
```
|
||||
systemctl enable stunnel@telnet.service
|
||||
```
|
||||
|
||||
### 客户端安装
|
||||
|
||||
本文的这部分假设你在客户端系统上以普通用户([拥有 sudo 权限][2])身份登录。安装 stunnel 和 telnet 客户端:
|
||||
|
||||
```
|
||||
dnf -y install stunnel telnet
|
||||
```
|
||||
|
||||
将 `stunnel.pem` 从远程服务器复制到客户端的 `/etc/pki/tls/certs` 目录。在此例中,远程 telnet 服务器的 IP 地址为 `192.168.1.143`。
|
||||
|
||||
```
|
||||
sudo scp myuser@192.168.1.143:/etc/pki/tls/certs/stunnel.pem
|
||||
/etc/pki/tls/certs/
|
||||
```
|
||||
|
||||
创建 `/etc/stunnel/telnet.conf`:
|
||||
|
||||
```
|
||||
cert = /etc/pki/tls/certs/stunnel.pem
|
||||
client=yes
|
||||
[telnet]
|
||||
accept=450
|
||||
connect=192.168.1.143:450
|
||||
```
|
||||
|
||||
`accept` 选项是用于 telnet 会话的端口。`connect` 选项是你远程服务器的 IP 地址以及监听的端口。
|
||||
|
||||
接下来,启用并启动 stunnel:
|
||||
|
||||
```
|
||||
systemctl enable stunnel@telnet.service --now
|
||||
```
|
||||
|
||||
测试你的连接。由于有一条已建立的连接,你会 `telnet` 到 `localhost` 而不是远程 telnet 服务器的主机名或者 IP 地址。
|
||||
|
||||
```
|
||||
[user@client ~]$ telnet localhost 450
|
||||
Trying ::1...
|
||||
telnet: connect to address ::1: Connection refused
|
||||
Trying 127.0.0.1...
|
||||
Connected to localhost.
|
||||
Escape character is '^]'.
|
||||
|
||||
Kernel 5.0.9-301.fc30.x86_64 on an x86_64 (0)
|
||||
server login: myuser
|
||||
Password: XXXXXXX
|
||||
Last login: Sun May 5 14:28:22 from localhost
|
||||
[myuser@server ~]$
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/securing-telnet-connections-with-stunnel/
|
||||
|
||||
作者:[Curt Warfield][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/rcurtiswarfield/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/05/stunnel-816x345.jpg
|
||||
[2]: https://fedoramagazine.org/howto-use-sudo/
|
||||
[3]: https://fedoramagazine.org/systemd-template-unit-files/
|
||||
@@ -0,0 +1,119 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10935-1.html)
|
||||
[#]: subject: (4 Ways to Run Linux Commands in Windows)
|
||||
[#]: via: (https://itsfoss.com/run-linux-commands-in-windows/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
在 Windows 中运行 Linux 命令的 4 种方法
|
||||
======
|
||||
|
||||
> 想要使用 Linux 命令,但又不想离开 Windows ?以下是在 Windows 中运行 Linux bash 命令的几种方法。
|
||||
|
||||
如果你正在课程中正在学习 shell 脚本,那么需要使用 Linux 命令来练习命令和脚本。
|
||||
|
||||
你的学校实验室可能安装了 Linux,但是你自己没有安装了 [Linux 的笔记本电脑][1],而是像其他人一样的 Windows 计算机。你的作业需要运行 Linux 命令,你或许想知道如何在 Windows 上运行 Bash 命令和脚本。
|
||||
|
||||
你可以[在双启动模式下同时安装 Windows 和 Linux][2]。此方法能让你在启动计算机时选择 Linux 或 Windows。但是,为了运行 Linux 命令而使用单独分区的麻烦可能不适合所有人。
|
||||
|
||||
你也可以[使用在线 Linux 终端][3],但你的作业无法保存。
|
||||
|
||||
好消息是,有几种方法可以在 Windows 中运行 Linux 命令,就像其他常规应用一样。不是很酷吗?
|
||||
|
||||
### 在 Windows 中使用 Linux 命令
|
||||
|
||||

|
||||
|
||||
作为一个热心的 Linux 用户和推广者,我希望看到越来越多的人使用“真正的” Linux,但我知道有时候,这不是优先考虑的问题。如果你只是想练习 Linux 来通过考试,可以使用这些方法之一在 Windows 上运行 Bash 命令。
|
||||
|
||||
#### 1、在 Windows 10 上使用 Linux Bash Shell
|
||||
|
||||
你是否知道可以在 Windows 10 中运行 Linux 发行版? [Windows 的 Linux 子系统 (WSL)][5] 能让你在 Windows 中运行 Linux。即将推出的 WSL 版本将在 Windows 内部使用真正 Linux 内核。
|
||||
|
||||
此 WSL 也称为 Bash on Windows,它作为一个常规的 Windows 应用运行,并提供了一个命令行模式的 Linux 发行版。不要害怕命令行模式,因为你的目的是运行 Linux 命令。这就是你所需要的。
|
||||
|
||||
![Ubuntu Linux inside Windows][6]
|
||||
|
||||
你可以在 Windows 应用商店中找到一些流行的 Linux 发行版,如 Ubuntu、Kali Linux、openSUSE 等。你只需像任何其他 Windows 应用一样下载和安装它。安装后,你可以运行所需的所有 Linux 命令。
|
||||
|
||||
![Linux distributions in Windows 10 Store][8]
|
||||
|
||||
请参考教程:[在 Windows 上安装 Linux bash shell][9]。
|
||||
|
||||
#### 2、使用 Git Bash 在 Windows 上运行 Bash 命令
|
||||
|
||||
你可能知道 [Git][10] 是什么。它是由 [Linux 创建者 Linus Torvalds][11] 开发的版本控制系统。
|
||||
|
||||
[Git for Windows][12] 是一组工具,能让你在命令行和图形界面中使用 Git。Git for Windows 中包含的工具之一是 Git Bash。
|
||||
|
||||
Git Bash 为 Git 命令行提供了仿真层。除了 Git 命令,Git Bash 还支持许多 Bash 程序,如 `ssh`、`scp`、`cat`、`find` 等。
|
||||
|
||||
![Git Bash][13]
|
||||
|
||||
换句话说,你可以使用 Git Bash 运行许多常见的 Linux/Bash 命令。
|
||||
|
||||
你可以从其网站免费下载和安装 Git for Windows 工具来在 Windows 中安装 Git Bash。
|
||||
|
||||
- [下载 Git for Windows][12]
|
||||
|
||||
#### 3、使用 Cygwin 在 Windows 中使用 Linux 命令
|
||||
|
||||
如果要在 Windows 中运行 Linux 命令,那么 Cygwin 是一个推荐的工具。Cygwin 创建于 1995 年,旨在提供一个原生运行于 Windows 中的 POSIX 兼容环境。Cygwin 是由 Red Hat 员工和许多其他志愿者维护的自由开源软件。
|
||||
|
||||
二十年来,Windows 用户使用 Cygwin 来运行和练习 Linux/Bash 命令。十多年前,我甚至用 Cygwin 来学习 Linux 命令。
|
||||
|
||||
![Cygwin][14]
|
||||
|
||||
你可以从下面的官方网站下载 Cygwin。我还建议你参考这个 [Cygwin 备忘录][15]来开始使用。
|
||||
|
||||
- [下载 Cygwin][16]
|
||||
|
||||
#### 4、在虚拟机中使用 Linux
|
||||
|
||||
另一种方法是使用虚拟化软件并在其中安装 Linux。这样,你可以在 Windows 中安装 Linux 发行版(带有图形界面)并像常规 Windows 应用一样运行它。
|
||||
|
||||
这种方法要求你的系统有大的内存,至少 4GB ,但如果你有超过 8GB 的内存那么更好。这里的好处是你可以真实地使用桌面 Linux。如果你喜欢这个界面,那么你可能会在以后决定[切换到 Linux][17]。
|
||||
|
||||
![Ubuntu Running in Virtual Machine Inside Windows][18]
|
||||
|
||||
有两种流行的工具可在 Windows 上创建虚拟机,它们是 Oracle VirtualBox 和 VMware Workstation Player。你可以使用两者中的任何一个。就个人而言,我更喜欢 VirtualBox。
|
||||
|
||||
你可以按照[本教程学习如何在 VirtualBox 中安装 Linux][20]。
|
||||
|
||||
### 总结
|
||||
|
||||
运行 Linux 命令的最佳方法是使用 Linux。当选择不安装 Linux 时,这些工具能让你在 Windows 上运行 Linux 命令。都试试看,看哪种适合你。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/run-linux-commands-in-windows/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/get-linux-laptops/
|
||||
[2]: https://itsfoss.com/guide-install-linux-mint-16-dual-boot-windows/
|
||||
[3]: https://itsfoss.com/online-linux-terminals/
|
||||
[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/run-linux-commands-in-windows.png?resize=800%2C450&ssl=1
|
||||
[5]: https://itsfoss.com/bash-on-windows/
|
||||
[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2016/08/install-ubuntu-windows-10-linux-subsystem-10.jpeg?resize=800%2C268&ssl=1
|
||||
[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2016/08/install-ubuntu-windows-10-linux-subsystem-4.jpeg?resize=800%2C632&ssl=1
|
||||
[9]: https://itsfoss.com/install-bash-on-windows/
|
||||
[10]: https://itsfoss.com/basic-git-commands-cheat-sheet/
|
||||
[11]: https://itsfoss.com/linus-torvalds-facts/
|
||||
[12]: https://gitforwindows.org/
|
||||
[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/git-bash.png?ssl=1
|
||||
[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/cygwin-shell.jpg?ssl=1
|
||||
[15]: http://www.voxforge.org/home/docs/cygwin-cheat-sheet
|
||||
[16]: https://www.cygwin.com/
|
||||
[17]: https://itsfoss.com/reasons-switch-linux-windows-xp/
|
||||
[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/05/ubuntu-running-in-virtual-machine-inside-windows.jpeg?resize=800%2C450&ssl=1
|
||||
[20]: https://itsfoss.com/install-linux-in-virtualbox/
|
||||
471
published/201906/20190527 20- FFmpeg Commands For Beginners.md
Normal file
471
published/201906/20190527 20- FFmpeg Commands For Beginners.md
Normal file
@@ -0,0 +1,471 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (robsean)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10932-1.html)
|
||||
[#]: subject: (20+ FFmpeg Commands For Beginners)
|
||||
[#]: via: (https://www.ostechnix.com/20-ffmpeg-commands-beginners/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
给初学者的 20 多个 FFmpeg 命令示例
|
||||
======
|
||||
|
||||

|
||||
|
||||
在这个指南中,我将用示例来阐明如何使用 FFmpeg 媒体框架来做各种各样的音频、视频转码和转换的操作。我已经为初学者汇集了最常用的 20 多个 FFmpeg 命令,我将不时地添加更多的示例来保持更新这个指南。请给这个指南加书签,以后回来检查更新。让我们开始吧,如果你还没有在你的 Linux 系统中安装 FFmpeg,参考下面的指南。
|
||||
|
||||
* [在 Linux 中安装 FFmpeg][2]
|
||||
|
||||
### 针对初学者的 20 多个 FFmpeg 命令
|
||||
|
||||
FFmpeg 命令的典型语法是:
|
||||
|
||||
```
|
||||
ffmpeg [全局选项] {[输入文件选项] -i 输入_url_地址} ...
|
||||
{[输出文件选项] 输出_url_地址} ...
|
||||
```
|
||||
|
||||
现在我们将查看一些重要的和有用的 FFmpeg 命令。
|
||||
|
||||
#### 1、获取音频/视频文件信息
|
||||
|
||||
为显示你的媒体文件细节,运行:
|
||||
|
||||
```
|
||||
$ ffmpeg -i video.mp4
|
||||
```
|
||||
|
||||
样本输出:
|
||||
|
||||
```
|
||||
ffmpeg version n4.1.3 Copyright (c) 2000-2019 the FFmpeg developers
|
||||
built with gcc 8.2.1 (GCC) 20181127
|
||||
configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
|
||||
libavutil 56. 22.100 / 56. 22.100
|
||||
libavcodec 58. 35.100 / 58. 35.100
|
||||
libavformat 58. 20.100 / 58. 20.100
|
||||
libavdevice 58. 5.100 / 58. 5.100
|
||||
libavfilter 7. 40.101 / 7. 40.101
|
||||
libswscale 5. 3.100 / 5. 3.100
|
||||
libswresample 3. 3.100 / 3. 3.100
|
||||
libpostproc 55. 3.100 / 55. 3.100
|
||||
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
|
||||
Metadata:
|
||||
major_brand : isom
|
||||
minor_version : 512
|
||||
compatible_brands: isomiso2avc1mp41
|
||||
encoder : Lavf58.20.100
|
||||
Duration: 00:00:28.79, start: 0.000000, bitrate: 454 kb/s
|
||||
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, smpte170m/bt470bg/smpte170m), 1920x1080 [SAR 1:1 DAR 16:9], 318 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
|
||||
Metadata:
|
||||
handler_name : ISO Media file produced by Google Inc. Created on: 04/08/2019.
|
||||
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
|
||||
Metadata:
|
||||
handler_name : ISO Media file produced by Google Inc. Created on: 04/08/2019.
|
||||
At least one output file must be specified
|
||||
```
|
||||
|
||||
如你在上面的输出中看到的,FFmpeg 显示该媒体文件信息,以及 FFmpeg 细节,例如版本、配置细节、版权标记、构建参数和库选项等等。
|
||||
|
||||
如果你不想看 FFmpeg 标语和其它细节,而仅仅想看媒体文件信息,使用 `-hide_banner` 标志,像下面。
|
||||
|
||||
```
|
||||
$ ffmpeg -i video.mp4 -hide_banner
|
||||
```
|
||||
|
||||
样本输出:
|
||||
|
||||
![][3]
|
||||
|
||||
*使用 FFMpeg 查看音频、视频文件信息。*
|
||||
|
||||
看见了吗?现在,它仅显示媒体文件细节。
|
||||
|
||||
|
||||
#### 2、转换视频文件到不同的格式
|
||||
|
||||
FFmpeg 是强有力的音频和视频转换器,因此,它能在不同格式之间转换媒体文件。举个例子,要转换 mp4 文件到 avi 文件,运行:
|
||||
|
||||
```
|
||||
$ ffmpeg -i video.mp4 video.avi
|
||||
```
|
||||
|
||||
类似地,你可以转换媒体文件到你选择的任何格式。
|
||||
|
||||
例如,为转换 YouTube flv 格式视频为 mpeg 格式,运行:
|
||||
|
||||
```
|
||||
$ ffmpeg -i video.flv video.mpeg
|
||||
```
|
||||
|
||||
如果你想维持你的源视频文件的质量,使用 `-qscale 0` 参数:
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.webm -qscale 0 output.mp4
|
||||
```
|
||||
|
||||
为检查 FFmpeg 的支持格式的列表,运行:
|
||||
|
||||
```
|
||||
$ ffmpeg -formats
|
||||
```
|
||||
|
||||
#### 3、转换视频文件到音频文件
|
||||
|
||||
我转换一个视频文件到音频文件,只需具体指明输出格式,像 .mp3,或 .ogg,或其它任意音频格式。
|
||||
|
||||
上面的命令将转换 input.mp4 视频文件到 output.mp3 音频文件。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -vn output.mp3
|
||||
```
|
||||
|
||||
此外,你也可以对输出文件使用各种各样的音频转换编码选项,像下面演示。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3
|
||||
```
|
||||
|
||||
在这里,
|
||||
|
||||
* `-vn` – 表明我们已经在输出文件中禁用视频录制。
|
||||
* `-ar` – 设置输出文件的音频频率。通常使用的值是22050 Hz、44100 Hz、48000 Hz。
|
||||
* `-ac` – 设置音频通道的数目。
|
||||
* `-ab` – 表明音频比特率。
|
||||
* `-f` – 输出文件格式。在我们的实例中,它是 mp3 格式。
|
||||
|
||||
#### 4、更改视频文件的分辨率
|
||||
|
||||
如果你想设置一个视频文件为指定的分辨率,你可以使用下面的命令:
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4
|
||||
```
|
||||
|
||||
或,
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4
|
||||
```
|
||||
|
||||
上面的命令将设置所给定视频文件的分辨率到 1280×720。
|
||||
|
||||
类似地,为转换上面的文件到 640×480 大小,运行:
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -filter:v scale=640:480 -c:a copy output.mp4
|
||||
```
|
||||
|
||||
或者,
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -s 640x480 -c:a copy output.mp4
|
||||
```
|
||||
|
||||
这个技巧将帮助你缩放你的视频文件到较小的显示设备上,例如平板电脑和手机。
|
||||
|
||||
#### 5、压缩视频文件
|
||||
|
||||
减小媒体文件的大小到较小来节省硬件的空间总是一个好主意.
|
||||
|
||||
下面的命令将压缩并减少输出文件的大小。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4
|
||||
```
|
||||
|
||||
请注意,如果你尝试减小视频文件的大小,你将损失视频质量。如果 24 太有侵略性,你可以降低 `-crf` 值到或更低值。
|
||||
|
||||
你也可以通过下面的选项来转换编码音频降低比特率,使其有立体声感,从而减小大小。
|
||||
|
||||
```
|
||||
-ac 2 -c:a aac -strict -2 -b:a 128k
|
||||
```
|
||||
|
||||
#### 6、压缩音频文件
|
||||
|
||||
正像压缩视频文件一样,为节省一些磁盘空间,你也可以使用 `-ab` 标志压缩音频文件。
|
||||
|
||||
例如,你有一个 320 kbps 比特率的音频文件。你想通过更改比特率到任意较低的值来压缩它,像下面。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp3 -ab 128 output.mp3
|
||||
```
|
||||
|
||||
各种各样可用的音频比特率列表是:
|
||||
|
||||
1. 96kbps
|
||||
2. 112kbps
|
||||
3. 128kbps
|
||||
4. 160kbps
|
||||
5. 192kbps
|
||||
6. 256kbps
|
||||
7. 320kbps
|
||||
|
||||
#### 7、从一个视频文件移除音频流
|
||||
|
||||
如果你不想要一个视频文件中的音频,使用 `-an` 标志。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -an output.mp4
|
||||
```
|
||||
|
||||
在这里,`-an` 表示没有音频录制。
|
||||
|
||||
上面的命令会撤销所有音频相关的标志,因为我们不要来自 input.mp4 的音频。
|
||||
|
||||
#### 8、从一个媒体文件移除视频流
|
||||
|
||||
类似地,如果你不想要视频流,你可以使用 `-vn` 标志从媒体文件中简单地移除它。`-vn` 代表没有视频录制。换句话说,这个命令转换所给定媒体文件为音频文件。
|
||||
|
||||
下面的命令将从所给定媒体文件中移除视频。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -vn output.mp3
|
||||
```
|
||||
|
||||
你也可以使用 `-ab` 标志来指出输出文件的比特率,如下面的示例所示。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -vn -ab 320 output.mp3
|
||||
```
|
||||
|
||||
#### 9、从视频中提取图像
|
||||
|
||||
FFmpeg 的另一个有用的特色是我们可以从一个视频文件中轻松地提取图像。如果你想从一个视频文件中创建一个相册,这可能是非常有用的。
|
||||
|
||||
为从一个视频文件中提取图像,使用下面的命令:
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png
|
||||
```
|
||||
|
||||
在这里,
|
||||
|
||||
* `-r` – 设置帧速度。即,每秒提取帧到图像的数字。默认值是 25。
|
||||
* `-f` – 表示输出格式,即,在我们的实例中是图像。
|
||||
* `image-%2d.png` – 表明我们如何想命名提取的图像。在这个实例中,命名应该像这样image-01.png、image-02.png、image-03.png 等等开始。如果你使用 `%3d`,那么图像的命名像 image-001.png、image-002.png 等等开始。
|
||||
|
||||
#### 10、裁剪视频
|
||||
|
||||
FFMpeg 允许以我们选择的任何范围裁剪一个给定的媒体文件。
|
||||
|
||||
裁剪一个视频文件的语法如下给定:
|
||||
|
||||
```
|
||||
ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4
|
||||
```
|
||||
|
||||
在这里,
|
||||
|
||||
* `input.mp4` – 源视频文件。
|
||||
* `-filter:v` – 表示视频过滤器。
|
||||
* `crop` – 表示裁剪过滤器。
|
||||
* `w` – 我们想自源视频中裁剪的矩形的宽度。
|
||||
* `h` – 矩形的高度。
|
||||
* `x` – 我们想自源视频中裁剪的矩形的 x 坐标 。
|
||||
* `y` – 矩形的 y 坐标。
|
||||
|
||||
比如说你想要一个来自视频的位置 (200,150),且具有 640 像素宽度和 480 像素高度的视频,命令应该是:
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -filter:v "crop=640:480:200:150" output.mp4
|
||||
```
|
||||
|
||||
请注意,剪切视频将影响质量。除非必要,请勿剪切。
|
||||
|
||||
#### 11、转换一个视频的具体的部分
|
||||
|
||||
有时,你可能想仅转换视频文件的一个具体的部分到不同的格式。以示例说明,下面的命令将转换所给定视频input.mp4 文件的开始 10 秒到视频 .avi 格式。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -t 10 output.avi
|
||||
```
|
||||
|
||||
在这里,我们以秒具体说明时间。此外,以 `hh.mm.ss` 格式具体说明时间也是可以的。
|
||||
|
||||
#### 12、设置视频的屏幕高宽比
|
||||
|
||||
你可以使用 `-aspect` 标志设置一个视频文件的屏幕高宽比,像下面。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -aspect 16:9 output.mp4
|
||||
```
|
||||
|
||||
通常使用的高宽比是:
|
||||
|
||||
* 16:9
|
||||
* 4:3
|
||||
* 16:10
|
||||
* 5:4
|
||||
* 2:21:1
|
||||
* 2:35:1
|
||||
* 2:39:1
|
||||
|
||||
#### 13、添加海报图像到音频文件
|
||||
|
||||
你可以添加海报图像到你的文件,以便图像将在播放音频文件时显示。这对托管在视频托管主机或共享网站中的音频文件是有用的。
|
||||
|
||||
```
|
||||
$ ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
|
||||
```
|
||||
|
||||
#### 14、使用开始和停止时间剪下一段媒体文件
|
||||
|
||||
可以使用开始和停止时间来剪下一段视频为小段剪辑,我们可以使用下面的命令。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 50 output.mp4
|
||||
```
|
||||
|
||||
在这里,
|
||||
|
||||
* `–s` – 表示视频剪辑的开始时间。在我们的示例中,开始时间是第 50 秒。
|
||||
* `-t` – 表示总的持续时间。
|
||||
|
||||
当你想使用开始和结束时间从一个音频或视频文件剪切一部分时,它是非常有用的。
|
||||
|
||||
类似地,我们可以像下面剪下音频。
|
||||
|
||||
```
|
||||
$ ffmpeg -i audio.mp3 -ss 00:01:54 -to 00:06:53 -c copy output.mp3
|
||||
```
|
||||
|
||||
#### 15、切分视频文件为多个部分
|
||||
|
||||
一些网站将仅允许你上传具体指定大小的视频。在这样的情况下,你可以切分大的视频文件到多个较小的部分,像下面。
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4
|
||||
```
|
||||
|
||||
在这里,
|
||||
|
||||
* `-t 00:00:30` 表示从视频的开始到视频的第 30 秒创建一部分视频。
|
||||
* `-ss 00:00:30` 为视频的下一部分显示开始时间戳。它意味着第 2 部分将从第 30 秒开始,并将持续到原始视频文件的结尾。
|
||||
|
||||
#### 16、接合或合并多个视频部分到一个
|
||||
|
||||
FFmpeg 也可以接合多个视频部分,并创建一个单个视频文件。
|
||||
|
||||
创建包含你想接合文件的准确的路径的 `join.txt`。所有的文件都应该是相同的格式(相同的编码格式)。所有文件的路径应该逐个列出,像下面。
|
||||
|
||||
```
|
||||
file /home/sk/myvideos/part1.mp4
|
||||
file /home/sk/myvideos/part2.mp4
|
||||
file /home/sk/myvideos/part3.mp4
|
||||
file /home/sk/myvideos/part4.mp4
|
||||
```
|
||||
|
||||
现在,接合所有文件,使用命令:
|
||||
|
||||
```
|
||||
$ ffmpeg -f concat -i join.txt -c copy output.mp4
|
||||
```
|
||||
|
||||
如果你得到一些像下面的错误;
|
||||
|
||||
```
|
||||
[concat @ 0x555fed174cc0] Unsafe file name '/path/to/mp4'
|
||||
join.txt: Operation not permitted
|
||||
```
|
||||
|
||||
添加 `-safe 0` :
|
||||
|
||||
```
|
||||
$ ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4
|
||||
```
|
||||
|
||||
上面的命令将接合 part1.mp4、part2.mp4、part3.mp4 和 part4.mp4 文件到一个称为 output.mp4 的单个文件中。
|
||||
|
||||
#### 17、添加字幕到一个视频文件
|
||||
|
||||
我们可以使用 FFmpeg 来添加字幕到视频文件。为你的视频下载正确的字幕,并如下所示添加它到你的视频。
|
||||
|
||||
```
|
||||
$ fmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4
|
||||
```
|
||||
|
||||
#### 18、预览或测试视频或音频文件
|
||||
|
||||
你可能希望通过预览来验证或测试输出的文件是否已经被恰当地转码编码。为完成预览,你可以从你的终端播放它,用命令:
|
||||
|
||||
```
|
||||
$ ffplay video.mp4
|
||||
```
|
||||
|
||||
![][7]
|
||||
|
||||
类似地,你可以测试音频文件,像下面所示。
|
||||
|
||||
```
|
||||
$ ffplay audio.mp3
|
||||
```
|
||||
|
||||
![][8]
|
||||
|
||||
#### 19、增加/减少视频播放速度
|
||||
|
||||
FFmpeg 允许你调整视频播放速度。
|
||||
|
||||
为增加视频播放速度,运行:
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
|
||||
```
|
||||
|
||||
该命令将双倍视频的速度。
|
||||
|
||||
为降低你的视频速度,你需要使用一个大于 1 的倍数。为减少播放速度,运行:
|
||||
|
||||
```
|
||||
$ ffmpeg -i input.mp4 -vf "setpts=4.0*PTS" output.mp4
|
||||
```
|
||||
|
||||
#### 20、创建动画的 GIF
|
||||
|
||||
出于各种目的,我们在几乎所有的社交和专业网络上使用 GIF 图像。使用 FFmpeg,我们可以简单地和快速地创建动画的视频文件。下面的指南阐释了如何在类 Unix 系统中使用 FFmpeg 和 ImageMagick 创建一个动画的 GIF 文件。
|
||||
|
||||
* [在 Linux 中如何创建动画的 GIF][9]
|
||||
|
||||
#### 21、从 PDF 文件中创建视频
|
||||
|
||||
我长年累月的收集了很多 PDF 文件,大多数是 Linux 教程,保存在我的平板电脑中。有时我懒得从平板电脑中阅读它们。因此,我决定从 PDF 文件中创建一个视频,在一个大屏幕设备(像一台电视机或一台电脑)中观看它们。如果你想知道如何从一批 PDF 文件中制作一个电影,下面的指南将帮助你。
|
||||
|
||||
* [在 Linux 中如何从 PDF 文件中创建一个视频][10]
|
||||
|
||||
#### 22、获取帮助
|
||||
|
||||
在这个指南中,我已经覆盖大多数常常使用的 FFmpeg 命令。它有很多不同的选项来做各种各样的高级功能。要学习更多用法,请参考手册页。
|
||||
|
||||
```
|
||||
$ man ffmpeg
|
||||
```
|
||||
|
||||
这就是全部了。我希望这个指南将帮助你入门 FFmpeg。如果你发现这个指南有用,请在你的社交和专业网络上分享它。更多好东西将要来。敬请期待!
|
||||
|
||||
谢谢!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/20-ffmpeg-commands-beginners/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[robsean](https://github.com/robsean)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2017/05/FFmpeg-Commands-720x340.png
|
||||
[2]: https://www.ostechnix.com/install-ffmpeg-linux/
|
||||
[3]: http://www.ostechnix.com/wp-content/uploads/2017/05/sk@sk_001.png
|
||||
[4]: https://ostechnix.tradepub.com/free/w_make141/prgm.cgi
|
||||
[5]: https://ostechnix.tradepub.com/free/w_make75/prgm.cgi
|
||||
[6]: https://ostechnix.tradepub.com/free/w_make235/prgm.cgi
|
||||
[7]: http://www.ostechnix.com/wp-content/uploads/2017/05/Menu_004.png
|
||||
[8]: http://www.ostechnix.com/wp-content/uploads/2017/05/Menu_005-3.png
|
||||
[9]: https://www.ostechnix.com/create-animated-gif-ubuntu-16-04/
|
||||
[10]: https://www.ostechnix.com/create-video-pdf-files-linux/
|
||||
@@ -0,0 +1,82 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10997-1.html)
|
||||
[#]: subject: (5 GNOME keyboard shortcuts to be more productive)
|
||||
[#]: via: (https://fedoramagazine.org/5-gnome-keyboard-shortcuts-to-be-more-productive/)
|
||||
[#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/)
|
||||
|
||||
5 个提高效率的 GNOME 快捷键
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
对于某些人来说,使用 GNOME Shell 作为传统的桌面管理器可能会感觉沮丧,因为它通常需要更多的鼠标操作。事实上,GNOME Shell 也是一个专为键盘操作而设计的[桌面管理器][2]。通过这五种使用键盘而不是鼠标的方法,了解如何使用 GNOME Shell 提高效率。
|
||||
|
||||
### GNOME 活动概述
|
||||
|
||||
可以使用键盘上的 `Super` 键轻松打开活动概述。(`Super` 键通常有一个标识——比如 Windows 徽标……)这在启动应用程序时非常有用。例如,使用以下键序列 `Super + f i r + Enter` 可以轻松启动 Firefox Web 浏览器
|
||||
|
||||
![][3]
|
||||
|
||||
### 消息托盘
|
||||
|
||||
在 GNOME 中,消息托盘中提供了通知。这也是日历和世界时钟出现的地方。要使用键盘打开信息托盘,请使用 `Super + m` 快捷键。要关闭消息托盘,只需再次使用相同的快捷方式。
|
||||
|
||||
![][4]
|
||||
|
||||
### 在 GNOME 中管理工作空间
|
||||
|
||||
GNOME Shell 使用动态工作空间,这意味着它可以根据需要创建更多工作空间。使用 GNOME 提高工作效率的一个好方法是为每个应用程序或每个专用活动使用一个工作区,然后使用键盘在这些工作区之间导航。
|
||||
|
||||
让我们看一个实际的例子。要在当前工作区中打开终端,请按以下键:`Super + t e r + Enter`。然后,要打开新工作区,请按 `Super + PgDn`。 打开 Firefox( `Super + f i r + Enter`)。 要返回终端(所在的工作空间),请使用 `Super + PgUp`。
|
||||
|
||||
![][5]
|
||||
|
||||
### 管理应用窗口
|
||||
|
||||
使用键盘也可以轻松管理应用程序窗口的大小。最小化、最大化和将应用程序移动到屏幕的左侧或右侧只需几个击键即可完成。使用 `Super + ↑` 最大化、`Super + ↓` 最小化、`Super + ←` 和 `Super + →` 左右移动窗口。
|
||||
|
||||
![][6]
|
||||
|
||||
### 同一个应用的多个窗口
|
||||
|
||||
使用活动概述启动应用程序非常有效。但是,尝试从已经运行的应用程序打开一个新窗口只能将焦点转移到已经打开的窗口。要创建一个新窗口,就不是简单地按 `Enter` 启动应用程序,请使用 `Ctrl + Enter`。
|
||||
|
||||
因此,例如,使用应用程序概述启动终端的第二个实例,`Super + t e r + (Ctrl + Enter)`。
|
||||
|
||||
![][7]
|
||||
|
||||
然后你可以使用 `Super` + ` 在同一个应用程序的窗口之间切换。
|
||||
|
||||
![][8]
|
||||
|
||||
如图所示,当用键盘控制时,GNOME Shell 是一个非常强大的桌面环境。学习使用这些快捷方式并训练你的肌肉记忆以不使用鼠标将为你提供更好的用户体验,并在使用 GNOME 时提高你的工作效率。有关其他有用的快捷方式,请查看 [GNOME wiki 上的此页面][9]。
|
||||
|
||||
*图片来自 [1AmFcS][10],[Unsplash][11]*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/5-gnome-keyboard-shortcuts-to-be-more-productive/
|
||||
|
||||
作者:[Clément Verna][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/cverna/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/05/5-gnome-keycombos-816x345.jpg
|
||||
[2]: https://fedoramagazine.org/gnome-3-32-released-coming-to-fedora-30/
|
||||
[3]: https://fedoramagazine.org/wp-content/uploads/2019/05/Peek-2019-05-23-10-50.gif
|
||||
[4]: https://fedoramagazine.org/wp-content/uploads/2019/05/Peek-2019-05-23-11-01.gif
|
||||
[5]: https://fedoramagazine.org/wp-content/uploads/2019/05/Peek-2019-05-23-12-57.gif
|
||||
[6]: https://fedoramagazine.org/wp-content/uploads/2019/05/Peek-2019-05-23-13-06.gif
|
||||
[7]: https://fedoramagazine.org/wp-content/uploads/2019/05/Peek-2019-05-23-13-19.gif
|
||||
[8]: https://fedoramagazine.org/wp-content/uploads/2019/05/Peek-2019-05-23-13-22.gif
|
||||
[9]: https://wiki.gnome.org/Design/OS/KeyboardShortcuts
|
||||
[10]: https://unsplash.com/photos/MuTWth_RnEs?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
[11]: https://unsplash.com/search/photos/keyboard?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
@@ -0,0 +1,171 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10947-1.html)
|
||||
[#]: subject: (A deeper dive into Linux permissions)
|
||||
[#]: via: (https://www.networkworld.com/article/3397790/a-deeper-dive-into-linux-permissions.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
更深入地了解 Linux 权限
|
||||
======
|
||||
> 在 Linux 上查看文件权限时,有时你会看到的不仅仅是普通的 r、w、x 和 -。如何更清晰地了解这些字符试图告诉你什么以及这些权限如何工作?
|
||||
|
||||

|
||||
|
||||
在 Linux 上查看文件权限时,有时你会看到的不仅仅是普通的 `r`、`w`、`x` 和 `-`。除了在所有者、组和其他中看到 `rwx` 之外,你可能会看到 `s` 或者 `t`,如下例所示:
|
||||
|
||||
```
|
||||
drwxrwsrwt
|
||||
```
|
||||
|
||||
要进一步明确的方法之一是使用 `stat` 命令查看权限。`stat` 的第四行输出以八进制和字符串格式显示文件权限:
|
||||
|
||||
```
|
||||
$ stat /var/mail
|
||||
File: /var/mail
|
||||
Size: 4096 Blocks: 8 IO Block: 4096 directory
|
||||
Device: 801h/2049d Inode: 1048833 Links: 2
|
||||
Access: (3777/drwxrwsrwt) Uid: ( 0/ root) Gid: ( 8/ mail)
|
||||
Access: 2019-05-21 19:23:15.769746004 -0400
|
||||
Modify: 2019-05-21 19:03:48.226656344 -0400
|
||||
Change: 2019-05-21 19:03:48.226656344 -0400
|
||||
Birth: -
|
||||
```
|
||||
|
||||
这个输出提示我们,分配给文件权限的位数超过 9 位。事实上,有 12 位。这些额外的三位提供了一种分配超出通常的读、写和执行权限的方法 - 例如,`3777`(二进制 `011111111111`)表示使用了两个额外的设置。
|
||||
|
||||
该值的第一个 `1` (第二位)表示 SGID(设置 GID),为运行文件而赋予临时权限,或以该关联组的权限来使用目录。
|
||||
|
||||
```
|
||||
011111111111
|
||||
^
|
||||
```
|
||||
|
||||
SGID 将正在使用该文件的用户作为该组成员之一而分配临时权限。
|
||||
|
||||
第二个 `1`(第三位)是“粘连”位。它确保*只有*文件的所有者能够删除或重命名该文件或目录。
|
||||
|
||||
```
|
||||
011111111111
|
||||
^
|
||||
```
|
||||
|
||||
如果权限是 `7777` 而不是 `3777`,我们知道 SUID(设置 UID)字段也已设置。
|
||||
|
||||
```
|
||||
111111111111
|
||||
^
|
||||
```
|
||||
|
||||
SUID 将正在使用该文件的用户作为文件拥有者分配临时权限。
|
||||
|
||||
至于我们上面看到的 `/var/mail` 目录,所有用户都需要访问,因此需要一些特殊值来提供它。
|
||||
|
||||
但现在让我们更进一步。
|
||||
|
||||
特殊权限位的一个常见用法是使用 `passwd` 之类的命令。如果查看 `/usr/bin/passwd` 文件,你会注意到 SUID 位已设置,它允许你更改密码(以及 `/etc/shadow` 文件的内容),即使你是以普通(非特权)用户身份运行,并且对此文件没有读取或写入权限。当然,`passwd` 命令很聪明,不允许你更改其他人的密码,除非你是以 root 身份运行或使用 `sudo`。
|
||||
|
||||
```
|
||||
$ ls -l /usr/bin/passwd
|
||||
-rwsr-xr-x 1 root root 63736 Mar 22 14:32 /usr/bin/passwd
|
||||
$ ls -l /etc/shadow
|
||||
-rw-r----- 1 root shadow 2195 Apr 22 10:46 /etc/shadow
|
||||
```
|
||||
|
||||
现在,让我们看一下使用这些特殊权限可以做些什么。
|
||||
|
||||
### 如何分配特殊文件权限
|
||||
|
||||
与 Linux 命令行中的许多东西一样,你可以有不同的方法设置。 `chmod` 命令允许你以数字方式或使用字符表达式更改权限。
|
||||
|
||||
要以数字方式更改文件权限,你可以使用这样的命令来设置 SUID 和 SGID 位:
|
||||
|
||||
```
|
||||
$ chmod 6775 tryme
|
||||
```
|
||||
|
||||
或者你可以使用这样的命令:
|
||||
|
||||
```
|
||||
$ chmod ug+s tryme <== 用于 SUID 和 SGID 权限
|
||||
```
|
||||
|
||||
如果你要添加特殊权限的文件是脚本,你可能会对它不符合你的期望感到惊讶。这是一个非常简单的例子:
|
||||
|
||||
```
|
||||
$ cat tryme
|
||||
#!/bin/bash
|
||||
|
||||
echo I am $USER
|
||||
```
|
||||
|
||||
即使设置了 SUID 和 SGID 位,并且 root 是文件所有者,运行脚本也不会产生你可能期望的 “I am root”。为什么?因为 Linux 会忽略脚本的 SUID 和 SGID 位。
|
||||
|
||||
```
|
||||
$ ls -l tryme
|
||||
-rwsrwsrwt 1 root root 29 May 26 12:22 tryme
|
||||
$ ./tryme
|
||||
I am jdoe
|
||||
```
|
||||
|
||||
另一方面,如果你对一个编译的程序之类进行类似的尝试,就像下面这个简单的 C 程序一样,你会看到不同的效果。在此示例程序中,我们提示用户输入文件名并创建它,并给文件写入权限。
|
||||
|
||||
```
|
||||
#include <stdlib.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
FILE *fp; /* file pointer*/
|
||||
char fName[20];
|
||||
|
||||
printf("Enter the name of file to be created: ");
|
||||
scanf("%s",fName);
|
||||
|
||||
/* create the file with write permission */
|
||||
fp=fopen(fName,"w");
|
||||
/* check if file was created */
|
||||
if(fp==NULL)
|
||||
{
|
||||
printf("File not created");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
printf("File created successfully\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
编译程序并运行该命令以使 root 用户成为所有者并设置所需权限后,你将看到它以预期的 root 权限运行 - 留下新创建的 root 为所有者的文件。当然,你必须具有 `sudo` 权限才能运行一些需要的命令。
|
||||
|
||||
```
|
||||
$ cc -o mkfile mkfile.c <== 编译程序
|
||||
$ sudo chown root:root mkfile <== 更改所有者和组为 “root”
|
||||
$ sudo chmod ug+s mkfile <== 添加 SUID and SGID 权限
|
||||
$ ./mkfile <== 运行程序
|
||||
Enter name of file to be create: empty
|
||||
File created successfully
|
||||
$ ls -l empty
|
||||
-rw-rw-r-- 1 root root 0 May 26 13:15 empty
|
||||
```
|
||||
|
||||
请注意,文件所有者是 root - 如果程序未以 root 权限运行,则不会发生这种情况。
|
||||
|
||||
权限字符串中不常见设置的位置(例如,rw**s**rw**s**rw**t**)可以帮助提醒我们每个位的含义。至少第一个 “s”(SUID) 位于所有者权限区域中,第二个 (SGID) 位于组权限区域中。为什么粘连位是 “t” 而不是 “s” 超出了我的理解。也许创造者想把它称为 “tacky bit”,但由于这个词的不太令人喜欢的第二个定义而改变了他们的想法。无论如何,额外的权限设置为 Linux 和其他 Unix 系统提供了许多额外的功能。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3397790/a-deeper-dive-into-linux-permissions.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/05/shs_rwsr-100797564-large.jpg
|
||||
[2]: https://www.facebook.com/NetworkWorld/
|
||||
[3]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,146 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10925-1.html)
|
||||
[#]: subject: (Dockly – Manage Docker Containers From Terminal)
|
||||
[#]: via: (https://www.ostechnix.com/dockly-manage-docker-containers-from-terminal/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
Dockly:从终端管理 Docker 容器
|
||||
======
|
||||
|
||||

|
||||
|
||||
几天前,我们发布了一篇指南,其中涵盖了[开始使用 Docker][2] 时需要了解的几乎所有细节。在该指南中,我们向你展示了如何详细创建和管理 Docker 容器。还有一些可用于管理 Docker 容器的非官方工具。如果你看过我们以前的文章,你可能会看到两个基于 Web 的工具,[Portainer][3] 和 [PiCluster][4]。它们都使得 Docker 管理任务在 Web 浏览器中变得更加容易和简单。今天,我遇到了另一个名为 Dockly 的 Docker 管理工具。
|
||||
|
||||
与上面的工具不同,Dockly 是一个 TUI(文本界面)程序,用于在类 Unix 系统中从终端管理 Docker 容器和服务。它是使用 NodeJS 编写的自由开源工具。在本简要指南中,我们将了解如何安装 Dockly 以及如何从命令行管理 Docker 容器。
|
||||
|
||||
### 安装 Dockly
|
||||
|
||||
确保已在 Linux 上安装了 NodeJS。如果尚未安装,请参阅以下指南。
|
||||
|
||||
* [如何在 Linux 上安装 NodeJS][5]
|
||||
|
||||
安装 NodeJS 后,运行以下命令安装 Dockly:
|
||||
|
||||
```
|
||||
# npm install -g dockly
|
||||
```
|
||||
|
||||
### 使用 Dockly 在终端管理 Docker 容器
|
||||
|
||||
使用 Dockly 管理 Docker 容器非常简单!你所要做的就是打开终端并运行以下命令:
|
||||
|
||||
```
|
||||
# dockly
|
||||
```
|
||||
|
||||
Dockly 将通过 unix 套接字自动连接到你的本机 docker 守护进程,并在终端中显示正在运行的容器列表,如下所示。
|
||||
|
||||
![][6]
|
||||
|
||||
*使用 Dockly 管理 Docker 容器*
|
||||
|
||||
正如你在上面的截图中看到的,Dockly 在顶部显示了运行容器的以下信息:
|
||||
|
||||
* 容器 ID,
|
||||
* 容器名称,
|
||||
* Docker 镜像,
|
||||
* 命令,
|
||||
* 运行中容器的状态,
|
||||
* 状态。
|
||||
|
||||
在右上角,你将看到容器的 CPU 和内存利用率。使用向上/向下箭头键在容器之间移动。
|
||||
|
||||
在底部,有少量的键盘快捷键来执行各种 Docker 管理任务。以下是目前可用的键盘快捷键列表:
|
||||
|
||||
* `=` - 刷新 Dockly 界面,
|
||||
* `/` - 搜索容器列表视图,
|
||||
* `i` - 显示有关当前所选容器或服务的信息,
|
||||
* `回车` - 显示当前容器或服务的日志,
|
||||
* `v` - 在容器和服务视图之间切换,
|
||||
* `l` - 在选定的容器上启动 `/bin/bash` 会话,
|
||||
* `r` - 重启选定的容器,
|
||||
* `s` - 停止选定的容器,
|
||||
* `h` - 显示帮助窗口,
|
||||
* `q` - 退出 Dockly。
|
||||
|
||||
#### 查看容器的信息
|
||||
|
||||
使用向上/向下箭头选择一个容器,然后按 `i` 以显示所选容器的信息。
|
||||
|
||||
![][7]
|
||||
|
||||
*查看容器的信息*
|
||||
|
||||
#### 重启容器
|
||||
|
||||
如果你想随时重启容器,只需选择它并按 `r` 即可重新启动。
|
||||
|
||||
![][8]
|
||||
|
||||
*重启 Docker 容器*
|
||||
|
||||
#### 停止/删除容器和镜像
|
||||
|
||||
如果不再需要容器,我们可以立即停止和/或删除一个或所有容器。为此,请按 `m` 打开菜单。
|
||||
|
||||
![][9]
|
||||
|
||||
*停止,删除 Docker 容器和镜像*
|
||||
|
||||
在这里,你可以执行以下操作。
|
||||
|
||||
* 停止所有 Docker 容器,
|
||||
* 删除选定的容器,
|
||||
* 删除所有容器,
|
||||
* 删除所有 Docker 镜像等。
|
||||
|
||||
#### 显示 Dockly 帮助部分
|
||||
|
||||
如果你有任何疑问,只需按 `h` 即可打开帮助部分。
|
||||
|
||||
![][10]
|
||||
|
||||
*Dockly 帮助*
|
||||
|
||||
有关更多详细信息,请参考最后给出的官方 GitHub 页面。
|
||||
|
||||
就是这些了。希望这篇文章有用。如果你一直在使用 Docker 容器,请试试 Dockly,看它是否有帮助。
|
||||
|
||||
建议阅读:
|
||||
|
||||
* [如何自动更新正在运行的 Docker 容器][11]
|
||||
* [ctop:一个 Linux 容器的命令行监控工具][12]
|
||||
|
||||
资源:
|
||||
|
||||
* [Dockly 的 GitHub 仓库][13]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/dockly-manage-docker-containers-from-terminal/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2019/05/Dockly-720x340.png
|
||||
[2]: https://www.ostechnix.com/getting-started-with-docker/
|
||||
[3]: https://www.ostechnix.com/portainer-an-easiest-way-to-manage-docker/
|
||||
[4]: https://www.ostechnix.com/picluster-simple-web-based-docker-management-application/
|
||||
[5]: https://www.ostechnix.com/install-node-js-linux/
|
||||
[6]: http://www.ostechnix.com/wp-content/uploads/2019/05/Manage-Docker-Containers-Using-Dockly.png
|
||||
[7]: http://www.ostechnix.com/wp-content/uploads/2019/05/View-containers-information.png
|
||||
[8]: http://www.ostechnix.com/wp-content/uploads/2019/05/Restart-containers.png
|
||||
[9]: http://www.ostechnix.com/wp-content/uploads/2019/05/stop-remove-containers-and-images.png
|
||||
[10]: http://www.ostechnix.com/wp-content/uploads/2019/05/Dockly-Help.png
|
||||
[11]: https://www.ostechnix.com/automatically-update-running-docker-containers/
|
||||
[12]: https://www.ostechnix.com/ctop-commandline-monitoring-tool-linux-containers/
|
||||
[13]: https://github.com/lirantal/dockly
|
||||
@@ -0,0 +1,312 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (jdh8383)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10938-1.html)
|
||||
[#]: subject: (How To Check Available Security Updates On Red Hat (RHEL) And CentOS System?)
|
||||
[#]: via: (https://www.2daygeek.com/check-list-view-find-available-security-updates-on-redhat-rhel-centos-system/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
如何在 CentOS 或 RHEL 系统上检查可用的安全更新?
|
||||
======
|
||||
|
||||

|
||||
|
||||
当你更新系统时,根据你所在公司的安全策略,有时候可能只需要打上与安全相关的补丁。大多数情况下,这应该是出于程序兼容性方面的考量。那该怎样实践呢?有没有办法让 `yum` 只安装安全补丁呢?
|
||||
|
||||
答案是肯定的,可以用 `yum` 包管理器轻松实现。
|
||||
|
||||
在这篇文章中,我们不但会提供所需的信息。而且,我们会介绍一些额外的命令,可以帮你获取指定安全更新的详实信息。
|
||||
|
||||
希望这样可以启发你去了解并修复你列表上的那些漏洞。一旦有安全漏洞被公布,就必须更新受影响的软件,这样可以降低系统中的安全风险。
|
||||
|
||||
对于 RHEL 或 CentOS 6 系统,运行下面的 [Yum 命令][1] 来安装 yum 安全插件。
|
||||
|
||||
```
|
||||
# yum -y install yum-plugin-security
|
||||
```
|
||||
|
||||
在 RHEL 7&8 或是 CentOS 7&8 上面,这个插件已经是 `yum` 的一部分了,不用单独安装。
|
||||
|
||||
要列出全部可用的补丁(包括安全、Bug 修复以及产品改进),但不安装它们:
|
||||
|
||||
```
|
||||
# yum updateinfo list available
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos,
|
||||
: subscription-manager, verify, versionlock
|
||||
RHSA-2014:1031 Important/Sec. 389-ds-base-1.3.1.6-26.el7_0.x86_64
|
||||
RHSA-2015:0416 Important/Sec. 389-ds-base-1.3.3.1-13.el7.x86_64
|
||||
RHBA-2015:0626 bugfix 389-ds-base-1.3.3.1-15.el7_1.x86_64
|
||||
RHSA-2015:0895 Important/Sec. 389-ds-base-1.3.3.1-16.el7_1.x86_64
|
||||
RHBA-2015:1554 bugfix 389-ds-base-1.3.3.1-20.el7_1.x86_64
|
||||
RHBA-2015:1960 bugfix 389-ds-base-1.3.3.1-23.el7_1.x86_64
|
||||
RHBA-2015:2351 bugfix 389-ds-base-1.3.4.0-19.el7.x86_64
|
||||
RHBA-2015:2572 bugfix 389-ds-base-1.3.4.0-21.el7_2.x86_64
|
||||
RHSA-2016:0204 Important/Sec. 389-ds-base-1.3.4.0-26.el7_2.x86_64
|
||||
RHBA-2016:0550 bugfix 389-ds-base-1.3.4.0-29.el7_2.x86_64
|
||||
RHBA-2016:1048 bugfix 389-ds-base-1.3.4.0-30.el7_2.x86_64
|
||||
RHBA-2016:1298 bugfix 389-ds-base-1.3.4.0-32.el7_2.x86_64
|
||||
```
|
||||
|
||||
要统计补丁的大约数量,运行下面的命令:
|
||||
|
||||
```
|
||||
# yum updateinfo list available | wc -l
|
||||
11269
|
||||
```
|
||||
|
||||
想列出全部可用的安全补丁但不安装,以下命令用来展示你系统里已安装和待安装的推荐补丁:
|
||||
|
||||
```
|
||||
# yum updateinfo list security all
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos,
|
||||
: subscription-manager, verify, versionlock
|
||||
RHSA-2014:1031 Important/Sec. 389-ds-base-1.3.1.6-26.el7_0.x86_64
|
||||
RHSA-2015:0416 Important/Sec. 389-ds-base-1.3.3.1-13.el7.x86_64
|
||||
RHSA-2015:0895 Important/Sec. 389-ds-base-1.3.3.1-16.el7_1.x86_64
|
||||
RHSA-2016:0204 Important/Sec. 389-ds-base-1.3.4.0-26.el7_2.x86_64
|
||||
RHSA-2016:2594 Moderate/Sec. 389-ds-base-1.3.5.10-11.el7.x86_64
|
||||
RHSA-2017:0920 Important/Sec. 389-ds-base-1.3.5.10-20.el7_3.x86_64
|
||||
RHSA-2017:2569 Moderate/Sec. 389-ds-base-1.3.6.1-19.el7_4.x86_64
|
||||
RHSA-2018:0163 Important/Sec. 389-ds-base-1.3.6.1-26.el7_4.x86_64
|
||||
RHSA-2018:0414 Important/Sec. 389-ds-base-1.3.6.1-28.el7_4.x86_64
|
||||
RHSA-2018:1380 Important/Sec. 389-ds-base-1.3.7.5-21.el7_5.x86_64
|
||||
RHSA-2018:2757 Moderate/Sec. 389-ds-base-1.3.7.5-28.el7_5.x86_64
|
||||
RHSA-2018:3127 Moderate/Sec. 389-ds-base-1.3.8.4-15.el7.x86_64
|
||||
RHSA-2014:1031 Important/Sec. 389-ds-base-libs-1.3.1.6-26.el7_0.x86_64
|
||||
```
|
||||
|
||||
要显示所有待安装的安全补丁:
|
||||
|
||||
```
|
||||
# yum updateinfo list security all | grep -v "i"
|
||||
|
||||
RHSA-2014:1031 Important/Sec. 389-ds-base-1.3.1.6-26.el7_0.x86_64
|
||||
RHSA-2015:0416 Important/Sec. 389-ds-base-1.3.3.1-13.el7.x86_64
|
||||
RHSA-2015:0895 Important/Sec. 389-ds-base-1.3.3.1-16.el7_1.x86_64
|
||||
RHSA-2016:0204 Important/Sec. 389-ds-base-1.3.4.0-26.el7_2.x86_64
|
||||
RHSA-2016:2594 Moderate/Sec. 389-ds-base-1.3.5.10-11.el7.x86_64
|
||||
RHSA-2017:0920 Important/Sec. 389-ds-base-1.3.5.10-20.el7_3.x86_64
|
||||
RHSA-2017:2569 Moderate/Sec. 389-ds-base-1.3.6.1-19.el7_4.x86_64
|
||||
RHSA-2018:0163 Important/Sec. 389-ds-base-1.3.6.1-26.el7_4.x86_64
|
||||
RHSA-2018:0414 Important/Sec. 389-ds-base-1.3.6.1-28.el7_4.x86_64
|
||||
RHSA-2018:1380 Important/Sec. 389-ds-base-1.3.7.5-21.el7_5.x86_64
|
||||
RHSA-2018:2757 Moderate/Sec. 389-ds-base-1.3.7.5-28.el7_5.x86_64
|
||||
```
|
||||
|
||||
要统计全部安全补丁的大致数量,运行下面的命令:
|
||||
|
||||
```
|
||||
# yum updateinfo list security all | wc -l
|
||||
3522
|
||||
```
|
||||
|
||||
下面根据已装软件列出可更新的安全补丁。这包括 bugzilla(bug 修复)、CVE(知名漏洞数据库)、安全更新等:
|
||||
|
||||
```
|
||||
# yum updateinfo list security
|
||||
|
||||
或者
|
||||
|
||||
# yum updateinfo list sec
|
||||
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos,
|
||||
: subscription-manager, verify, versionlock
|
||||
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-adsl-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-bluetooth-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-config-server-1:1.12.0-8.el7_6.noarch
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-glib-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-libnm-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-ppp-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-team-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-tui-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-wifi-1:1.12.0-8.el7_6.x86_64
|
||||
RHSA-2018:3665 Important/Sec. NetworkManager-wwan-1:1.12.0-8.el7_6.x86_64
|
||||
```
|
||||
|
||||
显示所有与安全相关的更新,并且返回一个结果来告诉你是否有可用的补丁:
|
||||
|
||||
```
|
||||
# yum --security check-update
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos, subscription-manager, verify, versionlock
|
||||
rhel-7-server-rpms | 2.0 kB 00:00:00
|
||||
--> policycoreutils-devel-2.2.5-20.el7.x86_64 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> smc-raghumalayalam-fonts-6.0-7.el7.noarch from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> amanda-server-3.3.3-17.el7.x86_64 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> 389-ds-base-libs-1.3.4.0-26.el7_2.x86_64 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> 1:cups-devel-1.6.3-26.el7.i686 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> openwsman-client-2.6.3-3.git4391e5c.el7.i686 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> 1:emacs-24.3-18.el7.x86_64 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> augeas-libs-1.4.0-2.el7_4.2.i686 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> samba-winbind-modules-4.2.3-10.el7.i686 from rhel-7-server-rpms excluded (updateinfo)
|
||||
--> tftp-5.2-11.el7.x86_64 from rhel-7-server-rpms excluded (updateinfo)
|
||||
.
|
||||
.
|
||||
35 package(s) needed for security, out of 115 available
|
||||
NetworkManager.x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms
|
||||
NetworkManager-adsl.x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms
|
||||
NetworkManager-bluetooth.x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms
|
||||
NetworkManager-config-server.noarch 1:1.12.0-10.el7_6 rhel-7-server-rpms
|
||||
NetworkManager-glib.x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms
|
||||
NetworkManager-libnm.x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms
|
||||
NetworkManager-ppp.x86_64 1:1.12.0-10.el7_6 rhel-7-server-rpms
|
||||
```
|
||||
|
||||
列出所有可用的安全补丁,并且显示其详细信息:
|
||||
|
||||
```
|
||||
# yum info-sec
|
||||
.
|
||||
.
|
||||
===============================================================================
|
||||
tzdata bug fix and enhancement update
|
||||
===============================================================================
|
||||
Update ID : RHBA-2019:0689
|
||||
Release : 0
|
||||
Type : bugfix
|
||||
Status : final
|
||||
Issued : 2019-03-28 19:27:44 UTC
|
||||
Description : The tzdata packages contain data files with rules for various
|
||||
: time zones.
|
||||
:
|
||||
: The tzdata packages have been updated to version
|
||||
: 2019a, which addresses recent time zone changes.
|
||||
: Notably:
|
||||
:
|
||||
: * The Asia/Hebron and Asia/Gaza zones will start
|
||||
: DST on 2019-03-30, rather than 2019-03-23 as
|
||||
: previously predicted.
|
||||
: * Metlakatla rejoined Alaska time on 2019-01-20,
|
||||
: ending its observances of Pacific standard time.
|
||||
:
|
||||
: (BZ#1692616, BZ#1692615, BZ#1692816)
|
||||
:
|
||||
: Users of tzdata are advised to upgrade to these
|
||||
: updated packages.
|
||||
Severity : None
|
||||
```
|
||||
|
||||
如果你想要知道某个更新的具体内容,可以运行下面这个命令:
|
||||
|
||||
```
|
||||
# yum updateinfo RHSA-2019:0163
|
||||
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos, subscription-manager, verify, versionlock
|
||||
rhel-7-server-rpms | 2.0 kB 00:00:00
|
||||
===============================================================================
|
||||
Important: kernel security, bug fix, and enhancement update
|
||||
===============================================================================
|
||||
Update ID : RHSA-2019:0163
|
||||
Release : 0
|
||||
Type : security
|
||||
Status : final
|
||||
Issued : 2019-01-29 15:21:23 UTC
|
||||
Updated : 2019-01-29 15:23:47 UTC Bugs : 1641548 - CVE-2018-18397 kernel: userfaultfd bypasses tmpfs file permissions
|
||||
: 1641878 - CVE-2018-18559 kernel: Use-after-free due to race condition in AF_PACKET implementation
|
||||
CVEs : CVE-2018-18397
|
||||
: CVE-2018-18559
|
||||
Description : The kernel packages contain the Linux kernel, the core of any
|
||||
: Linux operating system.
|
||||
:
|
||||
: Security Fix(es):
|
||||
:
|
||||
: * kernel: Use-after-free due to race condition in
|
||||
: AF_PACKET implementation (CVE-2018-18559)
|
||||
:
|
||||
: * kernel: userfaultfd bypasses tmpfs file
|
||||
: permissions (CVE-2018-18397)
|
||||
:
|
||||
: For more details about the security issue(s),
|
||||
: including the impact, a CVSS score, and other
|
||||
: related information, refer to the CVE page(s)
|
||||
: listed in the References section.
|
||||
:
|
||||
: Bug Fix(es):
|
||||
:
|
||||
: These updated kernel packages include also
|
||||
: numerous bug fixes and enhancements. Space
|
||||
: precludes documenting all of the bug fixes in this
|
||||
: advisory. See the descriptions in the related
|
||||
: Knowledge Article:
|
||||
: https://access.redhat.com/articles/3827321
|
||||
Severity : Important
|
||||
updateinfo info done
|
||||
```
|
||||
|
||||
跟之前类似,你可以只查询那些通过 CVE 释出的系统漏洞:
|
||||
|
||||
```
|
||||
# yum updateinfo list cves
|
||||
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos,
|
||||
: subscription-manager, verify, versionlock
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-1:1.12.0-8.el7_6.x86_64
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-adsl-1:1.12.0-8.el7_6.x86_64
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-bluetooth-1:1.12.0-8.el7_6.x86_64
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-config-server-1:1.12.0-8.el7_6.noarch
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-glib-1:1.12.0-8.el7_6.x86_64
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-libnm-1:1.12.0-8.el7_6.x86_64
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-ppp-1:1.12.0-8.el7_6.x86_64
|
||||
CVE-2018-15688 Important/Sec. NetworkManager-team-1:1.12.0-8.el7_6.x86_64
|
||||
```
|
||||
|
||||
你也可以查看那些跟 bug 修复相关的更新,运行下面的命令:
|
||||
|
||||
```
|
||||
# yum updateinfo list bugfix | less
|
||||
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos,
|
||||
: subscription-manager, verify, versionlock
|
||||
RHBA-2018:3349 bugfix NetworkManager-1:1.12.0-7.el7_6.x86_64
|
||||
RHBA-2019:0519 bugfix NetworkManager-1:1.12.0-10.el7_6.x86_64
|
||||
RHBA-2018:3349 bugfix NetworkManager-adsl-1:1.12.0-7.el7_6.x86_64
|
||||
RHBA-2019:0519 bugfix NetworkManager-adsl-1:1.12.0-10.el7_6.x86_64
|
||||
RHBA-2018:3349 bugfix NetworkManager-bluetooth-1:1.12.0-7.el7_6.x86_64
|
||||
RHBA-2019:0519 bugfix NetworkManager-bluetooth-1:1.12.0-10.el7_6.x86_64
|
||||
RHBA-2018:3349 bugfix NetworkManager-config-server-1:1.12.0-7.el7_6.noarch
|
||||
RHBA-2019:0519 bugfix NetworkManager-config-server-1:1.12.0-10.el7_6.noarch
|
||||
```
|
||||
|
||||
要想得到待安装更新的摘要信息,运行这个:
|
||||
|
||||
```
|
||||
# yum updateinfo summary
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos, subscription-manager, verify, versionlock
|
||||
rhel-7-server-rpms | 2.0 kB 00:00:00
|
||||
Updates Information Summary: updates
|
||||
13 Security notice(s)
|
||||
9 Important Security notice(s)
|
||||
3 Moderate Security notice(s)
|
||||
1 Low Security notice(s)
|
||||
35 Bugfix notice(s)
|
||||
1 Enhancement notice(s)
|
||||
updateinfo summary done
|
||||
```
|
||||
|
||||
如果只想打印出低级别的安全更新,运行下面这个命令。类似的,你也可以只查询重要级别和中等级别的安全更新。
|
||||
|
||||
```
|
||||
# yum updateinfo list sec | grep -i "Low"
|
||||
|
||||
RHSA-2019:0201 Low/Sec. libgudev1-219-62.el7_6.3.x86_64
|
||||
RHSA-2019:0201 Low/Sec. systemd-219-62.el7_6.3.x86_64
|
||||
RHSA-2019:0201 Low/Sec. systemd-libs-219-62.el7_6.3.x86_64
|
||||
RHSA-2019:0201 Low/Sec. systemd-sysv-219-62.el7_6.3.x86_64
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/check-list-view-find-available-security-updates-on-redhat-rhel-centos-system/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[jdh8383](https://github.com/jdh8383)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.2daygeek.com/author/magesh/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
|
||||
474
published/201906/20190527 How to write a good C main function.md
Normal file
474
published/201906/20190527 How to write a good C main function.md
Normal file
@@ -0,0 +1,474 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (MjSeven)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10949-1.html)
|
||||
[#]: subject: (How to write a good C main function)
|
||||
[#]: via: (https://opensource.com/article/19/5/how-write-good-c-main-function)
|
||||
[#]: author: (Erik O'Shaughnessy https://opensource.com/users/jnyjny)
|
||||
|
||||
如何写好 C main 函数
|
||||
======
|
||||
|
||||
> 学习如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数。
|
||||
|
||||

|
||||
|
||||
我知道,现在孩子们用 Python 和 JavaScript 编写他们的疯狂“应用程序”。但是不要这么快就否定 C 语言 —— 它能够提供很多东西,并且简洁。如果你需要速度,用 C 语言编写可能就是你的答案。如果你正在寻找稳定的职业或者想学习如何捕获[空指针解引用][2],C 语言也可能是你的答案!在本文中,我将解释如何构造一个 C 文件并编写一个 C main 函数来成功地处理命令行参数。
|
||||
|
||||
我:一个顽固的 Unix 系统程序员。
|
||||
|
||||
你:一个有编辑器、C 编译器,并有时间打发的人。
|
||||
|
||||
让我们开工吧。
|
||||
|
||||
### 一个无聊但正确的 C 程序
|
||||
|
||||
![Parody O'Reilly book cover, "Hating Other People's Code"][3]
|
||||
|
||||
C 程序以 `main()` 函数开头,通常保存在名为 `main.c` 的文件中。
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
这个程序可以*编译*但不*干*任何事。
|
||||
|
||||
```
|
||||
$ gcc main.c
|
||||
$ ./a.out -o foo -vv
|
||||
$
|
||||
```
|
||||
|
||||
正确但无聊。
|
||||
|
||||
### main 函数是唯一的。
|
||||
|
||||
`main()` 函数是开始执行时所执行的程序的第一个函数,但不是第一个执行的函数。*第一个*函数是 `_start()`,它通常由 C 运行库提供,在编译程序时自动链入。此细节高度依赖于操作系统和编译器工具链,所以我假装没有提到它。
|
||||
|
||||
`main()` 函数有两个参数,通常称为 `argc` 和 `argv`,并返回一个有符号整数。大多数 Unix 环境都希望程序在成功时返回 `0`(零),失败时返回 `-1`(负一)。
|
||||
|
||||
参数 | 名称 | 描述
|
||||
---|---|---
|
||||
`argc` | 参数个数 | 参数向量的个数
|
||||
`argv` | 参数向量 | 字符指针数组
|
||||
|
||||
参数向量 `argv` 是调用你的程序的命令行的标记化表示形式。在上面的例子中,`argv` 将是以下字符串的列表:
|
||||
|
||||
```
|
||||
argv = [ "/path/to/a.out", "-o", "foo", "-vv" ];
|
||||
```
|
||||
|
||||
参数向量在其第一个索引 `argv[0]` 中确保至少会有一个字符串,这是执行程序的完整路径。
|
||||
|
||||
### main.c 文件的剖析
|
||||
|
||||
当我从头开始编写 `main.c` 时,它的结构通常如下:
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
/* 0 版权/许可证 */
|
||||
/* 1 包含 */
|
||||
/* 2 定义 */
|
||||
/* 3 外部声明 */
|
||||
/* 4 类型定义 */
|
||||
/* 5 全局变量声明 */
|
||||
/* 6 函数原型 */
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
/* 7 命令行解析 */
|
||||
}
|
||||
|
||||
/* 8 函数声明 */
|
||||
```
|
||||
|
||||
下面我将讨论这些编号的各个部分,除了编号为 0 的那部分。如果你必须把版权或许可文本放在源代码中,那就放在那里。
|
||||
|
||||
另一件我不想讨论的事情是注释。
|
||||
|
||||
```
|
||||
“评论谎言。”
|
||||
- 一个愤世嫉俗但聪明又好看的程序员。
|
||||
```
|
||||
|
||||
与其使用注释,不如使用有意义的函数名和变量名。
|
||||
|
||||
鉴于程序员固有的惰性,一旦添加了注释,维护负担就会增加一倍。如果更改或重构代码,则需要更新或扩充注释。随着时间的推移,代码会变得面目全非,与注释所描述的内容完全不同。
|
||||
|
||||
如果你必须写注释,不要写关于代码正在做*什么*,相反,写下代码*为什么*要这样写。写一些你将要在五年后读到的注释,那时你已经将这段代码忘得一干二净。世界的命运取决于你。*不要有压力。*
|
||||
|
||||
#### 1、包含
|
||||
|
||||
我添加到 `main.c` 文件的第一个东西是包含文件,它们为程序提供大量标准 C 标准库函数和变量。C 标准库做了很多事情。浏览 `/usr/include` 中的头文件,你可以了解到它们可以做些什么。
|
||||
|
||||
`#include` 字符串是 [C 预处理程序][4](cpp)指令,它会将引用的文件完整地包含在当前文件中。C 中的头文件通常以 `.h` 扩展名命名,且不应包含任何可执行代码。它只有宏、定义、类型定义、外部变量和函数原型。字符串 `<header.h>` 告诉 cpp 在系统定义的头文件路径中查找名为 `header.h` 的文件,它通常在 `/usr/include` 目录中。
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <libgen.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
#include <sys/types.h>
|
||||
```
|
||||
|
||||
这是我默认会全局包含的最小包含集合,它将引入:
|
||||
|
||||
\#include 文件 | 提供的东西
|
||||
---|---
|
||||
stdio | 提供 `FILE`、`stdin`、`stdout`、`stderr` 和 `fprint()` 函数系列
|
||||
stdlib | 提供 `malloc()`、`calloc()` 和 `realloc()`
|
||||
unistd | 提供 `EXIT_FAILURE`、`EXIT_SUCCESS`
|
||||
libgen | 提供 `basename()` 函数
|
||||
errno | 定义外部 `errno` 变量及其可以接受的所有值
|
||||
string | 提供 `memcpy()`、`memset()` 和 `strlen()` 函数系列
|
||||
getopt | 提供外部 `optarg`、`opterr`、`optind` 和 `getopt()` 函数
|
||||
sys/types | 类型定义快捷方式,如 `uint32_t` 和 `uint64_t`
|
||||
|
||||
#### 2、定义
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
<...>
|
||||
|
||||
#define OPTSTR "vi:o:f:h"
|
||||
#define USAGE_FMT "%s [-v] [-f hexflag] [-i inputfile] [-o outputfile] [-h]"
|
||||
#define ERR_FOPEN_INPUT "fopen(input, r)"
|
||||
#define ERR_FOPEN_OUTPUT "fopen(output, w)"
|
||||
#define ERR_DO_THE_NEEDFUL "do_the_needful blew up"
|
||||
#define DEFAULT_PROGNAME "george"
|
||||
```
|
||||
|
||||
这在现在没有多大意义,但 `OPTSTR` 定义我这里会说明一下,它是程序推荐的命令行开关。参考 [getopt(3)][5] man 页面,了解 `OPTSTR` 将如何影响 `getopt()` 的行为。
|
||||
|
||||
`USAGE_FMT` 定义了一个 `printf()` 风格的格式字符串,它用在 `usage()` 函数中。
|
||||
|
||||
我还喜欢将字符串常量放在文件的 `#define` 这一部分。如果需要,把它们收集在一起可以更容易地修正拼写、重用消息和国际化消息。
|
||||
|
||||
最后,在命名 `#define` 时全部使用大写字母,以区别变量和函数名。如果需要,可以将单词放连在一起或使用下划线分隔,只要确保它们都是大写的就行。
|
||||
|
||||
#### 3、外部声明
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
<...>
|
||||
|
||||
extern int errno;
|
||||
extern char *optarg;
|
||||
extern int opterr, optind;
|
||||
```
|
||||
|
||||
`extern` 声明将该名称带入当前编译单元的命名空间(即 “文件”),并允许程序访问该变量。这里我们引入了三个整数变量和一个字符指针的定义。`opt` 前缀的几个变量是由 `getopt()` 函数使用的,C 标准库使用 `errno` 作为带外通信通道来传达函数可能的失败原因。
|
||||
|
||||
#### 4、类型定义
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
<...>
|
||||
|
||||
typedef struct {
|
||||
int verbose;
|
||||
uint32_t flags;
|
||||
FILE *input;
|
||||
FILE *output;
|
||||
} options_t;
|
||||
```
|
||||
|
||||
在外部声明之后,我喜欢为结构、联合和枚举声明 `typedef`。命名一个 `typedef` 是一种传统习惯。我非常喜欢使用 `_t` 后缀来表示该名称是一种类型。在这个例子中,我将 `options_t` 声明为一个包含 4 个成员的 `struct`。C 是一种空格无关的编程语言,因此我使用空格将字段名排列在同一列中。我只是喜欢它看起来的样子。对于指针声明,我在名称前面加上星号,以明确它是一个指针。
|
||||
|
||||
#### 5、全局变量声明
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
<...>
|
||||
|
||||
int dumb_global_variable = -11;
|
||||
```
|
||||
|
||||
全局变量是一个坏主意,你永远不应该使用它们。但如果你必须使用全局变量,请在这里声明,并确保给它们一个默认值。说真的,*不要使用全局变量*。
|
||||
|
||||
#### 6、函数原型
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
<...>
|
||||
|
||||
void usage(char *progname, int opt);
|
||||
int do_the_needful(options_t *options);
|
||||
```
|
||||
|
||||
在编写函数时,将它们添加到 `main()` 函数之后而不是之前,在这里放函数原型。早期的 C 编译器使用单遍策略,这意味着你在程序中使用的每个符号(变量或函数名称)必须在使用之前声明。现代编译器几乎都是多遍编译器,它们在生成代码之前构建一个完整的符号表,因此并不严格要求使用函数原型。但是,有时你无法选择代码要使用的编译器,所以请编写函数原型并继续这样做下去。
|
||||
|
||||
当然,我总是包含一个 `usage()` 函数,当 `main()` 函数不理解你从命令行传入的内容时,它会调用这个函数。
|
||||
|
||||
#### 7、命令行解析
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
<...>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int opt;
|
||||
options_t options = { 0, 0x0, stdin, stdout };
|
||||
|
||||
opterr = 0;
|
||||
|
||||
while ((opt = getopt(argc, argv, OPTSTR)) != EOF)
|
||||
switch(opt) {
|
||||
case 'i':
|
||||
if (!(options.input = fopen(optarg, "r")) ){
|
||||
perror(ERR_FOPEN_INPUT);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
if (!(options.output = fopen(optarg, "w")) ){
|
||||
perror(ERR_FOPEN_OUTPUT);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
options.flags = (uint32_t )strtoul(optarg, NULL, 16);
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
options.verbose += 1;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
usage(basename(argv[0]), opt);
|
||||
/* NOTREACHED */
|
||||
break;
|
||||
}
|
||||
|
||||
if (do_the_needful(&options) != EXIT_SUCCESS) {
|
||||
perror(ERR_DO_THE_NEEDFUL);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
```
|
||||
|
||||
好吧,代码有点多。这个 `main()` 函数的目的是收集用户提供的参数,执行最基本的输入验证,然后将收集到的参数传递给使用它们的函数。这个示例声明一个使用默认值初始化的 `options` 变量,并解析命令行,根据需要更新 `options`。
|
||||
|
||||
`main()` 函数的核心是一个 `while` 循环,它使用 `getopt()` 来遍历 `argv`,寻找命令行选项及其参数(如果有的话)。文件前面定义的 `OPTSTR` 是驱动 `getopt()` 行为的模板。`opt` 变量接受 `getopt()` 找到的任何命令行选项的字符值,程序对检测命令行选项的响应发生在 `switch` 语句中。
|
||||
|
||||
如果你注意到了可能会问,为什么 `opt` 被声明为 32 位 `int`,但是预期是 8 位 `char`?事实上 `getopt()` 返回一个 `int`,当它到达 `argv` 末尾时取负值,我会使用 `EOF`(*文件末尾*标记)匹配。`char` 是有符号的,但我喜欢将变量匹配到它们的函数返回值。
|
||||
|
||||
当检测到一个已知的命令行选项时,会发生特定的行为。在 `OPTSTR` 中指定一个以冒号结尾的参数,这些选项可以有一个参数。当一个选项有一个参数时,`argv` 中的下一个字符串可以通过外部定义的变量 `optarg` 提供给程序。我使用 `optarg` 来打开文件进行读写,或者将命令行参数从字符串转换为整数值。
|
||||
|
||||
这里有几个关于代码风格的要点:
|
||||
|
||||
* 将 `opterr` 初始化为 `0`,禁止 `getopt` 触发 `?`。
|
||||
* 在 `main()` 的中间使用 `exit(EXIT_FAILURE);` 或 `exit(EXIT_SUCCESS);`。
|
||||
* `/* NOTREACHED */` 是我喜欢的一个 lint 指令。
|
||||
* 在返回 int 类型的函数末尾使用 `return EXIT_SUCCESS;`。
|
||||
* 显示强制转换隐式类型。
|
||||
|
||||
这个程序的命令行格式,经过编译如下所示:
|
||||
|
||||
```
|
||||
$ ./a.out -h
|
||||
a.out [-v] [-f hexflag] [-i inputfile] [-o outputfile] [-h]
|
||||
```
|
||||
|
||||
事实上,在编译后 `usage()` 就会向 `stderr` 发出这样的内容。
|
||||
|
||||
#### 8、函数声明
|
||||
|
||||
```
|
||||
/* main.c */
|
||||
<...>
|
||||
|
||||
void usage(char *progname, int opt) {
|
||||
fprintf(stderr, USAGE_FMT, progname?progname:DEFAULT_PROGNAME);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
int do_the_needful(options_t *options) {
|
||||
|
||||
if (!options) {
|
||||
errno = EINVAL;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!options->input || !options->output) {
|
||||
errno = ENOENT;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* XXX do needful stuff */
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
```
|
||||
|
||||
我最后编写的函数不是个样板函数。在本例中,函数 `do_the_needful()` 接受一个指向 `options_t` 结构的指针。我验证 `options` 指针不为 `NULL`,然后继续验证 `input` 和 `output` 结构成员。如果其中一个测试失败,返回 `EXIT_FAILURE`,并且通过将外部全局变量 `errno` 设置为常规错误代码,我可以告知调用者常规的错误原因。调用者可以使用便捷函数 `perror()` 来根据 `errno` 的值发出便于阅读的错误消息。
|
||||
|
||||
函数几乎总是以某种方式验证它们的输入。如果完全验证代价很大,那么尝试执行一次并将验证后的数据视为不可变。`usage()` 函数使用 `fprintf()` 调用中的条件赋值验证 `progname` 参数。接下来 `usage()` 函数就退出了,所以我不会费心设置 `errno`,也不用操心是否使用正确的程序名。
|
||||
|
||||
在这里,我要避免的最大错误是解引用 `NULL` 指针。这将导致操作系统向我的进程发送一个名为 `SYSSEGV` 的特殊信号,导致不可避免的死亡。用户最不希望看到的是由 `SYSSEGV` 而导致的崩溃。最好是捕获 `NULL` 指针以发出更合适的错误消息并优雅地关闭程序。
|
||||
|
||||
有些人抱怨在函数体中有多个 `return` 语句,他们喋喋不休地说些“控制流的连续性”之类的东西。老实说,如果函数中间出现错误,那就应该返回这个错误条件。写一大堆嵌套的 `if` 语句只有一个 `return` 绝不是一个“好主意”™。
|
||||
|
||||
最后,如果你编写的函数接受四个以上的参数,请考虑将它们绑定到一个结构中,并传递一个指向该结构的指针。这使得函数签名更简单,更容易记住,并且在以后调用时不会出错。它还可以使调用函数速度稍微快一些,因为需要复制到函数堆栈中的东西更少。在实践中,只有在函数被调用数百万或数十亿次时,才会考虑这个问题。如果认为这没有意义,那也无所谓。
|
||||
|
||||
### 等等,你不是说没有注释吗!?!!
|
||||
|
||||
在 `do_the_needful()` 函数中,我写了一种特殊类型的注释,它被是作为占位符设计的,而不是为了说明代码:
|
||||
|
||||
```
|
||||
/* XXX do needful stuff */
|
||||
```
|
||||
|
||||
当你写到这里时,有时你不想停下来编写一些特别复杂的代码,你会之后再写,而不是现在。那就是我留给自己再次回来的地方。我插入一个带有 `XXX` 前缀的注释和一个描述需要做什么的简短注释。之后,当我有更多时间的时候,我会在源代码中寻找 `XXX`。使用什么前缀并不重要,只要确保它不太可能在另一个上下文环境(如函数名或变量)中出现在你代码库里。
|
||||
|
||||
### 把它们组合在一起
|
||||
|
||||
好吧,当你编译这个程序后,它*仍然*几乎没有任何作用。但是现在你有了一个坚实的骨架来构建你自己的命令行解析 C 程序。
|
||||
|
||||
```
|
||||
/* main.c - the complete listing */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <libgen.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#define OPTSTR "vi:o:f:h"
|
||||
#define USAGE_FMT "%s [-v] [-f hexflag] [-i inputfile] [-o outputfile] [-h]"
|
||||
#define ERR_FOPEN_INPUT "fopen(input, r)"
|
||||
#define ERR_FOPEN_OUTPUT "fopen(output, w)"
|
||||
#define ERR_DO_THE_NEEDFUL "do_the_needful blew up"
|
||||
#define DEFAULT_PROGNAME "george"
|
||||
|
||||
extern int errno;
|
||||
extern char *optarg;
|
||||
extern int opterr, optind;
|
||||
|
||||
typedef struct {
|
||||
int verbose;
|
||||
uint32_t flags;
|
||||
FILE *input;
|
||||
FILE *output;
|
||||
} options_t;
|
||||
|
||||
int dumb_global_variable = -11;
|
||||
|
||||
void usage(char *progname, int opt);
|
||||
int do_the_needful(options_t *options);
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int opt;
|
||||
options_t options = { 0, 0x0, stdin, stdout };
|
||||
|
||||
opterr = 0;
|
||||
|
||||
while ((opt = getopt(argc, argv, OPTSTR)) != EOF)
|
||||
switch(opt) {
|
||||
case 'i':
|
||||
if (!(options.input = fopen(optarg, "r")) ){
|
||||
perror(ERR_FOPEN_INPUT);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
if (!(options.output = fopen(optarg, "w")) ){
|
||||
perror(ERR_FOPEN_OUTPUT);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
options.flags = (uint32_t )strtoul(optarg, NULL, 16);
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
options.verbose += 1;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
usage(basename(argv[0]), opt);
|
||||
/* NOTREACHED */
|
||||
break;
|
||||
}
|
||||
|
||||
if (do_the_needful(&options) != EXIT_SUCCESS) {
|
||||
perror(ERR_DO_THE_NEEDFUL);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
void usage(char *progname, int opt) {
|
||||
fprintf(stderr, USAGE_FMT, progname?progname:DEFAULT_PROGNAME);
|
||||
exit(EXIT_FAILURE);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
int do_the_needful(options_t *options) {
|
||||
|
||||
if (!options) {
|
||||
errno = EINVAL;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if (!options->input || !options->output) {
|
||||
errno = ENOENT;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
/* XXX do needful stuff */
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
```
|
||||
|
||||
现在,你已经准备好编写更易于维护的 C 语言。如果你有任何问题或反馈,请在评论中分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/how-write-good-c-main-function
|
||||
|
||||
作者:[Erik O'Shaughnessy][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[MjSeven](https://github.com/MjSeven)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jnyjny
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_hand_draw.png?itok=dpAf--Db (Hand drawing out the word "code")
|
||||
[2]: https://www.owasp.org/index.php/Null_Dereference
|
||||
[3]: https://opensource.com/sites/default/files/uploads/hatingotherpeoplescode-big.png (Parody O'Reilly book cover, "Hating Other People's Code")
|
||||
[4]: https://en.wikipedia.org/wiki/C_preprocessor
|
||||
[5]: https://linux.die.net/man/3/getopt
|
||||
[6]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html
|
||||
[7]: http://www.opengroup.org/onlinepubs/009695399/functions/perror.html
|
||||
[8]: http://www.opengroup.org/onlinepubs/009695399/functions/exit.html
|
||||
[9]: http://www.opengroup.org/onlinepubs/009695399/functions/strtoul.html
|
||||
[10]: http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html
|
||||
68
published/201906/20190529 NVMe on Linux.md
Normal file
68
published/201906/20190529 NVMe on Linux.md
Normal file
@@ -0,0 +1,68 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (warmfrog)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10946-1.html)
|
||||
[#]: subject: (NVMe on Linux)
|
||||
[#]: via: (https://www.networkworld.com/article/3397006/nvme-on-linux.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
Linux 上的 NVMe
|
||||
===============
|
||||
|
||||
> 如果你还没注意到,一些极速的固态磁盘技术已经可以用在 Linux 和其他操作系统上了。
|
||||
|
||||
![Sandra Henry-Stocker][1]
|
||||
|
||||
NVMe 意即<ruby>非易失性内存主机控制器接口规范<rt>non-volatile memory express</rt></ruby>,它是一个主机控制器接口和存储协议,用于加速企业和客户端系统以及固态驱动器(SSD)之间的数据传输。它通过电脑的高速 PCIe 总线工作。每当我看到这些名词时,我的感受是“羡慕”。而羡慕的原因很重要。
|
||||
|
||||
使用 NVMe,数据传输的速度比旋转磁盘快很多。事实上,NVMe 驱动能够比 SATA SSD 快 7 倍。这比我们今天很多人用的固态硬盘快了 7 倍多。这意味着,如果你用一个 NVMe 驱动盘作为启动盘,你的系统能够启动的非常快。事实上,如今任何人买一个新的系统可能都不会考虑那些没有自带 NVMe 的,不管是服务器或者个人电脑。
|
||||
|
||||
### NVMe 在 Linux 下能工作吗?
|
||||
|
||||
是的!NVMe 自 Linux 内核 3.3 版本就支持了。然而,要升级系统,通常同时需要一个 NVMe 控制器和一个 NVMe 磁盘。一些外置磁盘也行,但是要连接到系统上,需要的可不仅仅是通用的 USB 接口。
|
||||
|
||||
先使用下列命令检查内核版本:
|
||||
|
||||
```
|
||||
$ uname -r
|
||||
5.0.0-15-generic
|
||||
```
|
||||
|
||||
如果你的系统已经用了 NVMe,你将看到一个设备(例如,`/dev/nvme0`),但是只有在你安装了 NVMe 控制器的情况下才显示。如果你没有 NVMe 控制器,你可以用下列命令获取使用 NVMe 的相关信息。
|
||||
|
||||
```
|
||||
$ modinfo nvme | head -6
|
||||
filename: /lib/modules/5.0.0-15-generic/kernel/drivers/nvme/host/nvme.ko
|
||||
version: 1.0
|
||||
license: GPL
|
||||
author: Matthew Wilcox <willy@linux.intel.com>
|
||||
srcversion: AA383008D5D5895C2E60523
|
||||
alias: pci:v0000106Bd00002003sv*sd*bc*sc*i*
|
||||
```
|
||||
|
||||
### 了解更多
|
||||
|
||||
如果你想了解极速的 NVMe 存储的更多细节,可在 [PCWorld][3] 获取。
|
||||
|
||||
规范、白皮书和其他资源可在 [NVMexpress.org][4] 获取。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3397006/nvme-on-linux.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[warmfrog](https://github.com/warmfrog)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/05/nvme-100797708-large.jpg
|
||||
[2]: https://www.networkworld.com/slideshow/153439/linux-best-desktop-distros-for-newbies.html#tk.nww-infsb
|
||||
[3]: https://www.pcworld.com/article/2899351/everything-you-need-to-know-about-nvme.html
|
||||
[4]: https://nvmexpress.org/
|
||||
[5]: https://www.facebook.com/NetworkWorld/
|
||||
[6]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,138 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (chen-ni)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11021-1.html)
|
||||
[#]: subject: (A short primer on assemblers, compilers, and interpreters)
|
||||
[#]: via: (https://opensource.com/article/19/5/primer-assemblers-compilers-interpreters)
|
||||
[#]: author: (Erik O'Shaughnessy https://opensource.com/users/jnyjny/users/shawnhcorey/users/jnyjny/users/jnyjny)
|
||||
|
||||
浅谈汇编器、编译器和解释器
|
||||
======
|
||||
|
||||
> 简单介绍一下编程方式的历史演变。
|
||||
|
||||

|
||||
|
||||
在计算机诞生不久的早期年代,硬件非常昂贵,而程序员比较廉价。这些廉价程序员甚至都没有“程序员”这个头衔,并且常常是由数学家或者电气工程师来充当这个角色的。早期的计算机被用来快速解决复杂的数学问题,所以数学家天然就适合“编程”工作。
|
||||
|
||||
### 什么是程序?
|
||||
|
||||
首先来看一点背景知识。计算机自己是做不了任何事情的,它们的任何行为都需要程序来引导。你可以把程序看成是非常精确的菜谱,这种菜谱读取一个输入,然后生成对应的输出。菜谱里的各个步骤由操作数据的指令构成。听上去有点儿复杂,不过你或许知道下面这个语句是什么意思:
|
||||
|
||||
```
|
||||
1 + 2 = 3
|
||||
```
|
||||
|
||||
其中的加号是“指令”,而数字 1 和 2 是数据。数学上的等号意味着等式两边的部分是“等价”的,不过在大部分编程语言中对变量使用等号是“赋值”的意思。如果计算机执行上面这个语句,它会把这个加法的结果(也就是“3”)储存在内存中的某个地方。
|
||||
|
||||
计算机知道如何使用数字进行数学运算,以及如何在内存结构中移动数据。在这里就不对内存进行展开了,你只需要知道内存一般分为两大类:“速度快/空间小”和“速度慢/空间大”。CPU 寄存器的读写速度非常快,但是空间非常小,相当于一个速记便签。主存储器通常有很大的空间,但是读写速度就比寄存器差远了。在程序运行的时候,CPU 不断将它所需要用到的数据从主存储器挪动到寄存器,然后再把结果放回到主存储器。
|
||||
|
||||
### 汇编器
|
||||
|
||||
当时的计算机很贵,而人力比较便宜。程序员需要耗费很多时间把手写的数学表达式翻译成计算机可以执行的指令。最初的计算机只有非常糟糕的用户界面,有些甚至只有前面板上的拨动开关。这些开关就代表一个内存“单元”里的一个个 “0” 和 “1”。程序员需要配置一个内存单元,选择好储存位置,然后把这个单元提交到内存里。这是一个既耗时又容易出错的过程。
|
||||
|
||||
![Programmers operate the ENIAC computer][2]
|
||||
|
||||
*程序员[Betty Jean Jennings][3] (左) 和 [Fran Bilas][4] (右) 在操作 [ENIAC][5] 的主控制面板*
|
||||
|
||||
后来有一名 [电气工程师][6] 认为自己的时间很宝贵,就写了一个程序,能够把人们可以读懂的“菜谱”一样的输入转换成计算机可以读懂的版本。这就是最初的“汇编器”,在当时引起了不小的争议。这些昂贵机器的主人不希望把计算资源浪费在人们已经能做的任务上(虽然又慢又容易出错)。不过随着时间的推移,人们逐渐发现使用汇编器在速度和准确性上都胜于人工编写机器语言,并且计算机完成的“实际工作量”增加了。
|
||||
|
||||
尽管汇编器相比在机器面板上切换比特的状态已经是很大的进步了,这种编程方式仍然非常专业。上面加法的例子在汇编语言中看起来差不多是这样的:
|
||||
|
||||
```
|
||||
01 MOV R0, 1
|
||||
02 MOV R1, 2
|
||||
03 ADD R0, R1, R2
|
||||
04 MOV 64, R0
|
||||
05 STO R2, R0
|
||||
```
|
||||
|
||||
每一行都是一个计算机指令,前面是一个指令的简写,后面是指令所操作的数据。这个小小的程序首先会将数值 1 “移动”到寄存器 R0,然后把 2 移动到寄存器 R1。03 行把 R0 和 R1 两个寄存器里的数值相加,然后将结果储存在 R2 寄存器里。最后,04 行和 05 行决定结果应该被放在主存储器里的什么位置(在这里是地址 64)。管理内存中存储数据的位置是编程过程中最耗时也最容易出错的部分之一。
|
||||
|
||||
### 编译器
|
||||
|
||||
汇编器已经比手写计算机指令要好太多了,不过早期的程序员还是渴望能够按照他们所习惯的方式,像书写数学公式一样地去写程序。这种需求推动了高级编译语言的发展,其中有一些已经成为历史,另一些如今还在使用。比如 [ALGO][7] 就已经成为历史了,但是像 [Fortran][8] 和 [C][9] 这样的语言仍然在不断解决实际问题。
|
||||
|
||||
![Genealogy tree of ALGO and Fortran][10]
|
||||
|
||||
*ALGO 和 Fortran 编程语言的谱系树*
|
||||
|
||||
这些“高级”语言使得程序员可以用更简单的方式编写程序。在 C 语言中,我们的加法程序就变成了这样:
|
||||
|
||||
```
|
||||
int x;
|
||||
x = 1 + 2;
|
||||
```
|
||||
|
||||
第一个语句描述了该程序将要使用的一块内存。在这个例子中,这块内存应该占一个整数的大小,名字是 `x`。第二个语句是加法,虽然是倒着写的。一个 C 语言的程序员会说这是 “X 被赋值为 1 加 2 的结果”。需要注意的是,程序员并不需要决定在内存的什么位置储存 `x`,这个任务交给编译器了。
|
||||
|
||||
这种被称为“编译器”的新程序可以把用高级语言写的程序转换成汇编语言,再使用汇编器把汇编语言转换成机器可读的程序。这种程序组合常常被称为“工具链”,因为一个程序的输出就直接成为另一个程序的输入。
|
||||
|
||||
编译语言相比汇编语言的优势体现在从一台计算机迁移到不同型号或者品牌的另一台计算机上的时候。在计算机的早期岁月里,包括 IBM、DEC、德州仪器、UNIVAC 以及惠普在内的很多公司都在制造除了大量不同类型的计算机硬件。这些计算机除了都需要连接电源之外就没有太多共同点了。它们在内存和 CPU 架构上的差异相当大,当时经常需要人们花费数年来将一台计算机的程序翻译成另一台计算机的程序。
|
||||
|
||||
有了高级语言,我们只需要把编译器工具链迁移到新的平台就行了。只要有可用的编译器,高级语言写的程序最多只需要经过小幅修改就可以在新的计算机上被重新编译。高级语言的编译是一个真正的革命性成果。
|
||||
|
||||
![IBM PC XT][11]
|
||||
|
||||
*1983 发布的 IBM PC XT 是硬件价格下降的早期例子。*
|
||||
|
||||
程序员们的生活得到了很好的改善。相比之下,通过高级语言表达他们想要解决的问题让事情变得轻松很多。由于半导体技术的进步以及集成芯片的发明,计算机硬件的价格急剧下降。计算机的速度越来越快,能力也越来越强,并且还便宜了很多。从某个时间点往后(也许是 80 年代末期吧),事情发生了反转,程序员变得比他们所使用的硬件更值钱了。
|
||||
|
||||
### 解释器
|
||||
|
||||
随着时间的推移,一种新的编程方式兴起了。一种被称为“解释器”的特殊程序可以直接读取一个程序将其转换成计算机指令以立即执行。和编译器差不多,解释器读取程序并将它转换成一个中间形态。但和编译器不同的是,解释器直接执行程序的这个中间形态。解释型语言在每一次执行的时候都要经历这个过程;而编译程序只需要编译一次,之后计算机每次只需要执行编译好的机器指令就可以了。
|
||||
|
||||
顺便说一句,这个特性就是导致人们感觉解释型程序运行得比较慢的原因。不过现代计算机的性能出奇地强大,以至于大多数人无法区分编译型程序和解释型程序。
|
||||
|
||||
解释型程序(有时也被成为“脚本”)甚至更容易被移植到不同的硬件平台上。因为脚本并不包含任何机器特有的指令,同一个版本的程序可以不经过任何修改就直接在很多不同的计算机上运行。不过当然了,解释器必须得先移植到新的机器上才行。
|
||||
|
||||
一个很流行的解释型语言是 [perl][12]。用 perl 完整地表达我们的加法问题会是这样的:
|
||||
|
||||
```
|
||||
$x = 1 + 2
|
||||
```
|
||||
|
||||
虽然这个程序看起来和 C 语言的版本差不多,运行上也没有太大区别,但却缺少了初始化变量的语句。其实还有一些其它的区别(超出这篇文章的范围了),但你应该已经注意到,我们写计算机程序的方式已经和数学家用纸笔手写数学表达式非常接近了。
|
||||
|
||||
### 虚拟机
|
||||
|
||||
最新潮的编程方式要数虚拟机(经常简称 VM)了。虚拟机分为两大类:系统虚拟机和进程虚拟机。这两种虚拟机都提供一种对“真实的”计算硬件的不同级别的抽象,不过它们的作用域不同。系统虚拟机是一个提供物理硬件的替代品的软件,而进程虚拟机则被设计用来以一种“系统独立”的方式执行程序。所以在这个例子里,进程虚拟机(往后我所说的虚拟机都是指这个类型)的作用域和解释器的比较类似,因为也是先将程序编译成一个中间形态,然后虚拟机再执行这个中间形态。
|
||||
|
||||
虚拟机和解释器的主要区别在于,虚拟机创造了一个虚拟的 CPU,以及一套虚拟的指令集。有了这层抽象,我们就可以编写前端工具来把不同语言的程序编译成虚拟机可以接受的程序了。也许最流行也最知名的虚拟机就是 Java 虚拟机(JVM)了。JVM 最初在 1990 年代只支持 Java 语言,但是如今却可以运行 [许多][13] 流行的编程语言,包括 Scala、Jython、JRuby、Clojure,以及 Kotlin 等等。还有其它一些不太常见的例子,在这里就不说了。我也是最近才知道,我最喜欢的语言 Python 并不是一个解释型语言,而是一个 [运行在虚拟机上的语言][15]!
|
||||
|
||||
虚拟机仍然在延续这样一个历史趋势:让程序员在使用特定领域的编程语言解决问题的时候,所需要的对特定计算平台的了解变得越来越少了。
|
||||
|
||||
### 就是这样了
|
||||
|
||||
希望你喜欢这篇简单介绍软件背后运行原理的短文。有什么其它话题是你想让我接下来讨论的吗?在评论里告诉我吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/primer-assemblers-compilers-interpreters
|
||||
|
||||
作者:[Erik O'Shaughnessy][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[chen-ni](https://github.com/chen-ni)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jnyjny/users/shawnhcorey/users/jnyjny/users/jnyjny
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_keyboard_coding.png?itok=E0Vvam7A (keyboard with connected dots)
|
||||
[2]: https://opensource.com/sites/default/files/uploads/two_women_operating_eniac.gif (Programmers operate the ENIAC computer)
|
||||
[3]: https://en.wikipedia.org/wiki/Jean_Bartik (Jean Bartik)
|
||||
[4]: https://en.wikipedia.org/wiki/Frances_Spence (Frances Spence)
|
||||
[5]: https://en.wikipedia.org/wiki/ENIAC
|
||||
[6]: https://en.wikipedia.org/wiki/Nathaniel_Rochester_%28computer_scientist%29
|
||||
[7]: https://en.wikipedia.org/wiki/ALGO
|
||||
[8]: https://en.wikipedia.org/wiki/Fortran
|
||||
[9]: https://en.wikipedia.org/wiki/C_(programming_language)
|
||||
[10]: https://opensource.com/sites/default/files/uploads/algolfortran_family-by-borkowski.png (Genealogy tree of ALGO and Fortran)
|
||||
[11]: https://opensource.com/sites/default/files/uploads/639px-ibm_px_xt_color.jpg (IBM PC XT)
|
||||
[12]: www.perl.org
|
||||
[13]: https://en.wikipedia.org/wiki/List_of_JVM_languages
|
||||
[14]: /resources/python
|
||||
[15]: https://opensource.com/article/18/4/introduction-python-bytecode
|
||||
[16]: https://pybit.es/python-interpreters.html
|
||||
@@ -0,0 +1,91 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (tomjlw)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11015-1.html)
|
||||
[#]: subject: (Learn Python with these awesome resources)
|
||||
[#]: via: (https://opensource.com/article/19/5/resources-learning-python)
|
||||
[#]: author: (Don Watkins https://opensource.com/users/don-watkins)
|
||||
|
||||
学习 Python 的精品 PLN 资源
|
||||
======
|
||||
|
||||
> 通过将这些资源加入你自己的私人学习网络以拓展 Python 知识。
|
||||
|
||||

|
||||
|
||||
我使用和教授 Python 已有很长时间了,但我总是乐于增加我对这门实用语言的知识。这就是为什么我一直试着拓展我的 Python <ruby>[个人学习网络][2]<rt>personal learning network</rt></ruby>(PLN),这是一个描述用于分享信息的非正式的互惠型网络的概念。
|
||||
|
||||
教育学家 [Kelly Paredes][3] 和 [Sean Tibor][4] 最近在他们的播客 [Teaching Python][5] 上谈到了如何搭建 Python PLN。我在克里夫兰的 [PyCon 2019][6] 遇到他们之后就订阅了这个频道(并把它们加入到我的 Python PLN 当中)。这个播客激发了我对 Python PLN 中的人的思考,包括那些我最近在 PyCon 遇到的人们。
|
||||
|
||||
我会分享一些我找到 PLN 成员的地方;可能它们也可以变成你的 Python PLN 的一部分。
|
||||
|
||||
### Young Coders 导师
|
||||
|
||||
Python 基金会的活动协调者 [Betsy Waliszewski][7] 是我的 Python PLN 中的一员。当我们在 PyCon2019 见到时,因为我是个老师,她推荐我看看为十二岁及以上的孩子打造的 [Young Coders][8] 工作室。在那我遇到了正在负责这个计划的 [Katie Cunningham][9],它会教参与者如何搭建和配置树莓派并使用 Python 项目。年轻学生也会收到两本书 Jason Briggs 的 《[Python for Kids][10]》 和 Craig Richardson 的 《[Learn to Program with Minecraft][11]》。我一直寻找提升我教学水平的新方式,因此我在该会议上的 [NoStarch Press][12] 展台迅速拿到了两本 Minecraft 书。Katie 是一名优秀的教师,也是一名多产作家,拥有一个充满 Python 培训视频的 [YouTube][13] 精彩频道。
|
||||
|
||||
我把 Kattie 与我在 Young Coders 工作室碰到的另外两个人加入我的 PLN:[Nat Dunn][14] 和 [Sean Valentine][15]。像 Katie 一样,他们自愿花时间把 Python 介绍给青年程序员们。Nat 是 [Webucator][16] 的总裁,这是一家 IT 培训公司,多年来一直是 Python 软件基金会赞助商,并赞助了 PyCon 2018 教育峰会。在将 Python 教他 13 岁的儿子和 14 岁的侄子之后,他决定在 Young Coders 任教。Sean 是 [Hidden Genius 项目][17] 的战略计划总监,这是一个针对黑人男性青年的技术及领导力打造的教导项目。Sean 说许多 Hidden Genius 参与者“用 Python 打造项目因此我们认为 [Young Coders] 是一个很好的合作机会”。了解 Hidden Genius 项目激发了我更深层次地思考编程的未来以及其改变生活的威力。
|
||||
|
||||
### Open Spaces 聚会
|
||||
|
||||
我发现 PyCon 的 [Open Spaces][18] —— 这是一个一小时左右的自组织的即兴聚会 —— 跟正式的项目活动一样有用。我的最爱之一是 [Circuit Playground Express][19] 设备,它是我们会议主题包的一部分。我很喜欢这个设备,并且 Open Space 提供了学习它的一条大道。组织者提供了工作表和一个 [Github][20] 仓库,其中包含有我们成功所需要的所有工具,也提供了一个上手实践的机会以及探索这个独特硬件的方向。
|
||||
|
||||
这次会面激起了了我对学习 Circuit Playground Express 更新信息的兴趣,因此在 PyCon 之后, 我在 Twitter 上接触到了在会议上就该设备编程发表主旨演讲的 [Nina Zakharenko][21]。Nina 自从去年秋天我在 [All Things Open][23] 上听过她的演讲后就在我的 Python PLN 里了。我最近报名参加了她的 [Python 基础][24]课程以加深我的学习。Nina 推荐我将 [Kattni Rembor][25] 加入我的 Python PLN。他的[示例代码][26]正帮助我学习用 CircuitPython 编程。
|
||||
|
||||
### 我的 PLN 中的其他资源
|
||||
|
||||
我在 PyCon 2019 也遇见了 [Opensource.com][27] 社区版主 [Moshe Zadka][28],并和他来了场长谈。他分享了几个新的 Python 资源,包括 [如何像电脑科学家一样思考][29]。社区版主 [Seth Kenlon][30] 是我的 PLN 中的另一名成员;他发表了许多优秀的 [Python 文章][31],我也推荐你关注他。
|
||||
|
||||
我的 Python PLN 每天都在持续扩大。除了我已经提到的,我同样推荐你关注 [Al Sweigart][32]、[Eric Matthes][33] 以及 [Adafruit][34]他们分享的优质内容。我也推荐这本书《[制作:由 Adafruit Circuit Playground Express 开始][35]》和《[Podcast.\_\_init\_\_][36]》,这是一个关于 Python 社区的播客。这两个都是我从我的 PLN 中了解到的。
|
||||
|
||||
谁在你的 Python PLN 中?请在留言区分享你的最爱。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/resources-learning-python
|
||||
|
||||
作者:[Don Watkins][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[tomjlw](https://github.com/tomjlw)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/don-watkins
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/reading_book_stars_list.png?itok=Iwa1oBOl (Book list, favorites)
|
||||
[2]: https://en.wikipedia.org/wiki/Personal_learning_network
|
||||
[3]: https://www.teachingpython.fm/hosts/kellypared
|
||||
[4]: https://twitter.com/smtibor
|
||||
[5]: https://www.teachingpython.fm/20
|
||||
[6]: https://us.pycon.org/2019/
|
||||
[7]: https://www.linkedin.com/in/betsywaliszewski
|
||||
[8]: https://us.pycon.org/2019/events/letslearnpython/
|
||||
[9]: https://www.linkedin.com/in/kcunning/
|
||||
[10]: https://nostarch.com/pythonforkids
|
||||
[11]: https://nostarch.com/programwithminecraft
|
||||
[12]: https://nostarch.com/
|
||||
[13]: https://www.youtube.com/c/KatieCunningham
|
||||
[14]: https://www.linkedin.com/in/natdunn/
|
||||
[15]: https://www.linkedin.com/in/sean-valentine-b370349b/
|
||||
[16]: https://www.webucator.com/
|
||||
[17]: http://www.hiddengeniusproject.org/
|
||||
[18]: https://us.pycon.org/2019/events/open-spaces/
|
||||
[19]: https://www.adafruit.com/product/3333
|
||||
[20]: https://github.com/adafruit/PyCon2019
|
||||
[21]: https://twitter.com/nnja
|
||||
[22]: https://www.youtube.com/watch?v=35mXD40SvXM
|
||||
[23]: https://allthingsopen.org/
|
||||
[24]: https://frontendmasters.com/courses/python/
|
||||
[25]: https://twitter.com/kattni
|
||||
[26]: https://github.com/kattni/ChiPy_2018
|
||||
[27]: http://Opensource.com
|
||||
[28]: https://opensource.com/users/moshez
|
||||
[29]: http://openbookproject.net/thinkcs/python/english3e/
|
||||
[30]: https://opensource.com/users/seth
|
||||
[31]: https://www.google.com/search?source=hp&ei=gVToXPq-FYXGsAW-mZ_YAw&q=site%3Aopensource.com+%22Seth+Kenlon%22+%2B+Python&oq=site%3Aopensource.com+%22Seth+Kenlon%22+%2B+Python&gs_l=psy-ab.12...627.15303..15584...1.0..0.176.2802.4j21......0....1..gws-wiz.....0..35i39j0j0i131j0i67j0i20i263.r2SAW3dxlB4
|
||||
[32]: http://alsweigart.com/
|
||||
[33]: https://twitter.com/ehmatthes?lang=en
|
||||
[34]: https://twitter.com/adafruit
|
||||
[35]: https://www.adafruit.com/product/3944
|
||||
[36]: https://www.pythonpodcast.com/episodes/
|
||||
@@ -0,0 +1,89 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10974-1.html)
|
||||
[#]: subject: (Unity Editor is Now Officially Available for Linux)
|
||||
[#]: via: (https://itsfoss.com/unity-editor-linux/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
Unity 编辑器现已正式面向 Linux 推出
|
||||
======
|
||||
|
||||
如果你是设计师、开发者或艺术家,你可能一直在使用 Linux 上的实验性 [Unity 编辑器][1]。然而,不能一直用实验性版本 —— 开发者需要一个完整稳定的工作经验。
|
||||
|
||||
因此,他们最近宣布你可以在 Linux 上使用完整功能的 Unity 编辑器了。
|
||||
|
||||
虽然这是一个令人兴奋的消息,但它正式支持哪些 Linux 发行版?我们来谈谈更多细节……
|
||||
|
||||
> 非 FOSS 警告
|
||||
|
||||
> Linux (或任何其他平台)上的 Unity 编辑器不是开源软件。我们在这里介绍它是因为:
|
||||
|
||||
### 官方支持 Ubuntu 和 CentOS 7
|
||||
|
||||
![][2]
|
||||
|
||||
无论你拥有个人许可还是专业许可,如果你安装了 Unity 2019.1 或更高版本,都可以使用该编辑器。
|
||||
|
||||
此外,他们优先支持 Ubuntu 16.04、Ubuntu 18.04 和 CentOS 7。
|
||||
|
||||
在[公告][3]中,他们还提到了支持的配置:
|
||||
|
||||
* x86-64 架构
|
||||
* 运行在 X11 窗口系统之上的 Gnome 桌面环境
|
||||
* Nvidia 官方专有显卡驱动和 AMD Mesa 显卡驱动
|
||||
* 桌面计算机,在没有仿真或兼容层的设备/硬件上运行
|
||||
|
||||
你可以尝试其他的 —— 但最好坚持官方要求以获得最佳体验。
|
||||
|
||||
> 关于第三方工具的说明
|
||||
|
||||
> 如果你碰巧在某个项目中使用了任何第三方工具,那么必须单独检查它们是否支持。
|
||||
|
||||
### 如何在 Linux 上安装 Unity 编辑器
|
||||
|
||||
现在你已经了解了,那么该如何安装?
|
||||
|
||||
要安装 Unity,你需要下载并安装 [Unity Hub][4]。
|
||||
|
||||
![Unity Hub][5]
|
||||
|
||||
你需要完成以下步骤:
|
||||
|
||||
* 从[官方论坛页面][4]下载适用于 Linux 的 Unity Hub。
|
||||
* 它将下载一个 AppImage 文件。简单地说,让它可执行并运行它。如果你不了解,你应该查看关于[如何在 Linux 上使用 AppImage][6] 的指南。
|
||||
* 启动 Unity Hub 后,它会要求你使用 Unity ID 登录(或注册)以激活许可证。有关许可证生效的更多信息,请参阅他们的 [FAQ 页面][7]。
|
||||
* 使用 Unity ID 登录后,进入 “Installs” 选项(如上图所示)并添加所需的版本/组件。
|
||||
|
||||
就是这些了。这就是获取并快速安装的最佳方法。
|
||||
|
||||
### 总结
|
||||
|
||||
即使这是一个令人兴奋的消息,但官方配置支持似乎并不广泛。如果你在 Linux 上使用它,请在[他们的 Linux 论坛帖子][9]上分享你的反馈和意见。
|
||||
|
||||
你觉得怎么样?此外,你是使用 Unity Hub 安装它,还是有更好的方法来安装?
|
||||
|
||||
请在下面的评论中告诉我们你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/unity-editor-linux/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://unity3d.com/unity/editor
|
||||
[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/Unity-Editor-on-Linux.png?resize=800%2C450&ssl=1
|
||||
[3]: https://blogs.unity3d.com/2019/05/30/announcing-the-unity-editor-for-linux/
|
||||
[4]: https://forum.unity.com/threads/unity-hub-v-1-6-0-is-now-available.640792/
|
||||
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/unity-hub.jpg?fit=800%2C532&ssl=1
|
||||
[6]: https://itsfoss.com/use-appimage-linux/
|
||||
[7]: https://support.unity3d.com/hc/en-us/categories/201268913-Licenses
|
||||
[9]: https://forum.unity.com/forums/linux-editor.93/
|
||||
@@ -0,0 +1,87 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10953-1.html)
|
||||
[#]: subject: (Why translation platforms matter)
|
||||
[#]: via: (https://opensource.com/article/19/5/translation-platforms)
|
||||
[#]: author: (Jean-Baptiste Holcroft https://opensource.com/users/jibec/users/annegentle/users/bcotton)
|
||||
|
||||
什么是翻译平台最重要的地方?
|
||||
======
|
||||
|
||||
> 技术上的考虑并不是判断一个好的翻译平台的最佳方式。
|
||||
|
||||

|
||||
|
||||
语言翻译可以使开源软件能够被世界各地的人们使用,这是非开发人员参与他们喜欢的(开源)项目的好方法。有许多[翻译工具][2],你可以根据他们处理翻译中涉及的主要功能区域的能力来评估:技术交互能力、团队支持能力和翻译支持能力。
|
||||
|
||||
技术交互方面包括:
|
||||
|
||||
* 支持的文件格式
|
||||
* 与开源存储库的同步
|
||||
* 自动化支持工具
|
||||
* 接口可能性
|
||||
|
||||
对团队合作(也可称为“社区活力”)的支持包括该平台如何:
|
||||
|
||||
* 监控变更(按译者、项目等)
|
||||
* 跟进由项目推动的更新
|
||||
* 显示进度状态
|
||||
* 是否启用审核和验证步骤
|
||||
* 协助(来自同一团队和跨语言的)翻译人员和项目维护人员之间的讨论
|
||||
* 平台支持的全球通讯(新闻等)
|
||||
|
||||
翻译协助包括:
|
||||
|
||||
* 清晰、符合人体工程学的界面
|
||||
* 简单几步就可以找到项目并开始工作
|
||||
* 可以简单地了解到翻译和分发之间流程
|
||||
* 可以使用翻译记忆机
|
||||
* 词汇表丰富
|
||||
|
||||
前两个功能区域与源代码管理平台的差别不大,只有一些小的差别。我觉得最后一个区域也主要与源代码有关。但是,它们处理的数据非常不同,翻译平台的用户通常也不如开发人员了解技术,而数量也更多。
|
||||
|
||||
### 我的推荐
|
||||
|
||||
在我看来,GNOME 平台提供了最好的翻译平台,原因如下:
|
||||
|
||||
* 其网站包含了团队组织和翻译平台。很容易看出谁在负责以及他们在团队中的角色。一切都集中在几个屏幕之内。
|
||||
* 很容易找到要处理的内容,并且你会很快意识到你必须将文件下载到本地计算机并在修改后将其发回。这个流程不是很先进,但逻辑很容易理解。
|
||||
* 一旦你发回文件,平台就可以向邮件列表发送通告,以便团队知道后续步骤,并且可以全局轻松讨论翻译(而不是评论特定句子)。
|
||||
* 它支持多达 297 种语言。
|
||||
* 它显示了基本句子、高级菜单和文档的明确的进度百分比。
|
||||
|
||||
再加上可预测的 GNOME 发布计划,社区可以使用一切可以促进社区工作的工具。
|
||||
|
||||
如果我们看看 Debian 翻译团队,他们多年来一直在为 Debian (LCTT 译注:此处原文是“Fedora”,疑为笔误)翻译了难以想象的大量内容(尤其是新闻),我们看到他们有一个高度以来于规则的翻译流程,完全基于电子邮件,手动推送到存储库。该团队还将所有内容都放在流程中,而不是工具中,尽管这似乎需要相当大的技术能力,但它已成为领先的语言群体之一,已经运作多年。
|
||||
|
||||
我认为,成功的翻译平台的主要问题不是基于单一的(技术、翻译)工作的能力,而是基于如何构建和支持翻译团队的流程。这就是可持续性的原因。
|
||||
|
||||
生产过程是构建团队最重要的方式;通过正确地将它们组合在一起,新手很容易理解该过程是如何工作的,采用它们,并将它们解释给下一组新人。
|
||||
|
||||
要建立一个可持续发展的社区,首先要考虑的是支持协同工作的工具,然后是可用性。
|
||||
|
||||
这解释了我为什么对 [Zanata][3] 工具沮丧,从技术和界面的角度来看,这是有效的,但在帮助构建社区方面却很差。我认为翻译是一个社区驱动的过程(可能是开源软件开发中最受社区驱动的过程之一),这对我来说是一个关键问题。
|
||||
|
||||
* * *
|
||||
|
||||
本文改编自“[什么是一个好的翻译平台?][4]”,最初发表在 Jibec 期刊上,并经许可重复使用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/translation-platforms
|
||||
|
||||
作者:[Jean-Baptiste Holcroft][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jibec/users/annegentle/users/bcotton
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/people_remote_teams_world.png?itok=_9DCHEel
|
||||
[2]: https://opensource.com/article/17/6/open-source-localization-tools
|
||||
[3]: http://zanata.org/
|
||||
[4]: https://jibecfed.fedorapeople.org/blog-hugo/en/2016/09/whats-a-good-translation-platform/
|
||||
@@ -0,0 +1,145 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10951-1.html)
|
||||
[#]: subject: (How To Verify NTP Setup (Sync) is Working or Not In Linux?)
|
||||
[#]: via: (https://www.2daygeek.com/check-verify-ntp-sync-is-working-or-not-in-linux-using-ntpq-ntpstat-timedatectl/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
如何在 Linux 下确认 NTP 是否同步?
|
||||
======
|
||||
|
||||

|
||||
|
||||
NTP 意即<ruby>网络时间协议<rt>Network Time Protocol</rt></ruby>,它通过网络同步计算机系统之间的时钟。NTP 服务器可以使组织中的所有服务器保持同步,以准确时间执行基于时间的作业。NTP 客户端会将其时钟与 NTP 服务器同步。
|
||||
|
||||
我们已经写了一篇关于 NTP 服务器和客户端安装和配置的文章。如果你想查看这些文章,请导航至以下链接。
|
||||
|
||||
* [如何在 Linux 上安装、配置 NTP 服务器和客户端?][1]
|
||||
* [如何安装和配置 Chrony 作为 NTP 客户端?][2]
|
||||
|
||||
我假设我你经使用上述链接设置了 NTP 服务器和 NTP 客户端。现在,如何验证 NTP 设置是否正常工作?
|
||||
|
||||
Linux 中有三个命令可用于验证 NTP 同步情况。详情如下。在本文中,我们将告诉您如何使用所有这些命令验证 NTP 同步。
|
||||
|
||||
* `ntpq`:ntpq 是一个标准的 NTP 查询程序。
|
||||
* `ntpstat`:显示网络世界同步状态。
|
||||
* `timedatectl`:它控制 systemd 系统中的系统时间和日期。
|
||||
|
||||
### 方法 1:如何使用 ntpq 命令检查 NTP 状态?
|
||||
|
||||
`ntpq` 实用程序用于监视 NTP 守护程序 `ntpd` 的操作并确定性能。
|
||||
|
||||
该程序可以以交互模式运行,也可以使用命令行参数进行控制。它通过向服务器发送多个查询来打印出连接的对等项列表。如果 NTP 正常工作,你将获得类似于下面的输出。
|
||||
|
||||
```
|
||||
# ntpq -p
|
||||
|
||||
remote refid st t when poll reach delay offset jitter
|
||||
==============================================================================
|
||||
*CentOS7.2daygee 133.243.238.163 2 u 14 64 37 0.686 0.151 16.432
|
||||
```
|
||||
|
||||
细节:
|
||||
|
||||
* `-p`:打印服务器已知的对等项列表以及其状态摘要。
|
||||
|
||||
### 方法 2:如何使用 ntpstat 命令检查 NTP 状态?
|
||||
|
||||
`ntpstat` 将报告在本地计算机上运行的 NTP 守护程序(`ntpd`)的同步状态。如果发现本地系统与参考时间源保持同步,则 `ntpstat` 将报告大致的时间精度。
|
||||
|
||||
`ntpstat` 命令根据 NTP 同步状态返回三种状态码。详情如下。
|
||||
|
||||
* `0`:如果时钟同步则返回 0。
|
||||
* `1`:如果时钟不同步则返回 1。
|
||||
* `2`:如果时钟状态不确定,则返回 2,例如 ntpd 不可联系时。
|
||||
|
||||
```
|
||||
# ntpstat
|
||||
|
||||
synchronised to NTP server (192.168.1.8) at stratum 3
|
||||
time correct to within 508 ms
|
||||
polling server every 64 s
|
||||
```
|
||||
|
||||
### 方法 3:如何使用 timedatectl 命令检查 NTP 状态?
|
||||
|
||||
[timedatectl 命令][3]用于查询和更改系统时钟及其在 systmed 系统中的设置。
|
||||
|
||||
```
|
||||
# timedatectl
|
||||
或
|
||||
# timedatectl status
|
||||
|
||||
Local time: Thu 2019-05-30 05:01:05 CDT
|
||||
Universal time: Thu 2019-05-30 10:01:05 UTC
|
||||
RTC time: Thu 2019-05-30 10:01:05
|
||||
Time zone: America/Chicago (CDT, -0500)
|
||||
NTP enabled: yes
|
||||
NTP synchronized: yes
|
||||
RTC in local TZ: no
|
||||
DST active: yes
|
||||
Last DST change: DST began at
|
||||
Sun 2019-03-10 01:59:59 CST
|
||||
Sun 2019-03-10 03:00:00 CDT
|
||||
Next DST change: DST ends (the clock jumps one hour backwards) at
|
||||
Sun 2019-11-03 01:59:59 CDT
|
||||
Sun 2019-11-03 01:00:00 CST
|
||||
```
|
||||
|
||||
### 更多技巧
|
||||
|
||||
Chrony 是一个 NTP 客户端的替代品。它可以更快地同步系统时钟,时间精度更高,对于一直不在线的系统尤其有用。
|
||||
|
||||
chronyd 较小,它使用较少的内存,只在必要时才唤醒 CPU,这样可以更好地节省电能。即使网络拥塞较长时间,它也能很好地运行。
|
||||
|
||||
你可以使用以下任何命令来检查 Chrony 状态。
|
||||
|
||||
检查 Chrony 跟踪状态。
|
||||
|
||||
```
|
||||
# chronyc tracking
|
||||
|
||||
Reference ID : C0A80105 (CentOS7.2daygeek.com)
|
||||
Stratum : 3
|
||||
Ref time (UTC) : Thu Mar 28 05:57:27 2019
|
||||
System time : 0.000002545 seconds slow of NTP time
|
||||
Last offset : +0.001194361 seconds
|
||||
RMS offset : 0.001194361 seconds
|
||||
Frequency : 1.650 ppm fast
|
||||
Residual freq : +184.101 ppm
|
||||
Skew : 2.962 ppm
|
||||
Root delay : 0.107966967 seconds
|
||||
Root dispersion : 1.060455322 seconds
|
||||
Update interval : 2.0 seconds
|
||||
Leap status : Normal
|
||||
```
|
||||
|
||||
运行 `sources` 命令以显示有关当前时间源的信息。
|
||||
|
||||
```
|
||||
# chronyc sources
|
||||
|
||||
210 Number of sources = 1
|
||||
MS Name/IP address Stratum Poll Reach LastRx Last sample
|
||||
===============================================================================
|
||||
^* CentOS7.2daygeek.com 2 6 17 62 +36us[+1230us] +/- 1111ms
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/check-verify-ntp-sync-is-working-or-not-in-linux-using-ntpq-ntpstat-timedatectl/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.2daygeek.com/author/magesh/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://linux.cn/article-10811-1.html
|
||||
[2]: https://linux.cn/article-10820-1.html
|
||||
[3]: https://www.2daygeek.com/change-set-time-date-and-timezone-on-linux/
|
||||
@@ -0,0 +1,53 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11011-1.html)
|
||||
[#]: subject: (Kubernetes is a dump truck: Here's why)
|
||||
[#]: via: (https://opensource.com/article/19/6/kubernetes-dump-truck)
|
||||
[#]: author: (Scott McCarty https://opensource.com/users/fatherlinux)
|
||||
|
||||
为什么说 Kubernetes 是一辆翻斗车
|
||||
======
|
||||
|
||||
> 翻斗车是解决各种基本业务问题的优雅解决方案。
|
||||
|
||||

|
||||
|
||||
这篇文章写于 Kubernetes 的生日(6 月 7 日星期五)前夕。
|
||||
|
||||
翻斗车很优雅。说真的,不信你听我说。它们以优雅的方式解决了各种各样的技术问题。它们可以搬动泥土、砾石、岩石、煤炭、建筑材料或道路上的障碍。它们甚至可以拉动拖车及它们上面的其他重型设备。你可以给一辆翻斗车装上五吨泥土,然后自驾游遍全国。对于像我这样的电脑极客来说,那就是优雅。
|
||||
|
||||
但是,它们并不容易使用。驾驶翻斗车需要特殊的驾驶执照。它们也不容易装配和维护。购买翻斗车和各种维护时要做很多选择。但是,它们可以优雅的搬动那些垃圾。
|
||||
|
||||
你知道搬动垃圾有什么不优雅的地方吗?假如你有一款新型的紧凑型轿车,它们到处可以买到,易于驾驶、更易于维护。但是,用它们来装泥土就很糟糕。这需要跑 200 趟才能运走 5 吨垃圾,而且,之后没人再会想要这辆车了。
|
||||
|
||||
好吧,你可以买一辆出售的翻斗车,而不是想自己造一辆。但是我不同,我是个极客,我喜欢自己造东西。但……
|
||||
|
||||
如果你拥有一家建筑公司,你就不会想着自己造一辆翻斗车。你肯定不会维持一条供应链来重构翻斗车(这可是一条很大的供应链)。但你可以学会驾驶一辆。
|
||||
|
||||
好吧,我的这个比喻很粗糙,但很容易理解。易用性是相对的,易于维护是相对的,易于装配也是相对的。这实际上取决于你想要做什么。[Kubernetes][2] 也不例外。
|
||||
|
||||
一次性构建 Kubernetes 并不太难。配置好 Kubernetes 呢?好吧,这稍微难一些。你如何看待 KubeCon?它们又宣布了多少新项目?哪些是“真实的”呢?而你应该学习哪些?你对 Harbour、TikV、NATD、Vitess,开放策略代理有多深入的了解?更不用说 Envoy、eBPF 和 Linux 中的一系列底层技术?这就像是 1904 年工业革命爆发时建造翻斗车一样,你要弄清楚使用的螺钉、螺栓、金属和活塞。(有没有蒸汽朋克在这里吗?)
|
||||
|
||||
像翻斗车一样构造和配置 Kubernetes 是一个技术问题,如果你从事金融服务、零售、生物研究、食品服务等等,这可能不是你应该做的事情。但是,学习如何驾驶 Kubernetes 肯定是你应该学习的东西。
|
||||
|
||||
Kubernetes 就像一辆翻斗车,因其可以解决的各种技术问题(以及它所拖带的生态系统)而优雅。所以,我会给你一句引用的话,这是我的一位计算机科学教授在我大学的第一年告诉我们的,她说,“有一天,你会看到一段代码并对自己说,‘真特么优雅!’”
|
||||
|
||||
Kubernetes 很优雅。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/kubernetes-dump-truck
|
||||
|
||||
作者:[Scott McCarty][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/fatherlinux
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dump_truck_car_container_kubernetes.jpg?itok=4BdmyVGd (Dump truck with kids standing in the foreground)
|
||||
[2]: https://kubernetes.io/
|
||||
@@ -0,0 +1,164 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10960-1.html)
|
||||
[#]: subject: (Two Methods To Check Or List Installed Security Updates on Redhat (RHEL) And CentOS System)
|
||||
[#]: via: (https://www.2daygeek.com/check-installed-security-updates-on-redhat-rhel-and-centos-system/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
在 RHEL 和 CentOS 上检查或列出已安装的安全更新的两种方法
|
||||
======
|
||||
|
||||

|
||||
|
||||
我们过去曾写过两篇关于这个主题的文章,每篇文章都是根据不同的要求发表的。如果你想在开始之前浏览这些文章。请通过以下链接:
|
||||
|
||||
* [如何检查 RHEL 和 CentOS 上的可用安全更新?][1]
|
||||
* [在 RHEL 和 CentOS 上安装安全更新的四种方法?][2]
|
||||
|
||||
这些文章与其他文章相互关联,因此,在深入研究之前,最好先阅读这些文章。
|
||||
|
||||
在本文中,我们将向你展示如何检查已安装的安全更新。我会介绍两种方法,你可以选择最适合你的。
|
||||
|
||||
此外,我还添加了一个小的 shell 脚本,它为你提供已安装的安全包计数。
|
||||
|
||||
运行以下命令获取系统上已安装的安全更新的列表。
|
||||
|
||||
```
|
||||
# yum updateinfo list security installed
|
||||
|
||||
Loaded plugins: changelog, package_upload, product-id, search-disabled-repos,
|
||||
: subscription-manager, verify, versionlock
|
||||
RHSA-2015:2315 Moderate/Sec. ModemManager-glib-1.1.0-8.git20130913.el7.x86_64
|
||||
RHSA-2015:2315 Moderate/Sec. NetworkManager-1:1.0.6-27.el7.x86_64
|
||||
RHSA-2016:2581 Low/Sec. NetworkManager-1:1.4.0-12.el7.x86_64
|
||||
RHSA-2017:2299 Moderate/Sec. NetworkManager-1:1.8.0-9.el7.x86_64
|
||||
RHSA-2015:2315 Moderate/Sec. NetworkManager-adsl-1:1.0.6-27.el7.x86_64
|
||||
RHSA-2016:2581 Low/Sec. NetworkManager-adsl-1:1.4.0-12.el7.x86_64
|
||||
RHSA-2017:2299 Moderate/Sec. NetworkManager-adsl-1:1.8.0-9.el7.x86_64
|
||||
RHSA-2015:2315 Moderate/Sec. NetworkManager-bluetooth-1:1.0.6-27.el7.x86_64
|
||||
```
|
||||
|
||||
要计算已安装的安全包的数量,请运行以下命令:
|
||||
|
||||
```
|
||||
# yum updateinfo list security installed | wc -l
|
||||
1046
|
||||
```
|
||||
|
||||
仅打印安装包列表:
|
||||
|
||||
```
|
||||
# yum updateinfo list security all | grep -w "i"
|
||||
|
||||
i RHSA-2015:2315 Moderate/Sec. ModemManager-glib-1.1.0-8.git20130913.el7.x86_64
|
||||
i RHSA-2015:2315 Moderate/Sec. NetworkManager-1:1.0.6-27.el7.x86_64
|
||||
i RHSA-2016:2581 Low/Sec. NetworkManager-1:1.4.0-12.el7.x86_64
|
||||
i RHSA-2017:2299 Moderate/Sec. NetworkManager-1:1.8.0-9.el7.x86_64
|
||||
i RHSA-2015:2315 Moderate/Sec. NetworkManager-adsl-1:1.0.6-27.el7.x86_64
|
||||
i RHSA-2016:2581 Low/Sec. NetworkManager-adsl-1:1.4.0-12.el7.x86_64
|
||||
i RHSA-2017:2299 Moderate/Sec. NetworkManager-adsl-1:1.8.0-9.el7.x86_64
|
||||
i RHSA-2015:2315 Moderate/Sec. NetworkManager-bluetooth-1:1.0.6-27.el7.x86_64
|
||||
i RHSA-2016:2581 Low/Sec. NetworkManager-bluetooth-1:1.4.0-12.el7.x86_64
|
||||
i RHSA-2017:2299 Moderate/Sec. NetworkManager-bluetooth-1:1.8.0-9.el7.x86_64
|
||||
i RHSA-2015:2315 Moderate/Sec. NetworkManager-config-server-1:1.0.6-27.el7.x86_64
|
||||
i RHSA-2016:2581 Low/Sec. NetworkManager-config-server-1:1.4.0-12.el7.x86_64
|
||||
i RHSA-2017:2299 Moderate/Sec. NetworkManager-config-server-1:1.8.0-9.el7.noarch
|
||||
```
|
||||
|
||||
要计算已安装的安全包的数量,请运行以下命令:
|
||||
|
||||
```
|
||||
# yum updateinfo list security all | grep -w "i" | wc -l
|
||||
1043
|
||||
```
|
||||
|
||||
或者,你可以检查指定包修复的漏洞列表。
|
||||
|
||||
在此例中,我们将检查 “openssh” 包中已修复的漏洞列表:
|
||||
|
||||
```
|
||||
# rpm -q --changelog openssh | grep -i CVE
|
||||
|
||||
- Fix for CVE-2017-15906 (#1517226)
|
||||
- CVE-2015-8325: privilege escalation via user's PAM environment and UseLogin=yes (#1329191)
|
||||
- CVE-2016-1908: possible fallback from untrusted to trusted X11 forwarding (#1298741)
|
||||
- CVE-2016-3115: missing sanitisation of input for X11 forwarding (#1317819)
|
||||
- prevents CVE-2016-0777 and CVE-2016-0778
|
||||
- Security fixes released with openssh-6.9 (CVE-2015-5352) (#1247864)
|
||||
- only query each keyboard-interactive device once (CVE-2015-5600) (#1245971)
|
||||
- add new option GSSAPIEnablek5users and disable using ~/.k5users by default CVE-2014-9278
|
||||
- prevent a server from skipping SSHFP lookup - CVE-2014-2653 (#1081338)
|
||||
- change default value of MaxStartups - CVE-2010-5107 (#908707)
|
||||
- CVE-2010-4755
|
||||
- merged cve-2007_3102 to audit patch
|
||||
- fixed audit log injection problem (CVE-2007-3102)
|
||||
- CVE-2006-5794 - properly detect failed key verify in monitor (#214641)
|
||||
- CVE-2006-4924 - prevent DoS on deattack detector (#207957)
|
||||
- CVE-2006-5051 - don't call cleanups from signal handler (#208459)
|
||||
- use fork+exec instead of system in scp - CVE-2006-0225 (#168167)
|
||||
```
|
||||
|
||||
同样,你可以通过运行以下命令来检查相应的包中是否修复了指定的漏洞:
|
||||
|
||||
```
|
||||
# rpm -q --changelog openssh | grep -i CVE-2016-3115
|
||||
|
||||
- CVE-2016-3115: missing sanitisation of input for X11 forwarding (#1317819)
|
||||
```
|
||||
|
||||
### 如何使用 Shell 脚本计算安装的安全包?
|
||||
|
||||
我添加了一个小的 shell 脚本,它可以帮助你计算已安装的安全包列表。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/security-check.sh
|
||||
|
||||
#!/bin/bash
|
||||
echo "+-------------------------+"
|
||||
echo "|Security Advisories Count|"
|
||||
echo "+-------------------------+"
|
||||
for i in Important Moderate Low
|
||||
do
|
||||
sec=$(yum updateinfo list security installed | grep $i | wc -l)
|
||||
echo "$i: $sec"
|
||||
done | column -t
|
||||
echo "+-------------------------+"
|
||||
```
|
||||
|
||||
给 `security-check.sh` 文件执行权限。
|
||||
|
||||
```
|
||||
$ chmod +x security-check.sh
|
||||
```
|
||||
|
||||
最后执行脚本统计。
|
||||
|
||||
```
|
||||
# sh /opt/scripts/security-check.sh
|
||||
|
||||
+-------------------------+
|
||||
|Security Advisories Count|
|
||||
+-------------------------+
|
||||
Important: 480
|
||||
Moderate: 410
|
||||
Low: 111
|
||||
+-------------------------+
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/check-installed-security-updates-on-redhat-rhel-and-centos-system/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.2daygeek.com/author/magesh/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://linux.cn/article-10938-1.html
|
||||
[2]: https://www.2daygeek.com/install-security-updates-on-redhat-rhel-centos-system/
|
||||
@@ -0,0 +1,72 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11026-1.html)
|
||||
[#]: subject: (How to navigate the Kubernetes learning curve)
|
||||
[#]: via: (https://opensource.com/article/19/6/kubernetes-learning-curve)
|
||||
[#]: author: (Scott McCarty https://opensource.com/users/fatherlinux/users/fatherlinux)
|
||||
|
||||
如何跨越 Kubernetes 学习曲线
|
||||
======
|
||||
|
||||
> Kubernetes 就像一辆翻斗车。它非常适合解决它所针对的问题,但你必须首先掌握其学习曲线。
|
||||
|
||||

|
||||
|
||||
在[为什么说 Kubernetes 是一辆翻斗车][2]中,我谈到了一个工具如何优雅地解决它所设计用来解决的问题 —— 只是你要学会如何使用它。在本系列的第 2 部分中,我将更深入地了解 Kubernetes 的学习曲线。
|
||||
|
||||
[Kubernetes][3] 的旅程通常从在一台主机上运行一个容器开始。你可以快速了解运行新版本软件的难易程度,与其他人分享该软件的难易程度,以及对于这些用户按照你预期方式运行它的难易程度。
|
||||
|
||||
但是你需要:
|
||||
|
||||
* 两个容器
|
||||
* 两个主机
|
||||
|
||||
使用容器在端口 80 上启动一个 Web 服务器很容易,但是当你需要在端口 80 上启动第二个容器时会发生什么?当你构建生产环境时,需要容器化 Web 服务器在发生故障时转移到第二个主机时会发生什么?在任何一种情况下,这个答案简单来说就是你必须采用容器编排。
|
||||
|
||||
当你开始处理两个容器或两个主机问题时,你将不可避免地引入了复杂性,因此,这就是一个学习曲线。这个两个服务(容器的更通用说法)或两个主机的问题已经存在了很长时间,并且由此带来了复杂性。
|
||||
|
||||
从历史上看,这将涉及负载均衡、集群软件甚至集群文件系统。每个服务的配置逻辑都嵌入在每个系统(负载均衡、集群软件和文件系统)中。在负载平衡器后运行 60 或 70 个集群的服务是复杂的。添加另一个新服务也很复杂。更糟糕的是,撤下服务简直是一场噩梦。回想起我对生产环境中的 MySQL 和 Apache 服务器进行故障排除的日子,这些服务器的逻辑嵌入在三、四个或五个不同的地方,所有这些都采用不同的格式,让我头疼不已。
|
||||
|
||||
Kubernetes 使用一个软件优雅地解决了所有这些问题:
|
||||
|
||||
1. 两项服务(容器):✅
|
||||
2. 两台服务器(高可用性):✅
|
||||
3. 单一配置来源:✅
|
||||
4. 标准配置格式:✅
|
||||
5. 网络:✅
|
||||
6. 储存:✅
|
||||
7. 依赖关系(什么服务与哪些数据库对应):✅
|
||||
8. 易于配置:✅
|
||||
9. 轻松取消配置:✅(也许是 Kubernetes **最**强大的部分)
|
||||
|
||||
等等,这样初看起来 Kubernetes 非常优雅、非常强大。 **没错。**你可以在 Kubernetes 中建模一整个微型 IT 世界。
|
||||
|
||||
![Kubernetes business model][4]
|
||||
|
||||
所以,是的,就像开始使用巨型翻斗车(或任何专业设备)时,有一个学习曲线。使用 Kubernetes 还有一个学习曲线,但它值得,因为你可以用一个工具解决这么多问题。如果你对学习曲线感到担忧,请仔细考虑 IT 基础架构中的所有底层网络、存储和安全问题,并设想一下今天的解决方案 —— 这并不容易。特别是当你越来越快地引入越来越多的服务时。速度是当今的目标,因此要特别考虑配置和取消配置问题。
|
||||
|
||||
但是,不要混淆了建造或配置 Kubernetes 的学习曲线(为你的翻斗车挑选合适的挡泥板可能很难,LOL)和使用它的学习曲线。学习用如此多的不同层次(容器引擎、日志记录、监控、服务网格、存储、网络)的技术来建立自己的 Kubernetes 有很多不同的选择,还有每六个月维护每个组件的更新选择,这可能不值得投资 —— 但学会使用它绝对是值得的。
|
||||
|
||||
我每天都与 Kubernetes 和容器泡在一起,即使这样我都很难跟踪几乎每天都在宣布的所有重大新项目。 但是,每一天我都对使用单一工具来模拟整个 IT 多个方面的运营优势感到兴奋。此外,记住 Kubernetes 已经成熟了很多,并将继续发展下去。与之前的 Linux 和 OpenStack 一样,每一层的接口和事实上的项目都将成熟并变得更容易选择。
|
||||
|
||||
在本系列的第三篇文章中,我将深入挖掘你在驾驶 Kubernetes “卡车”之前需要了解的内容。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/kubernetes-learning-curve
|
||||
|
||||
作者:[Scott McCarty][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/fatherlinux/users/fatherlinux
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/dumptruck_car_vehicle_storage_container_road.jpg?itok=TWK0CbX_ (Dump truck rounding a turn in the road)
|
||||
[2]: https://linux.cn/article-11011-1.html
|
||||
[3]: https://kubernetes.io/
|
||||
[4]: https://opensource.com/sites/default/files/uploads/developer_native_experience_-_mapped_to_traditional_1.png (Kubernetes business model)
|
||||
@@ -0,0 +1,99 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (hopefully2333)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11035-1.html)
|
||||
[#]: subject: (Cisco to buy IoT security, management firm Sentryo)
|
||||
[#]: via: (https://www.networkworld.com/article/3400847/cisco-to-buy-iot-security-management-firm-sentryo.html)
|
||||
[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/)
|
||||
|
||||
思科收购了物联网安全管理公司 Sentryo
|
||||
======
|
||||
> 买下 Sentryo 将给思科在工业物联网的异常和实时威胁检测两方面予以支持。
|
||||
|
||||
![IDG Worldwide][1]
|
||||
|
||||
为了扩展自己的物联网安全管理产品,思科计划收购 Sentryo,这是一家总部位于法国的公司,Sentryo 为工业物联网提供异常检测和实时威胁检测。
|
||||
|
||||
Sentryo 成立于 2014 年,产品包括 ICS CyberVision(一种用于资产库存、网络监控和威胁情报的平台)以及 CyberVision 网络边界传感器,这用于分析网络流量。
|
||||
|
||||
**更多关于物联网的信息:**
|
||||
|
||||
* [什么是物联网?物联网如何运行?][4]
|
||||
* [什么是边缘计算,这会如何改变我们的网络?][5]
|
||||
* [最强的物联网公司][6]
|
||||
* [10 个值得关注的热门物联网创业公司][7]
|
||||
* [在物联网领域赚钱的六种方法][8]
|
||||
* [什么是数字双胞胎技术? [以及它为什么重要]][9]
|
||||
* [区块链,以服务为中心的网络是物联网成功的关键][10]
|
||||
* [物联网以网络和安全作为基础][11]
|
||||
* [构建完整的物联网网络必须优先完成][12]
|
||||
* [什么是工业物联网?[为什么风险如此之高]][13]
|
||||
|
||||
“我们通过思科的 IOx 应用框架将 Sentryo 的边缘传感器和我们的工业网络硬件相结合”,思科企业发展和思科投资的副总裁 Rob Salvagno 在一篇关于计划收购的博客中写道。
|
||||
|
||||
“我们相信连接是物联网项目的基础,通过释放网络的力量,我们可以大大提高运作的效率并发现新的商业机会。随着 Sentryo 的加入,思科可以为系统控制工程师提供更加深入的资产可见度,以此来对系统进行优化,检测异常并保护他们的网络。”
|
||||
|
||||
Gartner 对 Sentryo 的系统写道:“ICS CyberVision 产品以其所有 OT 用户都能理解的方式提供对其客户 OT 网络的可视性,而不仅仅是 IT 技术人员。随着黑客和监管机构越来越关注工业控制系统,一个组织的 OT 拥有完整的可见性是至关重要的一件事。很多的 OT 网络不仅在地理上位置分散,而且也很复杂,由成千上万的组件组成。”
|
||||
|
||||
Frost & Sullivan 的工业分析师 Nandini Natarajan 表示,Sentryo 的 ICS CyberVision 让企业能够确保其工业运作的连续性、动态弹性和安全性,并以此预防可能的网络攻击。“它将使用标签形式的独特的 ‘通用 OT 语言’ 来自动描述资产和通信流程,以纯文本的方式描述每个资产在做什么。ICS CyberVision 可以让任何人都能立刻查看一台设备的类别和行为;它利用人工智能算法提供很多不同的分析视图,来让用户深入了解到一个典型的工业控制系统可以产生多么庞大的数据。Sentryo 可以轻松查看重要或相关的信息。”
|
||||
|
||||
Natarajan 表示,除此之外,Sentryo 的平台使用深度数据包检测(DPI)从工业设备之间的通信数据包里提取信息。DPI 引擎通过边缘计算架构进行部署,它可以运行在 Sentryo 传感器设备上,也可以在已经安装好的网络设备上运行。因此,Sentryo 可以将可见性和网络安全特性嵌入进工业网络中,而非部署带外监控网络。
|
||||
|
||||
Sentryo 的技术将扩大思科在物联网上的总体计划。在今年一月,思科推出了一整套的交换机、软件、开发工具和蓝图,这些东西将用于把物联网、基于意图联网的工业网络、传统信息安全、传统信息监控、应用开发支持融为一体。
|
||||
|
||||
这个新平台可以通过思科的 DNA 中心进行管理,让客户能将他们的物联网、工业网络控制和他们的商业 IT 世界融为一体。
|
||||
|
||||
DNA 中心是思科用于企业网络的中央管理工具,具有自动化、确保设置、结构配置、基于策略进行分割的功能。它也是该公司 IBN 计划的核心,用于主动向客户提供动态自动化实施网络和策略变更的能力,并在这个过程中确保数据的交付。IoT Field Network Director 是管理思科工业、连接网格路由器和终端的多服务网络的软件。
|
||||
|
||||
思科物联网业务部的高级副总裁兼总经理 Liz Centoni 表示,公司希望 Sentryo 的技术能以多种方式帮助物联网客户:
|
||||
|
||||
支持网络的被动 DPI 功能,这用于发现 IOT 和 OT 设备,并且在设备和系统之间建立起通信模式。Sentryo 的传感器可以在思科的 IOx 框架里进行本地部署,并且可以内置到这些设备运行的工业网络中,而不是添加额外的硬件。
|
||||
|
||||
随着设备识别和通信模式的建立,思科将把 DNA 中心和身份识别服务引擎(ISE)集成到一起,以便客户能够很轻松地定义分割策略。这种集成将使 OT 团队能够利用 IT 安全团队的专业知识来保护他们的环境,而不会对运营的流程造成风险。
|
||||
|
||||
由于这些物联网设备缺乏现代嵌入式软件和安全功能,网络分段将成为允许运作设备向合法系统进行通信的关键技术,并降低像我们看见的 WannaCry 和 Norsk Hydro 那样网络安全事件的风险。
|
||||
|
||||
据 Crunchbase 称,Sentryo 的每年预计收入为 350 万美元,与 Cymmetria、Team8 和 Indegy 的竞争最为激烈。此次收购预期将在思科 2020 财年的第一季度 - 2019 年 10 月 26 日 - 结束前完成。思科并未详细披露此次收购的财务细节。
|
||||
|
||||
Sentryo 是思科今年的第二次收购。思科在今年一月收购了 Singularity 公司的网络分析技术。在 2018 年,思科收购了包含 Duo security software 在内的 6 家公司。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3400847/cisco-to-buy-iot-security-management-firm-sentryo.html
|
||||
|
||||
作者:[Michael Cooney][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[hopefully2333](https://github.com/hopefully2333)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Michael-Cooney/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2018/09/nwan_019_iiot-100771131-large.jpg
|
||||
[2]: https://www.sentryo.net/
|
||||
[3]: https://www.networkworld.com/article/3243928/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html
|
||||
[4]: https://www.networkworld.com/article/3207535/internet-of-things/what-is-the-iot-how-the-internet-of-things-works.html
|
||||
[5]: https://www.networkworld.com/article/3224893/internet-of-things/what-is-edge-computing-and-how-it-s-changing-the-network.html
|
||||
[6]: https://www.networkworld.com/article/2287045/internet-of-things/wireless-153629-10-most-powerful-internet-of-things-companies.html
|
||||
[7]: https://www.networkworld.com/article/3270961/internet-of-things/10-hot-iot-startups-to-watch.html
|
||||
[8]: https://www.networkworld.com/article/3279346/internet-of-things/the-6-ways-to-make-money-in-iot.html
|
||||
[9]: https://www.networkworld.com/article/3280225/internet-of-things/what-is-digital-twin-technology-and-why-it-matters.html
|
||||
[10]: https://www.networkworld.com/article/3276313/internet-of-things/blockchain-service-centric-networking-key-to-iot-success.html
|
||||
[11]: https://www.networkworld.com/article/3269736/internet-of-things/getting-grounded-in-iot-networking-and-security.html
|
||||
[12]: https://www.networkworld.com/article/3276304/internet-of-things/building-iot-ready-networks-must-become-a-priority.html
|
||||
[13]: https://www.networkworld.com/article/3243928/internet-of-things/what-is-the-industrial-iot-and-why-the-stakes-are-so-high.html
|
||||
[14]: https://blogs.cisco.com/news/cisco-industrial-iot-news
|
||||
[15]: https://www.globenewswire.com/news-release/2018/06/28/1531119/0/en/Sentryo-Named-a-Cool-Vendor-by-Gartner.html
|
||||
[16]: https://www.linkedin.com/pulse/industrial-internet-things-iiot-decoded-nandini-natarajan/
|
||||
[17]: https://pluralsight.pxf.io/c/321564/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fpaths%2Fcertified-information-systems-security-professional-cisspr
|
||||
[18]: https://www.cisco.com/c/dam/en_us/solutions/iot/ihs-report.pdf
|
||||
[19]: https://www.networkworld.com/article/3336454/cisco-goes-after-industrial-iot.html
|
||||
[20]: https://www.networkworld.com/article/3202699/what-is-intent-based-networking.html
|
||||
[21]: https://blogs.cisco.com/news/securing-the-internet-of-things-cisco-announces-intent-to-acquire-sentryo
|
||||
[22]: https://blogs.cisco.com/security/talos/wannacry
|
||||
[23]: https://www.securityweek.com/norsk-hydro-may-have-lost-40m-first-week-after-cyberattack
|
||||
[24]: https://www.crunchbase.com/organization/sentryo#section-web-traffic-by-similarweb
|
||||
[25]: https://www.facebook.com/NetworkWorld/
|
||||
[26]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,262 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Modrisco)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10986-1.html)
|
||||
[#]: subject: (How Linux can help with your spelling)
|
||||
[#]: via: (https://www.networkworld.com/article/3400942/how-linux-can-help-with-your-spelling.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
如何用 Linux 帮助你拼写
|
||||
======
|
||||
|
||||
> 无论你是纠结一个难以理解的单词,还是在将报告发给老板之前再检查一遍,Linux 都可以帮助你解决拼写问题。
|
||||
|
||||

|
||||
|
||||
Linux 为数据分析和自动化提供了各种工具,它也帮助我们解决了一个一直都在纠结的问题 —— 拼写!无论在写每周报告时努力拼出一个单词,还是在提交商业计划书之前想要借助计算机的“眼睛”来找出你的拼写错误。现在我们来看一下它是如何帮助你的。
|
||||
|
||||
### look
|
||||
|
||||
`look` 是其中一款工具。如果你知道一个单词的开头,你就可以用这个命令来获取以这些字母开头的单词列表。除非提供了替代词源,否则 `look` 将使用 `/usr/share/dict/words` 中的内容来为你标识单词。这个文件有数十万个单词,可以满足我们日常使用的大多数英语单词的需要,但是它可能不包含我们计算机领域中的一些人倾向于使用的更加生僻的单词,如 zettabyte。
|
||||
|
||||
`look` 命令的语法非常简单。输入 `look word` ,它将遍历单词文件中的所有单词并找到匹配项。
|
||||
|
||||
```
|
||||
$ look amelio
|
||||
ameliorable
|
||||
ameliorableness
|
||||
ameliorant
|
||||
ameliorate
|
||||
ameliorated
|
||||
ameliorates
|
||||
ameliorating
|
||||
amelioration
|
||||
ameliorations
|
||||
ameliorativ
|
||||
ameliorative
|
||||
amelioratively
|
||||
ameliorator
|
||||
amelioratory
|
||||
```
|
||||
|
||||
如果你遇到系统中单词列表中未包含的单词,将无法获得任何输出。
|
||||
|
||||
```
|
||||
$ look zetta
|
||||
$
|
||||
```
|
||||
|
||||
如果你没有看到你所希望出现的单词,也不要绝望。你可以在你的单词文件中添加单词,甚至引用一个完全不同的单词列表,在网上找一个或者干脆自己创建一个。你甚至不必将添加的单词放在按字母顺序排列的正确位置;只需将其添加到文件的末尾即可。但是,你必须以 root 用户身份执行此操作。例如(要注意 `>>`!):
|
||||
|
||||
```
|
||||
# echo “zettabyte” >> /usr/share/dict/words
|
||||
```
|
||||
|
||||
当使用不同的单词列表时,例如这个例子中的 “jargon” ,你只需要添加文件的名称。如果不采用默认文件时,请使用完整路径。
|
||||
|
||||
```
|
||||
$ look nybble /usr/share/dict/jargon
|
||||
nybble
|
||||
nybbles
|
||||
```
|
||||
|
||||
`look` 命令大小写不敏感,因此你不必关心要查找的单词是否应该大写。
|
||||
|
||||
```
|
||||
$ look zet
|
||||
ZETA
|
||||
Zeta
|
||||
zeta
|
||||
zetacism
|
||||
Zetana
|
||||
zetas
|
||||
Zetes
|
||||
zetetic
|
||||
Zethar
|
||||
Zethus
|
||||
Zetland
|
||||
Zetta
|
||||
```
|
||||
|
||||
当然,不是所有的单词列表都是一样的。一些 Linux 发行版在单词文件中提供了*多得多*的内容。你的文件中可能有十万或者更多倍的单词。
|
||||
|
||||
在我的一个 Linux 系统中:
|
||||
|
||||
```
|
||||
$ wc -l /usr/share/dict/words
|
||||
102402 /usr/share/dict/words
|
||||
```
|
||||
|
||||
在另一个系统中:
|
||||
|
||||
```
|
||||
$ wc -l /usr/share/dict/words
|
||||
479828 /usr/share/dict/words
|
||||
```
|
||||
|
||||
请记住,`look` 命令只适用于通过单词开头查找,但如果你不想从单词的开头查找,还可以使用其他选项。
|
||||
|
||||
### grep
|
||||
|
||||
我们深爱的 `grep` 命令像其他工具一样可以从一个单词文件中选出单词。如果你正在找以某些字母开头或结尾的单词,使用 `grep` 命令是自然而然的事情。它可以通过单词的开头、结尾或中间部分来匹配单词。系统中的单词文件可以像使用 `look` 命令时在 `grep` 命令中轻松使用。不过唯一的缺点是你需要指定文件,这一点与 `look` 不尽相同。
|
||||
|
||||
在单词的开头前加上 `^`:
|
||||
|
||||
```
|
||||
$ grep ^terra /usr/share/dict/words
|
||||
terrace
|
||||
terrace's
|
||||
terraced
|
||||
terraces
|
||||
terracing
|
||||
terrain
|
||||
terrain's
|
||||
terrains
|
||||
terrapin
|
||||
terrapin's
|
||||
terrapins
|
||||
terraria
|
||||
terrarium
|
||||
terrarium's
|
||||
terrariums
|
||||
```
|
||||
|
||||
在单词的结尾后加上 `$`:
|
||||
|
||||
```
|
||||
$ grep bytes$ /usr/share/dict/words
|
||||
bytes
|
||||
gigabytes
|
||||
kilobytes
|
||||
megabytes
|
||||
terabytes
|
||||
```
|
||||
|
||||
使用 `grep` 时,你需要考虑大小写,不过 `grep` 命令也提供了一些选项。
|
||||
|
||||
```
|
||||
$ grep ^[Zz]et /usr/share/dict/words
|
||||
Zeta
|
||||
zeta
|
||||
zetacism
|
||||
Zetana
|
||||
zetas
|
||||
Zetes
|
||||
zetetic
|
||||
Zethar
|
||||
Zethus
|
||||
Zetland
|
||||
Zetta
|
||||
zettabyte
|
||||
```
|
||||
|
||||
为单词文件添加软连接能使这种搜索方式更加便捷:
|
||||
|
||||
```
|
||||
$ ln -s /usr/share/dict/words words
|
||||
$ grep ^[Zz]et words
|
||||
Zeta
|
||||
zeta
|
||||
zetacism
|
||||
Zetana
|
||||
zetas
|
||||
Zetes
|
||||
zetetic
|
||||
Zethar
|
||||
Zethus
|
||||
Zetland
|
||||
Zetta
|
||||
zettabytye
|
||||
```
|
||||
|
||||
### aspell
|
||||
|
||||
`aspell` 命令提供了一种不同的方式。它提供了一种方法来检查你提供给它的任何文件或文本的拼写。你可以通过管道将文本传递给它,然后它会告诉你哪些单词看起来有拼写错误。如果所有单词都拼写正确,则不会有任何输出。
|
||||
|
||||
```
|
||||
$ echo Did I mispell that? | aspell list
|
||||
mispell
|
||||
$ echo I can hardly wait to try out aspell | aspell list
|
||||
aspell
|
||||
$ echo Did I misspell anything? | aspell list
|
||||
$
|
||||
```
|
||||
|
||||
`list` 参数告诉 `aspell` 为标准输入单词提供拼写错误的单词列表。
|
||||
|
||||
你还可以使用 `aspell` 来定位和更正文本文件中的单词。如果它发现一个拼写错误的单词,它将为你提供一个相似(但拼写正确的)单词列表来替换这个单词,你也可以将该单词加入个人词库(`~/.aspell.en.pws`)并忽略拼写错误,或者完全中止进程(使文件保持处理前的状态)。
|
||||
|
||||
```
|
||||
$ aspell -c mytext
|
||||
```
|
||||
|
||||
一旦 `aspell` 发现一个单词出现了拼写错误,它将会为不正确的 “mispell” 提供一个选项列表:
|
||||
|
||||
```
|
||||
1) mi spell 6) misplay
|
||||
2) mi-spell 7) spell
|
||||
3) misspell 8) misapply
|
||||
4) Ispell 9) Aspell
|
||||
5) misspells 0) dispel
|
||||
i) Ignore I) Ignore all
|
||||
r) Replace R) Replace all
|
||||
a) Add l) Add Lower
|
||||
b) Abort x) Exit
|
||||
```
|
||||
|
||||
请注意,备选单词和拼写是数字编号的,而其他选项是由字母选项表示的。你可以选择备选拼写中的一项或者自己输入替换项。“Abort” 选项将使文件保持不变,即使你已经为某些单词选择了替换。你选择添加的单词将被插入到本地单词文件中(例如 `~/.aspell.en.pws`)。
|
||||
|
||||
#### 其他单词列表
|
||||
|
||||
厌倦了英语? `aspell` 命令可以在其他语言中使用,只要你添加了相关语言的单词列表。例如,在 Debian 系统中添加法语的词库,你可以这样做:
|
||||
|
||||
```
|
||||
$ sudo apt install aspell-fr
|
||||
```
|
||||
|
||||
这个新的词库文件会被安装为 `/usr/share/dict/French`。为了使用它,你只需要简单地告诉 `aspell` 你想要使用替换的单词列表:
|
||||
|
||||
```
|
||||
$ aspell --lang=fr -c mytext
|
||||
```
|
||||
|
||||
这种情况下,当 `aspell` 读到单词 “one” 时,你可能会看到下面的情况:
|
||||
|
||||
```
|
||||
1) once 6) orné
|
||||
2) onde 7) ne
|
||||
3) ondé 8) né
|
||||
4) onze 9) on
|
||||
5) orne 0) cône
|
||||
i) Ignore I) Ignore all
|
||||
r) Replace R) Replace all
|
||||
a) Add l) Add Lower
|
||||
b) Abort x) Exit
|
||||
```
|
||||
|
||||
你也可以从 [GNU 官网][3]获取其他语言的词库。
|
||||
|
||||
### 总结
|
||||
|
||||
即使你是全国拼字比赛的冠军,你可能偶尔也会需要一点拼写方面的帮助,哪怕只是为了找出你手滑打错的单词。`aspell` 工具,加上 `look` 和 `grep` 命令已经准备来助你一臂之力了。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3400942/how-linux-can-help-with-your-spelling.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Modrisco](https://github.com/Modrisco)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/06/linux-spelling-100798596-large.jpg
|
||||
[2]: https://www.youtube.com/playlist?list=PL7D2RMSmRO9J8OTpjFECi8DJiTQdd4hua
|
||||
[3]: ftp://ftp.gnu.org/gnu/aspell/dict/0index.html
|
||||
[4]: https://www.facebook.com/NetworkWorld/
|
||||
[5]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,74 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11036-1.html)
|
||||
[#]: subject: (Kubernetes basics: Learn how to drive first)
|
||||
[#]: via: (https://opensource.com/article/19/6/kubernetes-basics)
|
||||
[#]: author: (Scott McCarty https://opensource.com/users/fatherlinux/users/fatherlinux/users/fatherlinux)
|
||||
|
||||
Kubernetes 基础:首先学习如何使用
|
||||
======
|
||||
|
||||
> 不要被新项目分心,而是专注于取得你的 Kubernetes 翻斗车驾驶执照。
|
||||
|
||||
![Truck steering wheel and dash][1]
|
||||
|
||||
在本系列的前两篇文章中,我解释了为何 Kubernetes [像翻斗车][2],并且想要理解像 [Kubernetes][4](和翻斗车,起重机等)这样优雅、专业工具总是有[学习曲线][3]的。本文是下一步:学习如何驾驶。
|
||||
|
||||
最近,我在 Reddit 上看到了一个关于[重要的 Kubernetes 项目][5]的帖子。人们似乎很想知道他们应该学习如何开始使用 Kubernetes。“驾驶翻斗车的类比”有助于确保这个问题回到轨道上去。在这个帖子中的某个人提到,除非必要,你不应该运行自己的镜像仓库,所以人们开始逐渐接受驾驭 Kubernetes 而不是构建它的想法。
|
||||
|
||||
API 是 Kubernetes 的引擎和变速器。像翻斗车的方向盘、离合器、汽油和制动踏板一样,用于构建应用程序的 YAML 或 JSON 文件是机器的主要接口。当你第一次学习 Kubernetes 时,这应该是你的主要关注点。了解你的控制部件。不要分心于最新和最大的那些项目。当你刚学会开车时,不要尝试驾驶实验性的翻斗车。相反,请专注于基础知识。
|
||||
|
||||
### 定义状态和实际状态
|
||||
|
||||
首先,Kubernetes 遵循定义状态和实际状态的原则。
|
||||
|
||||
![Defined state and actual state][6]
|
||||
|
||||
人类(开发人员/系统管理员/运维人员)使用他们提交给 Kubernetes API 的 YAML/JSON 文件指定定义的状态。然后,Kubernetes 使用控制器来分析 YAML/JSON 中定义的新状态与集群中的实际状态之间的差异。
|
||||
|
||||
在上面的例子中,Replication Controller 可以看到用户指定的三个 pod 之间的差异,其中一个 pod 正在运行,并调度另外两个 Pod。如果你登录 Kubernetes 并手动杀死其中一个 Pod,它会不断启动另一个来替换它。在实际状态与定义的状态匹配之前,Kubernetes 不会停止。这是非常强大的。
|
||||
|
||||
### 原语
|
||||
|
||||
接下来,你需要了解可以在 Kubernetes 中指定的原语。
|
||||
|
||||
![Kubernetes primitives][7]
|
||||
|
||||
这些原语不仅仅有 Pod,还有<ruby>部署<rt>Deployment</rt></ruby>、<ruby>持久化卷声明<rt>Persistent Volume Claim</rt></ruby>、<ruby>服务<rt>Service</rt></ruby>,<ruby>路由<rt>route</rt></ruby>等。使用支持 Kubernetes 的平台 [OpenShift][8],你可以添加<ruby>构建<rt>build</rt></ruby>和 BuildConfig。你大概需要一天左右的时间来了解这些原语。你可以在你的用例变得更加复杂时再深入了解。
|
||||
|
||||
### 将原生开发者映射到传统 IT 环境
|
||||
|
||||
最后,考虑这该如何映射到你在传统 IT 环境中的操作。
|
||||
|
||||
![Mapping developer-native to traditional IT environments][9]
|
||||
|
||||
尽管是一个技术问题,但用户一直在尝试解决业务问题。从历史上看,我们使用诸如<ruby>剧本<rt>playbook</rt></ruby>之类的东西将业务逻辑与单一语言的 IT 系统绑定起来。对于运维人员来说,这很不错,但是当你尝试将其扩展到开发人员时,它会变得更加繁琐。
|
||||
|
||||
直到 Kubernete 出现之前,我们从未能够以原生开发者的方式真正同时指定一组 IT 系统应如何表现和交互。如果你考虑一下,我们正在使用在 Kubernetes 中编写的 YAML/JSON 文件以非常便携和声明的方式扩展了管理存储、网络和计算资源的能力,但它们总会映射到某处的“真实”资源。我们不必以开发者身份担心它。
|
||||
|
||||
因此,快放弃关注 Kubernetes 生态系统中的新项目,而是专注开始使用它。在下一篇文章中,我将分享一些可以帮助你使用 Kubernetes 的工具和工作流程。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/kubernetes-basics
|
||||
|
||||
作者:[Scott McCarty][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/fatherlinux/users/fatherlinux/users/fatherlinux
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/truck_steering_wheel_drive_car_kubernetes.jpg?itok=0TOzve80 (Truck steering wheel and dash)
|
||||
[2]: https://linux.cn/article-11011-1.html
|
||||
[3]: https://linux.cn/article-11026-1.html
|
||||
[4]: https://opensource.com/resources/what-is-kubernetes
|
||||
[5]: https://www.reddit.com/r/kubernetes/comments/bsoixc/what_are_the_essential_kubernetes_related/
|
||||
[6]: https://opensource.com/sites/default/files/uploads/defined_state_-_actual_state.png (Defined state and actual state)
|
||||
[7]: https://opensource.com/sites/default/files/uploads/new_primitives.png (Kubernetes primatives)
|
||||
[8]: https://www.openshift.com/
|
||||
[9]: https://opensource.com/sites/default/files/uploads/developer_native_experience_-_mapped_to_traditional.png (Mapping developer-native to traditional IT environments)
|
||||
68
published/201906/20190607 5 reasons to use Kubernetes.md
Normal file
68
published/201906/20190607 5 reasons to use Kubernetes.md
Normal file
@@ -0,0 +1,68 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10973-1.html)
|
||||
[#]: subject: (5 reasons to use Kubernetes)
|
||||
[#]: via: (https://opensource.com/article/19/6/reasons-kubernetes)
|
||||
[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh)
|
||||
|
||||
使用 Kubernetes 的 5 个理由
|
||||
======
|
||||
|
||||
> Kubernetes 解决了一些开发和运维团队每天关注的的常见问题。
|
||||
|
||||

|
||||
|
||||
[Kubernetes][2](K8S)是面向企业的开源容器编排工具的事实标准。它提供了应用部署、扩展、容器管理和其他功能,使企业能够通过容错能力快速优化硬件资源利用率并延长生产环境运行时间。该项目最初由谷歌开发,并将该项目捐赠给[云原生计算基金会][3](CNCF)。2018 年,它成为第一个从 CNCF [毕业][4]的项目。
|
||||
|
||||
这一切都很好,但它并不能解释为什么开发者和运维人员应该在 Kubernetes 上投入宝贵的时间和精力。Kubernetes 之所以如此有用,是因为它有助于开发者和运维人员迅速解决他们每天都在努力解决的问题。
|
||||
|
||||
以下是 Kubernetes 帮助开发者和运维人员解决他们最常见问题的五种能力。
|
||||
|
||||
### 1、厂商无关
|
||||
|
||||
许多公有云提供商不仅提供托管 Kubernetes 服务,还提供许多基于这些服务构建的云产品,来用于本地应用容器编排。由于与供应商无关,使运营商能够轻松、安全地设计、构建和管理多云和混合云平台,而不会有供应商锁定的风险。Kubernetes 还消除了运维团队对复杂的多云/混合云战略的担忧。
|
||||
|
||||
### 2、服务发现
|
||||
|
||||
为了开发微服务应用,Java 开发人员必须控制服务可用性(就应用是否可以提供服务而言),并确保服务持续存在,以响应客户端的请求,而没有任何例外。Kubernetes 的[服务发现功能][5]意味着开发人员不再需要自己管理这些东西。
|
||||
|
||||
### 3、触发
|
||||
|
||||
你的 DevOps 会如何在上千台虚拟机上部署多语言、云原生应用?理想情况下,开发和运维会在 bug 修复、功能增强、新功能、安全更新时触发部署。Kubernetes 的[部署功能][6]会自动化这个日常工作。更重要的时,它支持高级部署策略,例如[蓝绿部署和金丝雀部署][7]。
|
||||
|
||||
### 4、可伸缩性
|
||||
|
||||
自动扩展是处理云环境中大量工作负载所需的关键功能。通过构建容器平台,你可以为终端用户提高系统可靠性。[Kubernetes Horizontal Pod Autoscaler][8](HPA)允许一个集群增加或减少应用程序(或 Pod)的数量,以应对峰值流量或性能峰值,从而减少对意外系统中断的担忧。
|
||||
|
||||
### 5、容错性
|
||||
|
||||
在现代应用体系结构中,应考虑故障处理代码来控制意外错误并快速从中恢复。但是开发人员需要花费大量的时间和精力来模拟偶然的错误。Kubernetes 的 [ReplicaSet][9] 通过确保指定数量的 Pod 持续保持活动来帮助开发人员解决此问题。
|
||||
|
||||
### 结论
|
||||
|
||||
Kubernetes 使企业能够轻松、快速、安全地解决常见的开发和运维问题。它还提供其他好处,例如构建无缝的多云/混合云战略,节省基础架构成本以及加快产品上市时间。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/reasons-kubernetes
|
||||
|
||||
作者:[Daniel Oh][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/daniel-oh
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/ship_wheel_gear_devops_kubernetes.png?itok=xm4a74Kv
|
||||
[2]: https://opensource.com/resources/what-is-kubernetes
|
||||
[3]: https://www.cncf.io/projects/
|
||||
[4]: https://www.cncf.io/blog/2018/03/06/kubernetes-first-cncf-project-graduate/
|
||||
[5]: https://kubernetes.io/docs/concepts/services-networking/service/
|
||||
[6]: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
|
||||
[7]: https://opensource.com/article/17/5/colorful-deployments
|
||||
[8]: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
|
||||
[9]: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
|
||||
@@ -0,0 +1,82 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10965-1.html)
|
||||
[#]: subject: (An open source bionic leg, Python data pipeline, data breach detection, and more news)
|
||||
[#]: via: (https://opensource.com/article/19/6/news-june-8)
|
||||
[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
|
||||
|
||||
开源新闻:开源仿生腿、Python 数据管道、数据泄露检测
|
||||
======
|
||||
|
||||
> 了解过去两周来最大的开源头条新闻。
|
||||
|
||||
![][1]
|
||||
|
||||
在本期开源新闻综述中,我们将介绍一个开源仿生腿、一个新的开源医学影像组织,麦肯锡发布的首个开源软件,以及更多!
|
||||
|
||||
### 使用开源推进仿生学
|
||||
|
||||
我们这一代人从电视剧《六百万美元人》和《仿生女人》中学到了仿生学一词。让科幻小说(尽管基于事实)正在成为现实的,要归功于[由密歇根大学和 Shirley Ryan AbilityLab 设计][2]的假肢。
|
||||
|
||||
该腿采用简单、低成本的模块化设计,“旨在通过为仿生学领域的零碎研究工作提供统一的平台,提高患者的生活质量并加速科学进步”。根据首席设计师 Elliot Rouse 的说法,它将“使研究人员能够有效地解决与一系列的实验室和社区活动中控制仿生腿相关的挑战。”
|
||||
|
||||
你可以从[开源腿][3]网站了解有该腿的更多信息并下载该设计。
|
||||
|
||||
### 麦肯锡发布了一个用于构建产品级数据管道的 Python 库
|
||||
|
||||
咨询巨头麦肯锡公司最近发布了其[第一个开源工具][4],名为 Kedro,它是一个用于创建机器学习和数据管道的 Python 库。
|
||||
|
||||
Kedro 使得“管理大型工作流程更加容易,并确保整个项目的代码质量始终如一”,产品经理 Yetunde Dada 说。虽然它最初是作为一种专有的工具,但麦肯锡开源了 Kedro,因此“客户可以在我们离开项目后使用它 —— 这是我们回馈的方式,”工程师 Nikolaos Tsaousis 说。
|
||||
|
||||
如果你有兴趣了解一下,可以从 GitHub 上获取 [Kedro 的源代码][5]。
|
||||
|
||||
### 新联盟推进开源医学成像
|
||||
|
||||
一组专家和患者倡导者聚集在一起组成了[开源成像联盟][6]。该联盟旨在“通过数字成像和机器学习帮助推进特发性肺纤维化和其他间质性肺病的诊断。”
|
||||
|
||||
根据联盟执行董事 Elizabeth Estes 的说法,该项目旨在“协作加速诊断,帮助预后处置,最终让医生更有效地治疗患者”。为此,他们正在组织和分享“来自患者的 15,000 个匿名图像扫描和临床数据,这将作为机器学习程序的输入数据来开发算法。”
|
||||
|
||||
### Mozilla 发布了一种简单易用的方法,以确定你是否遭受过数据泄露
|
||||
|
||||
向不那么精通软件的人解释安全性始终是一项挑战,无论你的技能水平如何,都很难监控你的风险。Mozilla 发布了 [Firefox Monitor][7],其数据由 [Have I Been Pwned][8] 提供,它是一种查看你的任何电子邮件是否出现在重大数据泄露事件中的简单方式。你可以输入电子邮件逐个搜索,或注册他们的服务以便将来通知你。
|
||||
|
||||
该网站还提供了大量有用的教程,用于了解黑客如何做的,数据泄露后如何处理以及如何创建强密码。请务必将网站加入书签,以防家人要求你在假日期间提供建议。
|
||||
|
||||
### 其它新闻
|
||||
|
||||
* [想要一款去谷歌化的 Android?把你的手机发送给这个人][9]
|
||||
* [CockroachDB 发行版使用了非 OSI 批准的许可证,但仍然保持开源][10]
|
||||
* [基础设施自动化公司 Chef 承诺开源][11]
|
||||
* [俄罗斯的 Windows 替代品将获得安全升级][12]
|
||||
* [使用此代码在几分钟内从 Medium 切换到你自己的博客][13]
|
||||
* [开源推进联盟宣布与台湾自由软件协会建立新合作伙伴关系][14]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/news-june-8
|
||||
|
||||
作者:[Scott Nesbitt][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/scottnesbitt
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/weekly_news_roundup_tv.png?itok=B6PM4S1i
|
||||
[2]: https://news.umich.edu/open-source-bionic-leg-first-of-its-kind-platform-aims-to-rapidly-advance-prosthetics/
|
||||
[3]: https://opensourceleg.com/
|
||||
[4]: https://www.information-age.com/kedro-mckinseys-open-source-software-tool-123482991/
|
||||
[5]: https://github.com/quantumblacklabs/kedro
|
||||
[6]: https://pulmonaryfibrosisnews.com/2019/05/31/international-open-source-imaging-consortium-osic-launched-to-advance-ipf-diagnosis/
|
||||
[7]: https://monitor.firefox.com/
|
||||
[8]: https://haveibeenpwned.com/
|
||||
[9]: https://fossbytes.com/want-a-google-free-android-send-your-phone-to-this-guy/
|
||||
[10]: https://www.cockroachlabs.com/blog/oss-relicensing-cockroachdb/
|
||||
[11]: https://www.infoq.com/news/2019/05/chef-open-source/
|
||||
[12]: https://www.nextgov.com/cybersecurity/2019/05/russias-would-be-windows-replacement-gets-security-upgrade/157330/
|
||||
[13]: https://github.com/mathieudutour/medium-to-own-blog
|
||||
[14]: https://opensource.org/node/994
|
||||
@@ -0,0 +1,76 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (murphyzhao)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11027-1.html)
|
||||
[#]: subject: (Applications for writing Markdown)
|
||||
[#]: via: (https://fedoramagazine.org/applications-for-writing-markdown/)
|
||||
[#]: author: (Ryan Lerch https://fedoramagazine.org/author/ryanlerch/)
|
||||
|
||||
三个在 Fedora 平台上撰写 Markdown 的软件
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
Markdown 是一种轻量级标记语言,可以在添加格式后以纯文本格式查看时依然保持可读性。Markdown(和 Markdown 衍生物)被广泛用作 GitHub 和 pagure 等服务上格式化文档的主要形式。根据其设计,可以在文本编辑器中轻松创建和编辑 Markdown,但是,有许多编辑器可以提供 Markdown 标记的格式化预览,或提供 Markdown 语法高亮显示。
|
||||
|
||||
本文介绍了针对 Fedora 平台的 3 个桌面应用程序,以帮助编辑 Markdown。
|
||||
|
||||
### UberWriter
|
||||
|
||||
[UberWriter][2] 是一个小巧的 Markdown 编辑器和预览器,允许你以文本方式编辑,并预览渲染的文档。
|
||||
|
||||
![][3]
|
||||
|
||||
该编辑器本身具有内置的内联预览,因此标记为粗体的文本以粗体显示。编辑器还提供图像、公式、脚注等标记的内联预览。按住 `Ctrl` 键单击其中的一个标记可以即时预览要显示的元素。
|
||||
|
||||
除了编辑器功能外,UberWriter 还具有全屏模式和聚焦模式,有助于最大限度地减少干扰。焦点模式将以灰色显示除当前段落以外的所有内容,以帮助你专注于文档中当前元素。
|
||||
|
||||
从第三方 Flathub 存储库安装 UberWriter 到 Fedora 平台。在将系统[设置为从 Flathub 安装][4]后,可以直接从 Software 应用程序中安装它。
|
||||
|
||||
### Marker
|
||||
|
||||
Marker 是一个 Markdown 编辑器,它提供了一个简单的文本编辑器来编写 Markdown,并提供渲染文档的实时预览。界面采用分屏设计,左侧为编辑器,右侧为实时预览。
|
||||
|
||||
![][5]
|
||||
|
||||
此外,Marker 允许你以各种格式导出文档,包括 HTML、PDF 和开放文档格式(ODF)。
|
||||
|
||||
从第三方 Flathub 存储库安装 Marker 到 Fedora 平台。在将系统[设置为从 Flathub 安装][4]后,可以直接从 Software 应用程序中安装它。
|
||||
|
||||
### Ghostwriter
|
||||
|
||||
以前的编辑更专注于最小的用户体验,Ghostwriter 提供了更多的功能和选项。Ghostwriter 提供了一个文本编辑器,当你以 Markdown 格式书写时,编辑器将 Markdown 部分样式化。粗体标记文本显示为粗体,标题标记显示为较大的字体,以帮助编写 Markdown 标记。
|
||||
|
||||
![][6]
|
||||
|
||||
它还提供了一个分屏,包含渲染文档的实时更新预览。
|
||||
|
||||
![][7]
|
||||
|
||||
Ghostwriter 还包括一系列其他功能,包括能够选择渲染预览的 Markdown 风格,以及用于渲染预览的样式表。
|
||||
|
||||
此外,它还提供了一个格式菜单(和键盘快捷键)来插入一些频繁的 Markdown 标记,如粗体、项目符号和斜体。
|
||||
|
||||
从第三方 Flathub 存储库安装 Ghostwriter 到 Fedora 平台。在将系统[设置为从 Flathub 安装][4]后,可以直接从 Software 应用程序中安装它。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/applications-for-writing-markdown/
|
||||
|
||||
作者:[Ryan Lerch][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[murphyzhao](https://github.com/murphyzhao)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/ryanlerch/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/markdownapps.png-816x345.jpg
|
||||
[2]: https://uberwriter.github.io/uberwriter/#1
|
||||
[3]: https://fedoramagazine.org/wp-content/uploads/2019/06/uberwriter-editor-1.png
|
||||
[4]: https://fedoramagazine.org/install-flathub-apps-fedora/
|
||||
[5]: https://fedoramagazine.org/wp-content/uploads/2019/06/marker-screenshot-1024x500.png
|
||||
[6]: https://fedoramagazine.org/wp-content/uploads/2019/06/ghostwriter-1024x732.png
|
||||
[7]: https://fedoramagazine.org/wp-content/uploads/2019/06/ghostwriter2-1024x566.png
|
||||
@@ -0,0 +1,146 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10983-1.html)
|
||||
[#]: subject: (Expand And Unexpand Commands Tutorial With Examples)
|
||||
[#]: via: (https://www.ostechnix.com/expand-and-unexpand-commands-tutorial-with-examples/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
expand 与 unexpand 命令实例教程
|
||||
======
|
||||
|
||||
![Expand And Unexpand Commands Explained][1]
|
||||
|
||||
本指南通过实际的例子解释两个 Linux 命令,即 `expand` 和 `unexpand`。对于好奇的人,`expand` 和 `unexpand` 命令用于将文件中的 `TAB` 字符替换为空格,反之亦然。在 MS-DOS 中也有一个名为 `expand` 的命令,它用于解压压缩文件。但 Linux 的 `expand` 命令只是将 `TAB` 转换为空格。这两个命令是 GNU coreutils 包的一部分,由 David MacKenzie 编写。
|
||||
|
||||
为了演示,我将在本文使用名为 `ostechnix.txt` 的文本文件。下面给出的所有命令都在 Arch Linux 中进行测试。
|
||||
|
||||
### expand 命令示例
|
||||
|
||||
与我之前提到的一样,`expand` 命令使用空格替换文件中的 `TAB` 字符。
|
||||
|
||||
现在,让我们将 `ostechnix.txt` 中的 `TAB` 转换为空格,并将结果写入标准输出:
|
||||
|
||||
```
|
||||
$ expand ostechnix.txt
|
||||
```
|
||||
|
||||
如果你不想在标准输出中显示结果,只需将其写入另一个文件,如下所示。
|
||||
|
||||
```
|
||||
$ expand ostechnix.txt>output.txt
|
||||
```
|
||||
|
||||
我们还可以将标准输入中的 `TAB` 转换为空格。为此,只需运行 `expand` 命令而不带文件名:
|
||||
|
||||
```
|
||||
$ expand
|
||||
```
|
||||
|
||||
只需输入文本并按回车键就能将 `TAB` 转换为空格。按 `CTRL+C` 退出。
|
||||
|
||||
如果你不想转换非空白字符后的 `TAB`,请使用 `-i` 标记,如下所示。
|
||||
|
||||
```
|
||||
$ expand -i ostechnix.txt
|
||||
```
|
||||
|
||||
我们还可以设置每个 `TAB` 为指定数字的宽度,而不是 `8`(默认值)。
|
||||
|
||||
```
|
||||
$ expand -t=5 ostechnix.txt
|
||||
```
|
||||
|
||||
我们甚至可以使用逗号分隔指定多个 `TAB` 位置,如下所示。
|
||||
|
||||
```
|
||||
$ expand -t 5,10,15 ostechnix.txt
|
||||
```
|
||||
|
||||
或者,
|
||||
|
||||
```
|
||||
$ expand -t "5 10 15" ostechnix.txt
|
||||
```
|
||||
|
||||
有关更多详细信息,请参阅手册页。
|
||||
|
||||
```
|
||||
$ man expand
|
||||
```
|
||||
|
||||
### unexpand 命令示例
|
||||
|
||||
正如你可能已经猜到的那样,`unexpand` 命令将执行与 `expand` 命令相反的操作。即它会将空格转换为 `TAB`。让我向你展示一些例子,以了解如何使用 `unexpand` 命令。
|
||||
|
||||
要将文件中的空白(当然是空格)转换为 `TAB` 并将输出写入标准输出,请执行以下操作:
|
||||
|
||||
```
|
||||
$ unexpand ostechnix.txt
|
||||
```
|
||||
|
||||
如果要将输出写入文件而不是仅将其显示到标准输出,请使用以下命令:
|
||||
|
||||
```
|
||||
$ unexpand ostechnix.txt>output.txt
|
||||
```
|
||||
|
||||
从标准输出读取内容,将空格转换为制表符:
|
||||
|
||||
```
|
||||
$ unexpand
|
||||
```
|
||||
|
||||
默认情况下,`unexpand` 命令仅转换初始的空格。如果你想转换所有空格而不是只是一行开头的空格,请使用 `-a` 标志:
|
||||
|
||||
```
|
||||
$ unexpand -a ostechnix.txt
|
||||
```
|
||||
|
||||
仅转换一行开头的空格(请注意它会覆盖 `-a`):
|
||||
|
||||
```
|
||||
$ unexpand --first-only ostechnix.txt
|
||||
```
|
||||
|
||||
使多少个空格替换成一个 `TAB`,而不是 `8`(会启用 `-a`):
|
||||
|
||||
```
|
||||
$ unexpand -t 5 ostechnix.txt
|
||||
```
|
||||
|
||||
相似地,我们可以使用逗号分隔指定多个 `TAB` 的位置。
|
||||
|
||||
```
|
||||
$ unexpand -t 5,10,15 ostechnix.txt
|
||||
```
|
||||
|
||||
或者,
|
||||
|
||||
```
|
||||
$ unexpand -t "5 10 15" ostechnix.txt
|
||||
```
|
||||
|
||||
有关更多详细信息,请参阅手册页。
|
||||
|
||||
```
|
||||
$ man unexpand
|
||||
```
|
||||
|
||||
在处理大量文件时,`expand` 和 `unexpand` 命令对于用空格替换不需要的 `TAB` 时非常有用,反之亦然。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/expand-and-unexpand-commands-tutorial-with-examples/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2019/05/Expand-And-Unexpand-Commands-720x340.png
|
||||
@@ -0,0 +1,85 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10988-1.html)
|
||||
[#]: subject: (Graviton: A Minimalist Open Source Code Editor)
|
||||
[#]: via: (https://itsfoss.com/graviton-code-editor/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
Graviton:极简的开源代码编辑器
|
||||
======
|
||||
|
||||
[Graviton][1]是一款开发中的自由开源的跨平台代码编辑器。他的开发者 16 岁的 Marc Espin 强调说,它是一个“极简”的代码编辑器。我不确定这点,但它确实有一个清爽的用户界面,就像其他的[现代代码编辑器,如 Atom][2]。
|
||||
|
||||
![Graviton Code Editor Interface][3]
|
||||
|
||||
开发者还将其称为轻量级代码编辑器,尽管 Graviton 基于 [Electron][4]。
|
||||
|
||||
Graviton 拥有你在任何标准代码编辑器中所期望的功能,如语法高亮、自动补全等。由于 Graviton 仍处于测试阶段,因此未来版本中将添加更多功能。
|
||||
|
||||
![Graviton Code Editor with Syntax Highlighting][5]
|
||||
|
||||
### Graviton 代码编辑器的特性
|
||||
|
||||
Graviton 一些值得一说的特性有:
|
||||
|
||||
* 使用 [CodeMirrorJS][6] 为多种编程语言提供语法高亮
|
||||
* 自动补全
|
||||
* 支持插件和主题。
|
||||
* 提供英语、西班牙语和一些其他欧洲语言。
|
||||
* 适用于 Linux、Windows 和 macOS。
|
||||
|
||||
我快速看来一下 Graviton,它可能不像 [VS Code][7] 或 [Brackets][8] 那样功能丰富,但对于一些简单的代码编辑来说,它还算不错的工具。
|
||||
|
||||
### 下载并安装 Graviton
|
||||
|
||||
![Graviton Code Editor][9]
|
||||
|
||||
如上所述,Graviton 是一个可用于 Linux、Windows 和 macOS 的跨平台代码编辑器。它仍处于测试阶段,这意味着将来会添加更多功能,并且你可能会遇到一些 bug。
|
||||
|
||||
你可以在其发布页面上找到最新版本的 Graviton。Debian 和 [Ubuntu 用户可以使用 .deb 安装][10]。它已提供 [AppImage][11],以便可以在其他发行版中使用它。DMG 和 EXE 文件也分别可用于 macOS 和 Windows。
|
||||
|
||||
- [下载 Graviton][12]
|
||||
|
||||
如果你有兴趣,你可以在 GitHub 仓库中找到 Graviton 的源代码:
|
||||
|
||||
- [GitHub 中 Graviton 的源码][13]
|
||||
|
||||
如果你决定使用 Graviton 并发现了一些问题,请在[此处][14]写一份错误报告。如果你使用 GitHub,你可能想为 Graviton 项目加星。这可以提高开发者的士气,因为他知道有更多的用户欣赏他的努力。
|
||||
|
||||
如果你看到现在,我相信你了解[如何从源码安装软件][16]
|
||||
|
||||
### 写在最后
|
||||
|
||||
有时,简单本身就成了一个特性,而 Graviton 专注于极简可以帮助它在已经拥挤的代码编辑器世界中获取一席之地。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/graviton-code-editor/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://graviton.ml/
|
||||
[2]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/
|
||||
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/graviton-code-editor-interface.jpg?resize=800%2C571&ssl=1
|
||||
[4]: https://electronjs.org/
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/graviton-code-editor-interface-2.jpg?resize=800%2C522&ssl=1
|
||||
[6]: https://codemirror.net/
|
||||
[7]: https://itsfoss.com/install-visual-studio-code-ubuntu/
|
||||
[8]: https://itsfoss.com/install-brackets-ubuntu/
|
||||
[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/graviton-code-editor-800x473.jpg?resize=800%2C473&ssl=1
|
||||
[10]: https://itsfoss.com/install-deb-files-ubuntu/
|
||||
[11]: https://itsfoss.com/use-appimage-linux/
|
||||
[12]: https://github.com/Graviton-Code-Editor/Graviton-App/releases
|
||||
[13]: https://github.com/Graviton-Code-Editor/Graviton-App
|
||||
[14]: https://github.com/Graviton-Code-Editor/Graviton-App/issues
|
||||
[16]: https://itsfoss.com/install-software-from-source-code/
|
||||
[17]: https://itsfoss.com/contact-us/
|
||||
@@ -0,0 +1,216 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10991-1.html)
|
||||
[#]: subject: (Neofetch – Display Linux system Information In Terminal)
|
||||
[#]: via: (https://www.ostechnix.com/neofetch-display-linux-systems-information/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
Neofetch:在终端中显示 Linux 系统信息
|
||||
======
|
||||
|
||||
![Display Linux system information using Neofetch][1]
|
||||
|
||||
Neofetch 是一个简单但有用的命令行系统信息工具,它用 Bash 编写。它会收集有关系统软硬件的信息,并在终端中显示结果。默认情况下,系统信息将与操作系统的 logo 一起显示。但是,你可以进一步地自定义使用 ascii 图像或其他任何图片。你还可以配置 Neofetch 显示的信息、信息的显示位置和时间。Neofetch 主要用于系统信息的截图。它支持 Linux、BSD、Mac OS X、iOS 和 Windows 操作系统。在这个简短的教程中,让我们看看如何使用 Neofetch 显示 Linux 系统信息。
|
||||
|
||||
### 安装 Neofetch
|
||||
|
||||
Neofetch 可在大多数 Linux 发行版的默认仓库中找到。
|
||||
|
||||
在 Arch Linux 及其衍生版上,使用这个命令安装它:
|
||||
|
||||
```
|
||||
$ sudo pacman -S netofetch
|
||||
```
|
||||
|
||||
在 Debian(Stretch / Sid)上:
|
||||
|
||||
```
|
||||
$ sudo apt-get install neofetch
|
||||
```
|
||||
|
||||
在 Fedora 27 上:
|
||||
|
||||
```
|
||||
$ sudo dnf install neofetch
|
||||
```
|
||||
|
||||
在 RHEL、CentOS 上:
|
||||
|
||||
启用 EPEL 仓库:
|
||||
|
||||
```
|
||||
# yum install epel-relase
|
||||
```
|
||||
|
||||
获取 neofetch 仓库:
|
||||
|
||||
```
|
||||
# curl -o /etc/yum.repos.d/konimex-neofetch-epel-7.repo
|
||||
https://copr.fedorainfracloud.org/coprs/konimex/neofetch/repo/epel-7/konimex-neofetch-epel-7.repo
|
||||
```
|
||||
|
||||
然后,安装 Neofetch:
|
||||
|
||||
```
|
||||
# yum install neofetch
|
||||
```
|
||||
|
||||
在 Ubuntu 17.10 和更新版本上:
|
||||
|
||||
```
|
||||
$ sudo apt-get install neofetch
|
||||
```
|
||||
|
||||
在 Ubuntu 16.10 和更低版本上:
|
||||
|
||||
```
|
||||
$ sudo add-apt-repository ppa:dawidd0811/neofetch
|
||||
|
||||
$ sudo apt update
|
||||
|
||||
$ sudo apt install neofetch
|
||||
```
|
||||
|
||||
在 NixOS 上:
|
||||
|
||||
```
|
||||
$ nix-env -i neofetch
|
||||
```
|
||||
|
||||
### 使用 Neofetch 显示 Linux 系统信息
|
||||
|
||||
Neofetch 非常简单直接。让我们看一些例子。
|
||||
|
||||
打开终端,然后运行以下命令:
|
||||
|
||||
```
|
||||
$ neofetch
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
![][2]
|
||||
|
||||
*使用 Neofetch 显示 Linux 系统信息*
|
||||
|
||||
正如你在上面的输出中所看到的,Neofetch 显示了我的 Arch Linux 系统的以下详细信息:
|
||||
|
||||
* 已安装操作系统的名称,
|
||||
* 笔记本型号,
|
||||
* 内核详细信息,
|
||||
* 系统运行时间,
|
||||
* 默认和其他软件包管理器安装的软件数量
|
||||
* 默认 shell,
|
||||
* 屏幕分辨率,
|
||||
* 桌面环境,
|
||||
* 窗口管理器,
|
||||
* 窗口管理器的主题,
|
||||
* 系统主题,
|
||||
* 系统图标,
|
||||
* 默认终端,
|
||||
* CPU 类型,
|
||||
* GPU 类型,
|
||||
* 已安装的内存。
|
||||
|
||||
Neofetch 还有很多其他选项。我们会看到其中一些。
|
||||
|
||||
### 如何在 Neofetch 输出中使用自定义图像?
|
||||
|
||||
默认情况下,Neofetch 将显示你的操作系统 logo 以及系统信息。当然,你可以根据需要更改图像。
|
||||
|
||||
要显示图像,Linux 系统应该安装以下依赖项:
|
||||
|
||||
1. w3m-img(用于显示图像。w3m-img 有时与 w3m 包捆绑在一起),
|
||||
2. Imagemagick(用于创建缩略图),
|
||||
3. 支持 `\033[14t` 或者 xdotool 或者 xwininfo + xprop 或者 xwininfo + xdpyinfo 的终端。
|
||||
|
||||
大多数 Linux 发行版的默认仓库中都提供了 W3m-img 和 ImageMagick 包。因此,你可以使用你的发行版的默认包管理器来安装它们。
|
||||
|
||||
例如,运行以下命令在 Debian、Ubuntu、Linux Mint 上安装 w3m-img 和 ImageMagick:
|
||||
|
||||
```
|
||||
$ sudo apt install w3m-img imagemagick
|
||||
```
|
||||
|
||||
以下是带 w3m-img 支持的终端列表:
|
||||
|
||||
1. Gnome-terminal,
|
||||
2. Konsole,
|
||||
3. st,
|
||||
4. Terminator,
|
||||
5. Termite,
|
||||
6. URxvt,
|
||||
7. Xfce4-Terminal,
|
||||
8. Xterm
|
||||
|
||||
如果你的系统上已经有了 kitty、Terminology 和 iTerm,那么就无需安装 w3m-img。
|
||||
|
||||
现在,运行以下命令以使用自定义图像显示系统信息:
|
||||
|
||||
```
|
||||
$ neofetch --w3m /home/sk/Pictures/image.png
|
||||
```
|
||||
|
||||
或者,
|
||||
|
||||
```
|
||||
$ neofetch --w3m --source /home/sk/Pictures/image.png
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
![][3]
|
||||
|
||||
*使用自定义 logo 的 Neofetch 输出*
|
||||
|
||||
使用你自己的图片替换上面图片的路径。
|
||||
|
||||
或者,你可以指向包含以下图像的目录。
|
||||
|
||||
```
|
||||
$ neofetch --w3m <path-to-directory>
|
||||
```
|
||||
|
||||
### 配置 Neofetch
|
||||
|
||||
当我们第一次运行 Neofetch 时,它默认会为每个用户在 `$HOME/.config/neofetch/config.conf` 中创建一个配置文件。它还会在 `$HOME/.config/neofetch/config` 中创建一个全局的 neofetch 配置文件。你可以调整此文件来告诉 neofetch 该显示、删除和/或修改哪些详细信息。
|
||||
|
||||
还可以在不同版本中保留此配置文件。这意味着你只需根据自己的喜好自定义一次,并在升级到更新版本后使用相同的设置。你甚至可以将此文件共享给你的朋友和同事,使他拥有与你相同的设置。
|
||||
|
||||
要查看 Neofetch 帮助部分,请运行:
|
||||
|
||||
```
|
||||
$ neofetch --help
|
||||
```
|
||||
|
||||
就我测试的 Neofetch 而言,它在我的 Arch Linux 系统中完美地工作。它是一个非常方便的工具,可以在终端中轻松快速地打印系统的详细信息。
|
||||
|
||||
相关阅读:
|
||||
|
||||
* [如何使用 inxi 查看 Linux 系统详细信息][4]
|
||||
|
||||
资源:
|
||||
|
||||
* [Neofetch 的 GitHub 页面][5]
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/neofetch-display-linux-systems-information/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2016/06/neofetch-1-720x340.png
|
||||
[2]: http://www.ostechnix.com/wp-content/uploads/2016/06/Neofetch-1.png
|
||||
[3]: http://www.ostechnix.com/wp-content/uploads/2016/06/Neofetch-with-custom-logo.png
|
||||
[4]: https://www.ostechnix.com/how-to-find-your-system-details-using-inxi/
|
||||
[5]: https://github.com/dylanaraps/neofetch
|
||||
@@ -0,0 +1,282 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10962-1.html)
|
||||
[#]: subject: (Screen Command Examples To Manage Multiple Terminal Sessions)
|
||||
[#]: via: (https://www.ostechnix.com/screen-command-examples-to-manage-multiple-terminal-sessions/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
screen 命令示例:管理多个终端会话
|
||||
======
|
||||
|
||||

|
||||
|
||||
GNU Screen 是一个终端多路复用器(窗口管理器)。顾名思义,Screen 可以在多个交互式 shell 之间复用物理终端,因此我们可以在每个终端会话中执行不同的任务。所有的 Screen 会话都完全独立地运行程序。因此,即使会话意外关闭或断开连接,在 Screen 会话内运行的程序或进程也将继续运行。例如,当通过 SSH [升级 Ubuntu][2] 服务器时,`screen` 命令将继续运行升级过程,以防万一 SSH 会话因任何原因而终止。
|
||||
|
||||
GNU Screen 允许我们轻松创建多个 Screen 会话,在不同会话之间切换,在会话之间复制文本,随时连上或脱离会话等等。它是每个 Linux 管理员应该在必要时学习和使用的重要命令行工具之一。在本简要指南中,我们将看到 `screen` 命令的基本用法以及在 Linux 中的示例。
|
||||
|
||||
### 安装 GNU Screen
|
||||
|
||||
GNU Screen 在大多数 Linux 操作系统的默认存储库中都可用。
|
||||
|
||||
要在 Arch Linux 上安装 GNU Screen,请运行:
|
||||
|
||||
```
|
||||
$ sudo pacman -S screen
|
||||
```
|
||||
|
||||
在 Debian、Ubuntu、Linux Mint 上:
|
||||
|
||||
```
|
||||
$ sudo apt-get install screen
|
||||
```
|
||||
|
||||
在 Fedora 上:
|
||||
|
||||
```
|
||||
$ sudo dnf install screen
|
||||
```
|
||||
|
||||
在 RHEL、CentOS 上:
|
||||
|
||||
```
|
||||
$ sudo yum install screen
|
||||
```
|
||||
|
||||
在 SUSE/openSUSE 上:
|
||||
|
||||
```
|
||||
$ sudo zypper install screen
|
||||
```
|
||||
|
||||
让我们继续看一些 `screen` 命令示例。
|
||||
|
||||
### 管理多个终端会话的 Screen 命令示例
|
||||
|
||||
在 Screen 中所有命令的默认前缀快捷方式是 `Ctrl + a`。使用 Screen 时,你需要经常使用此快捷方式。所以,要记住这个键盘快捷键。
|
||||
|
||||
#### 创建新的 Screen 会话
|
||||
|
||||
让我们创建一个新的 Screen 会话并连上它。为此,请在终端中键入以下命令:
|
||||
|
||||
```
|
||||
screen
|
||||
```
|
||||
|
||||
现在,在此会话中运行任何程序或进程,即使你与此会话断开连接,正在运行的进程或程序也将继续运行。
|
||||
|
||||
#### 从 Screen 会话脱离
|
||||
|
||||
要从屏幕会话中脱离,请按 `Ctrl + a` 和 `d`。你无需同时按下两个组合键。首先按 `Ctrl + a` 然后按 `d`。从会话中脱离后,你将看到类似下面的输出。
|
||||
|
||||
```
|
||||
[detached from 29149.pts-0.sk]
|
||||
```
|
||||
|
||||
这里,`29149` 是 Screen ID,`pts-0.sk` 是屏幕会话的名称。你可以使用 Screen ID 或相应的会话名称来连上、脱离和终止屏幕会话。
|
||||
|
||||
#### 创建命名会话
|
||||
|
||||
你还可以用你选择的任何自定义名称创建一个 Screen 会话,而不是默认用户名,如下所示。
|
||||
|
||||
```
|
||||
screen -S ostechnix
|
||||
```
|
||||
|
||||
上面的命令将创建一个名为 `xxxxx.ostechnix` 的新 Screen 会话,并立即连上它。要从当前会话中脱离,请按 `Ctrl + a`,然后按 `d`。
|
||||
|
||||
当你想要查找哪些进程在哪些会话上运行时,命名会话会很有用。例如,当在会话中设置 LAMP 系统时,你可以简单地将其命名为如下所示。
|
||||
|
||||
```
|
||||
screen -S lampstack
|
||||
```
|
||||
|
||||
#### 创建脱离的会话
|
||||
|
||||
有时,你可能想要创建一个会话,但不希望自动连上该会话。在这种情况下,运行以下命令来创建名为`senthil` 的已脱离会话:
|
||||
|
||||
```
|
||||
screen -S senthil -d -m
|
||||
```
|
||||
|
||||
也可以缩短为:
|
||||
|
||||
```
|
||||
screen -dmS senthil
|
||||
```
|
||||
|
||||
上面的命令将创建一个名为 `senthil` 的会话,但不会连上它。
|
||||
|
||||
#### 列出屏幕会话
|
||||
|
||||
要列出所有正在运行的会话(连上的或脱离的),请运行:
|
||||
|
||||
```
|
||||
screen -ls
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
There are screens on:
|
||||
29700.senthil (Detached)
|
||||
29415.ostechnix (Detached)
|
||||
29149.pts-0.sk (Detached)
|
||||
3 Sockets in /run/screens/S-sk.
|
||||
```
|
||||
|
||||
如你所见,我有三个正在运行的会话,并且所有会话都已脱离。
|
||||
|
||||
#### 连上 Screen 会话
|
||||
|
||||
如果你想连上会话,例如 `29415.ostechnix`,只需运行:
|
||||
|
||||
```
|
||||
screen -r 29415.ostechnix
|
||||
```
|
||||
|
||||
或:
|
||||
|
||||
```
|
||||
screen -r ostechnix
|
||||
```
|
||||
|
||||
或使用 Screen ID:
|
||||
|
||||
```
|
||||
screen -r 29415
|
||||
```
|
||||
|
||||
要验证我们是否连上到上述会话,只需列出打开的会话并检查。
|
||||
|
||||
```
|
||||
screen -ls
|
||||
```
|
||||
|
||||
示例输出:
|
||||
|
||||
```
|
||||
There are screens on:
|
||||
29700.senthil (Detached)
|
||||
29415.ostechnix (Attached)
|
||||
29149.pts-0.sk (Detached)
|
||||
3 Sockets in /run/screens/S-sk.
|
||||
```
|
||||
|
||||
如你所见,在上面的输出中,我们目前已连上到 `29415.ostechnix` 会话。要退出当前会话,请按 `ctrl + a d`。
|
||||
|
||||
#### 创建嵌套会话
|
||||
|
||||
当我们运行 `screen` 命令时,它将为我们创建一个会话。但是,我们可以创建嵌套会话(会话内的会话)。
|
||||
|
||||
首先,创建一个新会话或连上已打开的会话。然后我将创建一个名为 `nested` 的新会话。
|
||||
|
||||
```
|
||||
screen -S nested
|
||||
```
|
||||
|
||||
现在,在会话中按 `Ctrl + a` 和 `c` 创建另一个会话。只需重复此操作即可创建任意数量的嵌套 Screen 会话。每个会话都将分配一个号码。号码将从 `0` 开始。
|
||||
|
||||
你可以按 `Ctrl + n` 移动到下一个会话,然后按 `Ctrl + p` 移动到上一个会话。
|
||||
|
||||
以下是管理嵌套会话的重要键盘快捷键列表。
|
||||
|
||||
* `Ctrl + a "` - 列出所有会话
|
||||
* `Ctrl + a 0` - 切换到会话号 0
|
||||
* `Ctrl + a n` - 切换到下一个会话
|
||||
* `Ctrl + a p` - 切换到上一个会话
|
||||
* `Ctrl + a S` - 将当前区域水平分割为两个区域
|
||||
* `Ctrl + a l` - 将当前区域垂直分割为两个区域
|
||||
* `Ctrl + a Q` - 关闭除当前会话之外的所有会话
|
||||
* `Ctrl + a X` - 关闭当前会话
|
||||
* `Ctrl + a \` - 终止所有会话并终止 Screen
|
||||
* `Ctrl + a ?` - 显示键绑定。要退出,请按回车
|
||||
|
||||
#### 锁定会话
|
||||
|
||||
Screen 有一个锁定会话的选项。为此,请按 `Ctrl + a` 和 `x`。 输入你的 Linux 密码以锁定。
|
||||
|
||||
```
|
||||
Screen used by sk <sk> on ubuntuserver.
|
||||
Password:
|
||||
```
|
||||
|
||||
#### 记录会话
|
||||
|
||||
你可能希望记录 Screen 会话中的所有内容。为此,只需按 `Ctrl + a` 和 `H` 即可。
|
||||
|
||||
或者,你也可以使用 `-L` 参数启动新会话来启用日志记录。
|
||||
|
||||
```
|
||||
screen -L
|
||||
```
|
||||
|
||||
从现在开始,你在会话中做的所有活动都将记录并存储在 `$HOME` 目录中名为 `screenlog.x` 的文件中。这里,`x` 是一个数字。
|
||||
|
||||
你可以使用 `cat` 命令或任何文本查看器查看日志文件的内容。
|
||||
|
||||
![][3]
|
||||
|
||||
*记录 Screen 会话*
|
||||
|
||||
#### 终止 Screen 会话
|
||||
|
||||
如果不再需要会话,只需杀死它。要杀死名为 `senthil` 的脱离会话:
|
||||
|
||||
```
|
||||
screen -r senthil -X quit
|
||||
```
|
||||
|
||||
或:
|
||||
|
||||
```
|
||||
screen -X -S senthil quit
|
||||
```
|
||||
|
||||
或:
|
||||
|
||||
```
|
||||
screen -X -S 29415 quit
|
||||
```
|
||||
|
||||
如果没有打开的会话,你将看到以下输出:
|
||||
|
||||
```
|
||||
$ screen -ls
|
||||
No Sockets found in /run/screens/S-sk.
|
||||
```
|
||||
|
||||
更多细节请参照 man 手册页:
|
||||
|
||||
```
|
||||
$ man screen
|
||||
```
|
||||
|
||||
还有一个名为 Tmux 的类似的命令行实用程序,它与 GNU Screen 执行相同的工作。要了解更多信息,请参阅以下指南。
|
||||
|
||||
* [Tmux 命令示例:管理多个终端会话][5]
|
||||
|
||||
### 资源
|
||||
|
||||
* [GNU Screen 主页][6]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/screen-command-examples-to-manage-multiple-terminal-sessions/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2019/06/Screen-Command-Examples-720x340.jpg
|
||||
[2]: https://www.ostechnix.com/how-to-upgrade-to-ubuntu-18-04-lts-desktop-and-server/
|
||||
[3]: https://www.ostechnix.com/wp-content/uploads/2019/06/Log-screen-sessions.png
|
||||
[4]: https://www.ostechnix.com/record-everything-terminal/
|
||||
[5]: https://www.ostechnix.com/tmux-command-examples-to-manage-multiple-terminal-sessions/
|
||||
[6]: https://www.gnu.org/software/screen/
|
||||
@@ -0,0 +1,90 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10994-1.html)
|
||||
[#]: subject: (Search Linux Applications On AppImage, Flathub And Snapcraft Platforms)
|
||||
[#]: via: (https://www.ostechnix.com/search-linux-applications-on-appimage-flathub-and-snapcraft-platforms/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
在 AppImage、Flathub 和 Snapcraft 平台上搜索 Linux 应用
|
||||
======
|
||||
|
||||
![Search Linux Applications On AppImage, Flathub And Snapcraft][1]
|
||||
|
||||
Linux 一直在发展。过去,开发人员必须分别为不同的 Linux 发行版构建应用。由于存在多种 Linux 变体,因此为所有发行版构建应用变得很繁琐,而且非常耗时。后来一些开发人员发明了包转换器和构建器,如 [Checkinstall][2]、[Debtap][3] 和 [Fpm][4]。但他们也没有完全解决问题。所有这些工具都只是将一种包格式转换为另一种包格式。我们仍然需要找到应用并安装运行所需的依赖项。
|
||||
|
||||
好吧,时代已经变了。我们现在有了通用的 Linux 应用。这意味着我们可以在大多数 Linux 发行版上安装这些应用。无论是 Arch Linux、Debian、CentOS、Redhat、Ubuntu 还是任何流行的 Linux 发行版,通用应用都可以正常使用。这些应用与所有必需的库和依赖项打包在一个包中。我们所要做的就是在我们使用的任何 Linux 发行版上下载并运行它们。流行的通用应用格式有 AppImage、[Flatpak][5] 和 [Snap][6]。
|
||||
|
||||
AppImage 由 Simon peter 创建和维护。许多流行的应用,如 Gimp、Firefox、Krita 等等,都有这些格式,并可直接在下载页面下载。只需下载它们,使其可执行并立即运行它。你甚至无需 root 权限来运行 AppImage。
|
||||
|
||||
Flatpak 的开发人员是 Alexander Larsson(RedHat 员工)。Flatpak 应用托管在名为 “Flathub” 的中央仓库(商店)中。如果你是开发人员,建议你使用 Flatpak 格式构建应用,并通过 Flathub 将其分发给用户。
|
||||
|
||||
Snap 由 Canonical 而建,主要用于 Ubuntu。但是,其他 Linux 发行版的开发人员开始为 Snap 打包格式做出贡献。因此,Snap 也开始适用于其他 Linux 发行版。Snap 可以直接从应用的下载页面下载,也可以从 Snapcraft 商店下载。
|
||||
|
||||
许多受欢迎的公司和开发人员已经发布了 AppImage、Flatpak 和 Snap 格式的应用。如果你在寻找一款应用,只需进入相应的商店并获取你选择的应用并运行它,而不用管你使用何种 Linux 发行版。
|
||||
|
||||
还有一个名为 “Chob” 的命令行通用应用搜索工具可在 AppImage、Flathub 和 Snapcraft 平台上轻松搜索 Linux 应用。此工具仅搜索给定的应用并在默认浏览器中显示官方链接。它不会安装它们。本指南将解释如何安装 Chob 并使用它来搜索 Linux 上的 AppImage、Flatpak 和 Snap。
|
||||
|
||||
### 使用 Chob 在 AppImage、Flathub 和 Snapcraft 平台上搜索 Linux 应用
|
||||
|
||||
从[发布页面][7]下载最新的 Chob 二进制文件。在编写本指南时,最新版本为 0.3.5。
|
||||
|
||||
```
|
||||
$ wget https://github.com/MuhammedKpln/chob/releases/download/0.3.5/chob-linux
|
||||
```
|
||||
|
||||
使其可执行:
|
||||
|
||||
```
|
||||
$ chmod +x chob-linux
|
||||
```
|
||||
|
||||
最后,搜索你想要的应用。例如,我将搜索与 Vim 相关的应用。
|
||||
|
||||
```
|
||||
$ ./chob-linux vim
|
||||
```
|
||||
|
||||
Chob 将在 AppImage、Flathub 和 Snapcraft 平台上搜索给定的应用(和相关应用)并显示结果。
|
||||
|
||||
![][8]
|
||||
|
||||
*使用 Chob 搜索 Linux 应用*
|
||||
|
||||
只需要输入你想要应用前面的数字就可在默认浏览器中打开它的官方链接,并可在其中阅读应用的详细信息。
|
||||
|
||||
![][9]
|
||||
|
||||
在浏览器中查看 Linux 应用的详细信息
|
||||
|
||||
有关更多详细信息,请查看下面的 Chob 官方 GitHub 页面。
|
||||
|
||||
资源:
|
||||
|
||||
* [Chob 的 GitHub 仓库][10]
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/search-linux-applications-on-appimage-flathub-and-snapcraft-platforms/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2019/05/chob-720x340.png
|
||||
[2]: https://www.ostechnix.com/build-packages-source-using-checkinstall/
|
||||
[3]: https://www.ostechnix.com/convert-deb-packages-arch-linux-packages/
|
||||
[4]: https://www.ostechnix.com/build-linux-packages-multiple-platforms-easily/
|
||||
[5]: https://www.ostechnix.com/flatpak-new-framework-desktop-applications-linux/
|
||||
[6]: https://www.ostechnix.com/introduction-ubuntus-snap-packages/
|
||||
[7]: https://github.com/MuhammedKpln/chob/releases
|
||||
[8]: http://www.ostechnix.com/wp-content/uploads/2019/05/Search-Linux-applications-Using-Chob.png
|
||||
[9]: http://www.ostechnix.com/wp-content/uploads/2019/05/View-Linux-applications-Details.png
|
||||
[10]: https://github.com/MuhammedKpln/chob
|
||||
84
published/201906/20190610 Try a new game on Free RPG Day.md
Normal file
84
published/201906/20190610 Try a new game on Free RPG Day.md
Normal file
@@ -0,0 +1,84 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10976-1.html)
|
||||
[#]: subject: (Try a new game on Free RPG Day)
|
||||
[#]: via: (https://opensource.com/article/19/5/free-rpg-day)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth/users/erez/users/seth)
|
||||
|
||||
在免费 RPG 日试玩一下新游戏
|
||||
======
|
||||
|
||||
> 6 月 15 日,你可以在当地的游戏商家庆祝桌面角色扮演游戏并获得免费的 RPG 资料。
|
||||
|
||||

|
||||
|
||||
(LCTT 译注:“<ruby>免费 RPG 日<rt>Free RPG Day</rt></ruby>”是受“<ruby>免费漫画书日<rt>Free Comic Book Day</rt></ruby>”启发而发起的庆祝活动,从 2007 年开始已经举办多次。这里的 RPG 游戏并非我们通常所指的电脑 RPG 游戏,而是指使用纸和笔的桌面游戏,是一种西方传统游戏形式。)
|
||||
|
||||
你有没有想过尝试一下《<ruby>龙与地下城<rt>Dungeons & Dragons</rt></ruby>》,但不知道如何开始?你是否在年轻时玩过《<ruby>开拓者<rt>Pathfinder</rt></ruby>》并一直在考虑重返快乐时光?你是否对角色扮演游戏(RPG)感到好奇,但不确定你是否想玩一个?你是否对桌面游戏的概念完全陌生,直到现在才听说过这种 RPG 游戏?无论是哪一个并不重要,因为[免费 RPG 日] [2]适合所有人!
|
||||
|
||||
第一个免费 RPG 日活动发生在 2007 年,是由世界各地的桌面游戏商家举办的。这个想法是以 0 美元的价格为新手和有经验的游戏玩家带来新的、独家的 RPG 快速入门规则和冒险体验。在这样的一天里,你可以走进当地的桌面游戏商家,得到一本小册子,其中包含桌面 RPG 的简单的初学者规则,你可以在商家里与那里的人或者回家与朋友一起玩。这本小册子是给你的,应该一直留着的。
|
||||
|
||||
这一活动如此的受欢迎,此后该传统一直延续至今。今年,免费 RPG 日定于 6 月 15 日星期六举行。
|
||||
|
||||
### 有什么收获?
|
||||
|
||||
显然,免费 RPG 日背后的想法是让你沉迷于桌面 RPG 游戏。但在你本能的犬儒主义开始之前,考虑到它会慢慢上瘾,爱上一个鼓励你阅读规则和知识的游戏并不太糟,这样你和你的家人、朋友就有了共度时光的借口了。桌面 RPG 是一个功能强大、富有想象力和有趣的媒介,而免费 RPG 日则是对这种游戏很好的介绍。
|
||||
|
||||
![FreeRPG Day logo][3]
|
||||
|
||||
### 开源游戏
|
||||
|
||||
像许多其他行业一样,开源现象影响了桌面游戏。回到世纪之交,《Magic:The Gathering and Dungeons&Dragons》 的提供者<ruby>[威世智公司][4]<rt>Wizards of the Coast</rt></ruby>决定通过开发<ruby>[开源游戏许可证][5]<rt>Open Game License</rt></ruby>(OGL)来采用开源方法。他们将此许可证用于世界上第一个 RPG(《<ruby>龙与地下城<rt>Dungeons & Dragons</rt></ruby>》,D&D)的版本 3 和 3.5。几年后,当他们在第四版上(对开源)产生了动摇时,《<ruby>龙<rt>Dragon</rt></ruby>》杂志的出版商复刻了 D&D 3.5 的“代码”,将其混制版本发布为《<ruby>开拓者<rt>Pathfinder</rt></ruby>》 RPG,从而保持了创新和整个第三方游戏开发者产业的健康发展。最近,威世智公司在 D&D 5e 版本中才又重回了 OGL。
|
||||
|
||||
OGL 允许开发人员至少可以在他们自己产品中使用该游戏的机制。不管你可以不可以使用自定义怪物、武器、王国或流行角色的名称,但你可以随时使用 OGL 游戏的规则和数学计算。事实上,OGL 游戏的规则通常作为[系统参考文档][6](SRD)免费发布的,因此,无论你是否购买了规则书的副本,你都可以了解游戏的玩法。
|
||||
|
||||
如果你之前从未玩过桌面 RPG,那么使用笔和纸玩的游戏也可以拥有游戏引擎似乎很奇怪,但计算就是计算,不管是数字的还是模拟的。作为一个简单的例子:假设游戏引擎规定玩家角色有一个代表其力量的数字。当那个玩家角色与一个有其两倍力量的巨人战斗时,在玩家掷骰子以增加她的角色的力量攻击时,真的会感到紧张。如果没有掷出一个很好的点数的话,她的力量将无法与巨人相匹敌。知道了这一点,第三方或独立开发者就可以为这个游戏引擎设计一个怪物,同时了解骰子滚动可能对玩家的能力得分产生的影响。这意味着他们可以根据游戏引擎的优先级进行数学计算。他们可以设计一系列用来杀死的怪物,在游戏引擎的环境中它们具有有意义的能力和技能,并且他们可以宣称与该引擎的兼容性。
|
||||
|
||||
此外,OGL 允许出版商为其材料定义产品标识。产品标识可以是出版物的商业外观(图形元素和布局)、徽标、术语、传说、专有名称等。未经出版商同意,任何定义为产品标识的内容都可能**无法**重复使用。例如,假设一个出版商发行了一本武器手册,其中包括一个名为 Sigint 的魔法砍刀,它对所有针对僵尸的攻击都给予 +2 魔法附加攻击值。这个特性来自一个故事,该砍刀是一个具有潜伏的僵尸基因的科学家锻造的。但是,该出版物在 OGL 第 1e 节中列出的所有武器的正确名称都被保留为产品标识。这意味着你可以在自己的出版物中使用该数字(武器的持久性、它所造成的伤害,+2 魔法奖励等等)以及与该武器相关的传说(它由一个潜伏的僵尸锻造),但是你不能使用该武器的名称(Sigint)。
|
||||
|
||||
OGL 是一个非常灵活的许可证,因此开发人员必须仔细阅读其第 1e 节。 一些出版商只保留出版物本身的布局,而其他出版商保留除数字和最通用术语之外的所有内容。
|
||||
|
||||
当卓越的 RPG 特许经营权拥抱开源时,至今仍能感受到的它给整个行业掀起的波澜。第三方开发人员可以为 5e 和《开拓者》系统创建内容。由威世智公司创建的整个 [DungeonMastersGuild.com][7] 网站为 D&D 5e 制作了独立内容,旨在促进独立出版。[Starfinder][8]、[OpenD6][9]、[战士,盗贼和法师][10]、[剑与巫师][11] 等及很多其它游戏都采用了 OGL。其他系统,如 Brent Newhall 的 《[Dungeon Delvers][12]》、《[Fate][13]》、《[Dungeon World][14]》 等等,都是根据[知识共享许可][15]授权的的。
|
||||
|
||||
### 获取你的 RPG
|
||||
|
||||
在免费 RPG 日,你可以前往当地游戏商铺,玩 RPG 以及获取与朋友将来一起玩的 RPG 游戏材料。就像<ruby>[Linux 安装节][16]<rt>Linux installfest</rt></ruby> 或 <ruby>[软件自由日][17]<rt>Software Freedom Day</rt></ruby>一样,该活动的定义很松散。每个商家举办的自由 RPG 日都有所不同,每个商家都可以玩他们选择的任何游戏。但是,游戏发行商捐赠的免费内容每年都是相同的。显然,免费的东西视情况而定,但是当你参加免费 RPG 日活动时,请注意有多少游戏采用了开源许可证(如果是 OGL 游戏,OGL 会打印在书背面)。《开拓者》、《Starfinder》 和 D&D 的任何内容肯定都会带有 OGL 的一些优势。许多其他系统的内容使用知识共享许可。有些则像 90 年代复活的 [Dead Earth][18] RPG 一样,使用 [GNU 自由文档许可证] [19]。
|
||||
|
||||
有大量的游戏资源是通过开源许可证开发的。你可能需要也可能不需要关心游戏的许可证;毕竟,许可证与你是否可以与朋友一起玩无关。但是如果你喜欢支持[自由文化][20]而不仅仅是你运行的软件,那么试试一些 OGL 或知识共享游戏吧。如果你不熟悉游戏,请在免费 RPG 日在当地游戏商家试玩桌面 RPG 游戏!
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/5/free-rpg-day
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth/users/erez/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team-game-play-inclusive-diversity-collaboration.png?itok=8sUXV7W1 (plastic game pieces on a board)
|
||||
[2]: https://www.freerpgday.com/
|
||||
[3]: https://opensource.com/sites/default/files/uploads/freerpgday-logoblank.jpg (FreeRPG Day logo)
|
||||
[4]: https://company.wizards.com/
|
||||
[5]: http://www.opengamingfoundation.org/licenses.html
|
||||
[6]: https://www.d20pfsrd.com/
|
||||
[7]: https://www.dmsguild.com/
|
||||
[8]: https://paizo.com/starfinder
|
||||
[9]: https://ogc.rpglibrary.org/index.php?title=OpenD6
|
||||
[10]: http://www.stargazergames.eu/games/warrior-rogue-mage/
|
||||
[11]: https://froggodgames.com/frogs/product/swords-wizardry-complete-rulebook/
|
||||
[12]: http://brentnewhall.com/games/doku.php?id=games:dungeon_delvers
|
||||
[13]: http://www.faterpg.com/licensing/licensing-fate-cc-by/
|
||||
[14]: http://dungeon-world.com/
|
||||
[15]: https://creativecommons.org/
|
||||
[16]: https://www.tldp.org/HOWTO/Installfest-HOWTO/introduction.html
|
||||
[17]: https://www.softwarefreedomday.org/
|
||||
[18]: https://mixedsignals.ml/games/blog/blog_dead-earth
|
||||
[19]: https://www.gnu.org/licenses/fdl-1.3.en.html
|
||||
[20]: https://opensource.com/article/18/1/creative-commons-real-world
|
||||
105
published/201906/20190610 Welcoming Blockchain 3.0.md
Normal file
105
published/201906/20190610 Welcoming Blockchain 3.0.md
Normal file
@@ -0,0 +1,105 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (murphyzhao)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10987-1.html)
|
||||
[#]: subject: (Welcoming Blockchain 3.0)
|
||||
[#]: via: (https://www.ostechnix.com/welcoming-blockchain-3-0/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
迎接区块链 3.0
|
||||
======
|
||||
|
||||
![欢迎区块链 3.0][1]
|
||||
|
||||
“[区块链 2.0][2]” 系列文章讨论了自 2008 年比特币等加密货币问世以来区块链技术的发展。本文将探讨区块链的未来发展。**区块链 3.0** 这一新的 DLT(<ruby>分布式分类帐本技术<rt>Distributed Ledger Technology</rt></ruby>)演进浪潮将回答当前区块链所面临的问题(每一个问题都会在这里总结)。下一版本的技术标准也将带来全新的应用和使用案例。在本文的最后,我们也会看一些当前使用这些原则的案例。
|
||||
|
||||
以下是现有区块链平台的几个缺点,并针对这些缺点给出了建议的解决方案。
|
||||
|
||||
### 问题 1:可扩展性
|
||||
|
||||
这个问题 [^1]被视为普遍采用该技术的第一个主要障碍。正如之前所讨论的,很多因素限制了区块链同时处理大量交易的能力。诸如 [以太坊][3] 之类的现有网络每秒能够进行 10-15 次交易(TPS),而像 Visa 所使用的主流网络每秒能够进行超过 2000 次交易。**可扩展性**是困扰所有现代数据库系统的问题。正如我们在这里看到的那样,改进的共识算法和更好的区块链架构设计正在改进它。
|
||||
|
||||
#### 解决可扩展性
|
||||
|
||||
已经提出了更精简、更有效的一致性算法来解决可扩展性问题,并且不会影响区块链的主要结构。虽然大多数加密货币和区块链平台使用资源密集型的 PoW 算法(例如,比特币和以太坊)来生成区块,但是存在更新的 DPoS 和 PoET 算法来解决这个问题。DPoS 和 PoET 算法(还有一些正在开发中)需要更少的资源来维持区块链,并且已显示具有高达 1000 TPS 的吞吐量,可与流行的非区块链系统相媲美。
|
||||
|
||||
可扩展性问题的第二个解决方案是完全改变区块链结构和功能。我们不会详细介绍这一点,但已经提出了诸如<ruby>有向无环图<rt>Directed Acyclic Graph</rt></ruby>(DAG)之类的替代架构来处理这个问题。从本质上讲,这项工作假设并非所有网络节点都需要整个区块链的副本才能使区块链正常工作,或者并非所有的参与者需要从 DLT 系统获得好处。系统不要求所有参与者验证交易,只需要交易发生在共同的参考框架中并相互链接。
|
||||
|
||||
在比特币系统中使用<ruby>[闪电网络][11]<rt>Lightning network</rt></ruby>来实现 DAG,而以太坊使用他们的<ruby>[切片][12]<rt>Sharding</rt></ruby> 协议来实现 DAG。本质上,从技术上来看 DAG 实现并不是区块链。它更像是一个错综复杂的迷宫,只是仍然保留了区块链的点对点和分布式数据库属性。稍后我们将在另一篇文章中探讨 DAG 和 Tangle 网络。
|
||||
|
||||
### 问题 2:互通性
|
||||
|
||||
**互通性**[^4] [^5] 被称为跨链访问,基本上就是指不同区块链之间彼此相互通信以交换指标和信息。由于目前有数不清的众多平台,不同公司为各种应用提供了各种专有系统,平台之间的互操作性就至关重要。例如,目前在一个平台上拥有数字身份的人无法利用其他平台提供的功能,因为各个区块链彼此之间互不了解、不能沟通。这是由于缺乏可靠的验证、令牌交换等有关的问题仍然存在。如果平台之间不能够相互通信,面向全球推出[智能合约][4]也是不可行的。
|
||||
|
||||
#### 解决互通性
|
||||
|
||||
有一些协议和平台专为实现互操作性而设计。这些平台实现了原子交换协议,并向不同的区块链系统提供开放场景,以便在它们之间进行通信和交换信息。**“0x (ZRX)”** 就是其中的一个例子,稍后将对进行描述。
|
||||
|
||||
### 问题 3:治理
|
||||
|
||||
公有链中的治理 [^6] 本身不是限制,而是需要像社区道德指南针一样,在区块链的运作中考虑每个人的意见。结合起来并规模性地看,能预见这样一个问题,即要么协议更改太频繁,要么协议被拥有最多令牌的“中央”权威一时冲动下修改。不过这不是大多数公共区块链目前正在努力避免的问题,因为其运营规模和运营性质不需要更严格的监管。
|
||||
|
||||
#### 解决治理问题
|
||||
|
||||
上面提到的复杂的框架或 DAG 几乎可以消除对全球(平台范围)治理法规的需要和使用。相反,程序可以自动监督事务和用户类型,并决定需要执行的法律。
|
||||
|
||||
### 问题 4:可持续性
|
||||
|
||||
可持续性再次建立在可扩展性问题的基础上。当前的区块链和加密货币因不可长期持续而倍遭批评,这是由于仍然需要大量的监督,并且需要大量资源保持系统运行。如果你读过最近“挖掘加密货币”已经没有这么大利润的相关报道,你就知道“挖矿”图利就是它的本来面目。保持现有平台运行所需的资源量在全球范围和主流使用方面根本不实用。
|
||||
|
||||
#### 解决不可持续性问题
|
||||
|
||||
从资源或经济角度来看,可持续性的答案与可扩展性的答案类似。但是,要在全球范围内实施这一制度,法律和法规必须予以认可。然而,这取决于世界各国政府。来自美国和欧洲政府的有利举措重新燃起了对这方面的希望。
|
||||
|
||||
### 问题 5:用户采用
|
||||
|
||||
目前,阻止消费者广泛采用 [^7] 基于区块链的应用程序的一个障碍是消费者对平台及其底层的技术不熟悉。事实上,大多数应用程序都需要某种技术和计算背景来弄清楚它们是如何工作的,这在这方面也没有帮助。区块链开发的第三次浪潮旨在缩小消费者知识与平台可用性之间的差距。
|
||||
|
||||
#### 解决用户采用问题
|
||||
|
||||
互联网花了很长的时间才发展成现在的样子。多年来,人们在开发标准化互联网技术栈方面做了大量的工作,使 Web 能够像现在这样运作。开发人员正在开发面向用户的前端分布式应用程序,这些应用程序应作为现有 Web 3.0 技术之上的一层,同时由下面的区块链和开放协议的支持。这样的[分布式应用][5]将使用户更熟悉底层技术,从而增加主流采用。
|
||||
|
||||
### 在当前场景中的应用
|
||||
|
||||
我们已经从理论上讨论了上述问题的解决方法,现在我们将继续展示这些方法在当前场景中的应用。
|
||||
|
||||
- [0x][6] – 是一种去中心化的令牌交换,不同平台的用户可以在不需要中央权威机构审查的情况下交换令牌。他们的突破在于,他们如何设计系统使得仅在交易结算后才记录和审查数据块,而不是通常的在交易之间进行(为了验证上下文,通常也会验证交易之前的数据块)。这使在线数字资产交换更快速。
|
||||
- [Cardano][7] – 由以太坊的联合创始人之一创建,Cardano 自诩为一个真正“科学”的平台,和采用了严格的协议,对开发的代码和算法进行了多次审查。Cardano 的所有内容都在数学上尽可能的进行了优化。他们的共识算法叫做 **Ouroboros**,是一种改进的<ruby>权益证明<rt>Proof of Stake</rt></ruby>(PoS)算法。Cardano 是用 [**haskell**][8] 开发的,智能合约引擎使用 haskell 的衍生工具 **plutus** 进行操作。这两者都是函数式编程语言,可以保证安全交易而不会影响效率。
|
||||
- EOS – 我们已经在 [这篇文章][9] 中描述了 EOS。
|
||||
- [COTI][10] – 一个鲜为人知的架构,COTI 不需要挖矿,而且在运行过程中趋近于零功耗。它还将资产存储在本地用户设备上的离线钱包中,而不是存储在纯粹的对等网络上。它们也遵循基于 DAG 的架构,并声称处理吞吐量高达 10000 TPS。他们的平台允许企业在不利用区块链的情况下建立自己的加密货币和数字化货币钱包。
|
||||
|
||||
[^1]: A. P. Paper, K. Croman, C. Decker, I. Eyal, A. E. Gencer, and A. Juels, “On Scaling Decentralized Blockchains | SpringerLink,” 2018.
|
||||
[^4]: [Why is blockchain interoperability important][13]
|
||||
[^5]: [The Importance of Blockchain Interoperability][14]
|
||||
[^6]: R. Beck, C. Müller-Bloch, and J. L. King, “Governance in the Blockchain Economy: A Framework and Research Agenda,” J. Assoc. Inf. Syst., pp. 1020–1034, 2018.
|
||||
[^7]: J. M. Woodside, F. K. A. Jr, W. Giberson, F. K. J. Augustine, and W. Giberson, “Blockchain Technology Adoption Status and Strategies,” J. Int. Technol. Inf. Manag., vol. 26, no. 2, pp. 65–93, 2017.
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/welcoming-blockchain-3-0/
|
||||
|
||||
作者:[sk][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[murphyzhao](https://github.com/murphyzhao)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.ostechnix.com/author/sk/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.ostechnix.com/wp-content/uploads/2019/06/blockchain-720x340.jpg
|
||||
[2]: https://linux.cn/article-10650-1.html
|
||||
[3]: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/
|
||||
[4]: https://www.ostechnix.com/blockchain-2-0-explaining-smart-contracts-and-its-types/
|
||||
[5]: https://www.ostechnix.com/blockchain-2-0-explaining-distributed-computing-and-distributed-applications/
|
||||
[6]: https://0x.org/
|
||||
[7]: https://www.cardano.org/en/home/
|
||||
[8]: https://www.ostechnix.com/getting-started-haskell-programming-language/
|
||||
[9]: https://www.ostechnix.com/blockchain-2-0-eos-io-is-building-infrastructure-for-developing-dapps/
|
||||
[10]: https://coti.io/
|
||||
[11]: https://cryptoslate.com/beyond-blockchain-directed-acylic-graphs-dag/
|
||||
[12]: https://github.com/ethereum/wiki/wiki/Sharding-FAQ#introduction
|
||||
[13]: https://www.capgemini.com/2019/02/can-the-interoperability-of-blockchains-change-the-world/
|
||||
[14]: https://medium.com/wanchain-foundation/the-importance-of-blockchain-interoperability-b6a0bbd06d11
|
||||
@@ -0,0 +1,133 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10999-1.html)
|
||||
[#]: subject: (Installing alternative versions of RPMs in Fedora)
|
||||
[#]: via: (https://fedoramagazine.org/installing-alternative-rpm-versions-in-fedora/)
|
||||
[#]: author: (Adam Šamalík https://fedoramagazine.org/author/asamalik/)
|
||||
|
||||
在 Fedora 中安装替代版本的 RPM 包
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
<ruby>[模块化][2]<rt>Modularity</rt></ruby>使 Fedora 能够在仓库中提供替代版本的 RPM 软件包。每个 Fedroa 版本可以原生构建不同应用、语言运行时和工具版本的多个版本。
|
||||
|
||||
Fedora Magazine 大约一年前就写了 [Fedora 28 服务器版的模块化][3]。那时,它只是一个有附加内容的可选仓库,并且明确只支持服务器版。到目前为止,它已经发生了很多变化,现在**模块化是 Fedora 发行版的核心部分**。一些软件包已完全变成模块。在编写本文时,Fedora 30 的 49,464 个二进制 RPM 软件包中的 1,119(2.26%)来自模块([关于这个数字的更多信息][4])。
|
||||
|
||||
### 模块化基础知识
|
||||
|
||||
由于许多软件包有不同的版本会让人难以承受(并且难以管理),所以包被分组为**模块**,它可以代表一个应用程序、一个语言运行时或任何其他合理的组。
|
||||
|
||||
模块通常有多个**流**,这通常代表软件的主要版本。它可以并行使用,但在给定系统上只能安装每个模块的一个流。
|
||||
|
||||
为了不让用户因为太多选择而难以承受,每个 Fedora 版本都有一组**默认**,因此只需要在需要时做出决定。
|
||||
|
||||
最后,为了简化安装,可以根据用例使用预定义的 **profile** 选择性地安装模块。例如,数据库模块可以作为客户端,服务端或同时安装。
|
||||
|
||||
### 实际使用模块化
|
||||
|
||||
当你在 Fedora 系统上安装 RPM 软件包时,它很可能它来自模块流。你可能没有注意到的原因之一是模块化的核心原则之一是在你探究之前保持不可见。
|
||||
|
||||
让我们比较以下两种情况。首先,安装流行的 i3 平铺窗口管理器,然后安装极简化的 dwm 窗口管理器:
|
||||
|
||||
```
|
||||
$ sudo dnf install i3
|
||||
...
|
||||
Done!
|
||||
```
|
||||
|
||||
正如所料,上面的命令会在系统上安装 i3 包及其依赖项。这里没有其他事情发生。但另一个会怎么样?
|
||||
|
||||
```
|
||||
$ sudo dnf install dwm
|
||||
...
|
||||
Enabling module streams:
|
||||
dwm 6.1
|
||||
...
|
||||
Done!
|
||||
```
|
||||
|
||||
感觉是一样的,但后台发生了一些事情 。它启用了默认的 dwm 模块流(6.1),并且安装了模块中的 dwm 包。
|
||||
|
||||
为了保持透明,输出中有一条关于模块自动启用的消息。但除此之外,用户不需要了解模块化的任何信息,以便按照他们一贯的方式使用他们的系统。
|
||||
|
||||
但如果他们使用模块化方式呢?让我们看看如何安装不同版本的 dwm。
|
||||
|
||||
使用以下命令查看可用的模块流:
|
||||
|
||||
```
|
||||
$ sudo dnf module list
|
||||
...
|
||||
dwm latest ...
|
||||
dwm 6.0 ...
|
||||
dwm 6.1 [d] ...
|
||||
dwm 6.2 ...
|
||||
...
|
||||
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
|
||||
```
|
||||
|
||||
输出显示 dwm 模块有四个流,6.1 是默认值。
|
||||
|
||||
要安装不同版本的 dwm 包,例如,安装 6.2 的流。启用它,然后使用以下两个命令安装软件包:
|
||||
|
||||
```
|
||||
$ sudo dnf module enable dwm:6.2
|
||||
...
|
||||
Enabling module streams:
|
||||
dwm 6.2
|
||||
...
|
||||
Done!
|
||||
$ sudo dnf install dwm
|
||||
...
|
||||
Done!
|
||||
```
|
||||
|
||||
最后,让我们看下配置,以 PostgreSQL 为例。
|
||||
|
||||
```
|
||||
$ sudo dnf module list
|
||||
...
|
||||
postgresql 9.6 client, server ...
|
||||
postgresql 10 client, server ...
|
||||
postgresql 11 client, server ...
|
||||
...
|
||||
```
|
||||
|
||||
要安装 PostgreSQL 11 服务端,使用以下命令:
|
||||
|
||||
```
|
||||
$ sudo dnf module install postgresql:11/server
|
||||
```
|
||||
|
||||
请注意,除了启用流之外,我们可以指定配置从而使用一条命令安装模块。
|
||||
|
||||
可以立即安装多个版本。要添加客户端工具,使用下面的命令:
|
||||
|
||||
```
|
||||
$ sudo dnf module install postgresql:11/client
|
||||
```
|
||||
|
||||
还有许多其他带有多个流的模块可供选择。在编写本文时,Fedora 30 中有 83 个模块流。包括两个版本的 MariaDB、三个版本的 Node.js、两个版本的 Ruby 等等。
|
||||
|
||||
有关完整的命令集(包括从一个流切换到另一个流),请参阅[模块化的官方用户文档][5]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/installing-alternative-rpm-versions-in-fedora/
|
||||
|
||||
作者:[Adam Šamalík][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/asamalik/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/modularity-f30-816x345.jpg
|
||||
[2]: https://docs.pagure.org/modularity
|
||||
[3]: https://linux.cn/article-10479-1.html
|
||||
[4]: https://blog.samalik.com/2019/06/12/counting-modularity-packages.html
|
||||
[5]: https://docs.fedoraproject.org/en-US/modularity/using-modules/
|
||||
@@ -0,0 +1,94 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10998-1.html)
|
||||
[#]: subject: (Open hardware for musicians and music lovers: Headphone, amps, and more)
|
||||
[#]: via: (https://opensource.com/article/19/6/hardware-music)
|
||||
[#]: author: (Michael Weinberg https://opensource.com/users/mweinberg)
|
||||
|
||||
音乐家和音乐爱好者的开放硬件:耳机、放大器等
|
||||
======
|
||||
|
||||
> 从 3D 打印乐器到无线播放声音的设备,有很多通过开放硬件项目来奏乐的方法。
|
||||
|
||||
![][1]
|
||||
|
||||
这个世界到处都是很棒的[开源音乐播放器][2],但为什么只是将开源用在播放音乐上呢?你还可以使用开源硬件奏乐。本文中描述的所有工具都是经过了[开源硬件协会][3](OSHWA)认证的。这意味着你可以自由地构建它们,重新组合它们,或者用它们做任何其他事情。
|
||||
|
||||
### 开源乐器
|
||||
|
||||
当你想奏乐时使用乐器总是最好的方式之一。如果你喜欢传统的的乐器,那么 [F-F-Fiddle][4] 可能适合你。
|
||||
|
||||
![F-f-fiddle][5]
|
||||
|
||||
F-F-Fiddle 是一款全尺寸电子小提琴,你可以使用标准的桌面 3D 打印机制作(采用[熔丝制造][6])。如果你想眼见为真,那么这里有一个 F-F-Fiddle 的视频: https://img.linux.net.cn/static/video/The%20F-F-Fiddle-8NDWVcJJS2Y.mp4
|
||||
|
||||
如果你精通小提琴,但还对一些更具异国情调的东西感兴趣?<ruby>[开源的特雷门琴][7]<rt>Open Theremin</rt></ruby>怎么样?
|
||||
|
||||
![Open Theremin][8]
|
||||
|
||||
与所有特雷门琴一样,开源特雷门琴可让你在不触碰乐器的情况下播放音乐。当然,它特别擅长为你的下一个科幻视频或空间主题派对制作[令人毛骨悚然的空间声音][9]。
|
||||
|
||||
[Waft][10] 的操作类似,也可以远程控制声音。它使用[激光雷达][11]来测量手与传感器的距离。看看这个: https://img.linux.net.cn/static/video/Waft%20Prototype%2012-Feb-2017-203705197.mp4
|
||||
|
||||
Waft 是特雷门琴吗?我不确定算不算,特雷门琴高手可以在下面的评论里发表一下看法。
|
||||
|
||||
如果特雷门琴对你来说太熟悉了,[SIGNUM][12] 可能就是你想要的。用其开发人员的话说,SIGNUM 通过将不可见的无线通信转换为可听信号来“揭示加密的信息代码和人/机通信的语言”。
|
||||
|
||||
![SIGNUM][13]
|
||||
|
||||
这是演示: https://img.linux.net.cn/static/video/SIGNUM_Portable%20Analog%20Instrumentation%20Amplifier-142831757.mp4
|
||||
|
||||
### 输入
|
||||
|
||||
无论你使用什么乐器,都需要将其接到某些东西上。如果你想要连接到树莓派,请尝试 [AudioSense-Pi][14],它允许你一次将多个输入和输出连接到你的树莓派。
|
||||
|
||||
![AudioSense-Pi][15]
|
||||
|
||||
### 合成器
|
||||
|
||||
合成器怎么样?SparkFun 的 [SparkPunk Sound Kit][16] 是一个简单的合成器,为你提供了很多音色。
|
||||
|
||||
![SparkFun SparkPunk Sound Kit][17]
|
||||
|
||||
### 耳机
|
||||
|
||||
制作所有这些音乐很棒,但你还需要考虑如何听它。幸运的是,[EQ-1耳机][18]是开源,支持 3D 打印。
|
||||
|
||||
![EQ-1 headphones][19]
|
||||
|
||||
你用开源硬件制作音乐吗?让我们在评论中知道!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/hardware-music
|
||||
|
||||
作者:[Michael Weinberg][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/mweinberg
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LIFE_musicinfinity.png?itok=7LkfjcS9
|
||||
[2]: https://opensource.com/article/19/2/audio-players-linux
|
||||
[3]: https://certification.oshwa.org/
|
||||
[4]: https://certification.oshwa.org/us000010.html
|
||||
[5]: https://opensource.com/sites/default/files/uploads/f-f-fiddle.png (F-f-fiddle)
|
||||
[6]: https://en.wikipedia.org/wiki/Fused_filament_fabrication
|
||||
[7]: https://certification.oshwa.org/ch000001.html
|
||||
[8]: https://opensource.com/sites/default/files/uploads/open-theremin.png (Open Theremin)
|
||||
[9]: https://youtu.be/p05ZSHRYXVA?t=771
|
||||
[10]: https://certification.oshwa.org/uk000005.html
|
||||
[11]: https://en.wikipedia.org/wiki/Lidar
|
||||
[12]: https://certification.oshwa.org/es000003.html
|
||||
[13]: https://opensource.com/sites/default/files/uploads/signum.png (SIGNUM)
|
||||
[14]: https://certification.oshwa.org/in000007.html
|
||||
[15]: https://opensource.com/sites/default/files/uploads/audiosense-pi.png (AudioSense-Pi)
|
||||
[16]: https://certification.oshwa.org/us000016.html
|
||||
[17]: https://opensource.com/sites/default/files/uploads/sparkpunksoundkit.png (SparkFun SparkPunk Sound Kit)
|
||||
[18]: https://certification.oshwa.org/us000038.html
|
||||
[19]: https://opensource.com/sites/default/files/uploads/eq-1-headphones.png (EQ-1 headphones)
|
||||
@@ -0,0 +1,119 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (robsean)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-10995-1.html)
|
||||
[#]: subject: (Ubuntu Kylin: The Official Chinese Version of Ubuntu)
|
||||
[#]: via: (https://itsfoss.com/ubuntu-kylin/)
|
||||
[#]: author: (Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/)
|
||||
|
||||
优麒麟:Ubuntu 的官方中文版本
|
||||
======
|
||||
|
||||
> 让我们来看看国外是如何看优麒麟的。
|
||||
|
||||
[Ubuntu 有几个官方特色版本][1],优麒麟(Ubuntu Kylin)是它们中的一个。在这篇文章中,你将了解到优麒麟,它是什么,它为什么被创建,它的特色是什么。
|
||||
|
||||
麒麟操作系统最初由中华人民共和国的[国防科技大学][2]的院士在 2001 年开发。名字来源于[麒麟][3],这是一种来自中国神话的神兽。
|
||||
|
||||
麒麟操作系统的第一个版本基于 [FreeBSD][4],计划用于中国军方和其它政府组织。麒麟 3.0 完全基于 Linux 内核,并且在 2010 年 12 月发布一个称为 [NeoKylin][5] 的版本。
|
||||
|
||||
在 2013 年,[Canonical][6] (Ubuntu 的母公司) 与中华人民共和国的[工业和信息化部][7] 达成共识,共同创建和发布一个针对中国市场特色的基于 Ubuntu 的操作系统。
|
||||
|
||||
![Ubuntu Kylin][8]
|
||||
|
||||
### 优麒麟是什么?
|
||||
|
||||
根据上述 2013 年的共识,优麒麟现在是 Ubuntu 的官方中国版本。它不仅仅是语言本地化。事实上,它决心服务中国市场,就像 Ubuntu 服务全球市场一样。
|
||||
|
||||
[优麒麟][9]的第一个版本与 Ubuntu 13.04 一起到来。像 Ubuntu 一样,优麒麟也有 LTS (长期支持)和非 LTS 版本。
|
||||
|
||||
当前,优麒麟 19.04 LTS 采用了 [UKUI][10] 桌面环境,修改了启动动画、登录/锁屏程序和操作系统主题。为给用户提供更友好的体验,它修复了一些错误,带有文件预览、定时注销等功能,最新的 [WPS 办公组件][11]和 [搜狗][12] 输入法集成于其中。
|
||||
|
||||
- [https://youtu.be/kZPtFMWsyv4](https://youtu.be/kZPtFMWsyv4)
|
||||
|
||||
银河麒麟 4.0.2 是一个基于优麒麟 16.04 LTS 的社区版本。它包含一些带有长期稳定支持的第三方应用程序。它非常适合服务器和日常桌面办公使用,欢迎开发者[下载][13]。麒麟论坛积极地获取来自提供的反馈以及解决问题来找到解决方案。
|
||||
|
||||
#### UKUI:优麒麟的桌面环境
|
||||
|
||||
![Ubuntu Kylin 19.04 with UKUI Desktop][15]
|
||||
|
||||
[UKUI][16] 由优麒麟开发小组设计和开发,有一些非常好的特色和预装软件:
|
||||
|
||||
* 类似 Windows 的交互功能,带来更友好的用户体验。安装导向易于使用,用户可以快速使用优麒麟。
|
||||
* 控制中心对主题和窗口采用了新的设置。如开始菜单、任务栏、文件管理器、窗口管理器和其它的组件进行了更新。
|
||||
* 在 Ubuntu 和 Debian 存储库上都可用,为 Debian/Ubuntu 发行版和其全球衍生版的的用户提供一个新单独桌面环境。
|
||||
* 新的登录和锁定程序,它更稳定和具有很多功能。
|
||||
* 包括一个反馈问题的实用的反馈程序。
|
||||
|
||||
#### 麒麟软件中心
|
||||
|
||||
![Kylin Software Center][17]
|
||||
|
||||
麒麟有一个软件中心,类似于 Ubuntu 软件中心,并被称为优麒麟软件中心。它是优麒麟软件商店的一部分,该商店也包含优麒麟开发者平台和优麒麟存储库,具有一个简单的用户界面,并功能强大。它同时支持 Ubuntu 和优麒麟存储库,并特别适用于由优麒麟小组开发的中文特有的软件的快速安装!
|
||||
|
||||
#### 优客:一系列的工具
|
||||
|
||||
优麒麟也有一系列被命名为优客的工具。在麒麟开始菜单中输入 “Youker” 将带来麒麟助手。如果你在键盘上按 “Windows” 按键,像你在 Windows 上一样,它将打开麒麟开始菜单。
|
||||
|
||||
![Kylin Assistant][18]
|
||||
|
||||
其它麒麟品牌的应用程序包括麒麟影音(播放器)、麒麟刻录,优客天气、优客 Fcitx 输入法,它们更好地支持办公工作和个人娱乐。
|
||||
|
||||
![Kylin Video][19]
|
||||
|
||||
#### 特别专注于中文
|
||||
|
||||
通过与金山软件合作,优麒麟开发者也致力于 Linux 版本的搜狗拼音输入法、快盘和优麒麟版本的金山 WPS,并解决了智能拼音、云存储和办公应用程序方面的问题。[拼音][20] 是中文字符的拉丁化系统。使用这个系统,用户用英文键盘输入,但在屏幕上将显示中文字符。
|
||||
|
||||
#### 有趣的事实:优麒麟运行在中国超级计算机上
|
||||
|
||||
![Tianhe-2 Supercomputer. Photo by O01326 – Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=45399546][22]
|
||||
|
||||
众所周知[世界上最快的超级计算机 500 强都在运行 Linux][23]。中国超级计算机[天河-1][24]和[天河-2][25]都使用优麒麟的 64 位版本,致力于高性能的[并行计算][26]优化、电源管理和高性能的[虚拟化计算][27]。
|
||||
|
||||
### 总结
|
||||
|
||||
我希望你喜欢这篇优麒麟世界的介绍。你可以从它的[官方网站][28]获得优麒麟 19.04 或基于 Ubuntu 16.04 的社区版本(银河麒麟)。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/ubuntu-kylin/
|
||||
|
||||
作者:[Avimanyu Bandyopadhyay][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[robsean](https://github.com/robsean)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/avimanyu/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/which-ubuntu-install/
|
||||
[2]: https://english.nudt.edu.cn
|
||||
[3]: https://www.thoughtco.com/what-is-a-qilin-195005
|
||||
[4]: https://itsfoss.com/freebsd-12-release/
|
||||
[5]: https://thehackernews.com/2015/09/neokylin-china-linux-os.html
|
||||
[6]: https://www.canonical.com/
|
||||
[7]: http://english.gov.cn/state_council/2014/08/23/content_281474983035940.htm
|
||||
[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/Ubuntu-Kylin.jpeg?resize=800%2C450&ssl=1
|
||||
[9]: http://www.ubuntukylin.com/
|
||||
[10]: http://ukui.org
|
||||
[11]: https://www.wps.com/
|
||||
[12]: https://en.wikipedia.org/wiki/Sogou_Pinyin
|
||||
[13]: http://www.ubuntukylin.com/downloads/show.php?lang=en&id=122
|
||||
[14]: https://itsfoss.com/solve-ubuntu-error-failed-to-download-repository-information-check-your-internet-connection/
|
||||
[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/ubuntu-Kylin-19-04-desktop.jpg?resize=800%2C450&ssl=1
|
||||
[16]: http://www.ukui.org/
|
||||
[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/kylin-software-center.jpg?resize=800%2C496&ssl=1
|
||||
[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/kylin-assistant.jpg?resize=800%2C535&ssl=1
|
||||
[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/kylin-video.jpg?resize=800%2C533&ssl=1
|
||||
[20]: https://en.wikipedia.org/wiki/Pinyin
|
||||
[21]: https://itsfoss.com/remove-old-kernels-ubuntu/
|
||||
[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/tianhe-2.jpg?resize=800%2C600&ssl=1
|
||||
[23]: https://itsfoss.com/linux-runs-top-supercomputers/
|
||||
[24]: https://en.wikipedia.org/wiki/Tianhe-1
|
||||
[25]: https://en.wikipedia.org/wiki/Tianhe-2
|
||||
[26]: https://en.wikipedia.org/wiki/Parallel_computing
|
||||
[27]: https://computer.howstuffworks.com/how-virtual-computing-works.htm
|
||||
[28]: http://www.ubuntukylin.com
|
||||
@@ -0,0 +1,169 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Modrisco)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11020-1.html)
|
||||
[#]: subject: (How to send email from the Linux command line)
|
||||
[#]: via: (https://www.networkworld.com/article/3402027/how-to-send-email-from-the-linux-command-line.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
如何用 Linux 命令行发电子邮件
|
||||
======
|
||||
|
||||
> Linux 提供了几个可以让你通过终端发送电子邮件的命令,下面来展示一些有趣的方法。
|
||||
|
||||
![Molnia/iStock][1]
|
||||
|
||||
Linux 可以用多种方式通过命令行发送电子邮件。有一些方法十分简单,有一些相对会复杂一些,不过仍旧提供了很多有用的特性。选择哪一种方式取决于你想要什么 —— 向同事快速发送消息,还是向一批人群发带有附件的更复杂的信息。接下来看一看几种可行方案:
|
||||
|
||||
### mail
|
||||
|
||||
发送一条简单消息最便捷的 Linux 命令是 `mail`。假设你需要提醒老板你今天得早点走,你可以使用这样的一条命令:
|
||||
|
||||
```
|
||||
$ echo "Reminder: Leaving at 4 PM today" | mail -s "early departure" myboss
|
||||
```
|
||||
|
||||
另一种方式是从一个文件中提取出你想要发送的文本信息:
|
||||
|
||||
```
|
||||
$ mail -s "Reminder:Leaving early" myboss < reason4leaving
|
||||
```
|
||||
|
||||
在以上两种情况中,你都可以通过 `-s` 来为邮件添加标题。
|
||||
|
||||
### sendmail
|
||||
|
||||
使用 `sendmail` 命令可以发送一封不包含标题的快信。(用目标收件人替换 `recip`):
|
||||
|
||||
```
|
||||
$ echo "leaving now" | sendmail recip
|
||||
```
|
||||
|
||||
你可以用这条命令发送一条只有标题,没有内容的信息:
|
||||
|
||||
```
|
||||
$ echo "Subject: leaving now" | sendmail recip
|
||||
```
|
||||
|
||||
你也可以用 `sendmail` 发送一条包含一条标题行的完整信息。不过使用这个方法时,你的标题行会被添加到要发送的文件中,如下例所示:
|
||||
|
||||
```
|
||||
Subject: Requested lyrics
|
||||
I would just like to say that, in my opinion, longer hair and other flamboyant
|
||||
affectations of appearance are nothing more ...
|
||||
```
|
||||
|
||||
你也可以发送这样的文件(`lyric` 文件包含标题和正文):
|
||||
|
||||
```
|
||||
$ sendmail recip < lyrics
|
||||
```
|
||||
|
||||
`sendmain` 的输出也可以很冗长。如果你感到好奇并希望查看发送系统和接收系统之间的交互,请添加 `-v` (verbose)选项。
|
||||
|
||||
```
|
||||
$ sendmail -v recip@emailsite.com < lyrics
|
||||
```
|
||||
|
||||
### mutt
|
||||
|
||||
`mutt` 是通过命令行发送邮件的一个很好的工具,在使用前你需要安装它。`mutt` 的一个很方便的优势就是它允许你在邮件中添加附件。
|
||||
|
||||
使用 `mutt` 发送一条快速信息:
|
||||
|
||||
```
|
||||
$ echo "Please check last night's backups" | mutt -s "backup check" recip
|
||||
```
|
||||
|
||||
从文件中获取内容:
|
||||
|
||||
```
|
||||
$ mutt -s "Agenda" recip < agenda
|
||||
```
|
||||
|
||||
使用 `-a` 选项在 `mutt` 中添加附件。你甚至可以添加不止一个附件 —— 如下一条命令所示:
|
||||
|
||||
```
|
||||
$ mutt -s "Agenda" recip -a agenda -a speakers < msg
|
||||
```
|
||||
|
||||
在以上的命令中,`msg` 文件包含了邮件中的正文。如果你没有其他补充的内容,你可以这样来代替之前的命令:
|
||||
|
||||
```
|
||||
$ echo "" | mutt -s "Agenda" recip -a agenda -a speakers
|
||||
```
|
||||
|
||||
`mutt` 另一个有用的功能是可以添加抄送(`-c`)和密送(`-b`)。
|
||||
|
||||
```
|
||||
$ mutt -s "Minutes from last meeting" recip@somesite.com -c myboss < mins
|
||||
```
|
||||
|
||||
### telnet
|
||||
|
||||
如果你想深入了解发送电子邮件的细节,你可以使用 `telnet` 来进行电子邮件交互操作。但正如所说的那样,你需要“学习术语”。邮件服务器期望一系列命令,其中包括自我介绍(`EHLO` 命令)、提供发件人(`MAIL FROM` 命令)、指定收件人(`RCPT TO` 命令),然后添加消息(`DATA`)并以 `.` 结束消息。并不是所有的电子邮件服务器都会响应这些请求。此方法通常仅用于故障排除。
|
||||
|
||||
```
|
||||
$ telnet emailsite.org 25
|
||||
Trying 192.168.0.12...
|
||||
Connected to emailsite.
|
||||
Escape character is '^]'.
|
||||
220 localhost ESMTP Sendmail 8.15.2/8.15.2/Debian-12; Wed, 12 Jun 2019 16:32:13 -0400; (No UCE/UBE) logging access from: mysite(OK)-mysite [192.168.0.12]
|
||||
EHLO mysite.org <== introduce yourself
|
||||
250-localhost Hello mysite [127.0.0.1], pleased to meet you
|
||||
250-ENHANCEDSTATUSCODES
|
||||
250-PIPELINING
|
||||
250-EXPN
|
||||
250-VERB
|
||||
250-8BITMIME
|
||||
250-SIZE
|
||||
250-DSN
|
||||
250-ETRN
|
||||
250-AUTH DIGEST-MD5 CRAM-MD5
|
||||
250-DELIVERBY
|
||||
250 HELP
|
||||
MAIL FROM: me@mysite.org <== 指定发件人
|
||||
250 2.1.0 shs@mysite.org... Sender ok
|
||||
RCPT TO: recip <== 指定收件人
|
||||
250 2.1.5 recip... Recipient ok
|
||||
DATA <== 邮件内容开始
|
||||
354 Enter mail, end with "." on a line by itself
|
||||
This is a test message. Please deliver it for me.
|
||||
. <== 内容结束
|
||||
250 2.0.0 x5CKWDds029287 Message accepted for delivery
|
||||
quit <== 结束交互
|
||||
```
|
||||
|
||||
### 向多个收件人发送电子邮件
|
||||
|
||||
如果你希望通过 Linux 命令行向一大组收件人发送电子邮件,你可以使用一个循环来帮助你完成任务,如下面应用在 `mutt` 中的例子:
|
||||
|
||||
```
|
||||
$ for recip in `cat recips`
|
||||
do
|
||||
mutt -s "Minutes from May meeting" $recip < May_minutes
|
||||
done
|
||||
```
|
||||
|
||||
### 总结
|
||||
|
||||
有很多方法可以从 Linux 命令行发送电子邮件。有些工具提供了相当多的选项。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3402027/how-to-send-email-from-the-linux-command-line.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Modrisco](https://github.com/Modrisco)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2017/08/email_image_blue-100732096-large.jpg
|
||||
[2]: https://www.youtube.com/playlist?list=PL7D2RMSmRO9J8OTpjFECi8DJiTQdd4hua
|
||||
[3]: https://www.facebook.com/NetworkWorld/
|
||||
[4]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,92 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11022-1.html)
|
||||
[#]: subject: (Personal assistant with Mycroft and Fedora)
|
||||
[#]: via: (https://fedoramagazine.org/personal-assistant-with-mycroft-and-fedora/)
|
||||
[#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/)
|
||||
|
||||
在 Fedora 中使用私人助理 Mycroft
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
> 想要找个开源的私人助理么?[Mycroft][2] 可以让你运行一个开源的服务,从而更好地控制你的数据。
|
||||
|
||||
### 在 Fedora 上安装 Mycroft
|
||||
|
||||
Mycroft 目前不存在于官方软件包集合中,但它可以轻松地从源码安装。第一步是从 Mycroft 的 GitHub 仓库下载源码。
|
||||
|
||||
```
|
||||
$ git clone https://github.com/MycroftAI/mycroft-core.git
|
||||
```
|
||||
|
||||
Mycroft 是一个 Python 应用,它提供了一个脚本负责在安装 Mycroft 及其依赖项之前创建虚拟环境。
|
||||
|
||||
```
|
||||
$ cd mycroft-core
|
||||
$ ./dev_setup.sh
|
||||
```
|
||||
|
||||
安装脚本会提示用户以帮助他完成安装过程。建议运行稳定版本并获取自动更新。
|
||||
|
||||
当提示在本地安装 Mimic 文字转语音引擎时,请回答否。因为根据安装描述,这可能需要很长时间,并且 Mimic 有适合 Fedora 的 rpm 包,因此可以使用 `dnf` 进行安装。
|
||||
|
||||
```
|
||||
$ sudo dnf install mimic
|
||||
```
|
||||
|
||||
### 开始使用 Mycroft
|
||||
|
||||
安装完成后,可以使用以下脚本启动 Mycroft 服务。
|
||||
|
||||
```
|
||||
$ ./start-mycroft.sh all
|
||||
```
|
||||
|
||||
要开始使用 Mycroft,需要注册运行服务的设备。因此需要一个帐户,可以在 <https://home.mycroft.ai/> 中创建。
|
||||
|
||||
创建帐户后,可以在 [https://account.mycroft.ai/devices][3] 中添加新设备。添加新设备需要配对码,你的设备会在所有服务启动后告诉你。
|
||||
|
||||
![][4]
|
||||
|
||||
现在可以使用该设备了。
|
||||
|
||||
### 使用 Mycroft
|
||||
|
||||
Mycroft 提供了一组默认启用的[技能][5],它们或者可以从[市场][5]下载。刚开始,你可以简单地向 Mycroft 问好,或天气如何。
|
||||
|
||||
```
|
||||
Hey Mycroft, how are you ?
|
||||
|
||||
Hey Mycroft, what's the weather like ?
|
||||
```
|
||||
|
||||
如果你对它是如何工作的感兴趣,`start-mycroft.sh` 脚本提供了一个命令行选项,它能让你使用命令行交互。它也会显示用于调试的有用信息。
|
||||
|
||||
Mycroft 总在学习新技能,并且有很多方法给 Mycroft 社区做[贡献][6]。
|
||||
|
||||
由 [Przemyslaw Marczynski][7] 摄影,发布于 [Unsplash][8]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/personal-assistant-with-mycroft-and-fedora/
|
||||
|
||||
作者:[Clément Verna][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/cverna/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/mycroft-816x345.jpg
|
||||
[2]: https://mycroft.ai/
|
||||
[3]: https://account.mycroft.ai/devices
|
||||
[4]: https://fedoramagazine.org/wp-content/uploads/2019/06/Screenshot_2019-06-14-Account.png
|
||||
[5]: https://market.mycroft.ai/skills
|
||||
[6]: https://mycroft.ai/contribute/
|
||||
[7]: https://unsplash.com/@pemmax?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
[8]: https://unsplash.com/search/photos/ai?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
120
published/201906/20190617 Exploring -run on Linux.md
Normal file
120
published/201906/20190617 Exploring -run on Linux.md
Normal file
@@ -0,0 +1,120 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11008-1.html)
|
||||
[#]: subject: (Exploring /run on Linux)
|
||||
[#]: via: (https://www.networkworld.com/article/3403023/exploring-run-on-linux.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
探索 Linux 上的 /run
|
||||
======
|
||||
|
||||
> Linux 系统在运行时数据方面的工作方式发生了微小但重大的变化。
|
||||
|
||||

|
||||
|
||||
如果你没有密切关注,你可能没有注意到 Linux 系统在运行时数据方面的工作方式有一些小但重大的变化。 它重新组织了文件系统中可访问的方式和位置,而这个变化在大约八年前就开始了。虽然这种变化可能不足以让你的袜子变湿,但它在 Linux 文件系统中提供了更多一致性,值得进行一些探索。
|
||||
|
||||
要开始,请转到 `/run`。如果你使用 `df` 来检查它,你会看到这样的输出:
|
||||
|
||||
```
|
||||
$ df -k .
|
||||
Filesystem 1K-blocks Used Available Use% Mounted on
|
||||
tmpfs 609984 2604 607380 1% /run
|
||||
```
|
||||
|
||||
它被识别为 “tmpfs”(临时文件系统),因此我们知道 `/run` 中的文件和目录没有存储在磁盘上,而只存储在内存中。它们表示保存在内存(或基于磁盘的交换空间)中的数据,它看起来像是一个已挂载的文件系统,这个可以使其更易于访问和管理。
|
||||
|
||||
`/run` 是各种各样数据的家园。例如,如果你查看 `/run/user`,你会注意到一组带有数字名称的目录。
|
||||
|
||||
```
|
||||
$ ls /run/user
|
||||
1000 1002 121
|
||||
```
|
||||
|
||||
使用长文件列表可以发现这些数字的重要性。
|
||||
|
||||
```
|
||||
$ ls -l
|
||||
total 0
|
||||
drwx------ 5 shs shs 120 Jun 16 12:44 1000
|
||||
drwx------ 5 dory dory 120 Jun 16 16:14 1002
|
||||
drwx------ 8 gdm gdm 220 Jun 14 12:18 121
|
||||
```
|
||||
|
||||
我们看到每个目录与当前登录的用户或显示管理器 gdm 相关。数字代表他们的 UID。每个目录的内容都是运行中的进程所使用的文件。
|
||||
|
||||
`/run/user` 文件只是你在 `/run` 中找到的一小部分。还有很多其他文件。有一些文件包含了各种系统进程的进程 ID。
|
||||
|
||||
```
|
||||
$ ls *.pid
|
||||
acpid.pid atopacctd.pid crond.pid rsyslogd.pid
|
||||
atd.pid atop.pid gdm3.pid sshd.pid
|
||||
```
|
||||
|
||||
如下所示,上面列出的 `sshd.pid` 文件包含 ssh 守护程序(`sshd`)的进程 ID。
|
||||
|
||||
```
|
||||
$ cat sshd.pid
|
||||
1148
|
||||
$ ps -ef | grep sshd
|
||||
root 1148 1 0 Jun14 ? 00:00:00 /usr/sbin/sshd -D <==
|
||||
root 10784 1148 0 12:44 ? 00:00:00 sshd: shs [priv]
|
||||
shs 10922 10784 0 12:44 ? 00:00:00 sshd: shs@pts/0
|
||||
root 18109 1148 0 16:13 ? 00:00:00 sshd: dory [priv]
|
||||
dory 18232 18109 0 16:14 ? 00:00:00 sshd: dory@pts/1
|
||||
shs 19276 10923 0 16:50 pts/0 00:00:00 grep --color=auto sshd
|
||||
```
|
||||
|
||||
`/run` 中的某些子目录只能使用 root 权限访问,例如 `/run/sudo`。例如,以 root 身份运行我们可以看到一些与真实或尝试使用 `sudo` 相关的文件:
|
||||
|
||||
```
|
||||
/run/sudo/ts# ls -l
|
||||
total 8
|
||||
-rw------- 1 root dory 112 Jun 16 16:37 dory
|
||||
-rw------- 1 root shs 168 Jun 17 08:33 shs
|
||||
```
|
||||
|
||||
为了与 `/run` 的变化保持一致,一些运行时数据的旧位置现在是符号链接。`/var/run` 现在是指向 `/run` 的指针,`/var/lock` 指向 `/run/lock` 的指针,可以保证旧的引用按预期工作。
|
||||
|
||||
```
|
||||
$ ls -l /var
|
||||
total 52
|
||||
drwxr-xr-x 2 root root 4096 Jun 17 07:36 backups
|
||||
drwxr-xr-x 19 root root 4096 Apr 18 13:46 cache
|
||||
drwxrwsrwt 2 root whoopsie 4096 Jun 13 07:39 crash
|
||||
drwxr-xr-x 75 root root 4096 Jun 9 15:14 lib
|
||||
drwxrwsr-x 2 root staff 4096 Oct 16 2017 local
|
||||
lrwxrwxrwx 1 root root 9 May 14 2018 lock -> /run/lock
|
||||
drwxrwxr-x 17 root syslog 4096 Jun 17 00:00 log
|
||||
drwxrwsrwt 2 root mail 4096 Jun 13 12:10 mail
|
||||
drwxrwsrwt 2 root whoopsie 4096 Jan 5 2018 metrics
|
||||
drwxr-xr-x 2 root root 4096 Jan 5 2018 opt
|
||||
lrwxrwxrwx 1 root root 4 May 14 2018 run -> /run
|
||||
drwxr-xr-x 9 root root 4096 Jun 16 2018 snap
|
||||
drwxr-xr-x 9 root root 4096 Jun 9 15:14 spool
|
||||
drwxrwxrwt 8 root root 4096 Jun 17 00:00 tmp
|
||||
drwxr-xr-x 3 root root 4096 Jan 19 12:14 www
|
||||
```
|
||||
|
||||
虽然技术上的变化很小,但转换到使用 `/run` 只是为了在 Linux 文件系统中更好地组织运行时数据。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3403023/exploring-run-on-linux.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/06/exploring_run-100799398-large.jpg
|
||||
[2]: https://www.youtube.com/playlist?list=PL7D2RMSmRO9J8OTpjFECi8DJiTQdd4hua
|
||||
[3]: https://www.networkworld.com/article/3242170/linux/invaluable-tips-and-tricks-for-troubleshooting-linux.html
|
||||
[4]: https://www.facebook.com/NetworkWorld/
|
||||
[5]: https://www.linkedin.com/company/network-world
|
||||
@@ -0,0 +1,60 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11002-1.html)
|
||||
[#]: subject: (Get the latest Ansible 2.8 in Fedora)
|
||||
[#]: via: (https://fedoramagazine.org/get-the-latest-ansible-2-8-in-fedora/)
|
||||
[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
|
||||
|
||||
在 Fedora 中获取最新的 Ansible 2.8
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
Ansible 是世界上最受欢迎的自动化引擎之一。它能让你自动化几乎任何事情,从本地系统的设置到大量的平台和应用。它是跨平台的,因此你可以将其用于各种操作系统。请继续阅读以获取有关如何在 Fedora 中获取最新 Ansible,以及它的一些更改和改进,以及如何使用它。
|
||||
|
||||
### 发布版本和功能
|
||||
|
||||
Ansible 2.8 最近发布了,其中包含许多修复、功能和增强。仅仅几天之后,它就可在 Fedora 29 和 30 以及 EPEL 中获取。两周前发布了后续版本 2.8.1。同样,新版本在几天内就可以在 Fedora 中获取。
|
||||
|
||||
[使用 sudo][2] 能够非常容易地从官方仓库安装:
|
||||
|
||||
```
|
||||
$ sudo dnf -y install ansible
|
||||
```
|
||||
|
||||
2.8 版本有很长的更新列表,你可以在 [2.8 的迁移指南][3]中阅读查看。但其中包含了一些好东西,比如 *Python 解释器发现功能* 。Ansible 2.8 现在会试图找出哪个 Python 是它所运行的平台的首选版本。如果失败,Ansible 会使用后备列表。但是,你仍然可以使用变量 `ansible_python_interpreter` 来设置 Python 解释器。
|
||||
|
||||
另一个变化使 Ansible 在各个平台上更加一致。由于 `sudo` 专用于 UNIX/Linux,而其他平台并没有,因此现在在更多地方使用 `become`。这包括了命令行开关。例如,`-ask-sudo-pass` 已变成了 `-ask-become-pass`,提示符也变成了 `BECOME password:`。
|
||||
|
||||
2.8 和 2.8.1 版本中还有许多其他功能。有关所有细节,请查看 [GitHub 上的官方更新日志][4]。
|
||||
|
||||
### 使用 Ansible
|
||||
|
||||
也许你不确定 Ansible 是否可以实际使用。别担心,你并不是唯一一个这样想的,因为它太强大了。但事实证明,它并不难以使用,在一个家庭内的几台电脑(甚至一台电脑)上设置都可以。
|
||||
|
||||
我们之前在 Fedora Magazine 中也讨论过这个话题:
|
||||
|
||||
- [使用 Ansible 设置工作站][5]
|
||||
|
||||
试试看 Ansible,说下你的想法。很重要的一部分是让 Fedora 保持最新版本。自动化快乐!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/get-the-latest-ansible-2-8-in-fedora/
|
||||
|
||||
作者:[Paul W. Frields][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/pfrields/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/ansible28-816x345.jpg
|
||||
[2]: https://fedoramagazine.org/howto-use-sudo/
|
||||
[3]: https://docs.ansible.com/ansible/latest/porting_guides/porting_guide_2.8.html
|
||||
[4]: https://github.com/ansible/ansible/blob/stable-2.8/changelogs/CHANGELOG-v2.8.rst
|
||||
[5]: https://fedoramagazine.org/using-ansible-setup-workstation/
|
||||
@@ -0,0 +1,151 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11007-1.html)
|
||||
[#]: subject: (Bash Script to Monitor Memory Usage on Linux)
|
||||
[#]: via: (https://www.2daygeek.com/linux-bash-script-to-monitor-memory-utilization-usage-and-send-email/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
用 Bash 脚本监控 Linux 上的内存使用情况
|
||||
======
|
||||
|
||||

|
||||
|
||||
目前市场上有许多开源监控工具可用于监控 Linux 系统的性能。当系统达到指定的阈值限制时,它可以发送电子邮件警报。它可以监视 CPU 利用率、内存利用率、交换利用率、磁盘空间利用率等所有内容。
|
||||
|
||||
如果你只有很少的系统并且想要监视它们,那么编写一个小的 shell 脚本可以使你的任务变得非常简单。
|
||||
|
||||
在本教程中,我们添加了两个 shell 脚本来监视 Linux 系统上的内存利用率。当系统达到给定阈值时,它将给特定电子邮件地址发邮件。
|
||||
|
||||
### 方法-1:用 Linux Bash 脚本监视内存利用率并发送电子邮件
|
||||
|
||||
如果只想在系统达到给定阈值时通过邮件获取当前内存利用率百分比,请使用以下脚本。
|
||||
|
||||
这是个非常简单直接的单行脚本。在大多数情况下,我更喜欢使用这种方法。
|
||||
|
||||
当你的系统达到内存利用率的 80% 时,它将触发一封电子邮件。
|
||||
|
||||
```
|
||||
*/5 * * * * /usr/bin/free | awk '/Mem/{printf("RAM Usage: %.2f%\n"), $3/$2*100}' | awk '{print $3}' | awk '{ if($1 > 80) print $0;}' | mail -s "High Memory Alert" 2daygeek@gmail.com
|
||||
```
|
||||
|
||||
**注意:**你需要更改电子邮件地址而不是使用我们的电子邮件地址。此外,你可以根据你的要求更改内存利用率阈值。
|
||||
|
||||
**输出:**你将收到类似下面的电子邮件提醒。
|
||||
|
||||
```
|
||||
High Memory Alert: 80.40%
|
||||
```
|
||||
|
||||
我们过去添加了许多有用的 shell 脚本。如果要查看这些内容,请导航至以下链接。
|
||||
|
||||
* [如何使用 shell 脚本自动执行日常活动?][1]
|
||||
|
||||
### 方法-2:用 Linux Bash 脚本监视内存利用率并发送电子邮件
|
||||
|
||||
如果要在邮件警报中获取有关内存利用率的更多信息。使用以下脚本,其中包括基于 `top` 命令和 `ps` 命令的最高内存利用率和进程详细信息。
|
||||
|
||||
这将立即让你了解系统的运行情况。
|
||||
|
||||
当你的系统达到内存利用率的 “80%” 时,它将触发一封电子邮件。
|
||||
|
||||
**注意:**你需要更改电子邮件地址而不是使用我们的电子邮件地址。此外,你可以根据你的要求更改内存利用率阈值。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/memory-alert.sh
|
||||
|
||||
#!/bin/sh
|
||||
ramusage=$(free | awk '/Mem/{printf("RAM Usage: %.2f\n"), $3/$2*100}'| awk '{print $3}')
|
||||
|
||||
if [ "$ramusage" > 20 ]; then
|
||||
|
||||
SUBJECT="ATTENTION: Memory Utilization is High on $(hostname) at $(date)"
|
||||
MESSAGE="/tmp/Mail.out"
|
||||
TO="2daygeek@gmail.com"
|
||||
echo "Memory Current Usage is: $ramusage%" >> $MESSAGE
|
||||
echo "" >> $MESSAGE
|
||||
echo "------------------------------------------------------------------" >> $MESSAGE
|
||||
echo "Top Memory Consuming Process Using top command" >> $MESSAGE
|
||||
echo "------------------------------------------------------------------" >> $MESSAGE
|
||||
echo "$(top -b -o +%MEM | head -n 20)" >> $MESSAGE
|
||||
echo "" >> $MESSAGE
|
||||
echo "------------------------------------------------------------------" >> $MESSAGE
|
||||
echo "Top Memory Consuming Process Using ps command" >> $MESSAGE
|
||||
echo "------------------------------------------------------------------" >> $MESSAGE
|
||||
echo "$(ps -eo pid,ppid,%mem,%Memory,cmd --sort=-%mem | head)" >> $MESSAGE
|
||||
mail -s "$SUBJECT" "$TO" < $MESSAGE
|
||||
rm /tmp/Mail.out
|
||||
fi
|
||||
```
|
||||
|
||||
最后添加一个 [cron 任务][2] 来自动执行此操作。它将每 5 分钟运行一次。
|
||||
|
||||
```
|
||||
# crontab -e
|
||||
*/5 * * * * /bin/bash /opt/scripts/memory-alert.sh
|
||||
```
|
||||
|
||||
**注意:**由于脚本计划每 5 分钟运行一次,因此你将在最多 5 分钟后收到电子邮件提醒(但不是 5 分钟,取决于具体时间)。
|
||||
|
||||
比如说,如果你的系统达到 8.25 的给定限制,那么你将在 5 分钟内收到电子邮件警报。希望现在说清楚了。
|
||||
|
||||
**输出:**你将收到类似下面的电子邮件提醒。
|
||||
|
||||
```
|
||||
Memory Current Usage is: 80.71%
|
||||
|
||||
+------------------------------------------------------------------+
|
||||
Top Memory Consuming Process Using top command
|
||||
+------------------------------------------------------------------+
|
||||
top - 12:00:58 up 5 days, 9:03, 1 user, load average: 1.82, 2.60, 2.83
|
||||
Tasks: 314 total, 1 running, 313 sleeping, 0 stopped, 0 zombie
|
||||
%Cpu0 : 8.3 us, 12.5 sy, 0.0 ni, 75.0 id, 0.0 wa, 0.0 hi, 4.2 si, 0.0 st
|
||||
%Cpu1 : 13.6 us, 4.5 sy, 0.0 ni, 81.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
|
||||
%Cpu2 : 21.7 us, 21.7 sy, 0.0 ni, 56.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
|
||||
%Cpu3 : 13.6 us, 9.1 sy, 0.0 ni, 77.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
|
||||
%Cpu4 : 17.4 us, 8.7 sy, 0.0 ni, 73.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
|
||||
%Cpu5 : 20.8 us, 4.2 sy, 0.0 ni, 70.8 id, 0.0 wa, 0.0 hi, 4.2 si, 0.0 st
|
||||
%Cpu6 : 9.1 us, 0.0 sy, 0.0 ni, 90.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
|
||||
%Cpu7 : 17.4 us, 4.3 sy, 0.0 ni, 78.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
|
||||
KiB Mem : 16248588 total, 5015964 free, 6453404 used, 4779220 buff/cache
|
||||
KiB Swap: 17873388 total, 16928620 free, 944768 used. 6423008 avail Mem
|
||||
|
||||
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
|
||||
17163 daygeek 20 2033204 487736 282888 S 10.0 3.0 8:26.07 /usr/lib/firefox/firefox -contentproc -childID 15 -isForBrowser -prefsLen 9408 -prefMapSize 184979 -parentBuildID 20190521202118 -greomni /u+
|
||||
1121 daygeek 20 4191388 419180 100552 S 5.0 2.6 126:02.84 /usr/bin/gnome-shell
|
||||
1902 daygeek 20 1701644 327216 82536 S 20.0 2.0 153:27.92 /opt/google/chrome/chrome
|
||||
2969 daygeek 20 1051116 324656 92388 S 15.0 2.0 149:38.09 /opt/google/chrome/chrome --type=renderer --field-trial-handle=10346122902703263820,11905758137655502112,131072 --service-pipe-token=1339861+
|
||||
1068 daygeek 20 1104856 309552 278072 S 5.0 1.9 143:47.42 /usr/lib/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
|
||||
27246 daygeek 20 907344 265600 108276 S 30.0 1.6 10:42.80 /opt/google/chrome/chrome --type=renderer --field-trial-handle=10346122902703263820,11905758137655502112,131072 --service-pipe-token=8587368+
|
||||
|
||||
+------------------------------------------------------------------+
|
||||
Top Memory Consuming Process Using ps command
|
||||
+------------------------------------------------------------------+
|
||||
PID PPID %MEM %CPU CMD
|
||||
8223 1 6.4 6.8 /usr/lib/firefox/firefox --new-window
|
||||
13948 1121 6.3 1.2 /usr/bin/../lib/notepadqq/notepadqq-bin
|
||||
8671 8223 4.4 7.5 /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 6999 -prefMapSize 184979 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 8223 true tab
|
||||
17163 8223 3.0 0.6 /usr/lib/firefox/firefox -contentproc -childID 15 -isForBrowser -prefsLen 9408 -prefMapSize 184979 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 8223 true tab
|
||||
1121 1078 2.5 1.6 /usr/bin/gnome-shell
|
||||
17937 8223 2.5 0.8 /usr/lib/firefox/firefox -contentproc -childID 16 -isForBrowser -prefsLen 9410 -prefMapSize 184979 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 8223 true tab
|
||||
8499 8223 2.2 0.6 /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 6635 -prefMapSize 184979 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 8223 true tab
|
||||
8306 8223 2.2 0.8 /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 184979 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 8223 true tab
|
||||
9198 8223 2.1 0.6 /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 8604 -prefMapSize 184979 -parentBuildID 20190521202118 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 8223 true tab
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/linux-bash-script-to-monitor-memory-utilization-usage-and-send-email/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.2daygeek.com/author/magesh/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.2daygeek.com/category/shell-script/
|
||||
[2]: https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/
|
||||
@@ -0,0 +1,91 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wahailin)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11014-1.html)
|
||||
[#]: subject: (Open Source Slack Alternative Mattermost Gets $50M Funding)
|
||||
[#]: via: (https://itsfoss.com/mattermost-funding/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
Slack 的开源替代品 Mattermost 获得 5000 万美元融资
|
||||
======
|
||||
|
||||
[Mattermost][1],作为 [Slack][2] 的开源替代品,获得了 5000 万美元的 B 轮融资。这个消息极其令人振奋。
|
||||
|
||||
[Slack][3] 是一个基于云的团队内部沟通协作软件。企业、初创企业、甚至全球化的开源项目都在使用 Slack 进行同事及项目成员间的沟通。
|
||||
|
||||
[Slack 在 2019 年 6 月的估值为 200 亿美元][4],由此可见其在科技行业的巨大影响,当然也就有更多产品想与之竞争。
|
||||
|
||||
### 5000 万美元开源项目
|
||||
|
||||
![][5]
|
||||
|
||||
就我个人而言,我并不知道 MatterMost 这个产品。但 [VentureBeat][6] 对这则新闻的报道,激发了我的好奇心。这次融资由 [Y Combinator][7] 的 Continuity 与一家新的投资方 BattleVentures 领投,现有投资者 Redpoint 和 S28 Captial 共同跟投。
|
||||
|
||||
在[公告][8]中,他们也提到:
|
||||
|
||||
> 今天的公告中,Mattermost 成为了 YC 有史以来规模最大的 B 轮投资项目,更重要的是,它是 YC 迄今为止投资额最高的开源项目。
|
||||
|
||||
下面是摘自 VentureBeat 的报道,你可以从中了解到一些细节:
|
||||
|
||||
> 本次资本注入,是继 2017 年 2 月的种子轮 350 万融资和今年 2 月份的 2000 万 A 轮融资之后进行的,并使得这家总部位于美国加州<ruby>帕罗奥图<rt>Palo Alto</rt></ruby>的公司融资总额达到了约 7000 万美元。
|
||||
|
||||
如果你对他们的规划感兴趣,可以阅读[官方公告][8]。
|
||||
|
||||
尽管听起来很不错,但可能你并不知道 Mattermost 是什么。所以我们先来作个简单了解:
|
||||
|
||||
### Mattermost 快览
|
||||
|
||||
![Mattermost][9]
|
||||
|
||||
前面已经提到,Mattermost 是 Slack 的开源替代品。
|
||||
|
||||
乍一看,它几乎照搬了 Slack 的界面外观,没错,这就是关键所在,你将拥有你可以轻松使用的软件的开源解决方案。
|
||||
|
||||
它甚至集成了一些流行的 DevOps 工具,如 Git、自动机器人和 CI/CD。除了这些功能外,它还关注安全性和隐私。
|
||||
|
||||
同样,和 Slack 类似,它支持和多种应用程序与服务的集成。
|
||||
|
||||
听起来很有前景?我也这么认为。
|
||||
|
||||
#### 定价:企业版和团队版
|
||||
|
||||
如果你希望由 Mattermost 托管该服务(或获得优先支持),应选择其企业版。但如果你不想使用付费托管,可以下载[团队版][11],并将其安装到基于 Linux 的云服务器或 VPS 服务器上。
|
||||
|
||||
当然,我们不会在此进行深入探究。我确想在此提及的是,企业版并不昂贵。
|
||||
|
||||
![][12]
|
||||
|
||||
### 总结
|
||||
|
||||
MatterMost 无疑相当出色,有了 5000 万巨额资金的注入,对于那些正在寻求安全的并能提供高效团队协作支持的开源通讯平台的用户,Mattermost 很可能成为开源社区重要的部分。
|
||||
|
||||
你觉得这条新闻怎么样?对你来说有价值吗?你是否已了解 Mattermost 是 Slack 的替代品?
|
||||
|
||||
请在下面的评论中给出你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/mattermost-funding/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wahailin](https://github.com/wahailin)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://mattermost.com/
|
||||
[2]: https://itsfoss.com/slack-use-linux/
|
||||
[3]: https://slack.com
|
||||
[4]: https://www.ft.com/content/98747b36-9368-11e9-aea1-2b1d33ac3271
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/mattermost-wallpaper.png?resize=800%2C450&ssl=1
|
||||
[6]: https://venturebeat.com/2019/06/19/mattermost-raises-50-million-to-advance-its-open-source-slack-alternative/
|
||||
[7]: https://www.ycombinator.com/
|
||||
[8]: https://mattermost.com/blog/yc-leads-50m-series-b-in-mattermost-as-open-source-slack-alternative/
|
||||
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/06/mattermost-screenshot.jpg?fit=800%2C497&ssl=1
|
||||
[10]: https://itsfoss.com/zettlr-markdown-editor/
|
||||
[11]: https://mattermost.com/download/
|
||||
[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/06/mattermost-enterprise-plan.jpg?fit=800%2C325&ssl=1
|
||||
93
published/201906/20190624 Raspberry Pi 4 is here.md
Normal file
93
published/201906/20190624 Raspberry Pi 4 is here.md
Normal file
@@ -0,0 +1,93 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wahailin)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11034-1.html)
|
||||
[#]: subject: (Raspberry Pi 4 is here!)
|
||||
[#]: via: (https://opensource.com/article/19/6/raspberry-pi-4)
|
||||
[#]: author: (Ben Nuttall https://opensource.com/users/bennuttall)
|
||||
|
||||
树莓派 4 来袭!
|
||||
======
|
||||
|
||||

|
||||
|
||||
> 售价 35 美元起的新一代树莓派单板计算机,装载了 1.5 GHz 的 Arm 芯片,并支持双 HDMI 4K 显示,全吞吐量千兆以太网,以及更多新特性。
|
||||
|
||||
![Raspberry Pi 4 board][1]
|
||||
|
||||
树莓派的最新版本树莓派 4 代,已于近日(北京时间 6 月 24 日)发布,这早于此前预期。树莓派 4 装载了 1.5 GHz 的 Arm 芯片和 VideoCore GPU,支持双 4K 显示输出,并引入了 USB 3 接口和全吞吐量千兆以太网,以及最高可达 4G 的多个可选 RAM 配置。
|
||||
|
||||
![Raspberry Pi 4 case][2]
|
||||
|
||||
树莓派 4 是非常强大的单板计算机,其起始售价依然是 35 美元。起始版的 RAM 配置为 1G,2G RAM 配置的树莓派售价为 45 美元,顶配 4G RAM 的树莓派售价为 55 美元,采用这种差异化定价对树莓派尚属首次。
|
||||
|
||||
树莓派 4 的详细配置如下:
|
||||
|
||||
* 1.5 GHz 4 核心 64 位博通 BCM2711 A72 CPU
|
||||
* VideoCore VI GPU
|
||||
* 千兆以太网端口
|
||||
* 1GB/2GB/4GB LPDDR4 SDRAM 内存
|
||||
* 双 Micro-HDMI 接口
|
||||
* 两个 USB 3 接口
|
||||
* 两个 USB 2 接口
|
||||
* 双频(2.4 GHz 和 5 GHz)无线网络
|
||||
* 蓝牙 5.0
|
||||
* USB Type C 电源接口
|
||||
* CSI 摄像头接口
|
||||
* DSI 显示接口
|
||||
* MicroSD 卡槽
|
||||
* PoE(以太网供电)供电针
|
||||
* 完全兼容早期的树莓派产品
|
||||
|
||||
### USB 接口和网络
|
||||
|
||||
树莓派 4 板载了更高速率的 USB 3 接口;它通过 Type C 接口供电,并提供两个 USB 3 接口和两个 USB 2 接口。USB 3 接口可以为连接的硬盘和其它外部设备提供更高的速率。
|
||||
|
||||
![Raspberry Pi 4 USBs][3]
|
||||
|
||||
基于 BCM2835 的树莓派 1 到 3 代的芯片只有一个本地 USB 接口,并且没有以太网接口,因而需要使用板子的 USB 集线器给出更多的 USB 接口和以太网接口。树莓派 3B+ 增加了一个专用的局域网(LAN)芯片,装载了千兆以太网,但它受到 USB 2 速率的限制。树莓派 4 板载了专门的千兆以太网,并且由于它不再受到 USB 速率的限制,网络速度要快得多。
|
||||
|
||||
树莓派 4 采用了 3B+ 中已有的技术 —— 该技术使得树莓派 3B+ 成为了第一个带有双频无线网络的单板计算机,即可以同时连接 2.4 GHz 和 5 GHz 频率的网络。
|
||||
|
||||
### 显示
|
||||
|
||||
设计第一代树莓派时,其 CPU 和 GPU 性能的平衡大大偏向于 GPU。VideoCore IV 是一个非常强大的图形处理器,支持全高清 1080p 多媒体的处理,这就是为什么树莓派一直作为家庭媒体中心而广受欢迎的原因。树莓派 2 代在某种程度上进行了权衡修改,并将 CPU 的性能进行提升,将树莓派从单核发展成四核 ARM 芯片。而树莓派 4 代将 CPU 和 GPU 的性能都进行了大幅提升。新的 VideoCore VI GPU 支持 4K 视频,并允许通过板子上的两个 Micro HDMI 端口(板子特意保持了和旧有型号相同的尺寸)进行双显示输出,这里要用一个适配器或 Micro HDMI 转 full HDMI 的转换线连接到 HDMI 屏幕。
|
||||
|
||||
当你需要同时浏览多个窗口时,需要用到更多的物理显示屏,双显示的好处在此时就得到了绝佳体现。如果你正在编程,你可能会在其中一个屏幕上编写代码,构建网站或应用,而在另一个屏幕上查看数据库、Web 浏览器、电子邮件或其他内容。这是树莓派首次可以不必将开发局限在一台显示器上,从而可以让你在需要时,在不同的屏幕上构建具有不同内容的基于树莓派的项目。
|
||||
|
||||
该树莓派还有一个显示器串行接口(DSI),用于驱动另一个特殊的显示-这里并非指另一个监视器本身,而是通过一根挠性电缆连接的官方树莓派触摸屏显示器。
|
||||
|
||||
### Raspbian Buster
|
||||
|
||||
树莓派 4 发布后,紧接着更新了基于 Debian 的系统 Raspbian Buster,而新的树莓派对 OpenGL ES 3 的支持,使我们在 Raspbian Buster 上为树莓派 4 开发任意软件成为可能。Buster 对界面进行了一些调整,并对很多软件进行了升级,其中包括 Python3.7。
|
||||
|
||||
![Raspbian Buster][4]
|
||||
|
||||
### 开源图形驱动程序
|
||||
|
||||
在过去的五年中,Eric Anholt 一直致力于为树莓派编写开源图形驱动程序。现在,Raspbian 可以使用这个驱动程序加速树莓派上的 Web 浏览、桌面图形和 3D 应用,这取代了以前需要的大量闭源代码。非常感谢 Eric 和博通的贡献。
|
||||
|
||||
按之前预计,树莓派 4 将于明年完成,但由于芯片设计比预期更早投入生产,树莓派 4 因而可以提早到现在发布。
|
||||
|
||||
* * *
|
||||
|
||||
树莓派 4 已经开始发售,你会选择哪个型号呢?在评论中说出你的想法吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/raspberry-pi-4
|
||||
|
||||
作者:[Ben Nuttall][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wahailin](https://github.com/wahailin)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/bennuttall
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/raspberry-pi-4_lead.jpg?itok=2bkk43om (Raspberry Pi 4 board)
|
||||
[2]: https://opensource.com/sites/default/files/uploads/raspberry-pi-4-case.jpg (Raspberry Pi 4 case)
|
||||
[3]: https://opensource.com/sites/default/files/uploads/raspberry-pi-4-usb.jpg (Raspberry Pi 4 USBs)
|
||||
[4]: https://opensource.com/sites/default/files/uploads/raspbian-buster.png (Raspbian Buster)
|
||||
192
published/201906/20190624 Using i3 with multiple monitors.md
Normal file
192
published/201906/20190624 Using i3 with multiple monitors.md
Normal file
@@ -0,0 +1,192 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11031-1.html)
|
||||
[#]: subject: (Using i3 with multiple monitors)
|
||||
[#]: via: (https://fedoramagazine.org/using-i3-with-multiple-monitors/)
|
||||
[#]: author: (Adam Šamalík https://fedoramagazine.org/author/asamalik/)
|
||||
|
||||
将 i3 与多个显示器配合使用
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
你在 Linux 工作站上使用多个显示器吗?一次看到很多东西可能是有益的。但在我们的工作中通常有比实际显示器更多的窗口 —— 这是一件好事,因为一次看到太多东西可能会分散注意力。因此能够切换我们在单个显示器上看到的内容似乎很重要。
|
||||
|
||||
让我们来看看 i3,它是一个流行的平铺窗口管理器,可以与多个显示器配合使用。并且有许多其他窗口管理器没有的便利功能,它能够独立地在各个显示器上切换工作区。
|
||||
|
||||
### 快速介绍 i3
|
||||
|
||||
大约三年前,[Fedora Magazine 已经写了一篇关于 i3 的文章][2]。这是有史以来最受欢迎的文章之一!虽然情况并非总是如此,但 i3 非常稳定,而且那篇文章如今也很准确。所以,这次不会重复太多内容,本篇只涵盖了让 i3 启动和运行的极少内容,如果你是 i3 的新手,想要了解更多基础知识的话,欢迎你继续阅读。
|
||||
|
||||
要在系统上安装 i3,请运行以下命令:
|
||||
|
||||
```
|
||||
$ sudo dnf install i3
|
||||
```
|
||||
|
||||
完成后,注销,然后在登录屏幕上选择 i3 作为窗口管理器,然后重新登录。
|
||||
|
||||
当你第一次运行 i3 时,系统会询问你是否要继续进行自动配置 —— 在此处回答是。之后,你将被要求选择 “mod 键”。如果你不确定,只需接受默认值,即将 Windows/Super 键设置为 mod 键。你将主要使用此键用于窗口管理器中的快捷方式。
|
||||
|
||||
此时,你应该在底部看到一个小条和一个空白屏幕。我们来看看一些基本的快捷方式。
|
||||
|
||||
打开终端:
|
||||
|
||||
```
|
||||
$mod + enter
|
||||
```
|
||||
|
||||
切换到第二个工作区:
|
||||
|
||||
```
|
||||
$mod + 2
|
||||
```
|
||||
|
||||
通过以下两个步骤打开 firefox,首先:
|
||||
|
||||
```
|
||||
$mod + d
|
||||
```
|
||||
|
||||
然后输入 “firefox” 并按回车键。
|
||||
|
||||
将其移动到第一个工作区:
|
||||
|
||||
```
|
||||
$mod + shift + 1
|
||||
```
|
||||
|
||||
切换到第一个工作区:
|
||||
|
||||
```
|
||||
$mod + 1
|
||||
```
|
||||
|
||||
此时,你将并排看到一个终端和一个 firefox 窗口。要关闭窗口,请按:
|
||||
|
||||
```
|
||||
$mod + shift + q
|
||||
```
|
||||
|
||||
还有更多的快捷方式,但这些足够让你开始使用 i3。
|
||||
|
||||
要退出 i3(并退出登录)按:
|
||||
|
||||
```
|
||||
$mod + shift + e
|
||||
```
|
||||
|
||||
然后在右上角使用鼠标确认。
|
||||
|
||||
### 同时让多个屏幕工作
|
||||
|
||||
现在我们已经启动并运行了 i3,让我们把所有这些屏幕都用到!
|
||||
|
||||
为此,我们需要使用命令行,因为 i3 非常轻量级,并且没有 GUI 来管理其他屏幕。如果这听起来很难也不用担心,它实际上非常简单!
|
||||
|
||||
我们将使用的命令称为 `xrandr`。如果你的系统上没有 `xrandr`,请运行以下命令安装:
|
||||
|
||||
```
|
||||
$ sudo dnf install xrandr
|
||||
```
|
||||
|
||||
当它安装完毕后,让我们继续运行它:
|
||||
|
||||
```
|
||||
$ xrandr
|
||||
```
|
||||
|
||||
输出列出了所有可用输出设备,并通过显示支持的分辨率指示哪些输出连接了屏幕(通过电缆连接的显示器)。好消息是,我们不需要关心使它们工作的分辨率。
|
||||
|
||||
这个例子显示了笔记本电脑的主屏幕(名为 eDP1),以及连接到 HDMI-2 输出的第二个显示器,它位于笔记本电脑的右侧。要打开它,请运行以下命令:
|
||||
|
||||
```
|
||||
$ xrandr --output HDMI-2 --auto --right-of eDP1
|
||||
```
|
||||
|
||||
就是这样!你的屏幕现已激活。
|
||||
|
||||
![第二个屏幕激活。截屏上显示命令与文章中略有不同,它设置了更小的分辨率以使截屏适合阅读][3]
|
||||
|
||||
### 在多个屏幕上管理工作区
|
||||
|
||||
在多个屏幕上切换工作区和创建新工作区非常类似于只有一个屏幕的情况。新工作区会在当前处于活动状态(鼠标光标所在位置)的屏幕上创建。
|
||||
|
||||
因此,要切换到特定工作区(或在不存在的情况下创建新工作区),请按:
|
||||
|
||||
```
|
||||
$mod + NUMBER
|
||||
```
|
||||
|
||||
你可以独立切换各个显示器上的工作区!
|
||||
|
||||
![工作空间 2 在左侧屏幕,工作空间 4 在右侧屏幕][4]
|
||||
|
||||
![左侧屏幕切换为工作空间 3,右侧屏幕仍为工作空间 4][5]
|
||||
|
||||
![右侧屏幕切换为工作空间 5,左侧屏幕仍为空间空间 3][6]
|
||||
|
||||
### 在显示器之间移动工作区
|
||||
|
||||
我们可以通过以下命令将窗口移动到不同的工作区:
|
||||
|
||||
```
|
||||
$mod + shift + NUMBER
|
||||
```
|
||||
|
||||
我们也可以将工作区移动到不同的屏幕。但是,此操作没有默认快捷方式,因此我们必须先创建它。
|
||||
|
||||
要创建自定义快捷方式,你需要在你选择的文本编辑器中打开配置文件(本文使用 `vim`):
|
||||
|
||||
```
|
||||
$ vim ~/.config/i3/config
|
||||
```
|
||||
|
||||
并将以下行添加到配置文件的最底部:
|
||||
|
||||
```
|
||||
# Moving workspaces between screens
|
||||
bindsym $mod+p move workspace to output right
|
||||
```
|
||||
|
||||
保存、关闭并重新加载以使配置生效,按下:
|
||||
|
||||
```
|
||||
$mod + shift + r
|
||||
```
|
||||
|
||||
现在你可以将活跃的工作区移动到第二个显示器:
|
||||
|
||||
```
|
||||
$mod + p
|
||||
```
|
||||
|
||||
![打开火狐浏览器的工作空间 2 在左侧][7]
|
||||
|
||||
![打开火狐浏览器的工作空间 2 移动到第二个屏幕][8]
|
||||
|
||||
就是这些了!享受你的新多显示器体验,并了解更多 i3,欢迎阅读 Fedora Magazine 上之前关于 i3 的文章,或者查看官方 i3 文档。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/using-i3-with-multiple-monitors/
|
||||
|
||||
作者:[Adam Šamalík][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/asamalik/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/i3-title-816x345.jpg
|
||||
[2]: https://fedoramagazine.org/getting-started-i3-window-manager/
|
||||
[3]: https://fedoramagazine.org/wp-content/uploads/2019/06/0-1-1024x384.png
|
||||
[4]: https://fedoramagazine.org/wp-content/uploads/2019/06/1-1-1024x384.png
|
||||
[5]: https://fedoramagazine.org/wp-content/uploads/2019/06/1-2-1024x384.png
|
||||
[6]: https://fedoramagazine.org/wp-content/uploads/2019/06/1-3-1024x384.png
|
||||
[7]: https://fedoramagazine.org/wp-content/uploads/2019/06/2-1-1024x384.png
|
||||
[8]: https://fedoramagazine.org/wp-content/uploads/2019/06/2-2-1024x384.png
|
||||
@@ -0,0 +1,97 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11033-1.html)
|
||||
[#]: subject: (FreeDOS turns 25 years old: An origin story)
|
||||
[#]: via: (https://opensource.com/article/19/6/freedos-anniversary)
|
||||
[#]: author: (Jim Hall https://opensource.com/users/jim-hall)
|
||||
|
||||
25 岁的 FreeDOS:起源故事
|
||||
======
|
||||
|
||||
> 操作系统的历史是开发人员共同造物的开源软件模型的很好例子。
|
||||
|
||||

|
||||
|
||||
6 月 29 日是 [FreeDOS][2] 25 周年的日子。不管对于哪个开源软件项目来说,这都是一个重要的里程碑,我为过去这 1/4 个世纪来我们在这方面所做的工作感到自豪。我也为我们如何构建 FreeDOS 感到自豪,因为它是开源软件模型如何工作的一个很好的例子。
|
||||
|
||||
在它的那个时代,MS-DOS 是一个功能强大的操作系统。自从我的父母用新的 IBM 机器取代了老化的 Apple II 计算机以来,我已经使用 DOS 多年了。MS-DOS 提供了一个灵活的命令行,我非常喜欢它,它可以方便地操作我的文件。多年来,我学会了如何在 C 中编写自己的实用程序,以进一步扩展其命令行功能。
|
||||
|
||||
大约在 1994 年,微软宣布其下一代的 Windows 将取消 MS-DOS。但我喜欢 DOS,即使我已经开始迁移到 Linux,我仍然会启动到 MS-DOS 来运行一些 Linux 尚未拥有的应用程序。
|
||||
|
||||
我想,如果我们想留下 DOS,我们需要自己编写一个。FreeDOS 就是这样诞生的。
|
||||
|
||||
1994 年 6 月 29 日,我向 Usenet 上的 comp.os.msdos.apps 新闻组发表了关于我的想法的一个小小公告:
|
||||
|
||||
> PD-DOS 项目公告:
|
||||
>
|
||||
> 几个月前,我发布了有关启动公共域(PD)版本 DOS 的文章。当时对此的普遍支持很强烈,很多人都赞同:“开始编写吧!”所以,我…
|
||||
>
|
||||
> 宣布开发 PD-DOS 的首次尝试。我写了一个“清单”来描述这样的一个项目的目标和工作大纲,以及一个“任务列表”,它准确地显示了需要编码开发的内容。我会在这里发布,然后讨论。
|
||||
>
|
||||
|
||||
虽然我宣布该项目为 PD-DOS(“公共领域”的意思,缩写是为了模仿 IBM 的“PC-DOS”),但我们很快将名称改为 Free-DOS,再后来又改为 FreeDOS。
|
||||
|
||||
我马上开始开发它。首先,我分享了我编写的用于扩展 DOS 命令行功能的实用程序。它们中的许多程序都重现了 MS-DOS 功能,包括 `CLS`、`DATE`、`DEL`、`FIND`、`HELP` 和 `MORE`。有些是我从 Unix 借来的新功能,比如 `TEE` 和 `TRCH`(Unix 的 `tr` 的简单实现)。我贡献了十几个 FreeDOS 工具。
|
||||
|
||||
通过分享我的实用程序,我给了其他开发人员一个起点。通过在 [GNU 通用公共许可证][3](GNU GPL)下共享我的源代码,我隐含地允许其他人添加新功能并修复错误。
|
||||
|
||||
看到 FreeDOS 开始成型的其他开发人员联系了我并希望提供帮助。Tim Norman 是第一个人,Tim 自愿编写命令行 shell(`COMMAND.COM`,后来命名为 `FreeCOM`)。其他人贡献了复制或扩展了 DOS 命令行的实用程序。
|
||||
|
||||
我们尽快发布了第一个 alpha 版本。在宣布了 FreeDOS 后不到三个月,我们就有了一个集合了我们所编写的功能的 Alpha 1 发行版。当我们发布 Alpha 5 时,FreeDOS 已经拥有了 60 多个实用程序。FreeDOS 包含了 MS-DOS 中从未想过的功能,包括通过 PPP 拨号驱动程序实现的互联网连接,以及使用主 VGA 监视器和辅助单色监视器的双显示器支持。
|
||||
|
||||
新的开发人员加入了该项目,我们很欢迎他们。到 1998 年 10 月,感谢 Pat Villani,FreeDOS 有了一个可以工作的内核。FreeDOS 还提供了许多新功能,不仅带来了与 MS-DOS 的同等性,而且超越了 MS-DOS,包括 ANSI 支持和类似 Unix lpr 的打印后台处理程序。
|
||||
|
||||
你可能熟悉其他的里程碑版本。我们继续向 1.0 版本迈进,终于在 2006 年 9 月发布了 FreeDOS 1.0,在 2012 年 1 月发布了 FreeDOS 1.1,在 2016 年 12 月发布了 FreeDOS 1.2。而 MS-DOS 很久以前就停止了开发,因此我们在 1.0 发布之后不需要经常更新了。
|
||||
|
||||
如今,FreeDOS 已经是一个非常现代的 DOS。我们已经超越了“经典 DOS”,现在 FreeDOS 拥有许多开发工具,如编译器、汇编器和调试器。除了普通的 DOS Edit 编辑器之外,我们还有许多编辑器,包括 Fed、Pico、TDE 以及 Emacs 和 Vi 的一个版本。FreeDOS 支持网络,甚至还提供简单的图形 Web 浏览器(Dillo)。我们有大量的新工具,包括许多可以让 Linux 用户感到熟悉的实用工具。
|
||||
|
||||
正因为开发人员的共同创造,FreeDOS 才走到如今。本着开源软件的精神,我们通过修复错误和添加新功能为彼此的工作做出了贡献。我们将用户视为共同开发者;我们总能找到方法来吸引贡献者,无论是编写代码还是编写文档。我们基于优点达成共识。如果这听起来很熟悉,那是因为这些是开源软件的核心价值:透明度、协作、尽早发布、经常发布、精英管理和社区。这就是[开源方式][4]!
|
||||
|
||||
我鼓励你下载 FreeDOS 1.2 并尝试一下。
|
||||
|
||||
### 更多资源
|
||||
|
||||
* [FreeDOS 官方网站][2]
|
||||
* [FreeDOS wiki][5]
|
||||
* [下载 FreeDOS 1.2][6]
|
||||
* [FreeDOS 的免费电子书][7]
|
||||
* [FreeDOS 的简单介绍][8]
|
||||
* [FreeDOS 起源与革命][9]
|
||||
* [4 个 FreeDOS 的有趣事实][10]
|
||||
* [如何使用 FreeDOS 升级你的系统 BIOS][11]
|
||||
* [庆祝 FreeDOS 24 岁生日:有用的命令速查表][12]
|
||||
* [如何在 Linux 中运行 DOS 程序][13]
|
||||
* [让 DOS 活到现在并通过开源来起步][14]
|
||||
* [在树莓派上运行 DOS][15]
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/freedos-anniversary
|
||||
|
||||
作者:[Jim Hall][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[wxy](https://github.com/wxy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jim-hall
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/freedos-fish-laptop-color.png?itok=vfv_Lpph (FreeDOS fish logo and command prompt on computer)
|
||||
[2]: https://www.freedos.org/
|
||||
[3]: https://www.gnu.org/licenses/licenses.en.html
|
||||
[4]: https://opensource.com/open-source-way
|
||||
[5]: http://wiki.freedos.org/
|
||||
[6]: https://www.freedos.org/download/
|
||||
[7]: https://www.freedos.org/ebook/
|
||||
[8]:https://linux.cn/article-9983-1.html
|
||||
[9]: https://opensource.com/article/17/10/freedos
|
||||
[10]: https://opensource.com/article/17/6/freedos-still-cool-today
|
||||
[11]: https://opensource.com/article/17/6/upgrade-bios-freedos
|
||||
[12]: https://opensource.com/article/18/6/freedos-commands-cheat-sheet
|
||||
[13]: https://linux.cn/article-9014-1.html
|
||||
[14]: https://opensource.com/life/16/9/interview-jim-hall-freedos
|
||||
[15]: https://linux.cn/article-9544-1.html
|
||||
Reference in New Issue
Block a user