mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
Merge branch 'master' of github.com:LCTT/TranslateProject into 20190912
This commit is contained in:
commit
0467943511
@ -0,0 +1,76 @@
|
||||
用 autoplank 在多个显示器上使用 Plank 扩展坞
|
||||
======
|
||||
|
||||
![](https://3.bp.blogspot.com/-BNHa6rP_kGk/W22cJrT3ghI/AAAAAAAABWA/TAKZgxJfYuwz-Me-M135-LWYl5qvs6cIwCLcBGAs/s640/plank-dock.png)
|
||||
|
||||
[autoplank][1] 是用 Go 语言编写的小型工具,它为 Plank 扩展坞增加了多显示器支持,而无需创建[多个][2]扩展坞。
|
||||
|
||||
当你将鼠标光标移动到显示器的底部时,`autoplank` 会使用 `xdotool` 检测到你的鼠标移动,并且自动将 Plank 扩展坞移动到该显示器。该工具仅在将 Plank 设置为在屏幕底部的情况下工作(至少目前如此)。
|
||||
|
||||
在 Plank 实际出现在鼠标所在的显示器上前会稍有延迟。开发人员说这是有意设计的,以确保你确实要在该显示器上访问 Plank。显示 Plank 之前的时间延迟目前尚不可配置,但将来可能会改变。
|
||||
|
||||
`autoplank` 可以在 elementary OS 以及其它的桌面环境或发行版上使用。
|
||||
|
||||
Plank 是一个简单的扩展坞,它显示了正在运行的应用程序/窗口的图标。它允许将应用程序固定到扩展坞,并带有一些内置的简单“扩展组件”:剪贴板管理器、时钟、CPU 监视器、显示桌面和垃圾桶。要访问其设置,请按住 `Ctrl` 键,同时右键单击 Plank 扩展坞上的任意位置,然后单击 “Preferences”。
|
||||
|
||||
Plank 默认用在 elementary OS 中,但也可以在任何桌面环境或 Linux 发行版中使用。
|
||||
|
||||
### 安装 autoplank
|
||||
|
||||
在其 GitHub 页面上,提到你需要 Go 1.8 或更高版本才能构建 `autoplank`,但我能够在 Ubuntu 16.04(elementary OS 0.4 Loki)中使用 Go 1.6 成功构建它。
|
||||
|
||||
开发者说:
|
||||
|
||||
1、安装所需的依赖项。
|
||||
|
||||
要构建 `autoplank`,你需要 Go(在 Debian、Ubuntu、elementary OS 等中使用 golang-go)。要获取最新的 Git 代码,你还需要 `git`,要在显示器上检测你的鼠标移动,还需要安装 `xdotool`。
|
||||
|
||||
使用以下命令将它们安装在 Ubuntu、Debian、elementary OS 等中:
|
||||
|
||||
```
|
||||
sudo apt install git golang-go xdotool
|
||||
```
|
||||
|
||||
2、从 [Git][1] 获取最新的 `autoplank`,构建并将其安装在 `/usr/local/bin` 中:
|
||||
|
||||
```
|
||||
git clone https://github.com/abiosoft/autoplank
|
||||
cd autoplank
|
||||
go build -o autoplank
|
||||
sudo mv autoplank /usr/local/bin/
|
||||
```
|
||||
|
||||
你现在可以从主目录中删除 `autoplank` 文件夹。
|
||||
|
||||
当你想卸载 `autoplank` 时,只需删除 `/usr/local/bin/autoplank` 二进制文件(`sudo rm /usr/local/bin/autoplank`)。
|
||||
|
||||
3、将 `autoplank` 添加到启动中。
|
||||
|
||||
如果你想在将 `autoplank` 添加到启动项或为其创建 systemd 服务之前尝试使用 `autoplank`,则只需在终端中键入 `/usr/local/bin/autoplank` 即可启动它。
|
||||
|
||||
要使 `autoplank` 在重新启动后起作用,你需要将其添加到启动项中。确切的操作步骤取决于你的桌面环境,因此我不会确切告诉你如何在每个桌面环境中执行此操作,但是请记住在启动项中将 `/usr/local/bin/autoplank` 设置为可执行文件。
|
||||
|
||||
在 elementary OS 中,你可以打开“系统设置”,然后在“应用程序”的“启动”选项卡上,单击窗口左下角的“+”按钮,然后在“键入自定义命令”字段中添加 “/usr/local/bin/autoplank”:
|
||||
|
||||
![](https://4.bp.blogspot.com/-hbh1PLDX-0A/W22eIhEQ1iI/AAAAAAAABWM/GkgrzaPPjA8CHnxF5L4UPPUG_vPa9VT-gCLcBGAs/s640/autoplank-startup-elementaryos.png)
|
||||
|
||||
如[此处][3]的解释,使用 `autoplank` 的另一种方法是通过为其创建 systemd 服务。将 systemd 服务用于 autoplank 的优点是,无论它出于何种原因而崩溃,都可以重新启动 `autoplank`。可以使用 systemd 服务或将 `autoplank` 添加到启动应用程序中(但不要同时使用两者)。
|
||||
|
||||
4、完成此操作后,注销、登录,`autoplank` 应该已在运行,因此你可以将鼠标移至显示器底部以将 Plank 停靠此处。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linuxuprising.com/2018/08/use-plank-on-multiple-monitors-without.html
|
||||
|
||||
作者:[Logix][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://plus.google.com/118280394805678839070
|
||||
[1]:https://github.com/abiosoft/autoplank
|
||||
[2]:https://answers.launchpad.net/plank/+question/204593
|
||||
[3]:https://github.com/abiosoft/autoplank#optional-create-a-service
|
||||
[4]:https://www.reddit.com/r/elementaryos/comments/95a879/autoplank_use_plank_on_multimonitor_setup/e3r9saq/
|
@ -0,0 +1,73 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11575-1.html)
|
||||
[#]: subject: (Why blockchain (might be) coming to an IoT implementation near you)
|
||||
[#]: via: (https://www.networkworld.com/article/3386881/why-blockchain-might-be-coming-to-an-iot-implementation-near-you.html)
|
||||
[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/)
|
||||
|
||||
为什么区块链(可能会)来到你身边的物联网
|
||||
======
|
||||
|
||||
![MF3D / Getty Images][1]
|
||||
|
||||
各个公司发现,物联网与最近其他许多流行的企业级计算技术有着良好的合作关系,以支持加密货币而闻名的创新的分布式信任系统的区块链也不例外。然而,在物联网应用中实施区块链可能具有挑战性,并且需要对技术有深入的了解。
|
||||
|
||||
区块链是一个跟踪各种交易的分布式账本。链上的每个“块”都包含要防止篡改的交易记录或其他数据,并通过加密散列链接到前一个,这意味着对块的任何篡改都将使该链接无效。节点(几乎可以是其中装有 CPU 的任何节点)通过分布式的对等网络进行通信,以共享数据并确保链中数据的有效性。
|
||||
|
||||
北卡罗来纳大学格林波若分校的管理学教授 Nir Kshetri 表示,区块链系统之所以有效,是因为所有的块都必须就它们所保护的数据的细节达成一致。如果有人尝试更改给定节点上先前的事务,则存储在网络上的其余数据会回推回来。“数据的旧记录仍然存在,” Kshetri 说。
|
||||
|
||||
这是一项强大的安全技术 —— 如果没有坏人成功控制给定区块链上的所有(LCTT 译注:应为“大部分”)节点([著名的“51% 攻击”][4]),那么该区块链保护的数据就不会被伪造或以其他方式弄乱。因此,对于在物联网世界某些角落的公司来说,使用区块链是一种有吸引力的选择也就不足为奇了。
|
||||
|
||||
物联网安全初创企业 NXMLabs 的首席技术官兼联合创始人 Jay Fallah 认为,除了区块链能够在网络上安全地分发可信信息的能力这一事实之外,部分原因还在于区块链在技术堆栈中的地位。
|
||||
|
||||
“区块链站在一个非常有趣的交叉点。在过去的 15 年中,在存储、CPU 等方面,计算技术一直在加速发展,但是直到最近,网络技术并没有发生太大变化。”他说,“ 区块链不是网络技术、不是数据技术,而是二者兼具。”
|
||||
|
||||
### 区块链和物联网
|
||||
|
||||
区块链作为物联网世界的部分意义取决于你在和谁交谈以及他们在出售什么,但是最接近的概括可能来自企业区块链供应商 Filament 的首席执行官 Allison Clift-Jenning。
|
||||
|
||||
她说:“在任何地方,人们都想互相信任,并且用的是非常古老的方式,这通常是进入场景的好地方。”
|
||||
|
||||
直接从 Filament 自己的客户群中挑选出来的一个例子是二手车销售。Filament 与“一家主要的底特律汽车制造商”合作,创建了一个受信任的车辆历史平台,该平台基于一种设备,该设备可插入二手车的诊断端口,从那里获取信息,并将该数据写入区块链。像这样,二手车的历史记录就是不可变的,包括它的安全气囊是否曾经打开过,是否被水淹过等等。任何不道德的二手车或不诚实的前车主都无法更改数据,甚至拔掉设备也将意味着记录中存在可疑的空白期。
|
||||
|
||||
SAP 物联网高级副总裁兼全球负责人 Elvira Wallis 表示,当今大多数区块链物联网方案都与信任和数据验证有关。
|
||||
|
||||
她说:“我们遇到的大多数用例都在项目的跟踪和溯源领域,”她举例说明了高端食品的农场到餐桌跟踪系统,该系统使用安装在板条箱和卡车上的区块链节点,这样就可以为物品在运输基础设施中创建无懈可击的记录。(例如,该牛排在这样的温度下冷藏了多长时间,今天运输了多长时间,等等。)
|
||||
|
||||
### 将区块链与物联网一起使用是个好主意吗?
|
||||
|
||||
不同的供应商针对不同的用例出售不同的基于区块链的产品,这些产品使用不同的区块链技术实现,其中一些与加密货币中所使用的经典的、线性的、挖矿式交易区块链不太一样。
|
||||
|
||||
这意味着你目前需要从供应商那里购买特定功能。451 Research 高级分析师 Csilla Zsigri 表示,很少有客户组织拥有可以实施区块链安全系统的内部专家。
|
||||
|
||||
她说,区块链技术的任何智能应用的想法都是发挥其优势,为关键信息创建可信赖的平台。
|
||||
|
||||
Zsigri 说:“这就是我真正看到增值的地方,只是增加了一层信任和验证。”
|
||||
|
||||
专家们一致认为,尽管相当了解基于区块链的物联网应用程序的基本概念,但它并不适用于每个物联网用例。 将区块链应用于非交易系统(尽管有例外,包括 NXM Labs 的用于物联网设备的基于区块链配置的产品)通常不是正确的举动。
|
||||
|
||||
如果不需要在两个不同的参与方之间共享数据,而是简单地将数据从传感器移到后端,那么区块链通常就没有意义,因为它实际上并没有为当前大多数物联网实现中的数据分析增加任何关键的增值。
|
||||
|
||||
“今天,我们仍处于区块链的早期拨号时代。”Clift-Jennings 说,“它比典型的数据库要慢,它甚至无法读取,也常常没有查询引擎。从本质上讲,你并没有真正获得隐私。”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3386881/why-blockchain-might-be-coming-to-an-iot-implementation-near-you.html
|
||||
|
||||
作者:[Jon Gold][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/Jon-Gold/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://images.idgesg.net/images/article/2019/02/chains_binary_data_blockchain_security_by_mf3d_gettyimages-941175690_2400x1600-100788434-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://bitcoinist.com/51-percent-attack-hackers-steals-18-million-bitcoin-gold-btg-tokens/
|
||||
[5]: https://www.facebook.com/NetworkWorld/
|
||||
[6]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,63 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11565-1.html)
|
||||
[#]: subject: (Why containers and Kubernetes have the potential to run almost anything)
|
||||
[#]: via: (https://opensource.com/article/19/6/kubernetes-potential-run-anything)
|
||||
[#]: author: (Scott McCarty https://opensource.com/users/fatherlinux)
|
||||
|
||||
为什么容器和 Kubernetes 有潜力运行一切
|
||||
======
|
||||
|
||||
> 不仅可以部署简单的应用程序,还可以用 Kubernetes 运维器应对第 2 天运营。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201911/12/011140mp75sd0ynppd77da.jpg)
|
||||
|
||||
在我的第一篇文章 [为什么说 Kubernetes 是一辆翻斗车][2] 中,我谈到了 Kubernetes 如何在定义、分享和运行应用程序方面很出色,类似于翻斗车在移动垃圾方面很出色。在第二篇中,[如何跨越 Kubernetes 学习曲线][3],我解释了 Kubernetes 的学习曲线实际上与运行任何生产环境中的应用程序的学习曲线相同,这确实比学习所有传统组件要容易(如负载均衡器、路由器、防火墙、交换机、集群软件、集群文件系统等)。这是 DevOps,是开发人员和运维人员之间的合作,用于指定事物在生产环境中的运行方式,这意味着双方都需要学习。在第三篇 [Kubernetes 基础:首先学习如何使用][4] 中,我重新设计了 Kubernetes 的学习框架,重点是驾驶翻斗车而不是制造或装备翻斗车。在第四篇文章 [帮助你驾驭 Kubernetes 的 4 个工具][5] 中,我分享了我喜爱的工具,这些工具可帮助你在 Kubernetes 中构建应用程序(驾驶翻斗车)。
|
||||
|
||||
在这最后一篇文章中,我会分享我为什么对在 Kubernetes 上运行应用程序的未来如此兴奋的原因。
|
||||
|
||||
从一开始,Kubernetes 就能够很好地运行基于 Web 的工作负载(容器化的)。Web 服务器、Java 和相关的应用程序服务器(PHP、Python等)之类的工作负载都可以正常工作。该平台处理诸如 DNS、负载平衡和 SSH(由 `kubectl exec` 取代)之类的支持服务。在我的职业生涯的大部分时间里,这些都是我在生产环境中运行的工作负载,因此,我立即意识到,除了 DevOps 之外,除了敏捷之外,使用 Kubernetes 运行生产环境工作负载的强大功能。即使是我们几乎不改变我们的文化习惯,也可以提高效率。调试和退役变得非常容易,而这对于传统 IT 来说是极为困难的。因此,从早期开始,Kubernetes 就用一种单一的配置语言(Kube YAML/Json)为我提供了对生产环境工作负载进行建模所需的所有基本原语。
|
||||
|
||||
但是,如果你需要运行具有复制功能的多主 MySQL,会发生什么情况?使用 Galera 的冗余数据呢?你如何进行快照和备份?那么像 SAP 这样复杂的工作呢?使用 Kubernetes,简单的应用程序(Web 服务器等)的第 0 天(部署)相当简单,但是没有解决第 2 天的运营和工作负载。这并不是说,具有复杂工作负载的第 2 天运营要比传统 IT 难解决,而是使用 Kubernetes 并没有使它们变得更容易。每个用户都要设计自己的天才想法来解决这些问题,这基本上是当今的现状。在过去的五年中,我遇到的第一类问题是复杂工作负载的第 2 天操作。(LCTT 译注:在软件生命周期中,第 0 天是指软件的设计阶段;第 1 天是指软件的开发和部署阶段;第 2 天是指生产环境中的软件运维阶段。)
|
||||
|
||||
值得庆幸的是,随着 Kubernetes <ruby>运维器<rt>Operator</rt></ruby>的出现,这种情况正在改变。随着运维器的出现,我们现在有了一个框架,可以将第 2 天的运维知识汇总到平台中。现在,我们可以应用我在 [Kubernetes 基础:首先学习如何使用][4] 中描述的相同的定义状态、实际状态的方法,现在我们可以定义、自动化和维护各种各样的系统管理任务。
|
||||
|
||||
(LCTT 译注: Operator 是 Kubernetes 中的一种可以完成运维工程师的特定工作的组件,业界大多没有翻译这个名词,此处仿运维工程师例首倡翻译为“运维器”。)
|
||||
|
||||
我经常将运维器称为“系统管理机器人”,因为它们实质上是在第 2 天的工作中整理出一堆运维知识,该知识涉及<ruby>主题专家<rt>Subject Matter Expert</rt></ruby>(SME、例如数据库管理员或系统管理员)针对的工作负载类型(数据库、Web 服务器等),通常会记录在 Wiki 中的某个地方。这些知识放在 Wiki 中的问题是,为了将该知识应用于解决问题,我们需要:
|
||||
|
||||
1. 生成事件,通常监控系统会发现故障,然后我们创建故障单
|
||||
2. SME 人员必须对此问题进行调查,即使这是我们之前见过几百万次的问题
|
||||
3. SME 人员必须执行该知识(执行备份/还原、配置 Galera 或事务复制等)
|
||||
|
||||
通过运维器,所有这些 SME 知识都可以嵌入到单独的容器镜像中,该镜像在有实际工作负荷之前就已部署。 我们部署运维器容器,然后运维器部署和管理一个或多个工作负载实例。然后,我们使用“运维器生命周期管理器”(Katacoda 教程)之类的方法来管理运维器。
|
||||
|
||||
因此,随着我们进一步使用 Kubernetes,我们不仅简化了应用程序的部署,而且简化了整个生命周期的管理。运维器还为我们提供了工具,可以管理具有深层配置要求(群集、复制、修复、备份/还原)的非常复杂的有状态应用程序。而且,最好的地方是,构建容器的人员可能是做第 2 天运维的主题专家,因此现在他们可以将这些知识嵌入到操作环境中。
|
||||
|
||||
### 本系列的总结
|
||||
|
||||
Kubernetes 的未来是光明的,就像之前的虚拟化一样,工作负载的扩展是不可避免的。学习如何驾驭 Kubernetes 可能是开发人员或系统管理员可以对自己的职业发展做出的最大投资。随着工作负载的增多,职业机会也将增加。因此,这是驾驶一辆令人惊叹的 [在移动垃圾时非常优雅的翻斗车][2]……
|
||||
|
||||
你可能想在 Twitter 上关注我,我在 [@fatherlinux][6] 上分享有关此主题的很多内容。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/6/kubernetes-potential-run-anything
|
||||
|
||||
作者:[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/fail_progress_cycle_momentum_arrow.png?itok=q-ZFa_Eh (arrows cycle symbol for failing faster)
|
||||
[2]: https://opensource.com/article/19/6/kubernetes-dump-truck
|
||||
[3]: https://opensource.com/article/19/6/kubernetes-learning-curve
|
||||
[4]: https://opensource.com/article/19/6/kubernetes-basics
|
||||
[5]: https://opensource.com/article/19/6/tools-drive-kubernetes
|
||||
[6]: https://twitter.com/fatherlinux
|
322
published/20190801 Linux permissions 101.md
Normal file
322
published/20190801 Linux permissions 101.md
Normal file
@ -0,0 +1,322 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11553-1.html)
|
||||
[#]: subject: (Linux permissions 101)
|
||||
[#]: via: (https://opensource.com/article/19/8/linux-permissions-101)
|
||||
[#]: author: (Alex Juarez https://opensource.com/users/mralexjuarezhttps://opensource.com/users/marcobravohttps://opensource.com/users/greg-p)
|
||||
|
||||
全面介绍 Linux 权限
|
||||
======
|
||||
|
||||
> 知道如何控制用户对文件的访问是一项基本的系统管理技能。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201911/08/233101y043rn4ua00r3lqn.jpg)
|
||||
|
||||
了解 Linux 权限以及如何控制哪些用户可以访问文件是系统管理的一项基本技能。
|
||||
|
||||
本文将介绍标准 Linux 文件系统权限,并进一步研究特殊权限,以及使用 `umask` 来解释默认权限作为文章的结束。
|
||||
|
||||
### 理解 ls 命令的输出
|
||||
|
||||
在讨论如何修改权限之前,我们需要知道如何查看权限。通过 `ls` 命令的长列表参数(`-l`)为我们提供了有关文件的许多信息。
|
||||
|
||||
```
|
||||
$ ls -lAh
|
||||
total 20K
|
||||
-rwxr-xr--+ 1 root root 0 Mar 4 19:39 file1
|
||||
-rw-rw-rw-. 1 root root 0 Mar 4 19:39 file10
|
||||
-rwxrwxr--+ 1 root root 0 Mar 4 19:39 file2
|
||||
-rw-rw-rw-. 1 root root 0 Mar 4 19:39 file8
|
||||
-rw-rw-rw-. 1 root root 0 Mar 4 19:39 file9
|
||||
drwxrwxrwx. 2 root root 4.0K Mar 4 20:04 testdir
|
||||
```
|
||||
|
||||
为了理解这些是什么意思,让我们将关于权限的输出分解为各个部分。单独理解每个部分会更容易。
|
||||
|
||||
让我们看看在上面的输出中的最后一行的每个组件:
|
||||
|
||||
```
|
||||
drwxrwxrwx. 2 root root 4.0K Mar 4 20:04 testdir
|
||||
```
|
||||
|
||||
第 1 节 | 第 2 节 | 第 3 节 | 第 4 节 | 第 5 节 | 第 6 节 | 第 7 节
|
||||
---|---|---|---|---|---|---
|
||||
`d` | `rwx` | `rwx` | `rwx` | `.` | `root` | `root`
|
||||
|
||||
第 1 节(左侧)显示文件的类型。
|
||||
|
||||
符号 | 类型
|
||||
---|---
|
||||
`d` | 目录
|
||||
`-` | 常规文件
|
||||
`l` | 软链接
|
||||
|
||||
`ls` 的 [info 页面][2]完整列出了不同的文件类型。
|
||||
|
||||
每个文件都有三种访问方式:
|
||||
|
||||
* 属主
|
||||
* 组
|
||||
* 所有其他人
|
||||
|
||||
第 2、3 和 4 节涉及用户(属主)、组和“其他用户”权限。每个部分都可以包含 `r`(读取)、`w`(写入)和 `x`(执行)权限的组合。
|
||||
|
||||
每个权限还分配了一个数值,这在以八进制表示形式讨论权限时很重要。
|
||||
|
||||
权限 | 八进制值
|
||||
---|---
|
||||
`r` | 4
|
||||
`w` | 2
|
||||
`x` | 1
|
||||
|
||||
第 5 节描述了其他替代访问方法,例如 SELinux 或文件访问控制列表(FACL)。
|
||||
|
||||
访问方法 | 字符
|
||||
---|---
|
||||
没有其它访问方法 | `-`
|
||||
SELinux | `.`
|
||||
FACL | `+`
|
||||
各种方法的组合 | `+`
|
||||
|
||||
第 6 节和第 7 节分别是属主和组的名称。
|
||||
|
||||
### 使用 chown 和 chmod
|
||||
|
||||
#### chown 命令
|
||||
|
||||
`chown`(更改所有权)命令用于更改文件的用户和组的所有权。
|
||||
|
||||
要将文件 `foo` 的用户和组的所有权更改为 `root`,我们可以使用以下命令:
|
||||
|
||||
```
|
||||
$ chown root:root foo
|
||||
$ chown root: foo
|
||||
```
|
||||
|
||||
在用户名后跟冒号(`:`)运行该命令将同时设置用户和组所有权。
|
||||
|
||||
要仅将文件 `foo` 的用户所有权设置为 `root` 用户,请输入:
|
||||
|
||||
```
|
||||
$ chown root foo
|
||||
```
|
||||
|
||||
要仅更改文件 `foo` 的组所有权,请在组之前加冒号:
|
||||
|
||||
```
|
||||
$ chown :root foo
|
||||
```
|
||||
|
||||
#### chmod 命令
|
||||
|
||||
`chmod`(更改模式)命令控制属主、组以及既不是属主也不属于与文件关联的组的所有其他用户的文件许可权。
|
||||
|
||||
`chmod` 命令可以以八进制(例如 `755`、`644` 等)和符号(例如 `u+rwx`、`g-rwx`、`o=rw`)格式设置权限。
|
||||
|
||||
八进制表示法将 4 个“点”分配给“读取”,将 2 个“点”分配给“写入”,将 1 个点分配给“执行”。如果要给用户(属主)分配“读取”权限,则将 4 分配给第一个插槽,但是如果要添加“写入”权限,则必须添加 2。如果要添加“执行”,则要添加 1。我们对每种权限类型执行此操作:属主、组和其他。
|
||||
|
||||
例如,如果我们想将“读取”、“写入”和“执行”分配给文件的属主,但仅将“读取”和“执行”分配给组成员和所有其他用户,则我们应使用 `755`(八进制格式)。这是属主的所有权限位(`4+2+1`),但组和其他权限的所有权限位只有 `4` 和 `1`(`4+1`)。
|
||||
|
||||
> 细分为:4+2+1=7,4+1=5 和 4+1=5。
|
||||
|
||||
如果我们想将“读取”和“写入”分配给文件的属主,而只将“读取”分配给组的成员和所有其他用户,则可以如下使用 `chmod`:
|
||||
|
||||
```
|
||||
$ chmod 644 foo_file
|
||||
```
|
||||
|
||||
在下面的示例中,我们在不同的分组中使用符号表示法。注意字母 `u`、`g` 和 `o` 分别代表“用户”(属主)、“组”和“其他”。我们将 `u`、`g` 和 `o` 与 `+`、`-` 或 `=` 结合使用来添加、删除或设置权限位。
|
||||
|
||||
要将“执行”位添加到所有权权限集中:
|
||||
|
||||
```
|
||||
$ chmod u+x foo_file
|
||||
```
|
||||
|
||||
要从组成员中删除“读取”、“写入”和“执行”:
|
||||
|
||||
```
|
||||
$ chmod g-rwx foo_file
|
||||
```
|
||||
|
||||
要将所有其他用户的所有权设置为“读取”和“写入”:
|
||||
|
||||
```
|
||||
$ chmod o=rw
|
||||
```
|
||||
|
||||
### 特殊位:设置 UID、设置 GID 和粘滞位
|
||||
|
||||
除了标准权限外,还有一些特殊的权限位,它们具有一些别的用处。
|
||||
|
||||
#### 设置用户 ID(suid)
|
||||
|
||||
当在文件上设置 `suid` 时,将以文件的属主的身份而不是运行该文件的用户身份执行操作。一个[好的例子][3]是 `passwd` 命令。它需要设置 `suid` 位,以便更改密码的操作具有 root 权限。
|
||||
|
||||
```
|
||||
$ ls -l /bin/passwd
|
||||
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /bin/passwd
|
||||
```
|
||||
|
||||
设置 `suid` 位的示例:
|
||||
|
||||
```
|
||||
$ chmod u+s /bin/foo_file_name
|
||||
```
|
||||
|
||||
#### 设置组 ID(sgid)
|
||||
|
||||
`sgid` 位与 `suid` 位类似,操作是在目录的组所有权下完成的,而不是以运行命令的用户身份。
|
||||
|
||||
一个使用 `sgid` 的例子是,如果多个用户正在同一个目录中工作,并且目录中创建的每个文件都需要具有相同的组权限。下面的示例创建一个名为 `collab_dir` 的目录,设置 `sgid` 位,并将组所有权更改为 `webdev`。
|
||||
|
||||
```
|
||||
$ mkdir collab_dir
|
||||
$ chmod g+s collab_dir
|
||||
$ chown :webdev collab_dir
|
||||
```
|
||||
|
||||
现在,在该目录中创建的任何文件都将具有 `webdev` 的组所有权,而不是创建该文件的用户的组。
|
||||
|
||||
```
|
||||
$ cd collab_dir
|
||||
$ touch file-sgid
|
||||
$ ls -lah file-sgid
|
||||
-rw-r--r--. 1 root webdev 0 Jun 12 06:04 file-sgid
|
||||
```
|
||||
|
||||
#### “粘滞”位
|
||||
|
||||
粘滞位表示,只有文件所有者才能删除该文件,即使组权限允许该文件可以删除。通常,在 `/tmp` 这样的通用或协作目录上,此设置最有意义。在下面的示例中,“所有其他人”权限集的“执行”列中的 `t` 表示已应用粘滞位。
|
||||
|
||||
```
|
||||
$ ls -ld /tmp
|
||||
drwxrwxrwt. 8 root root 4096 Jun 12 06:07 /tmp/
|
||||
```
|
||||
|
||||
请记住,这不会阻止某个人编辑该文件,它只是阻止他们删除该目录的内容(LCTT 译注:即删除目录下文件)。
|
||||
|
||||
我们将粘滞位设置为:
|
||||
|
||||
```
|
||||
$ chmod o+t foo_dir
|
||||
```
|
||||
|
||||
你可以自己尝试在目录上设置粘滞位并赋予其完整的组权限,以便多个属于同一组的用户可以在目录上进行读取、写入和执行。
|
||||
|
||||
接着,以每个用户的身份创建文件,然后尝试以另一个用户的身份删除它们。
|
||||
|
||||
如果一切配置正确,则一个用户应该不能从另一用户那里删除文件。
|
||||
|
||||
请注意,这些位中的每个位也可以用八进制格式设置:SUID = 4、SGID = 2 和 粘滞位 = 1。(LCTT 译注:这里是四位八进制数字)
|
||||
|
||||
```
|
||||
$ chmod 4744
|
||||
$ chmod 2644
|
||||
$ chmod 1755
|
||||
```
|
||||
|
||||
#### 大写还是小写?
|
||||
|
||||
如果要设置特殊位时看到大写的 `S` 或 `T` 而不是小写的字符(如我们之前所见),那是因为不存在(对应的)底层的执行位。为了说明这一点,下面的示例创建一个设置了粘滞位的文件。然后,我们可以添加和删除执行位以演示大小写更改。
|
||||
|
||||
```
|
||||
$ touch file cap-ST-demo
|
||||
$ chmod 1755 cap-ST-demo
|
||||
$ ls -l cap-ST-demo
|
||||
-rwxr-xr-t. 1 root root 0 Jun 12 06:16 cap-ST-demo
|
||||
|
||||
$ chmod o-x cap-X-demo
|
||||
$ ls -l cap-X-demo
|
||||
-rwxr-xr-T. 1 root root 0 Jun 12 06:16 cap-ST-demo
|
||||
```
|
||||
|
||||
#### 有条件地设置执行位
|
||||
|
||||
至此,我们使用小写的 `x` 设置了执行位,而无需询问任何问题即可对其进行设置。我们还有另一种选择:使用大写的 `X` 而不是小写的,它将仅在权限组中某个位置已经有执行位时才设置执行位。这可能是一个很难解释的概念,但是下面的演示将帮助说明它。请注意,在尝试将执行位添加到组特权之后,该位没有被设置上。
|
||||
|
||||
```
|
||||
$ touch cap-X-file
|
||||
$ ls -l cap-X-file
|
||||
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
|
||||
$ chmod g+X cap-X-file
|
||||
$ ls -l cap-X-file
|
||||
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
|
||||
```
|
||||
|
||||
在这个类似的例子中,我们首先使用小写的 `x` 将执行位添加到组权限,然后使用大写的 `X` 为所有其他用户添加权限。这次,大写的 `X`设置了该权限。
|
||||
|
||||
```
|
||||
$ touch cap-X-file
|
||||
$ ls -l cap-X-file
|
||||
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
|
||||
$ chmod g+x cap-X-file
|
||||
$ ls -l cap-X-file
|
||||
-rw-r-xr--. 1 root root 0 Jun 12 06:31 cap-X-file
|
||||
$ chmod o+X cap-X-file
|
||||
ls -l cap-X-file
|
||||
-rw-r-xr-x. 1 root root 0 Jun 12 06:31 cap-X-file
|
||||
```
|
||||
|
||||
### 理解 umask
|
||||
|
||||
`umask` 会屏蔽(或“阻止”)默认权限集中的位,以定义文件或目录的权限。例如,`umask`输出中的 `2` 表示它至少在默认情况下阻止了文件的“写入”位。
|
||||
|
||||
使用不带任何参数的 `umask` 命令可以使我们看到当前的 `umask` 设置。共有四列:第一列为特殊的`suid`、`sgid` 或粘滞位而保留,其余三列代表属主、组和其他人的权限。
|
||||
|
||||
```
|
||||
$ umask
|
||||
0022
|
||||
```
|
||||
|
||||
为了理解这意味着什么,我们可以用 `-S` 标志来执行 `umask`(如下所示)以解释屏蔽位的结果。例如,由于第三列中的值为 `2`,因此将“写入”位从组和其他部分中屏蔽掉了;只能为它们分配“读取”和“执行”。
|
||||
|
||||
```
|
||||
$ umask -S
|
||||
u=rwx,g=rx,o=rx
|
||||
```
|
||||
|
||||
要查看文件和目录的默认权限集是什么,让我们将 `umask` 设置为全零。这意味着我们在创建文件时不会掩盖任何位。
|
||||
|
||||
```
|
||||
$ umask 000
|
||||
$ umask -S
|
||||
u=rwx,g=rwx,o=rwx
|
||||
|
||||
$ touch file-umask-000
|
||||
$ ls -l file-umask-000
|
||||
-rw-rw-rw-. 1 root root 0 Jul 17 22:03 file-umask-000
|
||||
```
|
||||
|
||||
现在,当我们创建文件时,我们看到所有部分的默认权限分别为“读取”(`4`)和“写入”(`2`),相当于八进制表示 `666`。
|
||||
|
||||
我们可以对目录执行相同的操作,并看到其默认权限为 `777`。我们需要在目录上使用“执行”位,以便可以遍历它们。
|
||||
|
||||
```
|
||||
$ mkdir dir-umask-000
|
||||
$ ls -ld dir-umask-000
|
||||
drwxrwxrwx. 2 root root 4096 Jul 17 22:03 dir-umask-000/
|
||||
```
|
||||
|
||||
### 总结
|
||||
|
||||
管理员还有许多其他方法可以控制对系统文件的访问。这些权限是 Linux 的基本权限,我们可以在这些基础上进行构建。如果你的工作为你引入了 FACL 或 SELinux,你会发现它们也建立在这些文件访问的首要规则之上。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/8/linux-permissions-101
|
||||
|
||||
作者:[Alex Juarez][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/mralexjuarezhttps://opensource.com/users/marcobravohttps://opensource.com/users/greg-p
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux-penguins.png?itok=yKOpaJM_ (Penguins)
|
||||
[2]: https://www.gnu.org/software/texinfo/manual/info-stnd/info-stnd.html
|
||||
[3]: https://www.theurbanpenguin.com/using-a-simple-c-program-to-explain-the-suid-permission/
|
@ -0,0 +1,131 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11556-1.html)
|
||||
[#]: subject: (11 Essential Keyboard Shortcuts Google Chrome/Chromium Users Should Know)
|
||||
[#]: via: (https://itsfoss.com/google-chrome-shortcuts/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
Chrome/Chromium 用户必知必会的 11 个基本快捷键
|
||||
======
|
||||
|
||||
> 掌握这些 Google Chrome 键盘快捷键,以获得更好、更流畅、更高效的 Web 浏览体验。还包括可下载的备忘单。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201911/09/214207wh96q76ejacnn5as.png)
|
||||
|
||||
无可否认,Google Chrome 是[最受欢迎的网络浏览器][1]。它的开源版本 [Chromium][2] 也越来越受欢迎,现在一些 Linux 发行版将其作为默认的网络浏览器。
|
||||
|
||||
如果你经常在台式机上使用它,则可以使用 Google Chrome 键盘快捷键来改善浏览体验。没有必要用你的鼠标移来移去、点来点去。只要掌握这些快捷方式,你可以节省一些时间并提高工作效率。
|
||||
|
||||
我这里使用的名称是 Google Chrome,但是这些快捷方式同样适用于 Chromium 浏览器。
|
||||
|
||||
### 你应该使用的 11 个酷炫的 Chrome 键盘快捷键
|
||||
|
||||
如果你是专业人士,可能已经知道其中一些 Chrome 快捷方式,但是有可能你仍然可以在这里找到一些隐藏的宝石。让我们来看看。
|
||||
|
||||
**键盘快捷键** | **动作**
|
||||
---|---
|
||||
`Ctrl+T` | 打开一个新标签页
|
||||
`Ctrl+N` | 打开一个新窗口
|
||||
`Ctrl+Shift+N` | 打开一个新无痕式窗口
|
||||
`Ctrl+W` | 关闭当前标签页
|
||||
`Ctrl+Shift+T` | 重新打开上一个关闭的标签页
|
||||
`Ctrl+Shift+W` | 关闭窗口
|
||||
`Ctrl+Tab` 和 `Ctrl+Shift+Tab` | 切换到右侧或左侧的标签页
|
||||
`Ctrl+L` | 访问搜索/地址栏
|
||||
`Ctrl+D` | 将网址放入书签
|
||||
`Ctrl+H` | 访问浏览历史
|
||||
`Ctrl+J` | 访问下载历史
|
||||
`Shift+Esc` | 打开 Chrome 任务管理器
|
||||
|
||||
你可以[下载这份有用的 Chrome 键盘快捷键列表来作为快速参考][3]。
|
||||
|
||||
#### 1、用 `Ctrl+T` 打开一个新标签页
|
||||
|
||||
需要打开一个新标签页吗?只需同时按 `Ctrl` 和 `T` 键,你就会打开一个新标签。
|
||||
|
||||
#### 2、使用 `Ctrl+N` 打开一个新窗口
|
||||
|
||||
已经打开太多标签页?是时候打开一个新的窗口。使用 `Ctrl` 和 `N` 键打开一个新的浏览器窗口。
|
||||
|
||||
#### 3、使用 `Ctrl+Shift+N` 隐身
|
||||
|
||||
在线查询航班或酒店价格?隐身可能会有所帮助。使用 `Ctrl+Shift+N` 在 Chrome 中打开一个隐身窗口。
|
||||
|
||||
#### 4、使用 `Ctrl+W` 关闭标签页
|
||||
|
||||
使用 `Ctrl` 和 `W` 键关闭当前标签页。无需将鼠标移到顶部并寻找 `x` 按钮。
|
||||
|
||||
#### 5、不小心关闭了标签页?用 `Ctrl+Shift+T` 重新打开
|
||||
|
||||
这是我最喜欢的 Google Chrome 浏览器快捷方式。当你关闭了原本不想关的标签页时,就不用再懊悔了。使用 `Ctrl+Shift+T`,它将打开最后一个关闭的选项卡。继续按此组合键,它把关闭的选项卡再次打开。
|
||||
|
||||
#### 6、使用 `Ctrl+Shift+W` 关闭整个浏览器窗口
|
||||
|
||||
完成工作了吗?是时候关闭带有所有标签页的整个浏览器窗口了。使用 `Ctrl+Shift+W` 键,浏览器窗口将消失,就像以前不存在一样。
|
||||
|
||||
#### 7、使用 `Ctrl+Tab` 在标签之间切换
|
||||
|
||||
打开的标签页太多了吗?你可以使用 `Ctrl+Tab` 移至右侧标签页。想左移吗?使用 `Ctrl+Shift+Tab`。重复按这些键,你可以在当前浏览器窗口的所有打开的标签页之间移动。
|
||||
|
||||
你也可以使用 `Ctrl+0` 直到 `Ctrl+9` 转到前 10 个标签页之一。但是此 Chrome 键盘快捷键不适用于第 11 个及更多标签页。
|
||||
|
||||
#### 8、使用 `Ctrl+L` 转到搜索/地址栏
|
||||
|
||||
想要输入新的 URL 或快速搜索一些内容。你可以使用 `Ctrl+L`,它将在顶部突出显示地址栏。
|
||||
|
||||
#### 9、用 `Ctrl+D` 收藏当前网站
|
||||
|
||||
找到了有趣的东西?使用 `Ctrl+D` 组合键将其保存在书签中。
|
||||
|
||||
#### 10、使用 `Ctrl+H` 返回历史记录
|
||||
|
||||
你可以使用 `Ctrl+H` 键打开浏览器历史记录。如果你正在寻找前一段时间访问过的页面,或者删除你不想再看到的页面,可以搜索历史记录。
|
||||
|
||||
#### 11、使用 `Ctrl+J` 查看下载
|
||||
|
||||
在 Chrome 中按 `Ctrl+J` 键将带你进入下载页面。此页面将显示你执行的所有下载操作。
|
||||
|
||||
#### 意外惊喜:使用 `Shift+Esc` 打开 Chrome 任务管理器
|
||||
|
||||
很多人甚至都不知道 Chrome 浏览器中有一个任务管理器。Chrome 以消耗系统内存而臭名昭著。而且,当你打开大量标签时,找到罪魁祸首并不容易。
|
||||
|
||||
使用 Chrome 任务管理器,你可以查看所有打开的标签页及其系统利用率统计信息。你还可以看到各种隐藏的进程,例如 Chrome 扩展程序和其他服务。
|
||||
|
||||
![Google Chrome 任务管理器][6]
|
||||
|
||||
### 下载 Chrome 快捷键备忘单
|
||||
|
||||
我知道掌握键盘快捷键取决于习惯,你可以通过反复使用使其习惯。为了帮助你完成此任务,我创建了此 Google Chrome 键盘快捷键备忘单。
|
||||
|
||||
![Google Chrome键盘快捷键备忘单][7]
|
||||
|
||||
你可以[下载以下 PDF 格式的图像][8],进行打印并将其放在办公桌上。这样,你可以一直练习快捷方式。
|
||||
|
||||
如果你对掌握快捷方式感兴趣,还可以查看 [Ubuntu 键盘快捷键][9]。
|
||||
|
||||
顺便问一下,你最喜欢的 Chrome 快捷方式是什么?
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/google-chrome-shortcuts/
|
||||
|
||||
作者:[Abhishek Prakash][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://itsfoss.com/author/abhishek/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://en.wikipedia.org/wiki/Usage_share_of_web_browsers
|
||||
[2]: https://www.chromium.org/Home
|
||||
[3]: tmp.3qZNXSy2FC#download-cheatsheet
|
||||
[4]: https://itsfoss.com/command-line-text-editors-linux/
|
||||
[5]: https://itsfoss.com/rid-google-chrome-icons-dock-elementary-os-freya/
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/google-chrome-task-manager.png?w=800&ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/google-chrome-keyboard-shortcuts-cheat-sheet.png?ssl=1
|
||||
[8]: https://drive.google.com/open?id=1lZ4JgRuFbXrnEXoDQqOt7PQH6femIe3t
|
||||
[9]: https://itsfoss.com/ubuntu-shortcuts/
|
235
published/20190826 How RPM packages are made- the source RPM.md
Normal file
235
published/20190826 How RPM packages are made- the source RPM.md
Normal file
@ -0,0 +1,235 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11527-1.html)
|
||||
[#]: subject: (How RPM packages are made: the source RPM)
|
||||
[#]: via: (https://fedoramagazine.org/how-rpm-packages-are-made-the-source-rpm/)
|
||||
[#]: author: (Ankur Sinha "FranciscoD" https://fedoramagazine.org/author/ankursinha/)
|
||||
|
||||
RPM 包是如何从源 RPM 制作的
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
在[上一篇文章中,我们研究了什么是 RPM 软件包][2]。它们是包含文件和元数据的档案文件。当安装或卸载 RPM 时,此元数据告诉 RPM 在哪里创建或删除文件。正如你将在上一篇文章中记住的,元数据还包含有关“依赖项”的信息,它可以是“运行时”或“构建时”的依赖信息。
|
||||
|
||||
例如,让我们来看看 `fpaste`。你可以使用 `dnf` 下载该 RPM。这将下载 Fedora 存储库中可用的 `fpaste` 最新版本。在 Fedora 30 上,当前版本为 0.3.9.2:
|
||||
|
||||
```
|
||||
$ dnf download fpaste
|
||||
|
||||
...
|
||||
fpaste-0.3.9.2-2.fc30.noarch.rpm
|
||||
```
|
||||
|
||||
由于这是个构建 RPM,因此它仅包含使用 `fpaste` 所需的文件:
|
||||
|
||||
```
|
||||
$ rpm -qpl ./fpaste-0.3.9.2-2.fc30.noarch.rpm
|
||||
/usr/bin/fpaste
|
||||
/usr/share/doc/fpaste
|
||||
/usr/share/doc/fpaste/README.rst
|
||||
/usr/share/doc/fpaste/TODO
|
||||
/usr/share/licenses/fpaste
|
||||
/usr/share/licenses/fpaste/COPYING
|
||||
/usr/share/man/man1/fpaste.1.gz
|
||||
```
|
||||
|
||||
### 源 RPM
|
||||
|
||||
在此链条中的下一个环节是源 RPM。Fedora 中的所有软件都必须从其源代码构建。我们不包括预构建的二进制文件。因此,要制作一个 RPM 文件,RPM(工具)需要:
|
||||
|
||||
* 给出必须要安装的文件,
|
||||
* 例如,如果要编译出这些文件,则告诉它们如何生成这些文件,
|
||||
* 告知必须在何处安装这些文件,
|
||||
* 该特定软件需要其他哪些依赖才能正常工作。
|
||||
|
||||
源 RPM 拥有所有这些信息。源 RPM 与构建 RPM 相似,但顾名思义,它们不包含已构建的二进制文件,而是包含某个软件的源文件。让我们下载 `fpaste` 的源 RPM:
|
||||
|
||||
```
|
||||
$ dnf download fpaste --source
|
||||
|
||||
...
|
||||
fpaste-0.3.9.2-2.fc30.src.rpm
|
||||
```
|
||||
|
||||
注意文件的结尾是 `src.rpm`。所有的 RPM 都是从源 RPM 构建的。你也可以使用 `dnf` 轻松检查“二进制” RPM 的源 RPM:
|
||||
|
||||
```
|
||||
$ dnf repoquery --qf "%{SOURCERPM}" fpaste
|
||||
fpaste-0.3.9.2-2.fc30.src.rpm
|
||||
```
|
||||
|
||||
另外,由于这是源 RPM,因此它不包含构建的文件。相反,它包含有关如何从中构建 RPM 的源代码和指令:
|
||||
|
||||
```
|
||||
$ rpm -qpl ./fpaste-0.3.9.2-2.fc30.src.rpm
|
||||
fpaste-0.3.9.2.tar.gz
|
||||
fpaste.spec
|
||||
```
|
||||
|
||||
这里,第一个文件只是 `fpaste` 的源代码。第二个是 spec 文件。spec 文件是个配方,可告诉 RPM(工具)如何使用源 RPM 中包含的源代码创建 RPM(档案文件)— 它包含 RPM(工具)构建 RPM(档案文件)所需的所有信息。在 spec 文件中。当我们软件包维护人员添加软件到 Fedora 中时,我们大部分时间都花在编写和完善 spec 文件上。当软件包需要更新时,我们会回过头来调整 spec 文件。你可以在 <https://src.fedoraproject.org/browse/projects/> 的源代码存储库中查看 Fedora 中所有软件包的 spec 文件。
|
||||
|
||||
请注意,一个源 RPM 可能包含构建多个 RPM 的说明。`fpaste` 是一款非常简单的软件,一个源 RPM 生成一个“二进制” RPM。而 Python 则更复杂。虽然只有一个源 RPM,但它会生成多个二进制 RPM:
|
||||
|
||||
```
|
||||
$ sudo dnf repoquery --qf "%{SOURCERPM}" python3
|
||||
python3-3.7.3-1.fc30.src.rpm
|
||||
python3-3.7.4-1.fc30.src.rpm
|
||||
|
||||
$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-devel
|
||||
python3-3.7.3-1.fc30.src.rpm
|
||||
python3-3.7.4-1.fc30.src.rpm
|
||||
|
||||
$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-libs
|
||||
python3-3.7.3-1.fc30.src.rpm
|
||||
python3-3.7.4-1.fc30.src.rpm
|
||||
|
||||
$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-idle
|
||||
python3-3.7.3-1.fc30.src.rpm
|
||||
python3-3.7.4-1.fc30.src.rpm
|
||||
|
||||
$ sudo dnf repoquery --qf "%{SOURCERPM}" python3-tkinter
|
||||
python3-3.7.3-1.fc30.src.rpm
|
||||
python3-3.7.4-1.fc30.src.rpm
|
||||
```
|
||||
|
||||
用 RPM 行话来讲,“python3” 是“主包”,因此该 spec 文件将称为 `python3.spec`。所有其他软件包均为“子软件包”。你可以下载 python3 的源 RPM,并查看其中的内容。(提示:补丁也是源代码的一部分):
|
||||
|
||||
```
|
||||
$ dnf download --source python3
|
||||
python3-3.7.4-1.fc30.src.rpm
|
||||
|
||||
$ rpm -qpl ./python3-3.7.4-1.fc30.src.rpm
|
||||
00001-rpath.patch
|
||||
00102-lib64.patch
|
||||
00111-no-static-lib.patch
|
||||
00155-avoid-ctypes-thunks.patch
|
||||
00170-gc-assertions.patch
|
||||
00178-dont-duplicate-flags-in-sysconfig.patch
|
||||
00189-use-rpm-wheels.patch
|
||||
00205-make-libpl-respect-lib64.patch
|
||||
00251-change-user-install-location.patch
|
||||
00274-fix-arch-names.patch
|
||||
00316-mark-bdist_wininst-unsupported.patch
|
||||
Python-3.7.4.tar.xz
|
||||
check-pyc-timestamps.py
|
||||
idle3.appdata.xml
|
||||
idle3.desktop
|
||||
python3.spec
|
||||
```
|
||||
|
||||
### 从源 RPM 构建 RPM
|
||||
|
||||
现在我们有了源 RPM,并且其中有什么内容,我们可以从中重建 RPM。但是,在执行此操作之前,我们应该设置系统以构建 RPM。首先,我们安装必需的工具:
|
||||
|
||||
```
|
||||
$ sudo dnf install fedora-packager
|
||||
```
|
||||
|
||||
这将安装 `rpmbuild` 工具。`rpmbuild` 需要一个默认布局,以便它知道源 RPM 中每个必需组件的位置。让我们看看它们是什么:
|
||||
|
||||
```
|
||||
# spec 文件将出现在哪里?
|
||||
$ rpm -E %{_specdir}
|
||||
/home/asinha/rpmbuild/SPECS
|
||||
|
||||
# 源代码将出现在哪里?
|
||||
$ rpm -E %{_sourcedir}
|
||||
/home/asinha/rpmbuild/SOURCES
|
||||
|
||||
# 临时构建目录是哪里?
|
||||
$ rpm -E %{_builddir}
|
||||
/home/asinha/rpmbuild/BUILD
|
||||
|
||||
# 构建根目录是哪里?
|
||||
$ rpm -E %{_buildrootdir}
|
||||
/home/asinha/rpmbuild/BUILDROOT
|
||||
|
||||
# 源 RPM 将放在哪里?
|
||||
$ rpm -E %{_srcrpmdir}
|
||||
/home/asinha/rpmbuild/SRPMS
|
||||
|
||||
# 构建的 RPM 将放在哪里?
|
||||
$ rpm -E %{_rpmdir}
|
||||
/home/asinha/rpmbuild/RPMS
|
||||
```
|
||||
|
||||
我已经在系统上设置了所有这些目录:
|
||||
|
||||
```
|
||||
$ cd
|
||||
$ tree -L 1 rpmbuild/
|
||||
rpmbuild/
|
||||
├── BUILD
|
||||
├── BUILDROOT
|
||||
├── RPMS
|
||||
├── SOURCES
|
||||
├── SPECS
|
||||
└── SRPMS
|
||||
|
||||
6 directories, 0 files
|
||||
```
|
||||
|
||||
RPM 还提供了一个为你全部设置好的工具:
|
||||
|
||||
```
|
||||
$ rpmdev-setuptree
|
||||
```
|
||||
|
||||
然后,确保已安装 `fpaste` 的所有构建依赖项:
|
||||
|
||||
```
|
||||
sudo dnf builddep fpaste-0.3.9.2-3.fc30.src.rpm
|
||||
```
|
||||
|
||||
对于 `fpaste`,你只需要 Python,并且它肯定已经安装在你的系统上(`dnf` 也使用 Python)。还可以给 `builddep` 命令一个 spec 文件,而不是源 RPM。在手册页中了解更多信息:
|
||||
|
||||
```
|
||||
$ man dnf.plugin.builddep
|
||||
```
|
||||
|
||||
现在我们有了所需的一切,从源 RPM 构建一个 RPM 就像这样简单:
|
||||
|
||||
```
|
||||
$ rpmbuild --rebuild fpaste-0.3.9.2-3.fc30.src.rpm
|
||||
..
|
||||
..
|
||||
|
||||
$ tree ~/rpmbuild/RPMS/noarch/
|
||||
/home/asinha/rpmbuild/RPMS/noarch/
|
||||
└── fpaste-0.3.9.2-3.fc30.noarch.rpm
|
||||
|
||||
0 directories, 1 file
|
||||
```
|
||||
|
||||
`rpmbuild` 将安装源 RPM 并从中构建你的 RPM。现在,你可以使用 `dnf` 安装 RPM 以使用它。当然,如前所述,如果你想在 RPM 中进行任何更改,则必须修改 spec 文件,我们将在下一篇文章中介绍 spec 文件。
|
||||
|
||||
### 总结
|
||||
|
||||
总结一下这篇文章有两点:
|
||||
|
||||
* 我们通常安装使用的 RPM 是包含软件的构建版本的 “二进制” RPM
|
||||
* 构建 RPM 来自于源 RPM,源 RPM 包括用于生成二进制 RPM 所需的源代码和规范文件。
|
||||
|
||||
如果你想开始构建 RPM,并帮助 Fedora 社区维护我们提供的大量软件,则可以从这里开始: <https://fedoraproject.org/wiki/Join_the_package_collection_maintainers>
|
||||
|
||||
如有任何疑问,请发邮件到 [Fedora 开发人员邮件列表][3],我们随时乐意为你提供帮助!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/how-rpm-packages-are-made-the-source-rpm/
|
||||
|
||||
作者:[Ankur Sinha "FranciscoD"][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/ankursinha/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/rpm.png-816x345.jpg
|
||||
[2]: https://linux.cn/article-11452-1.html
|
||||
[3]: https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/
|
@ -0,0 +1,84 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11529-1.html)
|
||||
[#]: subject: (Someone Forked GIMP into Glimpse Because Gimp is an Offensive Word)
|
||||
[#]: via: (https://itsfoss.com/gimp-fork-glimpse/)
|
||||
[#]: author: (John Paul https://itsfoss.com/author/john/)
|
||||
|
||||
由于 GIMP 是令人反感的字眼,有人将它复刻了
|
||||
======
|
||||
|
||||
在开源应用程序世界中,当社区成员希望以与其他人不同的方向来开发应用程序时,<ruby>复刻<rt>fork</rt></ruby>是很常见的。最新的具有新闻价值的一个复刻称为 [Glimpse][1],旨在解决用户在使用 <ruby>[GNU 图像处理程序][2]<rt>GNU Image Manipulation Program</rt></ruby>(通常称为 GIMP)时遇到的某些问题。
|
||||
|
||||
### 为什么创建 GIMP 的复刻?
|
||||
|
||||
![][3]
|
||||
|
||||
当你访问 Glimpse 应用的[主页][1]时,它表示该项目的目标是“尝试其他设计方向并修复长期存在的错误。”这听起来并不奇怪。但是,如果你开始阅读该项目的博客文章,则是另外一种印象。
|
||||
|
||||
根据该项目的[第一篇博客文章][4],他们创建了这个复刻是因为他们不喜欢 GIMP 这个名称。根据该帖子,“我们中的许多人不认为该软件的名称适用于所有用户,并且在拒绝该项目的 13 年后,我们决定复刻!”
|
||||
|
||||
如果你想知道为什么这些人认为 GIMP 令人讨厌,他们在[关于页面][5]中回答该问题:
|
||||
|
||||
> “如果英语不是你的母语,那么你可能没有意识到 ‘gimp’ 一词有问题。在某些国家,这被视为针对残疾人的侮辱和针对不受欢迎儿童的操场侮辱。它也可以与成年人同意的某些‘天黑后’活动联系起来。”
|
||||
|
||||
他们还指出,他们并没有使这一举动脱离政治正确或过于敏感。“除了可能给边缘化社区带来的痛苦外,我们当中许多人都有过倡导自由软件的故事,比如在 GNU 图像处理程序没有被专业环境中的老板或同事视为可选项这件事上。”
|
||||
|
||||
他们似乎在回答许多质疑,“不幸的是,我们不得不复刻整个项目来更改其名称,我们认为有关此问题的讨论陷入了僵局,而这是最积极的前进方向。 ”
|
||||
|
||||
看起来 Glimpse 这个名称不是确定不变的。他们的 GitHub 页面上有个关于可能选择其他名称的[提案][7]。也许他们应该放弃 GNU 这个词,我认为 IMP 这个词没有不好的含义。(LCTT 译注:反讽)
|
||||
|
||||
### 分叉之路
|
||||
|
||||
![GIMP 2.10][8]
|
||||
|
||||
[GIMP][6] 已经存在了 20 多年,因此任何形式的复刻都是一项艰巨的任务。当前,[他们正在计划][9]首先在 2019 年 9 月发布 Glimpse 0.1。这将是一个软复刻,这意味着在迁移到新身份时的更改将主要是装饰性的。(LCTT 译注:事实上到本译文发布时,该项目仍然处于蛋疼的 0.1 beta,也许 11 月,也许 12 月,才能发布 0.1 的正式版本。)
|
||||
|
||||
Glimpse 1.0 将是一个硬复刻,他们将积极更改代码库并将其添加到代码库中。他们想将 1.0 移植到 GTK3 并拥有自己的文档。他们估计,直到 2020 年 GIMP 3 发布之后才能做到。
|
||||
|
||||
除了 1.0,Glimpse 团队还计划打响自己的名声。他们计划进行“前端 UI 重写”。他们目前正在讨论[改用哪种语言][10]。D 和 Rust 似乎有很多支持者。随着时间的流逝,他们也[希望][4]“添加新功能以解决普通用户的抱怨”。
|
||||
|
||||
### 最后的思考
|
||||
|
||||
我过去曾经使用过一点 GIMP,但从来没有对它的名称感到困扰。老实说,我很长一段时间都不知道这意味着什么。有趣的是,当我在 Wikipedia 上搜索 GIMP 时,看到了一个 [GIMP 项目][11]的条目,这是纽约的一个现代舞蹈项目,其中包括残疾人。我想 gimp 并不是每个人视为一个贬低词汇的。
|
||||
|
||||
对我来说,更改名称似乎需要大量工作。似乎改写 UI 的想法会使项目看起来更有价值一些。我想知道他们是否会调整它以带来更经典的 UI,例如[使用 Ctrl + S 保存到 GIMP][12] / Glimpse。让我们拭目以待。
|
||||
|
||||
如果你对该项目感兴趣,可以在 [Twitter][14] 上关注他们,查看其 [GitHub 帐户][15],或查看其 [Patreon 页面][16]。
|
||||
|
||||
你觉得被 GIMP 名称冒犯了吗?你是否认为值得对应用程序进行复刻,以便你可以对其进行重命名?在下面的评论中让我们知道。
|
||||
|
||||
如果你觉得这篇文章有趣,请花一点时间在社交媒体、Hacker News 或 [Reddit][17] 上分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/gimp-fork-glimpse/
|
||||
|
||||
作者:[John Paul][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://itsfoss.com/author/john/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://getglimpse.app/
|
||||
[2]: https://www.gimp.org/
|
||||
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/gimp-fork-glimpse.png?resize=800%2C450&ssl=1
|
||||
[4]: https://getglimpse.app/posts/so-it-begins/
|
||||
[5]: https://getglimpse.app/about/
|
||||
[6]: https://itsfoss.com/gimp-2-10-release/
|
||||
[7]: https://github.com/glimpse-editor/Glimpse/issues/92
|
||||
[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/08/gimp-screenshot.jpg?resize=800%2C508&ssl=1
|
||||
[9]: https://getglimpse.app/posts/six-week-checkpoint/
|
||||
[10]: https://github.com/glimpse-editor/Glimpse/issues/70
|
||||
[11]: https://en.wikipedia.org/wiki/The_Gimp_Project
|
||||
[12]: https://itsfoss.com/how-to-solve-gimp-2-8-does-not-save-in-jpeg-or-png-format/
|
||||
[13]: https://itsfoss.com/wps-office-2016-linux/
|
||||
[14]: https://twitter.com/glimpse_editor
|
||||
[15]: https://github.com/glimpse-editor/Glimpse
|
||||
[16]: https://www.patreon.com/glimpse
|
||||
[17]: https://reddit.com/r/linuxusersgroup
|
@ -0,0 +1,93 @@
|
||||
技术如何改变敏捷的规则
|
||||
======
|
||||
|
||||
> 当我们开始推行敏捷时,还没有容器和 Kubernetes。但是它们改变了过去最困难的部分:将敏捷性从小团队应用到整个组织。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/26/113910ytmoosx5tt79gan5.jpg)
|
||||
|
||||
越来越多的企业正因为一个非常明显的原因开始尝试敏捷和 [DevOps][1]: 企业需要通过更快的速度和更多的实验为创新和竞争性提供优势。而 DevOps 将帮助我们得到所需的创新速度。但是,在小团队或初创企业中实践 DevOps 与进行大规模实践完全是两码事。我们都明白这样的一个事实,那就是在十个人的跨职能团队中能够很好地解决问题的方案,当将相同的模式应用到一百个人的团队中时就可能无法奏效。这条道路是如此艰难,以至于 IT 领导者最简单的应对就是将敏捷方法的推行再推迟一年。
|
||||
|
||||
但那样的时代已经结束了。如果你已经尝试过,但是没有成功,那么现在是时候重新开始了。
|
||||
|
||||
到目前为止,DevOps 需要为许多组织提供个性化的解决方案,因此往往需要进行大量的调整以及付出额外的工作。但在今天,[Linux 容器][2]和 Kubernetes 正在推动 DevOps 工具和过程的标准化。而这样的标准化将会加速整个软件开发过程。因此,我们用来实践 DevOps 工作方式的技术最终能够满足我们加快软件开发速度的愿望。
|
||||
|
||||
Linux 容器和 [Kubernetes][3] 正在改变团队交互的方式。此外,你可以在 Kubernetes 平台上运行任何能够在 Linux 运行的应用程序。这意味着什么呢?你可以运行大量的企业及应用程序(甚至可以解决以前令人烦恼的 Windows 和 Linux 之间的协调问题)。最后,容器和 Kubernetes 能够满足你未来将要运行的几乎所有工作。它们正在经受着未来的考验,以应对机器学习、人工智能和分析工作等下一代解决问题工具。
|
||||
|
||||
让我们以机器学习为例来思考一下。今天,人们可以在大量的企业数据中找到一些模式。当机器发现这些模式时(想想机器学习),你的员工就能更快地采取行动。随着人工智能的加入,机器不仅可以发现模式,还可以对模式进行操作。如今,一个积极的软件开发冲刺周期也就是三个星期而已。有了人工智能,机器每秒可以多次修改代码。创业公司会利用这种能力来“打扰你”。
|
||||
|
||||
考虑一下你需要多快才能参与到竞争当中。如果你对于无法对于 DevOps 和每周一个迭代周期充满信心,那么考虑一下当那个创业公司将 AI 驱动的过程指向你时会发生什么?现在是时候转向 DevOps 的工作方式了,否则就会像你的竞争对手一样被甩在后面。
|
||||
|
||||
### 容器技术如何改变团队的工作?
|
||||
|
||||
DevOps 使得许多试图将这种工作方式扩展到更大范围的团队感到沮丧。即使许多 IT(和业务)人员之前都听说过敏捷相关的语言、框架、模型(如 DevOps),而这些都有望彻底应用程序开发和 IT 流程,但他们还是对此持怀疑态度。
|
||||
|
||||
向你的受众“推销”快速开发冲刺也不是一件容易的事情。想象一下,如果你以这种方式买了一栋房子 —— 你将不再需要向开发商支付固定的金额,而是会得到这样的信息:“我们将在 4 周内浇筑完地基,其成本是 X,之后再搭建房屋框架和铺设电路,但是我们现在只能够知道地基完成的时间表。”人们已经习惯了买房子的时候有一个预先的价格和交付时间表。
|
||||
|
||||
挑战在于构建软件与构建房屋不同。同一个建筑商往往建造了成千上万个完全相同的房子,而软件项目从来都各不相同。这是你要克服的第一个障碍。
|
||||
|
||||
开发和运维团队的工作方式确实不同,我之所以知道这一点是因为我曾经从事过这两方面的工作。企业往往会用不同的方式来激励他们,开发人员会因为更改和创建而获得奖励,而运维专家则会因降低成本和确保安全性而获得奖励。我们会把他们分成不同的小组,并且尽量减少互动。而这些角色通常会吸引那些思维方式完全不同的技术人员。但是这样的解决方案注定会失败,你必须打破横亘在开发和运维之间的藩篱。
|
||||
|
||||
想想传统情况下会发生什么。业务会把需求扔过墙,这是因为他们在“买房”模式下运作,并且说上一句“我们 9 个月后见。”开发人员根据这些需求进行开发,并根据技术约束的需要进行更改。然后,他们把它扔过墙传递给运维人员,并说一句“搞清楚如何运行这个软件”。然后,运维人员勤就会勤奋地进行大量更改,使软件与基础设施保持一致。然而,最终的结果是什么呢?
|
||||
|
||||
通常情况下,当业务人员看到需求实现的最终结果时甚至根本辨认不出。在过去 20 年的大部分时间里,我们一次又一次地目睹了这种模式在软件行业中上演。而现在,是时候改变了。
|
||||
|
||||
Linux 容器能够真正地解决这样的问题,这是因为容器弥合开发和运维之间的鸿沟。容器技术允许两个团队共同理解和设计所有的关键需求,但仍然独立地履行各自团队的职责。基本上,我们去掉了开发人员和运维人员之间的电话游戏。
|
||||
|
||||
有了容器技术,我们可以使得运维团队的规模更小,但依旧能够承担起数百万应用程序的运维工作,并且能够使得开发团队可以更加快速地根据需要更改软件。(在较大的组织中,所需的速度可能比运维人员的响应速度更快。)
|
||||
|
||||
有了容器技术,你可以将所需要交付的内容与它运行的位置分开。你的运维团队只需要负责运行容器的主机和安全的内存占用,仅此而已。这意味着什么呢?
|
||||
|
||||
首先,这意味着你现在可以和团队一起实践 DevOps 了。没错,只需要让团队专注于他们已经拥有的专业知识,而对于容器,只需让团队了解所需集成依赖关系的必要知识即可。
|
||||
|
||||
如果你想要重新训练每个人,没有人会精通所有事情。容器技术允许团队之间进行交互,但同时也会为每个团队提供一个围绕该团队优势而构建的强大边界。开发人员会知道需要消耗什么资源,但不需要知道如何使其大规模运行。运维团队了解核心基础设施,但不需要了解应用程序的细节。此外,运维团队也可以通过更新应用程序来解决新的安全问题,以免你成为下一个数据泄露的热门话题。
|
||||
|
||||
想要为一个大型 IT 组织,比如 30000 人的团队教授运维和开发技能?那或许需要花费你十年的时间,而你可能并没有那么多时间。
|
||||
|
||||
当人们谈论“构建新的云原生应用程序将帮助我们摆脱这个问题”时,请批判性地进行思考。你可以在 10 个人的团队中构建云原生应用程序,但这对《财富》杂志前 1000 强的企业而言或许并不适用。除非你不再需要依赖现有的团队,否则你无法一个接一个地构建新的微服务:你最终将成为一个孤立的组织。这是一个诱人的想法,但你不能指望这些应用程序来重新定义你的业务。我还没见过哪家公司能在如此大规模的并行开发中获得成功。IT 预算已经受到限制;在很长时间内,将预算翻倍甚至三倍是不现实的。
|
||||
|
||||
### 当奇迹发生时:你好,速度
|
||||
|
||||
Linux 容器就是为扩容而生的。一旦你开始这样做,[Kubernetes 之类的编制工具就会发挥作用][6],这是因为你将需要运行数千个容器。应用程序将不仅仅由一个容器组成,它们将依赖于许多不同的部分,所有的部分都会作为一个单元运行在容器上。如果不这样做,你的应用程序将无法在生产环境中很好地运行。
|
||||
|
||||
思考一下有多少小滑轮和杠杆组合在一起来支撑你的业务,对于任何应用程序都是如此。开发人员负责应用程序中的所有滑轮和杠杆。(如果开发人员没有这些组件,你可能会在集成时做噩梦。)与此同时,无论是在线下还是在云上,运维团队都会负责构成基础设施的所有滑轮和杠杆。做一个较为抽象的比喻,使用Kubernetes,你的运维团队就可以为应用程序提供运行所需的燃料,但又不必成为所有方面的专家。
|
||||
|
||||
开发人员进行实验,运维团队则保持基础设施的安全和可靠。这样的组合使得企业敢于承担小风险,从而实现创新。不同于打几个孤注一掷的赌,公司中真正的实验往往是循序渐进的和快速的。
|
||||
|
||||
从个人经验来看,这就是组织内部发生的显著变化:因为人们说:“我们如何通过改变计划来真正地利用这种实验能力?”它会强制执行敏捷计划。
|
||||
|
||||
举个例子,使用 DevOps 模型、容器和 Kubernetes 的 KeyBank 如今每天都会部署代码。(观看[视频][7],其中主导了 KeyBank 持续交付和反馈的 John Rzeszotarski 将解释这一变化。)类似地,Macquarie 银行也借助 DevOps 和容器技术每天将一些东西投入生产环境。
|
||||
|
||||
一旦你每天都推出软件,它就会改变你计划的每一个方面,并且会[加速业务的变化速度][8]。Macquarie 银行和金融服务集团的 CDO,Luis Uguina 表示:“创意可以在一天内触达客户。”(参见对 Red Hat 与 Macquarie 银行合作的[案例研究][9])。
|
||||
|
||||
### 是时候去创造一些伟大的东西了
|
||||
|
||||
Macquarie 的例子说明了速度的力量。这将如何改变你的经营方式?记住,Macquarie 不是一家初创企业。这是 CIO 们所面临的颠覆性力量,它不仅来自新的市场进入者,也来自老牌同行。
|
||||
|
||||
开发人员的自由还改变了运营敏捷商店的 CIO 们的人才方程式。突然之间,大公司里的个体(即使不是在最热门的行业或地区)也可以产生巨大的影响。Macquarie 利用这一变动作为招聘工具,并向开发人员承诺,所有新招聘的员工将会在第一周内推出新产品。
|
||||
|
||||
与此同时,在这个基于云的计算和存储能力的时代,我们比以往任何时候都拥有更多可用的基础设施。考虑到[机器学习和人工智能工具将很快实现的飞跃][10],这是幸运的。
|
||||
|
||||
所有这些都说明现在正是打造伟大事业的好时机。考虑到市场创新的速度,你需要不断地创造伟大的东西来保持客户的忠诚度。因此,如果你一直在等待将赌注押在 DevOps 上,那么现在就是正确的时机。容器技术和 Kubernetes 改变了规则,并且对你有利。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://enterprisersproject.com/article/2018/1/how-technology-changes-rules-doing-agile
|
||||
|
||||
作者:[Matt Hicks][a]
|
||||
译者:[JayFrank](https://github.com/JayFrank)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://enterprisersproject.com/user/matt-hicks
|
||||
[1]:https://enterprisersproject.com/tags/devops
|
||||
[2]:https://www.redhat.com/en/topics/containers?intcmp=701f2000000tjyaAAA
|
||||
[3]:https://www.redhat.com/en/topics/containers/what-is-kubernetes?intcmp=701f2000000tjyaAAA
|
||||
[4]:https://enterprisersproject.com/article/2017/8/4-container-adoption-patterns-what-you-need-know?sc_cid=70160000000h0aXAAQ
|
||||
[5]:https://enterprisersproject.com/devops?sc_cid=70160000000h0aXAAQ
|
||||
[6]:https://enterprisersproject.com/article/2017/11/how-enterprise-it-uses-kubernetes-tame-container-complexity
|
||||
[7]:https://www.redhat.com/en/about/videos/john-rzeszotarski-keybank-red-hat-summit-2017?intcmp=701f2000000tjyaAAA
|
||||
[8]:https://enterprisersproject.com/article/2017/11/dear-cios-stop-beating-yourselves-being-behind-transformation
|
||||
[9]:https://www.redhat.com/en/resources/macquarie-bank-case-study?intcmp=701f2000000tjyaAAA
|
||||
[10]:https://enterprisersproject.com/article/2018/1/4-ai-trends-watch
|
||||
[11]:https://enterprisersproject.com/email-newsletter?intcmp=701f2000000tsjPAAQ
|
480
published/201909/20180330 Go on very small hardware Part 1.md
Normal file
480
published/201909/20180330 Go on very small hardware Part 1.md
Normal file
@ -0,0 +1,480 @@
|
||||
Go 语言在极小硬件上的运用(一)
|
||||
=========
|
||||
|
||||
Go 语言,能在多低下的配置上运行并发挥作用呢?
|
||||
|
||||
我最近购买了一个特别便宜的开发板:
|
||||
|
||||
![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/board.jpg)
|
||||
|
||||
我购买它的理由有三个。首先,我(作为程序员)从未接触过 STM320 系列的开发板。其次,STM32F10x 系列使用也有点少了。STM320 系列的 MCU 很便宜,有更新一些的外设,对系列产品进行了改进,问题修复也做得更好了。最后,为了这篇文章,我选用了这一系列中最低配置的开发板,整件事情就变得有趣起来了。
|
||||
|
||||
### 硬件部分
|
||||
|
||||
[STM32F030F4P6][3] 给人留下了很深的印象:
|
||||
|
||||
* CPU: [Cortex M0][1] 48 MHz(最低配置,只有 12000 个逻辑门电路)
|
||||
* RAM: 4 KB,
|
||||
* Flash: 16 KB,
|
||||
* ADC、SPI、I2C、USART 和几个定时器
|
||||
|
||||
以上这些采用了 TSSOP20 封装。正如你所见,这是一个很小的 32 位系统。
|
||||
|
||||
### 软件部分
|
||||
|
||||
如果你想知道如何在这块开发板上使用 [Go][4] 编程,你需要反复阅读硬件规范手册。你必须面对这样的真实情况:在 Go 编译器中给 Cortex-M0 提供支持的可能性很小。而且,这还仅仅只是第一个要解决的问题。
|
||||
|
||||
我会使用 [Emgo][5],但别担心,之后你会看到,它如何让 Go 在如此小的系统上尽可能发挥作用。
|
||||
|
||||
在我拿到这块开发板之前,对 [stm32/hal][6] 系列下的 F0 MCU 没有任何支持。在简单研究[参考手册][7]后,我发现 STM32F0 系列是 STM32F3 削减版,这让在新端口上开发的工作变得容易了一些。
|
||||
|
||||
如果你想接着本文的步骤做下去,需要先安装 Emgo
|
||||
|
||||
```
|
||||
cd $HOME
|
||||
git clone https://github.com/ziutek/emgo/
|
||||
cd emgo/egc
|
||||
go install
|
||||
```
|
||||
|
||||
然后设置一下环境变量
|
||||
|
||||
```
|
||||
export EGCC=path_to_arm_gcc # eg. /usr/local/arm/bin/arm-none-eabi-gcc
|
||||
export EGLD=path_to_arm_linker # eg. /usr/local/arm/bin/arm-none-eabi-ld
|
||||
export EGAR=path_to_arm_archiver # eg. /usr/local/arm/bin/arm-none-eabi-ar
|
||||
|
||||
export EGROOT=$HOME/emgo/egroot
|
||||
export EGPATH=$HOME/emgo/egpath
|
||||
|
||||
export EGARCH=cortexm0
|
||||
export EGOS=noos
|
||||
export EGTARGET=f030x6
|
||||
```
|
||||
|
||||
更详细的说明可以在 [Emgo][8] 官网上找到。
|
||||
|
||||
要确保 `egc` 在你的 `PATH` 中。 你可以使用 `go build` 来代替 `go install`,然后把 `egc` 复制到你的 `$HOME/bin` 或 `/usr/local/bin` 中。
|
||||
|
||||
现在,为你的第一个 Emgo 程序创建一个新文件夹,随后把示例中链接器脚本复制过来:
|
||||
|
||||
```
|
||||
mkdir $HOME/firstemgo
|
||||
cd $HOME/firstemgo
|
||||
cp $EGPATH/src/stm32/examples/f030-demo-board/blinky/script.ld .
|
||||
```
|
||||
|
||||
### 最基本程序
|
||||
|
||||
在 `main.go` 文件中创建一个最基本的程序:
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
func main() {
|
||||
}
|
||||
```
|
||||
|
||||
文件编译没有出现任何问题:
|
||||
|
||||
```
|
||||
$ egc
|
||||
$ arm-none-eabi-size cortexm0.elf
|
||||
text data bss dec hex filename
|
||||
7452 172 104 7728 1e30 cortexm0.elf
|
||||
```
|
||||
|
||||
第一次编译可能会花点时间。编译后产生的二进制占用了 7624 个字节的 Flash 空间(文本 + 数据)。对于一个什么都没做的程序来说,占用的空间有些大。还剩下 8760 字节,可以用来做些有用的事。
|
||||
|
||||
不妨试试传统的 “Hello, World!” 程序:
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello, World!")
|
||||
}
|
||||
```
|
||||
|
||||
不幸的是,这次结果有些糟糕:
|
||||
|
||||
```
|
||||
$ egc
|
||||
/usr/local/arm/bin/arm-none-eabi-ld: /home/michal/P/go/src/github.com/ziutek/emgo/egpath/src/stm32/examples/f030-demo-board/blog/cortexm0.elf section `.text' will not fit in region `Flash'
|
||||
/usr/local/arm/bin/arm-none-eabi-ld: region `Flash' overflowed by 10880 bytes
|
||||
exit status 1
|
||||
```
|
||||
|
||||
“Hello, World!” 需要 STM32F030x6 上至少 32KB 的 Flash 空间。
|
||||
|
||||
`fmt` 包强制包含整个 `strconv` 和 `reflect` 包。这三个包,即使在精简版本中的 Emgo 中,占用空间也很大。我们不能使用这个例子了。有很多的应用不需要好看的文本输出。通常,一个或多个 LED,或者七段数码管显示就足够了。不过,在第二部分,我会尝试使用 `strconv` 包来格式化,并在 UART 上显示一些数字和文本。
|
||||
|
||||
### 闪烁
|
||||
|
||||
我们的开发板上有一个与 PA4 引脚和 VCC 相连的 LED。这次我们的代码稍稍长了一些:
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"delay"
|
||||
|
||||
"stm32/hal/gpio"
|
||||
"stm32/hal/system"
|
||||
"stm32/hal/system/timer/systick"
|
||||
)
|
||||
|
||||
var led gpio.Pin
|
||||
|
||||
func init() {
|
||||
system.SetupPLL(8, 1, 48/8)
|
||||
systick.Setup(2e6)
|
||||
|
||||
gpio.A.EnableClock(false)
|
||||
led = gpio.A.Pin(4)
|
||||
|
||||
cfg := &gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}
|
||||
led.Setup(cfg)
|
||||
}
|
||||
|
||||
func main() {
|
||||
for {
|
||||
led.Clear()
|
||||
delay.Millisec(100)
|
||||
led.Set()
|
||||
delay.Millisec(900)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
按照惯例,`init` 函数用来初始化和配置外设。
|
||||
|
||||
`system.SetupPLL(8, 1, 48/8)` 用来配置 RCC,将外部的 8 MHz 振荡器的 PLL 作为系统时钟源。PLL 分频器设置为 1,倍频数设置为 48/8 =6,这样系统时钟频率为 48MHz。
|
||||
|
||||
`systick.Setup(2e6)` 将 Cortex-M SYSTICK 时钟作为系统时钟,每隔 2e6 次纳秒运行一次(每秒钟 500 次)。
|
||||
|
||||
`gpio.A.EnableClock(false)` 开启了 GPIO A 口的时钟。`False` 意味着这一时钟在低功耗模式下会被禁用,但在 STM32F0 系列中并未实现这一功能。
|
||||
|
||||
`led.Setup(cfg)` 设置 PA4 引脚为开漏输出。
|
||||
|
||||
`led.Clear()` 将 PA4 引脚设为低,在开漏设置中,打开 LED。
|
||||
|
||||
`led.Set()` 将 PA4 设为高电平状态,关掉LED。
|
||||
|
||||
编译这个代码:
|
||||
|
||||
```
|
||||
$ egc
|
||||
$ arm-none-eabi-size cortexm0.elf
|
||||
text data bss dec hex filename
|
||||
9772 172 168 10112 2780 cortexm0.elf
|
||||
```
|
||||
|
||||
正如你所看到的,这个闪烁程序占用了 2320 字节,比最基本程序占用空间要大。还有 6440 字节的剩余空间。
|
||||
|
||||
看看代码是否能运行:
|
||||
|
||||
```
|
||||
$ openocd -d0 -f interface/stlink.cfg -f target/stm32f0x.cfg -c 'init; program cortexm0.elf; reset run; exit'
|
||||
Open On-Chip Debugger 0.10.0+dev-00319-g8f1f912a (2018-03-07-19:20)
|
||||
Licensed under GNU GPL v2
|
||||
For bug reports, read
|
||||
http://openocd.org/doc/doxygen/bugs.html
|
||||
debug_level: 0
|
||||
adapter speed: 1000 kHz
|
||||
adapter_nsrst_delay: 100
|
||||
none separate
|
||||
adapter speed: 950 kHz
|
||||
target halted due to debug-request, current mode: Thread
|
||||
xPSR: 0xc1000000 pc: 0x0800119c msp: 0x20000da0
|
||||
adapter speed: 4000 kHz
|
||||
** Programming Started **
|
||||
auto erase enabled
|
||||
target halted due to breakpoint, current mode: Thread
|
||||
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000da0
|
||||
wrote 10240 bytes from file cortexm0.elf in 0.817425s (12.234 KiB/s)
|
||||
** Programming Finished **
|
||||
adapter speed: 950 kHz
|
||||
```
|
||||
|
||||
在这篇文章中,这是我第一次,将一个短视频转换成[动画 PNG][9]。我对此印象很深,再见了 YouTube。 对于 IE 用户,我很抱歉,更多信息请看 [apngasm][10]。我本应该学习 HTML5,但现在,APNG 是我最喜欢的,用来播放循环短视频的方法了。
|
||||
|
||||
![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/blinky.png)
|
||||
|
||||
### 更多的 Go 语言编程
|
||||
|
||||
如果你不是一个 Go 程序员,但你已经听说过一些关于 Go 语言的事情,你可能会说:“Go 语法很好,但跟 C 比起来,并没有明显的提升。让我看看 Go 语言的通道和协程!”
|
||||
|
||||
接下来我会一一展示:
|
||||
|
||||
```
|
||||
import (
|
||||
"delay"
|
||||
|
||||
"stm32/hal/gpio"
|
||||
"stm32/hal/system"
|
||||
"stm32/hal/system/timer/systick"
|
||||
)
|
||||
|
||||
var led1, led2 gpio.Pin
|
||||
|
||||
func init() {
|
||||
system.SetupPLL(8, 1, 48/8)
|
||||
systick.Setup(2e6)
|
||||
|
||||
gpio.A.EnableClock(false)
|
||||
led1 = gpio.A.Pin(4)
|
||||
led2 = gpio.A.Pin(5)
|
||||
|
||||
cfg := &gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}
|
||||
led1.Setup(cfg)
|
||||
led2.Setup(cfg)
|
||||
}
|
||||
|
||||
func blinky(led gpio.Pin, period int) {
|
||||
for {
|
||||
led.Clear()
|
||||
delay.Millisec(100)
|
||||
led.Set()
|
||||
delay.Millisec(period - 100)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
go blinky(led1, 500)
|
||||
blinky(led2, 1000)
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
代码改动很小: 添加了第二个 LED,上一个例子中的 `main` 函数被重命名为 `blinky` 并且需要提供两个参数。 `main` 在新的协程中先调用 `blinky`,所以两个 LED 灯在并行使用。值得一提的是,`gpio.Pin` 可以同时访问同一 GPIO 口的不同引脚。
|
||||
|
||||
Emgo 还有很多不足。其中之一就是你需要提前规定 `goroutines(tasks)` 的最大执行数量。是时候修改 `script.ld` 了:
|
||||
|
||||
```
|
||||
ISRStack = 1024;
|
||||
MainStack = 1024;
|
||||
TaskStack = 1024;
|
||||
MaxTasks = 2;
|
||||
|
||||
INCLUDE stm32/f030x4
|
||||
INCLUDE stm32/loadflash
|
||||
INCLUDE noos-cortexm
|
||||
```
|
||||
|
||||
栈的大小需要靠猜,现在还不用关心这一点。
|
||||
|
||||
```
|
||||
$ egc
|
||||
$ arm-none-eabi-size cortexm0.elf
|
||||
text data bss dec hex filename
|
||||
10020 172 172 10364 287c cortexm0.elf
|
||||
```
|
||||
|
||||
另一个 LED 和协程一共占用了 248 字节的 Flash 空间。
|
||||
|
||||
![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/goroutines.png)
|
||||
|
||||
### 通道
|
||||
|
||||
通道是 Go 语言中协程之间相互通信的一种[推荐方式][11]。Emgo 甚至能允许通过*中断处理*来使用缓冲通道。下一个例子就展示了这种情况。
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"delay"
|
||||
"rtos"
|
||||
|
||||
"stm32/hal/gpio"
|
||||
"stm32/hal/irq"
|
||||
"stm32/hal/system"
|
||||
"stm32/hal/system/timer/systick"
|
||||
"stm32/hal/tim"
|
||||
)
|
||||
|
||||
var (
|
||||
leds [3]gpio.Pin
|
||||
timer *tim.Periph
|
||||
ch = make(chan int, 1)
|
||||
)
|
||||
|
||||
func init() {
|
||||
system.SetupPLL(8, 1, 48/8)
|
||||
systick.Setup(2e6)
|
||||
|
||||
gpio.A.EnableClock(false)
|
||||
leds[0] = gpio.A.Pin(4)
|
||||
leds[1] = gpio.A.Pin(5)
|
||||
leds[2] = gpio.A.Pin(9)
|
||||
|
||||
cfg := &gpio.Config{Mode: gpio.Out, Driver: gpio.OpenDrain}
|
||||
for _, led := range leds {
|
||||
led.Set()
|
||||
led.Setup(cfg)
|
||||
}
|
||||
|
||||
timer = tim.TIM3
|
||||
pclk := timer.Bus().Clock()
|
||||
if pclk < system.AHB.Clock() {
|
||||
pclk *= 2
|
||||
}
|
||||
freq := uint(1e3) // Hz
|
||||
timer.EnableClock(true)
|
||||
timer.PSC.Store(tim.PSC(pclk/freq - 1))
|
||||
timer.ARR.Store(700) // ms
|
||||
timer.DIER.Store(tim.UIE)
|
||||
timer.CR1.Store(tim.CEN)
|
||||
|
||||
rtos.IRQ(irq.TIM3).Enable()
|
||||
}
|
||||
|
||||
func blinky(led gpio.Pin, period int) {
|
||||
for range ch {
|
||||
led.Clear()
|
||||
delay.Millisec(100)
|
||||
led.Set()
|
||||
delay.Millisec(period - 100)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
go blinky(leds[1], 500)
|
||||
blinky(leds[2], 500)
|
||||
}
|
||||
|
||||
func timerISR() {
|
||||
timer.SR.Store(0)
|
||||
leds[0].Set()
|
||||
select {
|
||||
case ch <- 0:
|
||||
// Success
|
||||
default:
|
||||
leds[0].Clear()
|
||||
}
|
||||
}
|
||||
|
||||
//c:__attribute__((section(".ISRs")))
|
||||
var ISRs = [...]func(){
|
||||
irq.TIM3: timerISR,
|
||||
}
|
||||
```
|
||||
|
||||
与之前例子相比较下的不同:
|
||||
|
||||
1. 添加了第三个 LED,并连接到 PA9 引脚(UART 头的 TXD 引脚)。
|
||||
2. 时钟(`TIM3`)作为中断源。
|
||||
3. 新函数 `timerISR` 用来处理 `irq.TIM3` 的中断。
|
||||
4. 新增容量为 1 的缓冲通道是为了 `timerISR` 和 `blinky` 协程之间的通信。
|
||||
5. `ISRs` 数组作为*中断向量表*,是更大的*异常向量表*的一部分。
|
||||
6. `blinky` 中的 `for` 语句被替换成 `range` 语句。
|
||||
|
||||
为了方便起见,所有的 LED,或者说它们的引脚,都被放在 `leds` 这个数组里。另外,所有引脚在被配置为输出之前,都设置为一种已知的初始状态(高电平状态)。
|
||||
|
||||
在这个例子里,我们想让时钟以 1 kHz 的频率运行。为了配置 TIM3 预分频器,我们需要知道它的输入时钟频率。通过参考手册我们知道,输入时钟频率在 `APBCLK = AHBCLK` 时,与 `APBCLK` 相同,反之等于 2 倍的 `APBCLK`。
|
||||
|
||||
如果 CNT 寄存器增加 1 kHz,那么 ARR 寄存器的值等于*更新事件*(重载事件)在毫秒中的计数周期。 为了让更新事件产生中断,必须要设置 DIER 寄存器中的 UIE 位。CEN 位能启动时钟。
|
||||
|
||||
时钟外设在低功耗模式下必须启用,为了自身能在 CPU 处于休眠时保持运行: `timer.EnableClock(true)`。这在 STM32F0 中无关紧要,但对代码可移植性却十分重要。
|
||||
|
||||
`timerISR` 函数处理 `irq.TIM3` 的中断请求。`timer.SR.Store(0)` 会清除 SR 寄存器里的所有事件标志,无效化向 [NVIC][12] 发出的所有中断请求。凭借经验,由于中断请求无效的延时性,需要在程序一开始马上清除所有的中断标志。这避免了无意间再次调用处理。为了确保万无一失,需要先清除标志,再读取,但是在我们的例子中,清除标志就已经足够了。
|
||||
|
||||
下面的这几行代码:
|
||||
|
||||
```
|
||||
select {
|
||||
case ch <- 0:
|
||||
// Success
|
||||
default:
|
||||
leds[0].Clear()
|
||||
}
|
||||
```
|
||||
|
||||
是 Go 语言中,如何在通道上非阻塞地发送消息的方法。中断处理程序无法一直等待通道中的空余空间。如果通道已满,则执行 `default`,开发板上的LED就会开启,直到下一次中断。
|
||||
|
||||
`ISRs` 数组包含了中断向量表。`//c:__attribute__((section(".ISRs")))` 会导致链接器将数组插入到 `.ISRs` 节中。
|
||||
|
||||
`blinky` 的 `for` 循环的新写法:
|
||||
|
||||
```
|
||||
for range ch {
|
||||
led.Clear()
|
||||
delay.Millisec(100)
|
||||
led.Set()
|
||||
delay.Millisec(period - 100)
|
||||
}
|
||||
```
|
||||
|
||||
等价于:
|
||||
|
||||
```
|
||||
for {
|
||||
_, ok := <-ch
|
||||
if !ok {
|
||||
break // Channel closed.
|
||||
}
|
||||
led.Clear()
|
||||
delay.Millisec(100)
|
||||
led.Set()
|
||||
delay.Millisec(period - 100)
|
||||
}
|
||||
```
|
||||
|
||||
注意,在这个例子中,我们不在意通道中收到的值,我们只对其接受到的消息感兴趣。我们可以在声明时,将通道元素类型中的 `int` 用空结构体 `struct{}` 来代替,发送消息时,用 `struct{}{}` 结构体的值代替 0,但这部分对新手来说可能会有些陌生。
|
||||
|
||||
让我们来编译一下代码:
|
||||
|
||||
```
|
||||
$ egc
|
||||
$ arm-none-eabi-size cortexm0.elf
|
||||
text data bss dec hex filename
|
||||
11096 228 188 11512 2cf8 cortexm0.elf
|
||||
```
|
||||
|
||||
新的例子占用了 11324 字节的 Flash 空间,比上一个例子多占用了 1132 字节。
|
||||
|
||||
采用现在的时序,两个闪烁协程从通道中获取数据的速度,比 `timerISR` 发送数据的速度要快。所以它们在同时等待新数据,你还能观察到 `select` 的随机性,这也是 [Go 规范][13]所要求的。
|
||||
|
||||
![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/channels1.png)
|
||||
|
||||
开发板上的 LED 一直没有亮起,说明通道从未出现过溢出。
|
||||
|
||||
我们可以加快消息发送的速度,将 `timer.ARR.Store(700)` 改为 `timer.ARR.Store(200)`。 现在 `timerISR` 每秒钟发送 5 条消息,但是两个接收者加起来,每秒也只能接受 4 条消息。
|
||||
|
||||
![STM32F030F4P6](https://ziutek.github.io/images/mcu/f030-demo-board/channels2.png)
|
||||
|
||||
正如你所看到的,`timerISR` 开启黄色 LED 灯,意味着通道上已经没有剩余空间了。
|
||||
|
||||
第一部分到这里就结束了。你应该知道,这一部分并未展示 Go 中最重要的部分,接口。
|
||||
|
||||
协程和通道只是一些方便好用的语法。你可以用自己的代码来替换它们,这并不容易,但也可以实现。接口是Go 语言的基础。这是文章中 [第二部分][14]所要提到的.
|
||||
|
||||
在 Flash 上我们还有些剩余空间。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://ziutek.github.io/2018/03/30/go_on_very_small_hardware.html
|
||||
|
||||
作者:[Michał Derkacz][a]
|
||||
译者:[wenwensnow](https://github.com/wenwensnow)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://ziutek.github.io/
|
||||
[1]:https://en.wikipedia.org/wiki/ARM_Cortex-M#Cortex-M0
|
||||
[2]:https://ziutek.github.io/2018/03/30/go_on_very_small_hardware.html
|
||||
[3]:http://www.st.com/content/st_com/en/products/microcontrollers/stm32-32-bit-arm-cortex-mcus/stm32-mainstream-mcus/stm32f0-series/stm32f0x0-value-line/stm32f030f4.html
|
||||
[4]:https://golang.org/
|
||||
[5]:https://github.com/ziutek/emgo
|
||||
[6]:https://github.com/ziutek/emgo/tree/master/egpath/src/stm32/hal
|
||||
[7]:http://www.st.com/resource/en/reference_manual/dm00091010.pdf
|
||||
[8]:https://github.com/ziutek/emgo
|
||||
[9]:https://en.wikipedia.org/wiki/APNG
|
||||
[10]:http://apngasm.sourceforge.net/
|
||||
[11]:https://blog.golang.org/share-memory-by-communicating
|
||||
[12]:http://infocenter.arm.com/help/topic/com.arm.doc.ddi0432c/Cihbecee.html
|
||||
[13]:https://golang.org/ref/spec#Select_statements
|
||||
[14]:https://ziutek.github.io/2018/04/14/go_on_very_small_hardware2.html
|
116
published/201909/20180705 Building a Messenger App- Schema.md
Normal file
116
published/201909/20180705 Building a Messenger App- Schema.md
Normal file
@ -0,0 +1,116 @@
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "PsiACE"
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-11396-1.html"
|
||||
[#]: subject: "Building a Messenger App: Schema"
|
||||
[#]: via: "https://nicolasparada.netlify.com/posts/go-messenger-schema/"
|
||||
[#]: author: "Nicolás Parada https://nicolasparada.netlify.com/"
|
||||
|
||||
构建一个即时消息应用(一):模式
|
||||
========
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/27/211458n44f7jvp77lfxxm0.jpg)
|
||||
|
||||
这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。[Facebook Messenger][1]、[WhatsApp][2] 和 [Skype][3] 就是其中的几个例子。正如你所看到的那样,这些应用允许我们发送图片、传输视频、录制音频、以及和一大帮子人聊天等等。当然,我们的教程应用将会尽量保持简单,只在两个用户之间发送文本消息。
|
||||
|
||||
我们将会用 [CockroachDB][4] 作为 SQL 数据库,用 [Go][5] 作为后端语言,并且用 JavaScript 来制作 web 应用。
|
||||
|
||||
这是第一篇帖子,我们将会讲述数据库的设计。
|
||||
|
||||
```
|
||||
CREATE TABLE users (
|
||||
id SERIAL NOT NULL PRIMARY KEY,
|
||||
username STRING NOT NULL UNIQUE,
|
||||
avatar_url STRING,
|
||||
github_id INT NOT NULL UNIQUE
|
||||
);
|
||||
```
|
||||
|
||||
显然,这个应用需要一些用户。我们这里采用社交登录的形式。由于我选用了 [GitHub][6],所以这里需要保存一个对 GitHub 用户 ID 的引用。
|
||||
|
||||
```
|
||||
CREATE TABLE conversations (
|
||||
id SERIAL NOT NULL PRIMARY KEY,
|
||||
last_message_id INT,
|
||||
INDEX (last_message_id DESC)
|
||||
);
|
||||
```
|
||||
|
||||
每个对话都会引用最近一条消息。每当我们输入一条新消息时,我们都会更新这个字段。我会在后面添加外键约束。
|
||||
|
||||
… 你可能会想,我们可以先对对话进行分组,然后再通过这样的方式获取最近一条消息。但这样做会使查询变得更加复杂。
|
||||
|
||||
```
|
||||
CREATE TABLE participants (
|
||||
user_id INT NOT NULL REFERENCES users ON DELETE CASCADE,
|
||||
conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE,
|
||||
messages_read_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
PRIMARY KEY (user_id, conversation_id)
|
||||
);
|
||||
```
|
||||
|
||||
尽管之前我提到过对话只会在两个用户之间进行,但我们还是采用了允许向对话中添加多个参与者的设计。因此,在对话和用户之间有一个参与者表。
|
||||
|
||||
为了知道用户是否有未读消息,我们在消息表中添加了“读取时间”(`messages_read_at`)字段。每当用户在对话中读取消息时,我们都会更新它的值,这样一来,我们就可以将它与对话中最后一条消息的“创建时间”(`created_at`)字段进行比较。
|
||||
|
||||
```
|
||||
CREATE TABLE messages (
|
||||
id SERIAL NOT NULL PRIMARY KEY,
|
||||
content STRING NOT NULL,
|
||||
user_id INT NOT NULL REFERENCES users ON DELETE CASCADE,
|
||||
conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
INDEX(created_at DESC)
|
||||
);
|
||||
```
|
||||
|
||||
尽管我们将消息表放在最后,但它在应用中相当重要。我们用它来保存对创建它的用户以及它所出现的对话的引用。而且还可以根据“创建时间”(`created_at`)来创建索引以完成对消息的排序。
|
||||
|
||||
```
|
||||
ALTER TABLE conversations
|
||||
ADD CONSTRAINT fk_last_message_id_ref_messages
|
||||
FOREIGN KEY (last_message_id) REFERENCES messages ON DELETE SET NULL;
|
||||
```
|
||||
|
||||
我在前面已经提到过这个外键约束了,不是吗:D
|
||||
|
||||
有这四张表就足够了。你也可以将这些查询保存到一个文件中,并将其通过管道传送到 Cockroach CLI。
|
||||
|
||||
首先,我们需要启动一个新节点:
|
||||
|
||||
```
|
||||
cockroach start --insecure --host 127.0.0.1
|
||||
```
|
||||
|
||||
然后创建数据库和这些表:
|
||||
|
||||
```
|
||||
cockroach sql --insecure -e "CREATE DATABASE messenger"
|
||||
cat schema.sql | cockroach sql --insecure -d messenger
|
||||
```
|
||||
|
||||
这篇帖子就到这里。在接下来的部分中,我们将会介绍「登录」,敬请期待。
|
||||
|
||||
- [源代码][7]
|
||||
|
||||
---
|
||||
|
||||
via: https://nicolasparada.netlify.com/posts/go-messenger-schema/
|
||||
|
||||
作者:[Nicolás Parada][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[PsiACE](https://github.com/PsiACE)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux 中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://nicolasparada.netlify.com/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.messenger.com/
|
||||
[2]: https://www.whatsapp.com/
|
||||
[3]: https://www.skype.com/
|
||||
[4]: https://www.cockroachlabs.com/
|
||||
[5]: https://golang.org/
|
||||
[6]: https://github.com/
|
||||
[7]: https://github.com/nicolasparada/go-messenger-demo
|
@ -0,0 +1,89 @@
|
||||
区块链能如何补充开源
|
||||
======
|
||||
|
||||
> 了解区块链如何成为去中心化的开源补贴模型。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/16/111521od1yn9r1nr1eii9o.jpg)
|
||||
|
||||
《<ruby>[大教堂与集市][1]<rt>The Cathedral and The Bazaar</rt></ruby>》是 20 年前由<ruby>埃里克·史蒂文·雷蒙德<rt>Eric Steven Raymond<rt></ruby>(ESR)撰写的经典开源故事。在这个故事中,ESR 描述了一种新的革命性的软件开发模型,其中复杂的软件项目是在没有(或者很少的)集中管理的情况下构建的。这个新模型就是<ruby>开源<rt>open source</rt></ruby>。
|
||||
|
||||
ESR 的故事比较了两种模式:
|
||||
|
||||
* 经典模型(由“大教堂”所代表),其中软件由一小群人在封闭和受控的环境中通过缓慢而稳定的发布制作而成。
|
||||
* 以及新模式(由“集市”所代表),其中软件是在开放的环境中制作的,个人可以自由参与,但仍然可以产生一个稳定和连贯的系统。
|
||||
|
||||
开源如此成功的一些原因可以追溯到 ESR 所描述的创始原则。尽早发布、经常发布,并接受许多头脑必然比一个更好的事实,让开源项目进入全世界的人才库(很少有公司能够使用闭源模式与之匹敌)。
|
||||
|
||||
在 ESR 对黑客社区的反思分析 20 年后,我们看到开源成为占据主导地位的的模式。它不再仅仅是为了满足开发人员的个人喜好,而是创新发生的地方。甚至是全球[最大][2]软件公司也正在转向这种模式,以便继续占据主导地位。
|
||||
|
||||
### 易货系统
|
||||
|
||||
如果我们仔细研究开源模型在实践中的运作方式,我们就会意识到它是一个封闭系统,只对开源开发者和技术人员开放。影响项目方向的唯一方法是加入开源社区,了解成文和不成文的规则,学习如何贡献、编码标准等,并自己亲力完成。
|
||||
|
||||
这就是集市的运作方式,也是这个易货系统类比的来源。易货系统是一种交换服务和货物以换取其他服务和货物的方法。在市场中(即软件的构建地)这意味着为了获取某些东西,你必须自己也是一个生产者并回馈一些东西——那就是通过交换你的时间和知识来完成任务。集市是开源开发者与其他开源开发者交互并以开源方式生成开源软件的地方。
|
||||
|
||||
易货系统向前迈出了一大步,从自给自足的状态演变而来,而在自给自足的状态下,每个人都必须成为所有行业的杰出人选。使用易货系统的集市(开源模式)允许具有共同兴趣和不同技能的人们收集、协作和创造个人无法自行创造的东西。易货系统简单,没有现代货币系统那么复杂,但也有一些局限性,例如:
|
||||
|
||||
* 缺乏可分性:在没有共同的交换媒介的情况下,不能将较大的不可分割的商品/价值兑换成较小的商品/价值。例如,如果你想在开源项目中进行一些哪怕是小的更改,有时你可能仍需要经历一个高进入门槛。
|
||||
* 存储价值:如果一个项目对贵公司很重要,你可能需要投入大量投资/承诺。但由于它是开源开发者之间的易货系统,因此拥有强大发言权的唯一方法是雇佣许多开源贡献者,但这并非总是可行的。
|
||||
* 转移价值:如果你投资了一个项目(受过培训的员工、雇用开源开发者)并希望将重点转移到另一个项目,却不可能快速转移(你在上一个项目中拥有的)专业知识、声誉和影响力。
|
||||
* 时间脱钩:易货系统没有为延期或提前承诺提供良好的机制。在开源世界中,这意味着用户无法提前或在未来期间以可衡量的方式表达对项目的承诺或兴趣。
|
||||
|
||||
下面,我们将探讨如何使用集市的后门解决这些限制。
|
||||
|
||||
### 货币系统
|
||||
|
||||
人们因为不同的原因勾连于集市上:有些人在那里学习,有些是出于满足开发者个人的喜好,有些人为大型软件工厂工作。因为在集市中拥有发言权的唯一方法是成为开源社区的一份子并加入这个易货系统,为了在开源世界获得信誉,许多大型软件公司雇用这些开发者并以货币方式支付薪酬。这代表可以使用货币系统来影响集市,开源不再只是为了满足开发者个人的喜好,它也占据全球整体软件生产的重要部分,并且有许多人想要施加影响。
|
||||
|
||||
开源设定了开发人员交互的指导原则,并以分布式方式构建一致的系统。它决定了项目的治理方式、软件的构建方式以及其成果如何分发给用户。它是分散的实体共同构建高质量软件的开放共识模型。但是开源模型并没有包括如何补贴开源的部分,无论是直接还是间接地,通过内在或外在动机的赞助,都与集市无关。
|
||||
|
||||
![](https://opensource.com/sites/default/files/uploads/tokenomics_-_page_4.png)
|
||||
|
||||
目前,没有相当于以补贴为目的的去中心化式开源开发模型。大多数开源补贴都是集中式的,通常一家公司通过雇用该项目的主要开源开发者来主导该项目。说实话,这是目前最好的状况,因为它保证了开发人员将长期获得报酬,项目也将继续蓬勃发展。
|
||||
|
||||
项目垄断情景也有例外情况:例如,一些云原生计算基金会(CNCF)项目是由大量的竞争公司开发的。此外,Apache 软件基金会(ASF)旨在通过鼓励不同的贡献者来使他们管理的项目不被单一供应商所主导,但实际上大多数受欢迎的项目仍然是单一供应商项目。
|
||||
|
||||
我们缺少的是一个开放的、去中心化的模式,就像一个没有集中协调和所有权的集市一样,消费者(开源用户)和生产者(开源开发者)在市场力量和开源价值的驱动下相互作用。为了补充开源,这样的模型也必须是开放和去中心化的,这就是为什么我认为区块链技术[最适合][3]的原因。
|
||||
|
||||
旨在补贴开源开发的大多数现有区块链(和非区块链)平台主要针对的是漏洞赏金、小型和零碎的任务。少数人还专注于资助新的开源项目。但并没有多少平台旨在提供维持开源项目持续开发的机制 —— 基本上,这个系统可以模仿开源服务提供商公司或开放核心、基于开源的 SaaS 产品公司的行为:确保开发人员可以获得持续和可预测的激励,并根据激励者(即用户)的优先事项指导项目开发。这种模型将解决上面列出的易货系统的局限性:
|
||||
|
||||
* 允许可分性:如果你想要一些小的修复,你可以支付少量费用,而不是成为项目的开源开发者的全部费用。
|
||||
* 存储价值:你可以在项目中投入大量资金,并确保其持续发展和你的发言权。
|
||||
* 转移价值:在任何时候,你都可以停止投资项目并将资金转移到其他项目中。
|
||||
* 时间脱钩:允许定期定期付款和订阅。
|
||||
|
||||
还有其他好处,纯粹是因为这种基于区块链的系统是透明和去中心化的:根据用户的承诺、开放的路线图承诺、去中心化决策等来量化项目的价值/实用性。
|
||||
|
||||
### 总结
|
||||
|
||||
一方面,我们看到大公司雇用开源开发者并收购开源初创公司甚至基础平台(例如微软收购 GitHub)。许多(甚至大多数)能够长期成功运行的开源项目都集中在单个供应商周围。开源的重要性及其集中化是一个事实。
|
||||
|
||||
另一方面,[维持开源软件][4]的挑战正变得越来越明显,许多人正在更深入地研究这个领域及其基本问题。有一些项目具有很高的知名度和大量的贡献者,但还有许多其他也重要的项目缺乏足够的贡献者和维护者。
|
||||
|
||||
有[许多努力][3]试图通过区块链来解决开源的挑战。这些项目应提高透明度、去中心化和补贴,并在开源用户和开发人员之间建立直接联系。这个领域还很年轻,但是进展很快,随着时间的推移,集市将会有一个加密货币系统。
|
||||
|
||||
如果有足够的时间和足够的技术,去中心化就会发生在很多层面:
|
||||
|
||||
* 互联网是一种去中心化的媒介,它释放了全球分享和获取知识的潜力。
|
||||
* 开源是一种去中心化的协作模式,它释放了全球的创新潜力。
|
||||
* 同样,区块链可以补充开源,成为去中心化的开源补贴模式。
|
||||
|
||||
请在[推特][5]上关注我在这个领域的其他帖子。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/9/barter-currency-system
|
||||
|
||||
作者:[Bilgin lbryam][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/bibryam
|
||||
[1]: http://catb.org/
|
||||
[2]: http://oss.cash/
|
||||
[3]: https://opensource.com/article/18/8/open-source-tokenomics
|
||||
[4]: https://www.youtube.com/watch?v=VS6IpvTWwkQ
|
||||
[5]: http://twitter.com/bibryam
|
@ -0,0 +1,252 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (laingke)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11387-1.html)
|
||||
[#]: subject: (Linux commands for measuring disk activity)
|
||||
[#]: via: (https://www.networkworld.com/article/3330497/linux/linux-commands-for-measuring-disk-activity.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
用于测量磁盘活动的 Linux 命令
|
||||
======
|
||||
> Linux 发行版提供了几个度量磁盘活动的有用命令。让我们了解一下其中的几个。
|
||||
|
||||
![](https://images.idgesg.net/images/article/2018/12/tape-measure-100782593-large.jpg)
|
||||
|
||||
Linux 系统提供了一套方便的命令,帮助你查看磁盘有多忙,而不仅仅是磁盘有多满。在本文中,我们将研究五个非常有用的命令,用于查看磁盘活动。其中两个命令(`iostat` 和 `ioping`)可能必须添加到你的系统中,这两个命令一样要求你使用 sudo 特权,所有这五个命令都提供了查看磁盘活动的有用方法。
|
||||
|
||||
这些命令中最简单、最直观的一个可能是 `dstat` 了。
|
||||
|
||||
### dtstat
|
||||
|
||||
尽管 `dstat` 命令以字母 “d” 开头,但它提供的统计信息远远不止磁盘活动。如果你只想查看磁盘活动,可以使用 `-d` 选项。如下所示,你将得到一个磁盘读/写测量值的连续列表,直到使用 `CTRL-c` 停止显示为止。注意,在第一个报告信息之后,显示中的每个后续行将在接下来的时间间隔内报告磁盘活动,缺省值仅为一秒。
|
||||
|
||||
```
|
||||
$ dstat -d
|
||||
-dsk/total-
|
||||
read writ
|
||||
949B 73k
|
||||
65k 0 <== first second
|
||||
0 24k <== second second
|
||||
0 16k
|
||||
0 0 ^C
|
||||
```
|
||||
|
||||
在 `-d` 选项后面包含一个数字将把间隔设置为该秒数。
|
||||
|
||||
```
|
||||
$ dstat -d 10
|
||||
-dsk/total-
|
||||
read writ
|
||||
949B 73k
|
||||
65k 81M <== first five seconds
|
||||
0 21k <== second five second
|
||||
0 9011B ^C
|
||||
```
|
||||
|
||||
请注意,报告的数据可能以许多不同的单位显示——例如,M(Mb)、K(Kb)和 B(字节)。
|
||||
|
||||
如果没有选项,`dstat` 命令还将显示许多其他信息——指示 CPU 如何使用时间、显示网络和分页活动、报告中断和上下文切换。
|
||||
|
||||
```
|
||||
$ dstat
|
||||
You did not select any stats, using -cdngy by default.
|
||||
--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--
|
||||
usr sys idl wai stl| read writ| recv send| in out | int csw
|
||||
0 0 100 0 0| 949B 73k| 0 0 | 0 3B| 38 65
|
||||
0 0 100 0 0| 0 0 | 218B 932B| 0 0 | 53 68
|
||||
0 1 99 0 0| 0 16k| 64B 468B| 0 0 | 64 81 ^C
|
||||
```
|
||||
|
||||
`dstat` 命令提供了关于整个 Linux 系统性能的有价值的见解,几乎可以用它灵活而功能强大的命令来代替 `vmstat`、`netstat`、`iostat` 和 `ifstat` 等较旧的工具集合,该命令结合了这些旧工具的功能。要深入了解 `dstat` 命令可以提供的其它信息,请参阅这篇关于 [dstat][1] 命令的文章。
|
||||
|
||||
### iostat
|
||||
|
||||
`iostat` 命令通过观察设备活动的时间与其平均传输速率之间的关系,帮助监视系统输入/输出设备的加载情况。它有时用于评估磁盘之间的活动平衡。
|
||||
|
||||
```
|
||||
$ iostat
|
||||
Linux 4.18.0-041800-generic (butterfly) 12/26/2018 _x86_64_ (2 CPU)
|
||||
|
||||
avg-cpu: %user %nice %system %iowait %steal %idle
|
||||
0.07 0.01 0.03 0.05 0.00 99.85
|
||||
|
||||
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
|
||||
loop0 0.00 0.00 0.00 1048 0
|
||||
loop1 0.00 0.00 0.00 365 0
|
||||
loop2 0.00 0.00 0.00 1056 0
|
||||
loop3 0.00 0.01 0.00 16169 0
|
||||
loop4 0.00 0.00 0.00 413 0
|
||||
loop5 0.00 0.00 0.00 1184 0
|
||||
loop6 0.00 0.00 0.00 1062 0
|
||||
loop7 0.00 0.00 0.00 5261 0
|
||||
sda 1.06 0.89 72.66 2837453 232735080
|
||||
sdb 0.00 0.02 0.00 48669 40
|
||||
loop8 0.00 0.00 0.00 1053 0
|
||||
loop9 0.01 0.01 0.00 18949 0
|
||||
loop10 0.00 0.00 0.00 56 0
|
||||
loop11 0.00 0.00 0.00 7090 0
|
||||
loop12 0.00 0.00 0.00 1160 0
|
||||
loop13 0.00 0.00 0.00 108 0
|
||||
loop14 0.00 0.00 0.00 3572 0
|
||||
loop15 0.01 0.01 0.00 20026 0
|
||||
loop16 0.00 0.00 0.00 24 0
|
||||
```
|
||||
|
||||
当然,当你只想关注磁盘时,Linux 回环设备上提供的所有统计信息都会使结果显得杂乱无章。不过,该命令也确实提供了 `-p` 选项,该选项使你可以仅查看磁盘——如以下命令所示。
|
||||
|
||||
```
|
||||
$ iostat -p sda
|
||||
Linux 4.18.0-041800-generic (butterfly) 12/26/2018 _x86_64_ (2 CPU)
|
||||
|
||||
avg-cpu: %user %nice %system %iowait %steal %idle
|
||||
0.07 0.01 0.03 0.05 0.00 99.85
|
||||
|
||||
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
|
||||
sda 1.06 0.89 72.54 2843737 232815784
|
||||
sda1 1.04 0.88 72.54 2821733 232815784
|
||||
```
|
||||
|
||||
请注意 `tps` 是指每秒的传输量。
|
||||
|
||||
你还可以让 `iostat` 提供重复的报告。在下面的示例中,我们使用 `-d` 选项每五秒钟进行一次测量。
|
||||
|
||||
```
|
||||
$ iostat -p sda -d 5
|
||||
Linux 4.18.0-041800-generic (butterfly) 12/26/2018 _x86_64_ (2 CPU)
|
||||
|
||||
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
|
||||
sda 1.06 0.89 72.51 2843749 232834048
|
||||
sda1 1.04 0.88 72.51 2821745 232834048
|
||||
|
||||
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
|
||||
sda 0.80 0.00 11.20 0 56
|
||||
sda1 0.80 0.00 11.20 0 56
|
||||
```
|
||||
|
||||
如果你希望省略第一个(自启动以来的统计信息)报告,请在命令中添加 `-y`。
|
||||
|
||||
```
|
||||
$ iostat -p sda -d 5 -y
|
||||
Linux 4.18.0-041800-generic (butterfly) 12/26/2018 _x86_64_ (2 CPU)
|
||||
|
||||
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
|
||||
sda 0.80 0.00 11.20 0 56
|
||||
sda1 0.80 0.00 11.20 0 56
|
||||
```
|
||||
|
||||
接下来,我们看第二个磁盘驱动器。
|
||||
|
||||
```
|
||||
$ iostat -p sdb
|
||||
Linux 4.18.0-041800-generic (butterfly) 12/26/2018 _x86_64_ (2 CPU)
|
||||
|
||||
avg-cpu: %user %nice %system %iowait %steal %idle
|
||||
0.07 0.01 0.03 0.05 0.00 99.85
|
||||
|
||||
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
|
||||
sdb 0.00 0.02 0.00 48669 40
|
||||
sdb2 0.00 0.00 0.00 4861 40
|
||||
sdb1 0.00 0.01 0.00 35344 0
|
||||
```
|
||||
|
||||
### iotop
|
||||
|
||||
`iotop` 命令是类似 `top` 的实用程序,用于查看磁盘 I/O。它收集 Linux 内核提供的 I/O 使用信息,以便你了解哪些进程在磁盘 I/O 方面的要求最高。在下面的示例中,循环时间被设置为 5 秒。显示将自动更新,覆盖前面的输出。
|
||||
|
||||
```
|
||||
$ sudo iotop -d 5
|
||||
Total DISK READ: 0.00 B/s | Total DISK WRITE: 1585.31 B/s
|
||||
Current DISK READ: 0.00 B/s | Current DISK WRITE: 12.39 K/s
|
||||
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
|
||||
32492 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.12 % [kworker/u8:1-ev~_power_efficient]
|
||||
208 be/3 root 0.00 B/s 1585.31 B/s 0.00 % 0.11 % [jbd2/sda1-8]
|
||||
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init splash
|
||||
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
|
||||
3 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_gp]
|
||||
4 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_par_gp]
|
||||
8 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [mm_percpu_wq]
|
||||
```
|
||||
|
||||
### ioping
|
||||
|
||||
`ioping` 命令是一种完全不同的工具,但是它可以报告磁盘延迟——也就是磁盘响应请求需要多长时间,而这有助于诊断磁盘问题。
|
||||
|
||||
```
|
||||
$ sudo ioping /dev/sda1
|
||||
4 KiB <<< /dev/sda1 (block device 111.8 GiB): request=1 time=960.2 us (warmup)
|
||||
4 KiB <<< /dev/sda1 (block device 111.8 GiB): request=2 time=841.5 us
|
||||
4 KiB <<< /dev/sda1 (block device 111.8 GiB): request=3 time=831.0 us
|
||||
4 KiB <<< /dev/sda1 (block device 111.8 GiB): request=4 time=1.17 ms
|
||||
^C
|
||||
--- /dev/sda1 (block device 111.8 GiB) ioping statistics ---
|
||||
3 requests completed in 2.84 ms, 12 KiB read, 1.05 k iops, 4.12 MiB/s
|
||||
generated 4 requests in 3.37 s, 16 KiB, 1 iops, 4.75 KiB/s
|
||||
min/avg/max/mdev = 831.0 us / 947.9 us / 1.17 ms / 158.0 us
|
||||
```
|
||||
|
||||
### atop
|
||||
|
||||
`atop` 命令,像 `top` 一样提供了大量有关系统性能的信息,包括有关磁盘活动的一些统计信息。
|
||||
|
||||
```
|
||||
ATOP - butterfly 2018/12/26 17:24:19 37d3h13m------ 10ed
|
||||
PRC | sys 0.03s | user 0.01s | #proc 179 | #zombie 0 | #exit 6 |
|
||||
CPU | sys 1% | user 0% | irq 0% | idle 199% | wait 0% |
|
||||
cpu | sys 1% | user 0% | irq 0% | idle 99% | cpu000 w 0% |
|
||||
CPL | avg1 0.00 | avg5 0.00 | avg15 0.00 | csw 677 | intr 470 |
|
||||
MEM | tot 5.8G | free 223.4M | cache 4.6G | buff 253.2M | slab 394.4M |
|
||||
SWP | tot 2.0G | free 2.0G | | vmcom 1.9G | vmlim 4.9G |
|
||||
DSK | sda | busy 0% | read 0 | write 7 | avio 1.14 ms |
|
||||
NET | transport | tcpi 4 | tcpo stall 8 | udpi 1 | udpo 0swout 2255 |
|
||||
NET | network | ipi 10 | ipo 7 | ipfrw 0 | deliv 60.67 ms |
|
||||
NET | enp0s25 0% | pcki 10 | pcko 8 | si 1 Kbps | so 3 Kbp0.73 ms |
|
||||
|
||||
PID SYSCPU USRCPU VGROW RGROW ST EXC THR S CPUNR CPU CMD 1/1673e4 |
|
||||
3357 0.01s 0.00s 672K 824K -- - 1 R 0 0% atop
|
||||
3359 0.01s 0.00s 0K 0K NE 0 0 E - 0% <ps>
|
||||
3361 0.00s 0.01s 0K 0K NE 0 0 E - 0% <ps>
|
||||
3363 0.01s 0.00s 0K 0K NE 0 0 E - 0% <ps>
|
||||
31357 0.00s 0.00s 0K 0K -- - 1 S 1 0% bash
|
||||
3364 0.00s 0.00s 8032K 756K N- - 1 S 1 0% sleep
|
||||
2931 0.00s 0.00s 0K 0K -- - 1 I 1 0% kworker/u8:2-e
|
||||
3356 0.00s 0.00s 0K 0K -E 0 0 E - 0% <sleep>
|
||||
3360 0.00s 0.00s 0K 0K NE 0 0 E - 0% <sleep>
|
||||
3362 0.00s 0.00s 0K 0K NE 0 0 E - 0% <sleep>
|
||||
```
|
||||
|
||||
如果你*只*想查看磁盘统计信息,则可以使用以下命令轻松进行管理:
|
||||
|
||||
```
|
||||
$ atop | grep DSK
|
||||
DSK | sda | busy 0% | read 122901 | write 3318e3 | avio 0.67 ms |
|
||||
DSK | sdb | busy 0% | read 1168 | write 103 | avio 0.73 ms |
|
||||
DSK | sda | busy 2% | read 0 | write 92 | avio 2.39 ms |
|
||||
DSK | sda | busy 2% | read 0 | write 94 | avio 2.47 ms |
|
||||
DSK | sda | busy 2% | read 0 | write 99 | avio 2.26 ms |
|
||||
DSK | sda | busy 2% | read 0 | write 94 | avio 2.43 ms |
|
||||
DSK | sda | busy 2% | read 0 | write 94 | avio 2.43 ms |
|
||||
DSK | sda | busy 2% | read 0 | write 92 | avio 2.43 ms |
|
||||
^C
|
||||
```
|
||||
|
||||
### 了解磁盘 I/O
|
||||
|
||||
Linux 提供了足够的命令,可以让你很好地了解磁盘的工作强度,并帮助你关注潜在的问题或减缓。希望这些命令中的一个可以告诉你何时需要质疑磁盘性能。偶尔使用这些命令将有助于确保当你需要检查磁盘,特别是忙碌或缓慢的磁盘时可以显而易见地发现它们。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3330497/linux/linux-commands-for-measuring-disk-activity.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[laingke](https://github.com/laingke)
|
||||
校对:[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://www.networkworld.com/article/3291616/linux/examining-linux-system-performance-with-dstat.html
|
||||
[2]: https://www.facebook.com/NetworkWorld/
|
||||
[3]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,227 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (laingke)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11373-1.html)
|
||||
[#]: subject: (Create an online store with this Java-based framework)
|
||||
[#]: via: (https://opensource.com/article/19/1/scipio-erp)
|
||||
[#]: author: (Paul Piper https://opensource.com/users/madppiper)
|
||||
|
||||
使用 Java 框架 Scipio ERP 创建一个在线商店
|
||||
======
|
||||
|
||||
> Scipio ERP 具有包罗万象的应用程序和功能。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/22/133258hqvwax5w1zvq5ffa.jpg)
|
||||
|
||||
如果,你想在网上销售产品或服务,但要么找不到合适的软件,要么觉得定制成本太高?那么,[Scipio ERP][1] 也许正是你想要的。
|
||||
|
||||
Scipio ERP 是一个基于 Java 的开源的电子商务框架,具有包罗万象的应用程序和功能。这个项目于 2014 年从 [Apache OFBiz][2] 分叉而来,侧重于更好的定制和更现代的吸引力。这个电子商务组件非常丰富,可以在多商店环境中工作,同时支持国际化,具有琳琅满目的产品配置,而且它还兼容现代 HTML 框架。该软件还为许多其他业务场景提供标准应用程序,例如会计、仓库管理或销售团队自动化。它都是高度标准化的,因此易于定制,如果你想要的不仅仅是一个虚拟购物车,这是非常棒的。
|
||||
|
||||
该系统也使得跟上现代 Web 标准变得非常容易。所有界面都是使用系统的“[模板工具包][3]”构建的,这是一个易于学习的宏集,可以将 HTML 与所有应用程序分开。正因为如此,每个应用程序都已经标准化到核心。听起来令人困惑?它真的不是 HTML——它看起来很像 HTML,但你写的内容少了很多。
|
||||
|
||||
### 初始安装
|
||||
|
||||
在你开始之前,请确保你已经安装了 Java 1.8(或更高版本)的 SDK 以及一个 Git 客户端。完成了?太棒了!接下来,切换到 Github 上的主分支:
|
||||
|
||||
```
|
||||
git clone https://github.com/ilscipio/scipio-erp.git
|
||||
cd scipio-erp
|
||||
git checkout master
|
||||
```
|
||||
|
||||
要安装该系统,只需要运行 `./install.sh` 并从命令行中选择任一选项。在开发过程中,最好一直使用 “installation for development”(选项 1),它还将安装一系列演示数据。对于专业安装,你可以修改初始配置数据(“种子数据”),以便自动为你设置公司和目录数据。默认情况下,系统将使用内部数据库运行,但是它[也可以配置][4]使用各种关系数据库,比如 PostgreSQL 和 MariaDB 等。
|
||||
|
||||
![安装向导][6]
|
||||
|
||||
*按照安装向导完成初始配置*
|
||||
|
||||
通过命令 `./start.sh` 启动系统然后打开链接 <https://localhost:8443/setup/> 完成配置。如果你安装了演示数据, 你可以使用用户名 `admin` 和密码 `scipio` 进行登录。在安装向导中,你可以设置公司简介、会计、仓库、产品目录、在线商店和额外的用户配置信息。暂时在产品商店配置界面上跳过网站实体的配置。系统允许你使用不同的底层代码运行多个在线商店;除非你想这样做,一直选择默认值是最简单的。
|
||||
|
||||
祝贺你,你刚刚安装了 Scipio ERP!在界面上操作一两分钟,感受一下它的功能。
|
||||
|
||||
### 捷径
|
||||
|
||||
在你进入自定义之前,这里有一些方便的命令可以帮助你:
|
||||
|
||||
* 创建一个 shop-override:`./ant create-component-shop-override`
|
||||
* 创建一个新组件:`./ant create-component`
|
||||
* 创建一个新主题组件:`./ant create-theme`
|
||||
* 创建管理员用户:`./ant create-admin-user-login`
|
||||
* 各种其他实用功能:`./ant -p`
|
||||
* 用于安装和更新插件的实用程序:`./git-addons help`
|
||||
|
||||
另外,请记下以下位置:
|
||||
|
||||
* 将 Scipio 作为服务运行的脚本:`/tools/scripts/`
|
||||
* 日志输出目录:`/runtime/logs`
|
||||
* 管理应用程序:`<https://localhost:8443/admin/>`
|
||||
* 电子商务应用程序:`<https://localhost:8443/shop/>`
|
||||
|
||||
最后,Scipio ERP 在以下五个主要目录中构建了所有代码:
|
||||
|
||||
* `framework`: 框架相关的源,应用程序服务器,通用界面和配置
|
||||
* `applications`: 核心应用程序
|
||||
* `addons`: 第三方扩展
|
||||
* `themes`: 修改界面外观
|
||||
* `hot-deploy`: 你自己的组件
|
||||
|
||||
除了一些配置,你将在 `hot-deploy` 和 `themes` 目录中进行开发。
|
||||
|
||||
### 在线商店定制
|
||||
|
||||
要真正使系统成为你自己的系统,请开始考虑使用[组件][7]。组件是一种模块化方法,可以覆盖、扩展和添加到系统中。你可以将组件视为独立 Web 模块,可以捕获有关数据库([实体][8])、功能([服务][9])、界面([视图][10])、[事件和操作][11]和 Web 应用程序等的信息。由于组件功能,你可以添加自己的代码,同时保持与原始源兼容。
|
||||
|
||||
运行命令 `./ant create-component-shop-override` 并按照步骤创建你的在线商店组件。该操作将会在 `hot-deploy` 目录内创建一个新目录,该目录将扩展并覆盖原始的电子商务应用程序。
|
||||
|
||||
![组件目录结构][13]
|
||||
|
||||
*一个典型的组件目录结构。*
|
||||
|
||||
你的组件将具有以下目录结构:
|
||||
|
||||
* `config`: 配置
|
||||
* `data`: 种子数据
|
||||
* `entitydef`: 数据库表定义
|
||||
* `script`: Groovy 脚本的位置
|
||||
* `servicedef`: 服务定义
|
||||
* `src`: Java 类
|
||||
* `webapp`: 你的 web 应用程序
|
||||
* `widget`: 界面定义
|
||||
|
||||
此外,`ivy.xml` 文件允许你将 Maven 库添加到构建过程中,`ofbiz-component.xml` 文件定义整个组件和 Web 应用程序结构。除了一些在当前目录所能够看到的,你还可以在 Web 应用程序的 `WEB-INF` 目录中找到 `controller.xml` 文件。这允许你定义请求实体并将它们连接到事件和界面。仅对于界面来说,你还可以使用内置的 CMS 功能,但优先要坚持使用核心机制。在引入更改之前,请熟悉 `/applications/shop/`。
|
||||
|
||||
#### 添加自定义界面
|
||||
|
||||
还记得[模板工具包][3]吗?你会发现它在每个界面都有使用到。你可以将其视为一组易于学习的宏,它用来构建所有内容。下面是一个例子:
|
||||
|
||||
```
|
||||
<@section title="Title">
|
||||
<@heading id="slider">Slider</@heading>
|
||||
<@row>
|
||||
<@cell columns=6>
|
||||
<@slider id="" class="" controls=true indicator=true>
|
||||
<@slide link="#" image="https://placehold.it/800x300">Just some content…</@slide>
|
||||
<@slide title="This is a title" link="#" image="https://placehold.it/800x300"></@slide>
|
||||
</@slider>
|
||||
</@cell>
|
||||
<@cell columns=6>Second column</@cell>
|
||||
</@row>
|
||||
</@section>
|
||||
```
|
||||
|
||||
不是很难,对吧?同时,主题包含 HTML 定义和样式。这将权力交给你的前端开发人员,他们可以定义每个宏的输出,并坚持使用自己的构建工具进行开发。
|
||||
|
||||
我们快点试试吧。首先,在你自己的在线商店上定义一个请求。你将修改此代码。一个内置的 CMS 系统也可以通过 <https://localhost:8443/cms/> 进行访问,它允许你以更有效的方式创建新模板和界面。它与模板工具包完全兼容,并附带可根据你的喜好采用的示例模板。但是既然我们试图在这里理解系统,那么首先让我们采用更复杂的方法。
|
||||
|
||||
打开你商店 `webapp` 目录中的 [controller.xml][14] 文件。控制器会跟踪请求事件并相应地执行操作。下面的操作将会在 `/shop/test` 下创建一个新的请求:
|
||||
|
||||
```
|
||||
<!-- Request Mappings -->
|
||||
<request-map uri="test">
|
||||
<security https="true" auth="false"/>
|
||||
<response name="success" type="view" value="test"/>
|
||||
</request-map>
|
||||
```
|
||||
|
||||
你可以定义多个响应,如果需要,可以在请求中使用事件或服务调用来确定你可能要使用的响应。我选择了“视图”类型的响应。视图是渲染的响应;其他类型是请求重定向、转发等。系统附带各种渲染器,可让你稍后确定输出;为此,请添加以下内容:
|
||||
|
||||
```
|
||||
<!-- View Mappings -->
|
||||
<view-map name="test" type="screen" page="component://mycomponent/widget/CommonScreens.xml#test"/>
|
||||
```
|
||||
|
||||
用你自己的组件名称替换 `my-component`。然后,你可以通过在 `widget/CommonScreens.xml` 文件的标签内添加以下内容来定义你的第一个界面:
|
||||
|
||||
```
|
||||
<screen name="test">
|
||||
<section>
|
||||
<actions>
|
||||
</actions>
|
||||
<widgets>
|
||||
<decorator-screen name="CommonShopAppDecorator" location="component://shop/widget/CommonScreens.xml">
|
||||
<decorator-section name="body">
|
||||
<platform-specific><html><html-template location="component://mycomponent/webapp/mycomponent/test/test.ftl"/></html></platform-specific>
|
||||
</decorator-section>
|
||||
</decorator-screen>
|
||||
</widgets>
|
||||
</section>
|
||||
</screen>
|
||||
```
|
||||
|
||||
商店界面实际上非常模块化,由多个元素组成([小部件、动作和装饰器][15])。为简单起见,请暂时保留原样,并通过添加第一个模板工具包文件来完成新网页。为此,创建一个新的 `webapp/mycomponent/test/test.ftl` 文件并添加以下内容:
|
||||
|
||||
```
|
||||
<@alert type="info">Success!</@alert>
|
||||
```
|
||||
|
||||
![自定义的界面][17]
|
||||
|
||||
*一个自定义的界面。*
|
||||
|
||||
打开 <https://localhost:8443/shop/control/test/> 并惊叹于你自己的成就。
|
||||
|
||||
#### 自定义主题
|
||||
|
||||
通过创建自己的主题来修改商店的界面外观。所有主题都可以作为组件在 `themes` 文件夹中找到。运行命令 `./ant create-theme` 来创建你自己的主题。
|
||||
|
||||
![主题组件布局][19]
|
||||
|
||||
*一个典型的主题组件布局。*
|
||||
|
||||
以下是最重要的目录和文件列表:
|
||||
|
||||
* 主题配置:`data/*ThemeData.xml`
|
||||
* 特定主题封装的 HTML:`includes/*.ftl`
|
||||
* 模板工具包 HTML 定义:`includes/themeTemplate.ftl`
|
||||
* CSS 类定义:`includes/themeStyles.ftl`
|
||||
* CSS 框架: `webapp/theme-title/`
|
||||
|
||||
快速浏览工具包中的 Metro 主题;它使用 Foundation CSS 框架并且充分利用了这个框架。然后,然后,在新构建的 `webapp/theme-title` 目录中设置自己的主题并开始开发。Foundation-shop 主题是一个非常简单的特定于商店的主题实现,你可以将其用作你自己工作的基础。
|
||||
|
||||
瞧!你已经建立了自己的在线商店,准备个性化定制吧!
|
||||
|
||||
![搭建完成的 Scipio ERP 在线商店][21]
|
||||
|
||||
*一个搭建完成的基于 Scipio ERP的在线商店。*
|
||||
|
||||
### 接下来是什么?
|
||||
|
||||
Scipio ERP 是一个功能强大的框架,可简化复杂的电子商务应用程序的开发。为了更完整的理解,请查看项目[文档][7],尝试[在线演示][22],或者[加入社区][23].
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/1/scipio-erp
|
||||
|
||||
作者:[Paul Piper][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[laingke](https://github.com/laingke)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/madppiper
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.scipioerp.com
|
||||
[2]: https://ofbiz.apache.org/
|
||||
[3]: https://www.scipioerp.com/community/developer/freemarker-macros/
|
||||
[4]: https://www.scipioerp.com/community/developer/installation-configuration/configuration/#database-configuration
|
||||
[5]: /file/419711
|
||||
[6]: https://opensource.com/sites/default/files/uploads/setup_step5_sm.jpg (Setup wizard)
|
||||
[7]: https://www.scipioerp.com/community/developer/architecture/components/
|
||||
[8]: https://www.scipioerp.com/community/developer/entities/
|
||||
[9]: https://www.scipioerp.com/community/developer/services/
|
||||
[10]: https://www.scipioerp.com/community/developer/views-requests/
|
||||
[11]: https://www.scipioerp.com/community/developer/events-actions/
|
||||
[12]: /file/419716
|
||||
[13]: https://opensource.com/sites/default/files/uploads/component_structure.jpg (component directory structure)
|
||||
[14]: https://www.scipioerp.com/community/developer/views-requests/request-controller/
|
||||
[15]: https://www.scipioerp.com/community/developer/views-requests/screen-widgets-decorators/
|
||||
[16]: /file/419721
|
||||
[17]: https://opensource.com/sites/default/files/uploads/success_screen_sm.jpg (Custom screen)
|
||||
[18]: /file/419726
|
||||
[19]: https://opensource.com/sites/default/files/uploads/theme_structure.jpg (theme component layout)
|
||||
[20]: /file/419731
|
||||
[21]: https://opensource.com/sites/default/files/uploads/finished_shop_1_sm.jpg (Finished Scipio ERP shop)
|
||||
[22]: https://www.scipioerp.com/demo/
|
||||
[23]: https://forum.scipioerp.com/
|
144
published/201909/20190403 Use Git as the backend for chat.md
Normal file
144
published/201909/20190403 Use Git as the backend for chat.md
Normal file
@ -0,0 +1,144 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11342-1.html)
|
||||
[#]: subject: (Use Git as the backend for chat)
|
||||
[#]: via: (https://opensource.com/article/19/4/git-based-chat)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
用 Git 作为聊天应用的后端
|
||||
======
|
||||
|
||||
> GIC 是一个聊天应用程序的原型,展示了一种使用 Git 的新方法。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/15/100905euzi3l5xgslsgx7i.png)
|
||||
|
||||
[Git][2] 是一个少有的能将如此多的现代计算封装到一个程序之中的应用程序,它可以用作许多其他应用程序的计算引擎。虽然它以跟踪软件开发中的源代码更改而闻名,但它还有许多其他用途,可以让你的生活更轻松、更有条理。在这个 Git 系列中,我们将分享七种鲜为人知的使用 Git 的方法。
|
||||
|
||||
今天我们来看看 GIC,它是一个基于 Git 的聊天应用。
|
||||
|
||||
### 初识 GIC
|
||||
|
||||
虽然 Git 的作者们可能期望会为 Git 创建前端,但毫无疑问他们从未预料到 Git 会成为某种后端,如聊天客户端的后端。然而,这正是开发人员 Ephi Gabay 用他的实验性的概念验证应用 [GIC][3] 所做的事情:用 [Node.js][4] 编写的聊天客户端,使用 Git 作为其后端数据库。
|
||||
|
||||
GIC 并没有打算用于生产用途。这纯粹是一种编程练习,但它证明了开源技术的灵活性。令人惊讶的是,除了 Node 库和 Git 本身,该客户端只包含 300 行代码。这是这个聊天客户端和开源所反映出来的最好的地方之一:建立在现有工作基础上的能力。眼见为实,你应该自己亲自来了解一下 GIC。
|
||||
|
||||
### 架设起来
|
||||
|
||||
GIC 使用 Git 作为引擎,因此你需要一个空的 Git 存储库为聊天室和记录器提供服务。存储库可以托管在任何地方,只要你和需要访问聊天服务的人可以访问该存储库就行。例如,你可以在 GitLab 等免费 Git 托管服务上设置 Git 存储库,并授予聊天用户对该 Git 存储库的贡献者访问权限。(他们必须能够提交到存储库,因为每个聊天消息都是一个文本的提交。)
|
||||
|
||||
如果你自己托管,请创建一个中心化的裸存储库。聊天中的每个用户必须在裸存储库所在的服务器上拥有一个帐户。你可以使用如 [Gitolite][5] 或 [Gitea][6] 这样的 Git 托管软件创建特定于 Git 的帐户,或者你可以在服务器上为他们提供个人用户帐户,可以使用 `git-shell` 来限制他们只能访问 Git。
|
||||
|
||||
自托管实例的性能最好。无论你是自己托管还是使用托管服务,你创建的 Git 存储库都必须具有一个活跃分支,否则 GIC 将无法在用户聊天时进行提交,因为没有 Git HEAD。确保分支初始化和活跃的最简单方法是在创建存储库时提交 `README` 或许可证文件。如果你没有这样做,你可以在事后创建并提交一个:
|
||||
|
||||
```
|
||||
$ echo "chat logs" > README
|
||||
$ git add README
|
||||
$ git commit -m 'just creating a HEAD ref'
|
||||
$ git push -u origin HEAD
|
||||
```
|
||||
|
||||
### 安装 GIC
|
||||
|
||||
由于 GIC 基于 Git 并使用 Node.js 编写,因此必须首先安装 Git、Node.js 和 Node 包管理器npm(它应该与 Node 捆绑在一起)。安装它们的命令因 Linux 或 BSD 发行版而异,这是 Fedora 上的一个示例命令:
|
||||
|
||||
```
|
||||
$ sudo dnf install git nodejs
|
||||
```
|
||||
|
||||
如果你没有运行 Linux 或 BSD,请按照 [git-scm.com][7] 和 [nodejs.org][8] 上的安装说明进行操作。
|
||||
|
||||
因此,GIC 没有安装过程。每个用户(在此示例中为 Alice 和 Bob)必须将存储库克隆到其硬盘驱动器:
|
||||
|
||||
```
|
||||
$ git clone https://github.com/ephigabay/GIC GIC
|
||||
```
|
||||
|
||||
将目录更改为 GIC 目录并使用 `npm` 安装 Node.js 依赖项:
|
||||
|
||||
```
|
||||
$ cd GIC
|
||||
$ npm install
|
||||
```
|
||||
|
||||
等待 Node 模块下载并安装。
|
||||
|
||||
### 配置 GIC
|
||||
|
||||
GIC 唯一需要的配置是 Git 聊天存储库的位置。编辑 `config.js` 文件:
|
||||
|
||||
```
|
||||
module.exports = {
|
||||
gitRepo: 'seth@example.com:/home/gitchat/chatdemo.git',
|
||||
messageCheckInterval: 500,
|
||||
branchesCheckInterval: 5000
|
||||
};
|
||||
```
|
||||
|
||||
在尝试 GIC 之前测试你与 Git 存储库的连接,以确保你的配置是正确的:
|
||||
|
||||
```
|
||||
$ git clone --quiet seth@example.com:/home/gitchat/chatdemo.git > /dev/null
|
||||
```
|
||||
|
||||
假设你没有收到任何错误,就可以开始聊天了。
|
||||
|
||||
### 用 Git 聊天
|
||||
|
||||
在 GIC 目录中启动聊天客户端:
|
||||
|
||||
```
|
||||
$ npm start
|
||||
```
|
||||
|
||||
客户端首次启动时,必须克隆聊天存储库。由于它几乎是一个空的存储库,因此不会花费很长时间。输入你的消息,然后按回车键发送消息。
|
||||
|
||||
![GIC][10]
|
||||
|
||||
*基于 Git 的聊天客户端。 他们接下来会怎么想?*
|
||||
|
||||
正如问候消息所说,Git 中的分支在 GIC 中就是聊天室或频道。无法在 GIC 的 UI 中创建新分支,但如果你在另一个终端会话或 Web UI 中创建一个分支,它将立即显示在 GIC 中。将一些 IRC 式的命令加到 GIC 中并不需要太多工作。
|
||||
|
||||
聊了一会儿之后,可以看看你的 Git 存储库。由于聊天发生在 Git 中,因此存储库本身也是聊天日志:
|
||||
|
||||
```
|
||||
$ git log --pretty=format:"%p %cn %s"
|
||||
4387984 Seth Kenlon Hey Chani, did you submit a talk for All Things Open this year?
|
||||
36369bb Chani No I didn't get a chance. Did you?
|
||||
[...]
|
||||
```
|
||||
|
||||
### 退出 GIC
|
||||
|
||||
Vim 以来,还没有一个应用程序像 GIC 那么难以退出。你看,没有办法停止 GIC。它会一直运行,直到它被杀死。当你准备停止 GIC 时,打开另一个终端选项卡或窗口并发出以下命令:
|
||||
|
||||
```
|
||||
$ kill `pgrep npm`
|
||||
```
|
||||
|
||||
GIC 是一个新奇的事物。这是一个很好的例子,说明开源生态系统如何鼓励和促进创造力和探索,并挑战我们从不同角度审视应用程序。尝试下 GIC,也许它会给你一些思路。至少,它可以让你与 Git 度过一个下午。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/git-based-chat
|
||||
|
||||
作者:[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
|
||||
[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://git-scm.com/
|
||||
[3]: https://github.com/ephigabay/GIC
|
||||
[4]: https://nodejs.org/en/
|
||||
[5]: http://gitolite.com
|
||||
[6]: http://gitea.io
|
||||
[7]: http://git-scm.com
|
||||
[8]: http://nodejs.org
|
||||
[9]: mailto:seth@example.com
|
||||
[10]: https://opensource.com/sites/default/files/uploads/gic.jpg (GIC)
|
@ -1,18 +1,20 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (MjSeven)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11344-1.html)
|
||||
[#]: subject: (Working with variables on Linux)
|
||||
[#]: via: (https://www.networkworld.com/article/3387154/working-with-variables-on-linux.html#tk.rss_all)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
在 Linux 中使用变量
|
||||
======
|
||||
变量通常看起来像 $var,但它们也有 $1、$*、$? 和 $$ 这种形式。让我们来看看所有这些 $ 值可以告诉你什么。
|
||||
![Mike Lawrence \(CC BY 2.0\)][1]
|
||||
|
||||
我们称为“变量”的许多重要的值都存储在 Linux 系统中,但实际上有几种类型的变量和一些有趣的命令可以帮助你使用它们。在上一篇文章中,我们研究了[环境变量][2]以及它们在哪定义。在本文中,我们来看一看在命令行和脚本中使用的变量。
|
||||
> 变量通常看起来像 `$var` 这样,但它们也有 `$1`、`$*`、`$?` 和 `$$` 这种形式。让我们来看看所有这些 `$` 值可以告诉你什么。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/15/105140faf2jzyybubu1d0c.jpg)
|
||||
|
||||
有许多重要的值都存储在 Linux 系统中,我们称为“变量”,但实际上变量有几种类型,并且一些有趣的命令可以帮助你使用它们。在上一篇文章中,我们研究了[环境变量][2]以及它们定义在何处。在本文中,我们来看一看在命令行和脚本中使用的变量。
|
||||
|
||||
### 用户变量
|
||||
|
||||
@ -70,9 +72,9 @@ $ echo $myvar0
|
||||
11
|
||||
```
|
||||
|
||||
通过这些选项,你可能会发现至少有一个是容易记忆且使用方便的。
|
||||
通过这些选项,你可能会发现它们是容易记忆、使用方便的。
|
||||
|
||||
你也可以 _删除_ 一个变量 -- 这意味着没有定义它。
|
||||
你也可以*删除*一个变量 -- 这意味着没有定义它。
|
||||
|
||||
```
|
||||
$ unset myvar
|
||||
@ -91,25 +93,25 @@ $ unset myvar3
|
||||
-bash: unset: myvar3: cannot unset: readonly variable
|
||||
```
|
||||
|
||||
你可以使用这些设置和递增选项中的任何一个来赋值和操作脚本中的变量,但也有一些非常有用的 _内部变量_ 用于在脚本中工作。注意,你无法重新赋值或增加它们的值。
|
||||
你可以使用这些设置和递增选项中来赋值和操作脚本中的变量,但也有一些非常有用的*内部变量*可以用于在脚本中。注意,你无法重新赋值或增加它们的值。
|
||||
|
||||
### 内部变量
|
||||
|
||||
在脚本中可以使用很多变量来计算参数并显示有关脚本本身的信息。
|
||||
|
||||
* $1、$2、$3 等表示脚本的第一个、第二个、第三个等参数。
|
||||
* $# 表示参数的数量。
|
||||
* $* 表示所有参数。
|
||||
* $0 表示脚本的名称。
|
||||
* $? 表示先前运行的命令的返回码(0 代表成功)。
|
||||
* $$ 显示脚本的进程 ID。
|
||||
* $PPID 显示 shell 的进程 ID(脚本的父进程)。
|
||||
* `$1`、`$2`、`$3` 等表示脚本的第一个、第二个、第三个等参数。
|
||||
* `$#` 表示参数的数量。
|
||||
* `$*` 表示所有参数。
|
||||
* `$0` 表示脚本的名称。
|
||||
* `$?` 表示先前运行的命令的返回码(0 代表成功)。
|
||||
* `$$` 显示脚本的进程 ID。
|
||||
* `$PPID` 显示 shell 的进程 ID(脚本的父进程)。
|
||||
|
||||
其中一些变量也适用于命令行,但显示相关信息:
|
||||
|
||||
* $0 显示你正在使用的 shell 的名称(例如,-bash)。
|
||||
* $$ 显示 shell 的进程 ID。
|
||||
* $PPID 显示 shell 的父进程的进程 ID(对我来说,是 sshd)。
|
||||
* `$0` 显示你正在使用的 shell 的名称(例如,-bash)。
|
||||
* `$$` 显示 shell 的进程 ID。
|
||||
* `$PPID` 显示 shell 的父进程的进程 ID(对我来说,是 sshd)。
|
||||
|
||||
为了查看它们的结果,如果我们将所有这些变量都放入一个脚本中,比如:
|
||||
|
||||
@ -127,26 +129,27 @@ echo $PPID
|
||||
```
|
||||
|
||||
当我们调用这个脚本时,我们会看到如下内容:
|
||||
|
||||
```
|
||||
$ tryme one two three
|
||||
/home/shs/bin/tryme <== 脚本名称
|
||||
one <== 第一个参数
|
||||
two <== 第二个参数
|
||||
3 <== 参数的个数
|
||||
one <== 第一个参数
|
||||
two <== 第二个参数
|
||||
3 <== 参数的个数
|
||||
one two three <== 所有的参数
|
||||
0 <== 上一条 echo 命令的返回码
|
||||
10410 <== 脚本的进程 ID
|
||||
10109 <== 父进程 ID
|
||||
0 <== 上一条 echo 命令的返回码
|
||||
10410 <== 脚本的进程 ID
|
||||
10109 <== 父进程 ID
|
||||
```
|
||||
|
||||
如果我们在脚本运行完毕后检查 shell 的进程 ID,我们可以看到它与脚本中显示的 PPID 相匹配:
|
||||
|
||||
```
|
||||
$ echo $$
|
||||
10109 <== shell 的进程 ID
|
||||
10109 <== shell 的进程 ID
|
||||
```
|
||||
|
||||
当然,比起简单地显示它们的值,我们更多的是在需要它们的时候来使用它们。我们来看一看它们可能的用处。
|
||||
当然,比起简单地显示它们的值,更有用的方式是使用它们。我们来看一看它们可能的用处。
|
||||
|
||||
检查是否已提供参数:
|
||||
|
||||
@ -209,7 +212,7 @@ fi
|
||||
|
||||
### 重命名变量
|
||||
|
||||
在编写复杂的脚本时,为脚本的参数指定名称通常很有用,而不是继续将它们称为 $1, $2 等。等到第 35 行,阅读你脚本的人可能已经忘了 $2 表示什么。如果你将一个重要参数的值赋给 $filename 或 $numlines,那么他就不容易忘记。
|
||||
在编写复杂的脚本时,为脚本的参数指定名称通常很有用,而不是继续将它们称为 `$1`、`$2` 等。等到第 35 行,阅读你脚本的人可能已经忘了 `$2` 表示什么。如果你将一个重要参数的值赋给 `$filename` 或 `$numlines`,那么他就不容易忘记。
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
@ -236,27 +239,23 @@ else
|
||||
fi
|
||||
```
|
||||
|
||||
当然,这个示例脚本只是运行 head 命令来显示文件中的前 x 行,但它的目的是显示如何在脚本中使用内部参数来帮助确保脚本运行良好,或在失败时清晰地知道失败原因。
|
||||
|
||||
**观看 Sandra Henry-Stocker 的两分钟 Linux 技巧:[学习如何掌握大量 Linux 命令][3]。**
|
||||
|
||||
加入 [Facebook][4] 和 [Linkedln][5] 上的网络社区,评论最热的主题。
|
||||
当然,这个示例脚本只是运行 `head` 命令来显示文件中的前 x 行,但它的目的是显示如何在脚本中使用内部参数来帮助确保脚本运行良好,或在失败时清晰地知道失败原因。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3387154/working-with-variables-on-linux.html#tk.rss_all
|
||||
via: https://www.networkworld.com/article/3387154/working-with-variables-on-linux.html
|
||||
|
||||
作者:[Sandra Henry-Stocker][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[MjSeven](https://github.com/MjSeven)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[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/variable-key-keyboard-100793080-large.jpg
|
||||
[2]: https://www.networkworld.com/article/3385516/how-to-manage-your-linux-environment.html
|
||||
[2]: https://linux.cn/article-10916-1.html
|
||||
[3]: https://www.youtube.com/playlist?list=PL7D2RMSmRO9J8OTpjFECi8DJiTQdd4hua
|
||||
[4]: https://www.facebook.com/NetworkWorld/
|
||||
[5]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,77 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11404-1.html)
|
||||
[#]: subject: (Blockchain 2.0 – What Is Ethereum [Part 9])
|
||||
[#]: via: (https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/)
|
||||
[#]: author: (editor https://www.ostechnix.com/author/editor/)
|
||||
|
||||
区块链 2.0 :以太坊(九)
|
||||
======
|
||||
|
||||
![Ethereum][1]
|
||||
|
||||
在本系列的上一指南中,我们讨论了 [Hyperledger 项目(HLP)][2],这是一个由 Linux 基金会开发的增长最快的产品。在本指南中,我们将详细讨论什么是“<ruby>以太坊<rt>Ethereum</rt></ruby>”及其功能。许多研究人员认为,互联网的未来将基于<ruby>去中心化计算<rt>decentralized computing</rt></ruby>的原理。实际上,去中心化计算是互联网放在首位的更广泛目标之一。但是,由于可用的计算能力不同,互联网发生了转折。尽管现代服务器功能使得服务器端处理和执行成为可能,但在世界上大部分地区缺乏像样的移动网络使得客户端也是如此。现在,现代智能手机具有 SoC(片上系统),在客户端本身上也能够处理许多此类操作,但是,由于安全地检索和存储数据而受到的限制仍然迫使开发人员需要在服务器端进行计算和数据管理。因此,当前可以观察到数据传输能力方面存在瓶颈。
|
||||
|
||||
由于分布式数据存储和程序执行平台的进步,所有这些可能很快就会改变。[区块链][3]允许在分布式用户网络(而不是中央服务器)上进行安全的数据管理和程序执行,这在互联网历史上基本上是第一次。
|
||||
|
||||
以太坊就是一个这样的区块链平台,使开发人员可以访问用于在这样的去中心化网络上构建和运行应用程序的框架和工具。尽管它以其加密货币而广为人知,以太坊不只是<ruby>以太币<rt>ether</rt></ruby>(加密货币)。这是一种完整的<ruby>图灵完备<rt>Turing complete</rt></ruby>编程语言,旨在开发和部署 DApp(即<ruby>分布式应用<rt>Distributed APPlication</rt></ruby>) [^1]。我们会在接下来的一篇文章中详细介绍 DApp。
|
||||
|
||||
以太坊是开源的,默认情况下是一个公共(非许可)区块链,并具有一个大范围的智能合约平台底层(Solidity)。以太坊提供了一个称为“<ruby>以太坊虚拟机<rt>Ethereum virtual machine</rt></ruby>(EVM)”的虚拟计算环境,以运行应用程序和[智能合约][4] [^2]。以太坊虚拟机运行在世界各地的成千上万个参与节点上,这意味着应用程序数据在保证安全的同时,几乎不可能被篡改或丢失。
|
||||
|
||||
### 以太坊的背后:什么使之不同
|
||||
|
||||
在 2017 年,为了推广对以太坊区块链的功能的利用,技术和金融领域的 30 多个团队汇聚一堂。因此,“<ruby>以太坊企业联盟<rt>Ethereum Enterprise Alliance</rt></ruby>”(EEA)由众多支持成员组成,包括微软、摩根大通、思科、德勤和埃森哲。摩根大通已经拥有 Quorum,这是一个基于以太坊的去中心化金融服务计算平台,目前已经投入运行;而微软拥有基于以太坊的云服务,通过其 Azure 云业务销售 [^3]。
|
||||
|
||||
### 什么是以太币,它和以太坊有什么关系
|
||||
|
||||
以太坊的创建者<ruby>维塔利克·布特林<rt>Vitalik Buterin</rt></ruby>深谙去中心化处理平台的真正价值以及为比特币提供动力的底层区块链技术。他提议比特币应该开发以支持运行分布式应用程序(DApp)和程序(现在称为智能合约)的想法,未能获得多数同意。
|
||||
|
||||
因此,他在 2013 年发表的白皮书中提出了以太坊的想法。原始白皮书仍然保留,[可供][5]读者阅读。其理念是开发一个基于区块链的平台来运行智能合约和应用程序,这些合约和应用程序设计为在节点和用户设备上运行,而非服务器上运行。
|
||||
|
||||
以太坊系统经常被误认为就是加密货币以太币,但是,必须重申,以太坊是一个用于开发和执行应用程序的全栈平台,自成立以来一直如此,而比特币则不是。**以太网目前是按市值计算的第二大加密货币**,在撰写本文时,其平均交易价格为每个以太币 170 美元 [^4]。
|
||||
|
||||
### 该平台的功能和技术特性 [^5]
|
||||
|
||||
* 正如我们已经提到的,称为以太币的加密货币只是该平台功能之一。该系统的目的不仅仅是处理金融交易。 实际上,以太坊平台和比特币之间的主要区别在于它们的脚本能力。以太坊是以图灵完备的编程语言开发的,这意味着它具有类似于其他主要编程语言的脚本编程和应用程序功能。开发人员需要此功能才能在平台上创建 DApp 和复杂的智能合约,而该功能是比特币缺失的。
|
||||
* 以太币的“挖矿”过程更加严格和复杂。尽管可以使用专用的 ASIC 来开采比特币,但以太坊使用的基本哈希算法(EThash)降低了 ASIC 在这方面的优势。
|
||||
* 为激励矿工和节点运营者运行网络而支付的交易费用本身是使用称为 “<ruby>燃料<rt>Gas</rt></ruby>”的计算令牌来计算的。通过要求交易的发起者支付与执行交易所需的计算资源数量成比例的以太币,燃料提高了系统的弹性以及对外部黑客和攻击的抵抗力。这与其他平台(例如比特币)相反,在该平台上,交易费用与交易规模一并衡量。因此,以太坊的平均交易成本从根本上低于比特币。这也意味着在以太坊虚拟机上运行的应用程序需要付费,具体取决于应用程序要解决的计算问题。基本上,执行越复杂,费用就越高。
|
||||
* 以太坊的出块时间估计约为 10 - 15 秒。出块时间是在区块链网络上打时间戳和创建区块所需的平均时间。与将在比特币网络上进行同样的交易要花费 10 分钟以上的时间相比,很明显,就交易和区块验证而言,以太坊要快得多。
|
||||
* *有趣的是,对可开采的以太币数量或开采速度没有硬性限制,这导致其系统设计不像比特币那么激进*。
|
||||
|
||||
### 总结
|
||||
|
||||
尽管与以太坊相比,它远远超过了类似的平台,但在以太坊企业联盟开始推动之前,该平台本身尚缺乏明确的发展道路。虽然以太坊平台确实推动了企业发展,但必须注意,以太坊还可以满足小型开发商和个人的需求。 这样一来,为最终用户和企业开发的平台就为以太坊遗漏了许多特定功能。另外,以太坊基金会提出和开发的区块链模型是一种公共模型,而 Hyperledger 项目等项目提出的模型是私有的和需要许可的。
|
||||
|
||||
虽然只有时间才能证明以太坊、Hyperledger 和 R3 Corda 等平台中,哪一个平台会在现实场景中找到最多粉丝,但此类系统确实证明了以区块链为动力的未来主张背后的有效性。
|
||||
|
||||
[^1]: [Gabriel Nicholas, “Ethereum Is Coding’s New Wild West | WIRED,” Wired , 2017][6].
|
||||
[^2]: [What is Ethereum? — Ethereum Homestead 0.1 documentation][7].
|
||||
[^3]: [Ethereum, a Virtual Currency, Enables Transactions That Rival Bitcoin’s – The New York Times][8].
|
||||
[^4]: [Cryptocurrency Market Capitalizations | CoinMarketCap][9].
|
||||
[^5]: [Introduction — Ethereum Homestead 0.1 documentation][10].
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/
|
||||
|
||||
作者:[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/Ethereum-720x340.png
|
||||
[2]: https://linux.cn/article-11275-1.html
|
||||
[3]: https://linux.cn/article-10650-1.html
|
||||
[4]: https://linux.cn/article-10956-1.html
|
||||
[5]: https://github.com/ethereum/wiki/wiki/White-Paper
|
||||
[6]: https://www.wired.com/story/ethereum-is-codings-new-wild-west/
|
||||
[7]: http://www.ethdocs.org/en/latest/introduction/what-is-ethereum.html#ethereum-virtual-machine
|
||||
[8]: https://www.nytimes.com/2016/03/28/business/dealbook/ethereum-a-virtual-currency-enables-transactions-that-rival-bitcoins.html
|
||||
[9]: https://coinmarketcap.com/
|
||||
[10]: http://www.ethdocs.org/en/latest/introduction/index.html
|
104
published/201909/20190528 A Quick Look at Elvish Shell.md
Normal file
104
published/201909/20190528 A Quick Look at Elvish Shell.md
Normal file
@ -0,0 +1,104 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11393-1.html)
|
||||
[#]: subject: (A Quick Look at Elvish Shell)
|
||||
[#]: via: (https://itsfoss.com/elvish-shell/)
|
||||
[#]: author: (John Paul https://itsfoss.com/author/john/)
|
||||
|
||||
Elvish Shell 速览
|
||||
======
|
||||
|
||||
每个来到这里的人都会对许多系统中默认 Bash shell 有所了解(无论多少)。过去这些年已经有一些新的 shell 出现来解决 Bash 中的一些缺点。Elvish 就是其中之一,我们将在今天讨论它。
|
||||
|
||||
### 什么是 Elvish Shell?
|
||||
|
||||
![Pipelines In Elvish][1]
|
||||
|
||||
[Elvish][2] 不仅仅是一个 shell。它[也是][3]“一种表达性编程语言”。它有许多有趣的特性,包括:
|
||||
|
||||
* 它是由 Go 语言编写的
|
||||
* 内置文件管理器,灵感来自 [Ranger 文件管理器][4](`Ctrl + N`)
|
||||
* 可搜索的命令历史记录(`Ctrl + R`)
|
||||
* 访问的目录的历史记录(`Ctrl + L`)
|
||||
* 支持结构化数据,例如列表、字典和函数的强大的管道
|
||||
* 包含“一组标准的控制结构:有 `if` 条件控制、`for` 和 `while` 循环,还有 `try` 的异常处理”
|
||||
* 通过包管理器支持[第三方模块扩展 Elvish][5]
|
||||
* BSD 两句版许可证
|
||||
|
||||
你肯定在喊,“为什么叫 Elvish?”。好吧,根据[他们的网站][6],他们之所以选择当前的名字,是因为:
|
||||
|
||||
> 在 Roguelike 游戏中,精灵制造的物品质量很高。它们通常被称为“精灵物品”。但是之所以选择 “elvish” 是因为它以 “sh” 结尾,这是 Unix shell 的久远传统。这个与 fish 押韵,它是影响 Elvish 哲学的 shell 之一。
|
||||
|
||||
### 如何安装 Elvish Shell
|
||||
|
||||
Elvish 在几种主流发行版中都有。
|
||||
|
||||
请注意,该软件还很年轻。最新版本是 0.12。根据该项目的 [GitHub 页面][3]:“尽管还处在 1.0 之前,但它已经适合大多数日常交互使用。”
|
||||
|
||||
![Elvish Control Structures][7]
|
||||
|
||||
#### Debian 和 Ubuntu
|
||||
|
||||
Elvish 包已引入 Debian Buster 和 Ubuntu 17.10。不幸的是,这些包已经过时,你需要使用 [PPA][8] 安装最新版本。你需要使用以下命令:
|
||||
|
||||
```
|
||||
sudo add-apt-repository ppa:zhsj/elvish
|
||||
sudo apt update
|
||||
sudo apt install elvish
|
||||
```
|
||||
|
||||
#### Fedora
|
||||
|
||||
Elvish 在 Fedora 的主仓库中没有。你需要添加 [FZUG 仓库][9]安装 Evlish。为此,你需要使用以下命令:
|
||||
|
||||
```
|
||||
sudo dnf config-manager --add-repo=http://repo.fdzh.org/FZUG/FZUG.repol
|
||||
sudo dnf install elvish
|
||||
```
|
||||
|
||||
#### Arch
|
||||
|
||||
Elvish 在 [Arch 用户仓库][10]中可用。
|
||||
|
||||
我相信你知道该[如何在 Linux 中更改 Shell][11],因此安装后可以切换到 Elvish 来使用它。
|
||||
|
||||
### 对 Elvish Shell 的想法
|
||||
|
||||
就个人而言,我没有理由在任何系统上安装 Elvish。我可以通过安装几个小的命令行程序或使用已经安装的程序来获得它的大多数功能。
|
||||
|
||||
例如,Bash 中已经存在“搜索历史命令”功能,并且效果很好。如果要提高历史命令的能力,我建议安装 [fzf][12]。`fzf` 使用模糊搜索,因此你无需记住要查找的确切命令。`fzf` 还允许你预览和打开文件。
|
||||
|
||||
我认为 Elvish 作为一种编程语言是不错的,但是我会坚持使用 Bash shell 脚本,直到 Elvish 变得更成熟。
|
||||
|
||||
你们都有用过 Elvish 么?你认为安装 Elvish 是否值得?你最喜欢的 Bash 替代品是什么?请在下面的评论中告诉我们。
|
||||
|
||||
如果你发现这篇文章有趣,请花一点时间在社交媒体、Hacker News 或 Reddit 上分享它。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/elvish-shell/
|
||||
|
||||
作者:[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://i2.wp.com/itsfoss.com/wp-content/uploads/2019/05/pipelines-in-elvish.png?fit=800%2C421&ssl=1
|
||||
[2]: https://elv.sh/
|
||||
[3]: https://github.com/elves/elvish
|
||||
[4]: https://ranger.github.io/
|
||||
[5]: https://github.com/elves/awesome-elvish
|
||||
[6]: https://elv.sh/ref/name.html
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/05/Elvish-control-structures.png?fit=800%2C425&ssl=1
|
||||
[8]: https://launchpad.net/%7Ezhsj/+archive/ubuntu/elvish
|
||||
[9]: https://github.com/FZUG/repo/wiki/Add-FZUG-Repository
|
||||
[10]: https://aur.archlinux.org/packages/elvish/
|
||||
[11]: https://linuxhandbook.com/change-shell-linux/
|
||||
[12]: https://github.com/junegunn/fzf
|
||||
[13]: http://reddit.com/r/linuxusersgroup
|
@ -0,0 +1,100 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (laingke)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11400-1.html)
|
||||
[#]: subject: (Cloud-native Java, open source security, and more industry trends)
|
||||
[#]: via: (https://opensource.com/article/19/8/cloud-native-java-and-more)
|
||||
[#]: author: (Tim Hildred https://opensource.com/users/thildred)
|
||||
|
||||
每周开源点评:云原生 Java、开源安全以及更多行业趋势
|
||||
======
|
||||
|
||||
> 开源社区和行业趋势的每周总览。
|
||||
|
||||
![Person standing in front of a giant computer screen with numbers, data][1]
|
||||
|
||||
作为我在具有开源开发模型的企业软件公司担任高级产品营销经理的角色的一部分,我为产品营销人员、经理和其他影响者定期发布有关开源社区,市场和行业趋势的定期更新。 以下是该更新中我和他们最喜欢的五篇文章。
|
||||
|
||||
### 《为什么现代 web 开发如此复杂?》
|
||||
|
||||
- [文章地址][2]
|
||||
|
||||
> 现代前端 web 开发带来了一种两极分化的体验:许多人喜欢它,而其他人则鄙视它。
|
||||
>
|
||||
> 我是现代Web开发的忠实拥护者,尽管我将其描述为“魔法”——而魔法也有其优点和缺点……。最近,我一直在向那些只具有粗略的原始 web 开发工作流程的人们讲解“现代 web 开发工作流程”……,但我发现需要解释的内容实在是太多了!甚至笼统的解释最终都会变得冗长。因此,在我努力写下更多解释的过程中,这里是对 web 开发演变的一个长期而笼统的解释的开始……
|
||||
|
||||
**影响**:足够具体,对前端开发人员非常有用(特别是对新开发人员),且足够简单,解释得足够好,可以帮助非开发人员更好地理解前端开发人员的一些问题。到最后,你将(有点)了解 Javascript 和 WebAPI 之间的区别,以及 2019 年的 Javascript 与 2006 年的 Javascript 有何不同。
|
||||
|
||||
### 开源 Kubernetes 安全审计
|
||||
|
||||
- [文章链接][3]
|
||||
|
||||
> 去年,云原生计算基金会(CNCF)开始为其项目执行并开源第三方安全审计,以提高我们生态系统的整体安全性。这个想法是从一些项目开始,并从 CNCF 社区收集了关于这个试点项目是否有用的反馈。第一批经历这个过程的项目是 [CoreDNS][4]、[Envoy][5] 和 [Prometheus][6]。这些首次公开审计发现了从一般漏洞到严重漏洞的安全问题。有了这些结果,CoreDNS、Envoy 和 Prometheus 的项目维护者就能够解决已发现的漏洞,并添加文档来帮助用户。
|
||||
>
|
||||
> 从这些初始审计中得出的主要结论是,公开安全审计是测试开源项目的质量及其漏洞管理过程的一个很好的方法,更重要的是,测试开源项目的安全实践有多大的弹性。特别是 CNCF 的[毕业项目][7],它们被世界上一些最大的公司广泛应用于生产中,它们必须坚持最高级别的安全最佳实践。
|
||||
|
||||
**影响**:就像 Linux 之于数据中心一样,很多公司都把云计算押宝在 Kubernetes 上。从安全的角度来看,看到其中 4 家公司以确保项目正在做应该做的事情,这激发了人们的信心。共享这项研究表明,开源远远不止是仓库中的代码;它是以一种有益于整个社区而不是少数人利益的方式获取和分享专家意见。
|
||||
|
||||
### Quarkus——这个轻量级 Java 框架的下一步是什么?
|
||||
|
||||
- [文章链接][8]
|
||||
|
||||
> “容器优先”是什么意思?Quarkus 有哪些优势?0.20.0 版本有什么新功能?未来我们可以期待哪些功能?1.0.0 版什么时候发布?我们对 Quarkus 有很多问题,而 Alex Soto 也很耐心地回答了所有问题。 随着 Quarkus 0.20.0 的发布,我们和 [JAX 伦敦演讲者][9],Java 拥护者和红帽的开发人员体验总监 Alex Soto 进行了接触。他很好地回答了我们关于 Quarkus 的过去、现在和未来的所有问题。看起来我们对这个令人兴奋的轻量级框架有很多期待!
|
||||
|
||||
**影响**:最近有个聪明的人告诉我,Quarkus 有潜力使 Java “可能成为容器和无服务器环境的最佳语言之一”。不禁使我多看了一眼。尽管 Java 是最流行的编程语言之一([如果不是最流行的][10]),但当你听到“云原生”一词时,它可能并不是第一个想到的语言。Quarkus 可以通过让开发人员将他们的经验应用到新的挑战中,从而扩展和提高他们所拥有的技能的价值。
|
||||
|
||||
### Julia 编程语言:用户批露他们最喜欢和最讨厌它的地方
|
||||
|
||||
- [文章链接][11]
|
||||
|
||||
> Julia 最受欢迎的技术特性是速度和性能,其次是易用性,而最受欢迎的非技术特性是使用者无需付费即可使用它。
|
||||
>
|
||||
> 用户还报告了他们对该语言最大的不满。排在首位的是附加功能的包不够成熟,或者维护得不够好,无法满足他们的需求。
|
||||
|
||||
**影响**:Julia 1.0 版本已经发布了一年,并且在一系列相关指标(下载、GitHub 星级等)中取得了令人瞩目的增长。它是一种直接针对我们当前和未来最大挑战(“科学计算、机器学习、数据挖掘、大规模线性代数、分布式和并行计算”)的语言,因此,了解用户对它的感受,就可以间接看到有关这些挑战的应对情况。
|
||||
|
||||
### 多云数据解读:11 个有趣的统计数据
|
||||
|
||||
- [文章链接][12]
|
||||
|
||||
> 如果你把我们最近对 [Kubernetes 的有趣数据][13]的深入研究归结最基本的一条,它看起来是这样的:[Kubernetes][14] 的受欢迎程度在可预见的未来将持续下去。
|
||||
>
|
||||
> 剧透警报:当你挖掘有关[多云][15]使用情况的最新数据时,他们告诉你一个类似的描述:使用率正在飙升。
|
||||
>
|
||||
> 这种一致性是有道理的。也许不是每个组织都将使用 Kubernetes 来管理其多云和/或[混合云][16]基础架构,但是两者越来越紧密地联系在一起。即使不这样做,它们都反映了向更分散和异构 IT 环境的普遍转变,以及[云原生开发][17]和其他重叠趋势。
|
||||
|
||||
**影响**:越来越多地采用“多云战略”的另一种解释是,它们将组织中单独部分未经协商而作出的决策追溯为“战略”,从而使决策合法化。“等等,所以你从谁那里买了几个小时?又从另一个人那里买了几个小时?为什么在会议纪要中没有呢?我想我们现在是一家多云公司!”。当然,我在开玩笑,我敢肯定大多数大公司的协调能力远胜于此,对吗?
|
||||
|
||||
*我希望你喜欢这张上周让我印象深刻的列表,并在下周一回来了解更多的开放源码社区、市场和行业趋势。*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/8/cloud-native-java-and-more
|
||||
|
||||
作者:[Tim Hildred][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[laingke](https://github.com/laingke)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/thildred
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
|
||||
[2]: https://www.vrk.dev/2019/07/11/why-is-modern-web-development-so-complicated-a-long-yet-hasty-explanation-part-1/
|
||||
[3]: https://www.cncf.io/blog/2019/08/06/open-sourcing-the-kubernetes-security-audit/
|
||||
[4]: https://coredns.io/2018/03/15/cure53-security-assessment/
|
||||
[5]: https://github.com/envoyproxy/envoy/blob/master/docs/SECURITY_AUDIT.pdf
|
||||
[6]: https://cure53.de/pentest-report_prometheus.pdf
|
||||
[7]: https://www.cncf.io/projects/
|
||||
[8]: https://jaxenter.com/quarkus-whats-next-for-the-lightweight-java-framework-160793.html
|
||||
[9]: https://jaxlondon.com/cloud-kubernetes-serverless/java-particle-acceleration-using-quarkus/
|
||||
[10]: https://opensource.com/article/19/8/possibly%20one%20of%20the%20best%20languages%20for%20containers%20and%20serverless%20environments.
|
||||
[11]: https://www.zdnet.com/article/julia-programming-language-users-reveal-what-they-love-and-hate-the-most-about-it/#ftag=RSSbaffb68
|
||||
[12]: https://enterprisersproject.com/article/2019/8/multi-cloud-statistics
|
||||
[13]: https://enterprisersproject.com/article/2019/7/kubernetes-statistics-13-compelling
|
||||
[14]: https://www.redhat.com/en/topics/containers/what-is-kubernetes?intcmp=701f2000000tjyaAAA
|
||||
[15]: https://www.redhat.com/en/topics/cloud-computing/what-is-multicloud?intcmp=701f2000000tjyaAAA
|
||||
[16]: https://enterprisersproject.com/hybrid-cloud
|
||||
[17]: https://enterprisersproject.com/article/2018/10/how-explain-cloud-native-apps-plain-english
|
269
published/201909/20190822 How to move a file in Linux.md
Normal file
269
published/201909/20190822 How to move a file in Linux.md
Normal file
@ -0,0 +1,269 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11380-1.html)
|
||||
[#]: subject: (How to move a file in Linux)
|
||||
[#]: via: (https://opensource.com/article/19/8/moving-files-linux-depth)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/sethhttps://opensource.com/users/doni08521059)
|
||||
|
||||
在 Linux 中如何移动文件
|
||||
======
|
||||
|
||||
> 无论你是刚接触 Linux 的文件移动的新手还是已有丰富的经验,你都可以通过此深入的文章中学到一些东西。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/24/162919ygppgeevgrj0ppgv.jpg)
|
||||
|
||||
在 Linux 中移动文件看似比较简单,但是可用的选项却比大多数人想象的要多。本文介绍了初学者如何在 GUI 和命令行中移动文件,还介绍了底层实际上发生了什么,并介绍了许多有一定经验的用户也很少使用的命令行选项。
|
||||
|
||||
### 移动什么?
|
||||
|
||||
在研究移动文件之前,有必要仔细研究*移动*文件系统对象时实际发生的情况。当文件创建后,会将其分配给一个<ruby>索引节点<rt>inode</rt></ruby>,这是文件系统中用于数据存储的固定点。你可以使用 [ls][2] 命令看到文件对应的索引节点:
|
||||
|
||||
```
|
||||
$ ls --inode example.txt
|
||||
7344977 example.txt
|
||||
```
|
||||
|
||||
移动文件时,实际上并没有将数据从一个索引节点移动到另一个索引节点,只是给文件对象分配了新的名称或文件路径而已。实际上,文件在移动时会保留其权限,因为移动文件不会更改或重新创建文件。(LCTT 译注:在不跨卷、分区和存储器时,移动文件是不会重新创建文件的;反之亦然)
|
||||
|
||||
文件和目录的索引节点并没有暗示这种继承关系,而是由文件系统本身决定的。索引节点的分配是基于文件创建时的顺序分配的,并且完全独立于你组织计算机文件的方式。一个目录“内”的文件的索引节点号可能比其父目录的索引节点号更低或更高。例如:
|
||||
|
||||
```
|
||||
$ mkdir foo
|
||||
$ mv example.txt foo
|
||||
$ ls --inode
|
||||
7476865 foo
|
||||
$ ls --inode foo
|
||||
7344977 example.txt
|
||||
```
|
||||
|
||||
但是,将文件从一个硬盘驱动器移动到另一个硬盘驱动器时,索引节点基本上会更改。发生这种情况是因为必须将新数据写入新文件系统。因此,在 Linux 中,移动和重命名文件的操作实际上是相同的操作。无论你将文件移动到另一个目录还是在同一目录使用新名称,这两个操作均由同一个底层程序执行。
|
||||
|
||||
本文重点介绍将文件从一个目录移动到另一个目录。
|
||||
|
||||
### 用鼠标移动文件
|
||||
|
||||
图形用户界面是大多数人都熟悉的友好的抽象层,位于复杂的二进制数据集合之上。这也是在 Linux 桌面上移动文件的首选方法,也是最直观的方法。从一般意义上来说,如果你习惯使用台式机,那么你可能已经知道如何在硬盘驱动器上移动文件。例如,在 GNOME 桌面上,将文件从一个窗口拖放到另一个窗口时的默认操作是移动文件而不是复制文件,因此这可能是该桌面上最直观的操作之一:
|
||||
|
||||
![Moving a file in GNOME.][3]
|
||||
|
||||
而 KDE Plasma 桌面中的 Dolphin 文件管理器默认情况下会提示用户以执行不同的操作。拖动文件时按住 `Shift` 键可强制执行移动操作:
|
||||
|
||||
![Moving a file in KDE.][4]
|
||||
|
||||
### 在命令行移动文件
|
||||
|
||||
用于在 Linux、BSD、Illumos、Solaris 和 MacOS 上移动文件的 shell 命令是 `mv`。不言自明,简单的命令 `mv <source> <destination>` 会将源文件移动到指定的目标,源和目标都由[绝对][5]或[相对][6]文件路径定义。如前所述,`mv` 是 [POSIX][7] 用户的常用命令,其有很多不为人知的附加选项,因此,无论你是新手还是有经验的人,本文都会为你带来一些有用的选项。
|
||||
|
||||
但是,不是所有 `mv` 命令都是由同一个人编写的,因此取决于你的操作系统,你可能拥有 GNU `mv`、BSD `mv` 或 Sun `mv`。命令的选项因其实现而异(BSD `mv` 根本没有长选项),因此请参阅你的 `mv` 手册页以查看支持的内容,或安装你的首选版本(这是开源的奢侈之处)。
|
||||
|
||||
#### 移动文件
|
||||
|
||||
要使用 `mv` 将文件从一个文件夹移动到另一个文件夹,请记住语法 `mv <source> <destination>`。 例如,要将文件 `example.txt` 移到你的 `Documents` 目录中:
|
||||
|
||||
```
|
||||
$ touch example.txt
|
||||
$ mv example.txt ~/Documents
|
||||
$ ls ~/Documents
|
||||
example.txt
|
||||
```
|
||||
|
||||
就像你通过将文件拖放到文件夹图标上来移动文件一样,此命令不会将 `Documents` 替换为 `example.txt`。相反,`mv` 会检测到 `Documents` 是一个文件夹,并将 `example.txt` 文件放入其中。
|
||||
|
||||
你还可以方便地在移动文件时重命名该文件:
|
||||
|
||||
```
|
||||
$ touch example.txt
|
||||
$ mv example.txt ~/Documents/foo.txt
|
||||
$ ls ~/Documents
|
||||
foo.txt
|
||||
```
|
||||
|
||||
这很重要,这使你不用将文件移动到另一个位置,也可以重命名文件,例如:
|
||||
|
||||
```
|
||||
$ touch example.txt
|
||||
$ mv example.txt foo2.txt
|
||||
$ ls foo2.txt`
|
||||
```
|
||||
|
||||
#### 移动目录
|
||||
|
||||
不像 [cp][8] 命令,`mv` 命令处理文件和目录没有什么不同,你可以用同样的格式移动目录或文件:
|
||||
|
||||
```
|
||||
$ touch file.txt
|
||||
$ mkdir foo_directory
|
||||
$ mv file.txt foo_directory
|
||||
$ mv foo_directory ~/Documents
|
||||
```
|
||||
|
||||
#### 安全地移动文件
|
||||
|
||||
如果你移动一个文件到一个已有同名文件的地方,默认情况下,`mv` 会用你移动的文件替换目标文件。这种行为被称为<ruby>清除<rt>clobbering</rt></ruby>,有时候这就是你想要的结果,而有时则不是。
|
||||
|
||||
一些发行版将 `mv` 别名定义为 `mv --interactive`(你也可以[自己写一个][9]),这会提醒你确认是否覆盖。而另外一些发行版没有这样做,那么你可以使用 `--interactive` 或 `-i` 选项来确保当两个文件有一样的名字而发生冲突时让 `mv` 请你来确认。
|
||||
|
||||
```
|
||||
$ mv --interactive example.txt ~/Documents
|
||||
mv: overwrite '~/Documents/example.txt'?
|
||||
```
|
||||
|
||||
如果你不想手动干预,那么可以使用 `--no-clobber` 或 `-n`。该选项会在发生冲突时静默拒绝移动操作。在这个例子当中,一个名为 `example.txt` 的文件以及存在于 `~/Documents`,所以它不会如命令要求从当前目录移走。
|
||||
|
||||
```
|
||||
$ mv --no-clobber example.txt ~/Documents
|
||||
$ ls
|
||||
example.txt
|
||||
```
|
||||
|
||||
#### 带备份的移动
|
||||
|
||||
如果你使用 GNU `mv`,有一个备份选项提供了另外一种安全移动的方式。要为任何冲突的目标文件创建备份文件,可以使用 `-b` 选项。
|
||||
|
||||
```
|
||||
$ mv -b example.txt ~/Documents
|
||||
$ ls ~/Documents
|
||||
example.txt example.txt~
|
||||
```
|
||||
|
||||
这个选项可以确保 `mv` 完成移动操作,但是也会保护目录位置的已有文件。
|
||||
|
||||
另外的 GNU 备份选项是 `--backup`,它带有一个定义了备份文件如何命名的参数。
|
||||
|
||||
* `existing`:如果在目标位置已经存在了编号备份文件,那么会创建编号备份。否则,会使用 `simple` 方式。
|
||||
* `none`:即使设置了 `--backup`,也不会创建备份。当 `mv` 被别名定义为带有备份选项时,这个选项可以覆盖这种行为。
|
||||
* `numbered`:给目标文件名附加一个编号。
|
||||
* `simple`:给目标文件附加一个 `~`,当你日常使用带有 `--ignore-backups` 选项的 [ls][2] 时,这些文件可以很方便地隐藏起来。
|
||||
|
||||
简单来说:
|
||||
|
||||
```
|
||||
$ mv --backup=numbered example.txt ~/Documents
|
||||
$ ls ~/Documents
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
|
||||
```
|
||||
|
||||
可以使用环境变量 `VERSION_CONTROL` 设置默认的备份方案。你可以在 `~/.bashrc` 文件中设置该环境变量,也可以在命令前动态设置:
|
||||
|
||||
```
|
||||
$ VERSION_CONTROL=numbered mv --backup example.txt ~/Documents
|
||||
$ ls ~/Documents
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
|
||||
```
|
||||
|
||||
`--backup` 选项仍然遵循 `--interactive` 或 `-i` 选项,因此即使它在执行备份之前创建了备份,它仍会提示你覆盖目标文件:
|
||||
|
||||
```
|
||||
$ mv --backup=numbered example.txt ~/Documents
|
||||
mv: overwrite '~/Documents/example.txt'? y
|
||||
$ ls ~/Documents
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt.~3~
|
||||
```
|
||||
|
||||
你可以使用 `--force` 或 `-f` 选项覆盖 `-i`。
|
||||
|
||||
```
|
||||
$ mv --backup=numbered --force example.txt ~/Documents
|
||||
$ ls ~/Documents
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:26 example.txt
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt.~3~
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:25 example.txt.~4~
|
||||
```
|
||||
|
||||
`--backup` 选项在 BSD `mv` 中不可用。
|
||||
|
||||
#### 一次性移动多个文件
|
||||
|
||||
移动多个文件时,`mv` 会将最终目录视为目标:
|
||||
|
||||
```
|
||||
$ mv foo bar baz ~/Documents
|
||||
$ ls ~/Documents
|
||||
foo bar baz
|
||||
```
|
||||
|
||||
如果最后一个项目不是目录,则 `mv` 返回错误:
|
||||
|
||||
```
|
||||
$ mv foo bar baz
|
||||
mv: target 'baz' is not a directory
|
||||
```
|
||||
|
||||
GNU `mv` 的语法相当灵活。如果无法把目标目录作为提供给 `mv` 命令的最终参数,请使用 `--target-directory` 或 `-t` 选项:
|
||||
|
||||
```
|
||||
$ mv --target-directory=~/Documents foo bar baz
|
||||
$ ls ~/Documents
|
||||
foo bar baz
|
||||
```
|
||||
|
||||
当从某些其他命令的输出构造 `mv` 命令时(例如 `find` 命令、`xargs` 或 [GNU Parallel][10]),这特别有用。
|
||||
|
||||
#### 基于修改时间移动
|
||||
|
||||
使用 GNU `mv`,你可以根据要移动的文件是否比要替换的目标文件新来定义移动动作。该方式可以通过 `--update` 或 `-u` 选项使用,在BSD `mv` 中不可用:
|
||||
|
||||
```
|
||||
$ ls -l ~/Documents
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:32 example.txt
|
||||
$ ls -l
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt
|
||||
$ mv --update example.txt ~/Documents
|
||||
$ ls -l ~/Documents
|
||||
-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt
|
||||
$ ls -l
|
||||
```
|
||||
|
||||
此结果仅基于文件的修改时间,而不是两个文件的差异,因此请谨慎使用。只需使用 `touch` 命令即可愚弄 `mv`:
|
||||
|
||||
```
|
||||
$ cat example.txt
|
||||
one
|
||||
$ cat ~/Documents/example.txt
|
||||
one
|
||||
two
|
||||
$ touch example.txt
|
||||
$ mv --update example.txt ~/Documents
|
||||
$ cat ~/Documents/example.txt
|
||||
one
|
||||
```
|
||||
|
||||
显然,这不是最智能的更新功能,但是它提供了防止覆盖最新数据的基本保护。
|
||||
|
||||
### 移动
|
||||
|
||||
除了 `mv` 命令以外,还有更多的移动数据的方法,但是作为这项任务的默认程序,`mv` 是一个很好的通用选择。现在你知道了有哪些可以使用的选项,可以比以前更智能地使用 `mv` 了。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/8/moving-files-linux-depth
|
||||
|
||||
作者:[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/sethhttps://opensource.com/users/doni08521059
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder)
|
||||
[2]: https://opensource.com/article/19/7/master-ls-command
|
||||
[3]: https://opensource.com/sites/default/files/uploads/gnome-mv.jpg (Moving a file in GNOME.)
|
||||
[4]: https://opensource.com/sites/default/files/uploads/kde-mv.jpg (Moving a file in KDE.)
|
||||
[5]: https://opensource.com/article/19/7/understanding-file-paths-and-how-use-them
|
||||
[6]: https://opensource.com/article/19/7/navigating-filesystem-relative-paths
|
||||
[7]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
|
||||
[8]: https://opensource.com/article/19/7/copying-files-linux
|
||||
[9]: https://opensource.com/article/19/7/bash-aliases
|
||||
[10]: https://opensource.com/article/18/5/gnu-parallel
|
104
published/201909/20190823 The Linux kernel- Top 5 innovations.md
Normal file
104
published/201909/20190823 The Linux kernel- Top 5 innovations.md
Normal file
@ -0,0 +1,104 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (heguangzhi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11368-1.html)
|
||||
[#]: subject: (The Linux kernel: Top 5 innovations)
|
||||
[#]: via: (https://opensource.com/article/19/8/linux-kernel-top-5-innovations)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
Linux 内核的五大创新
|
||||
======
|
||||
|
||||
> 想知道什么是 Linux 内核上真正的(不是那种时髦的)创新吗?
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/21/093858no01oh78v111r3zt.jpg)
|
||||
|
||||
在科技行业,*创新*这个词几乎和*革命*一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux 内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大物。
|
||||
|
||||
撇开营销和模式不谈,Linux 可以说是开源世界中最受欢迎的内核,它在近 30 年的生命时光当中引入了一些真正的规则改变者。
|
||||
|
||||
### Cgroups(2.6.24)
|
||||
|
||||
早在 2007 年,Paul Menage 和 Rohit Seth 就在内核中添加了深奥的[控制组(cgroups)][2]功能(cgroups 的当前实现是由 Tejun Heo 重写的)。这种新技术最初被用作一种方法,从本质上来说,是为了确保一组特定任务的服务质量。
|
||||
|
||||
例如,你可以为与你的 WEB 服务相关联的所有任务创建一个控制组定义(cgroup),为例行备份创建另一个 cgroup ,再为一般操作系统需求创建另一个 cgroup。然后,你可以控制每个组的资源百分比,这样你的操作系统和 WEB 服务就可以获得大部分系统资源,而你的备份进程可以访问剩余的资源。
|
||||
|
||||
然而,cgroups 如今变得这么著名是因其作为驱动云技术的角色:容器。事实上,cgroups 最初被命名为[进程容器][3]。当它们被 [LXC][4]、[CoreOS][5] 和 Docker 等项目采用时,这并不奇怪。
|
||||
|
||||
就像闸门打开后一样,“容器” 一词就像成为了 Linux 的同义词一样,微服务风格的基于云的“应用”概念很快成为了规范。如今,已经很难摆脱 cgroups 了,它们是如此普遍。每一个大规模的基础设施(如果你运行 Linux 的话,可能还有你的笔记本电脑)都以一种合理的方式使用了 cgroups,这使得你的计算体验比以往任何时候都更加易于管理和灵活。
|
||||
|
||||
例如,你可能已经在电脑上安装了 [Flathub][6] 或 [Flatpak][7],或者你已经在工作中使用 [Kubernetes][8] 和/或 [OpenShift][9]。不管怎样,如果“容器”这个术语对你来说仍然模糊不清,则可以 [通过 Linux 容器从背后][10]获得对容器的实际理解。
|
||||
|
||||
### LKMM(4.17)
|
||||
|
||||
2018 年,Jade Alglave、Alan Stern、Andrea Parri、Luc Maranget、Paul McKenney 以及其他几个人的辛勤工作的成果被合并到主线 Linux 内核中,以提供正式的内存模型。Linux 内核内存[一致性]模型(LKMM)子系统是一套描述 Linux 内存一致性模型的工具,同时也产生用于测试的用例(特别命名为 klitmus)。
|
||||
|
||||
随着系统在物理设计上变得越来越复杂(增加了更多的中央处理器内核,高速缓存和内存增长,等等),它们就越难知道哪个中央处理器需要哪个地址空间,以及何时需要。例如,如果 CPU0 需要将数据写入内存中的共享变量,并且 CPU1 需要读取该值,那么 CPU0 必须在 CPU1 尝试读取之前写入。类似地,如果值是以一种顺序方式写入内存的,那么期望它们也以同样的顺序被读取,而不管哪个或哪些 CPU 正在读取。
|
||||
|
||||
即使在单个处理器上,内存管理也需要特定的任务顺序。像 `x = y` 这样的简单操作需要处理器从内存中加载 `y` 的值,然后将该值存储在 `x` 中。在处理器从内存中读取值之前,是不能将存储在 `y` 中的值放入 `x` 变量的。此外还有地址依赖:`x[n] = 6` 要求在处理器能够存储值 `6` 之前加载 `n`。
|
||||
|
||||
LKMM 可以帮助识别和跟踪代码中的这些内存模式。它部分是通过一个名为 `herd` 的工具来实现的,该工具(以逻辑公式的形式)定义了内存模型施加的约束,然后列举了与这些约束一致性的所有可能的结果。
|
||||
|
||||
### 低延迟补丁(2.6.38)
|
||||
|
||||
很久以前,在 2011 年之前,如果你想[在 Linux 上进行多媒体工作][11],你必须得有一个低延迟内核。这主要适用于[录音][12]时添加了许多实时效果(如对着麦克风唱歌和添加混音,以及在耳机中无延迟地听到你的声音)。有些发行版,如 [Ubuntu Studio][13],可靠地提供了这样一个内核,所以实际上这没有什么障碍,这只不过是当艺术家选择发行版时的一个重要提醒。
|
||||
|
||||
然而,如果你没有使用 Ubuntu Studio,或者你需要在你的发行版提供之前更新你的内核,你必须跳转到 rt-patches 网页,下载内核补丁,将它们应用到你的内核源代码,编译,然后手动安装。
|
||||
|
||||
后来,随着内核版本 2.6.38 的发布,这个过程结束了。Linux 内核突然像变魔术一样默认内置了低延迟代码(根据基准测试,延迟至少降低了 10 倍)。不再需要下载补丁,不用编译。一切都很顺利,这都是因为 Mike Galbraith 编写了一个 200 行的小补丁。
|
||||
|
||||
对于全世界的开源多媒体艺术家来说,这是一个规则改变者。从 2011 年开始事情变得如此美好,到 2016 年我自己做了一个挑战,[在树莓派 v1(型号 B)上建造一个数字音频工作站(DAW)][14],结果发现它运行得出奇地好。
|
||||
|
||||
### RCU(2.5)
|
||||
|
||||
RCU,即<ruby>读-拷贝-更新<rt>Read-Copy-Update</rt></ruby>,是计算机科学中定义的一个系统,它允许多个处理器线程从共享内存中读取数据。它通过延迟更新但也将它们标记为已更新来做到这一点,以确保数据读取为最新内容。实际上,这意味着读取与更新同时发生。
|
||||
|
||||
典型的 RCU 循环有点像这样:
|
||||
|
||||
1. 删除指向数据的指针,以防止其他读操作引用它。
|
||||
2. 等待读操作完成它们的关键处理。
|
||||
3. 回收内存空间。
|
||||
|
||||
将更新阶段划分为删除和回收阶段意味着更新程序会立即执行删除,同时推迟回收直到所有活动读取完成(通过阻止它们或注册一个回调以便在完成时调用)。
|
||||
|
||||
虽然 RCU 的概念不是为 Linux 内核发明的,但它在 Linux 中的实现是该技术的一个定义性的例子。
|
||||
|
||||
### 合作(0.01)
|
||||
|
||||
对于 Linux 内核创新的问题的最终答案永远是协作。你可以说这是一个好时机,也可以称之为技术优势,称之为黑客能力,或者仅仅称之为开源,但 Linux 内核及其支持的许多项目是协作与合作的光辉范例。
|
||||
|
||||
它远远超出了内核范畴。各行各业的人都对开源做出了贡献,可以说都是因为 Linux 内核。Linux 曾经是,现在仍然是[自由软件][15]的主要力量,激励人们把他们的代码、艺术、想法或者仅仅是他们自己带到一个全球化的、有生产力的、多样化的人类社区中。
|
||||
|
||||
### 你最喜欢的创新是什么?
|
||||
|
||||
这个列表偏向于我自己的兴趣:容器、非统一内存访问(NUMA)和多媒体。无疑,列表中肯定缺少你最喜欢的内核创新。在评论中告诉我。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/8/linux-kernel-top-5-innovations
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[heguangzhi](https://github.com/heguangzhi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 (Penguin with green background)
|
||||
[2]: https://en.wikipedia.org/wiki/Cgroups
|
||||
[3]: https://lkml.org/lkml/2006/10/20/251
|
||||
[4]: https://linuxcontainers.org
|
||||
[5]: https://coreos.com/
|
||||
[6]: http://flathub.org
|
||||
[7]: http://flatpak.org
|
||||
[8]: http://kubernetes.io
|
||||
[9]: https://www.redhat.com/sysadmin/learn-openshift-minishift
|
||||
[10]: https://opensource.com/article/18/11/behind-scenes-linux-containers
|
||||
[11]: http://slackermedia.info
|
||||
[12]: https://opensource.com/article/17/6/qtractor-audio
|
||||
[13]: http://ubuntustudio.org
|
||||
[14]: https://opensource.com/life/16/3/make-music-raspberry-pi-milkytracker
|
||||
[15]: http://fsf.org
|
@ -0,0 +1,168 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (heguangzhi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11356-1.html)
|
||||
[#]: subject: (Managing Ansible environments on MacOS with Conda)
|
||||
[#]: via: (https://opensource.com/article/19/8/using-conda-ansible-administration-macos)
|
||||
[#]: author: (James Farrell https://opensource.com/users/jamesf)
|
||||
|
||||
|
||||
使用 Conda 管理 MacOS 上的 Ansible 环境
|
||||
=====
|
||||
|
||||
> Conda 将 Ansible 所需的一切都收集到虚拟环境中并将其与其他项目分开。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/18/123838m1bcmke570kl6kzm.jpg)
|
||||
|
||||
如果你是一名使用 MacOS 并涉及到 Ansible 管理的 Python 开发人员,你可能希望使用 Conda 包管理器将 Ansible 的工作内容与核心操作系统和其他本地项目分开。
|
||||
|
||||
Ansible 基于 Python。要让 Ansible 在 MacOS 上工作,Conda 并不是必须要的,但是它确实让你管理 Python 版本和包依赖变得更加容易。这允许你在 MacOS 上使用升级的 Python 版本,并在你的系统中、Ansible 和其他编程项目之间保持 Python 包的依赖性相互独立。
|
||||
|
||||
在 MacOS 上安装 Ansible 还有其他方法。你可以使用 [Homebrew][2],但是如果你对 Python 开发(或 Ansible 开发)感兴趣,你可能会发现在一个独立 Python 虚拟环境中管理 Ansible 可以减少一些混乱。我觉得这更简单;与其试图将 Python 版本和依赖项加载到系统或 `/usr/local` 目录中 ,还不如使用 Conda 帮助我将 Ansible 所需的一切都收集到一个虚拟环境中,并将其与其他项目完全分开。
|
||||
|
||||
本文着重于使用 Conda 作为 Python 项目来管理 Ansible,以保持它的干净并与其他项目分开。请继续阅读,并了解如何安装 Conda、创建新的虚拟环境、安装 Ansible 并对其进行测试。
|
||||
|
||||
### 序幕
|
||||
|
||||
最近,我想学习 [Ansible][3],所以我需要找到安装它的最佳方法。
|
||||
|
||||
我通常对在我的日常工作站上安装东西很谨慎。我尤其不喜欢对供应商的默认操作系统安装应用手动更新(这是我多年作为 Unix 系统管理的习惯)。我真的很想使用 Python 3.7,但是 MacOS 的 Python 包是旧的 2.7,我不会安装任何可能干扰核心 MacOS 系统的全局 Python 包。
|
||||
|
||||
所以,我使用本地 Ubuntu 18.04 虚拟机上开始了我的 Ansible 工作。这提供了真正意义上的的安全隔离,但我很快发现管理它是非常乏味的。所以我着手研究如何在本机 MacOS 上获得一个灵活但独立的 Ansible 系统。
|
||||
|
||||
由于 Ansible 基于 Python,Conda 似乎是理想的解决方案。
|
||||
|
||||
### 安装 Conda
|
||||
|
||||
Conda 是一个开源软件,它提供方便的包和环境管理功能。它可以帮助你管理多个版本的 Python、安装软件包依赖关系、执行升级和维护项目隔离。如果你手动管理 Python 虚拟环境,Conda 将有助于简化和管理你的工作。浏览 [Conda 文档][4]可以了解更多细节。
|
||||
|
||||
我选择了 [Miniconda][5] Python 3.7 安装在我的工作站中,因为我想要最新的 Python 版本。无论选择哪个版本,你都可以使用其他版本的 Python 安装新的虚拟环境。
|
||||
|
||||
要安装 Conda,请下载 PKG 格式的文件,进行通常的双击,并选择 “Install for me only” 选项。安装在我的系统上占用了大约 158 兆的空间。
|
||||
|
||||
安装完成后,调出一个终端来查看你有什么了。你应该看到:
|
||||
|
||||
* 在你的家目录中的 `miniconda3` 目录
|
||||
* shell 提示符被修改为 `(base)`
|
||||
* `.bash_profile` 文件更新了一些 Conda 特有的设置内容
|
||||
|
||||
现在基础已经安装好了,你有了第一个 Python 虚拟环境。运行 Python 版本检查可以证明这一点,你的 `PATH` 将指向新的位置:
|
||||
|
||||
```
|
||||
(base) $ which python
|
||||
/Users/jfarrell/miniconda3/bin/python
|
||||
(base) $ python --version
|
||||
Python 3.7.1
|
||||
```
|
||||
|
||||
现在安装了 Conda,下一步是建立一个虚拟环境,然后安装 Ansible 并运行。
|
||||
|
||||
### 为 Ansible 创建虚拟环境
|
||||
|
||||
我想将 Ansible 与我的其他 Python 项目分开,所以我创建了一个新的虚拟环境并切换到它:
|
||||
|
||||
```
|
||||
(base) $ conda create --name ansible-env --clone base
|
||||
(base) $ conda activate ansible-env
|
||||
(ansible-env) $ conda env list
|
||||
```
|
||||
|
||||
第一个命令将 Conda 库克隆到一个名为 `ansible-env` 的新虚拟环境中。克隆引入了 Python 3.7 版本和一系列默认的 Python 模块,你可以根据需要添加、删除或升级这些模块。
|
||||
|
||||
第二个命令将 shell 上下文更改为这个新的环境。它为 Python 及其包含的模块设置了正确的路径。请注意,在 `conda activate ansible-env` 命令后,你的 shell 提示符会发生变化。
|
||||
|
||||
第三个命令不是必须的;它列出了安装了哪些 Python 模块及其版本和其他数据。
|
||||
|
||||
你可以随时使用 Conda 的 `activate` 命令切换到另一个虚拟环境。这将带你回到基本环境:`conda base`。
|
||||
|
||||
### 安装 Ansible
|
||||
|
||||
安装 Ansible 有多种方法,但是使用 Conda 可以将 Ansible 版本和所有需要的依赖项打包在一个地方。Conda 提供了灵活性,既可以将所有内容分开,又可以根据需要添加其他新环境(我将在后面演示)。
|
||||
|
||||
要安装 Ansible 的相对较新版本,请使用:
|
||||
|
||||
```
|
||||
(base) $ conda activate ansible-env
|
||||
(ansible-env) $ conda install -c conda-forge ansible
|
||||
```
|
||||
|
||||
由于 Ansible 不是 Conda 默认通道的一部分,因此 `-c` 用于从备用通道搜索和安装。Ansible 现已安装到 `ansible-env` 虚拟环境中,可以使用了。
|
||||
|
||||
### 使用 Ansible
|
||||
|
||||
既然你已经安装了 Conda 虚拟环境,就可以使用它了。首先,确保要控制的节点已将工作站的 SSH 密钥安装到正确的用户帐户。
|
||||
|
||||
调出一个新的 shell 并运行一些基本的 Ansible 命令:
|
||||
|
||||
```
|
||||
(base) $ conda activate ansible-env
|
||||
(ansible-env) $ ansible --version
|
||||
ansible 2.8.1
|
||||
config file = None
|
||||
configured module search path = ['/Users/jfarrell/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
|
||||
ansible python module location = /Users/jfarrell/miniconda3/envs/ansibleTest/lib/python3.7/site-packages/ansible
|
||||
executable location = /Users/jfarrell/miniconda3/envs/ansibleTest/bin/ansible
|
||||
python version = 3.7.1 (default, Dec 14 2018, 13:28:58) [Clang 4.0.1 (tags/RELEASE_401/final)]
|
||||
(ansible-env) $ ansible all -m ping -u ansible
|
||||
192.168.99.200 | SUCCESS => {
|
||||
"ansible_facts": {
|
||||
"discovered_interpreter_python": "/usr/bin/python"
|
||||
},
|
||||
"changed": false,
|
||||
"ping": "pong"
|
||||
}
|
||||
```
|
||||
|
||||
现在 Ansible 工作了,你可以在控制台中抽身,并从你的 MacOS 工作站中使用它们。
|
||||
|
||||
### 克隆新的 Ansible 进行 Ansible 开发
|
||||
|
||||
这部分完全是可选的;只有当你想要额外的虚拟环境来修改 Ansible 或者安全地使用有问题的 Python 模块时,才需要它。你可以通过以下方式将主 Ansible 环境克隆到开发副本中:
|
||||
|
||||
```
|
||||
(ansible-env) $ conda create --name ansible-dev --clone ansible-env
|
||||
(ansible-env) $ conda activte ansible-dev
|
||||
(ansible-dev) $
|
||||
```
|
||||
|
||||
### 需要注意的问题
|
||||
|
||||
偶尔你可能遇到使用 Conda 的麻烦。你通常可以通过以下方式删除不良环境:
|
||||
|
||||
```
|
||||
$ conda activate base
|
||||
$ conda remove --name ansible-dev --all
|
||||
```
|
||||
|
||||
如果出现无法解决的错误,通常可以通过在 `~/miniconda3/envs` 中找到该环境并删除整个目录来直接删除环境。如果基础环境损坏了,你可以删除整个 `~/miniconda3`,然后从 PKG 文件中重新安装。只要确保保留 `~/miniconda3/envs` ,或使用 Conda 工具导出环境配置并在以后重新创建即可。
|
||||
|
||||
MacOS 上不包括 `sshpass` 程序。只有当你的 Ansible 工作要求你向 Ansible 提供 SSH 登录密码时,才需要它。你可以在 SourceForge 上找到当前的 [sshpass 源代码][6]。
|
||||
|
||||
最后,基础的 Conda Python 模块列表可能缺少你工作所需的一些 Python 模块。如果你需要安装一个模块,首选命令是 `conda install package`,但是需要的话也可以使用 `pip`,Conda 会识别安装的模块。
|
||||
|
||||
### 结论
|
||||
|
||||
Ansible 是一个强大的自动化工具,值得我们去学习。Conda 是一个简单有效的 Python 虚拟环境管理工具。
|
||||
|
||||
在你的 MacOS 环境中保持软件安装分离是保持日常工作环境的稳定性和健全性的谨慎方法。Conda 尤其有助于升级你的 Python 版本,将 Ansible 从其他项目中分离出来,并安全地使用 Ansible。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/8/using-conda-ansible-administration-macos
|
||||
|
||||
作者:[James Farrell][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[heguangzhi](https://github.com/heguangzhi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/jamesf
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cicd_continuous_delivery_deployment_gears.png?itok=kVlhiEkc (CICD with gears)
|
||||
[2]: https://brew.sh/
|
||||
[3]: https://docs.ansible.com/?extIdCarryOver=true&sc_cid=701f2000001OH6uAAG
|
||||
[4]: https://conda.io/projects/conda/en/latest/index.html
|
||||
[5]: https://docs.conda.io/en/latest/miniconda.html
|
||||
[6]: https://sourceforge.net/projects/sshpass/
|
@ -0,0 +1,82 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11379-1.html)
|
||||
[#]: subject: (git exercises: navigate a repository)
|
||||
[#]: via: (https://jvns.ca/blog/2019/08/30/git-exercises--navigate-a-repository/)
|
||||
[#]: author: (Julia Evans https://jvns.ca/)
|
||||
|
||||
Git 练习:存储库导航
|
||||
======
|
||||
|
||||
我觉得前几天的 [curl 练习][1]进展顺利,所以今天我醒来后,想尝试编写一些 Git 练习。Git 是一大块需要学习的技能,可能要花几个小时才能学会,所以我分解练习的第一个思路是从“导航”一个存储库开始的。
|
||||
|
||||
我本来打算使用一个玩具测试库,但后来我想,为什么不使用真正的存储库呢?这样更有趣!因此,我们将浏览 Ruby 编程语言的存储库。你无需了解任何 C 即可完成此练习,只需熟悉一下存储库中的文件随时间变化的方式即可。
|
||||
|
||||
### 克隆存储库
|
||||
|
||||
开始之前,需要克隆存储库:
|
||||
|
||||
```
|
||||
git clone https://github.com/ruby/ruby
|
||||
```
|
||||
|
||||
与实际使用的大多数存储库相比,该存储库的最大不同之处在于它没有分支,但是它有很多标签,它们与分支相似,因为它们都只是指向一个提交的指针而已。因此,我们将使用标签而不是分支进行练习。*改变*标签的方式和分支非常不同,但*查看*标签和分支的方式完全相同。
|
||||
|
||||
### Git SHA 总是引用同一个代码
|
||||
|
||||
执行这些练习时要记住的最重要的一点是,如本页面所述,像`9e3d9a2a009d2a0281802a84e1c5cc1c887edc71` 这样的 Git SHA 始终引用同一个的代码。下图摘自我与凯蒂·西勒·米勒撰写的一本杂志,名为《[Oh shit, git!][2]》。(她还有一个名为 <https://ohshitgit.com/> 的很棒的网站,启发了该杂志。)
|
||||
|
||||
![](https://wizardzines.com/zines/oh-shit-git/samples/ohshit-commit.png)
|
||||
|
||||
我们将在练习中大量使用 Git SHA,以使你习惯于使用它们,并帮助你了解它们与标签和分支的对应关系。
|
||||
|
||||
### 我们将要使用的 Git 子命令
|
||||
|
||||
所有这些练习仅使用这 5 个 Git 子命令:
|
||||
|
||||
```
|
||||
git checkout
|
||||
git log (--oneline, --author, and -S will be useful)
|
||||
git diff (--stat will be useful)
|
||||
git show
|
||||
git status
|
||||
```
|
||||
|
||||
### 练习
|
||||
|
||||
1. 查看 matz 从 1998 年开始的 Ruby 提交。提交 ID 为 ` 3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4`。找出当时 Ruby 的代码行数。
|
||||
2. 检出当前的 master 分支。
|
||||
3. 查看文件 `hash.c` 的历史记录。更改该文件的最后一个提交 ID 是什么?
|
||||
4. 了解最近 20 年来 `hash.c` 的变化:将 master 分支上的文件与提交 `3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4` 的文件进行比较。
|
||||
5. 查找最近更改了 `hash.c` 的提交,并查看该提交的差异。
|
||||
6. 对于每个 Ruby 版本,该存储库都有一堆**标签**。获取所有标签的列表。
|
||||
7. 找出在标签 `v1_8_6_187` 和标签 `v1_8_6_188` 之间更改了多少文件。
|
||||
8. 查找 2015 年的提交(任何一个提交)并将其检出,简单地查看一下文件,然后返回 master 分支。
|
||||
9. 找出标签 `v1_8_6_187` 对应的提交。
|
||||
10. 列出目录 `.git/refs/tags`。运行 `cat .git/refs/tags/v1_8_6_187` 来查看其中一个文件的内容。
|
||||
11. 找出当前 `HEAD` 对应的提交 ID。
|
||||
12. 找出已经对 `test/` 目录进行了多少次提交。
|
||||
13. 提交 `65a5162550f58047974793cdc8067a970b2435c0` 和 `9e3d9a2a009d2a0281802a84e1c5cc1c887edc71` 之间的 `lib/telnet.rb` 的差异。该文件更改了几行?
|
||||
14. 在 Ruby 2.5.1 和 2.5.2 之间进行了多少次提交(标记为 `v2_5_1` 和 `v2_5_3`)(这一步有点棘手,步骤不只一步)
|
||||
15. “matz”(Ruby 的创建者)作了多少提交?
|
||||
16. 最近包含 “tkutil” 一词的提交是什么?
|
||||
17. 检出提交 `e51dca2596db9567bd4d698b18b4d300575d3881` 并创建一个指向该提交的新分支。
|
||||
18. 运行 `git reflog` 以查看你到目前为止完成的所有存储库导航操作。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://jvns.ca/blog/2019/08/30/git-exercises--navigate-a-repository/
|
||||
|
||||
作者:[Julia Evans][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://jvns.ca/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://jvns.ca/blog/2019/08/27/curl-exercises/
|
||||
[2]: https://wizardzines.com/zines/oh-shit-git/
|
@ -0,0 +1,386 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (heguangzhi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11411-1.html)
|
||||
[#]: subject: (Best Linux Distributions For Everyone in 2019)
|
||||
[#]: via: (https://itsfoss.com/best-linux-distributions/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
2019 年最好的 Linux 发行版
|
||||
======
|
||||
|
||||
> 哪个是最好的 Linux 发行版呢?这个问题是没有明确的答案的。这就是为什么我们按各种分类汇编了这个最佳 Linux 列表的原因。
|
||||
|
||||
有许多 Linux 发行版,我甚至想不出一个确切的数量,因为你会发现很多不同的 Linux 发行版。
|
||||
|
||||
其中有些只是另外一个的复制品,而有些往往是独一无二的。这虽然有点混乱——但这也是 Linux 的优点。
|
||||
|
||||
不用担心,尽管有成千上万的发行版,在这篇文章中,我已经列出了目前最好的 Linux 发行版。当然,这个列表是主观的。但是,在这里,我们试图对发行版进行分类——每个发行版本都有自己的特点的。
|
||||
|
||||
* 面向初学者的 Linux 用户的最佳发行版
|
||||
* 最佳 Linux 服务器发行版
|
||||
* 可以在旧计算机上运行的最佳 Linux 发行版
|
||||
* 面向高级 Linux 用户的最佳发行版
|
||||
* 最佳常青树 Linux 发行版
|
||||
|
||||
**注:** 该列表没有特定的排名顺序。
|
||||
|
||||
### 面向初学者的最佳 Linux 发行版
|
||||
|
||||
在这个分类中,我们的目标是列出开箱即用的易用发行版。你不需要深度学习,你可以在安装后马上开始使用,不需要知道任何命令或技巧。
|
||||
|
||||
#### Ubuntu
|
||||
|
||||
![][6]
|
||||
|
||||
Ubuntu 无疑是最流行的 Linux 发行版之一。你甚至可以发现它已经预装在很多笔记本电脑上了。
|
||||
|
||||
用户界面很容易适应。如果你愿意,你可以根据自己的要求轻松定制它的外观。无论哪种情况,你都可以选择安装一个主题。你可以从了解更多关于[如何在 Ubuntu 安装主题的][7]的信息来起步。
|
||||
|
||||
除了它本身提供的功能外,你会发现一个巨大的 Ubuntu 用户在线社区。因此,如果你有问题——可以去任何论坛(或版块)寻求帮助。如果你想直接寻找解决方案,你应该看看我们对 [Ubuntu][8] 的报道(我们有很多关于 Ubuntu 的教程和建议)。
|
||||
|
||||
- [Ubuntu][9]
|
||||
|
||||
#### Linux Mint
|
||||
|
||||
![][10]
|
||||
|
||||
Linux Mint Cinnamon 是另一个受初学者欢迎的 Linux 发行版。默认的 Cinnamon 桌面类似于 Windows XP,这就是为什么当 Windows XP 停止维护时许多用户选择它的原因。
|
||||
|
||||
Linux Mint 基于 Ubuntu,因此它具有适用于 Ubuntu 的所有应用程序。简单易用是它成为 Linux 新用户首选的原因。
|
||||
|
||||
- [Linux Mint][11]
|
||||
|
||||
#### elementary OS
|
||||
|
||||
![][12]
|
||||
|
||||
elementary OS 是我用过的最漂亮的 Linux 发行版之一。用户界面类似于苹果操作系统——所以如果你已经使用了苹果系统,则很容易适应。
|
||||
|
||||
该发行版基于 Ubuntu,致力于提供一个用户友好的 Linux 环境,该环境在考虑性能的同时尽可能美观。如果你选择安装 elementary OS,这份[在安装 elementary OS 后要做的 11 件事的清单][13]会派上用场。
|
||||
|
||||
- [elementary OS][14]
|
||||
|
||||
#### MX Linux
|
||||
|
||||
![][15]
|
||||
|
||||
大约一年前,MX Linux 成为众人瞩目的焦点。现在(在发表这篇文章的时候),它是 [DistroWatch.com][16] 上最受欢迎的 Linux 发行版。如果你还没有使用过它,那么当你开始使用它时,你会感到惊讶。
|
||||
|
||||
与 Ubuntu 不同,MX Linux 是一个基于 Debian 的日益流行的发行版,采用 Xfce 作为其桌面环境。除了无与伦比的稳定性之外,它还配备了许多图形用户界面工具,这使得任何习惯了 Windows/Mac 的用户易于使用它。
|
||||
|
||||
此外,软件包管理器还专门针对一键安装进行了量身定制。你甚至可以搜索 [Flatpak][18] 软件包并立即安装它(默认情况下,Flathub 在软件包管理器中是可用的来源之一)。
|
||||
|
||||
- [MX Linux][19]
|
||||
|
||||
#### Zorin OS
|
||||
|
||||
![][20]
|
||||
|
||||
Zorin OS 是又一个基于 Ubuntu 的发行版,它又是桌面上最漂亮、最直观的操作系统之一。尤其是在[Zorin OS 15 发布][21]之后——我绝对会向没有任何 Linux 经验的用户推荐它。它也引入了许多基于图形用户界面的应用程序。
|
||||
|
||||
你也可以将其安装在旧电脑上,但是,请确保选择“Lite”版本。此外,你还有“Core”、“Education”和 “Ultimate”版本可以选择。你可以选择免费安装 Core 版,但是如果你想支持开发人员并帮助改进 Zorin,请考虑获得 Ultimate 版。
|
||||
|
||||
Zorin OS 是由两名爱尔兰的青少年创建的。你可以[在这里阅读他们的故事][22]。
|
||||
|
||||
- [Zorin OS][23]
|
||||
|
||||
#### Pop!_OS
|
||||
|
||||
![](https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/04/pop-1.jpg?w=800&ssl=1)
|
||||
|
||||
Sytem76 的 Pop!_OS 是开发人员或计算机科学专业人员的理想选择。当然,不仅限于编码人员,如果你刚开始使用 Linux,这也是一个很好的选择。它基于 Ubuntu,但是其 UI 感觉更加直观和流畅。除了 UI 外,它还强制执行全盘加密。
|
||||
|
||||
你可以通过文章下面的评论看到,我们的许多读者似乎都喜欢(并坚持使用)它。如果你对此感到好奇,也应该查看一下我们关于 Phillip Prado 的 [Pop!_OS 的动手实践](https://itsfoss.com/pop-os-linux-review/)的文章。
|
||||
|
||||
(LCTT 译注:这段推荐是原文后来补充的,因为原文下面很多人在评论推荐。)
|
||||
|
||||
- [Pop!_OS](https://system76.com/pop)
|
||||
|
||||
#### 其他选择
|
||||
|
||||
[深度操作系统][24] 和其他的 Ubuntu 变种(如 Kubuntu、Xubuntu)也是初学者的首选。如果你想寻求更多的选择,你可以看看。(LCTT 译注:我知道你们肯定对将深度操作系统列入其它不满意——这个锅归原作者。)
|
||||
|
||||
如果你想要挑战自己,你可以试试 Ubuntu 之外的 Fedora —— 但是一定要看看我们关于 [Ubuntu 和 Fedora 对比][25]的文章,从桌面的角度做出更好的选择。
|
||||
|
||||
### 最好的服务器发行版
|
||||
|
||||
对于服务器来说,选择 Linux 发行版取决于稳定性、性能和企业级支持。如果你只是尝试,则可以尝试任何你想要的发行版。
|
||||
|
||||
但是,如果你要为 Web 服务器或任何重要的组件安装它,你应该看看我们的一些建议。
|
||||
|
||||
#### Ubuntu 服务器
|
||||
|
||||
根据你的需要,Ubuntu 为你的服务器提供了不同的选项。如果你正在寻找运行在 AWS、Azure、谷歌云平台等平台上的优化解决方案,[Ubuntu Cloud][26] 是一个很好的选择。
|
||||
|
||||
无论是哪种情况,你都可以选择 Ubuntu 服务器包,并将其安装在你的服务器上。然而,Ubuntu 在云上部署时也是最受欢迎的 Linux 发行版(根据数字判断——[来源1][27]、[来源2][28])。
|
||||
|
||||
请注意,除非你有特殊要求,我们建议你选择 LTS 版。
|
||||
|
||||
- [Ubuntu Server][29]
|
||||
|
||||
#### 红帽企业版 Linux(RHEL)
|
||||
|
||||
红帽企业版 Linux(RHEL)是面向企业和组织的顶级 Linux 平台。如果我们按数字来看,红帽可能不是服务器领域最受欢迎的。但是,有相当一部分企业用户依赖于 RHEL (比如联想)。
|
||||
|
||||
从技术上讲,Fedora 和红帽企业版是相关联的。无论红帽要支持什么——在出现在 RHEL 之前,都要在 Fedora 上进行测试。我不是定制需求的服务器发行版专家,所以你一定要查看他们的[官方文档][30]以了解它是否适合你。
|
||||
|
||||
- [RHEL][31]
|
||||
|
||||
#### SUSE Linux 企业服务器(SLES)
|
||||
|
||||
![][32]
|
||||
|
||||
别担心,不要把这和 OpenSUSE 混淆。一切都以一个共同的品牌 “SUSE” 命名 —— 但是 OpenSUSE 是一个开源发行版,目标是社区,并且由社区维护。
|
||||
|
||||
SUSE Linux 企业服务器(SLES)是基于云的服务器最受欢迎的解决方案之一。为了获得管理开源解决方案的优先支持和帮助,你必须选择订阅。
|
||||
|
||||
- [SLES][33]
|
||||
|
||||
#### CentOS
|
||||
|
||||
![][34]
|
||||
|
||||
正如我提到的,对于 RHEL 你需要订阅。而 CentOS 更像是 RHEL 的社区版,因为它是从 RHEL 的源代码中派生出来的。而且,它是开源的,也是免费的。尽管与过去几年相比,使用 CentOS 的托管提供商数量明显减少,但这仍然是一个很好的选择。
|
||||
|
||||
CentOS 可能没有加载最新的软件包,但它被认为是最稳定的发行版之一,你可以在各种云平台上找到 CentOS 镜像。如果没有,你可以选择 CentOS 提供的自托管镜像。
|
||||
|
||||
- [CentOS][35]
|
||||
|
||||
#### 其他选择
|
||||
|
||||
你也可以尝试 [Fedora Server][36]或[Debian][37]作为上述发行版的替代品。
|
||||
|
||||
### 旧电脑的最佳 Linux 发行版
|
||||
|
||||
如果你有一台旧电脑,或者你真的不需要升级你的系统,你仍然可以尝试一些最好的 Linux 发行版。
|
||||
|
||||
我们已经详细讨论了一些[最好的轻量级 Linux 发行版][42]。在这里,我们将只提到那些真正突出的东西(以及一些新的补充)。
|
||||
|
||||
#### Puppy Linux
|
||||
|
||||
![][43]
|
||||
|
||||
Puppy Linux 实际上是最小的发行版本之一。刚开始使用 Linux 时,我的朋友建议我尝试一下 Puppy Linux,因为它可以轻松地在较旧的硬件配置上运行。
|
||||
|
||||
如果你想在你的旧电脑上享受一次爽快的体验,那就值得去看看。多年来,随着一些新的有用特性的增加,用户体验得到了改善。
|
||||
|
||||
- [Puppy Linux][44]
|
||||
|
||||
#### Solus Budgie
|
||||
|
||||
![][45]
|
||||
|
||||
在最近的一个主要版本——[Solus 4 Fortitude][46] 之后,它是一个令人印象深刻的轻量级桌面操作系统。你可以选择像 GNOME 或 MATE 这样的桌面环境。然而,Solus Budgie 恰好是我的最爱之一,它是一款适合初学者的功能齐全的 Linux发行版,同时对系统资源要求很少。
|
||||
|
||||
- [Solus][47]
|
||||
|
||||
#### Bodhi
|
||||
|
||||
![][48]
|
||||
|
||||
Bodhi Linux 构建于 Ubuntu 之上。然而,与Ubuntu不同,它在较旧的配置上运行良好。
|
||||
|
||||
这个发行版的主要亮点是它的 [Moksha 桌面][49](这是 Enlightenment 17 桌面的延续)。用户体验直观且反应极快。即使我个人不用它,你也应该在你的旧系统上试一试。
|
||||
|
||||
- [Bodhi Linux][50]
|
||||
|
||||
#### antiX
|
||||
|
||||
![][51]
|
||||
|
||||
antiX 部分担起了 MX Linux 的责任,它是一个轻量级的 Linux 发行版,为新的或旧的计算机量身定制。其用户界面并不令人印象深刻——但它可以像预期的那样工作。
|
||||
|
||||
它基于 Debian,可以作为一个现场版 CD 发行版使用,而不需要安装它。antiX 还提供现场版引导加载程序。与其他发行版相比,你可以保存设置,这样就不会在每次重新启动时丢失设置。不仅如此,你还可以通过其“持久保留”功能将更改保存到根目录中。
|
||||
|
||||
因此,如果你正在寻找一个可以在旧硬件上提供快速用户体验的现场版 USB 发行版,antiX 是一个不错的选择。
|
||||
|
||||
- [antiX][52]
|
||||
|
||||
#### Sparky Linux
|
||||
|
||||
![][53]
|
||||
|
||||
Sparky Linux 基于 Debian,它是理想的低端系统 Linux 发行版。伴随着超快的用户体验,Sparky Linux 为不同的用户提供了几个特殊版本(或变种)。
|
||||
|
||||
例如,它提供了针对一组用户的稳定版本(和变种)和滚动版本。Sparky Linux GameOver 版非常受游戏玩家欢迎,因为它包含了一堆预装的游戏。你可以查看我们的[最佳 Linux 游戏发行版][54] —— 如果你也想在你的系统上玩游戏。
|
||||
|
||||
#### 其他选择
|
||||
|
||||
你也可以尝试 [Linux Lite][55]、[Lubuntu][56]、[Peppermint][57] 等轻量级 Linux 发行版。
|
||||
|
||||
### 面向高级用户的最佳 Linux 发行版
|
||||
|
||||
一旦你习惯了各种软件包管理器和命令来帮助你解决任何问题,你就可以开始找寻只为高级用户量身定制的 Linux 发行版。
|
||||
|
||||
当然,如果你是专业人士,你会有一套具体的要求。然而,如果你已经作为普通用户使用了一段时间——以下发行版值得一试。
|
||||
|
||||
#### Arch Linux
|
||||
|
||||
![][58]
|
||||
|
||||
Arch Linux 本身是一个简单而强大的发行版,具有陡峭的学习曲线。不像其系统,你不会一次就把所有东西都预先安装好。你必须配置系统并根据需要添加软件包。
|
||||
|
||||
此外,在安装 Arch Linux 时,必须按照一组命令来进行(没有图形用户界面)。要了解更多信息,你可以按照我们关于[如何安装 Arch Linux][59] 的指南进行操作。如果你要安装它,你还应该知道在[安装 Arch Linux 后需要做的一些基本事情][60]。这会帮助你快速入门。
|
||||
|
||||
除了多才多艺和简便性之外,值得一提的是 Arch Linux 背后的社区非常活跃。所以,如果你遇到问题,你不用担心。
|
||||
|
||||
- [Arch Linux][61]
|
||||
|
||||
#### Gentoo
|
||||
|
||||
![][62]
|
||||
|
||||
如果你知道如何编译源代码,Gentoo Linux 是你必须尝试的版本。这也是一个轻量级的发行版,但是,你需要具备必要的技术知识才能使它发挥作用。
|
||||
|
||||
当然,[官方手册][63]提供了许多你需要知道的信息。但是,如果你不确定自己在做什么——你需要花很多时间去想如何充分利用它。
|
||||
|
||||
- [Gentoo Linux][64]
|
||||
|
||||
#### Slackware
|
||||
|
||||
![][65]
|
||||
|
||||
Slackware 是仍然重要的最古老的 Linux 发行版之一。如果你愿意编译或开发软件来为自己建立一个完美的环境 —— Slackware 是一个不错的选择。
|
||||
|
||||
如果你对一些最古老的 Linux 发行版感到好奇,我们有一篇关于[最早的 Linux 发行版][66]可以去看看。
|
||||
|
||||
尽管使用它的用户/开发人员的数量已经显著减少,但对于高级用户来说,它仍然是一个极好的选择。此外,最近有个新闻是 [Slackware 有了一个 Patreon 捐赠页面][67],我们希望 Slackware 继续作为最好的 Linux 发行版之一存在。
|
||||
|
||||
- [Slackware][68]
|
||||
|
||||
### 最佳多用途 Linux 发行版
|
||||
|
||||
有些 Linux 发行版既可以作为初学者友好的桌面又可以作为高级操作系统的服务器。因此,我们考虑为这样的发行版编辑一个单独的部分。
|
||||
|
||||
如果你不同意我们的观点(或者有建议要补充),请在评论中告诉我们。我们认为,这对于每个用户都可以派上用场:
|
||||
|
||||
#### Fedora
|
||||
|
||||
![][69]
|
||||
|
||||
Fedora 提供两个独立的版本:一个用于台式机/笔记本电脑(Fedora 工作站),另一个用于服务器(Fedora 服务器)。
|
||||
|
||||
因此,如果你正在寻找一款时髦的桌面操作系统,有点学习曲线,又对用户友好,那么 Fedora 是一个选择。无论是哪种情况,如果你正在为你的服务器寻找一个 Linux 操作系统,这也是一个不错的选择。
|
||||
|
||||
- [Fedora][70]
|
||||
|
||||
#### Manjaro
|
||||
|
||||
![][71]
|
||||
|
||||
Manjaro 基于 [Arch Linux][72]。不用担心,虽然 Arch Linux 是为高级用户量身定制的,但Manjaro 让新手更容易上手。这是一个简单且对初学者友好的 Linux 发行版。用户界面足够好,并且内置了一系列有用的图形用户界面应用程序。
|
||||
|
||||
下载时,你可以为 Manjaro 选择[桌面环境][73]。就个人而言,我喜欢 Manjaro 的 KDE 桌面。
|
||||
|
||||
- [Manjaro Linux][74]
|
||||
|
||||
#### Debian
|
||||
|
||||
![][75]
|
||||
|
||||
嗯,Ubuntu 是基于 Debian 的——所以它本身是一个非常好的发行版本。Debian 是台式机和服务器的理想选择。
|
||||
|
||||
这可能不是对初学者最友好的操作系统——但你可以通过阅读[官方文档][76]轻松开始。[Debian 10 Buster][77] 的最新版本引入了许多变化和必要的改进。所以,你必须试一试!
|
||||
|
||||
### 总结
|
||||
|
||||
总的来说,这些是我们推荐你去尝试的最好的 Linux 发行版。是的,还有许多其他的 Linux 发行版值得一提,但是根据个人喜好,对每个发行版来说,取决于个人喜好,这种选择是主观的。
|
||||
|
||||
但是,我们也为 [Windows 用户][78]、[黑客和脆弱性测试人员][41]、[游戏玩家][54]、[程序员][39]和[偏重隐私者][79]提供了单独的发行版列表所以,如果你感兴趣的话请仔细阅读。
|
||||
|
||||
如果你认为我们遗漏了你最喜欢的 Linux 发行版,请在下面的评论中告诉我们你的想法,我们将更新这篇文章。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/best-linux-distributions/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[heguangzhi](https://github.com/heguangzhi)
|
||||
校对:[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]: tmp.NoRXbIWHkg#for-beginners
|
||||
[2]: tmp.NoRXbIWHkg#for-servers
|
||||
[3]: tmp.NoRXbIWHkg#for-old-computers
|
||||
[4]: tmp.NoRXbIWHkg#for-advanced-users
|
||||
[5]: tmp.NoRXbIWHkg#general-purpose
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-10.jpg?ssl=1
|
||||
[7]: https://itsfoss.com/install-themes-ubuntu/
|
||||
[8]: https://itsfoss.com/tag/ubuntu/
|
||||
[9]: https://ubuntu.com/download/desktop
|
||||
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/linux-Mint-19-desktop.jpg?ssl=1
|
||||
[11]: https://www.linuxmint.com/
|
||||
[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/elementary-os-juno-feat.jpg?ssl=1
|
||||
[13]: https://itsfoss.com/things-to-do-after-installing-elementary-os-5-juno/
|
||||
[14]: https://elementary.io/
|
||||
[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/mx-linux.jpg?ssl=1
|
||||
[16]: https://distrowatch.com/
|
||||
[17]: https://en.wikipedia.org/wiki/Linux_distribution#Rolling_distributions
|
||||
[18]: https://flatpak.org/
|
||||
[19]: https://mxlinux.org/
|
||||
[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/zorin-os-15.png?ssl=1
|
||||
[21]: https://itsfoss.com/zorin-os-15-release/
|
||||
[22]: https://itsfoss.com/zorin-os-interview/
|
||||
[23]: https://zorinos.com/
|
||||
[24]: https://www.deepin.org/en/
|
||||
[25]: https://itsfoss.com/ubuntu-vs-fedora/
|
||||
[26]: https://ubuntu.com/download/cloud
|
||||
[27]: https://w3techs.com/technologies/details/os-linux/all/all
|
||||
[28]: https://thecloudmarket.com/stats
|
||||
[29]: https://ubuntu.com/download/server
|
||||
[30]: https://developers.redhat.com/products/rhel/docs-and-apis
|
||||
[31]: https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux
|
||||
[32]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/SUSE-Linux-Enterprise.jpg?ssl=1
|
||||
[33]: https://www.suse.com/products/server/
|
||||
[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/centos.png?ssl=1
|
||||
[35]: https://www.centos.org/
|
||||
[36]: https://getfedora.org/en/server/
|
||||
[37]: https://www.debian.org/distrib/
|
||||
[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/coding.jpg?ssl=1
|
||||
[39]: https://itsfoss.com/best-linux-distributions-progammers/
|
||||
[40]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/hacking.jpg?ssl=1
|
||||
[41]: https://itsfoss.com/linux-hacking-penetration-testing/
|
||||
[42]: https://itsfoss.com/lightweight-linux-beginners/
|
||||
[43]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/puppy-linux-bionic.jpg?ssl=1
|
||||
[44]: http://puppylinux.com/
|
||||
[45]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/solus-4-featured.jpg?resize=800%2C450&ssl=1
|
||||
[46]: https://itsfoss.com/solus-4-release/
|
||||
[47]: https://getsol.us/home/
|
||||
[48]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/bodhi-linux.png?fit=800%2C436&ssl=1
|
||||
[49]: http://www.bodhilinux.com/moksha-desktop/
|
||||
[50]: http://www.bodhilinux.com/
|
||||
[51]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/10/antix-linux-screenshot.jpg?ssl=1
|
||||
[52]: https://antixlinux.com/
|
||||
[53]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/sparky-linux.jpg?ssl=1
|
||||
[54]: https://itsfoss.com/linux-gaming-distributions/
|
||||
[55]: https://www.linuxliteos.com/
|
||||
[56]: https://lubuntu.me/
|
||||
[57]: https://peppermintos.com/
|
||||
[58]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/arch_linux_screenshot.jpg?ssl=1
|
||||
[59]: https://itsfoss.com/install-arch-linux/
|
||||
[60]: https://itsfoss.com/things-to-do-after-installing-arch-linux/
|
||||
[61]: https://www.archlinux.org
|
||||
[62]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/gentoo-linux.png?ssl=1
|
||||
[63]: https://wiki.gentoo.org/wiki/Handbook:Main_Page
|
||||
[64]: https://www.gentoo.org
|
||||
[65]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/slackware-screenshot.jpg?ssl=1
|
||||
[66]: https://itsfoss.com/earliest-linux-distros/
|
||||
[67]: https://distrowatch.com/dwres.php?resource=showheadline&story=8743
|
||||
[68]: http://www.slackware.com/
|
||||
[69]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/fedora-overview.png?ssl=1
|
||||
[70]: https://getfedora.org/
|
||||
[71]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/manjaro-gnome.jpg?ssl=1
|
||||
[72]: https://www.archlinux.org/
|
||||
[73]: https://itsfoss.com/glossary/desktop-environment/
|
||||
[74]: https://manjaro.org/
|
||||
[75]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/debian-screenshot.png?ssl=1
|
||||
[76]: https://www.debian.org/releases/stable/installmanual
|
||||
[77]: https://itsfoss.com/debian-10-buster/
|
||||
[78]: https://itsfoss.com/windows-like-linux-distributions/
|
||||
[79]: https://itsfoss.com/privacy-focused-linux-distributions/
|
@ -0,0 +1,237 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (heguangzhi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11390-1.html)
|
||||
[#]: subject: (Different Ways to Configure Static IP Address in RHEL 8)
|
||||
[#]: via: (https://www.linuxtechi.com/configure-static-ip-address-rhel8/)
|
||||
[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
|
||||
|
||||
在 RHEL8 配置静态 IP 地址的不同方法
|
||||
======
|
||||
|
||||
在 Linux 服务器上工作时,在网卡/以太网卡上分配静态 IP 地址是每个 Linux 工程师的常见任务之一。如果一个人在 Linux 服务器上正确配置了静态地址,那么他/她就可以通过网络远程访问它。在本文中,我们将演示在 RHEL 8 服务器网卡上配置静态 IP 地址的不同方法。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/25/222737dx94bbl9qbhzlfe4.jpg)
|
||||
|
||||
以下是在网卡上配置静态IP的方法:
|
||||
|
||||
* `nmcli`(命令行工具)
|
||||
* 网络脚本文件(`ifcfg-*`)
|
||||
* `nmtui`(基于文本的用户界面)
|
||||
|
||||
### 使用 nmcli 命令行工具配置静态 IP 地址
|
||||
|
||||
每当我们安装 RHEL 8 服务器时,就会自动安装命令行工具 `nmcli`,它是由网络管理器使用的,可以让我们在以太网卡上配置静态 IP 地址。
|
||||
|
||||
运行下面的 `ip addr` 命令,列出 RHEL 8 服务器上的以太网卡
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# ip addr
|
||||
```
|
||||
|
||||
正如我们在上面的命令输出中看到的,我们有两个网卡 `enp0s3` 和 `enp0s8`。当前分配给网卡的 IP 地址是通过 DHCP 服务器获得的。
|
||||
|
||||
假设我们希望在第一个网卡 (`enp0s3`) 上分配静态 IP 地址,具体内容如下:
|
||||
|
||||
* IP 地址 = 192.168.1.4
|
||||
* 网络掩码 = 255.255.255.0
|
||||
* 网关 = 192.168.1.1
|
||||
* DNS = 8.8.8.8
|
||||
|
||||
依次运行以下 `nmcli` 命令来配置静态 IP,
|
||||
|
||||
使用 `nmcli connection` 命令列出当前活动的以太网卡,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# nmcli connection
|
||||
NAME UUID TYPE DEVICE
|
||||
enp0s3 7c1b8444-cb65-440d-9bf6-ea0ad5e60bae ethernet enp0s3
|
||||
virbr0 3020c41f-6b21-4d80-a1a6-7c1bd5867e6c bridge virbr0
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
使用下面的 `nmcli` 给 `enp0s3` 分配静态 IP。
|
||||
|
||||
**命令语法:**
|
||||
|
||||
```
|
||||
# nmcli connection modify <interface_name> ipv4.address <ip/prefix>
|
||||
```
|
||||
|
||||
**注意:** 为了简化语句,在 `nmcli` 命令中,我们通常用 `con` 关键字替换 `connection`,并用 `mod` 关键字替换 `modify`。
|
||||
|
||||
将 IPv4 地址 (192.168.1.4) 分配给 `enp0s3` 网卡上,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.addresses 192.168.1.4/24
|
||||
```
|
||||
|
||||
使用下面的 `nmcli` 命令设置网关,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.gateway 192.168.1.1
|
||||
```
|
||||
|
||||
设置手动配置(从 dhcp 到 static),
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.method manual
|
||||
```
|
||||
|
||||
设置 DNS 值为 “8.8.8.8”,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.dns "8.8.8.8"
|
||||
```
|
||||
|
||||
要保存上述更改并重新加载,请执行如下 `nmcli` 命令,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# nmcli con up enp0s3
|
||||
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
|
||||
```
|
||||
|
||||
以上命令显示网卡 `enp0s3` 已成功配置。我们使用 `nmcli` 命令做的那些更改都将永久保存在文件 `etc/sysconfig/network-scripts/ifcfg-enp0s3` 里。
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
|
||||
```
|
||||
|
||||
![ifcfg-enp0s3-file-rhel8][2]
|
||||
|
||||
要确认 IP 地址是否分配给了 `enp0s3` 网卡了,请使用以下 IP 命令查看,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]#ip addr show enp0s3
|
||||
```
|
||||
|
||||
### 使用网络脚本文件(ifcfg-*)手动配置静态 IP 地址
|
||||
|
||||
我们可以使用配置以太网卡的网络脚本或 `ifcfg-*` 文件来配置以太网卡的静态 IP 地址。假设我们想在第二个以太网卡 `enp0s8` 上分配静态 IP 地址:
|
||||
|
||||
* IP 地址 = 192.168.1.91
|
||||
* 前缀 = 24
|
||||
* 网关 =192.168.1.1
|
||||
* DNS1 =4.2.2.2
|
||||
|
||||
|
||||
转到目录 `/etc/sysconfig/network-scripts`,查找文件 `ifcfg-enp0s8`,如果它不存在,则使用以下内容创建它,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# cd /etc/sysconfig/network-scripts/
|
||||
[root@linuxtechi network-scripts]# vi ifcfg-enp0s8
|
||||
TYPE="Ethernet"
|
||||
DEVICE="enp0s8"
|
||||
BOOTPROTO="static"
|
||||
ONBOOT="yes"
|
||||
NAME="enp0s8"
|
||||
IPADDR="192.168.1.91"
|
||||
PREFIX="24"
|
||||
GATEWAY="192.168.1.1"
|
||||
DNS1="4.2.2.2"
|
||||
```
|
||||
|
||||
保存并退出文件,然后重新启动网络管理器服务以使上述更改生效,
|
||||
|
||||
```
|
||||
[root@linuxtechi network-scripts]# systemctl restart NetworkManager
|
||||
```
|
||||
|
||||
现在使用下面的 `ip` 命令来验证 IP 地址是否分配给网卡,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# ip add show enp0s8
|
||||
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether 08:00:27:7c:bb:cb brd ff:ff:ff:ff:ff:ff
|
||||
inet 192.168.1.91/24 brd 192.168.1.255 scope global noprefixroute enp0s8
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::a00:27ff:fe7c:bbcb/64 scope link
|
||||
valid_lft forever preferred_lft forever
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
以上输出内容确认静态 IP 地址已在网卡 `enp0s8` 上成功配置了。
|
||||
|
||||
### 使用 nmtui 实用程序配置静态 IP 地址
|
||||
|
||||
`nmtui` 是一个基于文本用户界面的,用于控制网络的管理器,当我们执行 `nmtui` 时,它将打开一个基于文本的用户界面,通过它我们可以添加、修改和删除连接。除此之外,`nmtui` 还可以用来设置系统的主机名。
|
||||
|
||||
假设我们希望通过以下细节将静态 IP 地址分配给网卡 `enp0s3` ,
|
||||
|
||||
* IP 地址 = 10.20.0.72
|
||||
* 前缀 = 24
|
||||
* 网关 = 10.20.0.1
|
||||
* DNS1 = 4.2.2.2
|
||||
|
||||
运行 `nmtui` 并按照屏幕说明操作,示例如下所示,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# nmtui
|
||||
```
|
||||
|
||||
![nmtui-rhel8][3]
|
||||
|
||||
选择第一个选项 “Edit a connection”,然后选择接口为 “enp0s3”,
|
||||
|
||||
![Choose-interface-nmtui-rhel8][4]
|
||||
|
||||
选择 “Edit”,然后指定 IP 地址、前缀、网关和域名系统服务器 IP,
|
||||
|
||||
![set-ip-nmtui-rhel8][5]
|
||||
|
||||
选择确定,然后点击回车。在下一个窗口中,选择 “Activate a connection”,
|
||||
|
||||
![Activate-option-nmtui-rhel8][6]
|
||||
|
||||
选择 “enp0s3”,选择 “Deactivate” 并点击回车,
|
||||
|
||||
![Deactivate-interface-nmtui-rhel8][7]
|
||||
|
||||
现在选择 “Activate” 并点击回车,
|
||||
|
||||
![Activate-interface-nmtui-rhel8][8]
|
||||
|
||||
选择 “Back”,然后选择 “Quit”,
|
||||
|
||||
![Quit-Option-nmtui-rhel8][9]
|
||||
|
||||
使用下面的 `ip` 命令验证 IP 地址是否已分配给接口 `enp0s3`,
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# ip add show enp0s3
|
||||
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
|
||||
link/ether 08:00:27:53:39:4d brd ff:ff:ff:ff:ff:ff
|
||||
inet 10.20.0.72/24 brd 10.20.0.255 scope global noprefixroute enp0s3
|
||||
valid_lft forever preferred_lft forever
|
||||
inet6 fe80::421d:5abf:58bd:c47e/64 scope link noprefixroute
|
||||
valid_lft forever preferred_lft forever
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
以上输出内容显示我们已经使用 `nmtui` 实用程序成功地将静态 IP 地址分配给接口 `enp0s3`。
|
||||
|
||||
以上就是本教程的全部内容,我们已经介绍了在 RHEL 8 系统上为以太网卡配置 IPv4 地址的三种不同方法。请在下面的评论部分分享反馈和评论。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linuxtechi.com/configure-static-ip-address-rhel8/
|
||||
|
||||
作者:[Pradeep Kumar][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[heguangzhi](https://github.com/heguangzhi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.linuxtechi.com/author/pradeep/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Configure-Static-IP-RHEL8.jpg
|
||||
[2]: https://www.linuxtechi.com/wp-content/uploads/2019/09/ifcfg-enp0s3-file-rhel8.jpg
|
||||
[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/nmtui-rhel8.jpg
|
||||
[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Choose-interface-nmtui-rhel8.jpg
|
||||
[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/set-ip-nmtui-rhel8.jpg
|
||||
[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Activate-option-nmtui-rhel8.jpg
|
||||
[7]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Deactivate-interface-nmtui-rhel8.jpg
|
||||
[8]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Activate-interface-nmtui-rhel8.jpg
|
||||
[9]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Quit-Option-nmtui-rhel8.jpg
|
@ -0,0 +1,97 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (qfzy1233)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11359-1.html)
|
||||
[#]: subject: (How to Change Themes in Linux Mint)
|
||||
[#]: via: (https://itsfoss.com/install-themes-linux-mint/)
|
||||
[#]: author: (It's FOSS Community https://itsfoss.com/author/itsfoss/)
|
||||
|
||||
如何在 Linux Mint 中更换主题
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/19/100317ixxp3y1l7lljl47a.jpg)
|
||||
|
||||
一直以来,使用 Cinnamon 桌面环境的 Linux Mint 都是一种卓越的体验。这也是[为何我喜爱 Linux Mint][1]的主要原因之一。
|
||||
|
||||
自从 Mint 的开发团队[开始更为严肃的对待设计][2], “桌面主题” 应用便成为了更换新主题、图标、按钮样式、窗口边框以及鼠标指针的重要方式,当然你也可以直接通过它安装新的主题。感兴趣么?让我们开始吧。
|
||||
|
||||
### 如何在 Linux Mint 中更换主题
|
||||
|
||||
在菜单中搜索主题并打开主题应用。
|
||||
|
||||
![Theme Applet provides an easy way of installing and changing themes][3]
|
||||
|
||||
在应用中有一个“添加/删除”按钮,非常简单吧。点击它,我们可以看到按流行程度排序的 Cinnamon Spices(Cinnamon 的官方插件库)的主题。
|
||||
|
||||
![Installing new themes in Linux Mint Cinnamon][4]
|
||||
|
||||
要安装主题,你所要做的就是点击你喜欢的主题,然后等待它下载。之后,主题将在应用第一页的“Desktop”选项中显示可用。只需双击已安装的主题之一就可以开始使用它。
|
||||
|
||||
![Changing themes in Linux Mint Cinnamon][5]
|
||||
|
||||
下面是默认的 Linux Mint 外观:
|
||||
|
||||
![Linux Mint Default Theme][6]
|
||||
|
||||
这是在我更换主题之后:
|
||||
|
||||
![Linux Mint with Carta Theme][7]
|
||||
|
||||
所有的主题都可以在 Cinnamon Spices 网站上获得更多的信息和更大的截图,这样你就可以更好地了解你的系统的外观。
|
||||
|
||||
- [浏览 Cinnamon 主题][8]
|
||||
|
||||
### 在 Linux Mint 中安装第三方主题
|
||||
|
||||
> “我在另一个网站上看到了这个优异的主题,但 Cinnamon Spices 网站上没有……”
|
||||
|
||||
Cinnamon Spices 集成了许多优秀的主题,但你仍然会发现,你看到的主题并没有被 Cinnamon Spices 官方网站收录。
|
||||
|
||||
这时你可能会想:如果有别的办法就好了,对么?你可能会认为有(我的意思是……当然啦)。首先,我们可以在其他网站上找到一些很酷的主题。
|
||||
|
||||
我推荐你去 Cinnamon Look 浏览一下那儿的主题。如果你喜欢什么,就下载吧。
|
||||
|
||||
- [在 Cinnamon Look 中获取更多主题][9]
|
||||
|
||||
下载了首选主题之后,你现在将得到一个压缩文件,其中包含安装所需的所有内容。提取它并保存到 `~/.themes`。迷糊么? `~` 代表了你的家目录的对应路径:`/home/{YOURUSER}/.themes`。
|
||||
|
||||
然后跳转到你的家目录。按 `Ctrl+H` 来[显示 Linux 中的隐藏文件][11]。如果没有看到 `.themes` 文件夹,创建一个新文件夹并命名为 `.themes`。记住,文件夹名称开头的点很重要。
|
||||
|
||||
将提取的主题文件夹从下载目录复制到你的家目录中的 `.themes` 文件夹中。
|
||||
|
||||
最后,在上面提到的应用中查找已安装的主题。
|
||||
|
||||
> 注记
|
||||
>
|
||||
> 请记住,主题必须是 Cinnamon 相对应的,即使它是一个从 GNOME 复刻的系统也不行,并不是所有的 GNOME 主题都适用于 Cinnamon。
|
||||
|
||||
改变主题是 Cinnamon 定制工作的一部分。你还可以[通过更改图标来更改 Linux Mint 的外观][12]。
|
||||
|
||||
我希望你现在已经知道如何在 Linux Mint 中更改主题了。快去选取你喜欢的主题吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/install-themes-linux-mint/
|
||||
|
||||
作者:[It's FOSS][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://itsfoss.com/author/itsfoss/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/tiny-features-linux-mint-cinnamon/
|
||||
[2]: https://itsfoss.com/linux-mint-new-design/
|
||||
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/install-theme-linux-mint-1.jpg?resize=800%2C625&ssl=1
|
||||
[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/install-theme-linux-mint-2.jpg?resize=800%2C625&ssl=1
|
||||
[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/install-theme-linux-mint-3.jpg?resize=800%2C450&ssl=1
|
||||
[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/linux-mint-default-theme.jpg?resize=800%2C450&ssl=1
|
||||
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/linux-mint-carta-theme.jpg?resize=800%2C450&ssl=1
|
||||
[8]: https://cinnamon-spices.linuxmint.com/themes
|
||||
[9]: https://www.cinnamon-look.org/
|
||||
[10]: https://itsfoss.com/failed-to-start-session-ubuntu-14-04/
|
||||
[11]: https://itsfoss.com/hide-folders-and-show-hidden-files-in-ubuntu-beginner-trick/
|
||||
[12]: https://itsfoss.com/install-icon-linux-mint/
|
@ -1,42 +1,34 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11352-1.html)
|
||||
[#]: subject: (How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script)
|
||||
[#]: via: (https://www.2daygeek.com/linux-get-average-cpu-memory-utilization-from-sar-data-report/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script
|
||||
如何使用 Bash 脚本从 SAR 报告中获取 CPU 和内存使用情况
|
||||
======
|
||||
|
||||
Most Linux administrator monitor system performance with **[SAR report][1]** because it collect performance data for a week.
|
||||
大多数 Linux 管理员使用 [SAR 报告][1]监控系统性能,因为它会收集一周的性能数据。但是,你可以通过更改 `/etc/sysconfig/sysstat` 文件轻松地将其延长到四周。同样,这段时间可以延长一个月以上。如果超过 28,那么日志文件将放在多个目录中,每月一个。
|
||||
|
||||
But you can easily extend this to four weeks by making changes to the “/etc/sysconfig/sysstat” file.
|
||||
要将覆盖期延长至 28 天,请对 `/etc/sysconfig/sysstat` 文件做以下更改。
|
||||
|
||||
Also, this period can be extended beyond one month. If the value exceeds 28, the log files are placed in multiple directories, one for each month.
|
||||
编辑 `sysstat` 文件并将 `HISTORY=7` 更改为 `HISTORY=28`。
|
||||
|
||||
To extend the coverage period to 28 days, make the following change to the “/etc/sysconfig/sysstat” file.
|
||||
在本文中,我们添加了三个 bash 脚本,它们可以帮助你在一个地方轻松查看每个数据文件的平均值。
|
||||
|
||||
Edit the sysstat file and change HISTORY=7 to HISTORY=28.
|
||||
我们过去加过许多有用的 shell 脚本。如果你想查看它们,请进入下面的链接。
|
||||
|
||||
In this article we have added three bash scripts that will help you to easily view each data file averages in one place.
|
||||
* [如何使用 shell 脚本自动化日常操作][2]
|
||||
|
||||
We have added many useful shell scripts in the past. If you want to check out that collection, go to the link below.
|
||||
这些脚本简单明了。出于测试目的,我们仅包括两个性能指标,即 CPU 和内存。你可以修改脚本中的其他性能指标以满足你的需求。
|
||||
|
||||
* **[How to automate daily operations using shell script][2]**
|
||||
### 脚本 1:从 SAR 报告中获取平均 CPU 利用率的 Bash 脚本
|
||||
|
||||
该 bash 脚本从每个数据文件中收集 CPU 平均值并将其显示在一个页面上。
|
||||
|
||||
|
||||
These scripts are simple and straightforward. For testing purposes, we have included only two performance metrics, namely CPU and memory.
|
||||
|
||||
You can modify other performance metrics in the script to suit your needs.
|
||||
|
||||
### Script-1: Bash Script to Get Average CPU Utilization from SAR Reports
|
||||
|
||||
This bash script collects the CPU average from each data file and display it on one page.
|
||||
|
||||
Since this is a month end, it shows 28 days data for August 2019.
|
||||
由于是月末,它显示了 2019 年 8 月的 28 天数据。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/sar-cpu-avg.sh
|
||||
@ -48,21 +40,16 @@ echo "|Average: CPU %user %nice %system %iowait %steal
|
||||
echo "+----------------------------------------------------------------------------------+"
|
||||
|
||||
for file in `ls -tr /var/log/sa/sa* | grep -v sar`
|
||||
|
||||
do
|
||||
|
||||
dat=`sar -f $file | head -n 1 | awk '{print $4}'`
|
||||
|
||||
echo -n $dat
|
||||
|
||||
sar -f $file | grep -i Average | sed "s/Average://"
|
||||
|
||||
dat=`sar -f $file | head -n 1 | awk '{print $4}'`
|
||||
echo -n $dat
|
||||
sar -f $file | grep -i Average | sed "s/Average://"
|
||||
done
|
||||
|
||||
echo "+----------------------------------------------------------------------------------+"
|
||||
```
|
||||
|
||||
Once you run the script, you will get an output like the one below.
|
||||
运行脚本后,你将看到如下输出。
|
||||
|
||||
```
|
||||
# sh /opt/scripts/sar-cpu-avg.sh
|
||||
@ -88,11 +75,11 @@ Once you run the script, you will get an output like the one below.
|
||||
+----------------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
### Script-2: Bash Script to Get Average Memory Utilization from SAR Reports
|
||||
### 脚本 2:从 SAR 报告中获取平均内存利用率的 Bash 脚本
|
||||
|
||||
This bash script will collect memory averages from each data file and display it on one page.
|
||||
该 bash 脚本从每个数据文件中收集内存平均值并将其显示在一个页面上。
|
||||
|
||||
Since this is a month end, it shows 28 days data for August 2019.
|
||||
由于是月末,它显示了 2019 年 8 月的 28 天数据。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/sar-memory-avg.sh
|
||||
@ -104,21 +91,16 @@ echo "|Average: kbmemfree kbmemused %memused kbbuffers kbcached kbcommit
|
||||
echo "+-------------------------------------------------------------------------------------------------------------------+"
|
||||
|
||||
for file in `ls -tr /var/log/sa/sa* | grep -v sar`
|
||||
|
||||
do
|
||||
|
||||
dat=`sar -f $file | head -n 1 | awk '{print $4}'`
|
||||
|
||||
echo -n $dat
|
||||
|
||||
sar -r -f $file | grep -i Average | sed "s/Average://"
|
||||
|
||||
dat=`sar -f $file | head -n 1 | awk '{print $4}'`
|
||||
echo -n $dat
|
||||
sar -r -f $file | grep -i Average | sed "s/Average://"
|
||||
done
|
||||
|
||||
echo "+-------------------------------------------------------------------------------------------------------------------+"
|
||||
```
|
||||
|
||||
Once you run the script, you will get an output like the one below.
|
||||
运行脚本后,你将看到如下输出。
|
||||
|
||||
```
|
||||
# sh /opt/scripts/sar-memory-avg.sh
|
||||
@ -144,11 +126,11 @@ Once you run the script, you will get an output like the one below.
|
||||
+-------------------------------------------------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
### Script-3: Bash Script to Get Average CPU & Memory Utilization from SAR Reports
|
||||
### 脚本 3:从 SAR 报告中获取 CPU 和内存平均利用率的 Bash 脚本
|
||||
|
||||
This bash script collects the CPU & memory averages from each data file and displays them on a page.
|
||||
该 bash 脚本从每个数据文件中收集 CPU 和内存平均值并将其显示在一个页面上。
|
||||
|
||||
This bash script is slightly different compared to the above script. It shows the average of both (CPU & Memory) in one location, not the other data.
|
||||
该脚本与上面相比稍微不同。它在同一位置同时显示两者(CPU 和内存)平均值,而不是其他数据。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/sar-cpu-mem-avg.sh
|
||||
@ -156,23 +138,16 @@ This bash script is slightly different compared to the above script. It shows th
|
||||
#!/bin/bash
|
||||
|
||||
for file in `ls -tr /var/log/sa/sa* | grep -v sar`
|
||||
|
||||
do
|
||||
|
||||
sar -f $file | head -n 1 | awk '{print $4}'
|
||||
|
||||
echo "-----------"
|
||||
|
||||
sar -u -f $file | awk '/Average:/{printf("CPU Average: %.2f%\n"), 100 - $8}'
|
||||
|
||||
sar -r -f $file | awk '/Average:/{printf("Memory Average: %.2f%\n"),(($3-$5-$6)/($2+$3)) * 100 }'
|
||||
|
||||
printf "\n"
|
||||
|
||||
sar -f $file | head -n 1 | awk '{print $4}'
|
||||
echo "-----------"
|
||||
sar -u -f $file | awk '/Average:/{printf("CPU Average: %.2f%\n"), 100 - $8}'
|
||||
sar -r -f $file | awk '/Average:/{printf("Memory Average: %.2f%\n"),(($3-$5-$6)/($2+$3)) * 100 }'
|
||||
printf "\n"
|
||||
done
|
||||
```
|
||||
|
||||
Once you run the script, you will get an output like the one below.
|
||||
运行脚本后,你将看到如下输出。
|
||||
|
||||
```
|
||||
# sh /opt/scripts/sar-cpu-mem-avg.sh
|
||||
@ -221,8 +196,8 @@ via: https://www.2daygeek.com/linux-get-average-cpu-memory-utilization-from-sar-
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,96 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11346-1.html)
|
||||
[#]: subject: (Great News! Firefox 69 Blocks Third-Party Cookies, Autoplay Videos & Cryptominers by Default)
|
||||
[#]: via: (https://itsfoss.com/firefox-69/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
Firefox 69 默认阻拦第三方 Cookie、自动播放的视频和加密矿工
|
||||
======
|
||||
|
||||
如果你使用的是 [Mozilla Firefox][1] 并且尚未更新到最新版本,那么你将错过许多新的重要功能。
|
||||
|
||||
### Firefox 69 版本中的一些新功能
|
||||
|
||||
首先,Mozilla Firefox 69 会默认强制执行更强大的安全和隐私选项。以下是新版本的一些主要亮点。
|
||||
|
||||
#### Firefox 69 阻拦视频自动播放
|
||||
|
||||
![][2]
|
||||
|
||||
现在很多网站都提供了自动播放视频。无论是弹出视频还是嵌入在文章中设置为自动播放的视频,默认情况下,Firefox 69 都会阻止它(或者可能会提示你)。
|
||||
|
||||
这个[阻拦自动播放][3]功能可让用户自动阻止任何视频播放。
|
||||
|
||||
#### 禁止第三方跟踪 cookie
|
||||
|
||||
默认情况下,作为<ruby>增强型跟踪保护<rt>Enhanced Tracking Protection</rt></ruby>功能的一部分,它现在将阻止第三方跟踪 Cookie 和加密矿工。这是 Mozilla Firefox 的增强隐私保护功能的非常有用的改变。
|
||||
|
||||
Cookie 有两种:第一方的和第三方的。第一方 cookie 由网站本身拥有。这些是“好的 cookie”,可以让你保持登录、记住你的密码或输入字段等来改善浏览体验。第三方 cookie 由你访问的网站以外的域所有。广告服务器使用这些 Cookie 来跟踪你,并在你访问的所有网站上跟踪广告。Firefox 69 旨在阻止这些。
|
||||
|
||||
当它发挥作用时,你将在地址栏中看到盾牌图标。你可以选择为特定网站禁用它。
|
||||
|
||||
![Firefox Blocking Tracking][4]
|
||||
|
||||
#### 禁止加密矿工消耗你的 CPU
|
||||
|
||||
![][5]
|
||||
|
||||
对加密货币的欲望一直困扰着这个世界。GPU 的价格已经高企,因为专业的加密矿工们使用它们来挖掘加密货币。
|
||||
|
||||
人们使用工作场所的计算机秘密挖掘加密货币。当我说工作场所时,我不一定是指 IT 公司。就在今年,[人们在乌克兰的一家核电站抓住了偷挖加密货币的活动][6]。
|
||||
|
||||
不仅如此。如果你访问某些网站,他们会运行脚本并使用你的计算机的 CPU 来挖掘加密货币。这在 IT 术语中被称为 <ruby>[挖矿攻击][7]<rt>cryptojacking</rt></ruby>。
|
||||
|
||||
好消息是 Firefox 69 会自动阻止这些加密矿工脚本。因此,网站不再能利用你的系统资源进行挖矿攻击了。
|
||||
|
||||
#### Firefox 69 带来的更强隐私保护
|
||||
|
||||
![][8]
|
||||
|
||||
如果你把隐私保护设置得更严格,那么它也会阻止指纹。因此,当你在 Firefox 69 中选择严格的隐私设置时,你不必担心通过[指纹][9]共享计算机的配置信息。
|
||||
|
||||
在[关于这次发布的官方博客文章][10]中,Mozilla 提到,在此版本中,他们希望默认情况下为 100% 的用户提供保护。
|
||||
|
||||
#### 性能改进
|
||||
|
||||
尽管在更新日志中没有提及 Linux,但它提到了在 Windows 10/mac OS 上运行性能、UI 和电池寿命有所改进。如果你发现任何性能改进,请在评论中提及。
|
||||
|
||||
### 总结
|
||||
|
||||
除了所有这些之外,还有很多底层的改进。你可以查看[发行说明][11]中的详细信息。
|
||||
|
||||
Firefox 69 对于关注其隐私的用户来说是一个令人印象深刻的更新。与我们最近对某些[安全电子邮件服务][12]的建议类似,我们建议你更新浏览器以充分受益。新版本已在大多数 Linux 发行版中提供,你只需要更新你的系统即可。
|
||||
|
||||
如果你对阻止广告和跟踪 Cookie 的浏览器感兴趣,请尝试[开源的 Brave 浏览器][13],他们甚至给你提供了加密货币以让你使用他们的浏览器,你可以使用这些加密货币来奖励你最喜爱的发布商。
|
||||
|
||||
你觉得这个版本怎么样?请在下面的评论中告诉我们你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/firefox-69/
|
||||
|
||||
作者:[Ankush Das][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://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/why-firefox/
|
||||
[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/auto-block-firefox.png?ssl=1
|
||||
[3]: https://support.mozilla.org/en-US/kb/block-autoplay
|
||||
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/firefox-blocking-tracking.png?ssl=1
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/firefox-shield.png?ssl=1
|
||||
[6]: https://thenextweb.com/hardfork/2019/08/22/ukrainian-nuclear-powerplant-mine-cryptocurrency-state-secrets/
|
||||
[7]: https://hackernoon.com/cryptojacking-in-2019-is-not-dead-its-evolving-984b97346d16
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/firefox-secure.jpg?ssl=1
|
||||
[9]: https://clearcode.cc/blog/device-fingerprinting/
|
||||
[10]: https://blog.mozilla.org/blog/2019/09/03/todays-firefox-blocks-third-party-tracking-cookies-and-cryptomining-by-default/
|
||||
[11]: https://www.mozilla.org/en-US/firefox/69.0/releasenotes/
|
||||
[12]: https://itsfoss.com/secure-private-email-services/
|
||||
[13]: https://itsfoss.com/brave-web-browser/
|
@ -0,0 +1,69 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11374-1.html)
|
||||
[#]: subject: (How to put an HTML page on the internet)
|
||||
[#]: via: (https://jvns.ca/blog/2019/09/06/how-to-put-an-html-page-on-the-internet/)
|
||||
[#]: author: (Julia Evans https://jvns.ca/)
|
||||
|
||||
如何在互联网放置 HTML 页面
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/22/234957mmzoie1imufsuwea.jpg)
|
||||
|
||||
我喜欢互联网的一点是在互联网放置静态页面是如此简单。今天有人问我该怎么做,所以我想我会快速地写下来!
|
||||
|
||||
### 只是一个 HTML 页面
|
||||
|
||||
我的所有网站都只是静态 HTML 和 CSS。我的网页设计技巧相对不高(<https://wizardzines.com> 是我自己开发的最复杂的网站),因此保持我所有的网站相对简单意味着我可以做一些改变/修复,而不会花费大量时间。
|
||||
|
||||
因此,我们将在此文章中采用尽可能简单的方式 —— 只需一个 HTML 页面。
|
||||
|
||||
### HTML 页面
|
||||
|
||||
我们要放在互联网上的网站只是一个名为 `index.html` 的文件。你可以在 <https://github.com/jvns/website-example> 找到它,它是一个 Github 仓库,其中只包含一个文件。
|
||||
|
||||
HTML 文件中包含一些 CSS,使其看起来不那么无聊,部分复制自 <https://example.com>。
|
||||
|
||||
### 如何将 HTML 页面放在互联网上
|
||||
|
||||
有以下几步:
|
||||
|
||||
1. 注册 [Neocities][1] 帐户
|
||||
2. 将 index.html 复制到你自己 neocities 站点的 index.html 中
|
||||
3. 完成
|
||||
|
||||
上面的 `index.html` 页面位于 [julia-example-website.neocities.com][2] 中,如果你查看源代码,你将看到它与 github 仓库中的 HTML 相同。
|
||||
|
||||
我认为这可能是将 HTML 页面放在互联网上的最简单的方法(这是一次回归 Geocities,它是我在 2003 年制作我的第一个网站的方式):)。我也喜欢 Neocities (像 [glitch][3],我也喜欢)它能实验、学习,并有乐趣。
|
||||
|
||||
### 其他选择
|
||||
|
||||
这绝不是唯一简单的方式,在你推送 Git 仓库时,Github pages 和 Gitlab pages 以及 Netlify 都将会自动发布站点,并且它们都非常易于使用(只需将它们连接到你的 GitHub 仓库即可)。我个人使用 Git 仓库的方式,因为 Git 不会让我感到紧张,我想知道我实际推送的页面发生了什么更改。但我想你如果第一次只想将 HTML/CSS 制作的站点放到互联网上,那么 Neocities 就是一个非常好的方法。
|
||||
|
||||
如果你不只是玩,而是要将网站用于真实用途,那么你或许会需要买一个域名,以便你将来可以更改托管服务提供商,但这有点不那么简单。
|
||||
|
||||
### 这是学习 HTML 的一个很好的起点
|
||||
|
||||
如果你熟悉在 Git 中编辑文件,同时想练习 HTML/CSS 的话,我认为将它放在网站中是一个有趣的方式!我真的很喜欢它的简单性 —— 实际上这只有一个文件,所以没有其他花哨的东西需要去理解。
|
||||
|
||||
还有很多方法可以复杂化/扩展它,比如这个博客实际上是用 [Hugo][4] 生成的,它生成了一堆 HTML 文件并放在网络中,但从基础开始总是不错的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://jvns.ca/blog/2019/09/06/how-to-put-an-html-page-on-the-internet/
|
||||
|
||||
作者:[Julia Evans][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://jvns.ca/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://neocities.org/
|
||||
[2]: https://julia-example-website.neocities.org/
|
||||
[3]: https://glitch.com
|
||||
[4]: https://gohugo.io/
|
63
published/201909/20190909 Firefox 69 available in Fedora.md
Normal file
63
published/201909/20190909 Firefox 69 available in Fedora.md
Normal file
@ -0,0 +1,63 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11354-1.html)
|
||||
[#]: subject: (Firefox 69 available in Fedora)
|
||||
[#]: via: (https://fedoramagazine.org/firefox-69-available-in-fedora/)
|
||||
[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
|
||||
|
||||
Firefox 69 已可在 Fedora 中获取
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
当你安装 Fedora Workstation 时,你会发现它包括了世界知名的 Firefox 浏览器。 Mozilla 基金会以开发 Firefox 以及其他促进开放、安全和隐私的互联网项目为己任。Firefox 有快速的浏览引擎和大量的隐私功能。
|
||||
|
||||
开发者社区不断改进和增强 Firefox。最新版本 Firefox 69 于最近发布,你可在稳定版 Fedora 系统(30 及更高版本)中获取它。继续阅读以获得更多详情。
|
||||
|
||||
### Firefox 69 中的新功能
|
||||
|
||||
最新版本的 Firefox 包括<ruby>[增强跟踪保护][2]<rt>Enhanced Tracking Protection</rt></ruby>(ETP)。当你使用带有新(或重置)配置文件的 Firefox 69 时,浏览器会使网站更难以跟踪你的信息或滥用你的计算机资源。
|
||||
|
||||
例如,不太正直的网站使用脚本让你的系统进行大量计算来产生加密货币,这称为<ruby>[加密挖矿][3]<rt>cryptomining</rt></ruby>。加密挖矿在你不知情或未经许可的情况下发生,因此是对你的系统的滥用。Firefox 69 中的新标准设置可防止网站遭受此类滥用。
|
||||
|
||||
Firefox 69 还有其他设置,可防止识别或记录你的浏览器指纹,以供日后使用。这些改进为你提供了额外的保护,免于你的活动被在线追踪。
|
||||
|
||||
另一个常见的烦恼是在没有提示的情况下播放视频。视频播放也会占用更多的 CPU,你可能不希望未经许可就在你的笔记本上发生这种情况。Firefox 使用<ruby>[阻止自动播放][4]<rt>Block Autoplay</rt></ruby>这个功能阻止了这种情况的发生。而 Firefox 69 还允许你停止静默开始播放的视频。此功能可防止不必要的突然的噪音。它还解决了更多真正的问题 —— 未经许可使用计算机资源。
|
||||
|
||||
新版本中还有许多其他新功能。在 [Firefox 发行说明][5]中阅读有关它们的更多信息。
|
||||
|
||||
### 如何获得更新
|
||||
|
||||
Firefox 69 存在于稳定版 Fedora 30、预发布版 Fedora 31 和 Rawhide 仓库中。该更新由 Fedora 的 Firefox 包维护者提供。维护人员还确保更新了 Mozilla 的网络安全服务(nss 包)。我们感谢 Mozilla 项目和 Firefox 社区在提供此新版本方面的辛勤工作。
|
||||
|
||||
如果你使用的是 Fedora 30 或更高版本,请在 Fedora Workstation 上使用*软件中心*,或在任何 Fedora 系统上运行以下命令:
|
||||
|
||||
```
|
||||
$ sudo dnf --refresh upgrade firefox
|
||||
```
|
||||
|
||||
如果你使用的是 Fedora 29,请[帮助测试更新][6],这样它可以变得稳定,让所有用户可以轻松使用。
|
||||
|
||||
Firefox 可能会提示你升级个人设置以使用新设置。要使用新功能,你应该这样做。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/firefox-69-available-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/09/firefox-v69-816x345.jpg
|
||||
[2]: https://blog.mozilla.org/blog/2019/09/03/todays-firefox-blocks-third-party-tracking-cookies-and-cryptomining-by-default/
|
||||
[3]: https://www.webopedia.com/TERM/C/cryptocurrency-mining.html
|
||||
[4]: https://support.mozilla.org/kb/block-autoplay
|
||||
[5]: https://www.mozilla.org/en-US/firefox/69.0/releasenotes/
|
||||
[6]: https://bodhi.fedoraproject.org/updates/FEDORA-2019-89ae5bb576
|
@ -0,0 +1,462 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (heguangzhi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11394-1.html)
|
||||
[#]: subject: (How to Setup Multi Node Elastic Stack Cluster on RHEL 8 / CentOS 8)
|
||||
[#]: via: (https://www.linuxtechi.com/setup-multinode-elastic-stack-cluster-rhel8-centos8/)
|
||||
[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
|
||||
|
||||
如何在 RHEL8 /CentOS8 上建立多节点 Elastic stack 集群
|
||||
======
|
||||
|
||||
|
||||
Elastic stack 俗称 ELK stack,是一组包括 Elasticsearch、Logstash 和 Kibana 在内的开源产品。Elastic Stack 由 Elastic 公司开发和维护。使用 Elastic stack,可以将系统日志发送到 Logstash,它是一个数据收集引擎,接受来自可能任何来源的日志或数据,并对日志进行归一化,然后将日志转发到 Elasticsearch,用于分析、索引、搜索和存储,最后使用 Kibana 表示为可视化数据,使用 Kibana,我们还可以基于用户的查询创建交互式图表。
|
||||
|
||||
![Elastic-Stack-Cluster-RHEL8-CentOS8][2]
|
||||
|
||||
在本文中,我们将演示如何在 RHEL 8 / CentOS 8 服务器上设置多节点 elastic stack 集群。以下是我的 Elastic Stack 集群的详细信息:
|
||||
|
||||
**Elasticsearch:**
|
||||
|
||||
* 三台服务器,最小化安装 RHEL 8 / CentOS 8
|
||||
* IP & 主机名 – 192.168.56.40(`elasticsearch1.linuxtechi.local`)、192.168.56.50 (`elasticsearch2.linuxtechi.local`)、192.168.56.60(elasticsearch3.linuxtechi.local`)
|
||||
|
||||
Logstash:**
|
||||
|
||||
* 两台服务器,最小化安装 RHEL 8 / CentOS 8
|
||||
* IP & 主机 – 192.168.56.20(`logstash1.linuxtechi.local`)、192.168.56.30(`logstash2.linuxtechi.local`)
|
||||
|
||||
**Kibana:**
|
||||
|
||||
* 一台服务器,最小化安装 RHEL 8 / CentOS 8
|
||||
* IP & 主机名 – 192.168.56.10(`kibana.linuxtechi.local`)
|
||||
|
||||
**Filebeat:**
|
||||
|
||||
* 一台服务器,最小化安装 CentOS 7
|
||||
* IP & 主机名 – 192.168.56.70(`web-server`)
|
||||
|
||||
让我们从设置 Elasticsearch 集群开始,
|
||||
|
||||
### 设置3个节点 Elasticsearch 集群
|
||||
|
||||
正如我已经说过的,设置 Elasticsearch 集群的节点,登录到每个节点,设置主机名并配置 yum/dnf 库。
|
||||
|
||||
使用命令 `hostnamectl` 设置各个节点上的主机名:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch1.linuxtechi. local"
|
||||
[root@linuxtechi ~]# exec bash
|
||||
[root@linuxtechi ~]#
|
||||
[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch2.linuxtechi. local"
|
||||
[root@linuxtechi ~]# exec bash
|
||||
[root@linuxtechi ~]#
|
||||
[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch3.linuxtechi. local"
|
||||
[root@linuxtechi ~]# exec bash
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
对于 CentOS 8 系统,我们不需要配置任何操作系统包库,对于 RHEL 8 服务器,如果你有有效订阅,那么用红帽订阅以获得包存储库就可以了。如果你想为操作系统包配置本地 yum/dnf 存储库,请参考以下网址:
|
||||
|
||||
- [如何使用 DVD 或 ISO 文件在 RHEL 8 服务器上设置本地 Yum / DNF 存储库][3]
|
||||
|
||||
在所有节点上配置 Elasticsearch 包存储库,在 `/etc/yum.repo.d/` 文件夹下创建一个包含以下内容的 `elastic.repo` 文件:
|
||||
|
||||
```
|
||||
~]# vi /etc/yum.repos.d/elastic.repo
|
||||
|
||||
[elasticsearch-7.x]
|
||||
name=Elasticsearch repository for 7.x packages
|
||||
baseurl=https://artifacts.elastic.co/packages/7.x/yum
|
||||
gpgcheck=1
|
||||
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
enabled=1
|
||||
autorefresh=1
|
||||
type=rpm-md
|
||||
```
|
||||
|
||||
保存文件并退出。
|
||||
|
||||
在所有三个节点上使用 `rpm` 命令导入 Elastic 公共签名密钥。
|
||||
|
||||
```
|
||||
~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
```
|
||||
|
||||
在所有三个节点的 `/etc/hosts` 文件中添加以下行:
|
||||
|
||||
```
|
||||
192.168.56.40 elasticsearch1.linuxtechi.local
|
||||
192.168.56.50 elasticsearch2.linuxtechi.local
|
||||
192.168.56.60 elasticsearch3.linuxtechi.local
|
||||
```
|
||||
|
||||
使用 `yum`/`dnf` 命令在所有三个节点上安装 Java:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# dnf install java-openjdk -y
|
||||
[root@linuxtechi ~]# dnf install java-openjdk -y
|
||||
[root@linuxtechi ~]# dnf install java-openjdk -y
|
||||
```
|
||||
|
||||
使用 `yum`/`dnf` 命令在所有三个节点上安装 Elasticsearch:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# dnf install elasticsearch -y
|
||||
[root@linuxtechi ~]# dnf install elasticsearch -y
|
||||
[root@linuxtechi ~]# dnf install elasticsearch -y
|
||||
```
|
||||
|
||||
**注意:** 如果操作系统防火墙已启用并在每个 Elasticsearch 节点中运行,则使用 `firewall-cmd` 命令允许以下端口开放:
|
||||
|
||||
```
|
||||
~]# firewall-cmd --permanent --add-port=9300/tcp
|
||||
~]# firewall-cmd --permanent --add-port=9200/tcp
|
||||
~]# firewall-cmd --reload
|
||||
```
|
||||
|
||||
配置 Elasticsearch, 在所有节点上编辑文件 `/etc/elasticsearch/elasticsearch.yml` 并加入以下内容:
|
||||
|
||||
```
|
||||
~]# vim /etc/elasticsearch/elasticsearch.yml
|
||||
|
||||
cluster.name: opn-cluster
|
||||
node.name: elasticsearch1.linuxtechi.local
|
||||
network.host: 192.168.56.40
|
||||
http.port: 9200
|
||||
discovery.seed_hosts: ["elasticsearch1.linuxtechi.local", "elasticsearch2.linuxtechi.local", "elasticsearch3.linuxtechi.local"]
|
||||
cluster.initial_master_nodes: ["elasticsearch1.linuxtechi.local", "elasticsearch2.linuxtechi.local", "elasticsearch3.linuxtechi.local"]
|
||||
```
|
||||
|
||||
**注意:** 在每个节点上,在 `node.name` 中填写正确的主机名,在 `network.host` 中填写正确的 IP 地址,其他参数保持不变。
|
||||
|
||||
现在使用 `systemctl` 命令在所有三个节点上启动并启用 Elasticsearch 服务:
|
||||
|
||||
```
|
||||
~]# systemctl daemon-reload
|
||||
~]# systemctl enable elasticsearch.service
|
||||
~]# systemctl start elasticsearch.service
|
||||
```
|
||||
|
||||
使用下面 `ss` 命令验证 elasticsearch 节点是否开始监听 9200 端口:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# ss -tunlp | grep 9200
|
||||
tcp LISTEN 0 128 [::ffff:192.168.56.40]:9200 *:* users:(("java",pid=2734,fd=256))
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
使用以下 `curl` 命令验证 Elasticsearch 群集状态:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# curl http://elasticsearch1.linuxtechi.local:9200
|
||||
[root@linuxtechi ~]# curl -X GET http://elasticsearch2.linuxtechi.local:9200/_cluster/health?pretty
|
||||
```
|
||||
|
||||
命令的输出如下所示:
|
||||
|
||||
![Elasticsearch-cluster-status-rhel8][3]
|
||||
|
||||
以上输出表明我们已经成功创建了 3 节点的 Elasticsearch 集群,集群的状态也是绿色的。
|
||||
|
||||
**注意:** 如果你想修改 JVM 堆大小,那么你可以编辑了文件 `/etc/elasticsearch/jvm.options`,并根据你的环境更改以下参数:
|
||||
|
||||
* `-Xms1g`
|
||||
* `-Xmx1g`
|
||||
|
||||
现在让我们转到 Logstash 节点。
|
||||
|
||||
### 安装和配置 Logstash
|
||||
|
||||
在两个 Logstash 节点上执行以下步骤。
|
||||
|
||||
登录到两个节点使用 `hostnamectl` 命令设置主机名:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# hostnamectl set-hostname "logstash1.linuxtechi.local"
|
||||
[root@linuxtechi ~]# exec bash
|
||||
[root@linuxtechi ~]#
|
||||
[root@linuxtechi ~]# hostnamectl set-hostname "logstash2.linuxtechi.local"
|
||||
[root@linuxtechi ~]# exec bash
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
在两个 logstash 节点的 `/etc/hosts` 文件中添加以下条目:
|
||||
|
||||
```
|
||||
~]# vi /etc/hosts
|
||||
192.168.56.40 elasticsearch1.linuxtechi.local
|
||||
192.168.56.50 elasticsearch2.linuxtechi.local
|
||||
192.168.56.60 elasticsearch3.linuxtechi.local
|
||||
```
|
||||
|
||||
保存文件并退出。
|
||||
|
||||
在两个节点上配置 Logstash 存储库,在文件夹 `/ete/yum.repo.d/` 下创建一个包含以下内容的文件 `logstash.repo`:
|
||||
|
||||
```
|
||||
~]# vi /etc/yum.repos.d/logstash.repo
|
||||
|
||||
[elasticsearch-7.x]
|
||||
name=Elasticsearch repository for 7.x packages
|
||||
baseurl=https://artifacts.elastic.co/packages/7.x/yum
|
||||
gpgcheck=1
|
||||
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
enabled=1
|
||||
autorefresh=1
|
||||
type=rpm-md
|
||||
```
|
||||
|
||||
保存并退出文件,运行 `rpm` 命令导入签名密钥:
|
||||
|
||||
```
|
||||
~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
```
|
||||
|
||||
使用 `yum`/`dnf` 命令在两个节点上安装 Java OpenJDK:
|
||||
|
||||
```
|
||||
~]# dnf install java-openjdk -y
|
||||
```
|
||||
|
||||
从两个节点运行 `yum`/`dnf` 命令来安装 logstash:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# dnf install logstash -y
|
||||
[root@linuxtechi ~]# dnf install logstash -y
|
||||
```
|
||||
|
||||
现在配置 logstash,在两个 logstash 节点上执行以下步骤,创建一个 logstash 配置文件,首先我们在 `/etc/logstash/conf.d/` 下复制 logstash 示例文件:
|
||||
|
||||
```
|
||||
# cd /etc/logstash/
|
||||
# cp logstash-sample.conf conf.d/logstash.conf
|
||||
```
|
||||
|
||||
编辑配置文件并更新以下内容:
|
||||
|
||||
```
|
||||
# vi conf.d/logstash.conf
|
||||
|
||||
input {
|
||||
beats {
|
||||
port => 5044
|
||||
}
|
||||
}
|
||||
|
||||
output {
|
||||
elasticsearch {
|
||||
hosts => ["http://elasticsearch1.linuxtechi.local:9200", "http://elasticsearch2.linuxtechi.local:9200", "http://elasticsearch3.linuxtechi.local:9200"]
|
||||
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
|
||||
#user => "elastic"
|
||||
#password => "changeme"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
在 `output` 部分之下,在 `hosts` 参数中指定所有三个 Elasticsearch 节点的 FQDN,其他参数保持不变。
|
||||
|
||||
使用 `firewall-cmd` 命令在操作系统防火墙中允许 logstash 端口 “5044”:
|
||||
|
||||
```
|
||||
~ # firewall-cmd --permanent --add-port=5044/tcp
|
||||
~ # firewall-cmd –reload
|
||||
```
|
||||
|
||||
现在,在每个节点上运行以下 `systemctl` 命令,启动并启用 Logstash 服务:
|
||||
|
||||
```
|
||||
~]# systemctl start logstash
|
||||
~]# systemctl eanble logstash
|
||||
```
|
||||
|
||||
使用 `ss` 命令验证 logstash 服务是否开始监听 5044 端口:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# ss -tunlp | grep 5044
|
||||
tcp LISTEN 0 128 *:5044 *:* users:(("java",pid=2416,fd=96))
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
以上输出表明 logstash 已成功安装和配置。让我们转到 Kibana 安装。
|
||||
|
||||
### 安装和配置 Kibana
|
||||
|
||||
登录 Kibana 节点,使用 `hostnamectl` 命令设置主机名:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# hostnamectl set-hostname "kibana.linuxtechi.local"
|
||||
[root@linuxtechi ~]# exec bash
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
编辑 `/etc/hosts` 文件并添加以下行:
|
||||
|
||||
```
|
||||
192.168.56.40 elasticsearch1.linuxtechi.local
|
||||
192.168.56.50 elasticsearch2.linuxtechi.local
|
||||
192.168.56.60 elasticsearch3.linuxtechi.local
|
||||
```
|
||||
|
||||
使用以下命令设置 Kibana 存储库:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# vi /etc/yum.repos.d/kibana.repo
|
||||
[elasticsearch-7.x]
|
||||
name=Elasticsearch repository for 7.x packages
|
||||
baseurl=https://artifacts.elastic.co/packages/7.x/yum
|
||||
gpgcheck=1
|
||||
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
enabled=1
|
||||
autorefresh=1
|
||||
type=rpm-md
|
||||
|
||||
[root@linuxtechi ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
|
||||
```
|
||||
|
||||
执行 `yum`/`dnf` 命令安装 kibana:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# yum install kibana -y
|
||||
```
|
||||
|
||||
通过编辑 `/etc/kibana/kibana.yml` 文件,配置 Kibana:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# vim /etc/kibana/kibana.yml
|
||||
…………
|
||||
server.host: "kibana.linuxtechi.local"
|
||||
server.name: "kibana.linuxtechi.local"
|
||||
elasticsearch.hosts: ["http://elasticsearch1.linuxtechi.local:9200", "http://elasticsearch2.linuxtechi.local:9200", "http://elasticsearch3.linuxtechi.local:9200"]
|
||||
…………
|
||||
```
|
||||
|
||||
启用并启动 kibana 服务:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# systemctl start kibana
|
||||
[root@linuxtechi ~]# systemctl enable kibana
|
||||
```
|
||||
|
||||
在系统防火墙上允许 Kibana 端口 “5601”:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# firewall-cmd --permanent --add-port=5601/tcp
|
||||
success
|
||||
[root@linuxtechi ~]# firewall-cmd --reload
|
||||
success
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
使用以下 URL 访问 Kibana 界面:<http://kibana.linuxtechi.local:5601>
|
||||
|
||||
![Kibana-Dashboard-rhel8][4]
|
||||
|
||||
从面板上,我们可以检查 Elastic Stack 集群的状态。
|
||||
|
||||
![Stack-Monitoring-Overview-RHEL8][5]
|
||||
|
||||
这证明我们已经在 RHEL 8 /CentOS 8 上成功地安装并设置了多节点 Elastic Stack 集群。
|
||||
|
||||
现在让我们通过 `filebeat` 从其他 Linux 服务器发送一些日志到 logstash 节点中,在我的例子中,我有一个 CentOS 7服务器,我将通过 `filebeat` 将该服务器的所有重要日志推送到 logstash。
|
||||
|
||||
登录到 CentOS 7 服务器使用 yum/rpm 命令安装 filebeat 包:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# rpm -ivh https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
|
||||
Retrieving https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
|
||||
Preparing... ################################# [100%]
|
||||
Updating / installing...
|
||||
1:filebeat-7.3.1-1 ################################# [100%]
|
||||
[root@linuxtechi ~]#
|
||||
```
|
||||
|
||||
编辑 `/etc/hosts` 文件并添加以下内容:
|
||||
|
||||
```
|
||||
192.168.56.20 logstash1.linuxtechi.local
|
||||
192.168.56.30 logstash2.linuxtechi.local
|
||||
```
|
||||
|
||||
现在配置 `filebeat`,以便它可以使用负载平衡技术向 logstash 节点发送日志,编辑文件 `/etc/filebeat/filebeat.yml`,并添加以下参数:
|
||||
|
||||
在 `filebeat.inputs:` 部分将 `enabled: false` 更改为 `enabled: true`,并在 `paths` 参数下指定我们可以发送到 logstash 的日志文件的位置;注释掉 `output.elasticsearch` 和 `host` 参数;删除 `output.logstash:` 和 `hosts:` 的注释,并在 `hosts` 参数添加两个 logstash 节点,以及设置 `loadbalance: true`。
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# vi /etc/filebeat/filebeat.yml
|
||||
|
||||
filebeat.inputs:
|
||||
- type: log
|
||||
enabled: true
|
||||
paths:
|
||||
- /var/log/messages
|
||||
- /var/log/dmesg
|
||||
- /var/log/maillog
|
||||
- /var/log/boot.log
|
||||
#output.elasticsearch:
|
||||
# hosts: ["localhost:9200"]
|
||||
|
||||
output.logstash:
|
||||
hosts: ["logstash1.linuxtechi.local:5044", "logstash2.linuxtechi.local:5044"]
|
||||
loadbalance: true
|
||||
```
|
||||
|
||||
使用下面的 2 个 `systemctl` 命令 启动并启用 `filebeat` 服务:
|
||||
|
||||
```
|
||||
[root@linuxtechi ~]# systemctl start filebeat
|
||||
[root@linuxtechi ~]# systemctl enable filebeat
|
||||
```
|
||||
|
||||
现在转到 Kibana 用户界面,验证新索引是否可见。
|
||||
|
||||
从左侧栏中选择管理选项,然后单击 Elasticsearch 下的索引管理:
|
||||
|
||||
![Elasticsearch-index-management-Kibana][6]
|
||||
|
||||
正如我们上面看到的,索引现在是可见的,让我们现在创建索引模型。
|
||||
|
||||
点击 Kibana 部分的 “Index Patterns”,它将提示我们创建一个新模型,点击 “Create Index Pattern” ,并将模式名称指定为 “filebeat”:
|
||||
|
||||
![Define-Index-Pattern-Kibana-RHEL8][7]
|
||||
|
||||
点击下一步。
|
||||
|
||||
选择 “Timestamp” 作为索引模型的时间过滤器,然后单击 “Create index pattern”:
|
||||
|
||||
![Time-Filter-Index-Pattern-Kibana-RHEL8][8]
|
||||
|
||||
![filebeat-index-pattern-overview-Kibana][9]
|
||||
|
||||
现在单击查看实时 filebeat 索引模型:
|
||||
|
||||
![Discover-Kibana-REHL8][10]
|
||||
|
||||
这表明 Filebeat 代理已配置成功,我们能够在 Kibana 仪表盘上看到实时日志。
|
||||
|
||||
以上就是本文的全部内容,对这些帮助你在 RHEL 8 / CentOS 8 系统上设置 Elastic Stack 集群的步骤,请不要犹豫分享你的反馈和意见。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linuxtechi.com/setup-multinode-elastic-stack-cluster-rhel8-centos8/
|
||||
|
||||
作者:[Pradeep Kumar][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[heguangzhi](https://github.com/heguangzhi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.linuxtechi.com/author/pradeep/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
|
||||
[2]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Elastic-Stack-Cluster-RHEL8-CentOS8.jpg
|
||||
[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Elasticsearch-cluster-status-rhel8.jpg
|
||||
[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Kibana-Dashboard-rhel8.jpg
|
||||
[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Stack-Monitoring-Overview-RHEL8.jpg
|
||||
[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Elasticsearch-index-management-Kibana.jpg
|
||||
[7]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Define-Index-Pattern-Kibana-RHEL8.jpg
|
||||
[8]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Time-Filter-Index-Pattern-Kibana-RHEL8.jpg
|
||||
[9]: https://www.linuxtechi.com/wp-content/uploads/2019/09/filebeat-index-pattern-overview-Kibana.jpg
|
||||
[10]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Discover-Kibana-REHL8.jpg
|
@ -0,0 +1,117 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11409-1.html)
|
||||
[#]: subject: (How to use Terminator on Linux to run multiple terminals in one window)
|
||||
[#]: via: (https://www.networkworld.com/article/3436784/how-to-use-terminator-on-linux-to-run-multiple-terminals-in-one-window.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
使用 Terminator 在一个窗口中运行多个终端
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/30/233732j9jjx3xxuujopiuu.jpg)
|
||||
|
||||
> Terminator 为在单窗口中运行多个 GNOME 终端提供了一个选择,让你可以灵活地调整工作空间来适应你的需求。
|
||||
|
||||
![](https://images.idgesg.net/images/article/2019/09/terminator-code-100810364-large.jpg)
|
||||
|
||||
如果你曾经希望可以排列多个终端并将它们组织在一个窗口中,那么我们可能会给你带来一个好消息。 Linux 的 Terminator 可以为你做到这一点。没有问题!
|
||||
|
||||
### 分割窗口
|
||||
|
||||
Terminator 最初打开像是一个单一窗口的终端窗口一样。但是,一旦在该窗口中单击鼠标,它将弹出一个选项,让你可以灵活地进行更改。你可以选择“水平分割”或“垂直分割”,将你当前所在的窗口分为两个较小的窗口。实际上,菜单旁会有小的分割结果图示(类似于 `=` and `||`),你可以根据需要重复拆分窗口。当然,你如果将整个窗口分为六个或九个以上,那么你可能会发现它们太小而无法有效使用。
|
||||
|
||||
使用 ASCII 艺术来说明分割窗口的过程,你可能会看到类似以下的样子:
|
||||
|
||||
```
|
||||
+-------------------+ +-------------------+ +-------------------+
|
||||
| | | | | |
|
||||
| | | | | |
|
||||
| | ==> |-------------------| ==> |-------------------|
|
||||
| | | | | | |
|
||||
| | | | | | |
|
||||
+-------------------+ +-------------------+ +-------------------+
|
||||
原始终端 水平分割 垂直分割
|
||||
```
|
||||
|
||||
另一种拆分窗口的方法是使用控制键组合,例如,使用 `Ctrl+Shift+e` 垂直分割窗口,使用 `Ctrl+Shift+o`(“o” 表示“打开”)水平分割窗口。
|
||||
|
||||
在 Terminator 分割完成后,你可以点击任意窗口使用,并根据工作需求在窗口间移动。
|
||||
|
||||
### 最大化窗口
|
||||
|
||||
如果你想暂时忽略除了一个窗口外的其他窗口而只关注一个,你可以单击该窗口,然后从菜单中选择“最大化”选项。接着该窗口会撑满所有空间。再次单击并选择“还原所有终端”可以返回到多窗口显示。使用 `Ctrl+Shift+x` 将在正常和最大化设置之间切换。
|
||||
|
||||
窗口标签上的窗口大小指示(例如 80x15)显示了每行的字符数以及每个窗口的行数。
|
||||
|
||||
### 关闭窗口
|
||||
|
||||
要关闭任何窗口,请打开 Terminator 菜单,然后选择“关闭”。其他窗口将自行调整占用空间,直到你关闭最后一个窗口。
|
||||
|
||||
### 保存你的自定义设置
|
||||
|
||||
将窗口分为多个部分后,将自定义的 Terminator 设置设置为默认非常容易。从弹出菜单中选择“首选项”,然后从打开的窗口顶部的选项卡中选择“布局”。接着你应该看到列出了“新布局”。只需单击底部的“保存”,然后单击右下角的“关闭”。Terminator 会将你的设置保存在 `~/.config/terminator/config` 中,然后每次使用到时都会使用该文件。
|
||||
|
||||
你也可以通过使用鼠标拉伸来扩大整个窗口。再说一次,如果要保留更改,请从菜单中选择“首选项”,“布局”,接着选择“保存”和“关闭”。
|
||||
|
||||
### 在保存的配置之间进行选择
|
||||
|
||||
如果愿意,你可以通过维护多个配置文件来设置多种 Terminator 窗口布局,重命名每个配置文件(如 `config-1`、`config-2`),接着在你想使用它时将它移动到 `~/.config/terminator/config`。这有一个类似执行此任务的脚本。它让你在 3 个预配置的窗口布局之间进行选择。
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
PS3='Terminator options: '
|
||||
options=("Split 1" "Split 2" "Split 3" "Quit")
|
||||
select opt in "${options[@]}"
|
||||
do
|
||||
case $opt in
|
||||
"Split 1")
|
||||
config=config-1
|
||||
break
|
||||
;;
|
||||
"Split 2")
|
||||
config=config-2
|
||||
break
|
||||
;;
|
||||
"Split 3")
|
||||
config=config-3
|
||||
break
|
||||
;;
|
||||
*)
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
cd ~/.config/terminator
|
||||
cp config config-
|
||||
cp $config config
|
||||
cd
|
||||
terminator &
|
||||
```
|
||||
|
||||
如果有用的话,你可以给选项一个比 `config-1` 更有意义的名称。
|
||||
|
||||
### 总结
|
||||
|
||||
Terminator 是设置多窗口处理相关任务的不错选择。如果你从未使用过它,那么可能需要先使用 `sudo apt install terminator` 或 `sudo yum install -y terminator` 之类的命令进行安装。
|
||||
|
||||
希望你喜欢使用 Terminator。还有,如另一个同名角色所说,“我会回来的!”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3436784/how-to-use-terminator-on-linux-to-run-multiple-terminals-in-one-window.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
|
||||
[2]: https://www.facebook.com/NetworkWorld/
|
||||
[3]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,175 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (amwps290)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11371-1.html)
|
||||
[#]: subject: (How to set up a TFTP server on Fedora)
|
||||
[#]: via: (https://fedoramagazine.org/how-to-set-up-a-tftp-server-on-fedora/)
|
||||
[#]: author: (Curt Warfield https://fedoramagazine.org/author/rcurtiswarfield/)
|
||||
|
||||
如何在 Fedora 上建立一个 TFTP 服务器
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
TFTP 即<ruby>简单文本传输协议<rt>Trivial File Transfer Protocol</rt></ruby>,允许用户通过 [UDP][2] 协议在系统之间传输文件。默认情况下,协议使用的是 UDP 的 69 号端口。TFTP 协议广泛用于无盘设备的远程启动。因此,在你的本地网络建立一个 TFTP 服务器,这样你就可以对 [安装好的 Fedora][3] 和其他无盘设备做一些操作,这将非常有趣。
|
||||
|
||||
TFTP 仅仅能够从远端系统读取数据或者向远端系统写入数据,而没有列出远端服务器上文件的能力。它也没提供用户身份验证。由于安全隐患和缺乏高级功能,TFTP 通常仅用于局域网内部(LAN)。
|
||||
|
||||
### 安装 TFTP 服务器
|
||||
|
||||
首先你要做的事就是安装 TFTP 客户端和 TFTP 服务器:
|
||||
|
||||
```
|
||||
dnf install tftp-server tftp -y
|
||||
```
|
||||
|
||||
上述的这条命令会在 `/usr/lib/systemd/system` 目录下为 [systemd][4] 创建 `tftp.service` 和 `tftp.socket` 文件。
|
||||
|
||||
```
|
||||
/usr/lib/systemd/system/tftp.service
|
||||
/usr/lib/systemd/system/tftp.socket
|
||||
```
|
||||
|
||||
接下来,将这两个文件复制到 `/etc/systemd/system` 目录下,并重新命名。
|
||||
|
||||
```
|
||||
cp /usr/lib/systemd/system/tftp.service /etc/systemd/system/tftp-server.service
|
||||
cp /usr/lib/systemd/system/tftp.socket /etc/systemd/system/tftp-server.socket
|
||||
```
|
||||
|
||||
### 修改文件
|
||||
|
||||
当你把这些文件复制和重命名后,你就可以去添加一些额外的参数,下面是 `tftp-server.service` 刚开始的样子:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Tftp Server
|
||||
Requires=tftp.socket
|
||||
Documentation=man:in.tftpd
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot
|
||||
StandardInput=socket
|
||||
|
||||
[Install]
|
||||
Also=tftp.socket
|
||||
```
|
||||
|
||||
在 `[Unit]` 部分添加如下内容:
|
||||
|
||||
```
|
||||
Requires=tftp-server.socket
|
||||
```
|
||||
|
||||
修改 `[ExecStart]` 行:
|
||||
|
||||
```
|
||||
ExecStart=/usr/sbin/in.tftpd -c -p -s /var/lib/tftpboot
|
||||
```
|
||||
|
||||
下面是这些选项的意思:
|
||||
|
||||
* `-c` 选项允许创建新的文件
|
||||
* `-p` 选项用于指明在正常系统提供的权限检查之上没有其他额外的权限检查
|
||||
* `-s` 建议使用该选项以确保安全性以及与某些引导 ROM 的兼容性,这些引导 ROM 在其请求中不容易包含目录名。
|
||||
|
||||
默认的上传和下载位置位于 `/var/lib/tftpboot`。
|
||||
|
||||
下一步,修改 `[Install]` 部分的内容
|
||||
|
||||
```
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Also=tftp-server.socket
|
||||
```
|
||||
|
||||
不要忘记保存你的修改。
|
||||
|
||||
下面是 `/etc/systemd/system/tftp-server.service` 文件的完整内容:
|
||||
|
||||
```
|
||||
[Unit]
|
||||
Description=Tftp Server
|
||||
Requires=tftp-server.socket
|
||||
Documentation=man:in.tftpd
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/sbin/in.tftpd -c -p -s /var/lib/tftpboot
|
||||
StandardInput=socket
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Also=tftp-server.socket
|
||||
```
|
||||
|
||||
### 启动 TFTP 服务器
|
||||
|
||||
重新启动 systemd 守护进程:
|
||||
|
||||
```
|
||||
systemctl daemon-reload
|
||||
```
|
||||
|
||||
启动服务器:
|
||||
|
||||
```
|
||||
systemctl enable --now tftp-server
|
||||
```
|
||||
|
||||
要更改 TFTP 服务器允许上传和下载的权限,请使用此命令。注意 TFTP 是一种固有的不安全协议,因此不建议你在与其他人共享的网络上这样做。
|
||||
|
||||
```
|
||||
chmod 777 /var/lib/tftpboot
|
||||
```
|
||||
|
||||
配置防火墙让 TFTP 能够使用:
|
||||
|
||||
```
|
||||
firewall-cmd --add-service=tftp --perm
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
### 客户端配置
|
||||
|
||||
安装 TFTP 客户端
|
||||
|
||||
```
|
||||
yum install tftp -y
|
||||
```
|
||||
|
||||
运行 `tftp` 命令连接服务器。下面是一个启用详细信息选项的例子:
|
||||
|
||||
```
|
||||
[client@thinclient:~ ]$ tftp 192.168.1.164
|
||||
tftp> verbose
|
||||
Verbose mode on.
|
||||
tftp> get server.logs
|
||||
getting from 192.168.1.164:server.logs to server.logs [netascii]
|
||||
Received 7 bytes in 0.0 seconds [inf bits/sec]
|
||||
tftp> quit
|
||||
[client@thinclient:~ ]$
|
||||
```
|
||||
|
||||
记住,因为 TFTP 没有列出服务器上文件的能力,因此,在你使用 `get` 命令之前需要知道文件的具体名称。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/how-to-set-up-a-tftp-server-on-fedora/
|
||||
|
||||
作者:[Curt Warfield][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[amwps290](https://github.com/amwps290)
|
||||
校对:[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/09/tftp-server-816x345.jpg
|
||||
[2]: https://en.wikipedia.org/wiki/User_Datagram_Protocol
|
||||
[3]: https://docs.fedoraproject.org/en-US/fedora/f30/install-guide/advanced/Network_based_Installations/
|
||||
[4]: https://fedoramagazine.org/systemd-getting-a-grip-on-units/
|
||||
[5]: https://unsplash.com/@laikanotebooks?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
[6]: https://unsplash.com/search/photos/file-folders?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
153
published/201909/20190912 An introduction to Markdown.md
Normal file
153
published/201909/20190912 An introduction to Markdown.md
Normal file
@ -0,0 +1,153 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (qfzy1233)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11402-1.html)
|
||||
[#]: subject: (An introduction to Markdown)
|
||||
[#]: via: (https://opensource.com/article/19/9/introduction-markdown)
|
||||
[#]: author: (Juan Islas https://opensource.com/users/xislas)
|
||||
|
||||
一份 Markdown 简介
|
||||
======
|
||||
|
||||
> 一次编辑便可将文本转换为多种格式。下面是如何开始使用 Markdown。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/29/123226bjte253n2h44cjjj.jpg)
|
||||
|
||||
在很长一段时间里,我发现我在 GitLab 和 GitHub 上看到的所有文件都带有 **.md** 扩展名,这是专门为开发人员编写的文件类型。几周前,当我开始使用 Markdown 时,我的观念发生了变化。它很快成为我日常工作中最重要的工具。
|
||||
|
||||
Markdown 使我的生活更简易。我只需要在已经编写的代码中添加一些符号,并且在浏览器扩展或开源程序的帮助下,即可将文本转换为各种常用格式,如 ODT、电子邮件(稍后将详细介绍)、PDF 和 EPUB。
|
||||
|
||||
### 什么是 Markdown?
|
||||
|
||||
来自 [维基百科][2]的友情提示:
|
||||
|
||||
> Markdown 是一种轻量级标记语言,具有纯文本格式语法。
|
||||
|
||||
这意味着通过在文本中使用一些额外的符号,Markdown 可以帮助你创建具有特定结构和格式的文档。当你以纯文本(例如,在记事本应用程序中)做笔记时,没有任何东西表明哪个文本应该是粗体或斜体。在普通文本中,你在写链接时需要将一个链接写为 “http://example.com”,或者写为 “example.com”,又或“访问网站(example.com)”。这样没有内在的一致性。
|
||||
|
||||
但是如果你按照 Markdown 的方式编写,你的文本就有了内在的一致性。计算机喜欢一致性,因为这使得它们能够遵循严格的指令而不用担心异常。
|
||||
|
||||
相信我;一旦你学会使用 Markdown,每一项写作任务在某种程度上都会比以前更容易、更好。让我们开始吧。
|
||||
|
||||
### Markdown 基础
|
||||
|
||||
以下是使用 Markdown 的基础语法。
|
||||
|
||||
1、创建一个以 **.md** 扩展名结尾的文本文件(例如,`example.md`)。你可以使用任何文本编辑器(甚至像 LibreOffice 或 Microsoft word 这样的文字处理程序亦可),只要记住将其保存为*文本*文件。
|
||||
|
||||
![Names of Markdown files][3]
|
||||
|
||||
2、想写什么就写什么,就像往常一样:
|
||||
|
||||
```
|
||||
Lorem ipsum
|
||||
|
||||
Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
De Finibus Bonorum et Malorum
|
||||
|
||||
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
|
||||
Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
|
||||
|
||||
Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
|
||||
```
|
||||
|
||||
(LCTT 译注:上述这段“Lorem ipsum”,中文又称“乱数假文”,是一篇常用于排版设计领域的拉丁文文章,主要目的为测试文章或文字在不同字型、版型下看起来的效果。)
|
||||
|
||||
3、确保在段落之间留有空行。如果你习惯写商务信函或传统散文,这可能会觉得不自然,因为那里段落只有一行,甚至在第一个单词前还有一个缩进。对于 Markdown,空行(一些文字处理程序使用 `¶`,称为Pilcrow 符号)保证在创建一个新段落应用另一种格式(如 HTML)。
|
||||
|
||||
4、指定标题和副标题。对于文档的标题,在文本前面添加一个井号或散列符号(`#`)和一个空格(例如 `# Lorem ipsum`)。第一个副标题级别使用两个(`## De Finibus Bonorum et Malorum`),下一个级别使用三个(`### 第三个副标题`),以此类推。注意,在井号和第一个单词之间有一个空格。
|
||||
|
||||
```
|
||||
# Lorem ipsum
|
||||
|
||||
Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
||||
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
||||
|
||||
## De Finibus Bonorum et Malorum
|
||||
|
||||
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
|
||||
Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
|
||||
|
||||
Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
|
||||
```
|
||||
|
||||
5、如果你想使用**粗体**字符,只需将字母放在两个星号之间,没有空格:`**对应的文本将以粗体显示**`。
|
||||
|
||||
![Bold text in Markdown][4]
|
||||
|
||||
6、对于**斜体**,将文本放在没有空格的下划线符号之间:`_我希望这个本文以斜体显示_`。(LCTT 译注:有的 Markdown 流派会将用下划线引起来的字符串视作下划线文本,而单个星号 `*` 引用起来的才视作斜体。从兼容性的角度看,使用星号比较兼容。)
|
||||
|
||||
![Italics text in Markdown][5]
|
||||
|
||||
7、要插入一个链接(像 [Markdown Tutorial][6]),把你想链接的文本放在括号里,URL 放在括号里,中间没有空格:`[Markdown Tutorial](<https://www.markdowntutorial.com/>)`。
|
||||
|
||||
![Hyperlinks in Markdown][7]
|
||||
|
||||
8、块引用是用大于号编写的(`>`)在你要引用的文本前加上大于符号和空格: `> 名言引用`。
|
||||
|
||||
![Blockquote text in Markdown][8]
|
||||
|
||||
### Markdown 教程和技巧
|
||||
|
||||
这些技巧可以帮助你上手 Markdown ,但它涵盖了很多功能,不仅仅是粗体、斜体和链接。学习 Markdown 的最好方法是使用它,但是我建议你花 15 分钟来学习这篇简单的 [Markdown 教程][6],学以致用,勤加练习。
|
||||
|
||||
由于现代 Markdown 是对结构化文本概念的许多不同解释的融合,[CommonMark][9] 项目定义了一个规范,其中包含一组严格的规则,以使 Markdown 更加清晰。在编辑时手边准备一份[符合 CommonMark 的快捷键列表][10]可能会有帮助。
|
||||
|
||||
### 你能用 Markdown 做什么
|
||||
|
||||
Markdown 可以让你写任何你想写的东西,仅需一次编辑,就可以把它转换成几乎任何你想使用的格式。下面的示例演示如何将用 MD 编写简单的文本并转换为不同的格式。你不需要多种格式的文档-你可以仅仅编辑一次…然后拥有无限可能。
|
||||
|
||||
1、**简单的笔记**:你可以用 Markdown 编写你的笔记,并且在保存笔记时,开源笔记应用程序 [Turtl][11] 将解释你的文本文件并显示为对应的格式。你可以把笔记存储在任何地方!
|
||||
|
||||
![Turtl application][12]
|
||||
|
||||
2、**PDF 文件**:使用 [Pandoc][13] 应用程序,你可以使用一个简单的命令将 Markdown 文件转换为 PDF:
|
||||
|
||||
```
|
||||
pandoc <file.md> -o <file.pdf>
|
||||
```
|
||||
|
||||
![Markdown text converted to PDF with Pandoc][14]
|
||||
|
||||
3、**Email**:你还可以通过安装浏览器扩展 [Markdown Here][15] 将 Markdown 文本转换为 html 格式的电子邮件。要使用它,只需选择你的 Markdown 文本,在这里使用 Markdown 将其转换为 HTML,并使用你喜欢的电子邮件客户端发送消息。
|
||||
|
||||
![Markdown text converted to email with Markdown Here][16]
|
||||
|
||||
### 现在就开始上手吧
|
||||
|
||||
你不需要一个特殊的应用程序来使用 Markdown,你只需要一个文本编辑器和上面的技巧。它与你已有的写作方式兼容;你所需要做的就是使用它,所以试试吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/introduction-markdown
|
||||
|
||||
作者:[Juan Islas][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://opensource.com/users/xislas
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming)
|
||||
[2]: https://en.wikipedia.org/wiki/Markdown
|
||||
[3]: https://opensource.com/sites/default/files/uploads/markdown_names_md-1.png (Names of Markdown files)
|
||||
[4]: https://opensource.com/sites/default/files/uploads/markdown_bold.png (Bold text in Markdown)
|
||||
[5]: https://opensource.com/sites/default/files/uploads/markdown_italic.png (Italics text in Markdown)
|
||||
[6]: https://www.markdowntutorial.com/
|
||||
[7]: https://opensource.com/sites/default/files/uploads/markdown_link.png (Hyperlinks in Markdown)
|
||||
[8]: https://opensource.com/sites/default/files/uploads/markdown_blockquote.png (Blockquote text in Markdown)
|
||||
[9]: https://commonmark.org/help/
|
||||
[10]: https://opensource.com/downloads/cheat-sheet-markdown
|
||||
[11]: https://turtlapp.com/
|
||||
[12]: https://opensource.com/sites/default/files/uploads/markdown_turtl_02.png (Turtl application)
|
||||
[13]: https://opensource.com/article/19/5/convert-markdown-to-word-pandoc
|
||||
[14]: https://opensource.com/sites/default/files/uploads/markdown_pdf.png (Markdown text converted to PDF with Pandoc)
|
||||
[15]: https://markdown-here.com/
|
||||
[16]: https://opensource.com/sites/default/files/uploads/markdown_mail_02.png (Markdown text converted to email with Markdown Here)
|
@ -0,0 +1,116 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11362-1.html)
|
||||
[#]: subject: (Bash Script to Send a Mail About New User Account Creation)
|
||||
[#]: via: (https://www.2daygeek.com/linux-shell-script-to-monitor-user-creation-send-email/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
用 Bash 脚本发送新用户帐户创建的邮件
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/20/093308a615tcuiopctvp5t.jpg)
|
||||
|
||||
出于某些原因,你可能需要跟踪 Linux 上的新用户创建信息。同时,你可能需要通过邮件发送详细信息。这或许是审计目标的一部分,或者安全团队出于跟踪目的可能希望对此进行监控。
|
||||
|
||||
我们可以通过其他方式进行此操作,正如我们在上一篇文章中已经描述的那样。
|
||||
|
||||
* [在系统中创建新用户帐户时发送邮件的 Bash 脚本][1]
|
||||
|
||||
Linux 有许多开源监控工具可以使用。但我不认为他们有办法跟踪新用户创建过程,并在发生时提醒管理员。
|
||||
|
||||
那么我们怎样才能做到这一点?
|
||||
|
||||
我们可以编写自己的 Bash 脚本来实现这一目标。我们过去写过许多有用的 shell 脚本。如果你想了解,请进入下面的链接。
|
||||
|
||||
* [如何使用 shell 脚本自动化日常活动?][2]
|
||||
|
||||
### 这个脚本做了什么?
|
||||
|
||||
这将每天两次(一天的开始和结束)备份 `/etc/passwd` 文件,这将使你能够获取指定日期的新用户创建详细信息。
|
||||
|
||||
我们需要添加以下两个 cron 任务来复制 `/etc/passwd` 文件。
|
||||
|
||||
```
|
||||
# crontab -e
|
||||
|
||||
1 0 * * * cp /etc/passwd /opt/scripts/passwd-start-$(date +"%Y-%m-%d")
|
||||
59 23 * * * cp /etc/passwd /opt/scripts/passwd-end-$(date +"%Y-%m-%d")
|
||||
```
|
||||
|
||||
它使用 `diff` 命令来检测文件之间的差异,如果发现与昨日有任何差异,脚本将向指定 email 发送新用户详细信息。
|
||||
|
||||
我们不用经常运行此脚本,因为用户创建不经常发生。但是,我们计划每天运行一次此脚本。
|
||||
|
||||
这样,你可以获得有关新用户创建的综合报告。
|
||||
|
||||
**注意:**我们在脚本中使用了我们的电子邮件地址进行演示。因此,我们要求你用自己的电子邮件地址。
|
||||
|
||||
```
|
||||
# vi /opt/scripts/new-user-detail.sh
|
||||
|
||||
#!/bin/bash
|
||||
mv /opt/scripts/passwd-start-$(date --date='yesterday' '+%Y-%m-%d') /opt/scripts/passwd-start
|
||||
mv /opt/scripts/passwd-end-$(date --date='yesterday' '+%Y-%m-%d') /opt/scripts/passwd-end
|
||||
ucount=$(diff /opt/scripts/passwd-start /opt/scripts/passwd-end | grep ">" | cut -d":" -f6 | cut -d"/" -f3 | wc -l)
|
||||
if [ $ucount -gt 0 ]
|
||||
then
|
||||
SUBJECT="ATTENTION: New User Account is created on server : `date --date='yesterday' '+%b %e'`"
|
||||
MESSAGE="/tmp/new-user-logs.txt"
|
||||
TO="2daygeek@gmail.com"
|
||||
echo "Hostname: `hostname`" >> $MESSAGE
|
||||
echo -e "\n" >> $MESSAGE
|
||||
echo "The New User Details are below." >> $MESSAGE
|
||||
echo "+------------------------------+" >> $MESSAGE
|
||||
diff /opt/scripts/passwd-start /opt/scripts/passwd-end | grep ">" | cut -d":" -f6 | cut -d"/" -f3 >> $MESSAGE
|
||||
echo "+------------------------------+" >> $MESSAGE
|
||||
mail -s "$SUBJECT" "$TO" < $MESSAGE
|
||||
rm $MESSAGE
|
||||
fi
|
||||
```
|
||||
|
||||
给 `new-user-detail.sh` 文件添加可执行权限。
|
||||
|
||||
```
|
||||
$ chmod +x /opt/scripts/new-user-detail.sh
|
||||
```
|
||||
|
||||
最后添加一个 cron 任务来自动执行此操作。它在每天早上 7 点运行。
|
||||
|
||||
```
|
||||
# crontab -e
|
||||
|
||||
0 7 * * * /bin/bash /opt/scripts/new-user.sh
|
||||
```
|
||||
|
||||
**注意:**你会在每天早上 7 点都会收到一封关于昨日详情的邮件提醒。
|
||||
|
||||
**输出:**输出与下面的输出相同。
|
||||
|
||||
```
|
||||
# cat /tmp/new-user-logs.txt
|
||||
|
||||
Hostname: CentOS.2daygeek.com
|
||||
|
||||
The New User Details are below.
|
||||
+------------------------------+
|
||||
tuser3
|
||||
+------------------------------+
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/linux-shell-script-to-monitor-user-creation-send-email/
|
||||
|
||||
作者:[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://www.2daygeek.com/linux-bash-script-to-monitor-user-creation-send-email/
|
||||
[2]: https://www.2daygeek.com/category/shell-script/
|
@ -0,0 +1,99 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11364-1.html)
|
||||
[#]: subject: (An introduction to Virtual Machine Manager)
|
||||
[#]: via: (https://opensource.com/article/19/9/introduction-virtual-machine-manager)
|
||||
[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
|
||||
|
||||
虚拟机管理器(Virtual Machine Manager)简介
|
||||
======
|
||||
|
||||
> virt-manager 为 Linux 虚拟化提供了全方位的选择。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/20/113434dxbbp3ttmxbhmnnm.jpg)
|
||||
|
||||
在我关于 [GNOME Boxes][3] 的[系列文章][2]中,我已经解释了 Linux 用户如何能够在他们的桌面上快速启动虚拟机。当你只需要简单的配置时,Box 可以轻而易举地创建虚拟机。
|
||||
|
||||
但是,如果你需要在虚拟机中配置更多详细信息,那么你就需要一个工具,为磁盘、网卡(NIC)和其他硬件提供全面的选项。这时就需要 [虚拟机管理器(Virtual Machine Manager)][4](virt-manager)了。如果在应用菜单中没有看到它,你可以从包管理器或命令行安装它:
|
||||
|
||||
* 在 Fedora 上:`sudo dnf install virt-manager`
|
||||
* 在 Ubuntu 上:`sudo apt install virt-manager`
|
||||
|
||||
安装完成后,你可以从应用菜单或在命令行中输入 `virt-manager` 启动。
|
||||
|
||||
![Virtual Machine Manager's main screen][5]
|
||||
|
||||
为了演示如何使用 virt-manager 创建虚拟机,我将设置一个 Red Hat Enterprise Linux 8 虚拟机。
|
||||
|
||||
首先,单击 “<ruby>文件<rt>File</rt></ruby>” 然后点击 “<ruby>新建虚拟机<rt>New Virtual Machine</rt></ruby>”。Virt-manager 的开发者已经标记好了每一步(例如,“<ruby>第 1 步,共 5 步<rt>Step 1 of 5</rt></ruby>”)来使其变得简单。单击 “<ruby>本地安装介质<rt>Local install media</rt></ruby>” 和 “<ruby>下一步<rt>Forward</rt></ruby>”。
|
||||
|
||||
![Step 1 virtual machine creation][6]
|
||||
|
||||
在下个页面中,选择要安装的操作系统的 ISO 文件。(RHEL 8 镜像位于我的下载目录中。)Virt-manager 自动检测操作系统。
|
||||
|
||||
![Step 2 Choose the ISO File][7]
|
||||
|
||||
在步骤 3 中,你可以指定虚拟机的内存和 CPU。默认值为内存 1,024MB 和一个 CPU。
|
||||
|
||||
![Step 3 Set CPU and Memory][8]
|
||||
|
||||
我想给 RHEL 充足的配置来运行,我使用的硬件配置也充足,所以我将它们(分别)增加到 4,096MB 和两个 CPU。
|
||||
|
||||
下一步为虚拟机配置存储。默认设置是 10GB 硬盘。(我保留此设置,但你可以根据需要进行调整。)你还可以选择现有磁盘镜像或在自定义位置创建一个磁盘镜像。
|
||||
|
||||
![Step 4 Configure VM Storage][9]
|
||||
|
||||
步骤 5 是命名虚拟机并单击“<ruby>完成<rt>Finish</rt></ruby>”。这相当于创建了一台虚拟机,也就是 GNOME Boxes 中的一个 Box。虽然技术上讲是最后一步,但你有几个选择(如下面的截图所示)。由于 virt-manager 的优点是能够自定义虚拟机,因此在单击“<ruby>完成<rt>Finish</rt></ruby>”之前,我将选中“<ruby>在安装前定制配置<rt>Customize configuration before install</rt></ruby>”的复选框。
|
||||
|
||||
因为我选择了自定义配置,virt-manager 打开了一个有一组设备和设置的页面。这里是重点!
|
||||
|
||||
这里你也可以命名该虚拟机。在左侧列表中,你可以查看各个方面的详细信息,例如 CPU、内存、磁盘、控制器和许多其他项目。例如,我可以单击 “CPU” 来验证我在步骤 3 中所做的更改。
|
||||
|
||||
![Changing the CPU count][10]
|
||||
|
||||
我也可以确认我设置的内存量。
|
||||
|
||||
当虚拟机作为服务器运行时,我通常会禁用或删除声卡。为此,请选择 “<ruby>声卡<rt>Sound</rt></ruby>” 并单击 “<ruby>移除<rt>Remove</rt></ruby>” 或右键单击 “<ruby>声卡<rt>Sound</rt></ruby>” 并选择 “<ruby>移除硬件<rt>Remove Hardware</rt></ruby>”。
|
||||
|
||||
你还可以使用底部的 “<ruby>添加硬件<rt>Add Hardware</rt></ruby>” 按钮添加硬件。这会打开 “<ruby>添加新的虚拟硬件<rt>Add New Virtual Hardware</rt></ruby>” 页面,你可以在其中添加其他存储设备、内存、声卡等。这就像可以访问一个库存充足的(虚拟)计算机硬件仓库。
|
||||
|
||||
![The Add New Hardware screen][11]
|
||||
|
||||
对 VM 配置感到满意后,单击 “<ruby>开始安装<rt>Begin Installation</rt></ruby>”,系统将启动并开始从 ISO 安装指定的操作系统。
|
||||
|
||||
![Begin installing the OS][12]
|
||||
|
||||
完成后,它会重新启动,你的新虚拟机就可以使用了。
|
||||
|
||||
![Red Hat Enterprise Linux 8 running in VMM][13]
|
||||
|
||||
Virtual Machine Manager 是桌面 Linux 用户的强大工具。它是开源的,是专有和封闭虚拟化产品的绝佳替代品。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/introduction-virtual-machine-manager
|
||||
|
||||
作者:[Alan Formy-Duval][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/alanfdoss
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb (A person programming)
|
||||
[2]: https://opensource.com/sitewide-search?search_api_views_fulltext=GNOME%20Box
|
||||
[3]: https://wiki.gnome.org/Apps/Boxes
|
||||
[4]: https://virt-manager.org/
|
||||
[5]: https://opensource.com/sites/default/files/1-vmm_main_0.png (Virtual Machine Manager's main screen)
|
||||
[6]: https://opensource.com/sites/default/files/2-vmm_step1_0.png (Step 1 virtual machine creation)
|
||||
[7]: https://opensource.com/sites/default/files/3-vmm_step2.png (Step 2 Choose the ISO File)
|
||||
[8]: https://opensource.com/sites/default/files/4-vmm_step3default.png (Step 3 Set CPU and Memory)
|
||||
[9]: https://opensource.com/sites/default/files/6-vmm_step4.png (Step 4 Configure VM Storage)
|
||||
[10]: https://opensource.com/sites/default/files/9-vmm_customizecpu.png (Changing the CPU count)
|
||||
[11]: https://opensource.com/sites/default/files/11-vmm_addnewhardware.png (The Add New Hardware screen)
|
||||
[12]: https://opensource.com/sites/default/files/12-vmm_rhelbegininstall.png
|
||||
[13]: https://opensource.com/sites/default/files/13-vmm_rhelinstalled_0.png (Red Hat Enterprise Linux 8 running in VMM)
|
@ -0,0 +1,346 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (asche910)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11367-1.html)
|
||||
[#]: subject: (How to Find and Replace a String in File Using the sed Command in Linux)
|
||||
[#]: via: (https://www.2daygeek.com/linux-sed-to-find-and-replace-string-in-files/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
使用 sed 命令查找和替换文件中的字符串的 16 个示例
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/20/210723xf884pafyzf9zf4a.jpg)
|
||||
|
||||
当你在使用文本文件时,很可能需要查找和替换文件中的字符串。`sed` 命令主要用于替换一个文件中的文本。在 Linux 中这可以通过使用 `sed` 命令和 `awk` 命令来完成。
|
||||
|
||||
在本教程中,我们将告诉你使用 `sed` 命令如何做到这一点,然后讨论讨论 `awk` 命令相关的。
|
||||
|
||||
### sed 命令是什么
|
||||
|
||||
`sed` 命令表示 Stream Editor(流编辑器),用来在 Linux 上执行基本的文本操作。它可以执行各种功能,如搜索、查找、修改、插入或删除文件。
|
||||
|
||||
此外,它也可以执行复杂的正则表达式匹配。
|
||||
|
||||
它可用于以下目的:
|
||||
|
||||
* 查找和替换匹配给定的格式的内容。
|
||||
* 在指定行查找和替换匹配给定的格式的内容。
|
||||
* 在所有行查找和替换匹配给定的格式的内容。
|
||||
* 搜索并同时替换两种不同的模式。
|
||||
|
||||
本文列出的十五个例子可以帮助你掌握 `sed` 命令。
|
||||
|
||||
如果要使用 `sed` 命令删除文件中的行,去下面的文章。
|
||||
|
||||
注意:由于这是一篇演示文章,我们使用不带 `-i` 选项的 `sed` 命令,该选项会在 Linux 终端中删除行并打印文件内容。
|
||||
|
||||
但是,在实际环境中如果你想删除源文件中的行,使用带 `-i` 选项的 `sed` 命令。
|
||||
|
||||
常见的 `sed` 替换字符串的语法。
|
||||
|
||||
```
|
||||
sed -i 's/Search_String/Replacement_String/g' Input_File
|
||||
```
|
||||
|
||||
首先我们需要了解 `sed` 语法来做到这一点。请参阅有关的细节。
|
||||
|
||||
* `sed`:这是一个 Linux 命令。
|
||||
* `-i`:这是 `sed` 命令的一个选项,它有什么作用?默认情况下,`sed` 打印结果到标准输出。当你使用 `sed` 添加这个选项时,那么它会在适当的位置修改文件。当你添加一个后缀(比如,`-i.bak`)时,就会创建原始文件的备份。
|
||||
* `s`:字母 `s` 是一个替换命令。
|
||||
* `Search_String`:搜索一个给定的字符串或正则表达式。
|
||||
* `Replacement_String`:替换的字符串。
|
||||
* `g`:全局替换标志。默认情况下,`sed` 命令替换每一行第一次出现的模式,它不会替换行中的其他的匹配结果。但是,提供了该替换标志时,所有匹配都将被替换。
|
||||
* `/`:分界符。
|
||||
* `Input_File`:要执行操作的文件名。
|
||||
|
||||
让我们来看看文件中用sed命令来搜索和转换文本的一些常用例子。
|
||||
|
||||
我们已经创建了用于演示的以下文件。
|
||||
|
||||
```
|
||||
# cat sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 1) 如何查找和替换一行中“第一次”模式匹配
|
||||
|
||||
下面的 `sed` 命令用 `linux` 替换文件中的 `unix`。这仅仅改变了每一行模式的第一个实例。
|
||||
|
||||
```
|
||||
# sed 's/unix/linux/' sed-test.txt
|
||||
|
||||
1 Unix linux unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxlinux UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 2) 如何查找和替换每一行中“第 N 次”出现的模式
|
||||
|
||||
在行中使用`/1`、`/2`……`/n` 等标志来代替相应的匹配。
|
||||
|
||||
下面的 `sed` 命令在一行中用 `linux` 来替换 `unix` 模式的第二个实例。
|
||||
|
||||
```
|
||||
# sed 's/unix/linux/2' sed-test.txt
|
||||
|
||||
1 Unix unix linux 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 3) 如何搜索和替换一行中所有的模式实例
|
||||
|
||||
下面的 `sed` 命令用 `linux` 替换 `unix` 格式的所有实例,因为 `g` 是一个全局替换标志。
|
||||
|
||||
```
|
||||
# sed 's/unix/linux/g' sed-test.txt
|
||||
|
||||
1 Unix linux linux 23
|
||||
2 linux Linux 34
|
||||
3 linuxlinux UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 4) 如何查找和替换一行中从“第 N 个”开始的所有匹配的模式实例
|
||||
|
||||
下面的 `sed` 命令在一行中替换从模式的“第 N 个”开始的匹配实例。
|
||||
|
||||
```
|
||||
# sed 's/unix/linux/2g' sed-test.txt
|
||||
|
||||
1 Unix unix linux 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 5) 在特定的行号搜索和替换模式
|
||||
|
||||
你可以替换特定行号中的字符串。下面的 `sed` 命令用 `linux` 仅替换第三行的 `unix` 模式。
|
||||
|
||||
```
|
||||
# sed '3 s/unix/linux/' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxlinux UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 6) 在特定范围行号间搜索和替换模式
|
||||
|
||||
你可以指定行号的范围,以替换字符串。
|
||||
|
||||
下面的 `sed` 命令在 1 到 3 行间用 `linux` 替换 `Unix` 模式。
|
||||
|
||||
```
|
||||
# sed '1,3 s/unix/linux/' sed-test.txt
|
||||
|
||||
1 Unix linux unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxlinux UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 7) 如何查找和修改最后一行的模式
|
||||
|
||||
下面的 sed 命令允许你只在最后一行替换匹配的字符串。
|
||||
|
||||
下面的 `sed` 命令只在最后一行用 `Unix` 替换 `Linux` 模式。
|
||||
|
||||
```
|
||||
# sed '$ s/Linux/Unix/' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Unix is free and opensource operating system
|
||||
```
|
||||
|
||||
### 8) 在一行中如何只查找和替换正确的模式匹配
|
||||
|
||||
你可能已经注意到,子串 `linuxunix` 被替换为在第 6 个示例中的 `linuxlinux`。如果你只想更改正确的匹配词,在搜索串的两端用这个边界符 `\b`。
|
||||
|
||||
```
|
||||
# sed '1,3 s/\bunix\b/linux/' sed-test.txt
|
||||
|
||||
1 Unix linux unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 9) 如何以不区分大小写来搜索与替换模式
|
||||
|
||||
大家都知道,Linux 是区分大小写的。为了与不区分大小写的模式匹配,使用 `I` 标志。
|
||||
|
||||
```
|
||||
# sed 's/unix/linux/gI' sed-test.txt
|
||||
|
||||
1 linux linux linux 23
|
||||
2 linux Linux 34
|
||||
3 linuxlinux linuxLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 10) 如何查找和替换包含分隔符的字符串
|
||||
|
||||
当你搜索和替换含分隔符的字符串时,我们需要用反斜杠 `\` 来取消转义。
|
||||
|
||||
在这个例子中,我们将用 `/usr/bin/fish` 来替换 `/bin/bash`。
|
||||
|
||||
```
|
||||
# sed 's/\/bin\/bash/\/usr\/bin\/fish/g' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /usr/bin/fish CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
上述 `sed` 命令按预期工作,但它看起来来很糟糕。 为了简化,大部分的人会用竖线 `|` 作为正则表达式的定位符。 所以,我建议你用它。
|
||||
|
||||
```
|
||||
# sed 's|/bin/bash|/usr/bin/fish/|g' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /usr/bin/fish/ CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 11) 如何以给定的模式来查找和替换数字
|
||||
|
||||
类似地,数字可以用模式来代替。下面的 `sed` 命令以 `[0-9]` 替换所有数字为 `number`。
|
||||
|
||||
```
|
||||
# sed 's/[0-9]/number/g' sed-test.txt
|
||||
|
||||
number Unix unix unix numbernumber
|
||||
number linux Linux numbernumber
|
||||
number linuxunix UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 12) 如何用模式仅查找和替换两个数字
|
||||
|
||||
如果你想用模式来代替两位数字,使用下面的 `sed` 命令。
|
||||
|
||||
```
|
||||
# sed 's/\b[0-9]\{2\}\b/number/g' sed-test.txt
|
||||
|
||||
1 Unix unix unix number
|
||||
2 linux Linux number
|
||||
3 linuxunix UnixLinux
|
||||
linux /bin/bash CentOS Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 13) 如何用 sed 命令仅打印被替换的行
|
||||
|
||||
如果你想显示仅更改的行,使用下面的 `sed` 命令。
|
||||
|
||||
* `p` - 它在终端上输出替换的行两次。
|
||||
* `-n` - 它抑制由 `p` 标志所产生的重复行。
|
||||
|
||||
```
|
||||
# sed -n 's/Unix/Linux/p' sed-test.txt
|
||||
|
||||
1 Linux unix unix 23
|
||||
3 linuxunix LinuxLinux
|
||||
```
|
||||
|
||||
### 14) 如何同时运行多个 sed 命令
|
||||
|
||||
以下 `sed` 命令同时检测和置换两个不同的模式。
|
||||
|
||||
下面的 `sed` 命令搜索 `linuxunix` 和 `CentOS` 模式,用 `LINUXUNIX` 和 `RHEL8` 一次性更换它们。
|
||||
|
||||
```
|
||||
# sed -e 's/linuxunix/LINUXUNIX/g' -e 's/CentOS/RHEL8/g' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 LINUXUNIX UnixLinux
|
||||
linux /bin/bash RHEL8 Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
下面的 `sed` 命令搜索替换两个不同的模式,并一次性替换为一个字符串。
|
||||
|
||||
以下 `sed` 的命令搜索 `linuxunix` 和 `CentOS` 模式,用 `Fedora30` 替换它们。
|
||||
|
||||
```
|
||||
# sed -e 's/\(linuxunix\|CentOS\)/Fedora30/g' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 Fedora30 UnixLinux
|
||||
linux /bin/bash Fedora30 Linux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 15) 如果给定的模式匹配,如何查找和替换整个行
|
||||
|
||||
如果模式匹配,可以使用 `sed` 命令用新行来代替整行。这可以通过使用 `c` 标志来完成。
|
||||
|
||||
```
|
||||
# sed '/OS/ c\
|
||||
New Line
|
||||
' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
New Line
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
|
||||
### 16) 如何搜索和替换相匹配的模式行
|
||||
|
||||
在 `sed` 命令中你可以为行指定适合的模式。在匹配该模式的情况下,`sed` 命令搜索要被替换的字符串。
|
||||
|
||||
下面的 `sed` 命令首先查找具有 `OS` 模式的行,然后用 `ArchLinux` 替换单词 `Linux`。
|
||||
|
||||
```
|
||||
# sed '/OS/ s/Linux/ArchLinux/' sed-test.txt
|
||||
|
||||
1 Unix unix unix 23
|
||||
2 linux Linux 34
|
||||
3 linuxunix UnixLinux
|
||||
linux /bin/bash CentOS ArchLinux OS
|
||||
Linux is free and opensource operating system
|
||||
```
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/linux-sed-to-find-and-replace-string-in-files/
|
||||
|
||||
作者:[Magesh Maruthamuthu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Asche910](https://github.com/asche910)
|
||||
校对:[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,89 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11345-1.html)
|
||||
[#]: subject: (GNOME 3.34 Released With New Features & Performance Improvements)
|
||||
[#]: via: (https://itsfoss.com/gnome-3-34-release/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
GNOME 3.34 发布
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/15/113154i3bcp9p3md3mc3bk.jpg)
|
||||
|
||||
最新版本的 GNOME 代号为“<ruby>塞萨洛尼基<rt>Thessaloniki</rt></ruby>”。考虑到这个版本经过了 6 个月的开发,这应该是对 [GNOME 3.32][1] 的一次令人印象深刻的升级。
|
||||
|
||||
在此版本中,有许多新功能和显著的性能改进。除了新功能外,可定制的程度也得到了提升。
|
||||
|
||||
以下是新的变化:
|
||||
|
||||
### GNOME 3.34 的关键改进
|
||||
|
||||
你可以观看此视频,了解 GNOME 3.34 中的新功能:
|
||||
|
||||
- [视频](https://img.linux.net.cn/static/video/_-qAjPRr5SGoY.mp4)
|
||||
|
||||
#### 拖放图标到文件夹
|
||||
|
||||
新的 shell 主题允许你拖放应用程序抽屉中的图标以重新排列它们,或将它们组合到一个文件夹中。你可能已经在 Android 或 iOS 智能手机中使用过此类功能。
|
||||
|
||||
![You can now drag and drop icons into a folder][2]
|
||||
|
||||
#### 改进的日历管理器
|
||||
|
||||
改进的日历管理器可以轻松地与第三方服务集成,使你能够直接从 Linux 系统管理日程安排,而无需单独使用其他应用程序。
|
||||
|
||||
![GNOME Calendar Improvements][3]
|
||||
|
||||
#### 背景选择的设置
|
||||
|
||||
现在,更容易为主屏幕和锁定屏幕选择自定义背景,因为它在同一屏幕中显示所有可用背景。为你节省至少一次鼠标点击。
|
||||
|
||||
![It’s easier to select backgrounds now][4]
|
||||
|
||||
#### 重新排列搜索选项
|
||||
|
||||
搜索选项和结果可以手动重新排列。因此,当你要搜索某些内容时,可以决定哪些内容先出现。
|
||||
|
||||
#### 响应式设计的“设置”应用
|
||||
|
||||
设置菜单 UI 现在具有响应性,因此无论你使用何种类型(或尺寸)的设备,都可以轻松访问所有选项。这肯定对 [Linux 智能手机(如 Librem 5)][5] 上的 GNOME 有所帮助。
|
||||
|
||||
除了所有这些之外,[官方公告][6]还提到到开发人员的有用补充(增加了系统分析器和虚拟化改进):
|
||||
|
||||
> 对于开发人员,GNOME 3.34 在 Sysprof 中包含更多数据源,使应用程序的性能分析更加容易。对 Builder 的多项改进中包括集成的 D-Bus 检查器。
|
||||
|
||||
![Improved Sysprof tool in GNOME 3.34][7]
|
||||
|
||||
### 如何获得GNOME 3.34?
|
||||
|
||||
虽然新版本已经发布,但它还没有进入 Linux 发行版的官方存储库。所以,我们建议等待它,并在它作为更新包提供时进行升级。不管怎么说,如果你想构建它,你都可以在这里找到[源代码][8]。
|
||||
|
||||
嗯,就是这样。如果你感兴趣,可以查看[完整版本说明][10]以了解技术细节。
|
||||
|
||||
你如何看待新的 GNOME 3.34?
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/gnome-3-34-release/
|
||||
|
||||
作者:[Ankush Das][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://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.gnome.org/news/2019/03/gnome-3-32-released/
|
||||
[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/icon-grid-drag-gnome.png?ssl=1
|
||||
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/gnome-calendar-improvements.jpg?ssl=1
|
||||
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/background-panel-GNOME.png?resize=800%2C555&ssl=1
|
||||
[5]: https://itsfoss.com/librem-linux-phone/
|
||||
[6]: https://www.gnome.org/press/2019/09/gnome-3-34-released/
|
||||
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/sysprof-gnome.jpg?resize=800%2C493&ssl=1
|
||||
[8]: https://download.gnome.org/
|
||||
[9]: https://itsfoss.com/fedora-26-release/
|
||||
[10]: https://help.gnome.org/misc/release-notes/3.34/
|
@ -0,0 +1,78 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11349-1.html)
|
||||
[#]: subject: (Manjaro Linux Graduates From A Hobby Project To A Professional Project)
|
||||
[#]: via: (https://itsfoss.com/manjaro-linux-business-formation/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
Manjaro Linux 从业余爱好项目成长为专业项目
|
||||
======
|
||||
|
||||
> Manjaro 正在走专业化路线。虽然 Manjaro 社区将负责项目的开发和其他相关活动,但该团队已成立了一家公司作为其法人实体处理商业协议和专业服务。
|
||||
|
||||
Manjaro 是一个相当流行的 Linux 发行版,而它只是由三个人(Bernhard、Jonathan 和 Phili)于 2011 年激情之下创建的项目。现在,它是目前[最好的 Linux 发行版][1]之一,所以它不能真的一直还只是个业余爱好项目了,对吧。
|
||||
|
||||
嗯,现在有个好消息:Manjaro 已经建立了一家新公司“[Manjaro GmbH & Co. KG]”,以 [Blue Systems][2] 为顾问,以便能够全职雇佣维护人员,并探索未来的商业机会。
|
||||
|
||||
![][3]
|
||||
|
||||
### 具体有什么变化?
|
||||
|
||||
根据[官方公告][4],Manjaro 项目将保持不变。但是,成立了一家新公司来保护该项目,以允许他们制定法律合同、官方协议和进行其他潜在的商业活动。因此,这使得这个“业余爱好项目”成为了一项专业工作。
|
||||
|
||||
除此之外,捐赠资金将转给非营利性的[财政托管][5]([CommunityBridge][6] 和 [OpenCollective][7]),让他们来代表项目接受和管理资金。请注意,这些捐赠没有被用于创建这个公司,因此,将资金转移给非营利的财务托管将在确保捐赠的同时也确保透明度。
|
||||
|
||||
### 这会有何改善?
|
||||
|
||||
随着这个公司的成立,(如开发者所述)新结构将以下列方式帮助 Manjaro:
|
||||
|
||||
* 使开发人员能够全职投入 Manjaro 及其相关项目;
|
||||
* 在 Linux 相关的比赛和活动中与其他开发人员进行互动;
|
||||
* 保护 Manjaro 作为一个社区驱动项目的独立性,并保护其品牌;
|
||||
* 提供更快的安全更新,更有效地响应用户需求;
|
||||
* 提供在专业层面上作为公司行事的手段。
|
||||
|
||||
Manjaro 团队还阐明了它将如何继续致力于社区:
|
||||
|
||||
> Manjaro 的使命和目标将与以前一样 —— 支持 Manjaro 的协作开发及其广泛使用。这项工作将继续通过捐赠和赞助来支持,这些捐赠和赞助在任何情况下都不会被这个成立的公司使用。
|
||||
|
||||
### 关于 Manjaro 公司的更多信息
|
||||
|
||||
尽管他们提到该项目将独立于公司,但并非所有人都清楚当有了一家具有商业利益的公司时 Manjaro 与“社区”的关系。因此,该团队还在公告中澄清了他们作为一家公司的计划。
|
||||
|
||||
> Manjaro GmbH & Co.KG 的成立旨在有效地参与商业协议、建立合作伙伴关系并提供专业服务。有了这个,Manjaro 开发者 Bernhard 和 Philip 现在可以全职工作投入到 Manjaro,而 Blue Systems 将担任顾问。
|
||||
|
||||
> 公司将能够正式签署合同并承担职责和保障,而社区不能承担或承担责任。
|
||||
|
||||
### 总结
|
||||
|
||||
因此,通过这一举措以及商业机会,他们计划全职工作并聘请贡献者。
|
||||
|
||||
当然,现在他们的意思是“业务”(我希望不是作为坏人)。对此公告的大多数反应都是积极的,我们都祝他们好运。虽然有些人可能对具有“商业”利益的“社区”项目持怀疑态度(还记得 [FreeOffice 和 Manjaro 的挫败][9]吗?),但我认为这是一个有趣的举措。
|
||||
|
||||
你怎么看?请在下面的评论中告诉我们你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/manjaro-linux-business-formation/
|
||||
|
||||
作者:[Ankush Das][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://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/best-linux-distributions/
|
||||
[2]: https://www.blue-systems.com/
|
||||
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/manjaro-gmbh.jpg?ssl=1
|
||||
[4]: https://forum.manjaro.org/t/manjaro-is-taking-the-next-step/102105
|
||||
[5]: https://en.wikipedia.org/wiki/Fiscal_sponsorship
|
||||
[6]: https://communitybridge.org/
|
||||
[7]: https://opencollective.com/
|
||||
[8]: https://itsfoss.com/linux-mint-hacked/
|
||||
[9]: https://itsfoss.com/libreoffice-freeoffice-manjaro-linux/
|
@ -0,0 +1,103 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11351-1.html)
|
||||
[#]: subject: (Sandboxie's path to open source, update on the Pentagon's open source initiative, open source in Hollywood, and more)
|
||||
[#]: via: (https://opensource.com/article/19/9/news-september-15)
|
||||
[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo)
|
||||
|
||||
开源新闻综述:五角大楼、好莱坞和 Sandboxie 的开源
|
||||
======
|
||||
|
||||
> 不要错过两周以来最大的开源头条新闻。
|
||||
|
||||
![Weekly news roundup with TV][1]
|
||||
|
||||
在本期我们的开源新闻综述中有 Sandboxie 的开源之路、五角大楼开源计划的进一步变化、好莱坞开源等等!
|
||||
|
||||
### 五角大楼不符合白宫对开源软件的要求
|
||||
|
||||
2016 年,美国白宫要求每个美国政府机构必须在三年内开放至少 20% 的定制软件。2017 年有一篇关于这一倡议的[有趣文章][5],其中列出了一些令人激动的事情和面临的挑战。
|
||||
|
||||
根据美国政府问责局(GAO)的说法,[美国五角大楼做的还远远不足][6]。
|
||||
|
||||
在一篇关于 Nextgov 的文章中,Jack Corrigan 写道,截至 2019 年 7 月,美国五角大楼仅发布了 10% 的代码为开源代码。他们还没有实施的其它白宫任务包括要求制定开源软件政策和定制代码的清单。
|
||||
|
||||
根据该报告,一些美国政府官员告诉 GAO,他们担心美国政府部门间共享代码的安全风险。他们还承认没有创建衡量开源工作成功的指标。美国五角大楼的首席技术官将五角大楼的规模列为不执行白宫的开源任务的原因。在周二发布的一份报告中,GAO 表示,“在(美国国防部)完全实施其试点计划并确定完成行政管理和预算局(OMB)要求的里程碑之前,该部门将无法达成显著的成本节约和效率的目的。”
|
||||
|
||||
### Sandboxie 在开源的过程中变成了免费软件
|
||||
|
||||
一家英国安全公司 Sophos Group plc 发布了[其流行的 Sandboxie 工具的免费版本][2],它用作Windows 的隔离操作环境([可在此下载][2])。
|
||||
|
||||
Sophos 表示,由于 Sandboxie 不是其业务的核心,因此更容易做出的决定就是关闭它。但 Sandboxie 因为无需让用户的操作系统冒风险就可以在安全的环境中运行未知软件而[广受赞誉][3],因此该团队正在投入额外的工作将其作为开源软件发布。这个免费但非开源的中间阶段似乎与当前的系统设计有关,因为它需要激活密钥:
|
||||
|
||||
> Sandboxie 目前使用许可证密钥来激活和授予仅针对付费客户开放的高级功能的访问权限(与使用免费版本的用户相比)。我们修改了代码,并发布了一个不限制任何功能的免费版本的更新版。换句话说,新的免费许可证将可以访问之前仅供付费客户使用的所有功能。
|
||||
|
||||
受此工具的社区影响,Sophos 的高级领导人宣布发布 Sandboxie 版本 5.31.4,这个不受限制的程序版本将保持免费,直到该工具完全开源。
|
||||
|
||||
> “Sandboxie 用户群代表了一些最热情、前瞻性和知识渊博的安全社区成员,我们不想让你失望,”[Sophos 的博文说到][4]。“经过深思熟虑后,我们认为让 Sandboxie 走下去的最佳方式是将其交还给用户,将其转换为开源工具。”
|
||||
|
||||
### 志愿者团队致力于查找和数字化无版权书籍
|
||||
|
||||
1924 年以前在美国出版的所有书籍都是[公有的、可以自由使用/复制的][7]。1964 年及之后出版的图书在出版日期后将保留 95 年的版权。但由于版权漏洞,1923 年至 1964 年间出版的书籍中有高达 75% 可以免费阅读和复制。现在只需要耗时确认那些书是什么。
|
||||
|
||||
因此,一些图书馆、志愿者和档案管理员们联合起来了解哪些图书没有版权,然后将其数字化并上传到互联网。由于版权续约记录已经数字化,因此很容易判断 1923 年至 1964 年间出版的书籍是否更新了其版权。但是,由于试图提供的是反证,因此寻找缺乏版权更新的难度要大得多。
|
||||
|
||||
参与者包括纽约公共图书馆(NYPL),它[最近解释了][8]为什么这个耗时的项目是值得的。为了帮助更快地找到更多书籍,NYPL 将许多记录转换为 XML 格式。这样可以更轻松地自动执行查找可以将哪些书籍添加到公共域的过程。
|
||||
|
||||
### 好莱坞的学院软件基金会获得新成员
|
||||
|
||||
微软和苹果公司宣布计划以<ruby>学院软件基金会<rt>Academy Software Foundation</rt></ruby>(ASWF)的高级会员做出贡献。他们将加入[创始董事会成员][9],其它成员还包括 Netflix、Google Cloud、Disney Studios 和 Sony Pictures。
|
||||
|
||||
学院软件基金会于 2018 年作为[电影艺术与科学学院][10]和[Linux 基金会][11]的联合项目而启动。
|
||||
|
||||
> 学院软件基金会(ASWF)的使命是提高贡献到内容创作行业的开源软件库的质量和数量;提供一个中立的论坛来协调跨项目的工作;提供通用的构建和测试基础架构;并为个人和组织提供参与推进我们的开源生态系统的明确途径。
|
||||
|
||||
在第一年内,该基金会构建了 [OpenTimelineIO][12],这是一种开源 API 和交换格式,可帮助工作室团队跨部门协作。OpenTImelineIO 被该[基金会技术咨询委员会][13]去年 7 月正式接受为第五个托管项目。他们现在将它与 [OpenColorIO][14]、[OpenCue][15]、[OpenEXR][16] 和 [OpenVDB] [17] 并列维护。
|
||||
|
||||
### 其它新闻
|
||||
|
||||
* [Comcast 将开源网络软件投入生产环境][18]
|
||||
* [SD Times 本周开源项目:Ballerina][19]
|
||||
* [美国国防部努力实施开源计划][20]
|
||||
* [Kong 开源通用服务网格 Kuma][21]
|
||||
* [Eclipse 推出 Jakarta EE 8][22]
|
||||
|
||||
一如既往地感谢 Opensource.com 的工作人员和主持人本周的帮助。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/news-september-15
|
||||
|
||||
作者:[Lauren Maffeo][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/lmaffeo
|
||||
[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 (Weekly news roundup with TV)
|
||||
[2]: https://www.sandboxie.com/DownloadSandboxie
|
||||
[3]: https://betanews.com/2019/09/13/sandboxie-free-open-source/
|
||||
[4]: https://community.sophos.com/products/sandboxie/f/forum/115109/major-sandboxie-news-sandboxie-is-now-a-free-tool-with-plans-to-transition-it-to-an-open-source-tool/414522
|
||||
[5]: https://medium.com/@DefenseDigitalService/code-mil-an-open-source-initiative-at-the-pentagon-5ae4986b79bc
|
||||
[6]: https://www.nextgov.com/analytics-data/2019/09/pentagon-needs-make-more-software-open-source-watchdog-says/159832/
|
||||
[7]: https://www.vice.com/en_us/article/a3534j/libraries-and-archivists-are-scanning-and-uploading-books-that-are-secretly-in-the-public-domain
|
||||
[8]: https://www.nypl.org/blog/2019/09/01/historical-copyright-records-transparency
|
||||
[9]: https://variety.com/2019/digital/news/microsoft-apple-academy-software-foundation-1203334675/
|
||||
[10]: https://www.oscars.org/
|
||||
[11]: http://www.linuxfoundation.org/
|
||||
[12]: https://github.com/PixarAnimationStudios/OpenTimelineIO
|
||||
[13]: https://www.linuxfoundation.org/press-release/2019/07/opentimelineio-joins-aswf/
|
||||
[14]: https://opencolorio.org/
|
||||
[15]: https://www.opencue.io/
|
||||
[16]: https://www.openexr.com/
|
||||
[17]: https://www.openvdb.org/
|
||||
[18]: https://www.fiercetelecom.com/operators/comcast-puts-open-source-networking-software-into-production
|
||||
[19]: https://sdtimes.com/os/sd-times-open-source-project-of-the-week-ballerina/
|
||||
[20]: https://www.fedscoop.com/open-source-software-dod-struggles/
|
||||
[21]: https://sdtimes.com/micro/kong-open-sources-universal-service-mesh-kuma/
|
||||
[22]: https://devclass.com/2019/09/11/hey-were-open-source-again-eclipse-unveils-jakarta-ee-8/
|
@ -0,0 +1,97 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11384-1.html)
|
||||
[#]: subject: (How to freeze and lock your Linux system (and why you would want to))
|
||||
[#]: via: (https://www.networkworld.com/article/3438818/how-to-freeze-and-lock-your-linux-system-and-why-you-would-want-to.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
如何冻结和锁定你的 Linux 系统
|
||||
======
|
||||
|
||||
> 冻结终端窗口并锁定屏幕意味着什么 - 以及如何在 Linux 系统上管理这些活动。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/24/230938vgxzv3nrakk0wxnw.jpg)
|
||||
|
||||
如何在 Linux 系统上冻结和“解冻”屏幕,很大程度上取决于这些术语的含义。有时“冻结屏幕”可能意味着冻结终端窗口,以便该窗口内的活动停止。有时它意味着锁定屏幕,这样就没人可以在你去拿一杯咖啡时,走到你的系统旁边代替你输入命令了。
|
||||
|
||||
在这篇文章中,我们将研究如何使用和控制这些操作。
|
||||
|
||||
### 如何在 Linux 上冻结终端窗口
|
||||
|
||||
你可以输入 `Ctrl+S`(按住 `Ctrl` 键和 `s` 键)冻结 Linux 系统上的终端窗口。把 `s` 想象成“<ruby>开始冻结<rt>start the freeze</rt></ruby>”。如果在此操作后继续输入命令,那么你不会看到输入的命令或你希望看到的输出。实际上,命令将堆积在一个队列中,并且只有在通过输入 `Ctrl+Q` 解冻时才会运行。把它想象成“<ruby>退出冻结<rt>quit the freeze</rt></ruby>”。
|
||||
|
||||
查看其工作的一种简单方式是使用 `date` 命令,然后输入 `Ctrl+S`。接着再次输入 `date` 命令并等待几分钟后再次输入 `Ctrl+Q`。你会看到这样的情景:
|
||||
|
||||
```
|
||||
$ date
|
||||
Mon 16 Sep 2019 06:47:34 PM EDT
|
||||
$ date
|
||||
Mon 16 Sep 2019 06:49:49 PM EDT
|
||||
```
|
||||
|
||||
这两次时间显示的差距表示第二次的 `date` 命令直到你解冻窗口时才运行。
|
||||
|
||||
无论你是坐在计算机屏幕前还是使用 PuTTY 等工具远程运行,终端窗口都可以冻结和解冻。
|
||||
|
||||
这有一个可以派上用场的小技巧。如果你发现终端窗口似乎处于非活动状态,那么可能是你或其他人无意中输入了 `Ctrl+S`。那么,输入 `Ctrl+Q` 来尝试解决不妨是个不错的办法。
|
||||
|
||||
### 如何锁定屏幕
|
||||
|
||||
要在离开办公桌前锁定屏幕,请按住 `Ctrl+Alt+L` 或 `Super+L`(即按住 `Windows` 键和 `L` 键)。屏幕锁定后,你必须输入密码才能重新登录。
|
||||
|
||||
### Linux 系统上的自动屏幕锁定
|
||||
|
||||
虽然最佳做法建议你在即将离开办公桌时锁定屏幕,但 Linux 系统通常会在一段时间没有活动后自动锁定。 “消隐”屏幕(使其变暗)并实际锁定屏幕(需要登录才能再次使用)的时间取决于你个人首选项中的设置。
|
||||
|
||||
要更改使用 GNOME 屏幕保护程序时屏幕变暗所需的时间,请打开设置窗口并选择 “Power” 然后 “Blank screen”。你可以选择 1 到 15 分钟或从不变暗。要选择屏幕变暗后锁定所需时间,请进入设置,选择 “Privacy”,然后选择 “Blank screen”。设置应包括 1、2、3、5 和 30 分钟或一小时。
|
||||
|
||||
### 如何在命令行锁定屏幕
|
||||
|
||||
如果你使用的是 GNOME 屏幕保护程序,你还可以使用以下命令从命令行锁定屏幕:
|
||||
|
||||
```
|
||||
gnome-screensaver-command -l
|
||||
```
|
||||
|
||||
这里是小写的 L,代表“锁定”。
|
||||
|
||||
### 如何检查锁屏状态
|
||||
|
||||
你还可以使用 `gnome-screensaver` 命令检查屏幕是否已锁定。使用 `--query` 选项,该命令会告诉你屏幕当前是否已锁定(即处于活动状态)。使用 `--time` 选项,它会告诉你锁定生效的时间。这是一个示例脚本:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
|
||||
gnome-screensaver-command --query
|
||||
gnome-screensaver-command --time
|
||||
```
|
||||
|
||||
运行脚本将会输出:
|
||||
|
||||
```
|
||||
$ ./check_lockscreen
|
||||
The screensaver is active
|
||||
The screensaver has been active for 1013 seconds.
|
||||
```
|
||||
|
||||
#### 总结
|
||||
|
||||
如果你记住了正确的控制方式,那么锁定终端窗口是很简单的。对于屏幕锁定,它的效果取决于你自己的设置,或者你是否习惯使用默认设置。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3438818/how-to-freeze-and-lock-your-linux-system-and-why-you-would-want-to.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
|
||||
[3]: https://www.facebook.com/NetworkWorld/
|
||||
[4]: https://www.linkedin.com/company/network-world
|
160
published/201909/20190916 How to start developing with .NET.md
Normal file
160
published/201909/20190916 How to start developing with .NET.md
Normal file
@ -0,0 +1,160 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11397-1.html)
|
||||
[#]: subject: (How to start developing with .NET)
|
||||
[#]: via: (https://opensource.com/article/19/9/getting-started-net)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
如何在 Linux/Windows/MacOS 上使用 .NET 进行开发
|
||||
======
|
||||
|
||||
> 了解 .NET 开发平台启动和运行的基础知识。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/28/111101n3i43c38tv3j9im4.jpg)
|
||||
|
||||
.NET 框架由 Microsoft 于 2000 年发布。该平台的开源实现 [Mono][2] 在 21 世纪初成为了争议的焦点,因为微软拥有 .NET 技术的多项专利,并且可能使用这些专利来终止 Mono 项目。幸运的是,在 2014 年,微软宣布 .NET 开发平台从此成为 MIT 许可下的开源平台,并在 2016 年收购了开发 Mono 的 Xamarin 公司。
|
||||
|
||||
.NET 和 Mono 已经同时可用于 C#、F#、GTK+、Visual Basic、Vala 等的跨平台编程环境。使用 .NET 和 Mono 创建的程序已经应用于 Linux、BSD、Windows、MacOS、Android,甚至一些游戏机。你可以使用 .NET 或 Mono 来开发 .NET 应用。这两个都是开源的,并且都有活跃和充满活力的社区。本文重点介绍微软的 .NET 环境。
|
||||
|
||||
### 如何安装 .NET
|
||||
|
||||
.NET 下载被分为多个包:一个仅包含 .NET 运行时,另一个 .NET SDK 包含了 .NET Core 和运行时。根据架构和操作系统版本,这些包可能有多个版本。要开始使用 .NET 进行开发,你必须[安装该 SDK][3]。它为你提供了 [dotnet][4] 终端或 PowerShell 命令,你可以使用它们来创建和生成项目。
|
||||
|
||||
#### Linux
|
||||
|
||||
要在 Linux 上安装 .NET,首先将微软 Linux 软件仓库添加到你的计算机。
|
||||
|
||||
在 Fedora 上:
|
||||
|
||||
```
|
||||
$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
|
||||
$ sudo wget -q -O /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/27/prod.repo
|
||||
```
|
||||
|
||||
在 Ubuntu 上:
|
||||
|
||||
```
|
||||
$ wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
|
||||
$ sudo dpkg -i packages-microsoft-prod.deb
|
||||
```
|
||||
|
||||
接下来,使用包管理器安装 SDK,将 `<X.Y>` 替换为当前版本的 .NET 版本:
|
||||
|
||||
在 Fedora 上:
|
||||
|
||||
```
|
||||
$ sudo dnf install dotnet-sdk-<X.Y>
|
||||
```
|
||||
|
||||
在 Ubuntu 上:
|
||||
|
||||
```
|
||||
$ sudo apt install apt-transport-https
|
||||
$ sudo apt update
|
||||
$ sudo apt install dotnet-sdk-<X.Y>
|
||||
```
|
||||
|
||||
下载并安装所有包后,打开终端并输入下面命令确认安装:
|
||||
|
||||
```
|
||||
$ dotnet --version
|
||||
X.Y.Z
|
||||
```
|
||||
|
||||
#### Windows
|
||||
|
||||
如果你使用的是微软 Windows,那么你可能已经安装了 .NET 运行时。但是,要开发 .NET 应用,你还必须安装 .NET Core SDK。
|
||||
|
||||
首先,[下载安装程序][3]。请认准下载 .NET Core 进行跨平台开发(.NET Framework 仅适用于 Windows)。下载 .exe 文件后,双击该文件启动安装向导,然后单击两下进行安装:接受许可证并允许安装继续。
|
||||
|
||||
![Installing dotnet on Windows][5]
|
||||
|
||||
然后,从左下角的“应用程序”菜单中打开 PowerShell。在 PowerShell 中,输入测试命令:
|
||||
|
||||
```
|
||||
PS C:\Users\osdc> dotnet
|
||||
```
|
||||
|
||||
如果你看到有关 dotnet 安装的信息,那么说明 .NET 已正确安装。
|
||||
|
||||
#### MacOS
|
||||
|
||||
如果你使用的是 Apple Mac,请下载 .pkg 形式的 [Mac 安装程序][3]。下载并双击该 .pkg 文件,然后单击安装程序。你可能需要授予安装程序权限,因为该软件包并非来自 App Store。
|
||||
|
||||
下载并安装所有软件包后,请打开终端并输入以下命令来确认安装:
|
||||
|
||||
```
|
||||
$ dotnet --version
|
||||
X.Y.Z
|
||||
```
|
||||
|
||||
### Hello .NET
|
||||
|
||||
`dotnet` 命令提供了一个用 .NET 编写的 “hello world” 示例程序。或者,更准确地说,该命令提供了示例应用。
|
||||
|
||||
首先,使用 `dotnet` 命令以及 `new` 和 `console` 参数创建一个控制台应用的项目目录及所需的代码基础结构。使用 `-o` 选项指定项目名称:
|
||||
|
||||
```
|
||||
$ dotnet new console -o hellodotnet
|
||||
```
|
||||
|
||||
这将在当前目录中创建一个名为 `hellodotnet` 的目录。进入你的项目目录并看一下:
|
||||
|
||||
```
|
||||
$ cd hellodotnet
|
||||
$ dir
|
||||
hellodotnet.csproj obj Program.cs
|
||||
```
|
||||
|
||||
`Program.cs` 是一个空的 C# 文件,它包含了一个简单的 Hello World 程序。在文本编辑器中打开查看它。微软的 Visual Studio Code 是一个使用 dotnet 编写的跨平台的开源应用,虽然它不是一个糟糕的文本编辑器,但它会收集用户的大量数据(在它的二进制发行版的许可证中授予了自己权限)。如果要尝试使用 Visual Studio Code,请考虑使用 [VSCodium][6],它是使用 Visual Studio Code 的 MIT 许可的源码构建的版本,而*没有*远程收集(请阅读[此文档][7]来禁止此构建中的其他形式追踪)。或者,只需使用现有的你最喜欢的文本编辑器或 IDE。
|
||||
|
||||
新控制台应用中的样板代码为:
|
||||
|
||||
```
|
||||
using System;
|
||||
|
||||
namespace hellodotnet
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Console.WriteLine("Hello World!");
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
要运行该程序,请使用 `dotnet run` 命令:
|
||||
|
||||
```
|
||||
$ dotnet run
|
||||
Hello World!
|
||||
```
|
||||
|
||||
这是 .NET 和 `dotnet` 命令的基本工作流程。这里有完整的 [.NET C# 指南][8],并且都是与 .NET 相关的内容。关于 .NET 实战示例,请关注 [Alex Bunardzic][9] 在 opensource.com 中的变异测试文章。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/getting-started-net
|
||||
|
||||
作者:[Seth Kenlon][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/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer)
|
||||
[2]: https://www.monodevelop.com/
|
||||
[3]: https://dotnet.microsoft.com/download
|
||||
[4]: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet?tabs=netcore21
|
||||
[5]: https://opensource.com/sites/default/files/uploads/dotnet-windows-install.jpg (Installing dotnet on Windows)
|
||||
[6]: https://vscodium.com/
|
||||
[7]: https://github.com/VSCodium/vscodium/blob/master/DOCS.md
|
||||
[8]: https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intro-to-csharp/
|
||||
[9]: https://opensource.com/users/alex-bunardzic (View user profile.)
|
@ -0,0 +1,92 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11355-1.html)
|
||||
[#]: subject: (Linux Plumbers, Appwrite, and more industry trends)
|
||||
[#]: via: (https://opensource.com/article/19/9/conferences-industry-trends)
|
||||
[#]: author: (Tim Hildred https://opensource.com/users/thildred)
|
||||
|
||||
|
||||
每周开源点评:Linux Plumbers、Appwrite
|
||||
======
|
||||
|
||||
> 了解每周的开源社区和行业趋势。
|
||||
|
||||
![Person standing in front of a giant computer screen with numbers, data][1]
|
||||
|
||||
作为采用开源开发模式的企业软件公司的高级产品营销经理,这是我为产品营销人员、经理和其他相关人员发布的有关开源社区、市场和行业趋势的定期更新。以下是本次更新中我最喜欢的五篇文章。
|
||||
|
||||
### 《在 Linux Plumbers 会议上解决 Linux 具体细节》
|
||||
|
||||
- [文章地址][2]
|
||||
|
||||
> Linux 的创建者 Linus Torvalds 告诉我,<ruby>内核维护者峰会<rt>Kernel Maintainers Summit</rt></ruby>是顶级 Linux 内核开发人员的邀请制聚会。但是,虽然你可能认为这是关于规划 Linux 内核的未来的会议,但事实并非如此。“这个维护者峰会真的与众不同,因为它甚至不谈论技术问题。”相反,“全都谈的是关于创建和维护 Linux 内核的过程。”
|
||||
|
||||
**影响**:这就像技术版的 Bilderberg 会议:你们举办的都是各种华丽的流行语会议,而在这里我们做出的才是真正的决定。不过我觉得,可能不太会涉及到私人飞机吧。(LCTT 译注:有关 Bilderberg 请自行搜索)
|
||||
|
||||
### 《微软主办第一个 WSL 会议》
|
||||
|
||||
- [文章地址][3]
|
||||
|
||||
> [Whitewater Foundry][4] 是一家专注于 [Windows 的 Linux 子系统(WSL)][5]的创业公司,它的创始人 Hayden Barnes [宣布举办 WSLconf 1][6],这是 WSL 的第一次社区会议。该活动将于 2020 年 3 月 10 日至 11 日在华盛顿州雷德蒙市的微软总部 20 号楼举行。会议是合办的。我们已经知道将有来自[Pengwin(Whitewater 的 Linux for Windows)][7]、微软 WSL 和 Canonical 的 Ubuntu on WSL 开发人员的演讲和研讨会。
|
||||
|
||||
**影响**:微软正在培育社区成长的种子,围绕它越来越多地采用开源软件并作出贡献。这足以让我眼前一亮。
|
||||
|
||||
### 《Appwrite 简介:面向移动和 Web 开发人员的开源后端服务器》
|
||||
|
||||
- [文章链接][10]
|
||||
|
||||
> [Appwrite][11] 是一个新的[开源软件][12],用于前端和移动开发人员的端到端的后端服务器,可以让你更快地构建应用程序。[Appwrite][13] 的目标是抽象和简化 REST API 和工具背后的常见开发任务,以帮助开发人员更快地构建高级应用程序。
|
||||
>
|
||||
> 在这篇文章中,我将简要介绍一些主要的 [Appwrite][14] 服务,并解释它们的主要功能以及它们的设计方式,相比从头开始编写所有后端 API,这可以帮助你更快地构建下一个项目。
|
||||
|
||||
**影响**:随着更多开源中间件变得更易于使用,软件开发越来越容易。Appwrite 声称可将开发时间和成本降低 70%。想象一下这对小型移动开发机构或个人开发者意味着什么。我很好奇他们将如何通过这种方式赚钱。
|
||||
|
||||
### 《“不只是 IT”:开源技术专家说协作文化是政府转型的关键》
|
||||
|
||||
- [文章链接][15]
|
||||
|
||||
> AGL(<ruby>敏捷的政府领导<rt>agile government leadership</rt></ruby>)正在为那些帮助政府更好地为公众工作的人们提供价值支持网络。该组织专注于我非常热衷的事情:DevOps、数字化转型、开源以及许多政府 IT 领导者首选的类似主题。AGL 为我提供了一个社区,可以了解当今最优秀和最聪明的人所做的事情,并与整个行业的同行分享这些知识。
|
||||
|
||||
**影响**:不管你的政治信仰如何,对政府都很容易愤世嫉俗。我发现令人耳目一新的是,政府也是由一个个实际的人组成的,他们大多在尽力将相关技术应用于公益事业。特别是当该技术是开源的!
|
||||
|
||||
### 《彭博社如何通过 Kubernetes 实现接近 90-95% 的硬件利用率》
|
||||
|
||||
- [文章链接][16]
|
||||
|
||||
> 2016 年,彭博社采用了 Kubernetes(当时仍处于 alpha 阶段中),自使用该项目的上游代码以来,取得了显著成果。Rybka 说:“借助 Kubernetes,我们能够非常高效地使用我们的硬件,使利用率接近 90% 到 95%。”Kubernetes 中的自动缩放使系统能够更快地满足需求。此外,Kubernetes “为我们提供了标准化我们构建和管理服务的方法的能力,这意味着我们可以花费更多时间专注于实际使用我们支持的开源工具,”数据和分析基础架构主管 Steven Bower 说,“如果我们想要在世界的另一个位置建立一个新的集群,那么这样做真的非常简单。一切都只是代码。配置就是代码。”
|
||||
|
||||
**影响**:没有什么能像利用率统计那样穿过营销的迷雾。我听说过关于 Kube 的一件事是,当人们运行它时,他们不知道用它做什么。像这样的用例可以给他们(和你)一些想要的东西。
|
||||
|
||||
*我希望你喜欢这个上周重要内容的清单,请下周回来了解有关开源社区、市场和行业趋势的更多信息。*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/conferences-industry-trends
|
||||
|
||||
作者:[Tim Hildred][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/thildred
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
|
||||
[2]: https://www.zdnet.com/article/working-on-linuxs-nuts-and-bolts-at-linux-plumbers/
|
||||
[3]: https://www.zdnet.com/article/microsoft-hosts-first-windows-subsystem-for-linux-conference/
|
||||
[4]: https://github.com/WhitewaterFoundry
|
||||
[5]: https://docs.microsoft.com/en-us/windows/wsl/install-win10
|
||||
[6]: https://www.linkedin.com/feed/update/urn:li:activity:6574754435518599168/
|
||||
[7]: https://www.zdnet.com/article/pengwin-a-linux-specifically-for-windows-subsystem-for-linux/
|
||||
[8]: https://canonical.com/
|
||||
[9]: https://ubuntu.com/
|
||||
[10]: https://medium.com/@eldadfux/introducing-appwrite-an-open-source-backend-server-for-mobile-web-developers-4be70731575d
|
||||
[11]: https://appwrite.io
|
||||
[12]: https://github.com/appwrite/appwrite
|
||||
[13]: https://medium.com/@eldadfux/introducing-appwrite-an-open-source-backend-server-for-mobile-web-developers-4be70731575d?source=friends_link&sk=b6a2be384aafd1fa5b1b6ff12906082c
|
||||
[14]: https://appwrite.io/
|
||||
[15]: https://medium.com/agile-government-leadership/more-than-just-it-open-source-technologist-says-collaborative-culture-is-key-to-government-c46d1489f822
|
||||
[16]: https://www.cncf.io/blog/2019/09/12/how-bloomberg-achieves-close-to-90-95-hardware-utilization-with-kubernetes/
|
215
published/201909/20190917 Getting started with Zsh.md
Normal file
215
published/201909/20190917 Getting started with Zsh.md
Normal file
@ -0,0 +1,215 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11378-1.html)
|
||||
[#]: subject: (Getting started with Zsh)
|
||||
[#]: via: (https://opensource.com/article/19/9/getting-started-zsh)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
Zsh 入门
|
||||
======
|
||||
|
||||
> 从 Bash 进阶到 Z-shell,改进你的 shell 体验。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/23/163910imr1z1qw1ruo9uqs.jpg)
|
||||
|
||||
Z-shell(Zsh)是一种 Bourne 式的交互式 POSIX shell,以其丰富的创新功能而著称。Z-Shell 用户经常会提及它的许多便利之处,赞誉它对效率的提高和丰富的自定义支持。
|
||||
|
||||
如果你刚接触 Linux 或 Unix,但你的经验足以让你可以打开终端并运行一些命令的话,那么你可能使用的就是 Bash shell。Bash 可能是最具有代表意义的自由软件 shell,部分是因为它具有的先进的功能,部分是因为它是大多数流行的 Linux 和 Unix 操作系统上的默认 shell。但是,随着使用的次数越多,你可能会开始发现一些细节可能能够做的更好。开源有一个众所周知的地方,那就是选择。所以,许多人选择从 Bash “毕业”到 Z。
|
||||
|
||||
### Zsh 介绍
|
||||
|
||||
Shell 只是操作系统的接口。交互式 shell 程序允许你通过称为*标准输入*(stdin)的某个东西键入命令,并通过*标准输出*(stdout)和*标准错误*(stderr)获取输出。有很多种 shell,如 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每个都有其开发者所认为最适合于 Shell 的功能。而这些功能的好坏,则取决于最终用户。
|
||||
|
||||
Zsh 具有交互式制表符补全、自动文件搜索、支持正则表达式、用于定义命令范围的高级速记符,以及丰富的主题引擎等功能。这些功能也包含在你所熟悉的其它 Bourne 式 shell 环境中,这意味着,如果你已经了解并喜欢 Bash,那么你也会熟悉 Zsh,除此以外,它还有更多的功能。你可能会认为它是一种 Bash++。
|
||||
|
||||
### 安装 Zsh
|
||||
|
||||
用你的包管理器安装 Zsh。
|
||||
|
||||
在 Fedora、RHEL 和 CentOS 上:
|
||||
|
||||
```
|
||||
$ sudo dnf install zsh
|
||||
```
|
||||
|
||||
在 Ubuntu 和 Debian 上:
|
||||
|
||||
```
|
||||
$ sudo apt install zsh
|
||||
```
|
||||
|
||||
在 MacOS 上你可以使用 MacPorts 安装它:
|
||||
|
||||
```
|
||||
$ sudo port install zsh
|
||||
```
|
||||
|
||||
或使用 Homebrew:
|
||||
|
||||
```
|
||||
$ brew install zsh
|
||||
```
|
||||
|
||||
在 Windows 上也可以运行 Zsh,但是只能在 Linux 层或类似 Linux 的层之上运行,例如 [Windows 的 Linux 子系统][2](WSL)或 [Cygwin][3]。这类安装超出了本文的范围,因此请参考微软的文档。
|
||||
|
||||
### 设置 Zsh
|
||||
|
||||
Zsh 不是终端模拟器。它是在终端仿真器中运行的 shell。因此,要启动 Zsh,必须首先启动一个终端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm2、rxvt 或你喜欢的其它终端。然后,你可以通过键入以下命令启动 Zsh:
|
||||
|
||||
```
|
||||
$ zsh
|
||||
```
|
||||
|
||||
首次启动 Zsh 时,会要求你选择一些配置选项。这些都可以在以后更改,因此请按 `1` 继续。
|
||||
|
||||
```
|
||||
This is the Z Shell configuration function for new users, zsh-newuser-install.
|
||||
|
||||
(q) Quit and do nothing.
|
||||
|
||||
(0) Exit, creating the file ~/.zshrc
|
||||
|
||||
(1) Continue to the main menu.
|
||||
```
|
||||
|
||||
偏好设置分为四类,因此请从顶部开始。
|
||||
|
||||
1. 第一个类使你可以选择在 shell 历史记录文件中保留多少个命令。默认情况下,它设置为 1,000 行。
|
||||
2. Zsh 补全是其最令人兴奋的功能之一。为了简单起见,请考虑使用其默认选项激活它,直到你习惯了它的工作方式。按 `1` 使用默认选项,按 `2` 手动设置选项。
|
||||
3. 选择 Emacs 式键绑定或 Vi 式键绑定。Bash 使用 Emacs 式绑定,因此你可能已经习惯了。
|
||||
4. 最后,你可以了解(以及设置或取消设置)Zsh 的一些精妙的功能。例如,当你提供不带命令的非可执行路径时,可以通过让 Zsh 来改变目录而无需你使用 `cd` 命令。要激活这些额外选项之一,请输入选项号并输入 `s` 进行设置。请尝试打开所有选项以获得完整的 Zsh 体验。你可以稍后通过编辑 `~/.zshrc` 取消设置它们。
|
||||
|
||||
要完成配置,请按 `0`。
|
||||
|
||||
### 使用 Zsh
|
||||
|
||||
刚开始,Zsh 的使用感受就像使用 Bash 一样,这无疑是其众多功能之一。例如,Bash 和 Tcsh 之间就存在严重的差异,因此如果你必须在工作中或在服务器上使用 Bash,而 Zsh 就可以在家里轻松尝试和使用,这样在 Bash 和 Zsh 之间轻松切换就是一种便利。
|
||||
|
||||
#### 在 Zsh 中改变目录
|
||||
|
||||
正是这些微小的差异使 Zsh 变得好用。首先,尝试在没有 `cd` 命令的情况下,将目录更改为 `Documents` 文件夹。简直太棒了,难以置信。如果你输入的是目录路径而没有进一步的指令,Zsh 会更改为该目录:
|
||||
|
||||
```
|
||||
% Documents
|
||||
% pwd
|
||||
/home/seth/Documents
|
||||
```
|
||||
|
||||
而这会在 Bash 或任何其他普通 shell 中导致错误。但是 Zsh 却根本不是普通的 shell,而这仅仅才是开始。
|
||||
|
||||
#### 在 Zsh 中搜索
|
||||
|
||||
当你想使用普通 shell 程序查找文件时,可以使用 `find` 或 `locate` 命令。最起码,你可以使用 `ls -R` 来递归地列出一组目录。Zsh 内置有允许它在当前目录或任何其他子目录中查找文件的功能。
|
||||
|
||||
例如,假设你有两个名为 `foo.txt` 的文件。一个位于你的当前目录中,另一个位于名为 `foo` 的子目录中。在 Bash Shell 中,你可以使用以下命令列出当前目录中的文件:
|
||||
|
||||
```
|
||||
$ ls
|
||||
foo.txt
|
||||
```
|
||||
|
||||
你可以通过明确指明子目录的路径来列出另一个目录:
|
||||
|
||||
```
|
||||
$ ls foo
|
||||
foo.txt
|
||||
```
|
||||
|
||||
要同时列出这两者,你必须使用 `-R` 开关,并结合使用 `grep`:
|
||||
|
||||
```
|
||||
$ ls -R | grep foo.txt
|
||||
foo.txt
|
||||
foo.txt
|
||||
```
|
||||
|
||||
但是在 Zsh 中,你可以使用 `**` 速记符号:
|
||||
|
||||
```
|
||||
% ls **/foo.txt
|
||||
foo.txt
|
||||
foo.txt
|
||||
```
|
||||
|
||||
你可以在任何命令中使用此语法,而不仅限于 `ls`。想象一下在这样的场景中提高的效率:将特定文件类型从一组目录中移动到单个位置、将文本片段串联到一个文件中,或对日志进行抽取。
|
||||
|
||||
### 使用 Zsh 的制表符补全
|
||||
|
||||
制表符补全是 Bash 和其他一些 Shell 中的高级用户功能,它变得司空见惯,席卷了 Unix 世界。Unix 用户不再需要在输入冗长而乏味的路径时使用通配符(例如输入 `/h*/s*h/V*/SCS/sc*/comp*/t*/a*/*9/04/LS*boat*v`,比输入 `/home/seth/Videos/SCS/scenes/composite/takes/approved/109/04/LS_boat-port-cargo-mover.mkv` 要容易得多)。相反,他们只要输入足够的唯一字符串即可按 `Tab` 键。例如,如果你知道在系统的根目录下只有一个以 `h` 开头的目录,则可以键入 `/h`,然后单击 `Tab`。快速、简单、高效。它还会确认路径存在;如果 `Tab` 无法完成任何操作,则说明你在错误的位置或输入了错误的路径部分。
|
||||
|
||||
但是,如果你有许多目录有五个或更多相同的首字母,`Tab` 会坚决拒绝进行补全。尽管在大多数现代终端中,它将(至少会)显示阻止其进行猜测你的意思的文件,但通常需要按两次 `Tab` 键才能显示它们。因此,制表符补全通常会变成来回按下键盘上字母和制表符,以至于你好像在接受钢琴独奏会的训练。
|
||||
|
||||
Zsh 通过循环可能的补全来解决这个小问题。如果键入 `*ls ~/D` 并按 `Tab`,则 Zsh 首先使用 `Documents` 来完成命令;如果再次按 `Tab`,它将提供 `Downloads`,依此类推,直到找到所需的选项。
|
||||
|
||||
### Zsh 中的通配符
|
||||
|
||||
在 Zsh 中,通配符的行为不同于 Bash 中用户所习惯的行为。首先,可以对其进行修改。例如,如果要列出当前目录中的所有文件夹,则可以使用修改后的通配符:
|
||||
|
||||
```
|
||||
% ls
|
||||
dir0 dir1 dir2 file0 file1
|
||||
% ls *(/)
|
||||
dir0 dir1 dir2
|
||||
```
|
||||
|
||||
在此示例中,`(/)` 限定了通配符的结果,因此 Zsh 仅显示目录。要仅列出文件,请使用 `(.)`。要列出符号链接,请使用 `(@)`。要列出可执行文件,请使用 `(*)`。
|
||||
|
||||
```
|
||||
% ls ~/bin/*(*)
|
||||
fop exify tt
|
||||
```
|
||||
|
||||
Zsh 不仅仅知道文件类型。它也可以使用相同的通配符修饰符约定根据修改时间列出。例如,如果要查找在过去八个小时内修改的文件,请使用 `mh` 修饰符(即 “modified hours” 的缩写)和小时的负整数:
|
||||
|
||||
```
|
||||
% ls ~/Documents/*(mh-8)
|
||||
cal.org game.org home.org
|
||||
```
|
||||
|
||||
要查找超过(例如)两天前修改过的文件,修饰符更改为 `md`(即 “modified day” 的缩写),并带上天数的正整数:
|
||||
|
||||
```
|
||||
% ls ~/Documents/*(+2)
|
||||
holiday.org
|
||||
```
|
||||
|
||||
通配符修饰符和限定符还可以做很多事情,因此,请阅读 [Zsh 手册页][4],以获取全部详细信息。
|
||||
|
||||
#### 通配符的副作用
|
||||
|
||||
要像在 Bash 中使用通配符一样使用它,有时必须在 Zsh 中对通配符进行转义。例如,如果要在 Bash 中将某些文件复制到服务器上,则可以使用如下通配符:
|
||||
|
||||
```
|
||||
$ scp IMG_*.JPG seth@example.com:~/www/ph*/*19/09/14
|
||||
```
|
||||
|
||||
这在 Bash 中有效,但是在 Zsh 中会返回错误,因为它在发出 `scp` 命令之前尝试在远程端扩展该变量(通配符)。为避免这种情况,必须转义远程变量(通配符):
|
||||
|
||||
```
|
||||
% scp IMG_*.JPG seth@example.com:~/www/ph\*/\*19/09/14
|
||||
```
|
||||
|
||||
当你切换到新的 shell 时,这些小异常可能会使你感到沮丧。使用 Zsh 时会遇到的问题不多(体验过 Zsh 后切换回 Bash 的可能遇到更多),但是当它们发生时,请保持镇定且坦率。严格遵守 POSIX 的情况很少会出错,但是如果失败了,请查找问题以解决并继续。对于许多在工作中困在一个 shell 上而在家中困在另一个 shell 上的用户来说,[hyperpolyglot.org][5] 已被证明其是无价的。
|
||||
|
||||
在我的下一篇 Zsh 文章中,我将向你展示如何安装主题和插件以定制你的 Z-Shell 甚至 Z-ier。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/getting-started-zsh
|
||||
|
||||
作者:[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
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
|
||||
[2]: https://devblogs.microsoft.com/commandline/category/bash-on-ubuntu-on-windows/
|
||||
[3]: https://www.cygwin.com/
|
||||
[4]: https://linux.die.net/man/1/zsh
|
||||
[5]: http://hyperpolyglot.org/unix-shells
|
@ -0,0 +1,139 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Morisun029)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11360-1.html)
|
||||
[#]: subject: (How to Check Linux Mint Version Number & Codename)
|
||||
[#]: via: (https://itsfoss.com/check-linux-mint-version/)
|
||||
[#]: author: (Sergiu https://itsfoss.com/author/sergiu/)
|
||||
|
||||
如何查看 Linux Mint 版本号和代号
|
||||
======
|
||||
|
||||
Linux Mint 每两年发布一次主版本(如 Mint 19),每六个月左右发布一次次版本(如 Mint 19.1、19.2 等)。 你可以自己升级 Linux Mint 版本,而次版本也会自动更新。
|
||||
|
||||
在所有这些版本中,你可能想知道你正在使用的是哪个版本。了解 Linux Mint 版本号可以帮助你确定某个特定软件是否适用于你的系统,或者检查你的系统是否已达到使用寿命。
|
||||
|
||||
你可能需要 Linux Mint 版本号有多种原因,你也有多种方法可以获取此信息。让我向你展示用图形和命令行的方式获取 Mint 版本信息。
|
||||
|
||||
* [使用命令行查看 Linux Mint 版本信息][1]
|
||||
* [使用 GUI(图形用户界面)查看 Linux Mint 版本信息][2]
|
||||
|
||||
### 使用终端查看 Linux Mint 版本号的方法
|
||||
|
||||
![][3]
|
||||
|
||||
我将介绍几种使用非常简单的命令查看 Linux Mint 版本号和代号的方法。 你可以从 “菜单” 中打开终端,或按 `CTRL+ALT+T`(默认热键)打开。
|
||||
|
||||
本文中的最后两个命令还会输出你当前的 Linux Mint 版本所基于的 Ubuntu 版本。
|
||||
|
||||
#### 1、/etc/issue
|
||||
|
||||
从最简单的 CLI 方法开始,你可以打印出 `/etc/issue` 的内容来检查你的版本号和代号:
|
||||
|
||||
```
|
||||
[email protected]:~$ cat /etc/issue
|
||||
Linux Mint 19.2 Tina \n \l
|
||||
```
|
||||
|
||||
#### 2、hostnamectl
|
||||
|
||||
![hostnamectl][4]
|
||||
|
||||
这一个命令(`hostnamectl`)打印的信息几乎与“系统信息”中的信息相同。 你可以看到你的操作系统(带有版本号)以及你的内核版本。
|
||||
|
||||
#### 3、lsb_release
|
||||
|
||||
`lsb_release` 是一个非常简单的 Linux 实用程序,用于查看有关你的发行版本的基本信息:
|
||||
|
||||
```
|
||||
[email protected]:~$ lsb_release -a
|
||||
No LSB modules are available.
|
||||
Distributor ID: LinuxMint
|
||||
Description: Linux Mint 19.2 Tina
|
||||
Release: 19.2
|
||||
Codename: tina
|
||||
```
|
||||
|
||||
**注:** 我使用 `–a` 标签打印所有参数, 但你也可以使用 `-s` 作为简写格式,`-d` 用于描述等 (用 `man lsb_release` 查看所有选项)
|
||||
|
||||
#### 4、/etc/linuxmint/info
|
||||
|
||||
![/etc/linuxmint/info][5]
|
||||
|
||||
这不是命令,而是 Linux Mint 系统上的文件。只需使用 `cat` 命令将其内容打印到终端,然后查看你的版本号和代号。
|
||||
|
||||
#### 5、使用 /etc/os-release 命令也可以获取到 Ubuntu 代号
|
||||
|
||||
![/etc/os-release][7]
|
||||
|
||||
Linux Mint 基于 Ubuntu。每个 Linux Mint 版本都基于不同的 Ubuntu 版本。了解你的 Linux Mint 版本所基于的 Ubuntu 版本有助你在必须要使用 Ubuntu 版本号的情况下使用(比如你需要在 [Linux Mint 中安装最新的 Virtual Box][8]添加仓库时)。
|
||||
|
||||
`os-release` 则是另一个类似于 `info` 的文件,向你展示 Linux Mint 所基于的 Ubuntu 版本代号。
|
||||
|
||||
#### 6、使用 /etc/upstream-release/lsb-release 只获取 Ubuntu 的基本信息
|
||||
|
||||
如果你只想要查看有关 Ubuntu 的基本信息,请输出 `/etc/upstream-release/lsb-release`:
|
||||
|
||||
```
|
||||
[email protected]:~$ cat /etc/upstream-release/lsb-release
|
||||
DISTRIB_ID=Ubuntu
|
||||
DISTRIB_RELEASE=18.04
|
||||
DISTRIB_CODENAME=bionic
|
||||
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"
|
||||
```
|
||||
|
||||
特别提示:[你可以使用 uname 命令查看 Linux 内核版本][9]。
|
||||
|
||||
```
|
||||
[email protected]:~$ uname -r
|
||||
4.15.0-54-generic
|
||||
```
|
||||
|
||||
**注:** `-r` 代表 release,你可以使用 `man uname` 查看其他信息。
|
||||
|
||||
### 使用 GUI 查看 Linux Mint 版本信息
|
||||
|
||||
如果你对终端和命令行不满意,可以使用图形方法。如你所料,这个非常明了。
|
||||
|
||||
打开“菜单” (左下角),然后转到“偏好设置 > 系统信息”:
|
||||
|
||||
![Linux Mint 菜单][10]
|
||||
|
||||
或者,在菜单中,你可以搜索“System Info”:
|
||||
|
||||
![Menu Search System Info][11]
|
||||
|
||||
在这里,你可以看到你的操作系统(包括版本号),内核和桌面环境的版本号:
|
||||
|
||||
![System Info][12]
|
||||
|
||||
### 总结
|
||||
|
||||
我已经介绍了一些不同的方法,用这些方法你可以快速查看你正在使用的 Linux Mint 的版本和代号(以及所基于的 Ubuntu 版本和内核)。我希望这个初学者教程对你有所帮助。请在评论中告诉我们你最喜欢哪个方法!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/check-linux-mint-version/
|
||||
|
||||
作者:[Sergiu][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Morisun029](https://github.com/Morisun029)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/sergiu/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: tmp.pL5Hg3N6Qt#terminal
|
||||
[2]: tmp.pL5Hg3N6Qt#GUI
|
||||
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/check-linux-mint-version.png?ssl=1
|
||||
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/hostnamectl.jpg?ssl=1
|
||||
[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/linuxmint_info.jpg?ssl=1
|
||||
[6]: https://itsfoss.com/rid-google-chrome-icons-dock-elementary-os-freya/
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/os_release.jpg?ssl=1
|
||||
[8]: https://itsfoss.com/install-virtualbox-ubuntu/
|
||||
[9]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/
|
||||
[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/linux_mint_menu.jpg?ssl=1
|
||||
[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/menu_search_system_info.jpg?ssl=1
|
||||
[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/system_info.png?ssl=1
|
@ -0,0 +1,146 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (name1e5s)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11358-1.html)
|
||||
[#]: subject: (Amid Epstein Controversy, Richard Stallman is Forced to Resign as FSF President)
|
||||
[#]: via: (https://itsfoss.com/richard-stallman-controversy/)
|
||||
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||
|
||||
Richard Stallman 被迫辞去 FSF 主席的职务
|
||||
======
|
||||
|
||||
> Richard Stallman,自由软件基金会的创建者以及主席,已经辞去主席及董事会职务。此前,因为 Stallman 对于爱泼斯坦事件中的受害者的观点,一小撮活动家以及媒体人发起了清除 Stallman 的运动。这份声明就是在这些活动后发生的。阅读全文以获得更多信息。
|
||||
|
||||
![][1]
|
||||
|
||||
### Stallman 事件的背景概述
|
||||
|
||||
如果你不知道这次事件发生的前因后果,请看本段的详细信息。
|
||||
|
||||
[Richard Stallman][2],66岁,是就职于 [MIT][3] 的计算机科学家。他最著名的成就就是在 1983 年发起了[自由软件运动][4]。他也开发了 GNU 项目旗下的部分软件,比如 GCC 和 Emacs。受自由软件运动影响选择使用 GPL 开源协议的项目不计其数。Linux 是其中最出名的项目之一。
|
||||
|
||||
[Jeffrey Epstein][5](爱泼斯坦),美国亿万富翁,金融大佬。其涉嫌为社会上流精英提供性交易服务(其中有未成年少女)而被指控成为性犯罪者。在受审期间,爱泼斯坦在监狱中自杀身亡。
|
||||
|
||||
[Marvin Lee Minsky][6],MIT 知名计算机科学家。他在 MIT 建立了人工智能实验室。2016 年,88 岁的 Minsky 逝世。在 Minsky 逝世后,一位名为 Misky 的爱泼斯坦事件受害者声称其在未成年时曾被“诱导”到爱泼斯坦的私人岛屿,与之发生性关系。
|
||||
|
||||
但是这些与 Richard Stallman 有什么关系?这要从 Stallman 发给 MIT 计算机科学与人工智能实验室(CSAIL)的学生以及附属机构就爱泼斯坦的捐款提出抗议的邮件列表的邮件说起。邮件全文翻译如下:
|
||||
|
||||
> 周五事件的公告对 Marvin Minsky 来说是不公正的。
|
||||
>
|
||||
> “已故的人工智能 ‘先锋’ Marvin Minsky (被控告侵害了爱泼斯坦事件的受害者之一\[2])”
|
||||
>
|
||||
> 不公正之处在于 “<ruby>侵害<rt>assulting</rt></ruby>” 这个用语。“<ruby>性侵犯<rt>sexual assault</rt></ruby>” 这个用语非常的糢糊,夸大了指控的严重性:宣称某人做了 X 但误导别人,让别人觉得这个人做了 Y,Y 远远比 X 严重。
|
||||
>
|
||||
> 上面引用的指控显然就是夸大。报导声称 Minksy 与爱泼斯坦的<ruby>女眷<rt>harem</rt></ruby>之一发生了性关系(详见 <https://www.theverge.com/2019/8/9/20798900/marvin-minsky-jeffrey-epstein-sex-trafficking-island-court-records-unsealed>)。我们假设这是真的(我找不到理由不相信)。
|
||||
>
|
||||
> “<ruby>侵害<rt>assulting</rt></ruby>” 这个词,意味着他使用了某种暴力。但那篇报道并没有提到这个,只说了他们发生了性关系。
|
||||
>
|
||||
> 我们可以想像很多种情况,但最合理的情况是,她在 Marvin 面前表现的像是完全自愿的。假设她是被爱泼斯坦强迫的,那爱泼斯坦有充足的理由让她对大多数人守口如瓶。
|
||||
>
|
||||
> 从各种的指控夸大事例中,我总结出,在指控时使用“<ruby>性侵犯<rt>sexual assault</rt></ruby>”是绝对错误的。
|
||||
>
|
||||
> 无论你想要批判什么行为,你都应该使用特定的词汇来描述,以此避免批判的本质的道德模糊性。
|
||||
|
||||
### “清除 Stallman” 的呼吁
|
||||
|
||||
‘爱泼斯坦’在美国是颇具争议的‘话题’。Stallman 对该敏感事件做出如此鲁莽的 “知识陈述” 不会有好结果,事实也是如此。
|
||||
|
||||
一位机器人学工程师从她的朋友那里收到了转发的邮件并发起了一个[清除 Stallman 的活动][7]。她要的不是澄清或者道歉,她只想要清除斯托曼,就算这意味着 “将 MIT 夷为平地” 也在所不惜。
|
||||
|
||||
> 是,至少 Stallman 没有被控强奸任何人。但这就是我们的最高标准吗?这所声望极高的学院坚持的标准就是这样的吗?如果这是麻省理工学院想要捍卫的、想要代表的标准的话,还不如把这破学校夷为平地…
|
||||
>
|
||||
> 如果有必要的话,就把所有人都清除出去,之后从废墟中建立出更好的秩序。
|
||||
>
|
||||
> —— Salem,发起“清除 Stallman“运动的机器人学专业学生
|
||||
|
||||
Salem 的声讨最初没有被主流媒体重视。但它还是被反对软件行业内的精英崇拜以及性别偏见的积极分子发现了。
|
||||
|
||||
> [#epstein][8] [#MIT][9] 嗨 记者没有回复我我很生气就自己写了这么个故事。作为 MIT 的校友我还真是高兴啊🙃 <https://t.co/D4V5L5NzPA>
|
||||
>
|
||||
> — SZJG (@selamjie) [September 12, 2019][10]
|
||||
|
||||
.
|
||||
|
||||
> 是不是对于性侵儿童的 “杰出混蛋” 我们也可以辩护说 “万一这是你情我愿的” <https://t.co/gSYPJ3WOfp>
|
||||
>
|
||||
> — Tracy Chou 👩🏻💻 (@triketora) [September 13, 2019][11]
|
||||
|
||||
.
|
||||
|
||||
> 多年来我就一直发推说 Richard "RMS" Stallman 这人有多恶心 —— 恋童癖、厌女症、还残障歧视
|
||||
>
|
||||
> 不可避免的是,每次我这样做,都会有老哥检查我的数据来源,然后说 “这都是几年前的事了!他现在变了!”
|
||||
>
|
||||
> 变个屁。 <https://t.co/ti2SrlKObp>
|
||||
>
|
||||
> — Sarah Mei (@sarahmei) [September 12, 2019][12]
|
||||
|
||||
下面是 Sage Sharp 开头的一篇关于 Stallman 的行为如何对科技人员产生负面影响的帖子:
|
||||
|
||||
> 👇大家说下 Richard Stallman 对科技从业者的影响吧,尤其是女性。 [例如: 强奸、乱伦、残障歧视、性交易]
|
||||
>
|
||||
> [@fsf][13] 有必要永久禁止 Richard Stallman 担任自由软件基金会董事会主席。
|
||||
>
|
||||
> — Sage Sharp (@\_sagesharp\_) [September 16, 2019][14]
|
||||
|
||||
Stallman 一直以来也不是一个圣人。他粗暴,不合时宜、多年来一直在开带有性别歧视的笑话。你可以在[这里][15]和[这里][16]读到。
|
||||
|
||||
很快这个消息就被 [The Vice][17]、[每日野兽][18],[未来主义][19]等大媒体采访。他们把 Stallman 描绘成爱泼斯坦的捍卫者。在强烈的抗议声中,[GNOME 执行董事威胁要结束 GNOME 和 FSF 之间的关系][20]。
|
||||
|
||||
最后,Stallman 先是从 MIT 辞职,现在又从 [自由软件基金会][21] 辞职。
|
||||
|
||||
![][22]
|
||||
|
||||
### 危险的特权?
|
||||
|
||||
我们见识到了,把一个人从他创建并为之工作了三十多年的组织中驱逐出去仅仅需要五天。这甚至还是在 Stallman 没有参与性交易丑闻的情况下。
|
||||
|
||||
其中一些 “活动家” 过去也曾[针对过 Linux 的作者 Linus Torvalds][23]。Linux 基金会背后的管理层预见到了科技行业激进主义的增长趋势,因此他们制定了[适用于 Linux 内核开发的行为准则][24]并[强制 Torvalds 接受培训以改善他的行为][25]。如果他们没有采取纠正措施,可能 Torvalds 也已经被批倒批臭了。
|
||||
|
||||
忽视技术支持者的鲁莽行为和性别歧视是不可接受的,但是对于那些遇到不同意某种流行观点的人就进行声讨,施以私刑也是不道德的做法。我不支持 Stallman 和他过去的言论,但我也不能接受他以这种方式(被迫?)辞职。
|
||||
|
||||
Techrights 对此有一些有趣的评论,你可以在[这里][26]和[这里][27]看到。
|
||||
|
||||
*你对此事有何看法?请文明分享你的观点和意见。过激评论将不会公布。*
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/richard-stallman-controversy/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[name1e5s](https://github.com/name1e5s)
|
||||
校对:[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://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/stallman-conroversy.png?w=800&ssl=1
|
||||
[2]: https://en.wikipedia.org/wiki/Richard_Stallman
|
||||
[3]: https://en.wikipedia.org/wiki/Massachusetts_Institute_of_Technology
|
||||
[4]: https://en.wikipedia.org/wiki/Free_software_movement
|
||||
[5]: https://en.wikipedia.org/wiki/Jeffrey_Epstein
|
||||
[6]: https://en.wikipedia.org/wiki/Marvin_Minsky
|
||||
[7]: https://medium.com/@selamie/remove-richard-stallman-fec6ec210794
|
||||
[8]: https://twitter.com/hashtag/epstein?src=hash&ref_src=twsrc%5Etfw
|
||||
[9]: https://twitter.com/hashtag/MIT?src=hash&ref_src=twsrc%5Etfw
|
||||
[10]: https://twitter.com/selamjie/status/1172244207978897408?ref_src=twsrc%5Etfw
|
||||
[11]: https://twitter.com/triketora/status/1172443389536555009?ref_src=twsrc%5Etfw
|
||||
[12]: https://twitter.com/sarahmei/status/1172283772428906496?ref_src=twsrc%5Etfw
|
||||
[13]: https://twitter.com/fsf?ref_src=twsrc%5Etfw
|
||||
[14]: https://twitter.com/_sagesharp_/status/1173637138413318144?ref_src=twsrc%5Etfw
|
||||
[15]: https://geekfeminism.wikia.org/wiki/Richard_Stallman
|
||||
[16]: https://medium.com/@selamie/remove-richard-stallman-appendix-a-a7e41e784f88
|
||||
[17]: https://www.vice.com/en_us/article/9ke3ke/famed-computer-scientist-richard-stallman-described-epstein-victims-as-entirely-willing
|
||||
[18]: https://www.thedailybeast.com/famed-mit-computer-scientist-richard-stallman-defends-epstein-victims-were-entirely-willing
|
||||
[19]: https://futurism.com/richard-stallman-epstein-scandal
|
||||
[20]: https://blog.halon.org.uk/2019/09/gnome-foundation-relationship-gnu-fsf/
|
||||
[21]: https://www.fsf.org/news/richard-m-stallman-resigns
|
||||
[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/richard-stallman.png?resize=800%2C94&ssl=1
|
||||
[23]: https://www.newyorker.com/science/elements/after-years-of-abusive-e-mails-the-creator-of-linux-steps-aside
|
||||
[24]: https://itsfoss.com/linux-code-of-conduct/
|
||||
[25]: https://itsfoss.com/torvalds-takes-a-break-from-linux/
|
||||
[26]: http://techrights.org/2019/09/15/media-attention-has-been-shifted/
|
||||
[27]: http://techrights.org/2019/09/16/stallman-removed/
|
@ -0,0 +1,111 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11389-1.html)
|
||||
[#]: subject: (How to remove carriage returns from text files on Linux)
|
||||
[#]: via: (https://www.networkworld.com/article/3438857/how-to-remove-carriage-returns-from-text-files-on-linux.html)
|
||||
[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
|
||||
|
||||
如何在 Linux 中删除文本中的回车字符
|
||||
======
|
||||
|
||||
> 当回车字符(`Ctrl+M`)让你紧张时,别担心。有几种简单的方法消除它们。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/25/214211xenk2dqfepx3xemm.jpg)
|
||||
|
||||
“回车”字符可以往回追溯很长一段时间 —— 早在打字机上就有一个机械装置或杠杆将承载纸滚筒的机架移到右边,以便可以重新在左侧输入字母。他们在 Windows 上的文本文件上保留了它,但从未在 Linux 系统上使用过。当你尝试在 Linux 上处理在 Windows 上创建的文件时,这种不兼容性有时会导致问题,但这是一个非常容易解决的问题。
|
||||
|
||||
如果你使用 `od`(<ruby>八进制转储<rt>octal dump</rt></ruby>)命令查看文件,那么回车(也用 `Ctrl+M` 代表)字符将显示为八进制的 15。字符 `CRLF` 通常用于表示 Windows 文本文件中的一行结束的回车符和换行符序列。那些注意看八进制转储的会看到 `\r\n`。相比之下,Linux 文本仅以换行符结束。
|
||||
|
||||
这有一个 `od` 输出的示例,高亮显示了行中的 `CRLF` 字符,以及它的八进制。
|
||||
|
||||
```
|
||||
$ od -bc testfile.txt
|
||||
0000000 124 150 151 163 040 151 163 040 141 040 164 145 163 164 040 146
|
||||
T h i s i s a t e s t f
|
||||
0000020 151 154 145 040 146 162 157 155 040 127 151 156 144 157 167 163
|
||||
i l e f r o m W i n d o w s
|
||||
0000040 056 015 012 111 164 047 163 040 144 151 146 146 145 162 145 156 <==
|
||||
. \r \n I t ' s d i f f e r e n <==
|
||||
0000060 164 040 164 150 141 156 040 141 040 125 156 151 170 040 164 145
|
||||
t t h a n a U n i x t e
|
||||
0000100 170 164 040 146 151 154 145 015 012 167 157 165 154 144 040 142 <==
|
||||
x t f i l e \r \n w o u l d b <==
|
||||
```
|
||||
|
||||
虽然这些字符不是大问题,但是当你想要以某种方式解析文本,并且不希望就它们是否存在进行编码时,这有时候会产生干扰。
|
||||
|
||||
### 3 种从文本中删除回车符的方法
|
||||
|
||||
幸运的是,有几种方法可以轻松删除回车符。这有三个选择:
|
||||
|
||||
#### dos2unix
|
||||
|
||||
你可能会在安装时遇到麻烦,但 `dos2unix` 可能是将 Windows 文本转换为 Unix/Linux 文本的最简单方法。一个命令带上一个参数就行了。不需要第二个文件名。该文件会被直接更改。
|
||||
|
||||
```
|
||||
$ dos2unix testfile.txt
|
||||
dos2unix: converting file testfile.txt to Unix format...
|
||||
```
|
||||
|
||||
你应该会发现文件长度减少,具体取决于它包含的行数。包含 100 行的文件可能会缩小 99 个字符,因为只有最后一行不会以 `CRLF` 字符结尾。
|
||||
|
||||
之前:
|
||||
|
||||
```
|
||||
-rw-rw-r-- 1 shs shs 121 Sep 14 19:11 testfile.txt
|
||||
```
|
||||
|
||||
之后:
|
||||
|
||||
```
|
||||
-rw-rw-r-- 1 shs shs 118 Sep 14 19:12 testfile.txt
|
||||
```
|
||||
|
||||
如果你需要转换大量文件,不用每次修复一个。相反,将它们全部放在一个目录中并运行如下命令:
|
||||
|
||||
```
|
||||
$ find . -type f -exec dos2unix {} \;
|
||||
```
|
||||
|
||||
在此命令中,我们使用 `find` 查找常规文件,然后运行 `dos2unix` 命令一次转换一个。命令中的 `{}` 将被替换为文件名。运行时,你应该处于包含文件的目录中。此命令可能会损坏其他类型的文件,例如除了文本文件外在上下文中包含八进制 15 的文件(如,镜像文件中的字节)。
|
||||
|
||||
#### sed
|
||||
|
||||
你还可以使用流编辑器 `sed` 来删除回车符。但是,你必须提供第二个文件名。以下是例子:
|
||||
|
||||
```
|
||||
$ sed -e “s/^M//” before.txt > after.txt
|
||||
```
|
||||
|
||||
一件需要注意的重要的事情是,请不要输入你看到的字符。你必须按下 `Ctrl+V` 后跟 `Ctrl+M` 来输入 `^M`。`s` 是替换命令。斜杠将我们要查找的文本(`Ctrl + M`)和要替换的文本(这里为空)分开。
|
||||
|
||||
#### vi
|
||||
|
||||
你甚至可以使用 `vi` 删除回车符(`Ctrl+M`),但这里假设你没有打开数百个文件,或许也在做一些其他的修改。你可以键入 `:` 进入命令行,然后输入下面的字符串。与 `sed` 一样,命令中 `^M` 需要通过 `Ctrl+V` 输入 `^`,然后 `Ctrl+M` 插入 `M`。`%s` 是替换操作,斜杠再次将我们要删除的字符和我们想要替换它的文本(空)分开。 `g`(全局)意味在所有行上执行。
|
||||
|
||||
```
|
||||
:%s/^M//g
|
||||
```
|
||||
|
||||
### 总结
|
||||
|
||||
`dos2unix` 命令可能是最容易记住的,也是从文本中删除回车的最可靠的方法。其他选择使用起来有点困难,但它们提供相同的基本功能。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3438857/how-to-remove-carriage-returns-from-text-files-on-linux.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://www.flickr.com/photos/kmsiever/5895380540/in/photolist-9YXnf5-cNmpxq-2KEvib-rfecPZ-9snnkJ-2KAcDR-dTxzKW-6WdgaG-6H5i46-2KzTZX-7cnSw7-e3bUdi-a9meh9-Zm3pD-xiFhs-9Hz6YM-ar4DEx-4PXAhw-9wR4jC-cihLcs-asRFJc-9ueXvG-aoWwHq-atwL3T-ai89xS-dgnntH-5en8Te-dMUDd9-aSQVn-dyZqij-cg4SeS-abygkg-f2umXt-Xk129E-4YAeNn-abB6Hb-9313Wk-f9Tot-92Yfva-2KA7Sv-awSCtG-2KDPzb-eoPN6w-FE9oi-5VhaNf-eoQgx7-eoQogA-9ZWoYU-7dTGdG-5B1aSS
|
||||
[3]: https://www.facebook.com/NetworkWorld/
|
||||
[4]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,55 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (Morisun029)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11375-1.html)
|
||||
[#]: subject: (Microsoft brings IBM iron to Azure for on-premises migrations)
|
||||
[#]: via: (https://www.networkworld.com/article/3438904/microsoft-brings-ibm-iron-to-azure-for-on-premises-migrations.html)
|
||||
[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/)
|
||||
|
||||
Skytap 和微软将 IBM 机器搬到了 Azure
|
||||
======
|
||||
|
||||
> 微软再次证明了其摒弃了“非我发明”这一态度来支持客户。
|
||||
|
||||
![](https://images.idgesg.net/images/article/2019/05/cso_microsoft_azure_backups_cloud_computing_binary_data_transfer_by_just_super_gettyimages-1003878434_3x2_2400x1600-100796537-large.jpg)
|
||||
|
||||
当微软将 Azure 作为其 Windows 服务器操作系统的云计算版本发布时,它并没有使其成为仅支持 Windows 系统的版本,它还支持 Linux 系统,并且在短短几年内[其 Linux 实例的数量现在已经超过了Windows 实例的数量][1]。
|
||||
|
||||
很高兴看到微软终于摆脱了这种长期以来非常有害的“非我发明”态度,该公司的最新举动确实令人惊讶。
|
||||
|
||||
微软与一家名为 Skytap 的公司合作,以在 Azure 云服务上提供 IBM Power9 实例,可以在 Azure 云内运行基于 Power 的系统,该系统将与其已有的 Xeon 和 Epyc 实例一同作为 Azure 的虚拟机(VM)。
|
||||
|
||||
Skytap 是一家有趣的公司。它由华盛顿大学的三位教授创立,专门研究本地遗留硬件的云迁移,如 IBM System I 或 Sparc 的云迁移。该公司在西雅图拥有一个数据中心,以 IBM 的硬件运行 IBM 的 PowerVM 管理程序,并且对在美国和英格兰的 IBM 数据中心提供主机托管。
|
||||
|
||||
该公司的座右铭是快速迁移,然后按照自己的节奏进行现代化。因此,它专注于帮助一些企业将遗留系统迁移到云,然后实现应用程序的现代化,这也是它与微软合作的目的。Azure 将通过为企业提供平台来提高传统应用程序的价值,而无需花费巨额费用重写一个新平台。
|
||||
|
||||
Skytap 提供了预览,可以看到使用 Skytap 上的 DB2 提升和扩展原有的 IBM i 应用程序以及通过 Azure 的物联网中心进行扩展时可能发生的情况。该应用程序无缝衔接新旧架构,并证明了不需要完全重写可靠的 IBM i 应用程序即可从现代云功能中受益。
|
||||
|
||||
### 迁移到 Azure
|
||||
|
||||
根据协议,微软将把 IBM 的 Power S922 服务器部署在一个未声明的 Azure 区域。这些机器可以运行 PowerVM 管理程序,这些管理程序支持老式 IBM 操作系统以及 Linux 系统。
|
||||
|
||||
Skytap 首席执行官<ruby>布拉德·希克<rt>Brad Schick</rt></ruby>在一份声明中说道:“通过先替换旧技术来迁移上云既耗时又冒险。……Skytap 的愿景一直是通过一些小小的改变和较低的风险实现企业系统到云平台的迁移。与微软合作,我们将为各种遗留应用程序迁移到 Azure 提供本地支持,包括那些在 IBM i、AIX 和 Power Linux 上运行的程序。这将使企业能够通过使用 Azure 服务进行现代化来延长传统系统的寿命并增加其价值。”
|
||||
|
||||
随着基于 Power 应用程序的现代化,Skytap 随后将引入 DevOps CI/CD 工具链来加快软件的交付。迁移到 Azure 的 Skytap 上后,客户将能够集成 Azure DevOps,以及 Power 的 CI/CD 工具链,例如 Eradani 和 UrbanCode。
|
||||
|
||||
这些听起来像是迈出了第一步,但这意味着以后将会实现更多,尤其是在应用程序迁移方面。如果它仅在一个 Azure 区域中,听起来好像它们正在对该项目进行测试和验证,并可能在今年晚些时候或明年进行扩展。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3438904/microsoft-brings-ibm-iron-to-azure-for-on-premises-migrations.html
|
||||
|
||||
作者:[Andy Patrizio][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[Morisun029](https://github.com/Morisun029)
|
||||
校对:[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://www.openwall.com/lists/oss-security/2019/06/27/7
|
||||
[2]: https://www.networkworld.com/article/3119362/hybrid-cloud/how-to-make-hybrid-cloud-work.html#tk.nww-fsb
|
||||
[3]: https://www.facebook.com/NetworkWorld/
|
||||
[4]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,64 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11366-1.html)
|
||||
[#]: subject: (Oracle Unleashes World’s Fastest Database Machine ‘Exadata X8M’)
|
||||
[#]: via: (https://opensourceforu.com/2019/09/oracle-unleashes-worlds-fastest-database-machine-exadata-x8m/)
|
||||
[#]: author: (Longjam Dineshwori https://opensourceforu.com/author/dineshwori-longjam/)
|
||||
|
||||
Oracle 发布全球最快的数据库机器 Exadata X8M
|
||||
======
|
||||
|
||||
> Exadata X8M 是第一台具有集成持久内存和 RoCE 的数据库机器。Oracle 还宣布推出 Oracle 零数据丢失恢复设备 X8M(ZDLRA)。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/20/191530qiyvvxl8qqcov8xq.jpg)
|
||||
|
||||
Oracle 发布了新的 Exadata 数据库机器 X8M,旨在为数据库基础架构市场树立新的标杆。
|
||||
|
||||
Exadata X8M 结合了英特尔 Optane DC 持久存储器和通过融合以太网(RoCE)的 100 千兆的远程直接内存访问(RDMA)来消除存储瓶颈,并显著提高性能,其适用于最苛刻的工作负载,如在线事务处理(OLTP)、分析、物联网、欺诈检测和高频交易。
|
||||
|
||||
“借助 Exadata X8M,我们可以提供内存级的性能,同时为 OLTP 和分析提供共享存储的所有优势,”Oracle 任务关键型数据库技术执行副总裁 Juan Loaiza 说。
|
||||
|
||||
“使用对共享持久存储器的直接数据库访问将响应时间减少一个数量级,可加速每个 OLTP 应用程序,它是需要实时访问大量数据的应用程序的游戏规则改变者,例如欺诈检测和个性化购物,”官方补充。
|
||||
|
||||
### 它有什么独特之处?
|
||||
|
||||
Oracle Exadata X8M 使用 RDMA 让数据库直接访问智能存储服务器中的持久内存,从而绕过整个操作系统、IO 和网络软件堆栈。这导致更低的延迟和更高的吞吐量。使用 RDMA 绕过软件堆栈还可以释放存储服务器上的 CPU 资源,以执行更多智能扫描查询来支持分析工作负载。
|
||||
|
||||
### 更少的存储瓶颈
|
||||
|
||||
“高性能 OLTP 应用需要高的每秒输入/输出操作(IOPS)和低延迟。直接数据库访问共享持久性内存可将SQL 读取的峰值性能提升至 1600 万 IOPS,比行业领先的 Exadata X8 高出 2.5 倍,“Oracle 在一份声明中表示。
|
||||
|
||||
此外,Exadata X8M 通过使远程 IO 延迟低于 19 微秒,大大减少了关键数据库 IO 的延迟 —— 这比 Exadata X8 快 10 倍以上。即使对于每秒需要数百万 IO 的工作负载,也可实现这些超低延迟。
|
||||
|
||||
### 比 AWS 和 Azure 更高效
|
||||
|
||||
该公司声称,与 Oracle 最快的 Amazon RDS 存储相比,Exadata X8M 的延迟降低了 50 倍,IOPS 提高了 200 倍,容量提高了 15 倍。
|
||||
|
||||
与 Azure SQL 数据库服务存储相比,Exadata X8M 的延迟降低了 100 倍,IOPS 提高了 150 倍,容量提高了 300 倍。
|
||||
|
||||
据 Oracle 称,单机架 Exadata X8M 可提供高达 2 倍的 OLTP 读取 IOPS,3 倍的吞吐量和比具有持久性内存的共享存储系统(如 Dell EMC PowerMax 8000 的单机架)低 5 倍的延迟。
|
||||
|
||||
“通过同时支持更快的 OLTP 查询和更高的分析工作负载吞吐量,Exadata X8M 是融合混合工作负载环境以降低 IT 成本和复杂性的理想平台,”该公司说。
|
||||
|
||||
### Oracle 零数据丢失恢复设备 X8
|
||||
|
||||
Oracle 当天还宣布推出 Oracle 零数据丢失恢复设备 X8M(ZDLRA),它使用新的 100Gb RoCE,用于计算和存储服务器之间的高吞吐量内部数据传输。
|
||||
|
||||
Exadata 和 ZDLRA 客户现在可以在 RoCE 或基于 InfiniBand 的工程系统之间进行选择,以在其架构部署中实现最佳灵活性。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensourceforu.com/2019/09/oracle-unleashes-worlds-fastest-database-machine-exadata-x8m/
|
||||
|
||||
作者:[Longjam Dineshwori][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://opensourceforu.com/author/dineshwori-longjam/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/02/Oracle-Cloud.jpg?resize=350%2C212&ssl=1
|
@ -0,0 +1,130 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (arrowfeng)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11382-1.html)
|
||||
[#]: subject: (How to Remove (Delete) Symbolic Links in Linux)
|
||||
[#]: via: (https://www.2daygeek.com/remove-delete-symbolic-link-softlink-linux/)
|
||||
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
|
||||
|
||||
在 Linux 中怎样移除(删除)符号链接
|
||||
======
|
||||
|
||||
你可能有时需要在 Linux 上创建或者删除符号链接。如果有,你知道该怎样做吗?之前你做过吗?你踩坑没有?如果你踩过坑,那没什么问题。如果还没有,别担心,我们将在这里帮助你。
|
||||
|
||||
使用 `rm` 和 `unlink` 命令就能完成移除(删除)符号链接的操作。
|
||||
|
||||
### 什么是符号链接?
|
||||
|
||||
符号链接(symlink)又称软链接,它是一种特殊的文件类型,在 Linux 中该文件指向另一个文件或者目录。它类似于 Windows 中的快捷方式。它能在相同或者不同的文件系统或分区中指向一个文件或着目录。
|
||||
|
||||
符号链接通常用来链接库文件。它也可用于链接日志文件和挂载的 NFS(网络文件系统)上的文件夹。
|
||||
|
||||
### 什么是 rm 命令?
|
||||
|
||||
[rm 命令][1] 被用来移除文件和目录。它非常危险,你每次使用 `rm` 命令的时候要非常小心。
|
||||
|
||||
### 什么是 unlink 命令?
|
||||
|
||||
`unlink` 命令被用来移除特殊的文件。它被作为 GNU Gorutils 的一部分安装了。
|
||||
|
||||
### 1) 使用 rm 命令怎样移除符号链接文件
|
||||
|
||||
`rm` 命令是在 Linux 中使用最频繁的命令,它允许我们像下列描述那样去移除符号链接。
|
||||
|
||||
```
|
||||
# rm symlinkfile
|
||||
```
|
||||
|
||||
始终将 `rm` 命令与 `-i` 一起使用以了解正在执行的操作。
|
||||
|
||||
```
|
||||
# rm -i symlinkfile1
|
||||
rm: remove symbolic link ‘symlinkfile1’? y
|
||||
```
|
||||
|
||||
它允许我们一次移除多个符号链接:
|
||||
|
||||
```
|
||||
# rm -i symlinkfile2 symlinkfile3
|
||||
|
||||
rm: remove symbolic link ‘symlinkfile2’? y
|
||||
rm: remove symbolic link ‘symlinkfile3’? y
|
||||
```
|
||||
|
||||
#### 1a) 使用 rm 命令怎样移除符号链接目录
|
||||
|
||||
这像移除符号链接文件那样。使用下列命令移除符号链接目录。
|
||||
|
||||
```
|
||||
# rm -i symlinkdir
|
||||
|
||||
rm: remove symbolic link ‘symlinkdir’? y
|
||||
```
|
||||
|
||||
使用下列命令移除多个符号链接目录。
|
||||
|
||||
```
|
||||
# rm -i symlinkdir1 symlinkdir2
|
||||
|
||||
rm: remove symbolic link ‘symlinkdir1’? y
|
||||
rm: remove symbolic link ‘symlinkdir2’? y
|
||||
```
|
||||
|
||||
如果你在结尾增加 `/`,这个符号链接目录将不会被删除。如果你加了,你将得到一个错误。
|
||||
|
||||
```
|
||||
# rm -i symlinkdir/
|
||||
|
||||
rm: cannot remove ‘symlinkdir/’: Is a directory
|
||||
```
|
||||
|
||||
你可以增加 `-r` 去处理上述问题。**但如果你增加这个参数,它将会删除目标目录下的内容,并且它不会删除这个符号链接文件。**(LCTT 译注:这可能不是你的原意。)
|
||||
|
||||
```
|
||||
# rm -ri symlinkdir/
|
||||
|
||||
rm: descend into directory ‘symlinkdir/’? y
|
||||
rm: remove regular file ‘symlinkdir/file4.txt’? y
|
||||
rm: remove directory ‘symlinkdir/’? y
|
||||
rm: cannot remove ‘symlinkdir/’: Not a directory
|
||||
```
|
||||
|
||||
### 2) 使用 unlink 命令怎样移除符号链接
|
||||
|
||||
`unlink` 命令删除指定文件。它一次仅接受一个文件。
|
||||
|
||||
删除符号链接文件:
|
||||
|
||||
```
|
||||
# unlink symlinkfile
|
||||
```
|
||||
|
||||
删除符号链接目录:
|
||||
|
||||
```
|
||||
# unlink symlinkdir2
|
||||
```
|
||||
|
||||
如果你在结尾增加 `/`,你不能使用 `unlink` 命令删除符号链接目录。
|
||||
|
||||
```
|
||||
# unlink symlinkdir3/
|
||||
|
||||
unlink: cannot unlink ‘symlinkdir3/’: Not a directory
|
||||
```
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.2daygeek.com/remove-delete-symbolic-link-softlink-linux/
|
||||
|
||||
作者:[Magesh Maruthamuthu][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://www.2daygeek.com/author/magesh/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.2daygeek.com/linux-remove-files-directories-folders-rm-command/
|
@ -0,0 +1,64 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11370-1.html)
|
||||
[#]: subject: (Oracle Autonomous Linux: A Self Updating, Self Patching Linux Distribution for Cloud Computing)
|
||||
[#]: via: (https://itsfoss.com/oracle-autonomous-linux/)
|
||||
[#]: author: (John Paul https://itsfoss.com/author/john/)
|
||||
|
||||
Oracle Autonomous Linux:用于云计算的自我更新、自我修补的 Linux 发行版
|
||||
======
|
||||
|
||||
自动化是 IT 行业的增长趋势,其目的是消除重复任务中的手动干扰。Oracle 通过推出 Oracle Autonomous Linux 向自动化世界迈出了又一步,这无疑将使 IoT 和云计算行业受益。
|
||||
|
||||
### Oracle Autonomous Linux:减少人工干扰,增多自动化
|
||||
|
||||
![][1]
|
||||
|
||||
周一,Oracle 联合创始人<ruby>拉里·埃里森<rt>Larry Ellison</rt></ruby>参加了在旧金山举行的Oracle OpenWorld 全球大会。[他宣布了][2]一个新产品:世界上第一个自治 Linux。这是 Oracle 向第二代云迈进的第二步。第一步是两年前发布的 [Autonomous Database][3]。
|
||||
|
||||
Oracle Autonomous Linux 的最大特性是降低了维护成本。根据 [Oracle 网站][4] 所述,Autonomous Linux “使用先进的机器学习和自治功能来提供前所未有的成本节省、安全性和可用性,并释放关键的 IT 资源来应对更多的战略计划”。
|
||||
|
||||
Autonomous Linux 可以无需人工干预就安装更新和补丁。这些自动更新包括 “Linux 内核和关键用户空间库”的补丁。“不需要停机,而且可以免受外部攻击和内部恶意用户的攻击。”它们也可以在系统运行时进行,以减少停机时间。Autonomous Linux 还会自动处理伸缩,以确保满足所有计算需求。
|
||||
|
||||
埃里森强调了新的自治系统将如何提高安全性。他特别提到了 [Capitol One 数据泄露][5]是由于配置错误而发生的。他说:“一个防止数据被盗的简单规则:将数据放入自治系统。没有人为错误,没有数据丢失。 那是我们与 AWS 之间的最大区别。”
|
||||
|
||||
有趣的是,Oracle 还瞄准了这一新产品以与 IBM 竞争。埃里森说:“如果你付钱给 IBM,可以停了。”所有 Red Hat 应用程序都应该能够在 Autonomous Linux 上运行而无需修改。有趣的是,Oracle Linux 是从 Red Hat Enterprise Linux 的源代码中[构建][6]的。
|
||||
|
||||
看起来,Oracle Autonomous Linux 不会用于企业市场以外。
|
||||
|
||||
### 关于 Oracle Autonomous Linux 的思考
|
||||
|
||||
Oracle 是云服务市场的重要参与者。这种新的 Linux 产品将使其能够与 IBM 竞争。让人感兴趣的是 IBM 的反应会是如何,特别是当他们有来自 Red Hat 的新一批开源智能软件。
|
||||
|
||||
如果你看一下市场数字,那么对于 IBM 或 Oracle 来说情况都不好。大多数云业务由 [Amazon Web Services、Microsoft Azure 和 Google Cloud Platform][7] 所占据。IBM 和 Oracle 落后于他们。[IBM 收购 Red Hat][8] 试图获得发展。这项新的自主云计划是 Oracle 争取统治地位(或至少试图获得更大的市场份额)的举动。让人感兴趣的是,到底有多少公司因为购买了 Oracle 的系统而在互联网的狂野西部变得更加安全?
|
||||
|
||||
我必须简单提一下:当我第一次阅读该公告时,我的第一反应就是“好吧,我们离天网更近了一步。”如果我们技术性地考虑一下,我们就像是要进入了机器人末日。如果你打算帮我,我计划去购买一些罐头食品。
|
||||
|
||||
你对 Oracle 的新产品感兴趣吗?你会帮助他们赢得云战争吗?在下面的评论中让我们知道。
|
||||
|
||||
如果你觉得这篇文章有趣,请花一点时间在社交媒体、Hacker News 或 [Reddit][9] 上分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/oracle-autonomous-linux/
|
||||
|
||||
作者:[John Paul][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://itsfoss.com/author/john/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/oracle-autonomous-linux.png?resize=800%2C450&ssl=1
|
||||
[2]: https://www.zdnet.com/article/oracle-announces-oracle-autonomous-linux/
|
||||
[3]: https://www.oracle.com/in/database/what-is-autonomous-database.html
|
||||
[4]: https://www.oracle.com/corporate/pressrelease/oow19-oracle-autonomous-linux-091619.html
|
||||
[5]: https://www.zdnet.com/article/100-million-americans-and-6-million-canadians-caught-up-in-capital-one-breach/
|
||||
[6]: https://distrowatch.com/table.php?distribution=oracle
|
||||
[7]: https://www.zdnet.com/article/top-cloud-providers-2019-aws-microsoft-azure-google-cloud-ibm-makes-hybrid-move-salesforce-dominates-saas/
|
||||
[8]: https://itsfoss.com/ibm-red-hat-acquisition/
|
||||
[9]: https://reddit.com/r/linuxusersgroup
|
@ -0,0 +1,312 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (GraveAccent)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11406-1.html)
|
||||
[#]: subject: (Getting started with data science using Python)
|
||||
[#]: via: (https://opensource.com/article/19/9/get-started-data-science-python)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||
|
||||
用 Python 入门数据科学
|
||||
======
|
||||
|
||||
> 使用 Python 开展数据科学为你提供了无限的潜力,使你能够以有意义和启发性的方式解析、解释和组织数据。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/30/001853sfkm07j7wfp94dzp.jpg)
|
||||
|
||||
数据科学是计算领域一个令人兴奋的新领域,它围绕分析、可视化和关联以解释我们的计算机收集的有关世界的无限信息而建立。当然,称其为“新”领域有点不诚实,因为该学科是统计学、数据分析和普通而古老的科学观察派生而来的。
|
||||
|
||||
但是数据科学是这些学科的形式化分支,拥有自己的流程和工具,并且可以广泛应用于以前从未产生过大量不可管理数据的学科(例如视觉效果)。数据科学是一个新的机会,可以重新审视海洋学、气象学、地理学、制图学、生物学、医学和健康以及娱乐行业的数据,并更好地了解其中的模式、影响和因果关系。
|
||||
|
||||
像其他看似包罗万象的大型领域一样,知道从哪里开始探索数据科学可能会令人生畏。有很多资源可以帮助数据科学家使用自己喜欢的编程语言来实现其目标,其中包括最流行的编程语言之一:Python。使用 [Pandas][2]、[Matplotlib][3] 和 [Seaborn][4] 这些库,你可以学习数据科学的基本工具集。
|
||||
|
||||
如果你对 Python 的基本用法不是很熟悉,请在继续之前先阅读我的 [Python 介绍][5]。
|
||||
|
||||
### 创建 Python 虚拟环境
|
||||
|
||||
程序员有时会忘记在开发计算机上安装了哪些库,这可能导致他们提供了在自己计算机上可以运行,但由于缺少库而无法在所有其它电脑上运行的代码。Python 有一个系统旨在避免这种令人不快的意外:虚拟环境。虚拟环境会故意忽略你已安装的所有 Python 库,从而有效地迫使你一开始使用通常的 Python 进行开发。
|
||||
|
||||
为了用 `venv` 激活虚拟环境, 为你的环境取个名字 (我会用 `example`) 并且用下面的指令创建它:
|
||||
|
||||
```
|
||||
$ python3 -m venv example
|
||||
```
|
||||
|
||||
<ruby>导入<rt>source</rt></ruby>该环境的 `bin` 目录里的 `activate` 文件以激活它:
|
||||
|
||||
```
|
||||
$ source ./example/bin/activate
|
||||
(example) $
|
||||
```
|
||||
|
||||
你现在“位于”你的虚拟环境中。这是一个干净的状态,你可以在其中构建针对该问题的自定义解决方案,但是额外增加了需要有意识地安装依赖库的负担。
|
||||
|
||||
### 安装 Pandas 和 NumPy
|
||||
|
||||
你必须在新环境中首先安装的库是 Pandas 和 NumPy。这些库在数据科学中很常见,因此你肯定要时不时安装它们。它们也不是你在数据科学中唯一需要的库,但是它们是一个好的开始。
|
||||
|
||||
Pandas 是使用 BSD 许可证的开源库,可轻松处理数据结构以进行分析。它依赖于 NumPy,这是一个提供多维数组、线性代数和傅立叶变换等等的科学库。使用 `pip3` 安装两者:
|
||||
|
||||
```
|
||||
(example) $ pip3 install pandas
|
||||
```
|
||||
|
||||
安装 Pandas 还会安装 NumPy,因此你无需同时指定两者。一旦将它们安装到虚拟环境中,安装包就会被缓存,这样,当你再次安装它们时,就不必从互联网上下载它们。
|
||||
|
||||
这些是你现在仅需的库。接下来,你需要一些样本数据。
|
||||
|
||||
### 生成样本数据集
|
||||
|
||||
数据科学都是关于数据的,幸运的是,科学、计算和政府组织可以提供许多免费和开放的数据集。虽然这些数据集是用于教育的重要资源,但它们具有比这个简单示例所需的数据更多的数据。你可以使用 Python 快速创建示例和可管理的数据集:
|
||||
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import random
|
||||
|
||||
def rgb():
|
||||
NUMBER=random.randint(0,255)/255
|
||||
return NUMBER
|
||||
|
||||
FILE = open('sample.csv','w')
|
||||
FILE.write('"red","green","blue"')
|
||||
for COUNT in range(10):
|
||||
FILE.write('\n{:0.2f},{:0.2f},{:0.2f}'.format(rgb(),rgb(),rgb()))
|
||||
```
|
||||
|
||||
这将生成一个名为 `sample.csv` 的文件,该文件由随机生成的浮点数组成,这些浮点数在本示例中表示 RGB 值(在视觉效果中通常是数百个跟踪值)。你可以将 CSV 文件用作 Pandas 的数据源。
|
||||
|
||||
### 使用 Pandas 提取数据
|
||||
|
||||
Pandas 的基本功能之一是可以提取数据和处理数据,而无需程序员编写仅用于解析输入的新函数。如果你习惯于自动执行此操作的应用程序,那么这似乎不是很特别,但请想象一下在 [LibreOffice][6] 中打开 CSV 并且必须编写公式以在每个逗号处拆分值。Pandas 可以让你免受此类低级操作的影响。以下是一些简单的代码,可用于提取和打印以逗号分隔的值的文件:
|
||||
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from pandas import read_csv, DataFrame
|
||||
import pandas as pd
|
||||
|
||||
FILE = open('sample.csv','r')
|
||||
DATAFRAME = pd.read_csv(FILE)
|
||||
print(DATAFRAME)
|
||||
```
|
||||
|
||||
一开始的几行导入 Pandas 库的组件。Pandas 库功能丰富,因此在寻找除本文中基本功能以外的功能时,你会经常参考它的文档。
|
||||
|
||||
接下来,通过打开你创建的 `sample.csv` 文件创建变量 `FILE`。Pandas 模块 `read_csv`(在第二行中导入)使用该变量来创建<ruby>数据帧<rt>dataframe</rt></ruby>。在 Pandas 中,数据帧是二维数组,通常可以认为是表格。数据放入数据帧中后,你可以按列和行进行操作,查询其范围,然后执行更多操作。目前,示例代码仅将该数据帧输出到终端。
|
||||
|
||||
运行代码。你的输出会和下面的输出有些许不同,因为这些数字都是随机生成的,但是格式都是一样的。
|
||||
|
||||
```
|
||||
(example) $ python3 ./parse.py
|
||||
red green blue
|
||||
0 0.31 0.96 0.47
|
||||
1 0.95 0.17 0.64
|
||||
2 0.00 0.23 0.59
|
||||
3 0.22 0.16 0.42
|
||||
4 0.53 0.52 0.18
|
||||
5 0.76 0.80 0.28
|
||||
6 0.68 0.69 0.46
|
||||
7 0.75 0.52 0.27
|
||||
8 0.53 0.76 0.96
|
||||
9 0.01 0.81 0.79
|
||||
```
|
||||
|
||||
假设你只需要数据集中的红色值(`red`),你可以通过声明数据帧的列名称并有选择地仅打印你感兴趣的列来做到这一点:
|
||||
|
||||
```python
|
||||
from pandas import read_csv, DataFrame
|
||||
import pandas as pd
|
||||
|
||||
FILE = open('sample.csv','r')
|
||||
DATAFRAME = pd.read_csv(FILE)
|
||||
|
||||
# define columns
|
||||
DATAFRAME.columns = [ 'red','green','blue' ]
|
||||
|
||||
print(DATAFRAME['red'])
|
||||
```
|
||||
|
||||
现在运行代码,你只会得到红色列:
|
||||
|
||||
```
|
||||
(example) $ python3 ./parse.py
|
||||
0 0.31
|
||||
1 0.95
|
||||
2 0.00
|
||||
3 0.22
|
||||
4 0.53
|
||||
5 0.76
|
||||
6 0.68
|
||||
7 0.75
|
||||
8 0.53
|
||||
9 0.01
|
||||
Name: red, dtype: float64
|
||||
```
|
||||
|
||||
处理数据表是经常使用 Pandas 解析数据的好方法。从数据帧中选择数据的方法有很多,你尝试的次数越多就越习惯。
|
||||
|
||||
### 可视化你的数据
|
||||
|
||||
很多人偏爱可视化信息已不是什么秘密,这是图表和图形成为与高层管理人员开会的主要内容的原因,也是“信息图”在新闻界如此流行的原因。数据科学家的工作之一是帮助其他人理解大量数据样本,并且有一些库可以帮助你完成这项任务。将 Pandas 与可视化库结合使用可以对数据进行可视化解释。一个流行的可视化开源库是 [Seaborn][7],它基于开源的 [Matplotlib][3]。
|
||||
|
||||
#### 安装 Seaborn 和 Matplotlib
|
||||
|
||||
你的 Python 虚拟环境还没有 Seaborn 和 Matplotlib,所以用 `pip3` 安装它们。安装 Seaborn 的时候,也会安装 Matplotlib 和很多其它的库。
|
||||
|
||||
```
|
||||
(example) $ pip3 install seaborn
|
||||
```
|
||||
|
||||
为了使 Matplotlib 显示图形,你还必须安装 [PyGObject][8] 和 [Pycairo][9]。这涉及到编译代码,只要你安装了必需的头文件和库,`pip3` 便可以为你执行此操作。你的 Python 虚拟环境不了解这些依赖库,因此你可以在环境内部或外部执行安装命令。
|
||||
|
||||
在 Fedora 和 CentOS 上:
|
||||
|
||||
```
|
||||
(example) $ sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel \
|
||||
sqlite sqlite-devel openssl-devel tk-devel git python3-cairo-devel \
|
||||
cairo-gobject-devel gobject-introspection-devel
|
||||
```
|
||||
|
||||
在 Ubuntu 和 Debian 上:
|
||||
|
||||
```
|
||||
(example) $ sudo apt install -y libgirepository1.0-dev build-essential \
|
||||
libbz2-dev libreadline-dev libssl-dev zlib1g-dev libsqlite3-dev wget \
|
||||
curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libcairo2-dev
|
||||
```
|
||||
|
||||
一旦它们安装好了,你可以安装 Matplotlib 需要的 GUI 组件。
|
||||
|
||||
```
|
||||
(example) $ pip3 install PyGObject pycairo
|
||||
```
|
||||
|
||||
### 用 Seaborn 和 Matplotlib 显示图形
|
||||
|
||||
在你最喜欢的文本编辑器新建一个叫 `vizualize.py` 的文件。要创建数据的线形图可视化,首先,你必须导入必要的 Python 模块 —— 先前代码示例中使用的 Pandas 模块:
|
||||
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from pandas import read_csv, DataFrame
|
||||
import pandas as pd
|
||||
```
|
||||
|
||||
接下来,导入 Seaborn、Matplotlib 和 Matplotlib 的几个组件,以便你可以配置生成的图形:
|
||||
|
||||
```python
|
||||
import seaborn as sns
|
||||
import matplotlib
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib import rcParams
|
||||
```
|
||||
|
||||
Matplotlib 可以将其输出导出为多种格式,包括 PDF、SVG 和桌面上的 GUI 窗口。对于此示例,将输出发送到桌面很有意义,因此必须将 Matplotlib 后端设置为 `GTK3Agg`。如果你不使用 Linux,则可能需要使用 `TkAgg` 后端。
|
||||
|
||||
设置完 GUI 窗口以后,设置窗口大小和 Seaborn 预设样式:
|
||||
|
||||
```python
|
||||
matplotlib.use('GTK3Agg')
|
||||
rcParams['figure.figsize'] = 11,8
|
||||
sns.set_style('darkgrid')
|
||||
```
|
||||
|
||||
现在,你的显示已配置完毕,代码已经很熟悉了。使用 Pandas 导入 `sample.csv` 文件,并定义数据帧的列:
|
||||
|
||||
```python
|
||||
FILE = open('sample.csv','r')
|
||||
DATAFRAME = pd.read_csv(FILE)
|
||||
DATAFRAME.columns = [ 'red','green','blue' ]
|
||||
```
|
||||
|
||||
有了适当格式的数据,你可以将其绘制在图形中。将每一列用作绘图的输入,然后使用 `plt.show()` 在 GUI 窗口中绘制图形。`plt.legend()` 参数将列标题与图形上的每一行关联(`loc` 参数将图例放置在图表之外而不是在图表上方):
|
||||
|
||||
|
||||
```python
|
||||
for i in DATAFRAME.columns:
|
||||
DATAFRAME[i].plot()
|
||||
|
||||
plt.legend(bbox_to_anchor=(1, 1), loc=2, borderaxespad=1)
|
||||
plt.show()
|
||||
```
|
||||
|
||||
运行代码以获得结果。
|
||||
|
||||
![第一个数据可视化][10]
|
||||
|
||||
你的图形可以准确显示 CSV 文件中包含的所有信息:值在 Y 轴上,索引号在 X 轴上,并且图形中的线也被标识出来了,以便你知道它们代表什么。然而,由于此代码正在跟踪颜色值(至少是假装),所以线条的颜色不仅不直观,而且违反直觉。如果你永远不需要分析颜色数据,则可能永远不会遇到此问题,但是你一定会遇到类似的问题。在可视化数据时,你必须考虑呈现数据的最佳方法,以防止观看者从你呈现的内容中推断出虚假信息。
|
||||
|
||||
为了解决此问题(并展示一些可用的自定义设置),以下代码为每条绘制的线分配了特定的颜色:
|
||||
|
||||
```python
|
||||
import matplotlib
|
||||
from pandas import read_csv, DataFrame
|
||||
import pandas as pd
|
||||
import seaborn as sns
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib import rcParams
|
||||
|
||||
matplotlib.use('GTK3Agg')
|
||||
rcParams['figure.figsize'] = 11,8
|
||||
sns.set_style('whitegrid')
|
||||
|
||||
FILE = open('sample.csv','r')
|
||||
DATAFRAME = pd.read_csv(FILE)
|
||||
DATAFRAME.columns = [ 'red','green','blue' ]
|
||||
|
||||
plt.plot(DATAFRAME['red'],'r-')
|
||||
plt.plot(DATAFRAME['green'],'g-')
|
||||
plt.plot(DATAFRAME['blue'],'b-')
|
||||
plt.plot(DATAFRAME['red'],'ro')
|
||||
plt.plot(DATAFRAME['green'],'go')
|
||||
plt.plot(DATAFRAME['blue'],'bo')
|
||||
|
||||
plt.show()
|
||||
```
|
||||
|
||||
这使用特殊的 Matplotlib 表示法为每列创建两个图。每列的初始图分配有一种颜色(红色为 `r`,绿色为 `g`,蓝色为 `b`)。这些是内置的 Matplotlib 设置。 `-` 表示实线(双破折号,例如 `r--`,将创建虚线)。为每个具有相同颜色的列创建第二个图,但是使用 `o` 表示点或节点。为了演示内置的 Seaborn 主题,请将 `sns.set_style` 的值更改为 `whitegrid`。
|
||||
|
||||
![改进的数据可视化][11]
|
||||
|
||||
### 停用你的虚拟环境
|
||||
|
||||
探索完 Pandas 和绘图后,可以使用 `deactivate` 命令停用 Python 虚拟环境:
|
||||
|
||||
```
|
||||
(example) $ deactivate
|
||||
$
|
||||
```
|
||||
|
||||
当你想重新使用它时,只需像在本文开始时一样重新激活它即可。重新激活虚拟环境时,你必须重新安装模块,但是它们是从缓存安装的,而不是从互联网下载的,因此你不必联网。
|
||||
|
||||
### 无尽的可能性
|
||||
|
||||
Pandas、Matplotlib、Seaborn 和数据科学的真正力量是无穷的潜力,使你能够以有意义和启发性的方式解析、解释和组织数据。下一步是使用你在本文中学到的新工具探索简单的数据集。Matplotlib 和 Seaborn 不仅有折线图,还有很多其他功能,因此,请尝试创建条形图或饼图或完全不一样的东西。
|
||||
|
||||
一旦你了解了你的工具集并对如何关联数据有了一些想法,则可能性是无限的。数据科学是寻找隐藏在数据中的故事的新方法。让开源成为你的媒介。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/get-started-data-science-python
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[GraveAccent](https://github.com/GraveAccent)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_graph_stats_blue.png?itok=OKCc_60D (Metrics and a graph illustration)
|
||||
[2]: https://pandas.pydata.org/
|
||||
[3]: https://matplotlib.org/
|
||||
[4]: https://seaborn.pydata.org/index.html
|
||||
[5]: https://opensource.com/article/17/10/python-101
|
||||
[6]: http://libreoffice.org
|
||||
[7]: https://seaborn.pydata.org/
|
||||
[8]: https://pygobject.readthedocs.io/en/latest/getting_started.html
|
||||
[9]: https://pycairo.readthedocs.io/en/latest/
|
||||
[10]: https://opensource.com/sites/default/files/uploads/seaborn-matplotlib-graph_0.png (First data visualization)
|
||||
[11]: https://opensource.com/sites/default/files/uploads/seaborn-matplotlib-graph_1.png (Improved data visualization)
|
@ -0,0 +1,131 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (geekpi)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11399-1.html)
|
||||
[#]: subject: (Introduction to the Linux chgrp and newgrp commands)
|
||||
[#]: via: (https://opensource.com/article/19/9/linux-chgrp-and-newgrp-commands)
|
||||
[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
|
||||
|
||||
chgrp 和 newgrp 命令简介
|
||||
======
|
||||
|
||||
> chgrp 和 newgrp 命令可帮助你管理需要维护组所有权的文件。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201909/28/155554aezllilzbedetm43.jpg)
|
||||
|
||||
在最近的一篇文章中,我介绍了 [chown][2] 命令,它用于修改系统上的文件所有权。回想一下,所有权是分配给一个对象的用户和组的组合。`chgrp` 和 `newgrp` 命令为管理需要维护组所有权的文件提供了帮助。
|
||||
|
||||
### 使用 chgrp
|
||||
|
||||
`chgrp` 只是更改文件的组所有权。这与 `chown :<group>` 命令相同。你可以使用:
|
||||
|
||||
```
|
||||
$chown :alan mynotes
|
||||
```
|
||||
|
||||
或者:
|
||||
|
||||
```
|
||||
$chgrp alan mynotes
|
||||
```
|
||||
|
||||
#### 递归
|
||||
|
||||
`chgrp` 和它的一些参数可以用在命令行和脚本中。就像许多其他 Linux 命令一样,`chgrp` 有一个递归参数 `-R`。如下所示,你需要它来对文件夹及其内容进行递归操作。我加了 `-v`(详细)参数,因此 `chgrp` 会告诉我它在做什么:
|
||||
|
||||
|
||||
```
|
||||
$ ls -l . conf
|
||||
.:
|
||||
drwxrwxr-x 2 alan alan 4096 Aug 5 15:33 conf
|
||||
|
||||
conf:
|
||||
-rw-rw-r-- 1 alan alan 0 Aug 5 15:33 conf.xml
|
||||
# chgrp -vR delta conf
|
||||
changed group of 'conf/conf.xml' from alan to delta
|
||||
changed group of 'conf' from alan to delta
|
||||
```
|
||||
|
||||
#### 参考
|
||||
|
||||
当你要更改文件的组以匹配特定的配置,或者当你不知道具体的组时(比如你运行一个脚本时),可使用参考文件 (`--reference=RFILE`)。你可以复制另外一个作为参考的文件(RFILE)的组。比如,为了撤销上面的更改 (请注意,点 `.` 代表当前工作目录):
|
||||
|
||||
```
|
||||
$ chgrp -vR --reference=. conf
|
||||
```
|
||||
|
||||
#### 报告更改
|
||||
|
||||
大多数命令都有用于控制其输出的参数。最常见的是 `-v` 来启用详细信息,而且 `chgrp` 命令也拥有详细模式。它还具有 `-c`(`--changes`)参数,指示 `chgrp` 仅在进行了更改时报告。`chgrp` 还会报告其他内容,例如是操作不被允许时。
|
||||
|
||||
参数 `-f`(`--silent`、`--quiet`)用于禁止显示大部分错误消息。我将在下一节中使用此参数和 `-c` 来显示实际更改。
|
||||
|
||||
#### 保持根目录
|
||||
|
||||
Linux 文件系统的根目录(`/`)应该受到高度重视。如果命令在此层级犯了一个错误,那么后果可能是可怕的,并会让系统无法使用。尤其是在运行一个会递归修改甚至删除的命令时。`chgrp` 命令有一个可用于保护和保持根目录的参数。它是 `--preserve-root`。如果在根目录中将此参数和递归一起使用,那么什么也不会发生,而是会出现一条消息:
|
||||
|
||||
```
|
||||
[root@localhost /]# chgrp -cfR --preserve-root a+w /
|
||||
chgrp: it is dangerous to operate recursively on '/'
|
||||
chgrp: use --no-preserve-root to override this failsafe
|
||||
```
|
||||
|
||||
不与递归(-R)结合使用时,该选项无效。但是,如果该命令由 `root` 用户运行,那么 `/` 的权限将会更改,但其下的其他文件或目录的权限则不会被更改:
|
||||
|
||||
```
|
||||
[alan@localhost /]$ chgrp -c --preserve-root alan /
|
||||
chgrp: changing group of '/': Operation not permitted
|
||||
[root@localhost /]# chgrp -c --preserve-root alan /
|
||||
changed group of '/' from root to alan
|
||||
```
|
||||
|
||||
令人惊讶的是,它似乎不是默认参数。而选项 `--no-preserve-root` 是默认的。如果你在不带“保持”选项的情况下运行上述命令,那么它将默认为“无保持”模式,并可能会更改不应更改的文件的权限:
|
||||
|
||||
```
|
||||
[alan@localhost /]$ chgrp -cfR alan /
|
||||
changed group of '/dev/pts/0' from tty to alan
|
||||
changed group of '/dev/tty2' from tty to alan
|
||||
changed group of '/var/spool/mail/alan' from mail to alan
|
||||
```
|
||||
|
||||
### 关于 newgrp
|
||||
|
||||
`newgrp` 命令允许用户覆盖当前的主要组。当你在所有文件必须有相同的组所有权的目录中操作时,`newgrp` 会很方便。假设你的内网服务器上有一个名为 `share` 的目录,不同的团队在其中存储市场活动照片。组名为 `share`。当不同的用户将文件放入目录时,文件的主要组可能会变得混乱。每当添加新文件时,你都可以运行 `chgrp` 将错乱的组纠正为 `share`:
|
||||
|
||||
```
|
||||
$ cd share
|
||||
ls -l
|
||||
-rw-r--r--. 1 alan share 0 Aug 7 15:35 pic13
|
||||
-rw-r--r--. 1 alan alan 0 Aug 7 15:35 pic1
|
||||
-rw-r--r--. 1 susan delta 0 Aug 7 15:35 pic2
|
||||
-rw-r--r--. 1 james gamma 0 Aug 7 15:35 pic3
|
||||
-rw-rw-r--. 1 bill contract 0 Aug 7 15:36 pic4
|
||||
```
|
||||
|
||||
我在 [chmod 命令][3]的文章中介绍了 `setgid` 模式。它是解决此问题的一种方法。但是,假设由于某种原因未设置 `setgid` 位。`newgrp` 命令在此时很有用。在任何用户将文件放入 `share` 目录之前,他们可以运行命令 `newgrp share`。这会将其主要组切换为 `share`,因此他们放入目录中的所有文件都将有 `share` 组,而不是用户自己的主要组。完成后,用户可以使用以下命令切换回常规主要组(举例):
|
||||
|
||||
```
|
||||
newgrp alan
|
||||
```
|
||||
|
||||
### 总结
|
||||
|
||||
了解如何管理用户、组和权限非常重要。最好知道一些替代方法来解决可能遇到的问题,因为并非所有环境都以相同的方式设置。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/linux-chgrp-and-newgrp-commands
|
||||
|
||||
作者:[Alan Formy-Duval][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/alanfdosshttps://opensource.com/users/sethhttps://opensource.com/users/alanfdosshttps://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/community-penguins-osdc-lead.png?itok=BmqsAF4A (Penguins walking on the beach )
|
||||
[2]: https://opensource.com/article/19/8/linux-chown-command
|
||||
[3]: https://opensource.com/article/19/8/linux-chmod-command
|
@ -0,0 +1,64 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11405-1.html)
|
||||
[#]: subject: (IBM brings blockchain to Red Hat OpenShift; adds Apache CouchDB for hybrid cloud customers)
|
||||
[#]: via: (https://www.networkworld.com/article/3441362/ibm-brings-blockchain-to-red-hat-openshift-adds-apache-couchdb-for-hybrid-cloud-customers.html)
|
||||
[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/)
|
||||
|
||||
IBM 将区块链引入红帽 OpenShift;为混合云客户添加了Apache CouchDB
|
||||
======
|
||||
|
||||
> IBM 在其区块链平台上增加了红帽 OpenShift 支持,并将用于 Apache CouchDB 的 Kubernetes Operator 引入其混合云服务中。
|
||||
|
||||
![](https://images.idgesg.net/images/article/2019/08/cloudjourney1200x800-100808549-large.jpg)
|
||||
|
||||
IBM 本周继续推进其红帽和开源集成工作,在其[区块链][1]平台上添加了红帽 OpenShift 支持,并在其[混合云][2]服务产品之外为 Apache CouchDB 引入了 Kubernetes Operator。
|
||||
|
||||
在该公司的旗舰级企业 Kubernetes 平台 [红帽 OpenShift 上部署 IBM 区块链][3] 的能力,意味着 IBM 区块链的开发人员将能够在本地、公共云或混合云架构中部署安全软件。
|
||||
|
||||
区块链是一个分布式数据库,维护着一个不断增长的记录列表,可以使用哈希技术对其进行验证,并且 IBM 区块链平台包括用于构建、操作、治理和发展受保护的区块链网络的工具。
|
||||
|
||||
IBM 表示,其区块链 / OpenShift 组合的目标客户面对的公司客户是:希望保留区块链分类帐副本并在自己的基础设施上运行工作负载以实现安全性,降低风险或合规性;需要将数据存储在特定位置以满足数据驻留要求;需要在多个云或混合云架构中部署区块链组件。
|
||||
|
||||
自 7 月份完成对红帽的收购以来,IBM 一直在围绕红帽基于 Kubernetes 的 OpenShift 容器平台构建云开发生态系统。最近,这位蓝色巨人将其[新 z15 大型机与 IBM 的红帽][4]技术融合在一起,称它将为红帽 OpenShift 容器平台提供 IBM z/OS 云代理。该产品将通过连接到 Kubernetes 容器为用户提供 z/OS 计算资源的直接自助访问。
|
||||
|
||||
IBM 表示,打算在 IBM z 系列和 LinuxONE 产品上向 Linux 提供 IBM [Cloud Pak 产品][5]。Cloud Paks 是由 OpenShift 与 100 多种其他 IBM 软件产品组成的捆绑包。LinuxONE 是 IBM 专为支持 Linux 环境而设计的非常成功的大型机系统。
|
||||
|
||||
IBM 表示,愿景是使支持 OpenShift 的 IBM 软件成为客户用来转变其组织的基础构建组件。
|
||||
|
||||
IBM 表示:“我们的大多数客户都需要支持混合云工作负载以及可在任何地方运行这些工作负载的灵活性的解决方案,而用于红帽的 z/OS 云代理将成为我们在平台上启用云原生的关键。”
|
||||
|
||||
在相关新闻中,IBM 宣布支持开源 Apache CouchDB,这是 [Apache CouchDB][7] 的 Kubernetes Operator,并且该 Operator 已通过认证可与红帽 OpenShift 一起使用。Operator 可以自动部署、管理和维护 Apache CouchDB 部署。Apache CouchDB 是非关系型开源 NoSQL 数据库。
|
||||
|
||||
在最近的 [Forrester Wave 报告][8]中,研究人员说:“企业喜欢 NoSQL 这样的能力,可以使用低成本服务器和可以存储、处理和访问任何类型的业务数据的灵活的无模式模型进行横向扩展。NoSQL 平台为企业基础设施专业人士提供了对数据存储和处理的更好控制,并提供了可加速应用程序部署的配置。当许多组织使用 NoSQL 来补充其关系数据库时,一些组织已开始替换它们以支持更好的性能、扩展规模并降低其数据库成本。”
|
||||
|
||||
当前,IBM 云使用 Cloudant Db 服务作为其针对新的云原生应用程序的标准数据库。IBM 表示,对 CouchDB 的强大支持为用户提供了替代方案和后备选项。IBM 表示,能够将它们全部绑定到红帽 OpenShift Kubernetes 部署中,可以使客户在部署应用程序并在多个云环境中移动数据时使用数据库本地复制功能来维持对数据的低延迟访问。
|
||||
|
||||
“我们的客户正在转向基于容器化和[微服务][9]的架构,以提高速度、敏捷性和运营能力。在云原生应用程序开发中,应用程序需要具有支持可伸缩性、可移植性和弹性的数据层。”IBM 院士兼云数据库副总裁 Adam Kocoloski 写道,“我们相信数据可移植性和 CouchDB 可以大大改善多云架构的功能,使客户能够构建真正可在私有云、公共云和边缘位置之间移植的解决方案。”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.networkworld.com/article/3441362/ibm-brings-blockchain-to-red-hat-openshift-adds-apache-couchdb-for-hybrid-cloud-customers.html
|
||||
|
||||
作者:[Michael Cooney][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/Michael-Cooney/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://www.networkworld.com/article/3330937/how-blockchain-will-transform-the-iot.html
|
||||
[2]: https://www.networkworld.com/article/3268448/what-is-hybrid-cloud-really-and-whats-the-best-strategy.html
|
||||
[3]: https://www.ibm.com/blogs/blockchain/2019/09/ibm-blockchain-platform-meets-red-hat-openshift/
|
||||
[4]: https://www.networkworld.com/article/3438542/ibm-z15-mainframe-amps-up-cloud-security-features.html
|
||||
[5]: https://www.networkworld.com/article/3429596/ibm-fuses-its-software-with-red-hats-to-launch-hybrid-cloud-juggernaut.html
|
||||
[6]: https://www.networkworld.com/article/3400740/achieve-compliant-cost-effective-hybrid-cloud-operations.html
|
||||
[7]: https://www.ibm.com/cloud/learn/couchdb
|
||||
[8]: https://reprints.forrester.com/#/assets/2/363/RES136481/reports
|
||||
[9]: https://www.networkworld.com/article/3137250/what-you-need-to-know-about-microservices.html
|
||||
[10]: https://www.facebook.com/NetworkWorld/
|
||||
[11]: https://www.linkedin.com/company/network-world
|
289
published/20190902 How RPM packages are made- the spec file.md
Normal file
289
published/20190902 How RPM packages are made- the spec file.md
Normal file
@ -0,0 +1,289 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11538-1.html)
|
||||
[#]: subject: (How RPM packages are made: the spec file)
|
||||
[#]: via: (https://fedoramagazine.org/how-rpm-packages-are-made-the-spec-file/)
|
||||
[#]: author: (Ankur Sinha "FranciscoD" https://fedoramagazine.org/author/ankursinha/)
|
||||
|
||||
如何编写 RPM 的 spec 文件
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
在[关于 RPM 软件包构建的上一篇文章][2]中,你了解到了源 RPM 包括软件的源代码以及 spec 文件。这篇文章深入研究了 spec 文件,该文件中包含了有关如何构建 RPM 的指令。同样,本文以 `fpaste` 为例。
|
||||
|
||||
### 了解源代码
|
||||
|
||||
在开始编写 spec 文件之前,你需要对要打包的软件有所了解。在这里,你正在研究 `fpaste`,这是一个非常简单的软件。它是用 Python 编写的,并且是一个单文件脚本。当它发布新版本时,可在 Pagure 上找到:<https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz>。
|
||||
|
||||
如该档案文件所示,当前版本为 0.3.9.2。下载它,以便你查看该档案文件中的内容:
|
||||
|
||||
```
|
||||
$ wget https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
|
||||
$ tar -tvf fpaste-0.3.9.2.tar.gz
|
||||
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/
|
||||
-rw-rw-r-- root/root 25 2018-07-25 02:58 fpaste-0.3.9.2/.gitignore
|
||||
-rw-rw-r-- root/root 3672 2018-07-25 02:58 fpaste-0.3.9.2/CHANGELOG
|
||||
-rw-rw-r-- root/root 35147 2018-07-25 02:58 fpaste-0.3.9.2/COPYING
|
||||
-rw-rw-r-- root/root 444 2018-07-25 02:58 fpaste-0.3.9.2/Makefile
|
||||
-rw-rw-r-- root/root 1656 2018-07-25 02:58 fpaste-0.3.9.2/README.rst
|
||||
-rw-rw-r-- root/root 658 2018-07-25 02:58 fpaste-0.3.9.2/TODO
|
||||
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/
|
||||
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/
|
||||
drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/
|
||||
-rw-rw-r-- root/root 3867 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/fpaste.1
|
||||
-rwxrwxr-x root/root 24884 2018-07-25 02:58 fpaste-0.3.9.2/fpaste
|
||||
lrwxrwxrwx root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/fpaste.py -> fpaste
|
||||
```
|
||||
|
||||
你要安装的文件是:
|
||||
|
||||
* `fpaste.py`:应该安装到 `/usr/bin/`。
|
||||
* `docs/man/en/fpaste.1`:手册,应放到 `/usr/share/man/man1/`。
|
||||
* `COPYING`:许可证文本,应放到 `/usr/share/license/fpaste/`。
|
||||
* `README.rst`、`TODO`:放到 `/usr/share/doc/fpaste/` 下的其它文档。
|
||||
|
||||
这些文件的安装位置取决于文件系统层次结构标准(FHS)。要了解更多信息,可以在这里阅读:<http://www.pathname.com/fhs/> 或查看 Fedora 系统的手册页:
|
||||
|
||||
```
|
||||
$ man hier
|
||||
```
|
||||
|
||||
#### 第一部分:要构建什么?
|
||||
|
||||
现在我们知道了源文件中有哪些文件,以及它们要存放的位置,让我们看一下 spec 文件。你可以在此处查看这个完整的文件:<https://src.fedoraproject.org/rpms/fpaste/blob/master/f/fpaste.spec>。
|
||||
|
||||
这是 spec 文件的第一部分:
|
||||
|
||||
```
|
||||
Name: fpaste
|
||||
Version: 0.3.9.2
|
||||
Release: 3%{?dist}
|
||||
Summary: A simple tool for pasting info onto sticky notes instances
|
||||
BuildArch: noarch
|
||||
License: GPLv3+
|
||||
URL: https://pagure.io/fpaste
|
||||
Source0: https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
|
||||
|
||||
Requires: python3
|
||||
|
||||
%description
|
||||
It is often useful to be able to easily paste text to the Fedora
|
||||
Pastebin at http://paste.fedoraproject.org and this simple script
|
||||
will do that and return the resulting URL so that people may
|
||||
examine the output. This can hopefully help folks who are for
|
||||
some reason stuck without X, working remotely, or any other
|
||||
reason they may be unable to paste something into the pastebin
|
||||
```
|
||||
|
||||
`Name`、`Version` 等称为*标签*,它们定义在 RPM 中。这意味着你不能只是随意写点标签,RPM 无法理解它们!需要注意的标签是:
|
||||
|
||||
* `Source0`:告诉 RPM 该软件的源代码档案文件所在的位置。
|
||||
* `Requires`:列出软件的运行时依赖项。RPM 可以自动检测很多依赖项,但是在某些情况下,必须手动指明它们。运行时依赖项是系统上必须具有的功能(通常是软件包),才能使该软件包起作用。这是 [dnf][3] 在安装此软件包时检测是否需要拉取其他软件包的方式。
|
||||
* `BuildRequires`:列出了此软件的构建时依赖项。这些通常必须手动确定并添加到 spec 文件中。
|
||||
* `BuildArch`:此软件为该计算机体系结构所构建。如果省略此标签,则将为所有受支持的体系结构构建该软件。值 `noarch` 表示该软件与体系结构无关(例如 `fpaste`,它完全是用 Python 编写的)。
|
||||
|
||||
本节提供有关 `fpaste` 的常规信息:它是什么,正在将什么版本制作为 RPM,其许可证等等。如果你已安装 `fpaste`,并查看其元数据时,则可以看到该 RPM 中包含的以下信息:
|
||||
|
||||
```
|
||||
$ sudo dnf install fpaste
|
||||
$ rpm -qi fpaste
|
||||
Name : fpaste
|
||||
Version : 0.3.9.2
|
||||
Release : 2.fc30
|
||||
...
|
||||
```
|
||||
|
||||
RPM 会自动添加一些其他标签,以代表它所知道的内容。
|
||||
|
||||
至此,我们掌握了要为其构建 RPM 的软件的一般信息。接下来,我们开始告诉 RPM 做什么。
|
||||
|
||||
#### 第二部分:准备构建
|
||||
|
||||
spec 文件的下一部分是准备部分,用 `%prep` 代表:
|
||||
|
||||
```
|
||||
%prep
|
||||
%autosetup
|
||||
```
|
||||
|
||||
对于 `fpaste`,这里唯一的命令是 `%autosetup`。这只是将 tar 档案文件提取到一个新文件夹中,并为下一部分的构建阶段做好了准备。你可以在此处执行更多操作,例如应用补丁程序,出于不同目的修改文件等等。如果你查看过 Python 的源 RPM 的内容,那么你会在那里看到许多补丁。这些都将在本节中应用。
|
||||
|
||||
通常,spec 文件中带有 `%` 前缀的所有内容都是 RPM 以特殊方式解释的宏或标签。这些通常会带有大括号,例如 `%{example}`。
|
||||
|
||||
#### 第三部分:构建软件
|
||||
|
||||
下一部分是构建软件的位置,用 `%build` 表示。现在,由于 `fpaste` 是一个简单的纯 Python 脚本,因此无需构建。因此,这里是:
|
||||
|
||||
```
|
||||
%build
|
||||
#nothing required
|
||||
```
|
||||
|
||||
不过,通常来说,你会在此处使用构建命令,例如:
|
||||
|
||||
```
|
||||
configure; make
|
||||
```
|
||||
|
||||
构建部分通常是 spec 文件中最难的部分,因为这是从源代码构建软件的地方。这要求你知道该工具使用的是哪个构建系统,该系统可能是许多构建系统之一:Autotools、CMake、Meson、Setuptools(用于 Python)等等。每个都有自己的命令和语法样式。你需要充分了解这些才能正确构建软件。
|
||||
|
||||
#### 第四部分:安装文件
|
||||
|
||||
软件构建后,需要在 `%install` 部分中安装它:
|
||||
|
||||
```
|
||||
%install
|
||||
mkdir -p %{buildroot}%{_bindir}
|
||||
make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}
|
||||
```
|
||||
|
||||
在构建 RPM 时,RPM 不会修改你的系统文件。在一个可以正常运行的系统上添加、删除或修改文件的风险太大。如果发生故障怎么办?因此,RPM 会创建一个专门打造的文件系统并在其中工作。这称为 `buildroot`。 因此,在 `buildroot` 中,我们创建由宏 `%{_bindir}` 代表的 `/usr/bin` 目录,然后使用提供的 `Makefile` 将文件安装到其中。
|
||||
|
||||
至此,我们已经在专门打造的 `buildroot` 中安装了 `fpaste` 的构建版本。
|
||||
|
||||
#### 第五部分:列出所有要包括在 RPM 中的文件
|
||||
|
||||
spec 文件其后的一部分是文件部分:`%files`。在这里,我们告诉 RPM 从该 spec 文件创建的档案文件中包含哪些文件。`fpaste` 的文件部分非常简单:
|
||||
|
||||
```
|
||||
%files
|
||||
%{_bindir}/%{name}
|
||||
%doc README.rst TODO
|
||||
%{_mandir}/man1/%{name}.1.gz
|
||||
%license COPYING
|
||||
```
|
||||
|
||||
请注意,在这里,我们没有指定 `buildroot`。所有这些路径都是相对路径。`%doc` 和 `%license`命令做的稍微多一点,它们会创建所需的文件夹,并记住这些文件必须放在那里。
|
||||
|
||||
RPM 很聪明。例如,如果你在 `%install` 部分中安装了文件,但未列出它们,它会提醒你。
|
||||
|
||||
#### 第六部分:在变更日志中记录所有变更
|
||||
|
||||
Fedora 是一个基于社区的项目。许多贡献者维护或共同维护软件包。因此,当务之急是不要被软件包做了哪些更改所搞混。为了确保这一点,spec 文件包含的最后一部分是变更日志 `%changelog`:
|
||||
|
||||
```
|
||||
%changelog
|
||||
* Thu Jul 25 2019 Fedora Release Engineering < ...> - 0.3.9.2-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||
|
||||
* Thu Jan 31 2019 Fedora Release Engineering < ...> - 0.3.9.2-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||
|
||||
* Tue Jul 24 2018 Ankur Sinha - 0.3.9.2-1
|
||||
- Update to 0.3.9.2
|
||||
|
||||
* Fri Jul 13 2018 Fedora Release Engineering < ...> - 0.3.9.1-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||
|
||||
* Wed Feb 07 2018 Fedora Release Engineering < ..> - 0.3.9.1-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
|
||||
|
||||
* Sun Sep 10 2017 Vasiliy N. Glazov < ...> - 0.3.9.1-2
|
||||
- Cleanup spec
|
||||
|
||||
* Fri Sep 08 2017 Ankur Sinha - 0.3.9.1-1
|
||||
- Update to latest release
|
||||
- fixes rhbz 1489605
|
||||
...
|
||||
....
|
||||
```
|
||||
|
||||
spec 文件的*每项*变更都必须有一个变更日志条目。如你在此处看到的,虽然我以维护者身份更新了该 spec 文件,但其他人也做过更改。清楚地记录变更内容有助于所有人知道该 spec 文件的当前状态。对于系统上安装的所有软件包,都可以使用 `rpm` 来查看其更改日志:
|
||||
|
||||
```
|
||||
$ rpm -q --changelog fpaste
|
||||
```
|
||||
|
||||
### 构建 RPM
|
||||
|
||||
现在我们准备构建 RPM 包。如果要继续执行以下命令,请确保遵循[上一篇文章][2]中的步骤设置系统以构建 RPM。
|
||||
|
||||
我们将 `fpaste` 的 spec 文件放置在 `~/rpmbuild/SPECS` 中,将源代码档案文件存储在 `~/rpmbuild/SOURCES/` 中,现在可以创建源 RPM 了:
|
||||
|
||||
```
|
||||
$ cd ~/rpmbuild/SPECS
|
||||
$ wget https://src.fedoraproject.org/rpms/fpaste/raw/master/f/fpaste.spec
|
||||
|
||||
$ cd ~/rpmbuild/SOURCES
|
||||
$ wget https://pagure.io/fpaste/archive/0.3.9.2/fpaste-0.3.9.2.tar.gz
|
||||
|
||||
$ cd ~/rpmbuild/SOURCES
|
||||
$ rpmbuild -bs fpaste.spec
|
||||
Wrote: /home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
|
||||
```
|
||||
|
||||
让我们看一下结果:
|
||||
|
||||
```
|
||||
$ ls ~/rpmbuild/SRPMS/fpaste*
|
||||
/home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
|
||||
|
||||
$ rpm -qpl ~/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
|
||||
fpaste-0.3.9.2.tar.gz
|
||||
fpaste.spec
|
||||
```
|
||||
|
||||
我们看到源 RPM 已构建。让我们同时构建源 RPM 和二进制 RPM:
|
||||
|
||||
```
|
||||
$ cd ~/rpmbuild/SPECS
|
||||
$ rpmbuild -ba fpaste.spec
|
||||
..
|
||||
..
|
||||
..
|
||||
```
|
||||
|
||||
RPM 将向你显示完整的构建输出,并在我们之前看到的每个部分中详细说明它的工作。此“构建日志”非常重要。当构建未按预期进行时,我们的打包人员将花费大量时间来遍历它们,以跟踪完整的构建路径来查看出了什么问题。
|
||||
|
||||
就是这样!准备安装的 RPM 应该位于以下位置:
|
||||
|
||||
```
|
||||
$ ls ~/rpmbuild/RPMS/noarch/
|
||||
fpaste-0.3.9.2-3.fc30.noarch.rpm
|
||||
```
|
||||
|
||||
### 概括
|
||||
|
||||
我们已经介绍了如何从 spec 文件构建 RPM 的基础知识。这绝不是一份详尽的文档。实际上,它根本不是文档。它只是试图解释幕后的运作方式。简短回顾一下:
|
||||
|
||||
* RPM 有两种类型:源 RPM 和 二进制 RPM。
|
||||
* 二进制 RPM 包含要安装以使用该软件的文件。
|
||||
* 源 RPM 包含构建二进制 RPM 所需的信息:完整的源代码,以及 spec 文件中的有关如何构建 RPM 的说明。
|
||||
* spec 文件包含多个部分,每个部分都有其自己的用途。
|
||||
|
||||
在这里,我们已经在安装好的 Fedora 系统中本地构建了 RPM。虽然这是个基本的过程,但我们从存储库中获得的 RPM 是建立在具有严格配置和方法的专用服务器上的,以确保正确性和安全性。这个 Fedora 打包流程将在以后的文章中讨论。
|
||||
|
||||
你想开始构建软件包,并帮助 Fedora 社区维护我们提供的大量软件吗?你可以[从这里开始加入软件包集合维护者][4]。
|
||||
|
||||
如有任何疑问,请发布到 [Fedora 开发人员邮件列表][5],我们随时乐意为你提供帮助!
|
||||
|
||||
### 参考
|
||||
|
||||
这里有一些构建 RPM 的有用参考:
|
||||
|
||||
* <https://fedoraproject.org/wiki/How_to_create_an_RPM_package>
|
||||
* <https://docs.fedoraproject.org/en-US/quick-docs/create-hello-world-rpm/>
|
||||
* <https://docs.fedoraproject.org/en-US/packaging-guidelines/>
|
||||
* <https://rpm.org/documentation.html>
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/how-rpm-packages-are-made-the-spec-file/
|
||||
|
||||
作者:[Ankur Sinha "FranciscoD"][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/ankursinha/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/rpm.png-816x345.jpg
|
||||
[2]: https://linux.cn/article-11527-1.html
|
||||
[3]: https://fedoramagazine.org/managing-packages-fedora-dnf/
|
||||
[4]: https://fedoraproject.org/wiki/Join_the_package_collection_maintainers
|
||||
[5]: https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/
|
246
published/20190905 Building CI-CD pipelines with Jenkins.md
Normal file
246
published/20190905 Building CI-CD pipelines with Jenkins.md
Normal file
@ -0,0 +1,246 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11546-1.html)
|
||||
[#]: subject: (Building CI/CD pipelines with Jenkins)
|
||||
[#]: via: (https://opensource.com/article/19/9/intro-building-cicd-pipelines-jenkins)
|
||||
[#]: author: (Bryant Son https://opensource.com/users/brson)
|
||||
|
||||
用 Jenkins 构建 CI/CD 流水线
|
||||
======
|
||||
|
||||
> 通过这份 Jenkins 分步教程,构建持续集成和持续交付(CI/CD)流水线。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201911/07/001349rbbbswpeqnnteeee.jpg)
|
||||
|
||||
在我的文章《[使用开源工具构建 DevOps 流水线的初学者指南][2]》中,我分享了一个从头开始构建 DevOps 流水线的故事。推动该计划的核心技术是 [Jenkins][3],这是一个用于建立持续集成和持续交付(CI/CD)流水线的开源工具。
|
||||
|
||||
在花旗,有一个单独的团队为专用的 Jenkins 流水线提供稳定的主从节点环境,但是该环境仅用于质量保证(QA)、构建阶段和生产环境。开发环境仍然是非常手动的,我们的团队需要对其进行自动化以在加快开发工作的同时获得尽可能多的灵活性。这就是我们决定为 DevOps 建立 CI/CD 流水线的原因。Jenkins 的开源版本由于其灵活性、开放性、强大的插件功能和易用性而成为显而易见的选择。
|
||||
|
||||
在本文中,我将分步演示如何使用 Jenkins 构建 CI/CD 流水线。
|
||||
|
||||
### 什么是流水线?
|
||||
|
||||
在进入本教程之前,了解有关 CI/CD <ruby>流水线<rt>pipeline</rt></ruby>的知识会很有帮助。
|
||||
|
||||
首先,了解 Jenkins 本身并不是流水线这一点很有帮助。只是创建一个新的 Jenkins 作业并不能构建一条流水线。可以把 Jenkins 看做一个遥控器,在这里点击按钮即可。当你点击按钮时会发生什么取决于遥控器要控制的内容。Jenkins 为其他应用程序 API、软件库、构建工具等提供了一种插入 Jenkins 的方法,它可以执行并自动化任务。Jenkins 本身不执行任何功能,但是随着其它工具的插入而变得越来越强大。
|
||||
|
||||
流水线是一个单独的概念,指的是按顺序连接在一起的事件或作业组:
|
||||
|
||||
> “<ruby>流水线<rt>pipeline</rt></ruby>”是可以执行的一系列事件或作业。
|
||||
|
||||
理解流水线的最简单方法是可视化一系列阶段,如下所示:
|
||||
|
||||
![Pipeline example][4]
|
||||
|
||||
在这里,你应该看到两个熟悉的概念:<ruby>阶段<rt>Stage</rt></ruby>和<ruby>步骤<rt>Step</rt></ruby>。
|
||||
|
||||
* 阶段:一个包含一系列步骤的块。阶段块可以命名为任何名称;它用于可视化流水线过程。
|
||||
* 步骤:表明要做什么的任务。步骤定义在阶段块内。
|
||||
|
||||
在上面的示例图中,阶段 1 可以命名为 “构建”、“收集信息”或其它名称,其它阶段块也可以采用类似的思路。“步骤”只是简单地说放上要执行的内容,它可以是简单的打印命令(例如,`echo "Hello, World"`)、程序执行命令(例如,`java HelloWorld`)、shell 执行命令( 例如,`chmod 755 Hello`)或任何其他命令,只要通过 Jenkins 环境将其识别为可执行命令即可。
|
||||
|
||||
Jenkins 流水线以**编码脚本**的形式提供,通常称为 “Jenkinsfile”,尽管可以用不同的文件名。下面这是一个简单的 Jenkins 流水线文件的示例:
|
||||
|
||||
```
|
||||
// Example of Jenkins pipeline script
|
||||
|
||||
pipeline {
|
||||
stages {
|
||||
stage("Build") {
|
||||
steps {
|
||||
// Just print a Hello, Pipeline to the console
|
||||
echo "Hello, Pipeline!"
|
||||
// Compile a Java file. This requires JDKconfiguration from Jenkins
|
||||
javac HelloWorld.java
|
||||
// Execute the compiled Java binary called HelloWorld. This requires JDK configuration from Jenkins
|
||||
java HelloWorld
|
||||
// Executes the Apache Maven commands, clean then package. This requires Apache Maven configuration from Jenkins
|
||||
mvn clean package ./HelloPackage
|
||||
// List the files in current directory path by executing a default shell command
|
||||
sh "ls -ltr"
|
||||
}
|
||||
}
|
||||
// And next stages if you want to define further...
|
||||
} // End of stages
|
||||
} // End of pipeline
|
||||
```
|
||||
|
||||
从此示例脚本很容易看到 Jenkins 流水线的结构。请注意,默认情况下某些命令(如 `java`、`javac`和 `mvn`)不可用,需要通过 Jenkins 进行安装和配置。 因此:
|
||||
|
||||
> Jenkins 流水线是一种以定义的方式依次执行 Jenkins 作业的方法,方法是将其编码并在多个块中进行结构化,这些块可以包含多个任务的步骤。
|
||||
|
||||
好。既然你已经了解了 Jenkins 流水线是什么,我将向你展示如何创建和执行 Jenkins 流水线。在本教程的最后,你将建立一个 Jenkins 流水线,如下所示:
|
||||
|
||||
![Final Result][5]
|
||||
|
||||
### 如何构建 Jenkins 流水线
|
||||
|
||||
为了便于遵循本教程的步骤,我创建了一个示例 [GitHub 存储库][6]和一个视频教程。
|
||||
|
||||
- [视频](https://img.linux.net.cn/static/video/_-jDPwYgDVKlg.mp4)
|
||||
|
||||
开始本教程之前,你需要:
|
||||
|
||||
* Java 开发工具包(JDK):如果尚未安装,请安装 JDK 并将其添加到环境路径中,以便可以通过终端执行 Java 命令(如 `java jar`)。这是利用本教程中使用的 Java Web Archive(WAR)版本的 Jenkins 所必需的(尽管你可以使用任何其他发行版)。
|
||||
* 基本计算机操作能力:你应该知道如何键入一些代码、通过 shell 执行基本的 Linux 命令以及打开浏览器。
|
||||
|
||||
让我们开始吧。
|
||||
|
||||
#### 步骤一:下载 Jenkins
|
||||
|
||||
导航到 [Jenkins 下载页面][7]。向下滚动到 “Generic Java package (.war)”,然后单击下载文件;将其保存在易于找到的位置。(如果你选择其他 Jenkins 发行版,除了步骤二之外,本教程的其余步骤应该几乎相同。)使用 WAR 文件的原因是它是个一次性可执行文件,可以轻松地执行和删除。
|
||||
|
||||
![Download Jenkins as Java WAR file][8]
|
||||
|
||||
#### 步骤二:以 Java 二进制方式执行 Jenkins
|
||||
|
||||
打开一个终端窗口,并使用 `cd <your path>` 进入下载 Jenkins 的目录。(在继续之前,请确保已安装 JDK 并将其添加到环境路径。)执行以下命令,该命令将 WAR 文件作为可执行二进制文件运行:
|
||||
|
||||
```
|
||||
java -jar ./jenkins.war
|
||||
```
|
||||
|
||||
如果一切顺利,Jenkins 应该在默认端口 8080 上启动并运行。
|
||||
|
||||
![Execute as an executable JAR binary][9]
|
||||
|
||||
#### 步骤三:创建一个新的 Jenkins 作业
|
||||
|
||||
打开一个 Web 浏览器并导航到 `localhost:8080`。除非你有以前安装的 Jenkins,否则应直接转到 Jenkins 仪表板。点击 “Create New Jobs”。你也可以点击左侧的 “New Item”。
|
||||
|
||||
![Create New Job][10]
|
||||
|
||||
#### 步骤四:创建一个流水线作业
|
||||
|
||||
在此步骤中,你可以选择并定义要创建的 Jenkins 作业类型。选择 “Pipeline” 并为其命名(例如,“TestPipeline”)。单击 “OK” 创建流水线作业。
|
||||
|
||||
![Create New Pipeline Job][11]
|
||||
|
||||
你将看到一个 Jenkins 作业配置页面。向下滚动以找到 “Pipeline” 部分。有两种执行 Jenkins 流水线的方法。一种方法是在 Jenkins 上直接编写流水线脚本,另一种方法是从 SCM(源代码管理)中检索 Jenkins 文件。在接下来的两个步骤中,我们将体验这两种方式。
|
||||
|
||||
#### 步骤五:通过直接脚本配置并执行流水线作业
|
||||
|
||||
要使用直接脚本执行流水线,请首先从 GitHub 复制该 [Jenkinsfile 示例][6]的内容。选择 “Pipeline script” 作为 “Destination”,然后将该 Jenkinsfile 的内容粘贴到 “Script” 中。花一些时间研究一下 Jenkins 文件的结构。注意,共有三个阶段:Build、Test 和 Deploy,它们是任意的,可以是任何一个。每个阶段中都有一些步骤;在此示例中,它们只是打印一些随机消息。
|
||||
|
||||
单击 “Save” 以保留更改,这将自动将你带回到 “Job Overview” 页面。
|
||||
|
||||
![Configure to Run as Jenkins Script][12]
|
||||
|
||||
要开始构建流水线的过程,请单击 “Build Now”。如果一切正常,你将看到第一个流水线(如下面的这个)。
|
||||
|
||||
![Click Build Now and See Result][13]
|
||||
|
||||
要查看流水线脚本构建的输出,请单击任何阶段,然后单击 “Log”。你会看到这样的消息。
|
||||
|
||||
![Visit sample GitHub with Jenkins get clone link][14]
|
||||
|
||||
#### 步骤六:通过 SCM 配置并执行流水线作业
|
||||
|
||||
现在,换个方式:在此步骤中,你将通过从源代码控制的 GitHub 中复制 Jenkinsfile 来部署相同的 Jenkins 作业。在同一个 [GitHub 存储库][6]中,通过单击 “Clone or download” 并复制其 URL 来找到其存储库 URL。
|
||||
|
||||
![Checkout from GitHub][15]
|
||||
|
||||
单击 “Configure” 以修改现有作业。滚动到 “Advanced Project Options” 设置,但这一次,从 “Destination” 下拉列表中选择 “Pipeline script from SCM” 选项。将 GitHub 存储库的 URL 粘贴到 “Repository URL” 中,然后在 “Script Path” 中键入 “Jenkinsfile”。 单击 “Save” 按钮保存。
|
||||
|
||||
![Change to Pipeline script from SCM][16]
|
||||
|
||||
要构建流水线,回到 “Task Overview” 页面后,单击 “Build Now” 以再次执行作业。结果与之前相同,除了多了一个称为 “Declaration: Checkout SCM” 的阶段。
|
||||
|
||||
![Build again and verify][17]
|
||||
|
||||
要查看来自 SCM 构建的流水线的输出,请单击该阶段并查看 “Log” 以检查源代码控制克隆过程的进行情况。
|
||||
|
||||
![Verify Checkout Procedure][18]
|
||||
|
||||
### 除了打印消息,还能做更多
|
||||
|
||||
恭喜你!你已经建立了第一个 Jenkins 流水线!
|
||||
|
||||
“但是等等”,你说,“这太有限了。除了打印无用的消息外,我什么都做不了。”那没问题。到目前为止,本教程仅简要介绍了 Jenkins 流水线可以做什么,但是你可以通过将其与其他工具集成来扩展其功能。以下是给你的下一个项目的一些思路:
|
||||
|
||||
* 建立一个多阶段的 Java 构建流水线,从以下阶段开始:从 Nexus 或 Artifactory 之类的 JAR 存储库中拉取依赖项、编译 Java 代码、运行单元测试、打包为 JAR/WAR 文件,然后部署到云服务器。
|
||||
* 实现一个高级代码测试仪表板,该仪表板将基于 Selenium 的单元测试、负载测试和自动用户界面测试,报告项目的运行状况。
|
||||
* 构建多流水线或多用户流水线,以自动化执行 Ansible 剧本的任务,同时允许授权用户响应正在进行的任务。
|
||||
* 设计完整的端到端 DevOps 流水线,该流水线可提取存储在 SCM 中的基础设施资源文件和配置文件(例如 GitHub),并通过各种运行时程序执行该脚本。
|
||||
|
||||
学习本文结尾处的任何教程,以了解这些更高级的案例。
|
||||
|
||||
#### 管理 Jenkins
|
||||
|
||||
在 Jenkins 主面板,点击 “Manage Jenkins”。
|
||||
|
||||
![Manage Jenkins][19]
|
||||
|
||||
#### 全局工具配置
|
||||
|
||||
有许多可用工具,包括管理插件、查看系统日志等。单击 “Global Tool Configuration”。
|
||||
|
||||
![Global Tools Configuration][20]
|
||||
|
||||
#### 增加附加能力
|
||||
|
||||
在这里,你可以添加 JDK 路径、Git、Gradle 等。配置工具后,只需将该命令添加到 Jenkinsfile 中或通过 Jenkins 脚本执行即可。
|
||||
|
||||
![See Various Options for Plugin][21]
|
||||
|
||||
### 后继
|
||||
|
||||
本文为你介绍了使用酷炫的开源工具 Jenkins 创建 CI/CD 流水线的方法。要了解你可以使用 Jenkins 完成的许多其他操作,请在 Opensource.com 上查看以下其他文章:
|
||||
|
||||
* [Jenkins X 入门][22]
|
||||
* [使用 Jenkins 安装 OpenStack 云][23]
|
||||
* [在容器中运行 Jenkins][24]
|
||||
* [Jenkins 流水线入门][25]
|
||||
* [如何与 Jenkins 一起运行 JMeter][26]
|
||||
* [将 OpenStack 集成到你的 Jenkins 工作流中][27]
|
||||
|
||||
你可能对我为你的开源之旅而写的其他一些文章感兴趣:
|
||||
|
||||
* [9 个用于构建容错系统的开源工具][28]
|
||||
* [了解软件设计模式][29]
|
||||
* [使用开源工具构建 DevOps 流水线的初学者指南][2]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/9/intro-building-cicd-pipelines-jenkins
|
||||
|
||||
作者:[Bryant Son][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/brson
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/pipe-pipeline-grid.png?itok=kkpzKxKg (pipelines)
|
||||
[2]: https://linux.cn/article-11307-1.html
|
||||
[3]: https://jenkins.io/
|
||||
[4]: https://opensource.com/sites/default/files/uploads/diagrampipeline.jpg (Pipeline example)
|
||||
[5]: https://opensource.com/sites/default/files/uploads/0_endresultpreview_0.jpg (Final Result)
|
||||
[6]: https://github.com/bryantson/CICDPractice
|
||||
[7]: https://jenkins.io/download/
|
||||
[8]: https://opensource.com/sites/default/files/uploads/2_downloadwar.jpg (Download Jenkins as Java WAR file)
|
||||
[9]: https://opensource.com/sites/default/files/uploads/3_runasjar.jpg (Execute as an executable JAR binary)
|
||||
[10]: https://opensource.com/sites/default/files/uploads/4_createnewjob.jpg (Create New Job)
|
||||
[11]: https://opensource.com/sites/default/files/uploads/5_createpipeline.jpg (Create New Pipeline Job)
|
||||
[12]: https://opensource.com/sites/default/files/uploads/6_runaspipelinescript.jpg (Configure to Run as Jenkins Script)
|
||||
[13]: https://opensource.com/sites/default/files/uploads/7_buildnow4script.jpg (Click Build Now and See Result)
|
||||
[14]: https://opensource.com/sites/default/files/uploads/8_seeresult4script.jpg (Visit sample GitHub with Jenkins get clone link)
|
||||
[15]: https://opensource.com/sites/default/files/uploads/9_checkoutfromgithub.jpg (Checkout from GitHub)
|
||||
[16]: https://opensource.com/sites/default/files/uploads/10_runsasgit.jpg (Change to Pipeline script from SCM)
|
||||
[17]: https://opensource.com/sites/default/files/uploads/11_seeresultfromgit.jpg (Build again and verify)
|
||||
[18]: https://opensource.com/sites/default/files/uploads/12_verifycheckout.jpg (Verify Checkout Procedure)
|
||||
[19]: https://opensource.com/sites/default/files/uploads/13_managingjenkins.jpg (Manage Jenkins)
|
||||
[20]: https://opensource.com/sites/default/files/uploads/14_globaltoolsconfiguration.jpg (Global Tools Configuration)
|
||||
[21]: https://opensource.com/sites/default/files/uploads/15_variousoptions4plugin.jpg (See Various Options for Plugin)
|
||||
[22]: https://opensource.com/article/18/11/getting-started-jenkins-x
|
||||
[23]: https://opensource.com/article/18/4/install-OpenStack-cloud-Jenkins
|
||||
[24]: https://linux.cn/article-9741-1.html
|
||||
[25]: https://opensource.com/article/18/4/jenkins-pipelines-with-cucumber
|
||||
[26]: https://opensource.com/life/16/7/running-jmeter-jenkins-continuous-delivery-101
|
||||
[27]: https://opensource.com/business/15/5/interview-maish-saidel-keesing-cisco
|
||||
[28]: https://opensource.com/article/19/3/tools-fault-tolerant-system
|
||||
[29]: https://opensource.com/article/19/7/understanding-software-design-patterns
|
@ -0,0 +1,214 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (robsean)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11554-1.html)
|
||||
[#]: subject: (6 Open Source Paint Applications for Linux Users)
|
||||
[#]: via: (https://itsfoss.com/open-source-paint-apps/)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
6 款面向 Linux 用户的开源绘图应用程序
|
||||
======
|
||||
|
||||
小时候,当我开始使用计算机(在 Windows XP 中)时,我最喜欢的应用程序是微软的“画图”。我能在它上面涂鸦数个小时。出乎意料,孩子们仍然喜欢这个“画图”应用程序。不仅仅是孩子们,这个简单的“画图”应用程序,在很多情况下都能派上用场。
|
||||
|
||||
你可以找到一堆可以让你绘制/绘图或操作图片的应用程序。然而,其中一些是专有软件。既然你是一名 Linux 用户,为什么不关注一下开源绘图应用程序呢?
|
||||
|
||||
在这篇文章中,我们将列出一些最好的开源绘图应用程序,它们可以替代可用于 Linux 的专有绘画软件。
|
||||
|
||||
### 开源绘图 & 绘制应用程序
|
||||
|
||||
![][1]
|
||||
|
||||
**注意:** 该列表没有特别的排名顺序。
|
||||
|
||||
#### 1、Pinta
|
||||
|
||||
![][2]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* Paint.NET / 微软“画图”的极好替代品
|
||||
* 支持附加组件(有对 WebP 图像的支持)
|
||||
* 支持图层
|
||||
|
||||
[Pinta][3] 是一款令人赞叹的开源绘图应用程序,非常适合绘图和简单的图片编辑。换句话说,它是一款具有精美功能的简单绘图应用程序。
|
||||
|
||||
你可以将 [Pinta][4] 视为 Linux 上的“画图”的一个替代品,但是带有图层支持等等。不仅仅是“画图”,它也可以替代 Windows 上的 Paint.NET。尽管 Paint.NET 更好一些,但 Pinta 似乎是个不错的选择。
|
||||
|
||||
几个附加组件可以用于增强功能,例如[在 Linux 上支持 WebP 图像][5]。除了图层支持之外,你还可以轻松地调整图片大小、添加特效、进行调整(亮度、对比度等等),以及在导出图片时调整其质量。
|
||||
|
||||
##### 如何安装 Pinta ?
|
||||
|
||||
你应该能够在软件中心/应用程序中心/软件包管理器中简单地找到它。只需要输入 “Pinta”,并开始安装它。要么也可以尝试 [Flatpak][6] 软件包。
|
||||
|
||||
或者,你可以在终端中输入下面的命令(Ubuntu/Debian):
|
||||
|
||||
```
|
||||
sudo apt install pinta
|
||||
```
|
||||
|
||||
下载软件包和安装指南的更多信息,参考[官方下载页面][7]。
|
||||
|
||||
#### 2、Krita
|
||||
|
||||
![][8]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* HDR 绘图
|
||||
* 支持 PSD
|
||||
* 支持图层
|
||||
* 笔刷稳定器
|
||||
* 二维动画
|
||||
|
||||
Krita 是 Linux 上最高级的开源绘图应用程序之一。当然,对于本文而言,它可以帮助你绘制草图和在画布上胡写乱画。除此之外,它还提供很多功能。
|
||||
|
||||
例如,如果你的手有点颤抖,它可以帮助你稳定笔刷的笔划。你可以使用内置的矢量工具来创建漫画画板和其它有趣的东西。如果你正在寻找具有全面的颜色管理支持、绘图助理和图层管理的软件,Krita 应该是你最好的选择。
|
||||
|
||||
##### 如何安装 Krita ?
|
||||
|
||||
类似于 pinta,你可以在软件中心/应用程序中心或软件包管理器的列表中找到它。它也可以 [Flatpak 存储库][10]中找到。
|
||||
|
||||
考虑通过终端安装它?输入下面的命令:
|
||||
|
||||
```
|
||||
sudo apt install krita
|
||||
```
|
||||
|
||||
要么你也可以前往它们的[官方下载页面][11]来获取 AppImage 文件并运行它。
|
||||
|
||||
如果你对 AppImage 文件一无所知,查看我们的指南 —— [如何使用 AppImage][12]。
|
||||
|
||||
#### 3、Tux Paint
|
||||
|
||||
![][13]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 给儿童用的一个简单直接的绘图应用程序
|
||||
|
||||
我不是开玩笑,对于 3-12 岁儿童来说,Tux Paint 是最好的开源绘图应用程序之一。当然,当你只想乱画时,那无需选择,所以,在这种情况下,Tux Paint 似乎是最好的选择(即使是成年人!)。
|
||||
|
||||
##### 如何安装 Tuxpaint ?
|
||||
|
||||
Tuxpaint 可以从软件中心或软件包管理器下载。无论哪种情况,在 Ubuntu/Debian 上安装它,在终端中输入下面的命令:
|
||||
|
||||
```
|
||||
sudo apt install tuxpaint
|
||||
```
|
||||
|
||||
关于它的更多信息,前往[官方站点][14]。
|
||||
|
||||
#### 4、Drawpile
|
||||
|
||||
![][15]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 协同绘制
|
||||
* 内置聊天功能,可与其他用户互动
|
||||
* 图层支持
|
||||
* 记录绘制会话
|
||||
|
||||
Drawpile 是一个有趣的开源绘图应用程序,在该程序中,你可以与其他用户实时协作。确切地说,你们可以单个画布中同时绘制。除了这个独特的功能,它还有图层支持、记录绘制会话的能力,甚至还有与协作用户进行交互的聊天功能。
|
||||
|
||||
你可以主持或加入一个公共会话,或通过一个密码与你的朋友建立私有会话。默认情况下,服务器将是你的计算机,但是如果你需要远程服务器那也可以。
|
||||
|
||||
注意,你将需要[注册一个 Drawpile 账户][16] 才能进行协作。
|
||||
|
||||
##### 如何安装 Drawpile ?
|
||||
|
||||
据我所知,你只能在 [Flatpak 存储库][17]的列表中找到它。
|
||||
|
||||
#### 5、MyPaint
|
||||
|
||||
![][19]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 易用的数码画家工具
|
||||
* 支持图层管理
|
||||
* 很多微调你的画笔和绘制的选项
|
||||
|
||||
对于数码画家来说,[MyPaint][20] 是一个简单而强大的工具。它具有许多选项,可以调整以制作出完美的数字画笔笔触。我不是一个数字艺术家(但我是一个涂鸦者),但是我注意到有很多调整笔刷、颜色的选项,和一个添加中间结果暂存器面板的选项。
|
||||
|
||||
它也支持图层管理,也许你需要它。最新的稳定版本已经有几年没有更新了,但是当前的 alpha 构建版本(我测试过)运行良好。如果你正在 Linux 上寻找一个开源绘图应用程序 —— 试试这个。
|
||||
|
||||
##### 如何安装 MyPaint ?
|
||||
|
||||
MyPaint 可在官方存储库中获得。然而,这是老旧的版本。如果你仍然想继续,你可以在软件中心搜索它,或在终端中输入下面的命令:
|
||||
|
||||
```
|
||||
sudo apt install mypaint
|
||||
```
|
||||
|
||||
你可以前往它的官方 [GitHub 发布页面][21]获取最新的 alpha 构建版本,获取 [AppImage 文件][12](任意版本)并使它可执行并启动应用程序。
|
||||
|
||||
#### 6、KolourPaint
|
||||
|
||||
![][22]
|
||||
|
||||
主要亮点:
|
||||
|
||||
* 一个 Linux 上的“画图”的简单替代品
|
||||
* 不支持图层管理
|
||||
|
||||
如果你不需要任何图层管理的支持,而只是想要一个开源绘图应用程序来绘制东西 —— 那就是它了。
|
||||
|
||||
[KolourPaint][23] 最初是为 KDE 桌面环境定制的,但是它在其它的桌面环境中也能完美地工作。
|
||||
|
||||
##### 如何安装 KolourPaint ?
|
||||
|
||||
你可以从软件中心安装 KolourPaint,或通过终端使用下面的命令:
|
||||
|
||||
```
|
||||
sudo apt install kolourpaint4
|
||||
```
|
||||
|
||||
你总可以试试 [Flathub][24]。
|
||||
|
||||
### 总结
|
||||
|
||||
如果你在考虑如 GIMP/Inkscape 这样的应用程序,我们在另一篇关于[给数码艺术家的最好 Linux 工具][25]的文章中列出。如果你对更多的选择好奇,我建议你去查看它。
|
||||
|
||||
在这里,我们尝试编写一份 Linux 可用的最佳开源绘图应用程序列表。如果你认为我们错过一些东西,请在下面的评论区告诉我们!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/open-source-paint-apps/
|
||||
|
||||
作者:[Ankush Das][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/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/open-source-paint-apps.png?resize=800%2C450&ssl=1
|
||||
[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/pinta.png?ssl=1
|
||||
[3]: https://pinta-project.com/pintaproject/pinta/
|
||||
[4]: https://itsfoss.com/pinta-1-6-ubuntu-linux-mint/
|
||||
[5]: https://itsfoss.com/webp-ubuntu-linux/
|
||||
[6]: https://www.flathub.org/apps/details/com.github.PintaProject.Pinta
|
||||
[7]: https://pinta-project.com/pintaproject/pinta/releases
|
||||
[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/krita-paint.png?ssl=1
|
||||
[9]: https://itsfoss.com/things-to-do-after-installing-fedora-24/
|
||||
[10]: https://www.flathub.org/apps/details/org.kde.krita
|
||||
[11]: https://krita.org/en/download/krita-desktop/
|
||||
[12]: https://itsfoss.com/use-appimage-linux/
|
||||
[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/tux-paint.jpg?ssl=1
|
||||
[14]: http://www.tuxpaint.org/
|
||||
[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/drawpile.png?ssl=1
|
||||
[16]: https://drawpile.net/accounts/signup/
|
||||
[17]: https://flathub.org/apps/details/net.drawpile.drawpile
|
||||
[18]: https://itsfoss.com/ocs-store/
|
||||
[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/mypaint.png?ssl=1
|
||||
[20]: https://mypaint.org/
|
||||
[21]: https://github.com/mypaint/mypaint/releases
|
||||
[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/kolourpaint.png?ssl=1
|
||||
[23]: http://kolourpaint.org/
|
||||
[24]: https://flathub.org/apps/details/org.kde.kolourpaint
|
||||
[25]: https://itsfoss.com/best-linux-graphic-design-software/
|
@ -0,0 +1,619 @@
|
||||
数码文件与文件夹收纳术(以照片为例)
|
||||
======
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201910/05/000950xsxopomsrs55rrb5.jpg)
|
||||
|
||||
- 更新 2014-05-14:增加了一些具体实例
|
||||
- 更新 2015-03-16:根据照片的 GPS 坐标过滤图片
|
||||
- 更新 2016-08-29:以新的 `filetags --filter` 替换已经过时的 `show-sel.sh` 脚本
|
||||
- 更新 2017-08-28: geeqier 视频缩略图的邮件评论
|
||||
- 更新 2018-03-06:增加了 Julian Kahnert 的链接
|
||||
- 更新 2018-05-06:增加了作者在 2018 Linuxtage Graz 大会上 45 分钟演讲的视频
|
||||
- 更新 2018-06-05:关于 metadata 的邮件回复
|
||||
- 更新 2018-07-22:移动文件夹结构的解释到一篇它自己的文章中
|
||||
- 更新 2019-07-09:关于在文件名中避免使用系谱和字符的邮件回复
|
||||
|
||||
每当度假或去哪游玩时我就会化身为一个富有激情的摄影师。所以,过去的几年中我积累了许多的 [JPEG][1] 文件。这篇文章中我会介绍我是如何避免 [供应商锁定][2](LCTT 译注:<ruby>供应商锁定<rt>vendor lock-in</rt></ruby>,原为经济学术语,这里引申为避免过于依赖某一服务平台)造成受限于那些临时性的解决方案及数据丢失。相反,我更倾向于使用那些可以让我**投入时间和精力打理,并能长久使用**的解决方案。
|
||||
|
||||
这一(相当长的)攻略 **并不仅仅适用于图像文件**:我将进一步阐述像是文件夹结构、文件的命名规则等等许多领域的事情。因此,这些规范适用于我所能接触到的所有类型的文件。
|
||||
|
||||
在我开始传授我的方法之前,我们应该先就我将要介绍方法的达成一个共识,那就是我们是否有相同的需求。如果你对 [raw 图像格式][3]十分推崇,将照片存储在云端或其他你信赖的地方(对我而言可能不会),那么你可能不会认同这篇文章将要描述的方式了。请根据你的情况来灵活做出选择。
|
||||
|
||||
### 我的需求
|
||||
|
||||
对于 **将照片(或视频)从我的数码相机中导出到电脑里**,我只需要将 SD 卡插到我的电脑里并调用 `fetch-workflow` 软件。这一步也完成了**图像软件的预处理**以适用于我的文件命名规范(下文会具体论述),同时也可以将图片旋转至正常的方向(而不是横着)。
|
||||
|
||||
这些文件将会被存入到我的摄影收藏文件夹 `$HOME/tmp/digicam/`。在这一文件夹中我希望能**遍历我的图像和视频文件**,以便于**整理/删除、重命名、添加/移除标签,以及将一系列相关的文件移动到相应的文件夹中**。
|
||||
|
||||
在完成这些以后,我将会**浏览包含图像/电影文件集的文件夹**。在极少数情况下,我希望**在独立的图像处理工具**(比如 [GIMP][4])中打开一个图像文件。如果仅是为了**旋转 JPEG 文件**,我想找到一个快速的方法,不需要图像处理工具,并且是[以无损的方式][5]旋转 JPEG 图像。
|
||||
|
||||
我的数码相机支持用 [GPS][6] 坐标标记图像。因此,我需要一个方法来**对单个文件或一组文件可视化 GPS 坐标**来显示我走过的路径。
|
||||
|
||||
我想拥有的另一个好功能是:假设你在威尼斯度假时拍了几百张照片。每一个都很漂亮,所以你每张都舍不得删除。另一方面,你可能想把一组更少的照片送给家里的朋友。而且,在他们嫉妒的爆炸之前,他们可能只希望看到 20 多张照片。因此,我希望能够**定义并显示一组特定的照片子集**。
|
||||
|
||||
就独立性和**避免锁定效应**而言,我不想使用那种一旦公司停止产品或服务就无法使用的工具。出于同样的原因,由于我是一个注重隐私的人,**我不想使用任何基于云的服务**。为了让自己对新的可能性保持开放的心态,我不希望只在一个特定的操作系统平台才可行的方案上倾注全部的精力。**基本的东西必须在任何平台上可用**(查看、导航、……),而**全套需求必须可以在 GNU/Linux 上运行**,对我而言,我选择 Debian GNU/Linux。
|
||||
|
||||
在我传授当前针对上述大量需求的解决方案之前,我必须解释一下我的一般文件夹结构和文件命名约定,我也使用它来命名数码照片。但首先,你必须认清一个重要的事实:
|
||||
|
||||
#### iPhoto、Picasa,诸如此类应被认为是有害的
|
||||
|
||||
管理照片集的软件工具确实提供了相当酷的功能。它们提供了一个良好的用户界面,并试图为你提供满足各种需求的舒适的工作流程。
|
||||
|
||||
对它们我确实遇到了很多大问题。它们几乎对所有东西都使用专有的存储格式:图像文件、元数据等等。当你打算在几年内换一个不同的软件,这是一个大问题。相信我:总有一天你会因为多种原因而**更换软件**。
|
||||
|
||||
如果你现在正打算更换相应的工具,你会意识到 iPhoto 或 Picasa 是分别存储原始图像文件和你对它们所做的所有操作的(旋转图像、向图像文件添加描述/标签、裁剪等等)。如果你不能导出并重新导入到新工具,那么**所有的东西都将永远丢失**。而无损的进行转换和迁移几乎是不可能的。
|
||||
|
||||
我不想在一个会锁住我工作的工具上投入任何精力。**我也拒绝把自己绑定在任何专有工具上**。我是一个过来人,希望你们吸取我的经验。
|
||||
|
||||
这就是我在文件名中保留时间戳、图像描述或标记的原因。文件名是永久性的,除非我手动更改它们。当我把照片备份或复制到 U 盘或其他操作系统时,它们不会丢失。每个人都能读懂。任何未来的系统都能够处理它们。
|
||||
|
||||
### 我的文件命名规范
|
||||
|
||||
这里有一个我在 [2018 Linuxtage Graz 大会][44]上做的[演讲][45],其中详细阐述了我的在本文中提到的想法和工作流程。
|
||||
|
||||
- [Grazer Linuxtage 2018 - The Advantages of File Name Conventions and Tagging](https://youtu.be/rckSVmYCH90)
|
||||
- [备份视频托管在 media.CCC.de](https://media.ccc.de/v/GLT18_-_321_-_en_-_g_ap147_004_-_201804281550_-_the_advantages_of_file_name_conventions_and_tagging_-_karl_voit)
|
||||
|
||||
我所有的文件都与一个特定的日期或时间有关,根据所采用的 [ISO 8601][7] 规范,我采用的是**日期戳**或**时间戳**
|
||||
|
||||
带有日期戳和两个标签的示例文件名:`2014-05-09 Budget export for project 42 -- finance company.csv`。
|
||||
|
||||
带有时间戳(甚至包括可选秒)和两个标签的示例文件名:`2014-05-09T22.19.58 Susan presenting her new shoes -- family clothing.jpg`。
|
||||
|
||||
由于我使用的 ISO 时间戳冒号不适用于 Windows [NTFS 文件系统][8],因此,我用点代替冒号,以便将小时与分钟(以及可选的秒)区别开来。
|
||||
|
||||
如果是**持续的一段日期或时间**,我会将两个日期戳或时间戳用两个减号分开:`2014-05-09--2014-05-13 Jazz festival Graz -- folder tourism music.pdf`。
|
||||
|
||||
文件名中的时间/日期戳的优点是,除非我手动更改它们,否则它们保持不变。当通过某些不处理这些元数据的软件进行处理时,包含在文件内容本身中的元数据(如 [Exif][9])往往会丢失。此外,使用这样的日期/时间戳开始的文件名可以确保文件按时间顺序显示,而不是按字母顺序显示。字母表是一种[完全人工的排序顺序][10],对于用户定位文件通常不太实用。
|
||||
|
||||
当我想将**标签**关联到文件名时,我将它们放在原始文件名和[文件名扩展名][11]之间,中间用空格、两个减号和两端额外的空格分隔 ` -- `。我的标签是小写的英文单词,不包含空格或特殊字符。有时,我可能会使用 `quantifiedself` 或 `usergenerated` 这样的连接词。我[倾向于选择一般类别][12],而不是太过具体的描述标签。我在 Twitter [hashtags][13]、文件名、文件夹名、书签、诸如此类的博文等诸如此类地地方重用这些标签。
|
||||
|
||||
标签作为文件名的一部分有几个优点。通过使用常用的桌面搜索引擎,你可以在标签的帮助下定位文件。文件名称中的标签不会因为复制到不同的存储介质上而丢失。当系统使用与文件名之外的存储位置(如:元数据数据库、[点文件][14]、[备用数据流][15]等)存储元信息通常会发生丢失。
|
||||
|
||||
当然,通常在文件和文件夹名称中,**请避免使用特殊字符**、变音符、冒号等。尤其是在不同操作系统平台之间同步文件时。
|
||||
|
||||
我的**文件夹名命名约定**与文件的相应规范相同。
|
||||
|
||||
注意:由于 [Memacs][17] 的 [filenametimestamp][16] 模块的聪明之处,所有带有日期/时间戳的文件和文件夹都出现在我的 Org 模式的日历(日程)上的同一天/同一时间。这样,我就能很好地了解当天发生了什么,包括我拍的所有照片。
|
||||
|
||||
### 我的一般文件夹结构
|
||||
|
||||
在本节中,我将描述我的主文件夹中最重要的文件夹。注意:这可能在将来的被移动到一个独立的页面。或许不是。让我们等着瞧 :-) (LCTT 译注:后来这一节已被作者扩展并移动到另外一篇[文章](https://karl-voit.at/folder-hierarchy/)。)
|
||||
|
||||
很多东西只有在一定的时间内才会引起人们的兴趣。这些内容包括快速浏览其内容的下载、解压缩文件以检查包含的文件、一些有趣的小内容等等。对于**临时的东西**,我有 `$HOME/tmp/` 子层次结构。新照片放在 `$HOME/tmp/digicam/` 中。我从 CD、DVD 或 USB 记忆棒临时复制的东西放在 `$HOME/tmp/fromcd/` 中。每当软件工具需要用户文件夹层次结构中的临时数据时,我就使用 `$HOME/tmp/Tools/`作为起点。我经常使用的文件夹是 `$HOME/tmp/2del/`:`2del` 的意思是“随时可以删除”。例如,我所有的浏览器都使用这个文件夹作为默认的下载文件夹。如果我需要在机器上腾出空间,我首先查看这个 `2del` 文件夹,用于删除内容。
|
||||
|
||||
与上面描述的临时文件相比,我当然也想将文件**保存更长的时间**。这些文件被移动到我的 `$HOME/archive/` 子层次结构中。它有几个子文件夹用于备份、我想保留的 web 下载类、我要存档的二进制文件、可移动媒体(CD、DVD、记忆棒、外部硬盘驱动器)的索引文件,和一个稍后(寻找一个合适的的目标文件夹)存档的文件夹。有时,我太忙或没有耐心的时候将文件妥善整理。是的,那就是我,我甚至有一个名为“现在不要烦我”的文件夹。这对你而言是否很怪?:-)
|
||||
|
||||
我的归档中最重要的子层次结构是 `$HOME/archive/events_memories/` 及其子文件夹 `2014/`、`2013/`、`2012/` 等等。正如你可能已经猜到的,每个年份有一个**子文件夹**。其中每个文件中都有单个文件和文件夹。这些文件是根据我在前一节中描述的文件名约定命名的。文件夹名称以 [ISO 8601][7] 日期标签 “YYYY-MM-DD” 开头,后面跟着一个具有描述性的名称,如 `$HOME/archive/events_memories/2014/2014-05-08 Business marathon with/`。在这些与日期相关的文件夹中,我保存着各种与特定事件相关的文件:照片、(扫描的)pdf 文件、文本文件等等。
|
||||
|
||||
对于**共享数据**,我设置一个 `$HOME/share/` 子层次结构。这是我的 Dropbox 文件夹,我用各种各样的方法(比如 [unison][18])来分享数据。我也在我的设备之间共享数据:家里的 Mac Mini、家里的 GNU/Linux 笔记本、Android 手机,root-server(我的个人云),工作用的 Windows 笔记本。我不想在这里详细说明我的同步设置。如果你想了解相关的设置,可以参考另一篇相关的文章。:-)
|
||||
|
||||
在我的 `$HOME/templates_tags/` 子层次结构中,我保存了各种**模板文件**([LaTeX][19]、脚本、…),插图和**徽标**,等等。
|
||||
|
||||
我的 **Org 模式** 文件,主要是保存在 `$HOME/org/`。我练习记忆力,不会解释我有多喜欢 [Emacs/Org 模式][20] 以及我从中获益多少。你可能读过或听过我详细描述我用它做的很棒的事情。具体可以在我的博客上查找 [我的 Emacs 标签][21],在 Twitter 上查找 [hashtag #orgmode][22]。
|
||||
|
||||
以上就是我最重要的文件夹子层次结构设置方式。
|
||||
|
||||
### 我的工作流程
|
||||
|
||||
哒哒哒,在你了解了我的文件夹结构和文件名约定之后,下面是我当前的工作流程和工具,我使用它们来满足我前面描述的需求。
|
||||
|
||||
请注意,**你必须知道你在做什么**。我这里的示例及文件夹路径和更多**只适用我的机器或我的环境**。**你必须采用相应的**路径、文件名等来满足你的需求!
|
||||
|
||||
#### 工作流程:将文件从 SD 卡移动到笔记本电脑、旋转人像图像,并重命名文件
|
||||
|
||||
当我想把数据从我的数码相机移到我的 GNU/Linux 笔记本上时,我拿出它的 mini SD 存储卡,把它放在我的笔记本上。然后它会自动挂载在 `/media/digicam` 上。
|
||||
|
||||
然后,调用 [getdigicamdata][23]。它做了如下几件事:它将文件从 SD 卡移动到一个临时文件夹中进行处理。原始文件名会转换为小写字符。所有的人像照片会使用 [jhead][24] 旋转。同样使用 jhead,我从 Exif 头的时间戳中生成文件名称中的时间戳。使用 [date2name][25],我也将时间戳添加到电影文件中。处理完所有这些文件后,它们将被移动到新的数码相机文件的目标文件夹: `$HOME/tmp/digicam/tmp/`。
|
||||
|
||||
#### 工作流程:文件夹索引、查看、重命名、删除图像文件
|
||||
|
||||
为了快速浏览我的图像和电影文件,我喜欢使用 GNU/Linux 上的 [geeqie][26]。这是一个相当轻量级的图像浏览器,它具有其他文件浏览器所缺少的一大优势:我可以添加通过键盘快捷方式调用的外部脚本/工具。通过这种方式,我可以通过任意外部命令扩展这个图像浏览器的特性。
|
||||
|
||||
基本的图像管理功能是内置在 geeqie:浏览我的文件夹层次结构、以窗口模式或全屏查看图像(快捷键 `f`)、重命名文件名、删除文件、显示 Exif 元数据(快捷键 `Ctrl-e`)。
|
||||
|
||||
在 OS X 上,我使用 [Xee][27]。与 geeqie 不同,它不能通过外部命令进行扩展。不过,基本的浏览、查看和重命名功能也是可用的。
|
||||
|
||||
#### 工作流程:添加和删除标签
|
||||
|
||||
我创建了一个名为 [filetags][28] 的 Python 脚本,用于向单个文件以及一组文件添加和删除标记。
|
||||
|
||||
对于数码照片,我使用标签,例如,`specialL` 用于我认为适合桌面背景的风景图片,`specialP` 用于我想展示给其他人的人像照片,`sel` 用于筛选,等等。
|
||||
|
||||
##### 使用 geeqie 初始设置 filetags
|
||||
|
||||
向 geeqie 添加 `filetags` 是一个手动步骤:“Edit > Preferences > Configure Editors ...”,然后创建一个附加条目 `New`。在这里,你可以定义一个新的桌面文件,如下所示:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=filetags
|
||||
GenericName=filetags
|
||||
Comment=
|
||||
Exec=/home/vk/src/misc/vk-filetags-interactive-adding-wrapper-with-gnome-terminal.sh %F
|
||||
Icon=
|
||||
Terminal=true
|
||||
Type=Application
|
||||
Categories=Application;Graphics;
|
||||
hidden=false
|
||||
MimeType=image/*;video/*;image/mpo;image/thm
|
||||
Categories=X-Geeqie;
|
||||
```
|
||||
|
||||
*add-tags.desktop*
|
||||
|
||||
封装脚本 `vk-filetags-interactive-adding-wrapper-with-gnome-terminal.sh` 是必须的,因为我想要弹出一个新的终端,以便添加标签到我的文件:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
/usr/bin/gnome-terminal \
|
||||
--geometry=85x15+330+5 \
|
||||
--tab-with-profile=big \
|
||||
--hide-menubar \
|
||||
-x /home/vk/src/filetags/filetags.py --interactive "${@}"
|
||||
|
||||
#end
|
||||
```
|
||||
|
||||
*vk-filetags-interactive-adding-wrapper-with-gnome-terminal.sh*
|
||||
|
||||
在 geeqie 中,你可以在 “Edit > Preferences > Preferences ... > Keyboard”。我将 `t` 与 `filetags` 命令相关联。
|
||||
|
||||
这个 `filetags` 脚本还能够从单个文件或一组文件中删除标记。它基本上使用与上面相同的方法。唯一的区别是 `filetags` 脚本额外的 `--remove` 参数:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=filetags-remove
|
||||
GenericName=filetags-remove
|
||||
Comment=
|
||||
Exec=/home/vk/src/misc/vk-filetags-interactive-removing-wrapper-with-gnome-terminal.sh %F
|
||||
Icon=
|
||||
Terminal=true
|
||||
Type=Application
|
||||
Categories=Application;Graphics;
|
||||
hidden=false
|
||||
MimeType=image/*;video/*;image/mpo;image/thm
|
||||
Categories=X-Geeqie;
|
||||
```
|
||||
|
||||
*remove-tags.desktop*
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
/usr/bin/gnome-terminal \
|
||||
--geometry=85x15+330+5 \
|
||||
--tab-with-profile=big \
|
||||
--hide-menubar \
|
||||
-x /home/vk/src/filetags/filetags.py --interactive --remove "${@}"
|
||||
|
||||
#end
|
||||
```
|
||||
|
||||
*vk-filetags-interactive-removing-wrapper-with-gnome-terminal.sh*
|
||||
|
||||
为了删除标签,我创建了一个键盘快捷方式 `T`。
|
||||
|
||||
##### 在 geeqie 中使用 filetags
|
||||
|
||||
当我在 geeqie 文件浏览器中浏览图像文件时,我选择要标记的文件(一到多个)并按 `t`。然后,一个小窗口弹出,要求我提供一个或多个标签。用回车确认后,这些标签被添加到文件名中。
|
||||
|
||||
删除标签也是一样:选择多个文件,按下 `T`,输入要删除的标签,然后按回车确认。就是这样。几乎没有[给文件添加或删除标签的更简单的方法了][29]。
|
||||
|
||||
#### 工作流程:改进的使用 appendfilename 重命名文件
|
||||
|
||||
##### 不使用 appendfilename
|
||||
|
||||
重命名一组大型文件可能是一个冗长乏味的过程。对于 `2014-04-20T17.09.11_p1100386.jpg` 这样的原始文件名,在文件名中添加描述的过程相当烦人。你将按 `Ctrl-r` (重命名)在 geeqie 中打开文件重命名对话框。默认情况下,原始名称(没有文件扩展名的文件名称)被标记。因此,如果不希望删除/覆盖文件名(但要追加),则必须按下光标键 `→`。然后,光标放在基本名称和扩展名之间。输入你的描述(不要忘记以空格字符开始),并用回车进行确认。
|
||||
|
||||
##### 在 geeqie 使中用 appendfilename
|
||||
|
||||
使用 [appendfilename][30],我的过程得到了简化,可以获得将文本附加到文件名的最佳用户体验:当我在 geeqie 中按下 `a`(附加)时,会弹出一个对话框窗口,询问文本。在回车确认后,输入的文本将放置在时间戳和可选标记之间。
|
||||
|
||||
例如,当我在 `2014-04-20T17.09.11_p1100386.jpg` 上按下 `a`,然后键入`Pick-nick in Graz` 时,文件名变为 `2014-04-20T17.09.11_p1100386 Pick-nick in Graz.jpg`。当我再次按下 `a` 并输入 `with Susan` 时,文件名变为 `2014-04-20T17.09.11_p1100386 Pick-nick in Graz with Susan.jpg`。当文件名添加标记时,附加的文本前将附加标记分隔符。
|
||||
|
||||
这样,我就不必担心覆盖时间戳或标记。重命名的过程对我来说变得更加有趣!
|
||||
|
||||
最好的部分是:当我想要将相同的文本添加到多个选定的文件中时,也可以使用 `appendfilename`。
|
||||
|
||||
##### 在 geeqie 中初始设置 appendfilename
|
||||
|
||||
添加一个额外的编辑器到 geeqie: “Edit > Preferences > Configure Editors ... > New”。然后输入桌面文件定义:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=appendfilename
|
||||
GenericName=appendfilename
|
||||
Comment=
|
||||
Exec=/home/vk/src/misc/vk-appendfilename-interactive-wrapper-with-gnome-terminal.sh %F
|
||||
Icon=
|
||||
Terminal=true
|
||||
Type=Application
|
||||
Categories=Application;Graphics;
|
||||
hidden=false
|
||||
MimeType=image/*;video/*;image/mpo;image/thm
|
||||
Categories=X-Geeqie;
|
||||
```
|
||||
|
||||
*appendfilename.desktop*
|
||||
|
||||
同样,我也使用了一个封装脚本,它将为我打开一个新的终端:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
/usr/bin/gnome-terminal \
|
||||
--geometry=90x5+330+5 \
|
||||
--tab-with-profile=big \
|
||||
--hide-menubar \
|
||||
-x /home/vk/src/appendfilename/appendfilename.py "${@}"
|
||||
|
||||
#end
|
||||
```
|
||||
|
||||
*vk-appendfilename-interactive-wrapper-with-gnome-terminal.sh*
|
||||
|
||||
#### 工作流程:播放电影文件
|
||||
|
||||
在 GNU/Linux 上,我使用 [mplayer][31] 回放视频文件。由于 geeqie 本身不播放电影文件,所以我必须创建一个设置,以便在 mplayer 中打开电影文件。
|
||||
|
||||
##### 在 geeqie 中初始设置 mplayer
|
||||
|
||||
我已经使用 [xdg-open][32] 将电影文件扩展名关联到 mplayer。因此,我只需要为 geeqie 创建一个通用的“open”命令,让它使用 `xdg-open` 打开任何文件及其关联的应用程序。
|
||||
|
||||
在 geeqie 中,再次访问 “Edit > Preferences > Configure Editors ...” 添加“open”的条目:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=open
|
||||
GenericName=open
|
||||
Comment=
|
||||
Exec=/usr/bin/xdg-open %F
|
||||
Icon=
|
||||
Terminal=true
|
||||
Type=Application
|
||||
hidden=false
|
||||
NOMimeType=*;
|
||||
MimeType=image/*;video/*
|
||||
Categories=X-Geeqie;
|
||||
```
|
||||
|
||||
*open.desktop*
|
||||
|
||||
当你也将快捷方式 `o` (见上文)与 geeqie 关联时,你就能够打开与其关联的应用程序的视频文件(和其他文件)。
|
||||
|
||||
##### 使用 xdg-open 打开电影文件(和其他文件)
|
||||
|
||||
在上面的设置过程之后,当你的 geeqie 光标位于文件上方时,你只需按下 `o` 即可。就是如此简洁。
|
||||
|
||||
#### 工作流程:在外部图像编辑器中打开
|
||||
|
||||
我不太希望能够在 GIMP 中快速编辑图像文件。因此,我添加了一个快捷方式 `g`,并将其与外部编辑器 “"GNU Image Manipulation Program" (GIMP)” 关联起来,geeqie 已经默认创建了该外部编辑器。
|
||||
|
||||
这样,只需按下 `g` 就可以在 GIMP 中打开当前图像。
|
||||
|
||||
#### 工作流程:移动到存档文件夹
|
||||
|
||||
现在我已经在我的文件名中添加了注释,我想将单个文件移动到 `$HOME/archive/events_memories/2014/`,或者将一组文件移动到这个文件夹中的新文件夹中,如 `$HOME/archive/events_memories/2014/2014-05-08 business marathon after show - party`。
|
||||
|
||||
通常的方法是选择一个或多个文件,并用快捷方式 `Ctrl-m` 将它们移动到文件夹中。
|
||||
|
||||
何等繁复无趣之至!
|
||||
|
||||
因此,我(再次)编写了一个 Python 脚本,它为我完成了这项工作:[move2archive][33](简写为:` m2a `),需要一个或多个文件作为命令行参数。然后,出现一个对话框,我可以在其中输入一个可选文件夹名。当我不输入任何东西而是按回车,文件被移动到相应年份的文件夹。当我输入一个类似 `Business-Marathon After-Show-Party` 的文件夹名称时,第一个图像文件的日期戳被附加到该文件夹(`$HOME/archive/events_memories/2014/2014-05-08 Business-Marathon After-Show-Party`),然后创建该文件夹,并移动文件。
|
||||
|
||||
再一次,我在 geeqie 中选择一个或多个文件,按 `m`(移动),或者只按回车(没有特殊的子文件夹),或者输入一个描述性文本,这是要创建的子文件夹的名称(可选不带日期戳)。
|
||||
|
||||
**没有一个图像管理工具像我的带有 appendfilename 和 move2archive 的 geeqie 一样可以通过快捷键快速且有趣的完成工作。**
|
||||
|
||||
##### 在 geeqie 里初始化 m2a 的相关设置
|
||||
|
||||
同样,向 geeqie 添加 `m2a` 是一个手动步骤:“Edit > Preferences > Configure Editors ...”,然后创建一个附加条目“New”。在这里,你可以定义一个新的桌面文件,如下所示:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=move2archive
|
||||
GenericName=move2archive
|
||||
Comment=Moving one or more files to my archive folder
|
||||
Exec=/home/vk/src/misc/vk-m2a-interactive-wrapper-with-gnome-terminal.sh %F
|
||||
Icon=
|
||||
Terminal=true
|
||||
Type=Application
|
||||
Categories=Application;Graphics;
|
||||
hidden=false
|
||||
MimeType=image/*;video/*;image/mpo;image/thm
|
||||
Categories=X-Geeqie;
|
||||
```
|
||||
|
||||
*m2a.desktop*
|
||||
|
||||
封装脚本 `vk-m2a-interactive-wrapper-with-gnome-terminal.sh` 是必要的,因为我想要弹出一个新的终端窗口,以便我的文件进入我指定的目标文件夹:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
/usr/bin/gnome-terminal \
|
||||
--geometry=157x56+330+5 \
|
||||
--tab-with-profile=big \
|
||||
--hide-menubar \
|
||||
-x /home/vk/src/m2a/m2a.py --pauseonexit "${@}"
|
||||
|
||||
#end
|
||||
```
|
||||
|
||||
*vk-m2a-interactive-wrapper-with-gnome-terminal.sh*
|
||||
|
||||
在 geeqie 中,你可以在 “Edit > Preferences > Preferences ... > Keyboard” 将 `m` 与 `m2a` 命令相关联。
|
||||
|
||||
#### 工作流程:旋转图像(无损)
|
||||
|
||||
通常,我的数码相机会自动将人像照片标记为人像照片。然而,在某些特定的情况下(比如从装饰图案上方拍照),我的相机会出错。在那些**罕见的情况下**,我必须手动修正方向。
|
||||
|
||||
你必须知道,JPEG 文件格式是一种有损格式,应该只用于照片,而不是计算机生成的东西,如屏幕截图或图表。以傻瓜方式旋转 JPEG 图像文件通常会解压/可视化图像文件、旋转生成新的图像,然后重新编码结果。这将导致生成的图像[比原始图像质量差得多][5]。
|
||||
|
||||
因此,你应该使用无损方法来旋转 JPEG 图像文件。
|
||||
|
||||
再一次,我添加了一个“外部编辑器”到 geeqie:“Edit > Preferences > Configure Editors ... > New”。在这里,我添加了两个条目:使用 [exiftran][34],一个用于旋转 270 度(即逆时针旋转 90 度),另一个用于旋转 90 度(顺时针旋转 90 度):
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=Losslessly rotate JPEG image counterclockwise
|
||||
|
||||
# call the helper script
|
||||
TryExec=exiftran
|
||||
Exec=exiftran -p -2 -i -g %f
|
||||
|
||||
# Desktop files that are usable only in Geeqie should be marked like this:
|
||||
Categories=X-Geeqie;
|
||||
OnlyShowIn=X-Geeqie;
|
||||
|
||||
# Show in menu "Edit/Orientation"
|
||||
X-Geeqie-Menu-Path=EditMenu/OrientationMenu
|
||||
|
||||
MimeType=image/jpeg;
|
||||
```
|
||||
|
||||
*rotate-270.desktop*
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=Losslessly rotate JPEG image clockwise
|
||||
|
||||
# call the helper script
|
||||
TryExec=exiftran
|
||||
Exec=exiftran -p -9 -i -g %f
|
||||
|
||||
# Desktop files that are usable only in Geeqie should be marked like this:
|
||||
Categories=X-Geeqie;
|
||||
OnlyShowIn=X-Geeqie;
|
||||
|
||||
# Show in menu "Edit/Orientation"
|
||||
X-Geeqie-Menu-Path=EditMenu/OrientationMenu
|
||||
|
||||
# It can be made verbose
|
||||
# X-Geeqie-Verbose=true
|
||||
|
||||
MimeType=image/jpeg;
|
||||
```
|
||||
|
||||
*rotate-90.desktop*
|
||||
|
||||
我创建了 geeqie 快捷键 `[`(逆时针方向)和 `]`(顺时针方向)。
|
||||
|
||||
#### 工作流程:可视化 GPS 坐标
|
||||
|
||||
我的数码相机有一个 GPS 传感器,它在 JPEG 文件的 Exif 元数据中存储当前的地理位置。位置数据以 [WGS 84][35] 格式存储,如 `47, 58, 26.73; 16, 23, 55.51`(纬度;经度)。这一方式可读性较差,我期望:要么是地图,要么是位置名称。因此,我向 geeqie 添加了一些功能,这样我就可以在 [OpenStreetMap][36] 上看到单个图像文件的位置: `Edit > Preferences > Configure Editors ... > New`。
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=vkphotolocation
|
||||
GenericName=vkphotolocation
|
||||
Comment=
|
||||
Exec=/home/vk/src/misc/vkphotolocation.sh %F
|
||||
Icon=
|
||||
Terminal=true
|
||||
Type=Application
|
||||
Categories=Application;Graphics;
|
||||
hidden=false
|
||||
MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/svg+xml;image/svg+xml-compressed;image/vnd.wap.wbmp;
|
||||
```
|
||||
|
||||
*photolocation.desktop*
|
||||
|
||||
这调用了我的名为 `vkphotolocation.sh` 的封装脚本,它使用 [ExifTool][37] 以 [Marble][38] 能够读取和可视化的适当格式提取该坐标:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
IMAGEFILE="${1}"
|
||||
IMAGEFILEBASENAME=`basename ${IMAGEFILE}`
|
||||
|
||||
COORDINATES=`exiftool -c %.6f "${IMAGEFILE}" | awk '/GPS Position/ { print $4 " " $6 }'`
|
||||
|
||||
if [ "x${COORDINATES}" = "x" ]; then
|
||||
zenity --info --title="${IMAGEFILEBASENAME}" --text="No GPS-location found in the image file."
|
||||
else
|
||||
/usr/bin/marble --latlon "${COORDINATES}" --distance 0.5
|
||||
fi
|
||||
|
||||
#end
|
||||
```
|
||||
|
||||
*vkphotolocation.sh*
|
||||
|
||||
映射到键盘快捷键 `G`,我可以快速地得到**单个图像文件的位置的地图定位**。
|
||||
|
||||
当我想将多个 JPEG 图像文件的**位置可视化为路径**时,我使用 [GpsPrune][39]。我无法挖掘出 GpsPrune 将一组文件作为命令行参数的方法。正因为如此,我必须手动启动 GpsPrune,用 “File > Add photos”选择一组文件或一个文件夹。
|
||||
|
||||
通过这种方式,我可以为每个 JPEG 位置在 OpenStreetMap 地图上获得一个点(如果配置为这样)。通过单击这样一个点,我可以得到相应图像的详细信息。
|
||||
|
||||
如果你恰好在国外拍摄照片,可视化 GPS 位置对**在文件名中添加描述**大有帮助!
|
||||
|
||||
#### 工作流程:根据 GPS 坐标过滤照片
|
||||
|
||||
这并非我的工作流程。为了完整起见,我列出该工作流对应工具的特性。我想做的就是从一大堆图片中寻找那些在一定区域内(范围或点 + 距离)的照片。
|
||||
|
||||
到目前为止,我只找到了 [DigiKam][40],它能够[根据矩形区域进行过滤][41]。如果你知道其他工具,请将其添加到下面的评论或给我写一封电子邮件。
|
||||
|
||||
#### 工作流程:显示给定集合的子集
|
||||
|
||||
如上面的需求所述,我希望能够对一个文件夹中的文件定义一个子集,以便将这个小集合呈现给其他人。
|
||||
|
||||
工作流程非常简单:我向选择的文件添加一个标记(通过 `t`/`filetags`)。为此,我使用标记 `sel`,它是 “selection” 的缩写。在标记了一组文件之后,我可以按下 `s`,它与一个脚本相关联,该脚本只显示标记为 `sel` 的文件。
|
||||
|
||||
当然,这也适用于任何标签或标签组合。因此,用同样的方法,你可以得到一个适当的概述,你的婚礼上的所有照片都标记着“教堂”和“戒指”。
|
||||
|
||||
很棒的功能,不是吗?:-)
|
||||
|
||||
##### 初始设置 filetags 以根据标签和 geeqie 过滤
|
||||
|
||||
你必须定义一个额外的“外部编辑器”,“ Edit > Preferences > Configure Editors ... > New”:
|
||||
|
||||
```
|
||||
[Desktop Entry]
|
||||
Name=filetag-filter
|
||||
GenericName=filetag-filter
|
||||
Comment=
|
||||
Exec=/home/vk/src/misc/vk-filetag-filter-wrapper-with-gnome-terminal.sh
|
||||
Icon=
|
||||
Terminal=true
|
||||
Type=Application
|
||||
Categories=Application;Graphics;
|
||||
hidden=false
|
||||
MimeType=image/*;video/*;image/mpo;image/thm
|
||||
Categories=X-Geeqie;
|
||||
```
|
||||
|
||||
*filter-tags.desktop*
|
||||
|
||||
再次调用我编写的封装脚本:
|
||||
|
||||
```
|
||||
#!/bin/sh
|
||||
|
||||
/usr/bin/gnome-terminal \
|
||||
--geometry=85x15+330+5 \
|
||||
--hide-menubar \
|
||||
-x /home/vk/src/filetags/filetags.py --filter
|
||||
|
||||
#end
|
||||
```
|
||||
|
||||
*vk-filetag-filter-wrapper-with-gnome-terminal.sh*
|
||||
|
||||
带有参数 `--filter` 的 `filetags` 基本上完成的是:用户被要求输入一个或多个标签。然后,当前文件夹中所有匹配的文件都使用[符号链接][42]链接到 `$HOME/.filetags_tagfilter/`。然后,启动了一个新的 geeqie 实例,显示链接的文件。
|
||||
|
||||
在退出这个新的 geeqie 实例之后,你会看到进行选择的旧的 geeqie 实例。
|
||||
|
||||
#### 用一个真实的案例来总结
|
||||
|
||||
哇哦, 这是一篇很长的博客文章。你可能已经忘了之前的概述。总结一下我在(扩展了标准功能集的) geeqie 中可以做的事情,我有一个很酷的总结:
|
||||
|
||||
快捷键 | 功能
|
||||
--- | ---
|
||||
`m` | 移到归档(m2a)
|
||||
`o` | 打开(针对非图像文件)
|
||||
`a` | 在文件名里添加字段
|
||||
`t` | 文件标签(添加)
|
||||
`T` | 文件标签(删除)
|
||||
`s` | 文件标签(排序)
|
||||
`g` | gimp
|
||||
`G` | 显示 GPS 信息
|
||||
`[` | 无损的逆时针旋转
|
||||
`]` | 无损的顺时针旋转
|
||||
`Ctrl-e` | EXIF 图像信息
|
||||
`f` | 全屏显示
|
||||
|
||||
文件名(包括它的路径)的部分及我用来操作该部分的相应工具:
|
||||
|
||||
```
|
||||
/this/is/a/folder/2014-04-20T17.09 Picknick in Graz -- food graz.jpg
|
||||
[ move2archive ] [ date2name ] [appendfilename] [ filetags ]
|
||||
```
|
||||
|
||||
在实践中,我按照以下步骤将照片从相机保存到存档:我将 SD 存储卡放入计算机的 SD 读卡器中。然后我运行 [getdigicamdata.sh][23]。完成之后,我在 geeqie 中打开 `$HOME/tmp/digicam/tmp/`。我浏览了一下照片,把那些不成功的删除了。如果有一个图像的方向错误,我用 `[` 或 `]` 纠正它。
|
||||
|
||||
在第二步中,我向我认为值得评论的文件添加描述 (`a`)。每当我想添加标签时,我也这样做:我快速地标记所有应该共享相同标签的文件(`Ctrl + 鼠标点击`),并使用 [filetags][28](`t`)进行标记。
|
||||
|
||||
要合并来自给定事件的文件,我选中相应的文件,将它们移动到年度归档文件夹中的 `event-folder`,并通过在 [move2archive][33](`m`)中键入事件描述,其余的(非特殊的文件夹)无需声明事件描述由 `move2archive` (`m`)直接移动到年度归档中。
|
||||
|
||||
结束我的工作流程,我删除了 SD 卡上的所有文件,把它从操作系统上弹出,然后把它放回我的数码相机里。
|
||||
|
||||
以上。
|
||||
|
||||
因为这种工作流程几乎不需要任何开销,所以评论、标记和归档照片不再是一项乏味的工作。
|
||||
|
||||
### 最后
|
||||
|
||||
所以,这是一个详细描述我关于照片和电影的工作流程的叙述。你可能已经发现了我可能感兴趣的其他东西。所以请不要犹豫,请使用下面的链接留下评论或电子邮件。
|
||||
|
||||
我也希望得到反馈,如果我的工作流程适用于你。并且,如果你已经发布了你的工作流程或者找到了其他人工作流程的描述,也请留下评论!
|
||||
|
||||
及时行乐,莫让错误的工具或低效的方法浪费了我们的人生!
|
||||
|
||||
### 其他工具
|
||||
|
||||
阅读关于[本文中关于 gThumb 的部分][43]。
|
||||
|
||||
当你觉得你以上文中所叙述的符合你的需求时,请根据相关的建议来选择对应的工具。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://karl-voit.at/managing-digital-photographs/
|
||||
|
||||
作者:[Karl Voit][a]
|
||||
译者:[qfzy1233](https://github.com/qfzy1233)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://karl-voit.at
|
||||
[1]:https://en.wikipedia.org/wiki/Jpeg
|
||||
[2]:http://en.wikipedia.org/wiki/Vendor_lock-in
|
||||
[3]:https://en.wikipedia.org/wiki/Raw_image_format
|
||||
[4]:http://www.gimp.org/
|
||||
[5]:http://petapixel.com/2012/08/14/why-you-should-always-rotate-original-jpeg-photos-losslessly/
|
||||
[6]:https://en.wikipedia.org/wiki/Gps
|
||||
[7]:https://en.wikipedia.org/wiki/Iso_date
|
||||
[8]:https://en.wikipedia.org/wiki/Ntfs
|
||||
[9]:https://en.wikipedia.org/wiki/Exif
|
||||
[10]:http://www.isisinform.com/reinventing-knowledge-the-medieval-controversy-of-alphabetical-order/
|
||||
[11]:https://en.wikipedia.org/wiki/File_name_extension
|
||||
[12]:http://karl-voit.at/tagstore/en/papers.shtml
|
||||
[13]:https://en.wikipedia.org/wiki/Hashtag
|
||||
[14]:https://en.wikipedia.org/wiki/Dot-file
|
||||
[15]:https://en.wikipedia.org/wiki/NTFS#Alternate_data_streams_.28ADS.29
|
||||
[16]:https://github.com/novoid/Memacs/blob/master/docs/memacs_filenametimestamps.org
|
||||
[17]:https://github.com/novoid/Memacs
|
||||
[18]:http://www.cis.upenn.edu/~bcpierce/unison/
|
||||
[19]:https://github.com/novoid/LaTeX-KOMA-template
|
||||
[20]:http://orgmode.org/
|
||||
[21]:http://karl-voit.at/tags/emacs
|
||||
[22]:https://twitter.com/search?q%3D%2523orgmode&src%3Dtypd
|
||||
[23]:https://github.com/novoid/getdigicamdata.sh
|
||||
[24]:http://www.sentex.net/%3Ccode%3Emwandel/jhead/
|
||||
[25]:https://github.com/novoid/date2name
|
||||
[26]:http://geeqie.sourceforge.net/
|
||||
[27]:http://xee.c3.cx/
|
||||
[28]:https://github.com/novoid/filetag
|
||||
[29]:http://karl-voit.at/tagstore/
|
||||
[30]:https://github.com/novoid/appendfilename
|
||||
[31]:http://www.mplayerhq.hu
|
||||
[32]:https://wiki.archlinux.org/index.php/xdg-open
|
||||
[33]:https://github.com/novoid/move2archive
|
||||
[34]:http://manpages.ubuntu.com/manpages/raring/man1/exiftran.1.html
|
||||
[35]:https://en.wikipedia.org/wiki/WGS84#A_new_World_Geodetic_System:_WGS_84
|
||||
[36]:http://www.openstreetmap.org/
|
||||
[37]:http://www.sno.phy.queensu.ca/~phil/exiftool/
|
||||
[38]:http://userbase.kde.org/Marble/Tracking
|
||||
[39]:http://activityworkshop.net/software/gpsprune/
|
||||
[40]:https://en.wikipedia.org/wiki/DigiKam
|
||||
[41]:https://docs.kde.org/development/en/extragear-graphics/digikam/using-kapp.html#idp7659904
|
||||
[42]:https://en.wikipedia.org/wiki/Symbolic_link
|
||||
[43]:http://karl-voit.at/2017/02/19/gthumb
|
||||
[44]:https://glt18.linuxtage.at
|
||||
[45]:https://glt18-programm.linuxtage.at/events/321.html
|
444
published/201910/20180706 Building a Messenger App- OAuth.md
Normal file
444
published/201910/20180706 Building a Messenger App- OAuth.md
Normal file
@ -0,0 +1,444 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (PsiACE)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11510-1.html)
|
||||
[#]: subject: (Building a Messenger App: OAuth)
|
||||
[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-oauth/)
|
||||
[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/)
|
||||
|
||||
构建一个即时消息应用(二):OAuth
|
||||
======
|
||||
|
||||
[上一篇:模式](https://linux.cn/article-11396-1.html)。
|
||||
|
||||
在这篇帖子中,我们将会通过为应用添加社交登录功能进入后端开发。
|
||||
|
||||
社交登录的工作方式十分简单:用户点击链接,然后重定向到 GitHub 授权页面。当用户授予我们对他的个人信息的访问权限之后,就会重定向回登录页面。下一次尝试登录时,系统将不会再次请求授权,也就是说,我们的应用已经记住了这个用户。这使得整个登录流程看起来就和你用鼠标单击一样快。
|
||||
|
||||
如果进一步考虑其内部实现的话,过程就会变得复杂起来。首先,我们需要注册一个新的 [GitHub OAuth 应用][2]。
|
||||
|
||||
这一步中,比较重要的是回调 URL。我们将它设置为 `http://localhost:3000/api/oauth/github/callback`。这是因为,在开发过程中,我们总是在本地主机上工作。一旦你要将应用交付生产,请使用正确的回调 URL 注册一个新的应用。
|
||||
|
||||
注册以后,你将会收到“客户端 id”和“安全密钥”。安全起见,请不要与任何人分享他们 👀
|
||||
|
||||
顺便让我们开始写一些代码吧。现在,创建一个 `main.go` 文件:
|
||||
|
||||
```
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/gorilla/securecookie"
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/knq/jwt"
|
||||
_ "github.com/lib/pq"
|
||||
"github.com/matryer/way"
|
||||
"golang.org/x/oauth2"
|
||||
"golang.org/x/oauth2/github"
|
||||
)
|
||||
|
||||
var origin *url.URL
|
||||
var db *sql.DB
|
||||
var githubOAuthConfig *oauth2.Config
|
||||
var cookieSigner *securecookie.SecureCookie
|
||||
var jwtSigner jwt.Signer
|
||||
|
||||
func main() {
|
||||
godotenv.Load()
|
||||
|
||||
port := intEnv("PORT", 3000)
|
||||
originString := env("ORIGIN", fmt.Sprintf("http://localhost:%d/", port))
|
||||
databaseURL := env("DATABASE_URL", "postgresql://root@127.0.0.1:26257/messenger?sslmode=disable")
|
||||
githubClientID := os.Getenv("GITHUB_CLIENT_ID")
|
||||
githubClientSecret := os.Getenv("GITHUB_CLIENT_SECRET")
|
||||
hashKey := env("HASH_KEY", "secret")
|
||||
jwtKey := env("JWT_KEY", "secret")
|
||||
|
||||
var err error
|
||||
if origin, err = url.Parse(originString); err != nil || !origin.IsAbs() {
|
||||
log.Fatal("invalid origin")
|
||||
return
|
||||
}
|
||||
|
||||
if i, err := strconv.Atoi(origin.Port()); err == nil {
|
||||
port = i
|
||||
}
|
||||
|
||||
if githubClientID == "" || githubClientSecret == "" {
|
||||
log.Fatalf("remember to set both $GITHUB_CLIENT_ID and $GITHUB_CLIENT_SECRET")
|
||||
return
|
||||
}
|
||||
|
||||
if db, err = sql.Open("postgres", databaseURL); err != nil {
|
||||
log.Fatalf("could not open database connection: %v\n", err)
|
||||
return
|
||||
}
|
||||
defer db.Close()
|
||||
if err = db.Ping(); err != nil {
|
||||
log.Fatalf("could not ping to db: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
githubRedirectURL := *origin
|
||||
githubRedirectURL.Path = "/api/oauth/github/callback"
|
||||
githubOAuthConfig = &oauth2.Config{
|
||||
ClientID: githubClientID,
|
||||
ClientSecret: githubClientSecret,
|
||||
Endpoint: github.Endpoint,
|
||||
RedirectURL: githubRedirectURL.String(),
|
||||
Scopes: []string{"read:user"},
|
||||
}
|
||||
|
||||
cookieSigner = securecookie.New([]byte(hashKey), nil).MaxAge(0)
|
||||
|
||||
jwtSigner, err = jwt.HS256.New([]byte(jwtKey))
|
||||
if err != nil {
|
||||
log.Fatalf("could not create JWT signer: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
router := way.NewRouter()
|
||||
router.HandleFunc("GET", "/api/oauth/github", githubOAuthStart)
|
||||
router.HandleFunc("GET", "/api/oauth/github/callback", githubOAuthCallback)
|
||||
router.HandleFunc("GET", "/api/auth_user", guard(getAuthUser))
|
||||
|
||||
log.Printf("accepting connections on port %d\n", port)
|
||||
log.Printf("starting server at %s\n", origin.String())
|
||||
addr := fmt.Sprintf(":%d", port)
|
||||
if err = http.ListenAndServe(addr, router); err != nil {
|
||||
log.Fatalf("could not start server: %v\n", err)
|
||||
}
|
||||
}
|
||||
|
||||
func env(key, fallbackValue string) string {
|
||||
v, ok := os.LookupEnv(key)
|
||||
if !ok {
|
||||
return fallbackValue
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func intEnv(key string, fallbackValue int) int {
|
||||
v, ok := os.LookupEnv(key)
|
||||
if !ok {
|
||||
return fallbackValue
|
||||
}
|
||||
i, err := strconv.Atoi(v)
|
||||
if err != nil {
|
||||
return fallbackValue
|
||||
}
|
||||
return i
|
||||
}
|
||||
```
|
||||
|
||||
安装依赖项:
|
||||
|
||||
```
|
||||
go get -u github.com/gorilla/securecookie
|
||||
go get -u github.com/joho/godotenv
|
||||
go get -u github.com/knq/jwt
|
||||
go get -u github.com/lib/pq
|
||||
ge get -u github.com/matoous/go-nanoid
|
||||
go get -u github.com/matryer/way
|
||||
go get -u golang.org/x/oauth2
|
||||
```
|
||||
|
||||
我们将会使用 `.env` 文件来保存密钥和其他配置。请创建这个文件,并保证里面至少包含以下内容:
|
||||
|
||||
```
|
||||
GITHUB_CLIENT_ID=your_github_client_id
|
||||
GITHUB_CLIENT_SECRET=your_github_client_secret
|
||||
```
|
||||
|
||||
我们还要用到的其他环境变量有:
|
||||
|
||||
* `PORT`:服务器运行的端口,默认值是 `3000`。
|
||||
* `ORIGIN`:你的域名,默认值是 `http://localhost:3000/`。我们也可以在这里指定端口。
|
||||
* `DATABASE_URL`:Cockroach 数据库的地址。默认值是 `postgresql://root@127.0.0.1:26257/messenger?sslmode=disable`。
|
||||
* `HASH_KEY`:用于为 cookie 签名的密钥。没错,我们会使用已签名的 cookie 来确保安全。
|
||||
* `JWT_KEY`:用于签署 JSON <ruby>网络令牌<rt>Web Token</rt></ruby>的密钥。
|
||||
|
||||
因为代码中已经设定了默认值,所以你也不用把它们写到 `.env` 文件中。
|
||||
|
||||
在读取配置并连接到数据库之后,我们会创建一个 OAuth 配置。我们会使用 `ORIGIN` 信息来构建回调 URL(就和我们在 GitHub 页面上注册的一样)。我们的数据范围设置为 “read:user”。这会允许我们读取公开的用户信息,这里我们只需要他的用户名和头像就够了。然后我们会初始化 cookie 和 JWT 签名器。定义一些端点并启动服务器。
|
||||
|
||||
在实现 HTTP 处理程序之前,让我们编写一些函数来发送 HTTP 响应。
|
||||
|
||||
```
|
||||
func respond(w http.ResponseWriter, v interface{}, statusCode int) {
|
||||
b, err := json.Marshal(v)
|
||||
if err != nil {
|
||||
respondError(w, fmt.Errorf("could not marshal response: %v", err))
|
||||
return
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||
w.WriteHeader(statusCode)
|
||||
w.Write(b)
|
||||
}
|
||||
|
||||
func respondError(w http.ResponseWriter, err error) {
|
||||
log.Println(err)
|
||||
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
||||
}
|
||||
```
|
||||
|
||||
第一个函数用来发送 JSON,而第二个将错误记录到控制台并返回一个 `500 Internal Server Error` 错误信息。
|
||||
|
||||
### OAuth 开始
|
||||
|
||||
所以,用户点击写着 “Access with GitHub” 的链接。该链接指向 `/api/oauth/github`,这将会把用户重定向到 github。
|
||||
|
||||
```
|
||||
func githubOAuthStart(w http.ResponseWriter, r *http.Request) {
|
||||
state, err := gonanoid.Nanoid()
|
||||
if err != nil {
|
||||
respondError(w, fmt.Errorf("could not generte state: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
stateCookieValue, err := cookieSigner.Encode("state", state)
|
||||
if err != nil {
|
||||
respondError(w, fmt.Errorf("could not encode state cookie: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: "state",
|
||||
Value: stateCookieValue,
|
||||
Path: "/api/oauth/github",
|
||||
HttpOnly: true,
|
||||
})
|
||||
http.Redirect(w, r, githubOAuthConfig.AuthCodeURL(state), http.StatusTemporaryRedirect)
|
||||
}
|
||||
```
|
||||
|
||||
OAuth2 使用一种机制来防止 CSRF 攻击,因此它需要一个“状态”(`state`)。我们使用 `Nanoid()` 来创建一个随机字符串,并用这个字符串作为状态。我们也把它保存为一个 cookie。
|
||||
|
||||
### OAuth 回调
|
||||
|
||||
一旦用户授权我们访问他的个人信息,他将会被重定向到这个端点。这个 URL 的查询字符串上将会包含状态(`state`)和授权码(`code`): `/api/oauth/github/callback?state=&code=`。
|
||||
|
||||
```
|
||||
const jwtLifetime = time.Hour * 24 * 14
|
||||
|
||||
type GithubUser struct {
|
||||
ID int `json:"id"`
|
||||
Login string `json:"login"`
|
||||
AvatarURL *string `json:"avatar_url,omitempty"`
|
||||
}
|
||||
|
||||
type User struct {
|
||||
ID string `json:"id"`
|
||||
Username string `json:"username"`
|
||||
AvatarURL *string `json:"avatarUrl"`
|
||||
}
|
||||
|
||||
func githubOAuthCallback(w http.ResponseWriter, r *http.Request) {
|
||||
stateCookie, err := r.Cookie("state")
|
||||
if err != nil {
|
||||
http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
|
||||
return
|
||||
}
|
||||
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: "state",
|
||||
Value: "",
|
||||
MaxAge: -1,
|
||||
HttpOnly: true,
|
||||
})
|
||||
|
||||
var state string
|
||||
if err = cookieSigner.Decode("state", stateCookie.Value, &state); err != nil {
|
||||
http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
|
||||
return
|
||||
}
|
||||
|
||||
q := r.URL.Query()
|
||||
|
||||
if state != q.Get("state") {
|
||||
http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
|
||||
return
|
||||
}
|
||||
|
||||
ctx := r.Context()
|
||||
|
||||
t, err := githubOAuthConfig.Exchange(ctx, q.Get("code"))
|
||||
if err != nil {
|
||||
respondError(w, fmt.Errorf("could not fetch github token: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
client := githubOAuthConfig.Client(ctx, t)
|
||||
resp, err := client.Get("https://api.github.com/user")
|
||||
if err != nil {
|
||||
respondError(w, fmt.Errorf("could not fetch github user: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
var githubUser GithubUser
|
||||
if err = json.NewDecoder(resp.Body).Decode(&githubUser); err != nil {
|
||||
respondError(w, fmt.Errorf("could not decode github user: %v", err))
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
tx, err := db.BeginTx(ctx, nil)
|
||||
if err != nil {
|
||||
respondError(w, fmt.Errorf("could not begin tx: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
var user User
|
||||
if err = tx.QueryRowContext(ctx, `
|
||||
SELECT id, username, avatar_url FROM users WHERE github_id = $1
|
||||
`, githubUser.ID).Scan(&user.ID, &user.Username, &user.AvatarURL); err == sql.ErrNoRows {
|
||||
if err = tx.QueryRowContext(ctx, `
|
||||
INSERT INTO users (username, avatar_url, github_id) VALUES ($1, $2, $3)
|
||||
RETURNING id
|
||||
`, githubUser.Login, githubUser.AvatarURL, githubUser.ID).Scan(&user.ID); err != nil {
|
||||
respondError(w, fmt.Errorf("could not insert user: %v", err))
|
||||
return
|
||||
}
|
||||
user.Username = githubUser.Login
|
||||
user.AvatarURL = githubUser.AvatarURL
|
||||
} else if err != nil {
|
||||
respondError(w, fmt.Errorf("could not query user by github ID: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
if err = tx.Commit(); err != nil {
|
||||
respondError(w, fmt.Errorf("could not commit to finish github oauth: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
exp := time.Now().Add(jwtLifetime)
|
||||
token, err := jwtSigner.Encode(jwt.Claims{
|
||||
Subject: user.ID,
|
||||
Expiration: json.Number(strconv.FormatInt(exp.Unix(), 10)),
|
||||
})
|
||||
if err != nil {
|
||||
respondError(w, fmt.Errorf("could not create token: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
expiresAt, _ := exp.MarshalText()
|
||||
|
||||
data := make(url.Values)
|
||||
data.Set("token", string(token))
|
||||
data.Set("expires_at", string(expiresAt))
|
||||
|
||||
http.Redirect(w, r, "/callback?"+data.Encode(), http.StatusTemporaryRedirect)
|
||||
}
|
||||
```
|
||||
|
||||
首先,我们会尝试使用之前保存的状态对 cookie 进行解码。并将其与查询字符串中的状态进行比较。如果它们不匹配,我们会返回一个 `418 I'm teapot`(未知来源)错误。
|
||||
|
||||
接着,我们使用授权码生成一个令牌。这个令牌被用于创建 HTTP 客户端来向 GitHub API 发出请求。所以最终我们会向 `https://api.github.com/user` 发送一个 GET 请求。这个端点将会以 JSON 格式向我们提供当前经过身份验证的用户信息。我们将会解码这些内容,一并获取用户的 ID、登录名(用户名)和头像 URL。
|
||||
|
||||
然后我们将会尝试在数据库上找到具有该 GitHub ID 的用户。如果没有找到,就使用该数据创建一个新的。
|
||||
|
||||
之后,对于新创建的用户,我们会发出一个将用户 ID 作为主题(`Subject`)的 JSON 网络令牌,并使用该令牌重定向到前端,查询字符串中一并包含该令牌的到期日(`Expiration`)。
|
||||
|
||||
这一 Web 应用也会被用在其他帖子,但是重定向的链接会是 `/callback?token=&expires_at=`。在那里,我们将会利用 JavaScript 从 URL 中获取令牌和到期日,并通过 `Authorization` 标头中的令牌以 `Bearer token_here` 的形式对 `/api/auth_user` 进行 GET 请求,来获取已认证的身份用户并将其保存到 localStorage。
|
||||
|
||||
### Guard 中间件
|
||||
|
||||
为了获取当前已经过身份验证的用户,我们设计了 Guard 中间件。这是因为在接下来的文章中,我们会有很多需要进行身份认证的端点,而中间件将会允许我们共享这一功能。
|
||||
|
||||
```
|
||||
type ContextKey struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
var keyAuthUserID = ContextKey{"auth_user_id"}
|
||||
|
||||
func guard(handler http.HandlerFunc) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
var token string
|
||||
if a := r.Header.Get("Authorization"); strings.HasPrefix(a, "Bearer ") {
|
||||
token = a[7:]
|
||||
} else if t := r.URL.Query().Get("token"); t != "" {
|
||||
token = t
|
||||
} else {
|
||||
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
var claims jwt.Claims
|
||||
if err := jwtSigner.Decode([]byte(token), &claims); err != nil {
|
||||
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
ctx := r.Context()
|
||||
ctx = context.WithValue(ctx, keyAuthUserID, claims.Subject)
|
||||
|
||||
handler(w, r.WithContext(ctx))
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
首先,我们尝试从 `Authorization` 标头或者是 URL 查询字符串中的 `token` 字段中读取令牌。如果没有找到,我们需要返回 `401 Unauthorized`(未授权)错误。然后我们将会对令牌中的申明进行解码,并使用该主题作为当前已经过身份验证的用户 ID。
|
||||
|
||||
现在,我们可以用这一中间件来封装任何需要授权的 `http.handlerFunc`,并且在处理函数的上下文中保有已经过身份验证的用户 ID。
|
||||
|
||||
```
|
||||
var guarded = guard(func(w http.ResponseWriter, r *http.Request) {
|
||||
authUserID := r.Context().Value(keyAuthUserID).(string)
|
||||
})
|
||||
```
|
||||
|
||||
### 获取认证用户
|
||||
|
||||
```
|
||||
func getAuthUser(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
authUserID := ctx.Value(keyAuthUserID).(string)
|
||||
|
||||
var user User
|
||||
if err := db.QueryRowContext(ctx, `
|
||||
SELECT username, avatar_url FROM users WHERE id = $1
|
||||
`, authUserID).Scan(&user.Username, &user.AvatarURL); err == sql.ErrNoRows {
|
||||
http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
|
||||
return
|
||||
} else if err != nil {
|
||||
respondError(w, fmt.Errorf("could not query auth user: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
user.ID = authUserID
|
||||
|
||||
respond(w, user, http.StatusOK)
|
||||
}
|
||||
```
|
||||
|
||||
我们使用 Guard 中间件来获取当前经过身份认证的用户 ID 并查询数据库。
|
||||
|
||||
这一部分涵盖了后端的 OAuth 流程。在下一篇帖子中,我们将会看到如何开始与其他用户的对话。
|
||||
|
||||
- [源代码][3]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://nicolasparada.netlify.com/posts/go-messenger-oauth/
|
||||
|
||||
作者:[Nicolás Parada][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[PsiACE](https://github.com/PsiACE)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://nicolasparada.netlify.com/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/
|
||||
[2]: https://github.com/settings/applications/new
|
||||
[3]: https://github.com/nicolasparada/go-messenger-demo
|
277
published/201910/20180906 What a shell dotfile can do for you.md
Normal file
277
published/201910/20180906 What a shell dotfile can do for you.md
Normal file
@ -0,0 +1,277 @@
|
||||
Shell 点文件可以为你做点什么
|
||||
======
|
||||
|
||||
> 了解如何使用配置文件来改善你的工作环境。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201910/03/123528x3skwqwb8sz8qo8s.jpg)
|
||||
|
||||
不要问你可以为你的 shell <ruby>点文件<rt>dotfile</rt></ruby>做什么,而是要问一个 shell 点文件可以为你做什么!
|
||||
|
||||
我一直在操作系统领域里面打转,但是在过去的几年中,我的日常使用的一直是 Mac。很长一段时间,我都在使用 Bash,但是当几个朋友开始把 [zsh][1] 当成宗教信仰时,我也试试了它。我没用太长时间就喜欢上了它,几年后,我越发喜欢它做的许多小事情。
|
||||
|
||||
我一直在使用 zsh(通过 [Homebrew][2] 提供,而不是由操作系统安装的)和 [Oh My Zsh 增强功能][3]。
|
||||
|
||||
本文中的示例是我的个人 `.zshrc`。大多数都可以直接用在 Bash 中,我觉得不是每个人都依赖于 Oh My Zsh,但是如果不用的话你的工作量可能会有所不同。曾经有一段时间,我同时为 zsh 和 Bash 维护一个 shell 点文件,但是最终我还是放弃了我的 `.bashrc`。
|
||||
|
||||
### 不偏执不行
|
||||
|
||||
如果你希望在各个操作系统上使用相同的点文件,则需要让你的点文件聪明点。
|
||||
|
||||
```
|
||||
### Mac 专用
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# Mac 专用内容在此
|
||||
```
|
||||
|
||||
例如,我希望 `Alt + 箭头键` 将光标按单词移动而不是单个空格。为了在 [iTerm2][4](我的首选终端)中实现这一目标,我将此代码段添加到了 `.zshrc` 的 Mac 专用部分:
|
||||
|
||||
```
|
||||
### Mac 专用
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
### Mac 用于 iTerm2 的光标命令;映射 ctrl+arrows 或 alt+arrows 来快速移动
|
||||
bindkey -e
|
||||
bindkey '^[[1;9C' forward-word
|
||||
bindkey '^[[1;9D' backward-word
|
||||
bindkey '\e\e[D' backward-word
|
||||
bindkey '\e\e[C' forward-word
|
||||
fi
|
||||
```
|
||||
|
||||
(LCTT 译注:标题 “We're all mad here” 是电影《爱丽丝梦游仙境》中,微笑猫对爱丽丝讲的一句话:“我们这儿全都是疯的”。)
|
||||
|
||||
### 在家不工作
|
||||
|
||||
虽然我开始喜欢我的 Shell 点文件了,但我并不总是想要家用计算机上的东西与工作的计算机上的东西一样。解决此问题的一种方法是让补充的点文件在家中使用,而不是在工作中使用。以下是我的实现方式:
|
||||
|
||||
```
|
||||
if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
|
||||
if [ -e $HOME/.work ]
|
||||
source $HOME/.work
|
||||
else
|
||||
echo "This looks like a work machine, but I can't find the ~/.work file"
|
||||
fi
|
||||
fi
|
||||
```
|
||||
|
||||
在这种情况下,我根据我的工作 dns 后缀(或多个后缀,具体取决于你的情况)来提供(`source`)一个可以使我的工作环境更好的单独文件。
|
||||
|
||||
(LCTT 译注:标题 “What about Bob?” 是 1991 年的美国电影《天才也疯狂》。)
|
||||
|
||||
### 你该这么做
|
||||
|
||||
现在可能是放弃使用波浪号(`~`)表示编写脚本时的主目录的好时机。你会发现在某些上下文中无法识别它。养成使用环境变量 `$HOME` 的习惯,这将为你节省大量的故障排除时间和以后的工作。
|
||||
|
||||
如果你愿意,合乎逻辑的扩展是应该包括特定于操作系统的点文件。
|
||||
|
||||
(LCTT 译注:标题 “That thing you do” 是 1996 年由汤姆·汉克斯执导的喜剧片《挡不住的奇迹》。)
|
||||
|
||||
### 别指望记忆
|
||||
|
||||
我写了那么多 shell 脚本,我真的再也不想写脚本了。并不是说 shell 脚本不能满足我大部分时间的需求,而是我发现写 shell 脚本,可能只是拼凑了一个胶带式解决方案,而不是永久地解决问题。
|
||||
|
||||
同样,我讨厌记住事情,在我的整个职业生涯中,我经常不得不在一天之中就彻彻底底地改换环境。实际的结果是这些年来,我不得不一再重新学习很多东西。(“等等……这种语言使用哪种 for 循环结构?”)
|
||||
|
||||
因此,每隔一段时间我就会觉得自己厌倦了再次寻找做某事的方法。我改善生活的一种方法是添加别名。
|
||||
|
||||
对于任何一个使用操作系统的人来说,一个常见的情况是找出占用了所有磁盘的内容。不幸的是,我从来没有记住过这个咒语,所以我做了一个 shell 别名,创造性地叫做 `bigdirs`:
|
||||
|
||||
```
|
||||
alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'
|
||||
```
|
||||
|
||||
虽然我可能不那么懒惰,并实际记住了它,但是,那不太 Unix ……
|
||||
|
||||
(LCTT 译注:标题 “Memory, all alone in the moonlight” 是一手英文老歌。)
|
||||
|
||||
### 输错的人们
|
||||
|
||||
使用 shell 别名改善我的生活的另一种方法是使我免于输入错误。我不知道为什么,但是我已经养成了这种讨厌的习惯,在序列 `ea` 之后输入 `w`,所以如果我想清除终端,我经常会输入 `cleawr`。不幸的是,这对我的 shell 没有任何意义。直到我添加了这个小东西:
|
||||
|
||||
```
|
||||
alias cleawr='clear'
|
||||
```
|
||||
|
||||
在 Windows 中有一个等效但更好的命令 `cls`,但我发现自己会在 Shell 也输入它。看到你的 shell 表示抗议真令人沮丧,因此我添加:
|
||||
|
||||
```
|
||||
alias cls='clear'
|
||||
```
|
||||
|
||||
是的,我知道 `ctrl + l`,但是我从不使用它。
|
||||
|
||||
(LCTT 译注:标题 “Typos, and the people who love them” 可能来自某部电影。)
|
||||
|
||||
### 要自娱自乐
|
||||
|
||||
工作压力很大。有时你需要找点乐子。如果你的 shell 不知道它显然应该执行的命令,则可能你想直接让它耸耸肩!你可以使用以下功能执行此操作:
|
||||
|
||||
```
|
||||
shrug() { echo "¯\_(ツ)_/¯"; }
|
||||
```
|
||||
|
||||
如果还不行,也许你需要掀桌不干了:
|
||||
|
||||
```
|
||||
fliptable() { echo "(╯°□°)╯ ┻━┻"; } # 掀桌,用法示例: fsck -y /dev/sdb1 || fliptable
|
||||
```
|
||||
|
||||
想想看,当我想掀桌子时而我不记得我给它起了个什么名字,我会有多沮丧和失望,所以我添加了更多的 shell 别名:
|
||||
|
||||
```
|
||||
alias flipdesk='fliptable'
|
||||
alias deskflip='fliptable'
|
||||
alias tableflip='fliptable'
|
||||
```
|
||||
|
||||
而有时你需要庆祝一下:
|
||||
|
||||
```
|
||||
disco() {
|
||||
echo "(•_•)"
|
||||
echo "<) )╯"
|
||||
echo " / \ "
|
||||
echo ""
|
||||
echo "\(•_•)"
|
||||
echo " ( (>"
|
||||
echo " / \ "
|
||||
echo ""
|
||||
echo " (•_•)"
|
||||
echo "<) )>"
|
||||
echo " / \ "
|
||||
}
|
||||
```
|
||||
|
||||
通常,我会将这些命令的输出通过管道传递到 `pbcopy`,并将其粘贴到我正在使用的相关聊天工具中。
|
||||
|
||||
我从一个我关注的一个叫 “Command Line Magic” [@ climagic][5] 的 Twitter 帐户得到了下面这个有趣的函数。自从我现在住在佛罗里达州以来,我很高兴看到我这一生中唯一的一次下雪:
|
||||
|
||||
```
|
||||
snow() {
|
||||
clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
|
||||
}
|
||||
```
|
||||
|
||||
(LCTT 译注:标题 “Amuse yourself” 是 1936 年的美国电影《自娱自乐》)
|
||||
|
||||
### 函数的乐趣
|
||||
|
||||
我们已经看到了一些我使用的函数示例。由于这些示例中几乎不需要参数,因此可以将它们作为别名来完成。 当比一个短句更长时,我出于个人喜好使用函数。
|
||||
|
||||
在我职业生涯的很多时期我都运行过 [Graphite][6],这是一个开源、可扩展的时间序列指标解决方案。 在很多的情况下,我需要将度量路径(用句点表示)转换到文件系统路径(用斜杠表示),反之亦然,拥有专用于这些任务的函数就变得很有用:
|
||||
|
||||
```
|
||||
# 在 Graphite 指标和文件路径之间转换很有用
|
||||
function dottoslash() {
|
||||
echo $1 | sed 's/\./\//g'
|
||||
}
|
||||
function slashtodot() {
|
||||
echo $1 | sed 's/\//\./g'
|
||||
}
|
||||
```
|
||||
|
||||
在我的另外一段职业生涯里,我运行了很多 Kubernetes。如果你对运行 Kubernetes 不熟悉,你需要编写很多 YAML。不幸的是,一不小心就会编写了无效的 YAML。更糟糕的是,Kubernetes 不会在尝试应用 YAML 之前对其进行验证,因此,除非你应用它,否则你不会发现它是无效的。除非你先进行验证:
|
||||
|
||||
```
|
||||
function yamllint() {
|
||||
for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
|
||||
}
|
||||
```
|
||||
|
||||
因为我厌倦了偶尔破坏客户的设置而让自己感到尴尬,所以我写了这个小片段并将其作为提交前挂钩添加到我所有相关的存储库中。在持续集成过程中,类似的内容将非常有帮助,尤其是在你作为团队成员的情况下。
|
||||
|
||||
(LCTT 译注:哦抱歉,我不知道这个标题的出处。)
|
||||
|
||||
### 手指不听话
|
||||
|
||||
我曾经是一位出色的盲打打字员。但那些日子已经一去不回。我的打字错误超出了我的想象。
|
||||
|
||||
在各种时期,我多次用过 Chef 或 Kubernetes。对我来说幸运的是,我从未同时使用过这两者。
|
||||
|
||||
Chef 生态系统的一部分是 Test Kitchen,它是加快测试的一组工具,可通过命令 `kitchen test` 来调用。Kubernetes 使用 CLI 工具 `kubectl` 进行管理。这两个命令都需要几个子命令,并且这两者都不会特别顺畅地移动手指。
|
||||
|
||||
我没有创建一堆“输错别名”,而是将这两个命令别名为 `k`:
|
||||
|
||||
```
|
||||
alias k='kitchen test $@'
|
||||
```
|
||||
|
||||
或
|
||||
|
||||
```
|
||||
alias k='kubectl $@'
|
||||
```
|
||||
|
||||
(LCTT 译注:标题 “Oh, fingers, where art thou?” 演绎自《O Brother, Where Art Thou?》,这是 2000 年美国的一部电影《逃狱三王》。)
|
||||
|
||||
### 分裂与合并
|
||||
|
||||
我职业生涯的后半截涉及与其他人一起编写更多代码。我曾在许多环境中工作过,在这些环境中,我们在帐户中复刻了存储库副本,并将拉取请求用作审核过程的一部分。当我想确保给定存储库的复刻与父版本保持最新时,我使用 `fetchupstream`:
|
||||
|
||||
```
|
||||
alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'
|
||||
```
|
||||
|
||||
(LCTT 译注:标题 “Timesplitters” 是一款视频游戏《时空分裂者》。)
|
||||
|
||||
### 颜色之荣耀
|
||||
|
||||
我喜欢颜色。它可以使 `diff` 之类的东西更易于使用。
|
||||
|
||||
```
|
||||
alias diff='colordiff'
|
||||
```
|
||||
|
||||
我觉得彩色的手册页是个巧妙的技巧,因此我合并了以下函数:
|
||||
|
||||
```
|
||||
# 彩色化手册页,来自:
|
||||
# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
|
||||
man() {
|
||||
env \
|
||||
LESS_TERMCAP_md=$(printf "\e[1;36m") \
|
||||
LESS_TERMCAP_me=$(printf "\e[0m") \
|
||||
LESS_TERMCAP_se=$(printf "\e[0m") \
|
||||
LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
|
||||
LESS_TERMCAP_ue=$(printf "\e[0m") \
|
||||
LESS_TERMCAP_us=$(printf "\e[1;32m") \
|
||||
man "$@"
|
||||
}
|
||||
```
|
||||
|
||||
我喜欢命令 `which`,但它只是告诉你正在运行的命令在文件系统中的位置,除非它是 Shell 函数才能告诉你更多。在多个级联的点文件之后,有时会不清楚函数的定义位置或作用。事实证明,`whence` 和 `type` 命令可以帮助解决这一问题。
|
||||
|
||||
```
|
||||
# 函数定义在哪里?
|
||||
whichfunc() {
|
||||
whence -v $1
|
||||
type -a $1
|
||||
}
|
||||
```
|
||||
|
||||
(LCTT 译注:标题“Mine eyes have seen the glory of the coming of color” 演绎自歌曲 《Mine Eyes Have Seen The Glory Of The Coming Of The Lord》)
|
||||
|
||||
### 总结
|
||||
|
||||
希望本文对你有所帮助,并能激发你找到改善日常使用 Shell 的方法。这些方法不必庞大、新颖或复杂。它们可能会解决一些微小但频繁的摩擦、创建捷径,甚至提供减少常见输入错误的解决方案。
|
||||
|
||||
欢迎你浏览我的 [dotfiles 存储库][7],但我要警示你,这样做可能会花费很多时间。请随意使用你认为有帮助的任何东西,并互相取长补短。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/18/9/shell-dotfile
|
||||
|
||||
作者:[H.Waldo Grunenwald][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/gwaldo
|
||||
[1]: http://www.zsh.org/
|
||||
[2]: https://brew.sh/
|
||||
[3]: https://github.com/robbyrussell/oh-my-zsh
|
||||
[4]: https://www.iterm2.com/
|
||||
[5]: https://twitter.com/climagic
|
||||
[6]: https://github.com/graphite-project/
|
||||
[7]: https://github.com/gwaldo/dotfiles
|
@ -0,0 +1,101 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11420-1.html)
|
||||
[#]: subject: (The Earliest Linux Distros: Before Mainstream Distros Became So Popular)
|
||||
[#]: via: (https://itsfoss.com/earliest-linux-distros/)
|
||||
[#]: author: (Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/)
|
||||
|
||||
主流发行版之前的那些最早的 Linux 发行版
|
||||
======
|
||||
|
||||
> 在这篇回溯历史的文章中,我们尝试回顾一些最早的 Linux 发行版是如何演变的,并形成我们今天所知道的发行版的。
|
||||
|
||||
![][1]
|
||||
|
||||
在这里,我们尝试探讨了第一个 Linux 内核问世后,诸如 Red Hat、Debian、Slackware、SUSE、Ubuntu 等诸多流行的发行版的想法是如何产生的。
|
||||
|
||||
随着 1991 年 Linux 最初以内核的形式发布,今天我们所知道的发行版在世界各地众多合作者的帮助下得以创建 shell、库、编译器和相关软件包,从而使其成为一个完整的操作系统。
|
||||
|
||||
### 1、第一个已知的“发行版”是由 HJ Lu 创建的
|
||||
|
||||
Linux 发行版这种方式可以追溯到 1992 年,当时可以用来访问 Linux 的第一个已知的类似发行版的工具是由 HJ Lu 发布的。它由两个 5.25 英寸软盘组成:
|
||||
|
||||
![Linux 0.12 Boot and Root Disks | Photo Credit][2]
|
||||
|
||||
* LINUX 0.12 BOOT DISK:“启动”磁盘用来先启动系统。
|
||||
* LINUX 0.12 ROOT DISK:第二个“根”磁盘,用于在启动后获取命令提示符以访问 Linux 文件系统。
|
||||
|
||||
要在硬盘上安装 LINUX 0.12,必须使用十六进制编辑器来编辑其主启动记录(MBR),这是一个非常复杂的过程,尤其是在那个时代。
|
||||
|
||||
> 感觉太怀旧了?
|
||||
>
|
||||
> 你可以[安装 cool-retro-term 应用程序][3],它可以为你提供 90 年代计算机的复古外观的 Linux 终端。
|
||||
|
||||
### 2、MCC Interim Linux
|
||||
|
||||
![MCC Linux 0.99.14, 1993 | Image Credit][4]
|
||||
|
||||
MCC Interim Linux 最初由英格兰曼彻斯特计算中心的 Owen Le Blanc 与 “LINUX 0.12” 同年发布,它是针对普通用户的第一个 Linux 发行版,它具有菜单驱动的安装程序和最终用户/编程工具。它也是以软盘集的形式,可以将其安装在系统上以提供基于文本的基本环境。
|
||||
|
||||
MCC Interim Linux 比 0.12 更加易于使用,并且在硬盘驱动器上的安装过程更加轻松和类似于现代方式。它不需要使用十六进制编辑器来编辑 MBR。
|
||||
|
||||
尽管它于 1992 年 2 月首次发布,但自当年 11 月以来也可以通过 FTP 下载。
|
||||
|
||||
### 3、TAMU Linux
|
||||
|
||||
![TAMU Linux | Image Credit][5]
|
||||
|
||||
TAMU Linux 由 Texas A&M 的 Aggies 与 Texas A&M Unix & Linux 用户组于 1992 年 5 月开发,被称为 TAMU 1.0A。它是第一个提供 X Window System 的 Linux 发行版,而不仅仅是基于文本的操作系统。
|
||||
|
||||
### 4、Softlanding Linux System (SLS)
|
||||
|
||||
![SLS Linux 1.05, 1994 | Image Credit][6]
|
||||
|
||||
他们的口号是“DOS 伞降的温柔救援”!SLS 由 Peter McDonald 于 1992 年 5 月发布。SLS 在其时代得到了广泛的使用和流行,并极大地推广了 Linux 的思想。但是由于开发人员决定更改发行版中的可执行格式,因此用户停止使用它。
|
||||
|
||||
当今社区最熟悉的许多流行发行版是通过 SLS 演变而成的。其中两个是:
|
||||
|
||||
* Slackware:它是最早的 Linux 发行版之一,由 Patrick Volkerding 于 1993 年创建。Slackware 基于 SLS,是最早的 Linux 发行版之一。
|
||||
* Debian:由 Ian Murdock 发起,Debian 在从 SLS 模型继续发展之后于 1993 年发布。我们今天知道的非常流行的 Ubuntu 发行版基于 Debian。
|
||||
|
||||
### 5、Yggdrasil
|
||||
|
||||
![LGX Yggdrasil Fall 1993 | Image Credit][7]
|
||||
|
||||
Yggdrasil 于 1992 年 12 月发行,是第一个产生 Live Linux CD 想法的发行版。它是由 Yggdrasil 计算公司开发的,该公司由位于加利福尼亚州伯克利的 Adam J. Richter 创立。它可以在系统硬件上自动配置自身,即“即插即用”功能,这是当今非常普遍且众所周知的功能。Yggdrasil 后来的版本包括一个用于在 Linux 中运行任何专有 MS-DOS CD-ROM 驱动程序的黑科技。
|
||||
|
||||
![Yggdrasil’s Plug-and-Play Promo | Image Credit][8]
|
||||
|
||||
他们的座右铭是“我们其余人的免费软件”。
|
||||
|
||||
### 6、Mandriva
|
||||
|
||||
在 90 年代后期,有一个非常受欢迎的发行版 [Mandriva][9],该发行版于 1998 年首次发行,是通过将法国的 Mandrake Linux 发行版与巴西的 Conectiva Linux 发行版统一起来形成的。它的发布寿命为 18 个月,会对 Linux 和系统软件进行更新,并且每年都会发布基于桌面的更新。它还有带有 5 年支持的服务器版本。现在是 [Open Mandriva][10]。
|
||||
|
||||
如果你在 Linux 发行之初就用过更多的怀旧发行版,请在下面的评论中与我们分享。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/earliest-linux-distros/
|
||||
|
||||
作者:[Avimanyu Bandyopadhyay][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://itsfoss.com/author/avimanyu/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/earliest-linux-distros.png?resize=800%2C450&ssl=1
|
||||
[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/Linux-0.12-Floppies.jpg?ssl=1
|
||||
[3]: https://itsfoss.com/cool-retro-term/
|
||||
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/MCC-Interim-Linux-0.99.14-1993.jpg?fit=800%2C600&ssl=1
|
||||
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/TAMU-Linux.jpg?ssl=1
|
||||
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/SLS-1.05-1994.jpg?ssl=1
|
||||
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/LGX_Yggdrasil_CD_Fall_1993.jpg?fit=781%2C800&ssl=1
|
||||
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/Yggdrasil-Linux-Summer-1994.jpg?ssl=1
|
||||
[9]: https://en.wikipedia.org/wiki/Mandriva_Linux
|
||||
[10]: https://www.openmandriva.org/
|
@ -0,0 +1,134 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (tomjlw)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11467-1.html)
|
||||
[#]: subject: (Guide to Install VMware Tools on Linux)
|
||||
[#]: via: (https://itsfoss.com/install-vmware-tools-linux)
|
||||
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||
|
||||
在 Linux 上安装 VMware 工具
|
||||
======
|
||||
|
||||
> VMware 工具通过允许你共享剪贴板和文件夹以及其他东西来提升你的虚拟机体验。了解如何在 Ubuntu 和其它 Linux 发行版上安装 VMware 工具。
|
||||
|
||||
![如何在 Linux 上安装 VMware 工具][4]
|
||||
|
||||
在先前的教程中,你学习了[在 Ubuntu 上安装 VMware 工作站][1]。你还可以通过安装 VMware 工具进一步提升你的虚拟机功能。
|
||||
|
||||
如果你已经在 VMware 上安装了一个访客机系统,你必须要注意 [VMware 工具][2]的要求 —— 尽管并不完全清楚到底有什么要求。
|
||||
|
||||
在本文中,我们将要强调 VMware 工具的重要性、所提供的特性,以及在 Ubuntu 和其它 Linux 发行版上安装 VMware 工具的方法。
|
||||
|
||||
### VMware 工具:概览及特性
|
||||
|
||||
![在 Ubuntu 上安装 VMware 工具][3]
|
||||
|
||||
出于显而易见的理由,虚拟机(你的访客机系统)并不能做到与宿主机上的表现完全一致。在其性能和操作上会有特定的限制。那就是为什么引入 VMware 工具的原因。
|
||||
|
||||
VMware 工具以一种高效的形式在提升了其性能的同时,也可以帮助管理访客机系统。
|
||||
|
||||
#### VMware 工具到底负责什么?
|
||||
|
||||
你大致知道它可以做什么,但让我们探讨一下细节:
|
||||
|
||||
* 同步访客机系统与宿主机系统间的时间以简化操作
|
||||
* 提供从宿主机系统向访客机系统传递消息的能力。比如说,你可以复制文字到剪贴板,并将它轻松粘贴到你的访客机系统
|
||||
* 在访客机系统上启用声音
|
||||
* 提升访客机视频分辨率
|
||||
* 修正错误的网络速度数据
|
||||
* 减少不合适的色深
|
||||
|
||||
在访客机系统上安装了 VMware 工具会给它带来显著改变,但是它到底包含了什么特性才解锁或提升这些功能的呢?让我们来看看……
|
||||
|
||||
#### VMware 工具:核心特性细节
|
||||
|
||||
![用 VMware 工具在宿主机系统与访客机系统间共享剪切板][5]
|
||||
|
||||
如果你不想知道它包含什么来启用这些功能的话,你可以跳过这部分。但是为了好奇的读者,让我们简短地讨论它一下:
|
||||
|
||||
**VMware 设备驱动:** 它具体取决于操作系统。大多数主流操作系统都默认包含了设备驱动,因此你不必另外安装它。这主要涉及到内存控制驱动、鼠标驱动、音频驱动、网卡驱动、VGA 驱动以及其它。
|
||||
|
||||
**VMware 用户进程:** 这是这里真正有意思的地方。通过它你获得了在访客机和宿主机间复制粘贴和拖拽的能力。基本上,你可以从宿主机复制粘贴文本到虚拟机,反之亦然。
|
||||
|
||||
你同样也可以拖拽文件。此外,在你未安装 SVGA 驱动时它会启用鼠标指针的释放/锁定。
|
||||
|
||||
**VMware 工具生命周期管理:** 嗯,我们会在下面看看如何安装 VMware 工具,但是这个特性帮你在虚拟机中轻松安装/升级 VMware 工具。
|
||||
|
||||
**共享文件夹**:除了这些。VMware 工具同样允许你在访客机与宿主机系统间共享文件夹。
|
||||
|
||||
![使用 VMware 工具在访客机与宿机系统间共享文件][6]
|
||||
|
||||
当然,它的效果同样取决于访客机系统。例如在 Windows 上你通过 Unity 模式运行虚拟机上的程序并从宿主机系统上操作它。
|
||||
|
||||
### 如何在 Ubuntu 和其它 Linux 发行版上安装 VMware 工具
|
||||
|
||||
**注意:** 对于 Linux 操作系统,你应该已经安装好了“Open VM 工具”,大多数情况下免除了额外安装 VMware 工具的需要。
|
||||
|
||||
大部分时候,当你安装了访客机系统时,如果操作系统支持 [Easy Install][7] 的话你会收到软件更新或弹窗告诉你要安装 VMware 工具。
|
||||
|
||||
Windows 和 Ubuntu 都支持 Easy Install。因此如果你使用 Windows 作为你的宿主机或尝试在 Ubuntu 上安装 VMware 工具,你应该会看到一个和弹窗消息差不多的选项来轻松安装 VMware 工具。这是它应该看起来的样子:
|
||||
|
||||
![安装 VMware 工具的弹窗][8]
|
||||
|
||||
这是搞定它最简便的办法。因此当你配置虚拟机时确保你有一个通畅的网络连接。
|
||||
|
||||
如果你没收到任何弹窗或者选项来轻松安装 VMware 工具。你需要手动安装它。以下是如何去做:
|
||||
|
||||
1. 运行 VMware Workstation Player。
|
||||
2. 从菜单导航至 “Virtual Machine -> Install VMware tools”。如果你已经安装了它并想修复安装,你会看到 “Re-install VMware tools” 这一选项出现。
|
||||
3. 一旦你点击了,你就会看到一个虚拟 CD/DVD 挂载在访客机系统上。
|
||||
4. 打开该 CD/DVD,并复制粘贴那个 tar.gz 文件到任何你选择的区域并解压,这里我们选择“桌面”作为解压目的地。
|
||||
|
||||
![][9]
|
||||
5. 在解压后,运行终端并通过输入以下命令导航至里面的文件夹:
|
||||
|
||||
```
|
||||
cd Desktop/VMwareTools-10.3.2-9925305/vmware-tools-distrib
|
||||
```
|
||||
|
||||
你需要检查文件夹与路径名,这取决于版本与解压目的地,名字可能会改变。
|
||||
|
||||
![][10]
|
||||
|
||||
用你的存储位置(如“下载”)替换“桌面”,如果你安装的也是 10.3.2 版本,其它的保持一样即可。
|
||||
6. 现在仅需输入以下命令开始安装:
|
||||
|
||||
```
|
||||
sudo ./vmware-install.pl -d
|
||||
```
|
||||
|
||||
![][11]
|
||||
|
||||
你会被询问密码以获得安装权限,输入密码然后应当一切都搞定了。
|
||||
|
||||
到此为止了,你搞定了。这系列步骤应当适用于几乎大部分基于 Ubuntu 的访客机系统。如果你想要在 Ubuntu 服务器上或其它系统安装 VMware 工具,步骤应该类似。
|
||||
|
||||
### 总结
|
||||
|
||||
在 Ubuntu Linux 上安装 VMware 工具应该挺简单。除了简单办法,我们也详述了手动安装的方法。如果你仍需帮助或者对安装有任何建议,在评论区评论让我们知道。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/install-vmware-tools-linux
|
||||
|
||||
作者:[Ankush Das][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://itsfoss.com/author/ankush/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://itsfoss.com/install-vmware-player-ubuntu-1310/
|
||||
[2]: https://kb.vmware.com/s/article/340
|
||||
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-downloading.jpg?fit=800%2C531&ssl=1
|
||||
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/install-vmware-tools-linux.png?resize=800%2C450&ssl=1
|
||||
[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-features.gif?resize=800%2C500&ssl=1
|
||||
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-shared-folder.jpg?fit=800%2C660&ssl=1
|
||||
[7]: https://docs.vmware.com/en/VMware-Workstation-Player-for-Linux/15.0/com.vmware.player.linux.using.doc/GUID-3F6B9D0E-6CFC-4627-B80B-9A68A5960F60.html
|
||||
[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools.jpg?fit=800%2C481&ssl=1
|
||||
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-extraction.jpg?fit=800%2C564&ssl=1
|
||||
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-folder.jpg?fit=800%2C487&ssl=1
|
||||
[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-installation-ubuntu.jpg?fit=800%2C492&ssl=1
|
@ -0,0 +1,125 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11419-1.html)
|
||||
[#]: subject: (Move your dotfiles to version control)
|
||||
[#]: via: (https://opensource.com/article/19/3/move-your-dotfiles-version-control)
|
||||
[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg)
|
||||
|
||||
把“点文件”放到版本控制中
|
||||
======
|
||||
|
||||
> 通过在 GitLab 或 GitHub 上分享你的点文件,可以在整个系统上备份或同步你的自定义配置。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201910/03/205222yzo1rbck6accccvo.jpg)
|
||||
|
||||
通过隐藏文件集(称为<ruby>点文件<rt>dotfile</rt></ruby>)来定制操作系统是个非常棒的想法。在这篇 [Shell 点文件可以为你做点什么][1]中,H. "Waldo" Grunenwald 详细介绍了为什么以及如何设置点文件的细节。现在让我们深入探讨分享它们的原因和方式。
|
||||
|
||||
### 什么是点文件?
|
||||
|
||||
“<ruby>点文件<rt>dotfile</rt></ruby>”是指我们计算机中四处漂泊的配置文件。这些文件通常在文件名的开头以 `.` 开头,例如 `.gitconfig`,并且操作系统通常在默认情况下将其隐藏。例如,当我在 MacOS 上使用 `ls -a` 时,它才会显示所有可爱的点文件,否则就不会显示这些点文件。
|
||||
|
||||
```
|
||||
dotfiles on master
|
||||
➜ ls
|
||||
README.md Rakefile bin misc profiles zsh-custom
|
||||
|
||||
dotfiles on master
|
||||
➜ ls -a
|
||||
. .gitignore .oh-my-zsh README.md zsh-custom
|
||||
.. .gitmodules .tmux Rakefile
|
||||
.gemrc .global_ignore .vimrc bin
|
||||
.git .gvimrc .zlogin misc
|
||||
.gitconfig .maid .zshrc profiles
|
||||
```
|
||||
|
||||
如果看一下用于 Git 配置的 `.gitconfig`,我能看到大量的自定义配置。我设置了帐户信息、终端颜色首选项和大量别名,这些别名可以使我的命令行界面看起来就像我的一样。这是 `[alias]` 块的摘录:
|
||||
|
||||
```
|
||||
87 # Show the diff between the latest commit and the current state
|
||||
88 d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat"
|
||||
89
|
||||
90 # `git di $number` shows the diff between the state `$number` revisions ago and the current state
|
||||
91 di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d"
|
||||
92
|
||||
93 # Pull in remote changes for the current repository and all its submodules
|
||||
94 p = !"git pull; git submodule foreach git pull origin master"
|
||||
95
|
||||
96 # Checkout a pull request from origin (of a github repository)
|
||||
97 pr = !"pr() { git fetch origin pull/$1/head:pr-$1; git checkout pr-$1; }; pr"
|
||||
```
|
||||
|
||||
由于我的 `.gitconfig` 有 200 多行的自定义设置,我无意于在我使用的每一台新计算机或系统上重写它,其他人肯定也不想这样。这是分享点文件变得越来越流行的原因之一,尤其是随着社交编码网站 GitHub 的兴起。正式提倡分享点文件的文章是 Zach Holman 在 2008 年发表的《[点文件意味着被复刻][2]》。其前提到今天依然如此:我想与我自己、与点文件新手,以及那些分享了他们的自定义配置从而教会了我很多知识的人分享它们。
|
||||
|
||||
### 分享点文件
|
||||
|
||||
我们中的许多人拥有多个系统,或者知道硬盘变化无常,因此我们希望备份我们精心策划的自定义设置。那么我们如何在环境之间同步这些精彩的文件?
|
||||
|
||||
我最喜欢的答案是分布式版本控制,最好是可以为我处理繁重任务的服务。我经常使用 GitHub,随着我对 GitLab 的使用经验越来越丰富,我肯定会一如既往地继续喜欢它。任何一个这样的服务都是共享你的信息的理想场所。要自己设置的话可以这样做:
|
||||
|
||||
1. 登录到你首选的基于 Git 的服务。
|
||||
2. 创建一个名为 `dotfiles` 的存储库。(将其设置为公开!分享即关爱。)
|
||||
3. 将其克隆到你的本地环境。(你可能需要设置 Git 配置命令来克隆存储库。GitHub 和 GitLab 都会提示你需要运行的命令。)
|
||||
4. 将你的点文件复制到该文件夹中。
|
||||
5. 将它们符号链接回到其目标文件夹(最常见的是 `$HOME`)。
|
||||
6. 将它们推送到远程存储库。
|
||||
|
||||
![](https://opensource.com/sites/default/files/uploads/gitlab-new-project.png)
|
||||
|
||||
上面的步骤 4 是这项工作的关键,可能有些棘手。无论是使用脚本还是手动执行,工作流程都是从 `dotfiles` 文件夹符号链接到点文件的目标位置,以便对点文件的任何更新都可以轻松地推送到远程存储库。要对我的 `.gitconfig` 文件执行此操作,我要输入:
|
||||
|
||||
```
|
||||
$ cd dotfiles/
|
||||
$ ln -nfs .gitconfig $HOME/.gitconfig
|
||||
```
|
||||
|
||||
添加到符号链接命令的标志还具有其他一些用处:
|
||||
|
||||
* `-s` 创建符号链接而不是硬链接。
|
||||
* `-f` 在发生错误时继续做其他符号链接(此处不需要,但在循环中很有用)
|
||||
* `-n` 避免符号链接到一个符号链接文件(等同于其他版本的 `ln` 的 `-h` 标志)
|
||||
|
||||
如果要更深入地研究可用参数,可以查看 IEEE 和开放小组的 [ln 规范][3]以及 [MacOS 10.14.3] [4] 上的版本。自从其他人的点文件中拉取出这些标志以来,我才发现了这些标志。
|
||||
|
||||
你还可以使用一些其他代码来简化更新,例如我从 [Brad Parbs][6] 复刻的 [Rakefile][5]。另外,你也可以像 Jeff Geerling [在其点文件中][7]那样,使它保持极其简单的状态。他使用[此 Ansible 剧本][8]对文件进行符号链接。这样使所有内容保持同步很容易:你可以从点文件的文件夹中进行 cron 作业或偶尔进行 `git push`。
|
||||
|
||||
### 简单旁注:什么不能分享
|
||||
|
||||
在继续之前,值得注意的是你不应该添加到共享的点文件存储库中的内容 —— 即使它以点开头。任何有安全风险的东西,例如 `.ssh/` 文件夹中的文件,都不是使用此方法分享的好选择。确保在在线发布配置文件之前仔细检查配置文件,并再三检查文件中没有 API 令牌。
|
||||
|
||||
### 我应该从哪里开始?
|
||||
|
||||
如果你不熟悉 Git,那么我[有关 Git 术语的文章][9]和常用命令[备忘清单][10]将会帮助你继续前进。
|
||||
|
||||
还有其他超棒的资源可帮助你开始使用点文件。多年前,我就发现了 [dotfiles.github.io][11],并继续使用它来更广泛地了解人们在做什么。在其他人的点文件中隐藏了许多秘传知识。花时间浏览一些,大胆地将它们添加到自己的内容中。
|
||||
|
||||
我希望这是让你在计算机上拥有一致的点文件的快乐开端。
|
||||
|
||||
你最喜欢的点文件技巧是什么?添加评论或在 Twitter 上找我 [@mbbroberg][12]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/3/move-your-dotfiles-version-control
|
||||
|
||||
作者:[Matthew Broberg][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/mbbroberg
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://linux.cn/article-11417-1.html
|
||||
[2]: https://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked/
|
||||
[3]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ln.html
|
||||
[4]: https://www.unix.com/man-page/FreeBSD/1/ln/
|
||||
[5]: https://github.com/mbbroberg/dotfiles/blob/master/Rakefile
|
||||
[6]: https://github.com/bradp/dotfiles
|
||||
[7]: https://github.com/geerlingguy/dotfiles
|
||||
[8]: https://github.com/geerlingguy/mac-dev-playbook
|
||||
[9]: https://opensource.com/article/19/2/git-terminology
|
||||
[10]: https://opensource.com/downloads/cheat-sheet-git
|
||||
[11]: http://dotfiles.github.io/
|
||||
[12]: https://twitter.com/mbbroberg?lang=en
|
@ -0,0 +1,261 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11499-1.html)
|
||||
[#]: subject: (How writers can get work done better with Git)
|
||||
[#]: via: (https://opensource.com/article/19/4/write-git)
|
||||
[#]: author: (Seth Kenlon https://opensource.com/users/sethhttps://opensource.com/users/noreplyhttps://opensource.com/users/seth)
|
||||
|
||||
用 Git 帮助写作者更好地完成工作
|
||||
======
|
||||
|
||||
> 如果你是一名写作者,你也能从使用 Git 中受益。在我们的系列文章中了解有关 Git 鲜为人知的用法。
|
||||
|
||||
![](https://img.linux.net.cn/data/attachment/album/201910/24/222747ltajik2ymzmmttha.png)
|
||||
|
||||
[Git][2] 是一个少有的能将如此多的现代计算封装到一个程序之中的应用程序,它可以用作许多其他应用程序的计算引擎。虽然它以跟踪软件开发中的源代码更改而闻名,但它还有许多其他用途,可以让你的生活更轻松、更有条理。在这个 Git 系列中,我们将分享七种鲜为人知的使用 Git 的方法。
|
||||
|
||||
今天我们来看看写作者如何使用 Git 更好的地完成工作。
|
||||
|
||||
### 写作者的 Git
|
||||
|
||||
有些人写小说,也有人撰写学术论文、诗歌、剧本、技术手册或有关开源的文章。许多人都在做一些各种写作。相同的是,如果你是一名写作者,或许能从使用 Git 中受益。尽管 Git 是著名的计算机程序员所使用的高度技术性工具,但它也是现代写作者的理想之选,本文将向你演示如何改变你的书写方式以及为什么要这么做的原因。
|
||||
|
||||
但是,在谈论 Git 之前,重要的是先谈谈“副本”(或者叫“内容”,对于数字时代而言)到底是什么,以及为什么它与你的交付*媒介*不同。这是 21 世纪,大多数写作者选择的工具是计算机。尽管计算机看似擅长将副本的编辑和布局等过程结合在一起,但写作者还是(重新)发现将内容与样式分开是一个好主意。这意味着你应该在计算机上像在打字机上而不是在文字处理器中进行书写。以计算机术语而言,这意味着以*纯文本*形式写作。
|
||||
|
||||
### 以纯文本写作
|
||||
|
||||
这个假设曾经是毫无疑问的:你知道自己的写作所要针对的市场,你可以为书籍、网站或软件手册等不同市场编写内容。但是,近来各种市场趋于扁平化:你可能决定在纸质书中使用为网站编写的内容,并且纸质书可能会在以后发布 EPUB 版本。对于你的内容的数字版本,读者才是最终控制者:他们可以在你发布内容的网站上阅读你的文字,也可以点击 Firefox 出色的[阅读视图][3],还可能会打印到纸张上,或者可能会使用 Lynx 将网页转储到文本文件中,甚至可能因为使用屏幕阅读器而根本看不到你的内容。
|
||||
|
||||
你只需要逐字写下你的内容,而将交付工作留给发布者。即使你是自己发布,将字词作为写作作品的一种源代码也是一种更聪明、更有效的工作方式,因为在发布时,你可以使用相同的源(你的纯文本)生成适合你的目标输出(用于打印的 PDF、用于电子书的 EPUB、用于网站的 HTML 等)。
|
||||
|
||||
用纯文本编写不仅意味着你不必担心布局或文本样式,而且也不再需要专门的工具。无论是手机或平板电脑上的基本的记事本应用程序、计算机附带的文本编辑器,还是从互联网上下载的免费编辑器,任何能够产生文本内容的工具对你而言都是有效的“文字处理器”。无论你身在何处或在做什么,几乎可以在任何设备上书写,并且所生成的文本可以与你的项目完美集成,而无需进行任何修改。
|
||||
|
||||
而且,Git 专门用来管理纯文本。
|
||||
|
||||
### Atom 编辑器
|
||||
|
||||
当你以纯文本形式书写时,文字处理程序会显得过于庞大。使用文本编辑器更容易,因为文本编辑器不会尝试“有效地”重组输入内容。它使你可以将脑海中的单词输入到屏幕中,而不会受到干扰。更好的是,文本编辑器通常是围绕插件体系结构设计的,这样应用程序本身很基础(它用来编辑文本),但是你可以围绕它构建一个环境来满足你的各种需求。
|
||||
|
||||
[Atom][4] 编辑器就是这种设计理念的一个很好的例子。这是一个具有内置 Git 集成的跨平台文本编辑器。如果你不熟悉纯文本格式,也不熟悉 Git,那么 Atom 是最简单的入门方法。
|
||||
|
||||
#### 安装 Git 和 Atom
|
||||
|
||||
首先,请确保你的系统上已安装 Git。如果运行 Linux 或 BSD,则 Git 在软件存储库或 ports 树中可用。你使用的命令将根据你的发行版而有所不同。例如在 Fedora 上:
|
||||
|
||||
```
|
||||
$ sudo dnf install git
|
||||
```
|
||||
|
||||
你也可以下载并安装适用于 [Mac][5] 和 [Windows][6] 的 Git。
|
||||
|
||||
你不需要直接使用 Git,因为 Atom 会充当你的 Git 界面。下一步是安装 Atom。
|
||||
|
||||
如果你使用的是 Linux,请通过软件安装程序或适当的命令从软件存储库中安装 Atom,例如:
|
||||
|
||||
```
|
||||
$ sudo dnf install atom
|
||||
```
|
||||
|
||||
Atom 当前没有在 BSD 上构建。但是,有很好的替代方法,例如 [GNU Emacs][7]。对于 Mac 和 Windows 用户,可以在 [Atom 网站][4]上找到安装程序。
|
||||
|
||||
安装完成后,启动 Atom 编辑器。
|
||||
|
||||
#### 快速指导
|
||||
|
||||
如果要使用纯文本和 Git,则需要适应你的编辑器。Atom 的用户界面可能比你习惯的更加动态。实际上,你可以将它视为 Firefox 或 Chrome,而不是文字处理程序,因为它具有可以根据需要打开或关闭的选项卡和面板,甚至还可以安装和配置附件。尝试全部掌握 Atom 如许之多的功能是不切实际的,但是你至少可以知道有什么功能。
|
||||
|
||||
当打开 Atom 时,它将显示一个欢迎屏幕。如果不出意外,此屏幕很好地介绍了 Atom 的选项卡式界面。你可以通过单击 Atom 窗口顶部选项卡上的“关闭”图标来关闭欢迎屏幕,并使用“文件 > 新建文件”创建一个新文件。
|
||||
|
||||
使用纯文本格式与使用文字处理程序有点不同,因此这里有一些技巧,以人可以理解的方式编写内容,并且 Git 和计算机可以解析,跟踪和转换。
|
||||
|
||||
#### 用 Markdown 书写
|
||||
|
||||
如今,当人们谈论纯文本时,大多是指 Markdown。Markdown 与其说是格式,不如说是样式,这意味着它旨在为文本提供可预测的结构,以便计算机可以检测自然的模式并智能地转换文本。Markdown 有很多定义,但是最好的技术定义和备忘清单在 [CommonMark 的网站][8]上。
|
||||
|
||||
```
|
||||
# Chapter 1
|
||||
|
||||
This is a paragraph with an *italic* word and a **bold** word in it.
|
||||
And it can even reference an image.
|
||||
|
||||
![An image will render here.](drawing.jpg)
|
||||
```
|
||||
|
||||
从示例中可以看出,Markdown 读起来感觉不像代码,但可以将其视为代码。如果你遵循 CommonMark 定义的 Markdown 规范,那么一键就可以可靠地将 Markdown 的文字转换为 .docx、.epub、.html、MediaWiki、.odt、.pdf、.rtf 和各种其他的格式,而*不会*失去格式。
|
||||
|
||||
你可以认为 Markdown 有点像文字处理程序的样式。如果你曾经为出版社撰写过一套样式来控制章节标题及其样式,那基本上就是一回事,除了不是从下拉菜单中选择样式以外,你需要给你的文字添加一些小记号。对于任何习惯“以文字交谈”的现代阅读者来说,这些表示法都是很自然的,但是在呈现文本时,它们会被精美的文本样式替换掉。实际上,这就是文字处理程序在后台秘密进行的操作。文字处理器显示粗体文本,但是如果你可以看到使文本变为粗体的生成代码,则它与 Markdown 很像(实际上,它是更复杂的 XML)。使用 Markdown 可以消除这种代码和样式之间的阻隔,一方面看起来更可怕一些,但另一方面,你可以在几乎所有可以生成文本的东西上书写 Markdown 而不会丢失任何格式信息。
|
||||
|
||||
Markdown 文件流行的文件扩展名是 .md。如果你使用的平台不知道 .md 文件是什么,则可以手动将该扩展名与 Atom 关联,或者仅使用通用的 .txt 扩展名。文件扩展名不会更改文件的性质。它只会改变你的计算机决定如何处理它的方式。Atom 和某些平台足够聪明,可以知道该文件是纯文本格式,无论你给它以什么扩展名。
|
||||
|
||||
#### 实时预览
|
||||
|
||||
Atom 具有 “Markdown 预览” 插件,该插件可以向你显示正在编写的纯文本 Markdown 及其(通常)呈现的方式。
|
||||
|
||||
![Atom's preview screen][9]
|
||||
|
||||
要激活此预览窗格,请选择“包 > Markdown 预览 > 切换预览” 或按 `Ctrl + Shift + M`。
|
||||
|
||||
此视图为你提供了两全其美的方法。无需承担为你的文本添加样式的负担就可以写作,而你也可以看到一个通用的示例外观,至少是以典型的数字化格式显示文本的外观。当然,关键是你无法控制文本的最终呈现方式,因此不要试图调整 Markdown 来强制以某种方式显示呈现的预览。
|
||||
|
||||
#### 每行一句话
|
||||
|
||||
你的高中写作老师不会看你的 Markdown。
|
||||
|
||||
一开始它不那么自然,但是在数字世界中,保持每行一个句子更有意义。Markdown 会忽略单个换行符(当你按下 `Return` 或 `Enter` 键时),并且只在单个空行之后才会创建一个新段落。
|
||||
|
||||
![Writing in Atom][10]
|
||||
|
||||
每行写一个句子的好处是你的工作更容易跟踪。也就是说,假如你在段落的开头更改了一个单词,如果更改仅限于一行而不是一个长的段落中的一个单词,那么 Atom、Git 或任何应用程序很容易以有意义的方式突出显示该更改。换句话说,对一个句子的更改只会影响该句子,而不会影响整个段落。
|
||||
|
||||
你可能会想:“许多文字处理器也可以跟踪更改,它们可以突出显示已更改的单个单词。”但是这些修订跟踪器绑定在该字处理器的界面上,这意味着你必须先打开该字处理器才能浏览修订。在纯文本工作流程中,你可以以纯文本形式查看修订,这意味着无论手头有什么,只要该设备可以处理纯文本(大多数都可以),就可以进行编辑或批准编辑。
|
||||
|
||||
诚然,写作者通常不会考虑行号,但它对于计算机有用,并且通常是一个很好的参考点。默认情况下,Atom 为文本文档的行进行编号。按下 `Enter` 键或 `Return` 键后,一*行*就是一行。
|
||||
|
||||
![Writing in Atom][11]
|
||||
|
||||
如果(在 Atom 的)一行的行号中有一个点而不是一个数字,则表示它是上一行折叠的一部分,因为它超出了你的屏幕。
|
||||
|
||||
#### 主题
|
||||
|
||||
如果你是一个在意视觉形象的人,那么你可能会非常注重自己的写作环境。即使你使用普通的 Markdown 进行编写,也并不意味着你必须使用程序员的字体或在使你看起来像码农的黑窗口中进行书写。修改 Atom 外观的最简单方法是使用[主题包][12]。主题设计人员通常将深色主题与浅色主题区分开,因此你可以根据需要使用关键字“Dark”或“Light”进行搜索。
|
||||
|
||||
要安装主题,请选择“编辑 > 首选项”。这将在 Atom 界面中打开一个新标签页。是的,标签页可以用于处理文档*和*用于配置及控制面板。在“设置”标签页中,单击“安装”类别。
|
||||
|
||||
在“安装”面板中,搜索要安装的主题的名称。单击搜索字段右侧的“主题”按钮,以仅搜索主题。找到主题后,单击其“安装”按钮。
|
||||
|
||||
![Atom's themes][13]
|
||||
|
||||
要使用已安装的主题或根据喜好自定义主题,请导航至“设置”标签页中的“主题”类别中。从下拉菜单中选择要使用的主题。更改会立即进行,因此你可以准确了解主题如何影响你的环境。
|
||||
|
||||
你也可以在“设置”标签的“编辑器”类别中更改工作字体。Atom 默认采用等宽字体,程序员通常首选这种字体。但是你可以使用系统上的任何字体,无论是衬线字体、无衬线字体、哥特式字体还是草书字体。无论你想整天盯着什么字体都行。
|
||||
|
||||
作为相关说明,默认情况下,Atom 会在其屏幕上绘制一条垂直线,以提示编写代码的人员。程序员通常不想编写太长的代码行,因此这条垂直线会提醒他们不要写太长的代码行。不过,这条竖线对写作者而言毫无意义,你可以通过禁用 “wrap-guide” 包将其删除。
|
||||
|
||||
要禁用 “wrap-guide” 软件包,请在“设置”标签中选择“折行”类别,然后搜索 “wrap-guide”。找到该程序包后,单击其“禁用”按钮。
|
||||
|
||||
#### 动态结构
|
||||
|
||||
创建长文档时,我发现每个文件写一个章节比在一个文件中写整本书更有意义。此外,我不会以明显的语法 ` chapter-1.md` 或 `1.example.md` 来命名我的章节,而是以章节标题或关键词(例如 `example.md`)命名。为了将来为自己提供有关如何编写本书的指导,我维护了一个名为 `toc.md` (用于“目录”)的文件,其中列出了各章的(当前)顺序。
|
||||
|
||||
我这样做是因为,无论我多么相信第 6 章都不可能出现在第 1 章之前,但在我完成整本书之前,几乎难以避免我会交换一两个章节的顺序。我发现从一开始就保持动态变化可以帮助我避免重命名混乱,也可以帮助我避免僵化的结构。
|
||||
|
||||
### 在 Atom 中使用 Git
|
||||
|
||||
每位写作者的共同点是两件事:他们为流传而写作,而他们的写作是一段旅程。你不能一坐下来写作就完成了最终稿件。顾名思义,你有一个初稿。该草稿会经过修订,你会仔细地将每个修订保存一式两份或三份的备份,以防万一你的文件损坏了。最终,你得到了所谓的最终草稿,但很有可能你有一天还会回到这份最终草稿,要么恢复好的部分,要么修改坏的部分。
|
||||
|
||||
Atom 最令人兴奋的功能是其强大的 Git 集成。无需离开 Atom,你就可以与 Git 的所有主要功能进行交互,跟踪和更新项目、回滚你不喜欢的更改、集成来自协作者的更改等等。最好的学习方法就是逐步学习,因此这是在一个写作项目中从始至终在 Atom 界面中使用 Git 的方法。
|
||||
|
||||
第一件事:通过选择 “视图 > 切换 Git 标签页” 来显示 Git 面板。这将在 Atom 界面的右侧打开一个新标签页。现在没什么可看的,所以暂时保持打开状态就行。
|
||||
|
||||
#### 建立一个 Git 项目
|
||||
|
||||
你可以认为 Git 被绑定到一个文件夹。Git 目录之外的任何文件夹都不知道 Git,而 Git 也不知道外面。Git 目录中的文件夹和文件将被忽略,直到你授予 Git 权限来跟踪它们为止。
|
||||
|
||||
你可以通过在 Atom 中创建新的项目文件夹来创建 Git 项目。选择 “文件 > 添加项目文件夹”,然后在系统上创建一个新文件夹。你创建的文件夹将出现在 Atom 窗口的左侧“项目面板”中。
|
||||
|
||||
#### Git 添加文件
|
||||
|
||||
右键单击你的新项目文件夹,然后选择“新建文件”以在项目文件夹中创建一个新文件。如果你要导入文件到新项目中,请右键单击该文件夹,然后选择“在文件管理器中显示”,以在系统的文件查看器中打开该文件夹(Linux 上为 Dolphin 或 Nautilus,Mac 上为 Finder,在 Windows 上是 Explorer),然后拖放文件到你的项目文件夹。
|
||||
|
||||
在 Atom 中打开一个项目文件(你创建的空文件或导入的文件)后,单击 Git 标签中的 “<ruby>创建存储库<rt>Create Repository</rt></ruby>” 按钮。在弹出的对话框中,单击 “<ruby>初始化<rt>Init</rt></ruby>” 以将你的项目目录初始化为本地 Git 存储库。 Git 会将 `.git` 目录(在系统的文件管理器中不可见,但在 Atom 中可见)添加到项目文件夹中。不要被这个愚弄了:`.git` 目录是 Git 管理的,而不是由你管理的,因此一般你不要动它。但是在 Atom 中看到它可以很好地提醒你正在由 Git 管理的项目中工作。换句话说,当你看到 `.git` 目录时,就有了修订历史记录。
|
||||
|
||||
在你的空文件中,写一些东西。你是写作者,所以输入一些单词就行。你可以随意输入任何一组单词,但要记住上面的写作技巧。
|
||||
|
||||
按 `Ctrl + S` 保存文件,该文件将显示在 Git 标签的 “<ruby>未暂存的改变<rt>Unstaged Changes</rt></ruby>” 部分中。这意味着该文件存在于你的项目文件夹中,但尚未提交给 Git 管理。通过单击 Git 选项卡右上方的 “<ruby>暂存全部<rt>Stage All</rt></ruby>” 按钮,以允许 Git 跟踪这些文件。如果你使用过带有修订历史记录的文字处理器,则可以将此步骤视为允许 Git 记录更改。
|
||||
|
||||
#### Git 提交
|
||||
|
||||
你的文件现在已暂存。这意味着 Git 知道该文件存在,并且知道自上次 Git 知道该文件以来,该文件已被更改。
|
||||
|
||||
Git 的<ruby>提交<rt>commit</rt></ruby>会将你的文件发送到 Git 的内部和永久存档中。如果你习惯于文字处理程序,这就类似于给一个修订版命名。要创建一个提交,请在 Git 选项卡底部的“<ruby>提交<rt>Commit</rt></ruby>”消息框中输入一些描述性文本。你可能会感到含糊不清或随意写点什么,但如果你想在将来知道进行修订的原因,那么输入一些有用的信息会更有用。
|
||||
|
||||
第一次提交时,必须创建一个<ruby>分支<rt>branch</rt></ruby>。Git 分支有点像另外一个空间,它允许你从一个时间轴切换到另一个时间轴,以进行你可能想要也可能不想要永久保留的更改。如果最终喜欢该更改,则可以将一个实验分支合并到另一个实验分支,从而统一项目的不同版本。这是一个高级过程,不需要先学会,但是你仍然需要一个活动分支,因此你必须为首次提交创建一个分支。
|
||||
|
||||
单击 Git 选项卡最底部的“<ruby>分支<rt>Branch</rt></ruby>”图标,以创建新的分支。
|
||||
|
||||
![Creating a branch][14]
|
||||
|
||||
通常将第一个分支命名为 `master`,但不是必须如此;你可以将其命名为 `firstdraft` 或任何你喜欢的名称,但是遵守当地习俗有时会使谈论 Git(和查找问题的答案)变得容易一些,因为你会知道有人提到 “master” 时,它们的真正意思是“主干”而不是“初稿”或你给分支起的什么名字。
|
||||
|
||||
在某些版本的 Atom 上,UI 也许不会更新以反映你已经创建的新分支。不用担心,做了提交之后,它会创建分支(并更新 UI)。按下 “<ruby>提交<rt>Commit</rt></ruby>” 按钮,无论它显示的是 “<ruby>创建脱离的提交<rt>Create detached commit</rt></ruby>” 还是 “<ruby>提交到主干<rt>Commit to master</rt></ruby>。
|
||||
|
||||
提交后,文件的状态将永久保留在 Git 的记忆之中。
|
||||
|
||||
#### 历史记录和 Git 差异
|
||||
|
||||
一个自然而然的问题是你应该多久做一次提交。这并没有正确的答案。使用 `Ctrl + S` 保存文件和提交到 Git 是两个单独的过程,因此你会一直做这两个过程。每当你觉得自己已经做了重要的事情或打算尝试一个可能会被干掉的疯狂的新想法时,你可能都会想要做次提交。
|
||||
|
||||
要了解提交对工作流程的影响,请从测试文档中删除一些文本,然后在顶部和底部添加一些文本。再次提交。 这样做几次,直到你在 Git 标签的底部有了一小段历史记录,然后单击其中一个提交以在 Atom 中查看它。
|
||||
|
||||
![Viewing differences][15]
|
||||
|
||||
查看过去的提交时,你会看到三种元素:
|
||||
|
||||
1. 绿色文本是该提交中已被添加到文档中的内容。
|
||||
2. 红色文本是该提交中已从文档中删除的内容。
|
||||
3. 其他所有文字均未做更改。
|
||||
|
||||
#### 远程备份
|
||||
|
||||
使用 Git 的优点之一是,按照设计它是分布式的,这意味着你可以将工作提交到本地存储库,并将所做的更改推送到任意数量的服务器上进行备份。你还可以从这些服务器中拉取更改,以便你碰巧正在使用的任何设备始终具有最新更改。
|
||||
|
||||
为此,你必须在 Git 服务器上拥有一个帐户。有几种免费的托管服务,其中包括 GitHub,这个公司开发了 Atom,但奇怪的是 GitHub 不是开源的;而 GitLab 是开源的。相比私有软件,我更喜欢开源,在本示例中,我将使用 GitLab。
|
||||
|
||||
如果你还没有 GitLab 帐户,请注册一个帐户并开始一个新项目。项目名称不必与 Atom 中的项目文件夹匹配,但是如果匹配,则可能更有意义。你可以将项目保留为私有,在这种情况下,只有你和任何一个你给予了明确权限的人可以访问它,或者,如果你希望该项目可供任何互联网上偶然发现它的人使用,则可以将其公开。
|
||||
|
||||
不要将 README 文件添加到项目中。
|
||||
|
||||
创建项目后,它将为你提供有关如何设置存储库的说明。如果你决定在终端中或通过单独的 GUI 使用 Git,这是非常有用的信息,但是 Atom 的工作流程则有所不同。
|
||||
|
||||
单击 GitLab 界面右上方的 “<ruby>克隆<rt>Clone</rt></ruby>” 按钮。这显示了访问 Git 存储库必须使用的地址。复制 “SSH” 地址(而不是 “https” 地址)。
|
||||
|
||||
在 Atom 中,点击项目的 `.git` 目录,然后打开 `config` 文件。将下面这些配置行添加到该文件中,调整 `url` 值的 `seth/example.git` 部分以匹配你自己独有的地址。
|
||||
|
||||
```
|
||||
[remote "origin"]
|
||||
url = git@gitlab.com:seth/example.git
|
||||
fetch = +refs/heads/*:refs/remotes/origin/*
|
||||
[branch "master"]
|
||||
remote = origin
|
||||
merge = refs/heads/master
|
||||
```
|
||||
|
||||
在 Git 标签的底部,出现了一个新按钮,标记为 “<ruby>提取<rt>Fetch</rt></ruby>”。由于你的服务器是全新的服务器,因此没有可供你提取的数据,因此请右键单击该按钮,然后选择“<ruby>推送<rt>Push</rt></ruby>”。这会将你的更改推送到你的 GitLab 帐户,现在你的项目已备份到 Git 服务器上。
|
||||
|
||||
你可以在每次提交后将更改推送到服务器。它提供了即刻的异地备份,并且由于数据量通常很少,因此它几乎与本地保存一样快。
|
||||
|
||||
### 撰写而 Git
|
||||
|
||||
Git 是一个复杂的系统,不仅对修订跟踪和备份有用。它还支持异步协作并鼓励实验。本文介绍了一些基础知识,但还有更多关于 Git 的文章和整本的书,以及如何使用它使你的工作更高效、更具弹性和更具活力。 从使用 Git 完成小任务开始,使用的次数越多,你会发现自己提出的问题就越多,最终你将学到的技巧越多。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/19/4/write-git
|
||||
|
||||
作者:[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/sethhttps://opensource.com/users/noreplyhttps://opensource.com/users/seth
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/write-hand_0.jpg?itok=Uw5RJD03 (Writing Hand)
|
||||
[2]: https://git-scm.com/
|
||||
[3]: https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages
|
||||
[4]: http://atom.io
|
||||
[5]: https://git-scm.com/download/mac
|
||||
[6]: https://git-scm.com/download/win
|
||||
[7]: http://gnu.org/software/emacs
|
||||
[8]: https://commonmark.org/help/
|
||||
[9]: https://opensource.com/sites/default/files/uploads/atom-preview.jpg (Atom's preview screen)
|
||||
[10]: https://opensource.com/sites/default/files/uploads/atom-para.jpg (Writing in Atom)
|
||||
[11]: https://opensource.com/sites/default/files/uploads/atom-linebreak.jpg (Writing in Atom)
|
||||
[12]: https://atom.io/themes
|
||||
[13]: https://opensource.com/sites/default/files/uploads/atom-theme.jpg (Atom's themes)
|
||||
[14]: https://opensource.com/sites/default/files/uploads/atom-branch.jpg (Creating a branch)
|
||||
[15]: https://opensource.com/sites/default/files/uploads/git-diff.jpg (Viewing differences)
|
||||
[16]: mailto:git@gitlab.com
|
@ -0,0 +1,73 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (wxy)
|
||||
[#]: reviewer: (wxy)
|
||||
[#]: publisher: (wxy)
|
||||
[#]: url: (https://linux.cn/article-11461-1.html)
|
||||
[#]: subject: (Blockchain 2.0 – Introduction To Hyperledger Fabric [Part 10])
|
||||
[#]: via: (https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-fabric/)
|
||||
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||
|
||||
区块链 2.0:Hyperledger Fabric 介绍(十)
|
||||
======
|
||||
|
||||
![Hyperledger Fabric][1]
|
||||
|
||||
### Hyperledger Fabric
|
||||
|
||||
[Hyperledger 项目][2] 是一个伞形组织,包括许多正在开发的不同模块和系统。在这些子项目中,最受欢迎的是 “Hyperledger Fabric”。这篇博文将探讨一旦区块链系统开始大量使用到主流,将使 Fabric 在不久的将来成为几乎不可或缺的功能。最后,我们还将快速了解开发人员和爱好者们需要了解的有关 Hyperledger Fabric 技术的知识。
|
||||
|
||||
### 起源
|
||||
|
||||
按照 Hyperledger 项目的常规方式,Fabric 由其核心成员之一 IBM “捐赠”给该组织,而 IBM 以前是该组织的主要开发者。由 IBM 共享的这个技术平台在 Hyperledger 项目中进行了联合开发,来自 100 多个成员公司和机构为之做出了贡献。
|
||||
|
||||
目前,Fabric 正处于 LTS 版本的 v1.4,该版本已经发展很长一段时间,并且被视为企业管理业务数据的解决方案。Hyperledger 项目的核心愿景也必然会渗透到 Fabric 中。Hyperledger Fabric 系统继承了所有企业级的可扩展功能,这些功能已深深地刻入到 Hyperledger 组织旗下所有的项目当中。
|
||||
|
||||
### Hyperledger Fabric 的亮点
|
||||
|
||||
Hyperledger Fabric 提供了多种功能和标准,这些功能和标准围绕着支持快速开发和模块化体系结构的使命而构建。此外,与竞争对手(主要是瑞波和[以太坊][3])相比,Fabric 明确用于封闭和[许可区块链][4]。它们的核心目标是开发一套工具,这些工具将帮助区块链开发人员创建定制的解决方案,而不是创建独立的生态系统或产品。
|
||||
|
||||
Hyperledger Fabric 的一些亮点如下:
|
||||
|
||||
#### 许可区块链系统
|
||||
|
||||
这是一个 Hyperledger Fabric 与其他平台(如以太坊和瑞波)差异很大的地方。默认情况下,Fabric 是一种旨在实现私有许可的区块链的工具。此类区块链不能被所有人访问,并且其中致力于达成共识或验证交易的节点将由中央机构进行选择。这对于某些应用(例如银行和保险)可能很重要,在这些应用中,交易必须由中央机构而不是参与者来验证。
|
||||
|
||||
#### 机密和受控的信息流
|
||||
|
||||
Fabric 内置了权限系统,该权限系统将视情况限制特定组或某些个人中的信息流。与公有区块链不同,在公有区块链中,任何运行节点的人都可以对存储在区块链中的数据进行复制和选择性访问,而 Fabric 系统的管理员可以选择谁能访问共享的信息,以及访问的方式。与现有竞争产品相比,它还有以更好的安全性标准对存储的数据进行加密的子系统。
|
||||
|
||||
#### 即插即用架构
|
||||
|
||||
Hyperledger Fabric 具有即插即用类型的体系结构。可以选择实施系统的各个组件,而开发人员看不到用处的系统组件可能会被废弃。Fabric 采取高度模块化和可定制的方式进行开发,而不是一种与其竞争对手采用的“一种方法适应所有需求”的方式。对于希望快速构建精益系统的公司和公司而言,这尤其有吸引力。这与 Fabric 和其它 Hyperledger 组件的互操作性相结合,意味着开发人员和设计人员现在可以使用各种标准化工具,而不必从其他来源提取代码并随后进行集成。它还提供了一种相当可靠的方式来构建健壮的模块化系统。
|
||||
|
||||
#### 智能合约和链码
|
||||
|
||||
运行在区块链上的分布式应用程序称为[智能合约][5]。虽然智能合约这个术语或多或少与以太坊平台相关联,但<ruby>链码<rt>chaincode</rt></ruby>是 Hyperledger 阵营中为其赋予的名称。链码应用程序除了拥有 DApp 中有的所有优点之外,使 Hyperledger 与众不同的是,该应用程序的代码可以用多种高级编程语言编写。它本身支持 [Go][6] 和 JavaScript,并且在与适当的编译器模块集成后还支持许多其它编程语言。尽管这一事实在此时可能并不代表什么,但这意味着,如果可以将现有人才用于正在进行的涉及区块链的项目,从长远来看,这有可能为公司节省数十亿美元的人员培训和管理费用。开发人员可以使用自己喜欢的语言进行编码,从而在 Hyperledger Fabric 上开始构建应用程序,而无需学习或培训平台特定的语言和语法。这提供了 Hyperledger Fabric 当前竞争对手无法提供的灵活性。
|
||||
|
||||
### 总结
|
||||
|
||||
* Hyperledger Fabric 是一个后端驱动程序平台,是一个主要针对需要区块链或其它分布式账本技术的集成项目。因此,除了次要的脚本功能外,它不提供任何面向用户的服务。(认可以为它更像是一种脚本语言。)
|
||||
* Hyperledger Fabric 支持针对特定用例构建侧链。如果开发人员希望将一组用户或参与者隔离到应用程序的特定部分或功能,则可以通过侧链来实现。侧链是衍生自主要父代的区块链,但在其初始块之后形成不同的链。产生新链的块将不受新链进一步变化的影响,即使将新信息添加到原始链中,新链也将保持不变。此功能将有助于扩展正在开发的平台,并引入用户特定的和案例特定的处理功能。
|
||||
* 前面的功能还意味着并非所有用户都会像通常对公有链所期望的那样拥有区块链中所有数据的“精确”副本。参与节点将具有仅与之相关的数据副本。例如,假设有一个类似于印度的 PayTM 的应用程序,该应用程序具有钱包功能以及电子商务功能。但是,并非所有的钱包用户都使用 PayTM 在线购物。在这种情况下,只有活跃的购物者将在 PayTM 电子商务网站上拥有相应的交易链,而钱包用户将仅拥有存储钱包交易的链的副本。这种灵活的数据存储和检索体系结构在扩展时非常重要,因为大量的单链区块链已经显示出会增加处理交易的前置时间。这样可以保持链的精简和分类。
|
||||
|
||||
我们将在以后的文章中详细介绍 Hyperledger Project 下的其他模块。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-fabric/
|
||||
|
||||
作者:[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/05/Hyperledger-Fabric-720x340.png
|
||||
[2]: https://www.ostechnix.com/blockchain-2-0-an-introduction-to-hyperledger-project-hlp/
|
||||
[3]: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/
|
||||
[4]: https://www.ostechnix.com/blockchain-2-0-public-vs-private-blockchain-comparison/
|
||||
[5]: https://www.ostechnix.com/blockchain-2-0-explaining-smart-contracts-and-its-types/
|
||||
[6]: https://www.ostechnix.com/install-go-language-linux/
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user