mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-02-03 23:40:14 +08:00
commit
7b392220a4
13
.travis.yml
13
.travis.yml
@ -1,18 +1,27 @@
|
|||||||
language: c
|
language: minimal
|
||||||
|
install:
|
||||||
|
- sudo apt-get install jq
|
||||||
|
- git clone --depth=1 -b gh-pages https://github.com/LCTT/TranslateProject/ build && rm -rf build/.git
|
||||||
script:
|
script:
|
||||||
- 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then sh ./scripts/check.sh; fi'
|
- 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then sh ./scripts/check.sh; fi'
|
||||||
- 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then sh ./scripts/badge.sh; fi'
|
- 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then sh ./scripts/badge.sh; fi'
|
||||||
|
- 'if [ "$TRAVIS_EVENT_TYPE" = "cron" ]; then sh ./scripts/status.sh; fi'
|
||||||
|
|
||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
# - status
|
||||||
except:
|
except:
|
||||||
- gh-pages
|
- gh-pages
|
||||||
git:
|
git:
|
||||||
submodules: false
|
submodules: false
|
||||||
|
depth: false
|
||||||
deploy:
|
deploy:
|
||||||
provider: pages
|
provider: pages
|
||||||
skip_cleanup: true
|
skip_cleanup: true
|
||||||
github_token: $GITHUB_TOKEN
|
github_token: $GITHUB_TOKEN
|
||||||
local_dir: build
|
local_dir: build
|
||||||
on:
|
on:
|
||||||
branch: master
|
branch:
|
||||||
|
- master
|
||||||
|
# - status
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
# Linux中国翻译规范
|
|
||||||
1. 翻译中出现的专有名词,可参见Dict.md中的翻译。
|
|
||||||
2. 英文人名,如无中文对应译名,一般不译。
|
|
||||||
2. 缩写词,一般不须翻译,可考虑旁注中文全名。
|
|
108
README.md
108
README.md
@ -1,8 +1,8 @@
|
|||||||
|
|
||||||
![待翻译](https://lctt.github.io/TranslateProject/badge/sources.svg)
|
[![待翻译](https://lctt.github.io/TranslateProject/badge/sources.svg)](https://lctt.github.io/new)
|
||||||
![翻译中](https://lctt.github.io/TranslateProject/badge/translating.svg)
|
[![翻译中](https://lctt.github.io/TranslateProject/badge/translating.svg)](https://lctt.github.io/translating)
|
||||||
![待校正](https://lctt.github.io/TranslateProject/badge/translated.svg)
|
[![待校正](https://lctt.github.io/TranslateProject/badge/translated.svg)](https://github.com/LCTT/TranslateProject/tree/master/translated)
|
||||||
![已发布](https://lctt.github.io/TranslateProject/badge/published.svg)
|
[![已发布](https://lctt.github.io/TranslateProject/badge/published.svg)](https://github.com/LCTT/TranslateProject/tree/master/published)
|
||||||
|
|
||||||
[![Travis](https://img.shields.io/travis/LCTT/TranslateProject.svg)](https://travis-ci.com/LCTT/TranslateProject)
|
[![Travis](https://img.shields.io/travis/LCTT/TranslateProject.svg)](https://travis-ci.com/LCTT/TranslateProject)
|
||||||
[![GitHub contributors](https://img.shields.io/github/contributors/LCTT/TranslateProject.svg)](https://github.com/LCTT/TranslateProject/graphs/contributors)
|
[![GitHub contributors](https://img.shields.io/github/contributors/LCTT/TranslateProject.svg)](https://github.com/LCTT/TranslateProject/graphs/contributors)
|
||||||
@ -11,34 +11,30 @@
|
|||||||
简介
|
简介
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
[LCTT](https://linux.cn/lctt/) 是“Linux中国”([https://linux.cn/](https://linux.cn/))的翻译组,负责从国外优秀媒体翻译 Linux 相关的技术、资讯、杂文等内容。
|
[LCTT](https://linux.cn/lctt/) 是“Linux 中国”([https://linux.cn/](https://linux.cn/))的翻译组,负责从国外优秀媒体翻译 Linux 相关的技术、资讯、杂文等内容。
|
||||||
|
|
||||||
LCTT 已经拥有几百名活跃成员,并欢迎更多的 Linux 志愿者加入我们的团队。
|
LCTT 已经拥有几百名活跃成员,并欢迎更多的 Linux 志愿者加入我们的团队。
|
||||||
|
|
||||||
![logo](https://linux.cn/static/image/common/lctt_logo.png)
|
![LCTT](https://lctt.github.io/wiki/images/lctt_logo.png)
|
||||||
|
|
||||||
LCTT 的组成
|
- LCTT 官网: [https://linux.cn/lctt/](https://linux.cn/lctt/)
|
||||||
-------------------------------
|
- LCTT 状态: [https://lctt.github.io/](https://lctt.github.io/)
|
||||||
|
|
||||||
**选题**,负责选择合适的内容,并将原文转换为 markdown 格式,提交到 LCTT 的 [TranslateProject](https://github.com/LCTT/TranslateProject) 库中。
|
|
||||||
|
|
||||||
**译者**,负责从选题中选择内容进行翻译。
|
|
||||||
|
|
||||||
**校对**,负责将初译的文章进行文字润色、技术校对等工作。
|
|
||||||
|
|
||||||
**发布**,负责将校对后的文章,排版进行发布。
|
|
||||||
|
|
||||||
加入我们
|
加入我们
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
请首先加入翻译组的 QQ 群,群号是:198889102,加群时请说明是“志愿者”。加入后记得修改您的群名片为您的 GitHub 的 ID。
|
请首先加入翻译组的 QQ 群,群号是:**198889102**,加群时请说明是“*志愿者*”。
|
||||||
|
|
||||||
加入的成员,请先阅读 [WIKI 如何开始](https://github.com/LCTT/TranslateProject/wiki/01-如何开始)。
|
加入的成员,请:
|
||||||
|
|
||||||
|
1. 修改你的 QQ 群名片为“译者-您的_GitHub_ID”。
|
||||||
|
2. 阅读 [WIKI](https://lctt.github.io/wiki) 了解如何开始。
|
||||||
|
3. 遇到不解之处,请在群内发问。
|
||||||
|
|
||||||
如何开始
|
如何开始
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
请阅读 [WIKI](https://github.com/LCTT/TranslateProject/wiki)。
|
请阅读 [WIKI](https://lctt.github.io/wiki)。如需要协助,请在群内发问。
|
||||||
|
|
||||||
历史
|
历史
|
||||||
-------------------------------
|
-------------------------------
|
||||||
@ -79,44 +75,52 @@ LCTT 的组成
|
|||||||
* 2018/08/17 提升 pityonline 为核心成员,担任校对,并接受他的建议采用 PR 审核模式。
|
* 2018/08/17 提升 pityonline 为核心成员,担任校对,并接受他的建议采用 PR 审核模式。
|
||||||
* 2018/09/10 [LCTT 五周年](https://linux.cn/article-9999-1.html)。
|
* 2018/09/10 [LCTT 五周年](https://linux.cn/article-9999-1.html)。
|
||||||
* 2018/10/25 重构了 CI,感谢 vizv、lujun9972、bestony。
|
* 2018/10/25 重构了 CI,感谢 vizv、lujun9972、bestony。
|
||||||
|
* 2018/11/13 [成立了项目管理委员会(PMC)](https://linux.cn/article-10279-1.html),初始成员为:@wxy (主席)、@oska874、@lujun9972、@bestony、@pityonline、@geekpi、@qhwdw。
|
||||||
|
|
||||||
核心成员
|
|
||||||
|
项目管理委员及核心成员
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
|
LCTT 现由项目管理委员会(PMC)进行管理,成员如下:
|
||||||
|
|
||||||
|
- 🎩 主席 @wxy
|
||||||
|
- 🎩 选题 @oska874
|
||||||
|
- 🎩 选题 @lujun9972
|
||||||
|
- 🎩 技术 @bestony
|
||||||
|
- 🎩 校对 @pityonline
|
||||||
|
- 🎩 译者 @geekpi
|
||||||
|
- 🎩 译者 @qhwdw
|
||||||
|
|
||||||
目前 LCTT 核心成员有:
|
目前 LCTT 核心成员有:
|
||||||
|
|
||||||
- 组长 @wxy,
|
- ❤️ 核心成员 @vizv
|
||||||
- 选题 @oska874,
|
- ❤️ 核心成员 @zpl1025
|
||||||
- 选题 @lujun9972,
|
- ❤️ 核心成员 @runningwater
|
||||||
- 技术 @bestony,
|
- ❤️ 核心成员 @FSSlc
|
||||||
- 校对 @jasminepeng,
|
- ❤️ 核心成员 @Vic020
|
||||||
- 校对 @pityonline,
|
- ❤️ 核心成员 @alim0x
|
||||||
- 钻石译者 @geekpi,
|
- ❤️ 核心成员 @martin2011qi
|
||||||
- 钻石译者 @qhwdw,
|
- ❤️ 核心成员 @Locez
|
||||||
- 钻石译者 @GOLinux,
|
- ❤️ 核心成员 @ucasFL
|
||||||
- 核心成员 @GHLandy,
|
- ❤️ 核心成员 @MjSeven
|
||||||
- 核心成员 @martin2011qi,
|
|
||||||
- 核心成员 @ictlyh,
|
曾经做出了巨大贡献的核心成员,被列入荣誉榜:
|
||||||
- 核心成员 @strugglingyouth,
|
|
||||||
- 核心成员 @FSSlc,
|
- 🏆 前任选题 @DeadFire
|
||||||
- 核心成员 @zpl1025,
|
- 🏆 前任校对 @reinoir222
|
||||||
- 核心成员 @runningwater,
|
- 🏆 前任校对 @PurlingNayuki
|
||||||
- 核心成员 @bazz2,
|
- 🏆 前任校对 @carolinewuyan
|
||||||
- 核心成员 @Vic020,
|
- 🏆 前任校对 @jasminepeng
|
||||||
- 核心成员 @alim0x,
|
- 🏆 功勋成员 @tinyeyeser
|
||||||
- 核心成员 @tinyeyeser,
|
- 🏆 功勋成员 @vito-L
|
||||||
- 核心成员 @Locez,
|
- 🏆 功勋成员 @willqian
|
||||||
- 核心成员 @ucasFL,
|
- 🏆 功勋成员 @GOLinux
|
||||||
- 核心成员 @rusking,
|
- 🏆 功勋成员 @bazz2
|
||||||
- 核心成员 @MjSeven
|
- 🏆 功勋成员 @ictlyh
|
||||||
- 前任选题 @DeadFire,
|
- 🏆 功勋成员 @dongfengweixiao
|
||||||
- 前任校对 @reinoir222,
|
- 🏆 功勋成员 @strugglingyouth
|
||||||
- 前任校对 @PurlingNayuki,
|
- 🏆 功勋成员 @GHLandy
|
||||||
- 前任校对 @carolinewuyan,
|
- 🏆 功勋成员 @rusking
|
||||||
- 功勋成员 @vito-L,
|
|
||||||
- 功勋成员 @willqian,
|
|
||||||
- 功勋成员 @vizv,
|
|
||||||
- 功勋成员 @dongfengweixiao,
|
|
||||||
|
|
||||||
全部成员列表请参见: https://linux.cn/lctt-list/ 。
|
全部成员列表请参见: https://linux.cn/lctt-list/ 。
|
||||||
|
|
||||||
|
77
published/201309/20190204 7 Best VPN Services For 2019.md
Normal file
77
published/201309/20190204 7 Best VPN Services For 2019.md
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (Modrisco)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-10691-1.html)
|
||||||
|
[#]: subject: (7 Best VPN Services For 2019)
|
||||||
|
[#]: via: (https://www.ostechnix.com/7-best-opensource-vpn-services-for-2019/)
|
||||||
|
[#]: author: (Editor https://www.ostechnix.com/author/editor/)
|
||||||
|
|
||||||
|
2019 年最好的 7 款虚拟私人网络服务
|
||||||
|
======
|
||||||
|
|
||||||
|
在过去三年中,全球至少有 67% 的企业面临着数据泄露,亿万用户受到影响。研究表明,如果事先对数据安全采取最基本的保护措施,那么预计有 93% 的安全问题是可以避免的。
|
||||||
|
|
||||||
|
糟糕的数据安全会带来极大的代价,特别是对企业而言。它会大致大规模的破坏并影响你的品牌声誉。尽管有些企业可以艰难地收拾残局,但仍有一些企业无法从事故中完全恢复。不过现在,你很幸运地可以得到数据及网络安全软件。
|
||||||
|
|
||||||
|
![](https://www.ostechnix.com/wp-content/uploads/2019/02/vpn-1.jpeg)
|
||||||
|
|
||||||
|
到了 2019 年,你可以通过**虚拟私人网络**,也就是我们熟知的 **VPN** 来保护你免受网络攻击。当涉及到在线隐私和安全时,常常存在许多不确定因素。有数百个不同的 VPN 提供商,选择合适的供应商也同时意味着在定价、服务和易用性之间谋取恰当的平衡。
|
||||||
|
|
||||||
|
如果你正在寻找一个可靠的 100% 经过测试和安全的 VPN,你可能需要进行详尽的调查并作出最佳选择。这里为你提供在 2019 年 7 款最好用并经过测试的 VPN 服务。
|
||||||
|
|
||||||
|
### 1、Vpnunlimitedapp
|
||||||
|
|
||||||
|
通过 VPN Unlimited,你的数据安全将得到全面的保障。此 VPN 允许你连接任何 WiFi ,而无需担心你的个人数据可能被泄露。你的数据通过 AES-256 算法加密,保护你不受第三方和黑客的窥探。无论你身处何处,这款 VPN 都可确保你在所有网站上保持匿名且不受跟踪。它提供 7 天的免费试用和多种协议支持:openvpn、IKEv2 和 KeepSolidWise。有特殊需求的用户会获得特殊的额外服务,如个人服务器、终身 VPN 订阅和个人 IP 选项。
|
||||||
|
|
||||||
|
### 2、VPN Lite
|
||||||
|
|
||||||
|
VPN Lite 是一款易于使用而且**免费**的用于上网的 VPN 服务。你可以通过它在网络上保持匿名并保护你的个人隐私。它会模糊你的 IP 并加密你的数据,这意味着第三方无法跟踪你的所有线上活动。你还可以访问网络上的全部内容。使用 VPN Lite,你可以访问在被拦截的网站。你还放心地可以访问公共 WiFi 而不必担心敏感信息被间谍软件窃取和来自黑客的跟踪和攻击。
|
||||||
|
|
||||||
|
### 3、HotSpot Shield
|
||||||
|
|
||||||
|
这是一款在 2005 年推出的大受欢迎的 VPN。这套 VPN 协议至少被全球 70% 的数据安全公司所集成,并在全球有数千台服务器。它提供两种免费模式:一种为完全免费,但会有线上广告;另一种则为七天试用。它提供军事级的数据加密和恶意软件防护。HotSpot Shield 保证网络安全并保证高速网络。
|
||||||
|
|
||||||
|
### 4、TunnelBear
|
||||||
|
|
||||||
|
如果你是一名 VPN 新手,那么 TunnelBear 将是你的最佳选择。它带有一个用户友好的界面,并配有动画熊引导。你可以在 TunnelBear 的帮助下以极快的速度连接至少 22 个国家的服务器。它使用 **AES 256-bit** 加密算法,保证无日志记录,这意味着你的数据将得到保护。你还可以在最多五台设备上获得无限流量。
|
||||||
|
|
||||||
|
### 5、ProtonVPN
|
||||||
|
|
||||||
|
这款 VPN 为你提供强大的优质服务。你的连接速度可能会受到影响,但你也可以享受到无限流量。它具有易于使用的用户界面,提供多平台兼容。 ProtonVPN 的服务据说是因为为种子下载提供了优化因而无法访问 Netflix。你可以获得如协议和加密等安全功能来保证你的网络安全。
|
||||||
|
|
||||||
|
### 6、ExpressVPN
|
||||||
|
|
||||||
|
ExpressVPN 被认为是最好的用于接触封锁和保护隐私的离岸 VPN。凭借强大的客户支持和快速的速度,它已成为全球顶尖的 VPN 服务。它提供带有浏览器扩展和自定义固件的路由。 ExpressVPN 拥有一系列令人赞叹高质量应用程序,配有大量的服务器,并且最多只能支持三台设备。
|
||||||
|
|
||||||
|
ExpressVPN 并不是完全免费的,恰恰相反,正是由于它所提供的高质量服务而使之成为了市场上最贵的 VPN 之一。ExpressVPN 有 30 天内退款保证,因此你可以免费试用一个月。好消息是,这是完全没有风险的。例如,如果你在短时间内需要 VPN 来绕过在线审查,这可能是你的首选解决方案。用过它之后,你就不会随意想给一个会发送垃圾邮件、缓慢的免费的程序当成试验品。
|
||||||
|
|
||||||
|
ExpressVPN 也是享受在线流媒体和户外安全的最佳方式之一。如果你需要继续使用它,你只需要续订或取消你的免费试用。ExpressVPN 在 90 多个国家架设有 2000 多台服务器,可以解锁 Netflix,提供快速连接,并为用户提供完全隐私。
|
||||||
|
|
||||||
|
### 7、PureVPN
|
||||||
|
|
||||||
|
虽然 PureVPN 可能不是完全免费的,但它却是此列表中最实惠的一个。用户可以注册获得 7 天的免费试用,并在之后选择任一付费计划。通过这款 VPN,你可以访问到至少 140 个国家中的 750 余台服务器。它还可以在几乎所有设备上轻松安装。它的所有付费特性仍然可以在免费试用期间使用。包括无限数据流量、IP 泄漏保护和 ISP 不可见性。它支持的系统有 iOS、Android、Windows、Linux 和 macOS。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
如今,可用的免费 VPN 服务越来越多,为什么不抓住这个机会来保护你自己和你的客户呢?在了解到有那么多优秀的 VPN 服务后,我们知道即使是最安全的免费服务也不一定就完全没有风险。你可能需要付费升级到高级版以增强保护。高级版的 VPN 为你提供了免费试用,提供无风险退款保证。无论你打算花钱购买 VPN 还是准备使用免费 VPN,我们都强烈建议你使用一个。
|
||||||
|
|
||||||
|
**关于作者:**
|
||||||
|
|
||||||
|
**Renetta K. Molina** 是一个技术爱好者和健身爱好者。她撰写有关技术、应用程序、 WordPress 和其他任何领域的文章。她喜欢在空余时间打高尔夫球和读书。她喜欢学习和尝试新事物。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.ostechnix.com/7-best-opensource-vpn-services-for-2019/
|
||||||
|
|
||||||
|
作者:[Editor][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[Modrisco](https://github.com/Modrisco)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.ostechnix.com/author/editor/
|
||||||
|
[b]: https://github.com/lujun9972
|
@ -0,0 +1,191 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (geekpi)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-11066-1.html)
|
||||||
|
[#]: subject: (How To Find The Port Number Of A Service In Linux)
|
||||||
|
[#]: via: (https://www.ostechnix.com/how-to-find-the-port-number-of-a-service-in-linux/)
|
||||||
|
[#]: author: (sk https://www.ostechnix.com/author/sk/)
|
||||||
|
|
||||||
|
如何在 Linux 中查找服务的端口号
|
||||||
|
======
|
||||||
|
|
||||||
|
![Find The Port Number Of A Service In Linux OS][1]
|
||||||
|
|
||||||
|
由于某些原因,你可能经常需要查找端口名称和端口号。如果是这样,你很幸运。今天,在这个简短的教程中,我们将看到在 Linux 系统中最简单、最快捷的查找服务端口号的方法。可能有很多方法可以做到,但我目前只知道以下三种方法。请继续阅读。
|
||||||
|
|
||||||
|
### 在 Linux 中查找服务的端口号
|
||||||
|
|
||||||
|
#### 方法1:使用 grep 命令
|
||||||
|
|
||||||
|
要使用 `grep` 命令在 Linux 中查找指定服务的默认端口号,只需运行:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ grep <port> /etc/services
|
||||||
|
```
|
||||||
|
|
||||||
|
例如,要查找 SSH 服务的默认端口,只需运行:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ grep ssh /etc/services
|
||||||
|
```
|
||||||
|
|
||||||
|
就这么简单。此命令应该适用于大多数 Linux 发行版。以下是我的 Arch Linux 测试机中的示例输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
ssh 22/tcp
|
||||||
|
ssh 22/udp
|
||||||
|
ssh 22/sctp
|
||||||
|
sshell 614/tcp
|
||||||
|
sshell 614/udp
|
||||||
|
netconf-ssh 830/tcp
|
||||||
|
netconf-ssh 830/udp
|
||||||
|
sdo-ssh 3897/tcp
|
||||||
|
sdo-ssh 3897/udp
|
||||||
|
netconf-ch-ssh 4334/tcp
|
||||||
|
snmpssh 5161/tcp
|
||||||
|
snmpssh-trap 5162/tcp
|
||||||
|
tl1-ssh 6252/tcp
|
||||||
|
tl1-ssh 6252/udp
|
||||||
|
ssh-mgmt 17235/tcp
|
||||||
|
ssh-mgmt 17235/udp
|
||||||
|
```
|
||||||
|
|
||||||
|
正如你在上面的输出中所看到的,SSH 服务的默认端口号是 22。
|
||||||
|
|
||||||
|
让我们找到 Apache Web 服务器的端口号。为此,命令是:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ grep http /etc/services
|
||||||
|
# http://www.iana.org/assignments/port-numbers
|
||||||
|
http 80/tcp www www-http # WorldWideWeb HTTP
|
||||||
|
http 80/udp www www-http # HyperText Transfer Protocol
|
||||||
|
http 80/sctp # HyperText Transfer Protocol
|
||||||
|
https 443/tcp # http protocol over TLS/SSL
|
||||||
|
https 443/udp # http protocol over TLS/SSL
|
||||||
|
https 443/sctp # http protocol over TLS/SSL
|
||||||
|
gss-http 488/tcp
|
||||||
|
gss-http 488/udp
|
||||||
|
webcache 8080/tcp http-alt # WWW caching service
|
||||||
|
webcache 8080/udp http-alt # WWW caching service
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
FTP 端口号是什么?这很简单!
|
||||||
|
|
||||||
|
```
|
||||||
|
$ grep ftp /etc/services
|
||||||
|
ftp-data 20/tcp
|
||||||
|
ftp-data 20/udp
|
||||||
|
# 21 is registered to ftp, but also used by fsp
|
||||||
|
ftp 21/tcp
|
||||||
|
ftp 21/udp fsp fspd
|
||||||
|
tftp 69/tcp
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方法 2:使用 getent 命令
|
||||||
|
|
||||||
|
如你所见,上面的命令显示指定搜索词 “ssh”、“http” 和 “ftp” 的所有端口名称和数字。这意味着,你将获得与给定搜索词匹配的所有端口名称的相当长的输出。
|
||||||
|
|
||||||
|
但是,你可以使用 `getent` 命令精确输出结果,如下所示:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ getent services ssh
|
||||||
|
ssh 22/tcp
|
||||||
|
|
||||||
|
$ getent services http
|
||||||
|
http 80/tcp www www-http
|
||||||
|
|
||||||
|
$ getent services ftp
|
||||||
|
ftp 21/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你不知道端口名称,但是知道端口号,那么你只需将端口名称替换为数字:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ getent services 80
|
||||||
|
http 80/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
要显示所有端口名称和端口号,只需运行:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ getent services
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方法 3:使用 Whatportis 程序
|
||||||
|
|
||||||
|
Whatportis 是一个简单的 Python 脚本,来用于查找端口名称和端口号。与上述命令不同,此程序以漂亮的表格形式输出。
|
||||||
|
|
||||||
|
确保已安装 pip 包管理器。如果没有,请参考以下链接。
|
||||||
|
|
||||||
|
- [如何使用 pip 管理 Python 包][6]
|
||||||
|
|
||||||
|
安装 pip 后,运行以下命令安装 Whatportis 程序。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pip install whatportis
|
||||||
|
```
|
||||||
|
|
||||||
|
现在,你可以找到与服务关联的端口,如下所示。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ whatportis ssh
|
||||||
|
|
||||||
|
$ whatportis ftp
|
||||||
|
|
||||||
|
$ whatportis http
|
||||||
|
```
|
||||||
|
|
||||||
|
我的 CentOS 7 服务器的示例输出:
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
*在 Linux 中查找服务的端口号*
|
||||||
|
|
||||||
|
如果你不知道服务的确切名称,请使用 `–like` 标志来显示相关结果。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ whatportis mysql --like
|
||||||
|
```
|
||||||
|
|
||||||
|
上述命令帮助你查找与服务关联的端口。你还可以找到与端口号相关联的服务,如下所示。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ whatportis 993
|
||||||
|
```
|
||||||
|
|
||||||
|
你甚至可以以 JSON 格式显示结果。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ whatportis 993 --json
|
||||||
|
```
|
||||||
|
|
||||||
|
![][8]
|
||||||
|
|
||||||
|
有关更多详细信息,请参阅 GitHub 仓库。
|
||||||
|
|
||||||
|
* [Whatportis GitHub 仓库][9]
|
||||||
|
|
||||||
|
就是这些了。你现在知道了如何使用三种简单方法在 Linux 中查找端口名称和端口号。如果你知道任何其他方法/命令,请在下面的评论栏告诉我。我会查看并更相应地更新本指南。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.ostechnix.com/how-to-find-the-port-number-of-a-service-in-linux/
|
||||||
|
|
||||||
|
作者:[sk][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.ostechnix.com/author/sk/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.ostechnix.com/wp-content/uploads/2018/06/Find-The-Port-Number-720x340.png
|
||||||
|
[2]: https://www.ostechnix.com/the-grep-command-tutorial-with-examples-for-beginners/
|
||||||
|
[6]: https://www.ostechnix.com/manage-python-packages-using-pip/
|
||||||
|
[7]: https://www.ostechnix.com/wp-content/uploads/2018/06/whatportis.png
|
||||||
|
[8]: https://www.ostechnix.com/wp-content/uploads/2018/06/whatportis-1.png
|
||||||
|
[9]: https://github.com/ncrocfer/whatportis
|
1208
published/20180629 100 Best Ubuntu Apps.md
Normal file
1208
published/20180629 100 Best Ubuntu Apps.md
Normal file
File diff suppressed because it is too large
Load Diff
179
published/20180902 Learning BASIC Like It-s 1983.md
Normal file
179
published/20180902 Learning BASIC Like It-s 1983.md
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
穿越到 1983 年学习 BASIC
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/201907/12/125743p495dqnqdtctqzgp.jpg)
|
||||||
|
|
||||||
|
1983 年时我还没出生,这让我略有一些遗憾。但我特别遗憾的是,是我没有经历过 8 位计算机时代的到来,因为我认为那些初次接触到还相对简单和受限的计算机的人们,拥有超过如今的我们的巨大优势。
|
||||||
|
|
||||||
|
今天,(几乎)每个人知道如何使用计算机,但是即使是在计算机行业当中,也很少有人能明白任何一台计算机内部的所有内容。现在软件分为[如此多的层次][1],做的是如此不同的事情,没有哪个人能知道哪些是必不可少的。而在 1983 年,家用电脑足够傻大粗,努力一些的人就能了解到一台特定的计算机是如何工作的。那样的一个人可能不会像今天的我觉得操作系统那么神秘,因为如今的操作系统已经在硬件上叠加了太多的抽象层。我希望这些抽象层逐一引入以易于理解;而今天,新的程序员们不得不自上而下、按时间回溯地尝试理解它们。
|
||||||
|
|
||||||
|
很多著名的程序员,尤其在计算机游戏行业,孩童时期就在苹果 II 和 Commodore 64 这样的 8 位计算机上开始编写游戏,John Romero、Richard Garriott 和 Chris Roberts 都是这样的例子。这好理解。在 8 位计算机时代,很多游戏只能在计算机杂志和[书籍][2]中以印刷的 BASIC 程序清单方式得到。如果你想玩其中一款游戏,就必须手工键入整个程序。不可避免的,你可能遇到一些问题,所以你就得调试你的程序。等到你让它可以工作起来了,你就已经对程序是如何运行的有了足够的了解,你就可以开始自己修改它了。如果你是一个狂热的游戏玩家,你几乎必然会成为一名优秀的程序员。
|
||||||
|
|
||||||
|
在我的童年时期我也玩电脑游戏。但是我玩的游戏是在 CD-ROM 上的。我有时发现我自己必须得搜索一下如何修复崩溃的安装程序,这可能涉及编辑 Windows 注册表之类的东西。可能是这种小故障的排除让我感觉很棒,所以我才考虑在大学里学习计算机科学。但是在大学中从不教我一些计算机如何工作的或如何控制它们的关键性的东西。
|
||||||
|
|
||||||
|
当然,现在我可以告诉计算机去干什么。尽管如此,我还是不禁感到,我缺少一些根本的见解 —— 只有那些伴随着更简单的计算机编程而成长的人才有的深刻见解。我不禁在想,如果在上世纪 80 年代初就接触到计算机会是什么样子?它们与今天使用计算机的体验相比有何不同?
|
||||||
|
|
||||||
|
这篇文章将与通常的 Two-Bit History 的文章有一点不同,因为我将为这些问题尝试设想一个答案。
|
||||||
|
|
||||||
|
### 1983
|
||||||
|
|
||||||
|
就在上周,你在电视上看到了 [Commodore 64 的广告][3] ,现在 M\*A\*S\*H 播完了(LCTT 译注: 这是一部上世纪 70 年代初的电视剧),星期一晚上你可以找点新的事情做了。这个 Commodore 64 甚至看起来比鲁迪(LCTT 译注:应该是下文中拥有 Apple II 的人)的家人放在他们家地下室的 Apple II 更好。而且,广告中吹嘘说新的计算机会让你的朋友们“挤破”你家的大门。你知道学校里的几个家伙宁愿在你家闲逛,也不愿去鲁迪家里,只要他们能玩 Zork 就行。
|
||||||
|
|
||||||
|
所以,你得说服你的父母去买一台。你的母亲说,这事可以考虑,只要你不去游戏厅玩街机就给你买一台家庭电脑。虽然不太情愿,但是你还是同意了。而你的父亲则想,他可以用 MultiPlan (LCTT 译注:电子表格程序)跟踪家庭的资金状况,MultiPlan 是他曾听说过的一个电子表格程序,这就是为什么这台计算机被放在客厅的原因。然而,一年后,你仍然是唯一使用它的人。最终,他们同意你把它搬到了你的卧室的桌子上,正好位于你的警察海报下方。
|
||||||
|
|
||||||
|
(你的姐姐对这个决定表示抗议,但是,在 1983 年电脑这种东西[并不适合女孩][4]。)
|
||||||
|
|
||||||
|
你的父亲在下班路上从 [ComputerLand][5] 那里把它捎了回来。你俩把盒子放置在电视机的旁边,并打开了它。外包装上说“欢迎来到友好的计算机世界”。而二十分钟以后你就不再信这句话了 —— 你俩仍然在尝试把 Commodore 连接到电视机上,并在想电视机的天线电缆到底是 75 欧姆还是 300 欧姆的同轴电缆。但是,最终你把电视机调到了频道 3,看到了一个颗粒状的、紫色的图像。
|
||||||
|
|
||||||
|
![Commodore 64 启动屏幕][6]
|
||||||
|
|
||||||
|
计算机显示了一个 `READY`。你的爸爸把计算机推向了你,这意思是你是第一个尝试它的人。你小心翼翼地敲击每个字母,键入了 `HELLO`。然而计算机的回应是令人困惑的。
|
||||||
|
|
||||||
|
![Commodore 64 语法错误][7]
|
||||||
|
|
||||||
|
你尝试输入了一些稍有不同的单词,然而回应总是一样的。你父亲说,你最好仔细读一下手册的其它部分。这绝非易事,[随 Commodore 64 一起提供的手册][8] 是一本小一些的书。但是这不会困住你,因为手册的介绍预示着奇迹。
|
||||||
|
|
||||||
|
它声称,Commodore 64 有“微型计算机行业中最先进的图画制作器”,能允许“你设计拥有四种不同颜色的图画,就像你在街机视频游戏里看到的一样”。Commodore 64 也有“内置的音乐和声音效果,可以与很多著名的音乐合成器相媲美”。所有的这些工具都置身于你的手边,手册会引导你完成所有这些:
|
||||||
|
|
||||||
|
> 与所有提供的硬件一样重要的是,这本用户指南将提高你对计算机的理解。它无法在这里告诉你有关计算机的所有信息,但是它会向你推荐各种出版物,以获取有关所提出主题的更多详细信息。Commodore 希望你真正喜欢你的新 COMMODORE 64。要想真正得到乐趣,请记住:编程不是一种一天就能学会的东西。通读这个用户指南你要有耐心。
|
||||||
|
|
||||||
|
那一夜,你在床上通读了整整前三个章节:“安装”、“入门”和“BASIC 编程入门”,在你最终睡着时,手册还打开着放在了胸前。
|
||||||
|
|
||||||
|
### Commodore BASIC
|
||||||
|
|
||||||
|
现在是星期六早上,你渴望尝试你所学到的新东西。手册里教给你的第一件事是如何更改在显示器上的颜色。你按照操作说明,按下 `CTRL-9` 来进入反色输入模式,然后按住空格键来创建了一个长长的空行。你可以使用 `CTRL-1` 到 `CTRL-8` 在不同的颜色之间交换,这让你的电视机屏幕焕发出了新的力量。
|
||||||
|
|
||||||
|
![Commodore 64 颜色带][9]
|
||||||
|
|
||||||
|
尽管这很酷,但你觉得这不能算是编程。要对计算机编程,你昨晚已经学会了如何做,你必须以一种称为 BASIC 的语言与计算机交谈。对你来说,BASIC 看起来就像星球大战中的东西一样科幻,但是,到 1983 年时,其实 BASIC 已经快有二十岁了。它是由两位达特茅斯教授 John Kemeny 和 Tom Kurtz 发明的,他们想让社会科学和人文科学中的本科生也可以使用计算机。它被广泛使用在微型计算机上,在大学的数学课上很受欢迎。在比尔盖茨和保罗艾伦为 Altair 编写了微软 BASIC 解释器后,它就成为了微型计算机上的标准。但是这本手册对此没有任何解释,那么多年你都没学过它。
|
||||||
|
|
||||||
|
手册中建议你尝试的第一个 BASIC 命令是 `PRINT` 命令。你输入了 `PRINT "COMMODORE 64"`,很慢,因为你需要花费一点时间才能在按键 `2` 上面找到引号符号。你单击 `RETURN`,这一次,计算机没有抱怨,完全是按照你告诉它做的,在下一行中显示了 “COMMODORE 64” 。
|
||||||
|
|
||||||
|
现在你尝试对各种不同的东西使用 `PRINT` 命令:两个数字加在一起,两个数字乘在一起,甚至几个十进制数字。你不再输入 `PRINT` ,而是使用 `?` 代替,因为手册中告诉你 `?` 是 `PRINT` 的一个缩写,通常专业程序员都这么使用。你感觉自己已经像是一个专家了,不过你想起你还没有进行到第三章“BASIC 编程入门”。
|
||||||
|
|
||||||
|
你很快就开始了。该章节提示你编写你的第一个真正的 BASIC 程序。你输入 `NEW` 并单击 `RETURN`,它给了你一个干净的<ruby>黑板<rt>slate</rt></ruby>。然后你在其中输入你的程序:
|
||||||
|
|
||||||
|
```
|
||||||
|
10 ?"COMMODORE 64"
|
||||||
|
20 GOTO 10
|
||||||
|
```
|
||||||
|
|
||||||
|
手册里解释说 10 和 20 是行号。它们为计算机排序了语句。它们也允许程序员在某些命令中引用程序的其它行,正像你在这里使用的 `GOTO` 命令一样,它将程序指回到行 10。“这是一个很好的编程习惯”,手册认为,“以 10 的增量来编号行,可以防止你以后需要插入一些语句”。
|
||||||
|
|
||||||
|
你输入 `RUN`,并凝视充满了 “COMMODORE 64” 的屏幕,它一遍又一遍的重复。
|
||||||
|
|
||||||
|
![Commodore 64 显示反复打印 "Commodore 64" 的结果][10]
|
||||||
|
|
||||||
|
你不确定这不会引爆你的计算机,过了一秒钟你才想起来应该单击 `RUN/STOP` 按键来打断循环。
|
||||||
|
|
||||||
|
手册接下来的一些部分向你介绍了变量,它告诉你变量像“在计算机中许多的盒子,它们每个可以容纳一个数字或一个文本字符串”。以一个 `%` 符号结尾的变量是一个整数,与此同时,以一个 `$` 符号结尾的变量是一个字符串。其余的所有变量是一些称为“浮点”变量的东西。手册警告你要小心变量名称,因为计算机仅会识别变量名称的前两个字母,尽管它不限制你想创建的名称有多长。(这并没有特别让你困扰,但是要是在 30 年后来看,这可能会让人们感到太疯狂了)
|
||||||
|
|
||||||
|
你接着学习 `IF... THEN...` 和 `FOR... NEXT...` 结构体。有了这些新的工具,你感觉有能力来解决接下来手册丢给你的重大挑战。“如果你是个有野心的人”,没错,“输入下面的程序,并查看会发生什么。”该程序比你目前为止看到的程序更长、更复杂,但是,你很想知道它做了什么:
|
||||||
|
|
||||||
|
```
|
||||||
|
10 REM BOUNCING BALL
|
||||||
|
20 PRINT "{CLR/HOME}"
|
||||||
|
25 FOR X = 1 TO 10 : PRINT "{CRSR/DOWN}" : NEXT
|
||||||
|
30 FOR BL = 1 TO 40
|
||||||
|
40 PRINT " ●{CRSR LEFT}";:REM (● is a Shift-Q)
|
||||||
|
50 FOR TM = 1 TO 5
|
||||||
|
60 NEXT TM
|
||||||
|
70 NEXT BL
|
||||||
|
75 REM MOVE BALL RIGHT TO LEFT
|
||||||
|
80 FOR BL = 40 TO 1 STEP -1
|
||||||
|
90 PRINT " {CRSR LEFT}{CRSR LEFT}●{CRSR LEFT}";
|
||||||
|
100 FOR TM = 1 TO 5
|
||||||
|
110 NEXT TM
|
||||||
|
120 NEXT BL
|
||||||
|
130 GOTO 20
|
||||||
|
```
|
||||||
|
|
||||||
|
上面的程序充分利用了 Commodore 64 最酷的功能之一。当把不可打印的命令字符作为字符串的一部分传递到 `PRINT` 命令时,它们会执行其操作,而不是被打印到屏幕上。这允许你重新摆放你程序中打印的字符串。(LCTT 译注:上述程序中如 `{CRSR LEFT}` 之类的控制字符执行类似 “在行中向左移动一个位置” 的操作,因此上述程序中利用这些字符操作了一个圆点字符四处移动,如下图。)
|
||||||
|
|
||||||
|
输入上面的程序你花费了很长时间。你犯一些错误,并不得不重新输入一些行。但是,你最终能够按下 `RUN`,并看到了一幅杰作:
|
||||||
|
|
||||||
|
![Commodore 64 反弹球][11]
|
||||||
|
|
||||||
|
你觉得这恐怕是你见过的最酷的事了。不过你几乎转头就忘记了它,因为马上你就学到了 BASIC 的内置函数,像 `RND`(它返回一个随机数字)和 `CHR$`(它返回与一个给定数字代码匹配的字符),这个手册向你展示一个程序,这个程序有名到什么程度呢?直到许多年后,它仍然被当成了一个[短文选集][12]的标题:
|
||||||
|
|
||||||
|
```
|
||||||
|
10 PRINT "{CLR/HOME}"
|
||||||
|
20 PRINT CHR$(205.5 + RND(1));
|
||||||
|
40 GOTO 20
|
||||||
|
```
|
||||||
|
|
||||||
|
当运行时,上面的程序会生成一个随机的迷宫:
|
||||||
|
|
||||||
|
![Commodore 64 迷宫程序][13]
|
||||||
|
|
||||||
|
这绝对是你曾经见过最酷的事。
|
||||||
|
|
||||||
|
### PEEK 和 POKE
|
||||||
|
|
||||||
|
现在你已经看过了 Commodore 64 手册的前四章节,包含那篇 “高级的 BASIC” 的章节,所以你感到十分自豪。在这个星期六早上,你学习到了很多东西。但是这个下午(在赶快吃了点午饭后),你将继续学习一些使这个放在你的客厅中的奇妙机器变得不再神秘的东西。
|
||||||
|
|
||||||
|
手册中的下一个章节标题是“高级颜色和图像命令”。它从回顾你今天早上首先键入的彩色条开始,并向你展示了如何在一个程序中做同样的事。然后它教给了你如何更改屏幕的背景颜色。
|
||||||
|
|
||||||
|
为此,你需要使用 BASIC 的 `PEEK` 和 `POKE` 命令。这些命令分别允许你检查和写入一个存储器地址。Commodore 64 有一个主背景颜色和一个边框背景颜色。每个都通过一个特定的内存地址控制。你可以把你喜欢的任何颜色值写入到这些地址,以使用这些背景颜色和边框颜色。
|
||||||
|
|
||||||
|
手册中解释:
|
||||||
|
|
||||||
|
> 正像变量可以被认为机器中你放置信息的“盒子”一样,你也可以认为在计算机中代表特定内存位置的是一些特殊定义的“盒子”。
|
||||||
|
>
|
||||||
|
> Commodore 64 会查看这些内存位置来了解屏幕的背景和边框应该是什么样的颜色,什么样的字符应该被显示在屏幕上,以及显示在哪里,等等其它任务。
|
||||||
|
|
||||||
|
你编写了一个程序来遍历所有可用的背景和边界的颜色的组合:
|
||||||
|
|
||||||
|
```
|
||||||
|
10 FOR BA = 0 TO 15
|
||||||
|
20 FOR BO = 0 TO 15
|
||||||
|
30 POKE 53280, BA
|
||||||
|
40 POKE 53281, BO
|
||||||
|
50 FOR X = 1 TO 500 : NEXT X
|
||||||
|
60 NEXT BO : NEXT BA
|
||||||
|
```
|
||||||
|
|
||||||
|
虽然 `POKE` 命令以及它的大操作数一开始时看起来很吓人,现在你看到那个数字的实际值其实不是很要紧。显然,你必须得到正确的数字,但是所有的数字代表的是一个“盒子”,Commodore 只是正好存储在地址 53280 处而已。这个盒子有一个特殊的用途:Commodore 使用它来确定屏幕背景应该是什么颜色。
|
||||||
|
|
||||||
|
![Commodore 64 更改背景颜色][14]
|
||||||
|
|
||||||
|
你认为这简直棒极了。只需要写入到内存中一个专用的盒子,你可以控制一台计算机的基础属性。你不确定 Commodore 64 的电路系统如何读取你写入在内存中的值并更改屏幕的颜色的,但是,你不知道这些也没事。至少你知道结果是怎么样的。
|
||||||
|
|
||||||
|
### 特殊容器
|
||||||
|
|
||||||
|
在那个周六,你没有读完整本手册,因为你现在有点精疲力尽了。但是你最终会全部读完它。在这个过程中,你学到更多的 Commodore 64 专用的盒子。有一些盒子你可以写入来控制在屏幕上显示什么——这也是一个盒子,事实上,是控制每一个位置出现的字符。在第六章节 “精灵图形” 中,你学到可以让你定义可以移动和甚至缩放图像的特殊盒子。在第七章节 “创造声音” 中,你学到能写入以便使你的 Commodore 64 歌唱 “Michael Row the Boat Ashore” 的盒子。Commodore 64,事实证明,它和你可能以后学习到的一个称为 API 的关系甚少。控制 Commodore 64 大多涉及写入到电路系统赋予特殊意义的内存地址。
|
||||||
|
|
||||||
|
多年来,你花费在这些特殊盒子的时光一直伴随着你。甚至几十年后,当你在一个拥有大量的图形或声音 API 的机器上编程时,你知道,隐藏于其背后的,这些 API 最终是写入到这些盒子之类的东西里面的。你有时会好奇那些只使用过 API 的年轻程序员,他们肯定是觉得 API 为他们做到的这一切。可能他们认为这些 API 调用了一些其它隐藏的 API。但是,那些隐藏的 API 调用了什么?你不由得同情这些年轻的程序员们,因为他们一定会非常迷惑。
|
||||||
|
|
||||||
|
如果你喜欢这篇文章,也喜欢它每两周发布的一篇新文章的话,那么请在 Twitter 上关注 [@TwoBitHistory][15] 或订阅 [RSS 源][16]来确保你知道新的文章发布出来。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via:https://twobithistory.org/2018/09/02/learning-basic.html
|
||||||
|
|
||||||
|
作者:[Two-Bit History][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://twobithistory.org
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.youtube.com/watch?v=kZRE7HIO3vk
|
||||||
|
[2]: https://en.wikipedia.org/wiki/BASIC_Computer_Games
|
||||||
|
[3]: https://www.youtube.com/watch?v=ZekAbt2o6Ms
|
||||||
|
[4]: https://www.npr.org/sections/money/2014/10/21/357629765/when-women-stopped-coding
|
||||||
|
[5]: https://www.youtube.com/watch?v=MA_XtT3VAVM
|
||||||
|
[6]: https://twobithistory.org/images/c64_startup.png
|
||||||
|
[7]: https://twobithistory.org/images/c64_error.png
|
||||||
|
[8]: ftp://www.zimmers.net/pub/cbm/c64/manuals/C64_Users_Guide.pdf
|
||||||
|
[9]: https://twobithistory.org/images/c64_colors.png
|
||||||
|
[10]: https://twobithistory.org/images/c64_print_loop.png
|
||||||
|
[11]: https://twobithistory.org/images/c64_ball.gif
|
||||||
|
[12]: http://10print.org/
|
||||||
|
[13]: https://twobithistory.org/images/c64_maze.gif
|
||||||
|
[14]: https://twobithistory.org/images/c64_background.gif
|
||||||
|
[15]: https://twitter.com/TwoBitHistory
|
||||||
|
[16]: https://twobithistory.org/feed.xml
|
||||||
|
[17]: https://twitter.com/TwoBitHistory/status/1030974776821665793?ref_src=twsrc%5Etfw
|
@ -1,37 +1,35 @@
|
|||||||
使用企业版 Docker 搭建自己的私有注册服务器
|
使用 Docker 企业版搭建自己的私有注册服务器
|
||||||
======
|
======
|
||||||
|
|
||||||
![docker trusted registry][1]
|
![docker trusted registry][1]
|
||||||
|
|
||||||
Docker 真的很酷,特别是和使用虚拟机相比,转移 Docker 镜像十分容易。如果你已准备好使用 Docker,那你肯定已从 [Docker Hub][2] 上拉取完整的镜像。Docker Hub 是 Docker 的云端注册服务器服务,包含成千上万个供选择的 Docker 镜像。如果你开发了自己的软件包并创建了自己的 Docker 镜像,那么你会想有自己的私有注册服务器。如果你有搭配着专有许可的镜像,或想为你的构建系统提供复杂的持续集成(CI)过程,则更应该拥有自己的私有注册服务器。
|
Docker 真的很酷,特别是和使用虚拟机相比,转移 Docker 镜像十分容易。如果你已准备好使用 Docker,那你肯定已从 [Docker Hub][2] 上拉取过完整的镜像。Docker Hub 是 Docker 的云端注册服务器服务,它包含成千上万个供选择的 Docker 镜像。如果你开发了自己的软件包并创建了自己的 Docker 镜像,那么你会想有自己私有的注册服务器。如果你有搭配着专有许可的镜像,或想为你的构建系统提供复杂的持续集成(CI)过程,则更应该拥有自己的私有注册服务器。
|
||||||
|
|
||||||
Docker 企业版包括 Docker Trusted Registry(译者注:DTR,Docker 可信注册服务器)。这是一个具有安全镜像管理功能的高可用的注册服务器,为了在你自己的数据中心或基于云端的架构上运行而构建。在接下来的几周,我们将了解 DTR 是提供安全、可重用且连续的[软件供应链][3]的一个关键组件。你可以通过我们的[免费托管小样][4]立即开始使用,或者通过下载安装进行 30 天的免费试用。下面是开始自己安装的步骤。
|
Docker 企业版包括 <ruby>Docker 可信注册服务器<rt>Docker Trusted Registry</rt></ruby>(DTR)。这是一个具有安全镜像管理功能的高可用的注册服务器,为在你自己的数据中心或基于云端的架构上运行而构建。在接下来,我们将了解到 DTR 是提供安全、可重用且连续的[软件供应链][3]的一个关键组件。你可以通过我们的[免费托管小样][4]立即开始使用,或者通过下载安装进行 30 天的免费试用。下面是开始自己安装的步骤。
|
||||||
|
|
||||||
## 配置 Docker 企业版
|
### 配置 Docker 企业版
|
||||||
|
|
||||||
Docker Trusted Registry 在通用控制面板(UCP)上运行,所以开始前要安装一个单节点集群。如果你已经有了自己的 UCP 集群,可以跳过这一步。在你的 docker 托管主机上,运行以下命令:
|
DTR 运行于通用控制面板(UCP)之上,所以开始前要安装一个单节点集群。如果你已经有了自己的 UCP 集群,可以跳过这一步。在你的 docker 托管主机上,运行以下命令:
|
||||||
|
|
||||||
```
|
```
|
||||||
# 拉取并安装 UCP
|
# 拉取并安装 UCP
|
||||||
|
|
||||||
docker run -it -rm -v /var/run/docker.sock:/var/run/docker.sock -name ucp docker/ucp:latest install
|
docker run -it -rm -v /var/run/docker.sock:/var/run/docker.sock -name ucp docker/ucp:latest install
|
||||||
```
|
```
|
||||||
|
|
||||||
当 UCP 启动并运行后,在安装 DTR 之前你还有几件事要做。针对刚刚安装的 UCP 实例,打开浏览器。在日志输出的末尾应该有一个链接。如果你已经有了 Docker 企业版的许可证,那就在这个界面上输入它吧。如果你还没有,可以访问 [Docker 商店][5]获取30天的免费试用版。
|
当 UCP 启动并运行后,在安装 DTR 之前你还有几件事要做。针对刚刚安装的 UCP 实例,打开浏览器。在日志输出的末尾应该有一个链接。如果你已经有了 Docker 企业版的许可证,那就在这个界面上输入它吧。如果你还没有,可以访问 [Docker 商店][5]获取 30 天的免费试用版。
|
||||||
|
|
||||||
准备好许可证后,你可能会需要改变一下 UCP 运行的端口。因为这是一个单节点集群,DTR 和 UCP 可能会以相同的端口运行他们的 web 服务。如果你拥有不只一个节点的 UCP 集群,这就不是问题,因为 DTR 会寻找有所需空闲端口的节点。在 UCP 中,点击管理员设置 -> 集群配置并修改控制器端口,比如 5443。
|
准备好许可证后,你可能会需要改变一下 UCP 运行的端口。因为这是一个单节点集群,DTR 和 UCP 可能会以相同的端口运行它们的 web 服务。如果你拥有不只一个节点的 UCP 集群,这就不是问题,因为 DTR 会寻找有所需空闲端口的节点。在 UCP 中,点击“管理员设置 -> 集群配置”并修改控制器端口,比如 5443。
|
||||||
|
|
||||||
## 安装 DTR
|
### 安装 DTR
|
||||||
|
|
||||||
我们要安装一个简单的、单节点的 Docker Trusted Registry 实例。如果你要安装实际生产用途的 DTR,那么你会将其设置为高可用(HA)模式,即需要另一种存储介质,比如基于云端的对象存储或者 NFS(译者注:Network File System,网络文件系统)。因为目前安装的是一个单节点实例,我们依然使用默认的本地存储。
|
我们要安装一个简单的、单节点的 DTR 实例。如果你要安装实际生产用途的 DTR,那么你会将其设置为高可用(HA)模式,即需要另一种存储介质,比如基于云端的对象存储或者 NFS(LCTT 译注:Network File System,网络文件系统)。因为目前安装的是一个单节点实例,我们依然使用默认的本地存储。
|
||||||
|
|
||||||
首先我们需要拉取 DTR 的 bootstrap 镜像。Boostrap 镜像是一个微小的独立安装程序,包括连接到 UCP 以及设置和启动 DTR 所需的所有容器、卷和逻辑网络。
|
首先我们需要拉取 DTR 的 bootstrap 镜像。boostrap 镜像是一个微小的独立安装程序,包括了连接到 UCP 以及设置和启动 DTR 所需的所有容器、卷和逻辑网络。
|
||||||
|
|
||||||
使用命令:
|
使用命令:
|
||||||
|
|
||||||
```
|
```
|
||||||
# 拉取并运行 DTR 引导程序
|
# 拉取并运行 DTR 引导程序
|
||||||
|
|
||||||
docker run -it -rm docker/dtr:latest install -ucp-insecure-tls
|
docker run -it -rm docker/dtr:latest install -ucp-insecure-tls
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -39,55 +37,42 @@ docker run -it -rm docker/dtr:latest install -ucp-insecure-tls
|
|||||||
|
|
||||||
然后 DTR bootstrap 镜像会让你确定几项设置,比如 UCP 安装的 URL 地址以及管理员的用户名和密码。从拉取所有的 DTR 镜像到设置全部完成,只需要一到两分钟的时间。
|
然后 DTR bootstrap 镜像会让你确定几项设置,比如 UCP 安装的 URL 地址以及管理员的用户名和密码。从拉取所有的 DTR 镜像到设置全部完成,只需要一到两分钟的时间。
|
||||||
|
|
||||||
## 保证一切安全
|
### 保证一切安全
|
||||||
|
|
||||||
一切都准备好后,就可以向注册服务器推送或者从中拉取镜像了。在做这一步之前,让我们设置 TLS 证书,以便安全的与 DTR 通信。
|
一切都准备好后,就可以向注册服务器推送或者从中拉取镜像了。在做这一步之前,让我们设置 TLS 证书,以便与 DTR 安全地通信。
|
||||||
|
|
||||||
在 Linux 上,我们可以使用以下命令(只需确保更改了 DTR_HOSTNAME 变量,来正确映射我们刚刚设置的 DTR):
|
在 Linux 上,我们可以使用以下命令(只需确保更改了 `DTR_HOSTNAME` 变量,来正确映射我们刚刚设置的 DTR):
|
||||||
|
|
||||||
```
|
```
|
||||||
# 从 DTR 拉取 CA 证书(如果 curl 不可用,你可以使用 wget)
|
# 从 DTR 拉取 CA 证书(如果 curl 不可用,你可以使用 wget)
|
||||||
|
|
||||||
DTR_HOSTNAME=< DTR 主机名>
|
DTR_HOSTNAME=< DTR 主机名>
|
||||||
|
|
||||||
curl -k https://$(DTR_HOSTNAME)/ca > $(DTR_HOSTNAME).crt
|
curl -k https://$(DTR_HOSTNAME)/ca > $(DTR_HOSTNAME).crt
|
||||||
|
|
||||||
sudo mkdir /etc/docker/certs.d/$(DTR_HOSTNAME)
|
sudo mkdir /etc/docker/certs.d/$(DTR_HOSTNAME)
|
||||||
|
|
||||||
sudo cp $(DTR_HOSTNAME) /etc/docker/certs.d/$(DTR_HOSTNAME)
|
sudo cp $(DTR_HOSTNAME) /etc/docker/certs.d/$(DTR_HOSTNAME)
|
||||||
|
|
||||||
# 重启 docker 守护进程(在 Ubuntu 14.04 上,使用 `sudo service docker restart` 命令)
|
# 重启 docker 守护进程(在 Ubuntu 14.04 上,使用 `sudo service docker restart` 命令)
|
||||||
|
|
||||||
sudo systemctl restart docker
|
sudo systemctl restart docker
|
||||||
```
|
```
|
||||||
|
|
||||||
对于 Mac 和 Windows 版的 Docker,我们会以不同的方式安装客户端。转入设置 -> 守护进程,在 Insecure Registries(译者注:不安全的注册服务器)部分,输入你的 DTR 主机名。点击应用,docker 守护进程应在重启后可以良好使用。
|
对于 Mac 和 Windows 版的 Docker,我们会以不同的方式安装客户端。转入“设置 -> 守护进程”,在“不安全的注册服务器”部分,输入你的 DTR 主机名。点击“应用”,docker 守护进程应在重启后可以良好使用。
|
||||||
|
|
||||||
## 推送和拉取镜像
|
### 推送和拉取镜像
|
||||||
|
|
||||||
现在我们需要设置一个仓库来存放镜像。这和 Docker Hub 有一点不同,如果你做的 docker 推送仓库中不存在,它会自动创建一个。要创建一个仓库,在浏览器中打开 https://<Your DTR hostname> 并在出现登录提示时使用你的管理员凭据登录。如果你向 UCP 添加了许可证,则 DTR 会自动获取该许可证。如果没有,请现在确认上传你的许可证。
|
现在我们需要设置一个仓库来存放镜像。这和 Docker Hub 有一点不同,如果你做的 docker 推送仓库中不存在,它会自动创建一个。要创建一个仓库,在浏览器中打开 `https://<Your DTR hostname>` 并在出现登录提示时使用你的管理员凭据登录。如果你向 UCP 添加了许可证,则 DTR 会自动获取该许可证。如果没有,请现在确认上传你的许可证。
|
||||||
|
|
||||||
进入刚才的网页之后,点击`新建仓库`按钮来创建新的仓库。
|
进入刚才的网页之后,点击“新建仓库”按钮来创建新的仓库。
|
||||||
|
|
||||||
我们会创建一个用于存储 Alpine linux 的仓库,所以在名字输入处键入 `alpine`,点击`保存`(在 DTR 2.5 及更高版本中叫`创建`)。
|
我们会创建一个用于存储 Alpine linux 的仓库,所以在名字输入处键入 “alpine”,点击“保存”(在 DTR 2.5 及更高版本中叫“创建”)。
|
||||||
|
|
||||||
现在我们回到 shell 界面输入以下命令:
|
现在我们回到 shell 界面输入以下命令:
|
||||||
|
|
||||||
```
|
```
|
||||||
# 拉取 Alpine Linux 的最新版
|
# 拉取 Alpine Linux 的最新版
|
||||||
|
|
||||||
docker pull alpine:latest
|
docker pull alpine:latest
|
||||||
|
|
||||||
# 登入新的 DTR 实例
|
# 登入新的 DTR 实例
|
||||||
|
|
||||||
docker login <Your DTR hostname>
|
docker login <Your DTR hostname>
|
||||||
|
|
||||||
# 标记上 Alpine 使能推送其至你的 DTR
|
# 标记上 Alpine 使能推送其至你的 DTR
|
||||||
|
|
||||||
docker tag alpine:latest <Your DTR hostname>/admin/alpine:latest
|
docker tag alpine:latest <Your DTR hostname>/admin/alpine:latest
|
||||||
|
|
||||||
# 向 DTR 推送镜像
|
# 向 DTR 推送镜像
|
||||||
|
|
||||||
docker push <Your DTR hostname>/admin/alpine:latest
|
docker push <Your DTR hostname>/admin/alpine:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -95,22 +80,19 @@ docker push <Your DTR hostname>/admin/alpine:latest
|
|||||||
|
|
||||||
```
|
```
|
||||||
# 从 DTR 中拉取镜像
|
# 从 DTR 中拉取镜像
|
||||||
|
|
||||||
docker pull <Your DTR hostname>/admin/alpine:latest
|
docker pull <Your DTR hostname>/admin/alpine:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
DTR 具有许多优秀的镜像管理功能,例如图像缓存,镜像,扫描,签名甚至自动化供应链策略。这些功能我们在后期的博客文章中更详细的探讨。
|
DTR 具有许多优秀的镜像管理功能,例如镜像的缓存、映像、扫描、签名甚至自动化供应链策略。这些功能我们在后期的博客文章中更详细的探讨。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
via: https://blog.docker.com/2018/01/dtr/
|
via: https://blog.docker.com/2018/01/dtr/
|
||||||
|
|
||||||
作者:[Patrick Devine;Rolf Neugebauer;Docker Core Engineering;Matt Bentley][a]
|
作者:[Patrick Devine][a]
|
||||||
译者:[fuowang](https://github.com/fuowang)
|
译者:[fuowang](https://github.com/fuowang)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -0,0 +1,78 @@
|
|||||||
|
Emacs 系列(一):抛掉一切,投入 Emacs 和 Org 模式的怀抱
|
||||||
|
======
|
||||||
|
|
||||||
|
我必须承认,在使用了几十年的 vim 后, 我被 [Emacs][1] 吸引了。
|
||||||
|
|
||||||
|
长期以来,我一直对如何组织安排事情感到沮丧。我也有用过 [GTD][2] 和 [ZTD][3] 之类的方法,但是像邮件或是大型文件这样的事务真的很难来组织安排。
|
||||||
|
|
||||||
|
我一直在用 Asana 处理任务,用 Evernote 做笔记,用 Thunderbird 处理邮件,把 ikiwiki 和其他的一些项目组合作为个人知识库,而且还在电脑的归档了各种文件。当我的新工作需要将 Slack 也加入进来时,我终于忍无可忍了。
|
||||||
|
|
||||||
|
许多 TODO 管理工具与电子邮件集成的很差。当你想做“提醒我在一周内回复这个邮件”之类的事时,很多时候是不可能的,因为这个工具不能以一种能够轻松回复的方式存储邮件。而这个问题在 Slack 上更为严重。
|
||||||
|
|
||||||
|
就在那时,我偶然发现了 [Carsten Dominik 在 Google Talk 上关于 Org 模式的讲话][4]。Carsten 是 Org 模式的作者,即便是这个讲话已经有 10 年了,但它仍然很具有参考价值。
|
||||||
|
|
||||||
|
我之前有用过 [Org 模式][5],但是每次我都没有真正的深入研究它,
|
||||||
|
因为我当时的反应是“一个大纲编辑器?但我需要的是待办事项列表”。我就这么错过了它。但实际上 Org 模式就是我所需要的。
|
||||||
|
|
||||||
|
### 什么是 Emacs?什么是 Org 模式?
|
||||||
|
|
||||||
|
Emacs 最初是一个文本编辑器,现在依然是一个文本编辑器,而且这种传统无疑贯穿始终。但是说 Emacs 是个编辑器是很不公平的。
|
||||||
|
|
||||||
|
Emacs 更像一个平台或是工具包。你不仅可以用它来编辑源代码,而且配置 Emacs 本身也是编程,里面有很多模式。就像编写一个 Firefox 插件一样简单,只要几行代码,然后,模式里的操作就改变了。
|
||||||
|
|
||||||
|
Org 模式也一样。确实,它是一个大纲编辑器,但它真正所包含的不止如此。它是一个信息组织平台。它的网站上写着,“你可以用纯文本来记录你的生活:你可以用 Org 模式来记笔记,处理待办事项,规划项目和使用快速有效的纯文本系统编写文档。”
|
||||||
|
|
||||||
|
### 捕获
|
||||||
|
|
||||||
|
如果你读过基于 GTD 的生产力指南,那么他们强调的一件事就是毫不费力地获取项目。这个想法是,当某件事突然出现在你的脑海里时,把它迅速输入一个受信任的系统,这样你就可以继续做你正在做的事情。Org 模式有一个专门的捕获系统。我可以在 Emacs 的任何地方按下 `C-c c` 键,它就会空出一个位置来记录我的笔记。最关键的是,自动嵌入到笔记中的链接可以链接到我按下 `C-c c` 键时正在编辑的那一行。如果我正在编辑文件,它会链回到那个文件和我所在的行。如果我正在浏览邮件,它就会链回到那封邮件(通过邮件的 Message-Id,这样它就可以在任何一个文件夹中找到邮件)。聊天时也一样,甚至是当你在另一个 Org 模式中也可也这样。
|
||||||
|
|
||||||
|
这样我就可以做一个笔记,它会提醒我在一周内回复某封邮件,当我点击这个笔记中的链接时,它会在我的邮件阅读器中弹出这封邮件 —— 即使我随后将它从收件箱中存档。
|
||||||
|
|
||||||
|
没错,这正是我要找的!
|
||||||
|
|
||||||
|
### 工具套件
|
||||||
|
|
||||||
|
一旦你开始使用 Org 模式,很快你就会想将所有的事情都集成到里面。有可以从网络上捕获内容的浏览器插件,也有多个 Emacs 邮件或新闻阅读器与之集成,ERC(IRC 客户端)也不错。所以我将自己从 Thunderbird 和 mairix + mutt (用于邮件归档)换到了 mu4e,从 xchat + slack 换到了 ERC。
|
||||||
|
|
||||||
|
你可能不明白,我喜欢这些基于 Emacs 的工具,而不是具有相同功能的单独的工具。
|
||||||
|
|
||||||
|
一个小花絮:我又在使用离线 IMAP 了!我甚至在很久以前就用过 GNUS。
|
||||||
|
|
||||||
|
### 用一个 Emacs 进程来管理
|
||||||
|
|
||||||
|
我以前也经常使用 Emacs,那时,Emacs 是一个“大”的程序(现在显示电源状态的小程序占用的内存要比 Emacs 多)。当时存在在启动时间过长的问题,但是现在已经有连接到一个正在运行的 Emacs 进程的解决方法。
|
||||||
|
|
||||||
|
我喜欢用 Mod-p(一个 [xmonad][6] 中 [dzen][7] 菜单栏的快捷方式,但是在大多数传统的桌面环境中该功能的快捷键是 `Alt-F2`)来启动程序(LCTT 译注:xmonad 是一种平铺桌面;dzen 是 X11 窗口下管理消息、提醒和菜单的程序)。这个设置在不运行多个<ruby>[emacs 们](https://www.emacswiki.org/emacs/Emacsen)<rt>emacsen</rt></ruby>时很方便,因为这样就不会在试图捕获另一个打开的文件时出问题。这中方法很简单:创建一个叫 `em` 的脚本并将它放到我自己的环境变量中。就像这样:
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/bash exec emacsclient -c -a "" "$@"
|
||||||
|
```
|
||||||
|
|
||||||
|
如果没有 emacs 进程存在的话,就会创建一个新的 emacs 进程,否则的话就直接使用已存在的进程。这样做还有一个好处:`-nw` 之类的参数工作的很好,它实际上就像在 shell 提示符下输入 `emacs` 一样。它很适合用于设置 `EDITOR` 环境变量。
|
||||||
|
|
||||||
|
### 下一篇
|
||||||
|
|
||||||
|
接下来我将讨论我的使用情况,并展示以下的配置:
|
||||||
|
|
||||||
|
* Org 模式,包括计算机之间的同步、捕获、日程和待办事项、文件、链接、关键字和标记、各种导出(幻灯片)等。
|
||||||
|
* mu4e,用于电子邮件,包括多个账户,bbdb 集成
|
||||||
|
* ERC,用于 IRC 和即时通讯
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: http://changelog.complete.org/archives/9861-emacs-1-ditching-a-bunch-of-stuff-and-moving-to-emacs-and-org-mode
|
||||||
|
|
||||||
|
作者:[John Goerzen][a]
|
||||||
|
译者:[oneforalone](https://github.com/oneforalone)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]:http://changelog.complete.org/archives/author/jgoerzen
|
||||||
|
[1]:https://www.gnu.org/software/emacs/
|
||||||
|
[2]:https://gettingthingsdone.com/
|
||||||
|
[3]:https://zenhabits.net/zen-to-done-the-simple-productivity-e-book/
|
||||||
|
[4]:https://www.youtube.com/watch?v=oJTwQvgfgMM
|
||||||
|
[5]:https://orgmode.org/
|
||||||
|
[6]:https://wiki.archlinux.org/index.php/Xmonad_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
|
||||||
|
[7]:http://robm.github.io/dzen/
|
@ -1,26 +1,34 @@
|
|||||||
DevOps应聘者应该准备回答的20个问题
|
DevOps 应聘者应该准备回答的 20 个问题
|
||||||
======
|
======
|
||||||
|
|
||||||
|
> 想要建立一个积极,富有成效的工作环境? 在招聘过程中要专注于寻找契合点。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/hire-job-career.png?itok=SrZo0QJ3)
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/hire-job-career.png?itok=SrZo0QJ3)
|
||||||
聘请一个不合适的人代价是很高的。根据Link人力资源的首席执行官Jörgen Sundberg的统计,招聘,雇佣一名新员工将会花费公司$240,000之多,当你进行了一次不合适的招聘:
|
|
||||||
* 你失去了他们所知道的。
|
聘请一个不合适的人[代价是很高的][1]。根据 Link 人力资源的首席执行官 Jörgen Sundberg 的统计,招聘、雇佣一名新员工将会花费公司$240,000 之多,当你进行了一次不合适的招聘:
|
||||||
* 你失去了他们认识的人
|
|
||||||
|
* 你失去了他们的知识技能。
|
||||||
|
* 你失去了他们的人脉。
|
||||||
* 你的团队将可能进入到一个组织发展的震荡阶段
|
* 你的团队将可能进入到一个组织发展的震荡阶段
|
||||||
* 你的公司将会面临组织破裂的风险
|
* 你的公司将会面临组织破裂的风险
|
||||||
|
|
||||||
当你失去一名员工的时候,你就像丢失了公司图谱中的一块。同样值得一提的是另一端的疼痛。应聘到一个错误工作岗位的员工会感受到很大的压力以及整个身心的不满意,甚至是健康问题。
|
当你失去一名员工的时候,你就像丢失了公司版图中的一块。同样值得一提的是另一端的痛苦。应聘到一个错误工作岗位的员工会感受到很大的压力以及整个身心的不满意,甚至是健康问题。
|
||||||
|
|
||||||
另外一方面,当你招聘到合适的人时,新的员工将会:
|
另外一方面,当你招聘到合适的人时,新的员工将会:
|
||||||
* 丰富公司现有的文化,使你的组织成为一个更好的工作场所。研究表明一个积极的工作文化能够帮助驱动一个更长久的财务业绩,而且如果你在一个欢快的环境中工 作,你更有可能在生活中做的更好。
|
|
||||||
|
* 丰富公司现有的文化,使你的组织成为一个更好的工作场所。研究表明一个积极的工作文化能够帮助更长久推动财务业绩增长,而且如果你在一个欢快的环境中工作,你更有可能在生活中做的更好。
|
||||||
* 热爱和你的组织在一起工作。当人们热爱他们所在做的,他们会趋向于做的更好。
|
* 热爱和你的组织在一起工作。当人们热爱他们所在做的,他们会趋向于做的更好。
|
||||||
|
|
||||||
招聘适合的或者加强现有的文化在DevOps和敏捷团多中是必不可少的。也就是说雇佣到一个能够鼓励积极合作的人,以便来自不同背景,有着不同目标和工作方式的团队能够在一起有效的工作。你新雇佣的员工因应该能够帮助团队合作来充分发挥放大他们的价值同时也能够增加员工的满意度以及平衡组织目标的冲突。他或者她应该能够通过明智的选择工具和工作流来促进你的组织,文化就是一切。
|
招聘以适合或加强现有的文化在 DevOps 和敏捷团多中是必不可少的。也就是说雇佣到一个能够鼓励积极合作的人,以便来自不同背景,有着不同目标和工作方式的团队能够在一起有效的工作。你新雇佣的员工应该能够帮助团队合作来充分发挥放大他们的价值,同时也能够增加员工的满意度以及平衡组织目标的冲突。他或者她应该能够通过明智的选择工具和工作流来促进你的组织,文化就是一切。
|
||||||
|
|
||||||
|
作为我们 2017 年 11 月发布的一篇文章 [DevOps 的招聘经理应该准备回答的 20 个问题][4] 的回应,这篇文章将会重点关注在如何招聘最适合的人。
|
||||||
|
|
||||||
作为我们2017年11月发布的一篇文章,[DevOps的招聘经理应该准备回答的20个问题][4],这篇文章将会重点关注在如何招聘最适合的人。
|
|
||||||
### 为什么招聘走错了方向
|
### 为什么招聘走错了方向
|
||||||
很多公司现在在用的典型的雇佣策略是基于人才过剩的基础上:
|
|
||||||
|
|
||||||
* 职位公告栏。
|
很多公司现在用的典型的雇佣策略是基于人才过剩的基础上:
|
||||||
* 关注和所需才能符合的应聘者。
|
|
||||||
|
* 在职位公告栏发布招聘。
|
||||||
|
* 关注具有所需才能的应聘者。
|
||||||
* 尽可能找多的候选者。
|
* 尽可能找多的候选者。
|
||||||
* 通过面试淘汰弱者。
|
* 通过面试淘汰弱者。
|
||||||
* 通过正式的面试淘汰更多的弱者。
|
* 通过正式的面试淘汰更多的弱者。
|
||||||
@ -30,37 +38,48 @@ DevOps应聘者应该准备回答的20个问题
|
|||||||
![](https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/hiring_graphic.png?itok=1udGbkhB)
|
![](https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/hiring_graphic.png?itok=1udGbkhB)
|
||||||
|
|
||||||
职位公告栏是有成千上万失业者人才过剩的经济大萧条时期发明的。在今天的求职市场上已经没有人才过剩了,然而我们仍然在使用基于此的招聘策略。
|
职位公告栏是有成千上万失业者人才过剩的经济大萧条时期发明的。在今天的求职市场上已经没有人才过剩了,然而我们仍然在使用基于此的招聘策略。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/732px-unemployed_men_queued_outside_a_depression_soup_kitchen_opened_in_chicago_by_al_capone_02-1931_-_nara_-_541927.jpg?itok=HSs4NjCN)
|
![](https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/732px-unemployed_men_queued_outside_a_depression_soup_kitchen_opened_in_chicago_by_al_capone_02-1931_-_nara_-_541927.jpg?itok=HSs4NjCN)
|
||||||
|
|
||||||
### 雇佣最合适的人员:运用文化和情感
|
### 雇佣最合适的人员:运用文化和情感
|
||||||
在人才过剩雇佣策略背后的思想是去设计工作岗位然后将人员安排进去。
|
|
||||||
相反,做相反的事情:寻找将会积极融入你的商业文化的人才,然后为他们寻找他们热爱的最合适的岗位。要想如此实现,你必须能够围绕他们热情为他们创造工作岗位。
|
在人才过剩雇佣策略背后的思想是设计工作岗位然后将人员安排进去。
|
||||||
**谁正在寻找一份工作?** 根据一份2016年对美国50,000名开发者的调查显示,[85.7%的受访对象][5]要么对新的机会不感兴趣,要么对于寻找新工作没有积极性。在寻找工作的那部分中,有将近[28.3%的求职者][5]来自于朋友的推荐。如果你只是在那些在找工作的人中寻找人才,你将会错过高端的人才。
|
|
||||||
**运用团队力量去发现和寻找潜力的雇员**。列如,戴安娜是你的团队中的一名开发者,她所提供的机会即使她已经从事编程很多年而且在期间已经结识了很多从事热爱他们所从事的工作的人。难道你不认为她所推荐的潜在员工在技能,知识和智慧上要比HR所寻找的要优秀吗?在要求戴安娜分享她同伴之前,通知她即将到来的使命任务,向她阐明你要雇佣潜在有探索精神的团队,描述在将来会需要的知识领域。
|
反而应该反过来:寻找将会积极融入你的商业文化的人才,然后为他们寻找他们热爱的最合适的岗位。要想实现这样的目标,你必须能够围绕他们热情为他们创造工作岗位。
|
||||||
**雇员想要什么?**一份来自千禧年,婴儿潮实时期出生的人的对比综合性研究显示,20% 的人所想要的是相同的:
|
|
||||||
|
**谁正在寻找一份工作?** 根据一份 2016 年对美国 50000 名开发者的调查显示,[85.7% 的受访对象][5]要么对新的机会不感兴趣,要么对于寻找新工作没有积极性。在寻找工作的那部分中,有将近 [28.3% 的求职者][5]来自于朋友的推荐。如果你只是在那些在找工作的人中寻找人才,你将会错过高端的人才。
|
||||||
|
|
||||||
|
**运用团队力量去发现和寻找潜力的雇员**。例如,戴安娜是你的团队中的一名开发者,她所能提供的机会是,她已经[从事编程很多年][6]而且在期间已经结识了很多从事热爱他们所从事的工作的人。难道你不认为她所推荐的潜在员工在技能、知识和智慧上要比 HR 所寻找的要优秀吗?在要求戴安娜分享她同伴之前,通知她即将到来的使命任务,向她阐明你要雇佣潜在有探索精神的团队,描述在将来会需要的知识领域。
|
||||||
|
|
||||||
|
**雇员想要什么?**一份来自千禧年婴儿潮时期出生的人的对比综合性研究显示,20% 的人所想要的是相同的:
|
||||||
|
|
||||||
1. 对组织产生积极的影响
|
1. 对组织产生积极的影响
|
||||||
2. 帮助解决社交或者环境上的挑战
|
2. 帮助解决社交或者环境上的挑战
|
||||||
3. 和一群有动力的人一起工作
|
3. 和一群有动力的人一起工作
|
||||||
|
|
||||||
### 面试的挑战
|
### 面试的挑战
|
||||||
面试应该是招聘者和应聘者双方为了寻找最合适的人才进行的一次双方之间的对话。将面试聚焦在企业文化和情感对话两个问题上:这个应聘者将会丰富你的企业文化并且会热爱和你在一起工作吗?你能够在工作中帮他们取得成功吗?
|
|
||||||
**对于招聘经理来说:** 每一次的面试都是你学习如何将自己的组织变得对未来的团队成员更有吸引力,并且每次积极的面试多都可能是你发现人才(即使你不会雇佣)的机会。每个人都将会记得积极有效的面试的经历。即使他们不会被雇佣,他们将会和他们的朋友谈论这次经历,你竟会得到一个被推荐的机会。这又很大的好处:如果你无法吸引到这个人才,你也将会从中学习吸取经验并且改善。
|
|
||||||
**对面试者来说**:每次的面试都是你释放激情的机会
|
|
||||||
|
|
||||||
### 助你释放潜在雇员激情的20个问题
|
面试应该是招聘者和应聘者双方为了寻找最合适的人才进行的一次双方之间的对话。将面试聚焦在企业文化和情感对话两个问题上:这个应聘者将会丰富你的企业文化并且会热爱和你在一起工作吗?你能够在工作中帮他们取得成功吗?
|
||||||
|
|
||||||
|
**对于招聘经理来说:** 每一次的面试都是你学习如何将自己的组织变得对未来的团队成员更有吸引力,并且每次积极的面试都可能是你发现人才(即使你不会雇佣)的机会。每个人都将会记得积极有效的面试的经历。即使他们不会被雇佣,他们将会和他们的朋友谈论这次经历,你会得到一个被推荐的机会。这有很大的好处:如果你无法吸引到这个人才,你也将会从中学习吸取经验并且改善。
|
||||||
|
|
||||||
|
**对面试者来说**:每次的面试都是你释放激情的机会。
|
||||||
|
|
||||||
|
### 助你释放潜在雇员激情的 20 个问题
|
||||||
|
|
||||||
1. 你热爱什么?
|
1. 你热爱什么?
|
||||||
2. “今天早晨我已经迫不及待的要去工作”你怎么看待这句话?
|
2. “今天早晨我已经迫不及待的要去工作”,你怎么看待这句话?
|
||||||
3. 你曾经最快乐的是什么?
|
3. 你曾经最快乐的是什么?
|
||||||
4. 你曾经解决问题的最典型的例子是什么,你是如何解决的?
|
4. 你曾经解决问题的最典型的例子是什么,你是如何解决的?
|
||||||
5. 你如何看待配对学习?
|
5. 你如何看待配对学习?
|
||||||
6. 你到达办公室和离开办公室心里最先想到的是什么?
|
6. 你到达办公室和离开办公室心里最先想到的是什么?
|
||||||
7. 你如果你有一次改变你之前或者现在的共工作的一件事的机会,将会是什么事?
|
7. 你如果你有一次改变你之前或者现在的工作中的一件事的机会,将会是什么事?
|
||||||
8. 当你在这工作的时候,你最兴奋去学习什么?
|
8. 当你在工作的时候,你最乐于去学习什么?
|
||||||
9. 你的梦想是什么,你如何去实现?
|
9. 你的梦想是什么,你如何去实现?
|
||||||
10. 你在学会如何去实现你的追求的时候想要或者需要什么?
|
10. 你在学会如何去实现你的追求的时候想要或者需要什么?
|
||||||
11. 你的价值观是什么?
|
11. 你的价值观是什么?
|
||||||
12. 你是如何坚守自己的价值观的?
|
12. 你是如何坚守自己的价值观的?
|
||||||
13. 平衡在你的生活中意味着什么?
|
13. 在你的生活中平衡意味着什么?
|
||||||
14. 你最引以为傲的工作交流能力是什么?为什么?
|
14. 你最引以为傲的工作交流能力是什么?为什么?
|
||||||
15. 你最喜欢营造什么样的环境?
|
15. 你最喜欢营造什么样的环境?
|
||||||
16. 你喜欢别人怎样对待你?
|
16. 你喜欢别人怎样对待你?
|
||||||
@ -70,14 +89,13 @@ DevOps应聘者应该准备回答的20个问题
|
|||||||
20. 如果你正在雇佣我,你将会问我什么问题?
|
20. 如果你正在雇佣我,你将会问我什么问题?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
via: https://opensource.com/article/18/3/questions-devops-employees-should-answer
|
via: https://opensource.com/article/18/3/questions-devops-employees-should-answer
|
||||||
|
|
||||||
作者:[Catherine Louis][a]
|
作者:[Catherine Louis][a]
|
||||||
译者:[FelixYFZ](https://github.com/FelixYFZ)
|
译者:[FelixYFZ](https://github.com/FelixYFZ)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -0,0 +1,101 @@
|
|||||||
|
构建满足用户需求的云环境的五个步骤
|
||||||
|
======
|
||||||
|
> 在投入时间和资金开发你的云环境之前,确认什么是你的用户所需要的。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003601_05_mech_osyearbook2016_cloud_cc.png?itok=XSV7yR9e)
|
||||||
|
|
||||||
|
无论你如何定义,云就是你的用户展现其在组织中的价值的另一个工具。当谈论新的范例或者技术(云是两者兼有)的时候很容易被它的新特性所分心。由一系列无止境的问题引发的对话能够很快的被发展为功能愿景清单,所有下面的这些都是你可能已经考虑到的:
|
||||||
|
|
||||||
|
* 是公有云、私有云还是混合云?
|
||||||
|
* 会使用虚拟机还是容器,或者是两者?
|
||||||
|
* 会提供自助服务吗?
|
||||||
|
* 从开发到生产是完全自动的,还是它将需要手动操作?
|
||||||
|
* 我们能以多块的速度做到?
|
||||||
|
* 关于某某工具?
|
||||||
|
|
||||||
|
这样的清单还可以列举很多。
|
||||||
|
|
||||||
|
当开始 IT 现代化,或者数字转型,无论你是如何称呼的,通常方法是开始回答更高管理层的一些高层次问题,这种方法的结果是可以预想到的:失败。经过大范围的调研并且花费了数月的时间(如果不是几年的话)部署了这个最炫的新技术,而这个新的云技术却从未被使用过,而且陷入了荒废,直到它最终被丢弃或者遗忘在数据中心的一角和预算之中。
|
||||||
|
|
||||||
|
这是因为无论你交付的是什么工具,都不是用户所想要或者需要的。更加糟糕的是,它可能是一个单一的工具,而用户真正需要的是一系列工具 —— 能够随着时间推移,更换升级为更新的、更漂亮的工具,以更好地满足其需求。
|
||||||
|
|
||||||
|
### 专注于重要的事情
|
||||||
|
|
||||||
|
问题在于关注,传统上一直是关注于工具。但工具并不是要增加到组织价值中的东西;终端用户利用它做什么才是目的。你需要将你的注意力从创建云(例如技术和工具)转移到你的人员和用户身上。
|
||||||
|
|
||||||
|
事实上,除了使用工具的用户(而不是工具本身)是驱动价值的因素之外,聚焦注意力在用户身上也是有其它原因的。工具是给用户使用去解决他们的问题并允许他们创造价值的,所以这就导致了如果那些工具不能满足那些用户的需求,那么那些工具将不会被使用。如果你交付给你的用户的工具并不是他们喜欢的,他们将不会使用,这就是人类的人性行为。
|
||||||
|
|
||||||
|
数十年来,IT 产业只为用户提供一种解决方案,因为仅有一个或两个选择,用户是没有权力去改变的。现在情况已经不同了。我们现在生活在一个技术选择的世界中。不给用户一个选择的机会的情况将不会被接受的;他们在个人的科技生活中有选择,同时希望在工作中也有选择。现在的用户都是受过教育的并且知道将会有比你所提供的更好选择。
|
||||||
|
|
||||||
|
因此,在物理上的最安全的地点之外,没有能够阻止他们只做他们自己想要的东西的方法,我们称之为“影子 IT”。如果你的组织有如此严格的安全策略和承诺策略而不允许影子 IT,许多员工将会感到灰心丧气并且会离职去其他能提供更好机会的公司。
|
||||||
|
|
||||||
|
基于以上所有的原因,你必须牢记要首先和你的最终用户设计你的昂贵又费时的云项目。
|
||||||
|
|
||||||
|
### 创建满足用户需求的云五个步骤的过程
|
||||||
|
|
||||||
|
既然我们已经知道了为什么,接下来我们来讨论一下怎么做。你如何去为终端用户创建一个云?你怎样重新将你的注意力从技术转移到使用技术的用户身上?
|
||||||
|
|
||||||
|
根据以往的经验,我们知道最好的方法中包含两件重要的事情:从你的用户中得到及时的反馈,在创建中和用户进行更多的互动。
|
||||||
|
|
||||||
|
你的云环境将继续随着你的组织不断发展。下面的五个步骤将会帮助你创建满足用户需求的云环境。
|
||||||
|
|
||||||
|
#### 1、识别谁将是你的用户
|
||||||
|
|
||||||
|
在你开始询问用户问题之前,你首先必须识别谁将是你的新的云环境的用户。他们可能包括将在云上创建开发应用的开发者;也可能是运营、维护或者或者创建该云的运维团队;还可能是保护你的组织的安全团队。在第一次迭代时,将你的用户数量缩小至人数较少的小组防止你被大量的反馈所淹没,让你识别的每个小组指派两个代表(一个主要的一个辅助的)。这将使你的第一次交付在规模和时间上都很小。
|
||||||
|
|
||||||
|
#### 2、和你的用户面对面的交谈来收获有价值的输入。
|
||||||
|
|
||||||
|
获得反馈的最佳途径是和用户直接交谈。群发的邮件会自行挑选出受访者——如果你能收到回复的话。小组讨论会很有帮助的,但是当人们有个私密的、专注的对话者时,他们会比较的坦诚。
|
||||||
|
|
||||||
|
和你的第一批用户安排个面对面的个人的会谈,并且向他们询问以下的问题:
|
||||||
|
|
||||||
|
* 为了完成你的任务,你需要什么?
|
||||||
|
* 为了完成你的任务,你想要什么?
|
||||||
|
* 你现在最头疼的技术痛点是什么?
|
||||||
|
* 你现在最头疼的政策或者流程痛点是哪个?
|
||||||
|
* 关于解决你的需求、希望或痛点,你有什么建议?
|
||||||
|
|
||||||
|
这些问题只是指导性的,并不一定适合每个组织。你不应该只询问这些问题,他们应该导向更深层次的讨论。确保告诉用户他们任何所说的和被问的都被视作反馈,所有的反馈都是有帮助的,无论是消极的还是积极的。这些对话将会帮助你设置你的开发优先级。
|
||||||
|
|
||||||
|
收集这种个性化的反馈是保持初始用户群较小的另一个原因:这将会花费你大量的时间来和每个用户交流,但是我们已经发现这是相当值得付出的投入。
|
||||||
|
|
||||||
|
#### 3、设计并交付你的解决方案的第一个版本
|
||||||
|
|
||||||
|
一旦你收到初始用户的反馈,就是时候开始去设计并交付一部分的功能了。我们不推荐尝试一次性交付整个解决方案。设计和交付的时期要短;这可以避免你花费一年的时间去构建一个你*认为*正确的解决方案,而只会让你的用户拒绝它,因为对他们来说毫无用处。创建你的云所需要的工具取决于你的组织和它的特殊需求。只需确保你的解决方案是建立在用户的反馈的基础上的,你将功能小块化的交付并且要经常的去征求用户的反馈。
|
||||||
|
|
||||||
|
#### 4、询问用户对第一个版本的反馈
|
||||||
|
|
||||||
|
太棒了,现在你已经设计并向你的用户交付了你的炫酷的新的云环境的第一个版本!你并不是花费一整年去完成它而是将它处理成小的模块。为什么将其分为小的模块如此重要呢?因为你要回到你的用户组并且向他们收集关于你的设计和交付的功能。他们喜欢什么?不喜欢什么?你正确的处理了他们所关注的吗?是技术功能上很厉害,但系统进程或者策略方面仍然欠缺吗?
|
||||||
|
|
||||||
|
再重申一次,你要问的问题取决于你的组织;这里的关键是继续前一个阶段的讨论。毕竟你正在为用户创建云环境,所以确保它对用户来说是有用的并且能够有效利用每个人的时间。
|
||||||
|
|
||||||
|
#### 5、回到第一步。
|
||||||
|
|
||||||
|
这是一个迭代的过程。你的首次交付应该是快速而小规模的,而且以后的迭代也应该是这样的。不要期待仅仅按照这个流程完成了一次、两次甚至是三次就能完成。一旦你持续的迭代,你将会吸引更多的用户从而能够在这个过程中得到更好的回报。你将会从用户那里得到更多的支持。你能够迭代的更迅速并且更可靠。到最后,你将会通过改变你的流程来满足用户的需求。
|
||||||
|
|
||||||
|
用户是这个过程中最重要的一部分,但迭代是第二重要的因为它让你能够回到用户中进行持续沟通从而得到更多有用的信息。在每个阶段,记录哪些是有效的哪些没有起到应有的效果。要自省,要对自己诚实。我们所花费的时间提供了最有价值的了吗?如果不是,在下一个阶段尝试些不同的。在每次循环中不要花费太多时间的最重要的部分是,如果某部分在这次不起作用,你能够很容易的在下一次中调整它,直到你找到能够在你组织中起作用的方法。
|
||||||
|
|
||||||
|
### 这仅仅是开始
|
||||||
|
|
||||||
|
通过许多客户约见,从他们那里收集反馈,以及在这个领域的同行的经验,我们一次次的发现在创建云的时候最重要事就是和你的用户交谈。这似乎是很明显的,但很让人惊讶的是很多组织却偏离了这个方向去花费数月或者数年的时间去创建,然后最终发现它对终端用户甚至一点用处都没有。
|
||||||
|
|
||||||
|
现在你已经知道为什么你需要将你的注意力集中到终端用户身上并且在中心节点和用户一起的互动创建云。剩下的是我们所喜欢的部分,你自己去做的部分。
|
||||||
|
|
||||||
|
这篇文章是基于一篇作者在 [Red Hat Summit 2018][3] 上发表的文章“[为终端用户设计混合云,要么失败]”。
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/18/4/5-steps-building-your-cloud-correctly
|
||||||
|
|
||||||
|
作者:[Cameron Wyatt][a], [Ian Teksbury][1]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[FelixYFZ](https://github.com/FelixYFZ)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]:https://opensource.com/users/cameronmwyatt
|
||||||
|
[1]:https://opensource.com/users/itewk
|
||||||
|
[2]:https://agenda.summit.redhat.com/SessionDetail.aspx?id=154225
|
||||||
|
[3]:https://www.redhat.com/en/summit/2018
|
@ -0,0 +1,214 @@
|
|||||||
|
如何使用 Emacs 创建 LaTeX 文档
|
||||||
|
======
|
||||||
|
> 这篇教程将带你遍历在 Emacs 使用强大的开源排版系统 LaTex 来创建文档的全过程。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/email_paper_envelope_document.png?itok=uPj_kouJ)
|
||||||
|
|
||||||
|
一篇由 Aaron Cocker 写的很棒的文章 “[在 LaTeX 中创建文件的介绍][1]” 中,介绍了 [LaTeX 排版系统][3] 并描述了如何使用 [TeXstudio][4] 来创建 LaTeX 文档。同时,他也列举了一些很多用户觉得创建 LaTeX 文档很方便的编辑器。
|
||||||
|
|
||||||
|
[Greg Pittman][5] 对这篇文章的评论吸引了我:“当你第一次开始使用 LaTeX 时,他似乎是个很差劲的排版……” 事实也确实如此。LaTeX 包含了多种排版字体和调试,如果你漏了一个特殊的字符比如说感叹号,这会让很多用户感到沮丧,尤其是新手。在本文中,我将介绍如何使用 [GNU Emacs][6] 来创建 LaTeX 文档。
|
||||||
|
|
||||||
|
### 创建你的第一个文档
|
||||||
|
|
||||||
|
启动 Emacs:
|
||||||
|
|
||||||
|
```
|
||||||
|
emacs -q --no-splash helloworld.org
|
||||||
|
```
|
||||||
|
|
||||||
|
参数 `-q` 确保 Emacs 不会加载其他的初始化配置。参数 `--no-splash-screen` 防止 Emacs 打开多个窗口,确保只打开一个窗口,最后的参数 `helloworld.org` 表示你要创建的文件名为 `helloworld.org` 。
|
||||||
|
|
||||||
|
![Emacs startup screen][8]
|
||||||
|
|
||||||
|
*GNU Emacs 打开文件名为 helloworld.org 的窗口时的样子。*
|
||||||
|
|
||||||
|
现在让我们用 Emacs 添加一些 LaTeX 的标题吧:在菜单栏找到 “Org” 选项并选择 “Export/Publish”。
|
||||||
|
|
||||||
|
![template_flow.png][10]
|
||||||
|
|
||||||
|
*导入一个默认的模板*
|
||||||
|
|
||||||
|
在下一个窗口中,Emacs 同时提供了导入和导出一个模板。输入 `#`(“[#] Insert template”)来导入一个模板。这将会使光标跳转到一个带有 “Options category:” 提示的 mini-buffer 中。第一次你可能不知道这个类型的名字,但是你可以使用 `Tab` 键来查看所有的补全。输入 “default” 然后按回车,之后你就能看到如下的内容被插入了:
|
||||||
|
|
||||||
|
```
|
||||||
|
#+TITLE: helloworld
|
||||||
|
#+DATE: <2018-03-12 Mon>
|
||||||
|
#+AUTHOR:
|
||||||
|
#+EMAIL: makerpm@nubia
|
||||||
|
#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
|
||||||
|
#+OPTIONS: author:t c:nil creator:comment d:(not "LOGBOOK") date:t
|
||||||
|
#+OPTIONS: e:t email:nil f:t inline:t num:t p:nil pri:nil stat:t
|
||||||
|
#+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:t todo:t |:t
|
||||||
|
#+CREATOR: Emacs 25.3.1 (Org mode 8.2.10)
|
||||||
|
#+DESCRIPTION:
|
||||||
|
#+EXCLUDE_TAGS: noexport
|
||||||
|
#+KEYWORDS:
|
||||||
|
#+LANGUAGE: en
|
||||||
|
#+SELECT_TAGS: export
|
||||||
|
```
|
||||||
|
|
||||||
|
根据自己的需求修改标题、日期、作者和 email。我自己的话是下面这样的:
|
||||||
|
|
||||||
|
```
|
||||||
|
#+TITLE: Hello World! My first LaTeX document
|
||||||
|
#+DATE: \today
|
||||||
|
#+AUTHOR: Sachin Patil
|
||||||
|
#+EMAIL: psachin@redhat.com
|
||||||
|
```
|
||||||
|
|
||||||
|
我们目前还不想创建一个目录,所以要将 `toc` 的值由 `t` 改为 `nil`,具体如下:
|
||||||
|
|
||||||
|
```
|
||||||
|
#+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:nil todo:t |:t
|
||||||
|
```
|
||||||
|
|
||||||
|
现在让我们添加一个章节和段落吧。章节是由一个星号(`*`)开头。我们从 Aaron 的贴子(来自 [Lipsum Lorem Ipsum 生成器][11])复制一些文本过来:
|
||||||
|
|
||||||
|
```
|
||||||
|
* Introduction
|
||||||
|
|
||||||
|
\paragraph{}
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem
|
||||||
|
nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in
|
||||||
|
diam libero. Nunc tristique ex a nibh egestas sollicitudin.
|
||||||
|
|
||||||
|
\paragraph{}
|
||||||
|
Mauris efficitur vitae ex id egestas. Vestibulum ligula felis,
|
||||||
|
pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non
|
||||||
|
elementum leo. Nullam molestie congue placerat. Phasellus tempor et
|
||||||
|
libero maximus commodo.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
![helloworld_file.png][13]
|
||||||
|
|
||||||
|
*helloworld.org 文件*
|
||||||
|
|
||||||
|
|
||||||
|
将内容修改好后,我们要把它导出为 PDF 格式。再次在 “Org” 的菜单选项中选择 “Export/Publish”,但是这次,要输入 `l`(“export to LaTeX”),紧跟着输入 `o`(“as PDF file and open”)。这次操作不止会打开 PDF 文件让你浏览,同时也会将文件保存为 `helloworld.pdf`,并保存在与 `helloworld.org` 的同一个目录下。
|
||||||
|
|
||||||
|
![org_to_pdf.png][15]
|
||||||
|
|
||||||
|
*将 helloworld.org 导出为 helloworld.pdf*
|
||||||
|
|
||||||
|
![org_and_pdf_file.png][17]
|
||||||
|
|
||||||
|
*打开 helloworld.pdf 文件*
|
||||||
|
|
||||||
|
你也可以按下 `Alt + x` 键,然后输入 `org-latex-export-to-pdf` 来将 org 文件导出为 PDF 文件。可以使用 `Tab` 键来自动补全命令。
|
||||||
|
|
||||||
|
Emacs 也会创建 `helloworld.tex` 文件来让你控制具体的内容。
|
||||||
|
|
||||||
|
![org_tex_pdf.png][19]
|
||||||
|
|
||||||
|
*Emacs 在三个不同的窗口中分别打开 LaTeX,org 和 PDF 文档。*
|
||||||
|
|
||||||
|
你可以使用命令来将 `.tex` 文件转换为 `.pdf` 文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
pdflatex helloworld.tex
|
||||||
|
```
|
||||||
|
|
||||||
|
你也可以将 `.org` 文件输出为 HTML 或是一个简单的文本格式的文件。我最喜欢 `.org` 文件的原因是他们可以被推送到 [GitHub][20] 上,然后同 markdown 一样被渲染。
|
||||||
|
|
||||||
|
### 创建一个 LaTeX 的 Beamer 简报
|
||||||
|
|
||||||
|
现在让我们更进一步,通过少量的修改上面的文档来创建一个 LaTeX [Beamer][21] 简报,如下所示:
|
||||||
|
|
||||||
|
```
|
||||||
|
#+TITLE: LaTeX Beamer presentation
|
||||||
|
#+DATE: \today
|
||||||
|
#+AUTHOR: Sachin Patil
|
||||||
|
#+EMAIL: psachin@redhat.com
|
||||||
|
#+OPTIONS: ':nil *:t -:t ::t <:t H:3 \n:nil ^:t arch:headline
|
||||||
|
#+OPTIONS: author:t c:nil creator:comment d:(not "LOGBOOK") date:t
|
||||||
|
#+OPTIONS: e:t email:nil f:t inline:t num:t p:nil pri:nil stat:t
|
||||||
|
#+OPTIONS: tags:t tasks:t tex:t timestamp:t toc:nil todo:t |:t
|
||||||
|
#+CREATOR: Emacs 25.3.1 (Org mode 8.2.10)
|
||||||
|
#+DESCRIPTION:
|
||||||
|
#+EXCLUDE_TAGS: noexport
|
||||||
|
#+KEYWORDS:
|
||||||
|
#+LANGUAGE: en
|
||||||
|
#+SELECT_TAGS: export
|
||||||
|
#+LATEX_CLASS: beamer
|
||||||
|
#+BEAMER_THEME: Frankfurt
|
||||||
|
#+BEAMER_INNER_THEME: rounded
|
||||||
|
|
||||||
|
|
||||||
|
* Introduction
|
||||||
|
*** Programming
|
||||||
|
- Python
|
||||||
|
- Ruby
|
||||||
|
|
||||||
|
*** Paragraph one
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing
|
||||||
|
elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat
|
||||||
|
ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas
|
||||||
|
sollicitudin.
|
||||||
|
|
||||||
|
*** Paragraph two
|
||||||
|
|
||||||
|
Mauris efficitur vitae ex id egestas. Vestibulum
|
||||||
|
ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac
|
||||||
|
imperdiet orci, non elementum leo. Nullam molestie congue
|
||||||
|
placerat. Phasellus tempor et libero maximus commodo.
|
||||||
|
|
||||||
|
* Thanks
|
||||||
|
*** Links
|
||||||
|
- Link one
|
||||||
|
- Link two
|
||||||
|
```
|
||||||
|
|
||||||
|
我们给标题增加了三行:
|
||||||
|
|
||||||
|
```
|
||||||
|
#+LATEX_CLASS: beamer
|
||||||
|
#+BEAMER_THEME: Frankfurt
|
||||||
|
#+BEAMER_INNER_THEME: rounded
|
||||||
|
```
|
||||||
|
|
||||||
|
导出为 PDF,按下 `Alt + x` 键后输入 `org-beamer-export-to-pdf`。
|
||||||
|
|
||||||
|
![latex_beamer_presentation.png][23]
|
||||||
|
|
||||||
|
*用 Emacs 和 Org 模式创建的 Latex Beamer 简报*
|
||||||
|
|
||||||
|
希望你会爱上使用 Emacs 来创建 LaTex 和 Beamer 文档(注意:使用快捷键比用鼠标更快些)。Emacs 的 Org 模式提供了比我在这篇文章中说的更多的功能,你可以在 [orgmode.org][24] 获取更多的信息.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/18/4/how-create-latex-documents-emacs
|
||||||
|
|
||||||
|
作者:[Sachin Patil][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[oneforalone](https://github.com/oneforalone)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]:https://opensource.com/users/psachin
|
||||||
|
[1]:https://opensource.com/article/17/6/introduction-latex
|
||||||
|
[2]:https://opensource.com/users/aaroncocker
|
||||||
|
[3]:https://www.latex-project.org
|
||||||
|
[4]:http://www.texstudio.org/
|
||||||
|
[5]:https://opensource.com/users/greg-p
|
||||||
|
[6]:https://www.gnu.org/software/emacs/
|
||||||
|
[7]:/file/392261
|
||||||
|
[8]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/emacs_startup.png?itok=UnT4PgK5 (Emacs startup screen)
|
||||||
|
[9]:/file/392266
|
||||||
|
[10]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/insert_template_flow.png?itok=V_c2KipO (template_flow.png)
|
||||||
|
[11]:https://www.lipsum.com/feed/html
|
||||||
|
[12]:/file/392271
|
||||||
|
[13]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/helloworld_file.png?itok=o8IX0TsJ (helloworld_file.png)
|
||||||
|
[14]:/file/392276
|
||||||
|
[15]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/org_to_pdf.png?itok=fNnC1Y-L (org_to_pdf.png)
|
||||||
|
[16]:/file/392281
|
||||||
|
[17]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/org_and_pdf_file.png?itok=HEhtw-cu (org_and_pdf_file.png)
|
||||||
|
[18]:/file/392286
|
||||||
|
[19]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/org_tex_pdf.png?itok=poZZV_tj (org_tex_pdf.png)
|
||||||
|
[20]:https://github.com
|
||||||
|
[21]:https://www.sharelatex.com/learn/Beamer
|
||||||
|
[22]:/file/392291
|
||||||
|
[23]:https://opensource.com/sites/default/files/styles/panopoly_image_original/public/images/life-uploads/latex_beamer_presentation.png?itok=rsPSeIuM (latex_beamer_presentation.png)
|
||||||
|
[24]:https://orgmode.org/worg/org-tutorials/org-latex-export.html
|
@ -0,0 +1,139 @@
|
|||||||
|
如何在终端中浏览 Stack Overflow
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://www.ostechnix.com/wp-content/uploads/2018/04/how2-720x340.png)
|
||||||
|
|
||||||
|
前段时间,我们写了一篇关于 [SoCLI][1] 的文章,它是一个从命令行搜索和浏览 Stack Overflow 网站的 python 脚本。今天,我们将讨论一个名为 “how2” 的类似工具。它是一个命令行程序,可以从终端浏览 Stack Overflow。你可以如你在 [Google 搜索][2]中那样直接用英语查询,然后它会使用 Google 和 Stackoverflow API 来搜索给定的查询。它是使用 NodeJS 编写的自由开源程序。
|
||||||
|
|
||||||
|
### 使用 how2 从终端浏览 Stack Overflow
|
||||||
|
|
||||||
|
由于 `how2` 是一个 NodeJS 包,我们可以使用 Npm 包管理器安装它。如果你尚未安装 Npm 和 NodeJS,请参考以下指南。
|
||||||
|
|
||||||
|
在安装 Npm 和 NodeJS 后,运行以下命令安装 how2。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ npm install -g how2
|
||||||
|
```
|
||||||
|
|
||||||
|
现在让我们看下如何使用这个程序浏览 Stack Overflow。使用 `how2` 搜索 Stack Overflow 站点的典型用法是:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ how2 <search-query>
|
||||||
|
```
|
||||||
|
|
||||||
|
例如,我将搜索如何创建 tgz 存档。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ how2 create archive tgz
|
||||||
|
```
|
||||||
|
|
||||||
|
哎呀!我收到以下错误。
|
||||||
|
|
||||||
|
```
|
||||||
|
/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59
|
||||||
|
Transport.prototype.__proto__ = EventEmitter.prototype;
|
||||||
|
^
|
||||||
|
|
||||||
|
TypeError: Cannot read property 'prototype' of undefined
|
||||||
|
at Object.<anonymous> (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59:46)
|
||||||
|
at Module._compile (internal/modules/cjs/loader.js:654:30)
|
||||||
|
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
|
||||||
|
at Module.load (internal/modules/cjs/loader.js:566:32)
|
||||||
|
at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
|
||||||
|
at Function.Module._load (internal/modules/cjs/loader.js:498:3)
|
||||||
|
at Module.require (internal/modules/cjs/loader.js:598:17)
|
||||||
|
at require (internal/modules/cjs/helpers.js:11:18)
|
||||||
|
at Object.<anonymous> (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/stream.js:8:17)
|
||||||
|
at Module._compile (internal/modules/cjs/loader.js:654:30)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
我可能遇到了一个 bug。我希望它在未来版本中得到修复。但是,我在[这里][3]找到了一个临时方法。
|
||||||
|
|
||||||
|
|
||||||
|
要临时修复此错误,你需要使用以下命令编辑 `transport.js`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vi /home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js
|
||||||
|
```
|
||||||
|
|
||||||
|
此文件的实际路径将显示在错误输出中。用你自己的文件路径替换上述文件路径。然后找到以下行:
|
||||||
|
|
||||||
|
```
|
||||||
|
var EventEmitter = process.EventEmitter;
|
||||||
|
```
|
||||||
|
|
||||||
|
并用以下行替换它:
|
||||||
|
|
||||||
|
```
|
||||||
|
var EventEmitter = require('events');
|
||||||
|
```
|
||||||
|
|
||||||
|
按 `ESC` 并输入 `:wq` 以保存并退出文件。
|
||||||
|
|
||||||
|
现在再次搜索查询。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ how2 create archive tgz
|
||||||
|
```
|
||||||
|
|
||||||
|
这是我的 Ubuntu 系统的示例输出。
|
||||||
|
|
||||||
|
![][5]
|
||||||
|
|
||||||
|
如果你要查找的答案未显示在上面的输出中,请按**空格键**键开始交互式搜索,你可以通过它查看 Stack Overflow 站点中的所有建议问题和答案。
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
使用向上/向下箭头在结果之间移动。得到正确的答案/问题后,点击空格键或回车键在终端中打开它。
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
要返回并退出,请按 `ESC`。
|
||||||
|
|
||||||
|
**搜索特定语言的答案**
|
||||||
|
|
||||||
|
如果你没有指定语言,它**默认为 Bash** unix 命令行,并立即为你提供最可能的答案。你还可以将结果缩小到特定语言,例如 perl、python、c、Java 等。
|
||||||
|
|
||||||
|
例如,使用 `-l` 标志仅搜索与 “Python” 语言相关的查询,如下所示。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ how2 -l python linked list
|
||||||
|
```
|
||||||
|
|
||||||
|
![][8]
|
||||||
|
|
||||||
|
要获得快速帮助,请输入:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ how2 -h
|
||||||
|
```
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
`how2` 是一个基本的命令行程序,它可以快速搜索 Stack Overflow 中的问题和答案,而无需离开终端,并且它可以很好地完成这项工作。但是,它只是 Stack overflow 的 CLI 浏览器。对于一些高级功能,例如搜索投票最多的问题,使用多个标签搜索查询,彩色界面,提交新问题和查看问题统计信息等,**SoCLI** 做得更好。
|
||||||
|
|
||||||
|
就是这些了。希望这篇文章有用。我将很快写一篇新的指南。在此之前,请继续关注!
|
||||||
|
|
||||||
|
干杯!
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.ostechnix.com/how-to-browse-stack-overflow-from-terminal/
|
||||||
|
|
||||||
|
作者:[SK][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[geekpi](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/
|
||||||
|
[1]:https://www.ostechnix.com/search-browse-stack-overflow-website-commandline/
|
||||||
|
[2]:https://www.ostechnix.com/google-search-navigator-enhance-keyboard-navigation-in-google-search/
|
||||||
|
[3]:https://github.com/santinic/how2/issues/79
|
||||||
|
[4]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
|
||||||
|
[5]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-1.png
|
||||||
|
[6]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-2.png
|
||||||
|
[7]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-3.png
|
||||||
|
[8]:http://www.ostechnix.com/wp-content/uploads/2018/04/stack-overflow-4.png
|
@ -0,0 +1,103 @@
|
|||||||
|
如何在 Anbox 上安装 Google Play 商店及启用 ARM 支持
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://4.bp.blogspot.com/-xBysI_ar5UU/W0NxTe42FkI/AAAAAAAAA2c/KTRtA4C2yYYN9aaMwwAwTXe8deXF4LdNgCLcBGAs/s1600/anbox-google-play-store.png)
|
||||||
|
|
||||||
|
[Anbox][1] (Anroid in a Box)是一个自由开源工具,它允许你在 Linux 上运行 Android 应用程序。它的工作原理是在 LXC 容器中运行 Android 运行时环境,重新创建 Android 的目录结构作为可挂载的 loop 镜像,同时使用本机 Linux 内核来执行应用。
|
||||||
|
|
||||||
|
据其网站所述,它的主要特性是安全性、性能、集成和趋同(不同外形尺寸缩放)。
|
||||||
|
|
||||||
|
使用 Anbox,每个 Android 应用或游戏就像系统应用一样都在一个单独的窗口中启动,它们的行为或多或少类似于常规窗口,显示在启动器中,可以平铺等等。
|
||||||
|
|
||||||
|
默认情况下,Anbox 没有 Google Play 商店或 ARM 应用支持。要安装应用,你必须下载每个应用的 APK 并使用 `adb` 手动安装。此外,默认情况下不能使用 Anbox 安装 ARM 应用或游戏 —— 尝试安装 ARM 应用会显示以下错误:
|
||||||
|
|
||||||
|
```
|
||||||
|
Failed to install PACKAGE.NAME.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
你可以在 Anbox 中手动设置 Google Play 商店和 ARM 应用支持(通过 libhoudini),但这是一个非常复杂的过程。为了更容易地在 Anbox 上安装 Google Play 商店和 Google Play 服务,并让它支持 ARM 应用程序和游戏(使用 libhoudini),[geeks-r-us.de][2](文章是德语)上的人创建了一个自动执行这些任务的脚本。
|
||||||
|
|
||||||
|
在使用之前,我想明确指出,即使在集成 libhoudini 来支持 ARM 后,也并非所有 Android 应用和游戏都能在 Anbox 中运行。某些 Android 应用和游戏可能根本不会出现在 Google Play 商店中,而一些应用和游戏可能可以安装但无法使用。此外,某些应用可能无法使用某些功能。
|
||||||
|
|
||||||
|
### 安装 Google Play 商店并在 Anbox 上启用 ARM 应用/游戏支持
|
||||||
|
|
||||||
|
如果你的 Linux 桌面上尚未安装 Anbox,这些说明显然不起作用。如果你还没有,请按照[此处][7]的安装说明安装 Anbox。此外,请确保在安装 Anbox 之后,使用此脚本之前至少运行一次 `anbox.appmgr`,以避免遇到问题。另外,确保在执行下面的脚本时 Anbox 没有运行(我怀疑这是导致评论中提到的这个[问题][8]的原因)。
|
||||||
|
|
||||||
|
1、 安装所需的依赖项(wget、lzip、unzip 和 squashfs-tools)。
|
||||||
|
|
||||||
|
在 Debian、Ubuntu 或 Linux Mint 中,使用此命令安装所需的依赖项:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt install wget lzip unzip squashfs-tools
|
||||||
|
```
|
||||||
|
|
||||||
|
2、 下载并运行脚本,在 Anbox 上自动下载并安装 Google Play 商店(和 Google Play 服务)和 libhoudini(用于 ARM 应用/游戏支持)。
|
||||||
|
|
||||||
|
**警告:永远不要在不知道它做什么的情况下运行不是你写的脚本。在运行此脚本之前,请查看其[代码][4]。**
|
||||||
|
|
||||||
|
要下载脚本,使其可执行并在 Linux 桌面上运行,请在终端中使用以下命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
wget https://raw.githubusercontent.com/geeks-r-us/anbox-playstore-installer/master/install-playstore.sh
|
||||||
|
chmod +x install-playstore.sh
|
||||||
|
sudo ./install-playstore.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
3、要让 Google Play 商店在 Anbox 中运行,你需要启用 Google Play 商店和 Google Play 服务的所有权限
|
||||||
|
|
||||||
|
为此,请运行Anbox:
|
||||||
|
|
||||||
|
```
|
||||||
|
anbox.appmgr
|
||||||
|
```
|
||||||
|
|
||||||
|
然后进入“设置 > 应用 > Google Play 服务 > 权限”并启用所有可用权限。对 Google Play 商店也一样!
|
||||||
|
|
||||||
|
![](https://4.bp.blogspot.com/-_eNBaOz1RFs/W0NySoRZ5qI/AAAAAAAAA2s/tJseV74r-3Y3M6dnUBmMo9mDfQLqNK7YwCLcBGAs/s1600/anbox-google-play-services-permissions.png)
|
||||||
|
|
||||||
|
你现在应该可以使用 Google 帐户登录 Google Play 商店了。
|
||||||
|
|
||||||
|
如果未启用 Google Play 商店和 Google Play 服务的所有权限,你可能会在尝试登录 Google 帐户时可能会遇到问题,并显示以下错误消息:“Couldn't sign in. There was a problem communicating with Google servers. Try again later“,如你在下面的截图中看到的那样:
|
||||||
|
|
||||||
|
![](https://4.bp.blogspot.com/-00ffP4iLTT4/W0NyBGECDLI/AAAAAAAAA2k/re7YRgzeU6M6ccVnODlYGak0UsdImrJ_ACLcBGAs/s1600/anbox-google-play-error-login-problem-google-servers.png)
|
||||||
|
|
||||||
|
登录后,你可以停用部分 Google Play 商店/Google Play 服务权限。
|
||||||
|
|
||||||
|
**如果你在 Anbox 上登录 Google 帐户时遇到一些连接问题**,请确保 `anbox-bride.sh` 正在运行:
|
||||||
|
|
||||||
|
启动它:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo /snap/anbox/current/bin/anbox-bridge.sh start
|
||||||
|
```
|
||||||
|
重启它:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo /snap/anbox/current/bin/anbox-bridge.sh restart
|
||||||
|
```
|
||||||
|
|
||||||
|
根据[此用户][9]的说法,如果 Anbox 仍然存在连接问题,你可能还需要安装 dnsmasq 包。但是在我的 Ubuntu 18.04 桌面上不需要这样做。
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.linuxuprising.com/2018/07/anbox-how-to-install-google-play-store.html
|
||||||
|
|
||||||
|
作者:[Logix][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]:https://plus.google.com/118280394805678839070
|
||||||
|
[1]:https://anbox.io/
|
||||||
|
[2]:https://geeks-r-us.de/2017/08/26/android-apps-auf-dem-linux-desktop/
|
||||||
|
[3]:https://github.com/geeks-r-us/anbox-playstore-installer/
|
||||||
|
[4]:https://github.com/geeks-r-us/anbox-playstore-installer/blob/master/install-playstore.sh
|
||||||
|
[5]:https://docs.anbox.io/userguide/install.html
|
||||||
|
[6]:https://github.com/anbox/anbox/issues/118#issuecomment-295270113
|
||||||
|
[7]:https://github.com/anbox/anbox/blob/master/docs/install.md
|
||||||
|
[8]:https://www.linuxuprising.com/2018/07/anbox-how-to-install-google-play-store.html?showComment=1533506821283#c4415289781078860898
|
||||||
|
[9]:https://github.com/anbox/anbox/issues/118#issuecomment-295270113
|
@ -0,0 +1,109 @@
|
|||||||
|
i3 窗口管理器使 Linux 更美好
|
||||||
|
======
|
||||||
|
|
||||||
|
> 通过键盘操作的 i3 平铺窗口管理器使用 Linux 桌面。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud-windows.png?itok=jd5sBNQH)
|
||||||
|
|
||||||
|
Linux(和一般的开源软件)最美好的一点是自由 —— 可以在不同的替代方案中进行选择以满足我们的需求。
|
||||||
|
|
||||||
|
我使用 Linux 已经很长时间了,但我从来没有对可选用的桌面环境完全满意过。直到去年,[Xfce][1] 还是我认为在功能和性能之间的平和最接近满意的一个桌面环境。然后我发现了 [i3][2],这是一个改变了我的生活的惊人的软件。
|
||||||
|
|
||||||
|
i3 是一个平铺窗口管理器。窗口管理器的目标是控制窗口系统中窗口的外观和位置。窗口管理器通常用作功能齐全的桌面环境 (如 GONME 或 Xfce ) 的一部分,但也有一些可以用作独立的应用程序。
|
||||||
|
|
||||||
|
平铺式窗口管理器会自动排列窗口,以不重叠的方式占据整个屏幕。其他流行的平铺式窗口管理器还有 [wmii][3] 和 [xmonad][4] 。
|
||||||
|
|
||||||
|
![i3 tiled window manager screenshot][6]
|
||||||
|
|
||||||
|
*带有三个的 i3 屏幕截图*
|
||||||
|
|
||||||
|
为了获得更好的 Linux 桌面体验,以下是我使用和推荐 i3 窗口管理器的五个首要原因。
|
||||||
|
|
||||||
|
### 1、极简艺术
|
||||||
|
|
||||||
|
i3 速度很快。它既不冗杂、也不花哨。它的设计简单而高效。作为开发人员,我重视这些功能,因为我可以使用更多的功能以丰富我最喜欢的开发工具,或者使用容器或虚拟机在本地测试内容。
|
||||||
|
|
||||||
|
此外, i3 是一个窗口管理器,与功能齐全的桌面环境不同,它并不规定您应该使用的应用程序。您是否想使用 Xfce 的 Thunar 作为文件管理器?GNOME 的 gedit 去编辑文本? i3 并不在乎。选择对您的工作流最有意义的工具,i3 将以相同的方式管理它们。
|
||||||
|
|
||||||
|
### 2、屏幕实际使用面积
|
||||||
|
|
||||||
|
作为平铺式窗口管理器,i3 将自动 “平铺”,以不重叠的方式定位窗口,类似于在墙上放置瓷砖。因为您不需要担心窗口定位,i3 一般会更好地利用您的屏幕空间。它还可以让您更快地找到您需要的东西。
|
||||||
|
|
||||||
|
对于这种情况有很多有用的例子。例如,系统管理员可以打开多个终端来同时监视或在不同的远程系统上工作;开发人员可以使用他们最喜欢的 IDE 或编辑器和几个终端来测试他们的程序。
|
||||||
|
|
||||||
|
此外,i3 具有灵活性。如果您需要为特定窗口提供更多空间,请启用全屏模式或切换到其他布局,如堆叠或选项卡式(标签式)。
|
||||||
|
|
||||||
|
### 3、键盘式工作流程
|
||||||
|
|
||||||
|
i3 广泛使用键盘快捷键来控制环境的不同方面。其中包括打开终端和其他程序、调整大小和定位窗口、更改布局,甚至退出 i3。当您开始使用 i3 时,您需要记住其中的一些快捷方式才能使用,随着时间的推移,您会使用更多的快捷方式。
|
||||||
|
|
||||||
|
主要好处是,您不需要经常在键盘和鼠标之间切换。通过练习,您将提高工作流程的速度和效率。
|
||||||
|
|
||||||
|
例如, 要打开新的终端,请按 `<SUPER>+<ENTER>`。由于窗口是自动定位的,您可以立即开始键入命令。结合一个很好的终端文本编辑器(如 Vim)和一个以面向键盘的浏览器,形成一个完全由键盘驱动的工作流程。
|
||||||
|
|
||||||
|
在 i3 中,您可以为所有内容定义快捷方式。下面是一些示例:
|
||||||
|
|
||||||
|
* 打开终端
|
||||||
|
* 打开浏览器
|
||||||
|
* 更改布局
|
||||||
|
* 调整窗口大小
|
||||||
|
* 控制音乐播放器
|
||||||
|
* 切换工作区
|
||||||
|
|
||||||
|
现在我已经习惯了这个工作形式,我已无法回到了常规的桌面环境。
|
||||||
|
|
||||||
|
### 4、灵活
|
||||||
|
|
||||||
|
i3 力求极简,使用很少的系统资源,但这并不意味着它不能变漂亮。i3 是灵活且可通过多种方式进行自定义以改善视觉体验。因为 i3 是一个窗口管理器,所以它没有提供启用自定义的工具,你需要外部工具来实现这一点。一些例子:
|
||||||
|
|
||||||
|
* 用 `feh` 定义桌面的背景图片。
|
||||||
|
* 使用合成器管理器,如 `compton` 以启用窗口淡入淡出和透明度等效果。
|
||||||
|
* 用 `dmenu` 或 `rofi` 以启用可从键盘快捷方式启动的可自定义菜单。
|
||||||
|
* 用 `dunst` 用于桌面通知。
|
||||||
|
|
||||||
|
i3 是可完全配置的,您可以通过更新默认配置文件来控制它的各个方面。从更改所有键盘快捷键,到重新定义工作区的名称,再到修改状态栏,您都可以使 i3 以任何最适合您需要的方式运行。
|
||||||
|
|
||||||
|
![i3 with rofi menu and dunst desktop notifications][8]
|
||||||
|
|
||||||
|
*i3 与 `rofi` 菜单和 `dunst` 桌面通知。*
|
||||||
|
|
||||||
|
最后,对于更高级的用户,i3 提供了完整的进程间通信([IPC][9])接口,允许您使用偏好的语言来开发脚本或程序,以实现更多的自定义选项。
|
||||||
|
|
||||||
|
### 5、工作空间
|
||||||
|
|
||||||
|
在 i3 中,工作区是对窗口进行分组的一种简单方法。您可以根据您的工作流以不同的方式对它们进行分组。例如,您可以将浏览器放在一个工作区上,终端放在另一个工作区上,将电子邮件客户端放在第三个工作区上等等。您甚至可以更改 i3 的配置,以便始终将特定应用程序分配给它们自己的工作区。
|
||||||
|
|
||||||
|
切换工作区既快速又简单。像 i3 中的惯例,使用键盘快捷方式执行此操作。按 `<SUPER>+num` 切换到工作区 `num` 。如果您养成了始终将应用程序组的窗口分配到同一个工作区的习惯,则可以在它们之间快速切换,这使得工作区成为非常有用的功能。
|
||||||
|
|
||||||
|
此外,还可以使用工作区来控制多监视器环境,其中每个监视器都有个初始工作区。如果切换到该工作区,则切换到该监视器,而无需让手离开键盘。
|
||||||
|
|
||||||
|
最后,i3 中还有另一种特殊类型的工作空间:the scratchpad(便笺簿)。它是一个不可见的工作区,通过按快捷方式显示在其他工作区的中间。这是一种访问您经常使用的窗口或程序的方便方式,如电子邮件客户端或音乐播放器。
|
||||||
|
|
||||||
|
### 尝试一下吧
|
||||||
|
|
||||||
|
如果您重视简洁和效率,并且不惮于使用键盘,i3 就是您的窗口管理器。有人说是为高级用户准备的,但情况不一定如此。你需要学习一些基本的快捷方式来度过开始的阶段,不久就会越来越自然并且不假思索地使用它们。
|
||||||
|
|
||||||
|
这篇文章只是浅浅谈及了 i3 能做的事情。欲了解更多详情,请参阅 [i3 的文档][10]。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/18/8/i3-tiling-window-manager
|
||||||
|
|
||||||
|
作者:[Ricardo Gerardi][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[lixinyuxx](https://github.com/lixinyuxx)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]:https://opensource.com/users/rgerardi
|
||||||
|
[1]:https://xfce.org/
|
||||||
|
[2]:https://i3wm.org/
|
||||||
|
[3]:https://code.google.com/archive/p/wmii/
|
||||||
|
[4]:https://xmonad.org/
|
||||||
|
[5]:/file/406476
|
||||||
|
[6]:https://opensource.com/sites/default/files/uploads/i3_screenshot.png "i3 tiled window manager screenshot"
|
||||||
|
[7]:/file/405161
|
||||||
|
[8]:https://opensource.com/sites/default/files/uploads/rofi_dunst.png "i3 with rofi menu and dunst desktop notifications"
|
||||||
|
[9]:https://i3wm.org/docs/ipc.html
|
||||||
|
[10]:https://i3wm.org/docs/userguide.html
|
@ -1,24 +1,26 @@
|
|||||||
Dropbox 将在 Linux 上终止除了 Ext4 之外所有文件系统的同步支持
|
Dropbox 在 Linux 上终止除了 Ext4 之外所有文件系统的同步支持
|
||||||
======
|
======
|
||||||
Dropbox 正考虑将同步支持限制为少数几种文件系统类型:Windows 的 NTFS、macOS 的 HFS+/APFS 和 Linux 的 Ext4。
|
|
||||||
|
> Dropbox 正考虑将同步支持限制为少数几种文件系统类型:Windows 的 NTFS、macOS 的 HFS+/APFS 和 Linux 的 Ext4。
|
||||||
|
|
||||||
![Dropbox ends support for various file system types][1]
|
![Dropbox ends support for various file system types][1]
|
||||||
|
|
||||||
[Dropbox][2] 是最受欢迎的[ Linux 中的云服务][3]之一。很多人正好使用的是 Linux 下的 Dropbox 同步客户端。但是,最近,一些用户在他们的 Dropbox Linux 桌面客户端上收到一条警告说:
|
[Dropbox][2] 是最受欢迎的 [Linux 中的云服务][3]之一。很多人都在使用 Linux 下的 Dropbox 同步客户端。但是,最近,一些用户在他们的 Dropbox Linux 桌面客户端上收到一条警告说:
|
||||||
|
|
||||||
> “移动 Dropbox 文件夹位置,
|
> “移动 Dropbox 文件夹位置,
|
||||||
> Dropbox 将在 11 月停止同步“
|
> Dropbox 将在 11 月停止同步“
|
||||||
|
|
||||||
### Dropbox 将仅支持少量文件系统
|
### Dropbox 将仅支持少量文件系统
|
||||||
|
|
||||||
一个[ Reddit 主题][4]高亮了一位用户在[ Dropbox 论坛][5]上查询了该消息后的公告,该消息是社区管理员带来的意外消息。这是[回复][6]中的内容:
|
一个 [Reddit 主题][4]强调了一位用户在 [Dropbox 论坛][5]上查询了该消息后的公告,该消息被社区管理员标记为意外新闻。这是[回复][6]中的内容:
|
||||||
|
|
||||||
> **“大家好,在 2018 年 11 月 7 日,我们会结束 Dropbox 在某些不常见文件系统的同步支持。支持的文件系统是 Windows 的 NTFS、macOS 的 HFS+ 或 APFS,以及Linux 的 Ext4。**
|
> “大家好,在 2018 年 11 月 7 日,我们会结束 Dropbox 在某些不常见文件系统的同步支持。支持的文件系统是 Windows 的 NTFS、macOS 的 HFS+ 或 APFS,以及Linux 的 Ext4。
|
||||||
>
|
>
|
||||||
> [Dropbox 官方论坛][6]
|
> [Dropbox 官方论坛][6]
|
||||||
|
|
||||||
![Dropbox official confirmation over limitation on supported file systems][7]
|
![Dropbox official confirmation over limitation on supported file systems][7]
|
||||||
Dropbox 官方确认支持文件系统的限制
|
|
||||||
|
*Dropbox 官方确认支持文件系统的限制*
|
||||||
|
|
||||||
此举旨在提供稳定和一致的体验。Dropbox 还更新了其[桌面要求][8]。
|
此举旨在提供稳定和一致的体验。Dropbox 还更新了其[桌面要求][8]。
|
||||||
|
|
||||||
@ -31,11 +33,12 @@ Linux 仅支持 Ext4 文件系统。但这并不是一个令人担忧的新闻
|
|||||||
在 Ubuntu 或其他基于 Ubuntu 的发行版上,打开磁盘应用并查看 Linux 系统所在分区的文件系统。
|
在 Ubuntu 或其他基于 Ubuntu 的发行版上,打开磁盘应用并查看 Linux 系统所在分区的文件系统。
|
||||||
|
|
||||||
![Check file system type on Ubuntu][9]
|
![Check file system type on Ubuntu][9]
|
||||||
检查 Ubuntu 上的文件系统类型
|
|
||||||
|
*检查 Ubuntu 上的文件系统类型*
|
||||||
|
|
||||||
如果你的系统上没有安装磁盘应用,那么可以[使用命令行了解文件系统类型][10]。
|
如果你的系统上没有安装磁盘应用,那么可以[使用命令行了解文件系统类型][10]。
|
||||||
|
|
||||||
如果你使用的是 Ext4 文件系统并仍然收到来自 Dropbox 的警告,请检查你是否有可能收到通知的非活动计算机/设备。如果是,[将该系统与你的 Dropbox 帐户取消链接][11]。
|
如果你使用的是 Ext4 文件系统并仍然收到来自 Dropbox 的警告,请检查你是否有可能收到通知的非活动计算机/设备。如果是,[将该系统与你的 Dropbox 帐户取消连接][11]。
|
||||||
|
|
||||||
### Dropbox 也不支持加密的 Ext4 吗?
|
### Dropbox 也不支持加密的 Ext4 吗?
|
||||||
|
|
||||||
@ -51,21 +54,21 @@ via: https://itsfoss.com/dropbox-linux-ext4-only/
|
|||||||
|
|
||||||
作者:[Ankush Das][a]
|
作者:[Ankush Das][a]
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
译者:[译者ID](https://github.com/译者ID)
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
[a]: https://itsfoss.com/author/ankush/
|
[a]: https://itsfoss.com/author/ankush/
|
||||||
[1]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/08/dropbox-filesystem-support-featured.png
|
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/08/dropbox-filesystem-support-featured.png?w=800&ssl=1
|
||||||
[2]: https://www.dropbox.com/
|
[2]: https://www.dropbox.com/
|
||||||
[3]: https://itsfoss.com/cloud-services-linux/
|
[3]: https://itsfoss.com/cloud-services-linux/
|
||||||
[4]: https://www.reddit.com/r/linux/comments/966xt0/linux_dropbox_client_will_stop_syncing_on_any/
|
[4]: https://www.reddit.com/r/linux/comments/966xt0/linux_dropbox_client_will_stop_syncing_on_any/
|
||||||
[5]: https://www.dropboxforum.com/t5/Syncing-and-uploads/
|
[5]: https://www.dropboxforum.com/t5/Syncing-and-uploads/
|
||||||
[6]: https://www.dropboxforum.com/t5/Syncing-and-uploads/Linux-Dropbox-client-warn-me-that-it-ll-stop-syncing-in-Nov-why/m-p/290065/highlight/true#M42255
|
[6]: https://www.dropboxforum.com/t5/Syncing-and-uploads/Linux-Dropbox-client-warn-me-that-it-ll-stop-syncing-in-Nov-why/m-p/290065/highlight/true#M42255
|
||||||
[7]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/08/dropbox-stopping-file-system-supports.jpeg
|
[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/08/dropbox-stopping-file-system-supports.jpeg?w=800&ssl=1
|
||||||
[8]: https://www.dropbox.com/help/desktop-web/system-requirements#desktop
|
[8]: https://www.dropbox.com/help/desktop-web/system-requirements#desktop
|
||||||
[9]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/08/check-file-system-type-ubuntu.jpg
|
[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/08/check-file-system-type-ubuntu.jpg?w=800&ssl=1
|
||||||
[10]: https://www.thegeekstuff.com/2011/04/identify-file-system-type/
|
[10]: https://www.thegeekstuff.com/2011/04/identify-file-system-type/
|
||||||
[11]: https://www.dropbox.com/help/mobile/unlink-relink-computer-mobile
|
[11]: https://www.dropbox.com/help/mobile/unlink-relink-computer-mobile
|
||||||
[12]: https://www.dropbox.com/help/desktop-web/cant-establish-secure-connection#location
|
[12]: https://www.dropbox.com/help/desktop-web/cant-establish-secure-connection#location
|
@ -0,0 +1,100 @@
|
|||||||
|
顶级 Linux 开发者推荐的编程书籍
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://www.hpe.com/content/dam/hpe/insights/articles/2018/08/top-linux-developers-recommended-programming-books/featuredStory/Top-recommended-programming-books.jpg)
|
||||||
|
|
||||||
|
> 毫无疑问,Linux 是由那些拥有深厚计算机知识背景而且才华横溢的程序员发明的。让那些大名鼎鼎的 Linux 程序员向如今的开发者分享一些曾经带领他们登堂入室的好书和技术参考资料吧,你会不会也读过其中几本呢?
|
||||||
|
|
||||||
|
Linux,毫无争议的属于 21 世纪的操作系统。虽然 Linus Torvalds 在建立开源社区这件事上做了很多工作和社区决策,不过那些网络专家和开发者愿意接受 Linux 的原因还是因为它卓越的代码质量和高可用性。Torvalds 是个编程天才,同时必须承认他还是得到了很多其他同样极具才华的开发者的无私帮助。
|
||||||
|
|
||||||
|
就此我咨询了 Torvalds 和其他一些顶级 Linux 开发者,有哪些书籍帮助他们走上了成为顶级开发者的道路,下面请听我一一道来。
|
||||||
|
|
||||||
|
### 熠熠生辉的 C 语言
|
||||||
|
|
||||||
|
Linux 是在大约上世纪 90 年代开发出来的,与它一起问世的还有其他一些完成基础功能的开源软件。与此相应,那时的开发者使用的工具和语言反映了那个时代的印记,也就是说 C 语言。可能 [C 语言不再流行了][1],可对于很多已经建功立业的开发者来说,C 语言是他们的第一个在实际开发中使用的语言,这一点也在他们推选的对他们有着深远影响的书单中反映出来。
|
||||||
|
|
||||||
|
Torvalds 说,“你不应该再选用我那个时代使用的语言或者开发方式”,他的开发道路始于 BASIC,然后转向机器码(“甚至都不是汇编语言,而是真真正正的‘二进制’机器码”,他解释道),再然后转向汇编语言和 C 语言。
|
||||||
|
|
||||||
|
“任何人都不应该再从这些语言开始进入开发这条路了”,他补充道。“这些语言中的一些今天已经没有什么意义(如 BASIC 和机器语言)。尽管 C 还是一个主流语言,我也不推荐你从它开始。”
|
||||||
|
|
||||||
|
并不是他不喜欢 C。不管怎样,Linux 是用 [GNU C 语言][2]写就的。“我始终认为 C 是一个伟大的语言,它有着非常简单的语法,对于很多方向的开发都很合适,但是我怀疑你会遇到重重挫折,从你的第一个‘Hello World’程序开始到你真正能开发出能用的东西当中有很大一步要走”。他认为,用现在的标准,如果作为入门语言的话,从 C 语言开始的代价太大。
|
||||||
|
|
||||||
|
在他那个时代,Torvalds 的唯一选择的书就只能是 Brian W. Kernighan 和 Dennis M. Ritchie 合著的《<ruby>[C 编程语言,第二版][3]<rt>C Programming Language, 2nd Edition</rt></ruby>》,它在编程圈内也被尊称为 K&R。“这本书简单精炼,但是你要先有编程的背景才能欣赏它”,Torvalds 说到。
|
||||||
|
|
||||||
|
Torvalds 并不是唯一一个推荐 K&R 的开源开发者。以下几位也同样引用了这本他们认为值得推荐的书籍,他们有:Linux 和 Oracle 虚拟化开发副总裁 Wim Coekaerts;Linux 开发者 Alan Cox;Google 云 CTO Brian Stevens;Canonical 技术运营部副总裁 Pete Graner。
|
||||||
|
|
||||||
|
如果你今日还想同 C 语言较量一番的话,Samba 的共同创始人 Jeremy Allison 推荐《<ruby>[C 程序设计新思维][4]<rt>21st Century C: C Tips from the New School</rt></ruby>》。他还建议,同时也去阅读一本比较旧但是写的更详细的《<ruby>[C 专家编程][5]<rt>Expert C Programming: Deep C Secrets</rt></ruby>》和有着 20 年历史的《<ruby>[POSIX 多线程编程][6]<rt>Programming with POSIX Threads</rt></ruby>》。
|
||||||
|
|
||||||
|
### 如果不选 C 语言, 那选什么?
|
||||||
|
|
||||||
|
Linux 开发者推荐的书籍自然都是他们认为适合今时今日的开发项目的语言工具。这也折射了开发者自身的个人偏好。例如,Allison 认为年轻的开发者应该在《<ruby>[Go 编程语言][7]<rt>The Go Programming Language</rt></ruby>》和《<ruby>[Rust 编程][8]<rt>Rust with Programming Rust</rt></ruby>》的帮助下去学习 Go 语言和 Rust 语言。
|
||||||
|
|
||||||
|
但是超越编程语言来考虑问题也不无道理(尽管这些书传授了你编程技巧)。今日要做些有意义的开发工作的话,"要从那些已经完成了 99% 显而易见工作的框架开始,然后你就能围绕着它开始写脚本了", Torvalds 推荐了这种做法。
|
||||||
|
|
||||||
|
“坦率来说,语言本身远远没有围绕着它的基础架构重要”,他继续道,“可能你会从 Java 或者 Kotlin 开始,但那是因为你想为自己的手机开发一个应用,因此安卓 SDK 成为了最佳的选择,又或者,你对游戏开发感兴趣,你选择了一个游戏开发引擎来开始,而通常它们有着自己的脚本语言”。
|
||||||
|
|
||||||
|
这里提及的基础架构包括那些和操作系统本身相关的编程书籍。
|
||||||
|
Garner 在读完了大名鼎鼎的 K&R 后又拜读了 W. Richard Steven 的《<ruby>[Unix 网络编程][10]<rt>Unix Network Programming</rt></ruby>》。特别是,Steven 的《<ruby>[TCP/IP 详解,卷1:协议][11]<rt>TCP/IP Illustrated, Volume 1: The Protocols</rt></ruby>》在出版了 30 年之后仍然被认为是必读之书。因为 Linux 开发很大程度上和[和网络基础架构有关][12],Garner 也推荐了很多 O'Reilly 在 [Sendmail][13]、[Bash][14]、[DNS][15] 以及 [IMAP/POP][16] 等方面的书。
|
||||||
|
|
||||||
|
Coekaerts 也是 Maurice Bach 的《<ruby>[UNIX 操作系统设计][17]<rt>The Design of the Unix Operation System</rt></ruby>》的书迷之一。James Bottomley 也是这本书的推崇者,作为一个 Linux 内核开发者,当 Linux 刚刚问世时 James 就用 Bach 的这本书所传授的知识将它研究了个底朝天。
|
||||||
|
|
||||||
|
### 软件设计知识永不过时
|
||||||
|
|
||||||
|
尽管这样说有点太局限在技术领域。Stevens 还是说到,“所有的开发者都应该在开始钻研语法前先研究如何设计,《<ruby>[设计心理学][18]<rt>The Design of Everyday Things</rt></ruby>》是我的最爱”。
|
||||||
|
|
||||||
|
Coekaerts 喜欢 Kernighan 和 Rob Pike 合著的《<ruby>[程序设计实践][19]<rt>The Practic of Programming</rt></ruby>》。这本关于设计实践的书当 Coekaerts 还在学校念书的时候还未出版,他说道,“但是我把它推荐给每一个人”。
|
||||||
|
|
||||||
|
不管何时,当你问一个长期从事于开发工作的开发者他最喜欢的计算机书籍时,你迟早会听到一个名字和一本书:Donald Knuth 和他所著的《<ruby>[计算机程序设计艺术(1-4A)][20]<rt>The Art of Computer Programming, Volumes 1-4A</rt></ruby>》。VMware 首席开源官 Dirk Hohndel,认为这本书尽管有永恒的价值,但他也承认,“今时今日并非极其有用”。(LCTT 译注:不代表译者观点)
|
||||||
|
|
||||||
|
### 读代码。大量的读。
|
||||||
|
|
||||||
|
编程书籍能教会你很多,也请别错过另外一个在开源社区特有的学习机会:《<ruby>[代码阅读方法与实践][21]<rt>Code Reading: The Open Source Perspective</rt></ruby>》。那里有不可计数的代码例子阐述如何解决编程问题(以及如何让你陷入麻烦……)。Stevens 说,谈到磨炼编程技巧,在他的书单里排名第一的“书”是 Unix 的源代码。
|
||||||
|
|
||||||
|
“也请不要忽略从他人身上学习的各种机会。” Cox 道,“我是在一个计算机俱乐部里和其他人一起学的 BASIC,在我看来,这仍然是一个学习的最好办法”,他从《<ruby>[精通 ZX81 机器码][22]<rt>Mastering machine code on your ZX81</rt></ruby>》这本书和 Honeywell L66 B 编译器手册里学习到了如何编写机器码,但是学习技术这点来说,单纯阅读和与其他开发者在工作中共同学习仍然有着很大的不同。
|
||||||
|
|
||||||
|
Cox 说,“我始终认为最好的学习方法是和一群人一起试图去解决你们共同关心的一些问题并从中找到快乐,这和你是 5 岁还是 55 岁无关”。
|
||||||
|
|
||||||
|
最让我吃惊的是这些顶级 Linux 开发者都是在非常底层级别开始他们的开发之旅的,甚至不是从汇编语言或 C 语言,而是从机器码开始开发。毫无疑问,这对帮助开发者理解计算机在非常微观的底层级别是怎么工作的起了非常大的作用。
|
||||||
|
|
||||||
|
那么现在你准备好尝试一下硬核 Linux 开发了吗?Greg Kroah-Hartman,这位 Linux 内核稳定分支的维护者,推荐了 Steve Oualline 的《<ruby>[实用 C 语言编程][23]<rt>Practical C Programming</rt></ruby>》和 Samuel harbison 与 Guy Steels 合著的《<ruby>[C 语言参考手册][24]<rt>C: A Reference Manual</rt></ruby>》。接下来请阅读<ruby>[如何进行 Linux 内核开发][25]<rt>HOWTO do Linux kernel development</rt></ruby>,到这时,就像 Kroah-Hartman 所说,你已经准备好启程了。
|
||||||
|
|
||||||
|
于此同时,还请你刻苦学习并大量编码,最后祝你在跟随顶级 Linux 开发者脚步的道路上好运相随。
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.hpe.com/us/en/insights/articles/top-linux-developers-recommended-programming-books-1808.html
|
||||||
|
|
||||||
|
作者:[Steven Vaughan-Nichols][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[DavidChenLiang](https://github.com/DavidChenLiang)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]:https://www.hpe.com/us/en/insights/contributors/steven-j-vaughan-nichols.html
|
||||||
|
[1]:https://www.codingdojo.com/blog/7-most-in-demand-programming-languages-of-2018/
|
||||||
|
[2]:https://www.gnu.org/software/gnu-c-manual/
|
||||||
|
[3]:https://amzn.to/2nhyjEO
|
||||||
|
[4]:https://amzn.to/2vsL8k9
|
||||||
|
[5]:https://amzn.to/2KBbWn9
|
||||||
|
[6]:https://amzn.to/2M0rfeR
|
||||||
|
[7]:https://amzn.to/2nhyrnMe
|
||||||
|
[8]:http://shop.oreilly.com/product/0636920040385.do
|
||||||
|
[9]:https://www.hpe.com/us/en/resources/storage/containers-for-dummies.html?jumpid=in_510384402_linuxbooks_containerebook0818
|
||||||
|
[10]:https://amzn.to/2MfpbyC
|
||||||
|
[11]:https://amzn.to/2MpgrTn
|
||||||
|
[12]:https://www.hpe.com/us/en/insights/articles/how-to-see-whats-going-on-with-your-linux-system-right-now-1807.html
|
||||||
|
[13]:http://shop.oreilly.com/product/9780596510299.do
|
||||||
|
[14]:http://shop.oreilly.com/product/9780596009656.do
|
||||||
|
[15]:http://shop.oreilly.com/product/9780596100575.do
|
||||||
|
[16]:http://shop.oreilly.com/product/9780596000127.do
|
||||||
|
[17]:https://amzn.to/2vsCJgF
|
||||||
|
[18]:https://amzn.to/2APzt3Z
|
||||||
|
[19]:https://www.amazon.com/Practice-Programming-Addison-Wesley-Professional-Computing/dp/020161586X/ref=as_li_ss_tl?ie=UTF8&linkCode=sl1&tag=thegroovycorpora&linkId=e6bbdb1ca2182487069bf9089fc8107e&language=en_US
|
||||||
|
[20]:https://amzn.to/2OknFsJ
|
||||||
|
[21]:https://amzn.to/2M4VVL3
|
||||||
|
[22]:https://amzn.to/2OjccJA
|
||||||
|
[23]:http://shop.oreilly.com/product/9781565923065.do
|
||||||
|
[24]:https://amzn.to/2OjzgrT
|
||||||
|
[25]:https://www.kernel.org/doc/html/v4.16/process/howto.html
|
File diff suppressed because it is too large
Load Diff
@ -3,11 +3,12 @@
|
|||||||
|
|
||||||
![](https://fedoramagazine.org/wp-content/uploads/2018/08/conu-816x345.jpg)
|
![](https://fedoramagazine.org/wp-content/uploads/2018/08/conu-816x345.jpg)
|
||||||
|
|
||||||
越来越多的开发人员使用容器开发和部署他们的应用。这意味着可以轻松地测试容器也变得很重要。[Conu][1] (container utilities 的简写) 是一个Python库,让你编写容器测试变得简单。本文向你介绍如何使用它测试容器。
|
越来越多的开发人员使用容器开发和部署他们的应用。这意味着可以轻松地测试容器也变得很重要。[Conu][1] (container utilities 的简写) 是一个 Python 库,让你编写容器测试变得简单。本文向你介绍如何使用它测试容器。
|
||||||
|
|
||||||
### 开始吧
|
### 开始吧
|
||||||
|
|
||||||
首先,你需要一个容器程序来测试。为此,以下命令创建一个包含一个容器 Dockerfile 和一个被容器伺服的 Flask 应用程序的文件夹。
|
首先,你需要一个容器程序来测试。为此,以下命令创建一个包含一个容器的 Dockerfile 和一个被容器伺服的 Flask 应用程序的文件夹。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ mkdir container_test
|
$ mkdir container_test
|
||||||
$ cd container_test
|
$ cd container_test
|
||||||
@ -15,7 +16,8 @@ $ touch Dockerfile
|
|||||||
$ touch app.py
|
$ touch app.py
|
||||||
```
|
```
|
||||||
|
|
||||||
将以下代码复制到 app.py 文件中。这是惯常的基本 Flask 应用,它返回字符串“Hello Container World!”。
|
将以下代码复制到 `app.py` 文件中。这是惯常的基本 Flask 应用,它返回字符串 “Hello Container World!”。
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
@ -31,6 +33,7 @@ if __name__ == '__main__':
|
|||||||
### 创建和构建测试容器
|
### 创建和构建测试容器
|
||||||
|
|
||||||
为了构建测试容器,将以下指令添加到 Dockerfile。
|
为了构建测试容器,将以下指令添加到 Dockerfile。
|
||||||
|
|
||||||
```dockerfile
|
```dockerfile
|
||||||
FROM registry.fedoraproject.org/fedora-minimal:latest
|
FROM registry.fedoraproject.org/fedora-minimal:latest
|
||||||
RUN microdnf -y install python3-flask && microdnf clean all
|
RUN microdnf -y install python3-flask && microdnf clean all
|
||||||
@ -39,6 +42,7 @@ CMD ["python3", "/srv/app.py"]
|
|||||||
```
|
```
|
||||||
|
|
||||||
然后使用 Docker CLI 工具构建容器。
|
然后使用 Docker CLI 工具构建容器。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ sudo dnf -y install docker
|
$ sudo dnf -y install docker
|
||||||
$ sudo systemctl start docker
|
$ sudo systemctl start docker
|
||||||
@ -48,6 +52,7 @@ $ sudo docker build . -t flaskapp_container
|
|||||||
提示:只有在系统上未安装 Docker 时才需要前两个命令。
|
提示:只有在系统上未安装 Docker 时才需要前两个命令。
|
||||||
|
|
||||||
构建之后使用以下命令运行容器。
|
构建之后使用以下命令运行容器。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ sudo docker run -p 5000:5000 --rm flaskapp_container
|
$ sudo docker run -p 5000:5000 --rm flaskapp_container
|
||||||
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
|
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
|
||||||
@ -56,17 +61,19 @@ $ sudo docker run -p 5000:5000 --rm flaskapp_container
|
|||||||
* Debugger PIN: 473-505-51
|
* Debugger PIN: 473-505-51
|
||||||
```
|
```
|
||||||
|
|
||||||
最后,使用 curl 检查 Flask 应用程序是否在容器内正确运行:
|
最后,使用 `curl` 检查 Flask 应用程序是否在容器内正确运行:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ curl http://127.0.0.1:5000
|
$ curl http://127.0.0.1:5000
|
||||||
Hello Container World!
|
Hello Container World!
|
||||||
```
|
```
|
||||||
|
|
||||||
现在,flaskapp_container 正在运行并准备好进行测试,你可以使用 Ctrl+C 将其停止。
|
现在,flaskapp_container 正在运行并准备好进行测试,你可以使用 `Ctrl+C` 将其停止。
|
||||||
|
|
||||||
### 创建测试脚本
|
### 创建测试脚本
|
||||||
|
|
||||||
在编写测试脚本之前,必须安装 conu。在先前创建的 container_test 目录中,运行以下命令。
|
在编写测试脚本之前,必须安装 `conu`。在先前创建的 `container_test` 目录中,运行以下命令。
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ python3 -m venv .venv
|
$ python3 -m venv .venv
|
||||||
$ source .venv/bin/activate
|
$ source .venv/bin/activate
|
||||||
@ -75,7 +82,8 @@ $ source .venv/bin/activate
|
|||||||
$ touch test_container.py
|
$ touch test_container.py
|
||||||
```
|
```
|
||||||
|
|
||||||
然后将以下脚本复制并保存在 test_container.py 文件中。
|
然后将以下脚本复制并保存在 `test_container.py` 文件中。
|
||||||
|
|
||||||
```python
|
```python
|
||||||
import conu
|
import conu
|
||||||
|
|
||||||
@ -111,12 +119,11 @@ with conu.DockerBackend() as backend:
|
|||||||
finally:
|
finally:
|
||||||
container.stop()
|
container.stop()
|
||||||
container.delete()
|
container.delete()
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 测试设置
|
#### 测试设置
|
||||||
|
|
||||||
这个脚本首先设置 conu 使用 Docker 作为后端来运行容器。然后它设置容器镜像以使用你在本教程第一部分中构建的 flaskapp_container。
|
这个脚本首先设置 `conu` 使用 Docker 作为后端来运行容器。然后它设置容器镜像以使用你在本教程第一部分中构建的 flaskapp_container。
|
||||||
|
|
||||||
下一步是配置运行容器所需的选项。在此示例中,Flask 应用在端口5000上提供内容。于是你需要暴露此端口并将其映射到主机上的同一端口。
|
下一步是配置运行容器所需的选项。在此示例中,Flask 应用在端口5000上提供内容。于是你需要暴露此端口并将其映射到主机上的同一端口。
|
||||||
|
|
||||||
@ -124,13 +131,13 @@ with conu.DockerBackend() as backend:
|
|||||||
|
|
||||||
#### 测试方法
|
#### 测试方法
|
||||||
|
|
||||||
在测试容器之前,检查容器是否正在运行并准备就绪。示范脚本使用 container.is_running 和 container.wait_for_port。这些方法可确保容器正在运行,并且服务在预设端口上可用。
|
在测试容器之前,检查容器是否正在运行并准备就绪。示范脚本使用 `container.is_running` 和 `container.wait_for_port`。这些方法可确保容器正在运行,并且服务在预设端口上可用。
|
||||||
|
|
||||||
container.http_request 是 [request][2] 库的包装器,可以方便地在测试期间发送 HTTP 请求。这个方法返回[requests.Responseobject][3],因此可以轻松地访问响应的内容以进行测试。
|
`container.http_request` 是 [request][2] 库的包装器,可以方便地在测试期间发送 HTTP 请求。这个方法返回[requests.Responseobject][3],因此可以轻松地访问响应的内容以进行测试。
|
||||||
|
|
||||||
Conu 还可以访问容器日志。又一次,这在测试期间非常有用。在上面的示例中,container.logs 方法返回容器日志。你可以使用它们断言打印了特定日志,或者,例如在测试期间没有异常被引发。
|
`conu` 还可以访问容器日志。又一次,这在测试期间非常有用。在上面的示例中,`container.logs` 方法返回容器日志。你可以使用它们断言打印了特定日志,或者,例如在测试期间没有异常被引发。
|
||||||
|
|
||||||
Conu 提供了许多与容器接合的有用方法。[文档][4]中提供了完整的 API 列表。你还可以参考 [GitHub][5] 上提供的示例。
|
`conu` 提供了许多与容器接合的有用方法。[文档][4]中提供了完整的 API 列表。你还可以参考 [GitHub][5] 上提供的示例。
|
||||||
|
|
||||||
运行本教程所需的所有代码和文件也可以在 [GitHub][6] 上获得。 对于想要进一步采用这个例子的读者,你可以看看使用 [pytest][7] 来运行测试并构建一个容器测试套件。
|
运行本教程所需的所有代码和文件也可以在 [GitHub][6] 上获得。 对于想要进一步采用这个例子的读者,你可以看看使用 [pytest][7] 来运行测试并构建一个容器测试套件。
|
||||||
|
|
||||||
@ -141,7 +148,7 @@ via: https://fedoramagazine.org/test-containers-python-conu/
|
|||||||
作者:[Clément Verna][a]
|
作者:[Clément Verna][a]
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
译者:[GraveAccent](https://github.com/GraveAccent)
|
译者:[GraveAccent](https://github.com/GraveAccent)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
222
published/201811/20180907 6.828 lab tools guide.md
Normal file
222
published/201811/20180907 6.828 lab tools guide.md
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
Caffeinated 6.828:实验工具指南
|
||||||
|
======
|
||||||
|
|
||||||
|
熟悉你的环境对高效率的开发和调试来说是至关重要的。本文将为你简单概述一下 JOS 环境和非常有用的 GDB 和 QEMU 命令。话虽如此,但你仍然应该去阅读 GDB 和 QEMU 手册,来理解这些强大的工具如何使用。
|
||||||
|
|
||||||
|
### 调试小贴士
|
||||||
|
|
||||||
|
#### 内核
|
||||||
|
|
||||||
|
GDB 是你的朋友。使用 `qemu-gdb target`(或它的变体 `qemu-gdb-nox`)使 QEMU 等待 GDB 去绑定。下面在调试内核时用到的一些命令,可以去查看 GDB 的资料。
|
||||||
|
|
||||||
|
如果你遭遇意外的中断、异常、或三重故障,你可以使用 `-d` 参数要求 QEMU 去产生一个详细的中断日志。
|
||||||
|
|
||||||
|
调试虚拟内存问题时,尝试 QEMU 的监视命令 `info mem`(提供内存高级概述)或 `info pg`(提供更多细节内容)。注意,这些命令仅显示**当前**页表。
|
||||||
|
|
||||||
|
(在实验 4 以后)去调试多个 CPU 时,使用 GDB 的线程相关命令,比如 `thread` 和 `info threads`。
|
||||||
|
|
||||||
|
#### 用户环境(在实验 3 以后)
|
||||||
|
|
||||||
|
GDB 也可以去调试用户环境,但是有些事情需要注意,因为 GDB 无法区分开多个用户环境或区分开用户环境与内核环境。
|
||||||
|
|
||||||
|
你可以使用 `make run-name`(或编辑 `kern/init.c` 目录)来指定 JOS 启动的用户环境,为使 QEMU 等待 GDB 去绑定,使用 `run-name-gdb` 的变体。
|
||||||
|
|
||||||
|
你可以符号化调试用户代码,就像调试内核代码一样,但是你要告诉 GDB,哪个符号表用到符号文件命令上,因为它一次仅能够使用一个符号表。提供的 `.gdbinit` 用于加载内核符号表 `obj/kern/kernel`。对于一个用户环境,这个符号表在它的 ELF 二进制文件中,因此你可以使用 `symbol-file obj/user/name` 去加载它。不要从任何 `.o` 文件中加载符号,因为它们不会被链接器迁移进去(库是静态链接进 JOS 用户二进制文件中的,因此这些符号已经包含在每个用户二进制文件中了)。确保你得到了正确的用户二进制文件;在不同的二进制文件中,库函数被链接为不同的 EIP,而 GDB 并不知道更多的内容!
|
||||||
|
|
||||||
|
(在实验 4 以后)因为 GDB 绑定了整个虚拟机,所以它可以将时钟中断看作为一种控制转移。这使得从底层上不可能实现步进用户代码,因为一个时钟中断无形中保证了片刻之后虚拟机可以再次运行。因此可以使用 `stepi` 命令,因为它阻止了中断,但它仅可以步进一个汇编指令。断点一般来说可以正常工作,但要注意,因为你可能在不同的环境(完全不同的一个二进制文件)上遇到同一个 EIP。
|
||||||
|
|
||||||
|
### 参考
|
||||||
|
|
||||||
|
#### JOS makefile
|
||||||
|
|
||||||
|
JOS 的 GNUmakefile 包含了在各种方式中运行的 JOS 的许多假目标。所有这些目标都配置 QEMU 去监听 GDB 连接(`*-gdb` 目标也等待这个连接)。要在运行中的 QEMU 上启动它,只需要在你的实验目录中简单地运行 `gdb ` 即可。我们提供了一个 `.gdbinit` 文件,它可以在 QEMU 中自动指向到 GDB、加载内核符号文件、以及在 16 位和 32 位模式之间切换。退出 GDB 将关闭 QEMU。
|
||||||
|
|
||||||
|
* `make qemu`
|
||||||
|
|
||||||
|
在一个新窗口中构建所有的东西并使用 VGA 控制台和你的终端中的串行控制台启动 QEMU。想退出时,既可以关闭 VGA 窗口,也可以在你的终端中按 `Ctrl-c` 或 `Ctrl-a x`。
|
||||||
|
* `make qemu-nox`
|
||||||
|
|
||||||
|
和 `make qemu` 一样,但仅使用串行控制台来运行。想退出时,按下 `Ctrl-a x`。这种方式在通过 SSH 拨号连接到 Athena 上时非常有用,因为 VGA 窗口会占用许多带宽。
|
||||||
|
* `make qemu-gdb`
|
||||||
|
|
||||||
|
和 `make qemu` 一样,但它与任意时间被动接受 GDB 不同,而是暂停第一个机器指令并等待一个 GDB 连接。
|
||||||
|
* `make qemu-nox-gdb`
|
||||||
|
|
||||||
|
它是 `qemu-nox` 和 `qemu-gdb` 目标的组合。
|
||||||
|
* `make run-nam`
|
||||||
|
|
||||||
|
(在实验 3 以后)运行用户程序 _name_。例如,`make run-hello` 运行 `user/hello.c`。
|
||||||
|
* `make run-name-nox`,`run-name-gdb`, `run-name-gdb-nox`
|
||||||
|
|
||||||
|
(在实验 3 以后)与 `qemu` 目标变量对应的 `run-name` 的变体。
|
||||||
|
|
||||||
|
makefile 也接受几个非常有用的变量:
|
||||||
|
|
||||||
|
* `make V=1 …`
|
||||||
|
|
||||||
|
详细模式。输出正在运行的每个命令,包括参数。
|
||||||
|
* `make V=1 grade`
|
||||||
|
|
||||||
|
在评级测试失败后停止,并将 QEMU 的输出放入 `jos.out` 文件中以备检查。
|
||||||
|
* `make QEMUEXTRA=' _args_ ' …`
|
||||||
|
|
||||||
|
指定传递给 QEMU 的额外参数。
|
||||||
|
|
||||||
|
#### JOS obj/
|
||||||
|
|
||||||
|
在构建 JOS 时,makefile 也产生一些额外的输出文件,这些文件在调试时非常有用:
|
||||||
|
|
||||||
|
* `obj/boot/boot.asm`、`obj/kern/kernel.asm`、`obj/user/hello.asm`、等等。
|
||||||
|
|
||||||
|
引导加载器、内核、和用户程序的汇编代码列表。
|
||||||
|
* `obj/kern/kernel.sym`、`obj/user/hello.sym`、等等。
|
||||||
|
|
||||||
|
内核和用户程序的符号表。
|
||||||
|
* `obj/boot/boot.out`、`obj/kern/kernel`、`obj/user/hello`、等等。
|
||||||
|
|
||||||
|
内核和用户程序链接的 ELF 镜像。它们包含了 GDB 用到的符号信息。
|
||||||
|
|
||||||
|
#### GDB
|
||||||
|
|
||||||
|
完整的 GDB 命令指南请查看 [GDB 手册][1]。下面是一些在 6.828 课程中非常有用的命令,它们中的一些在操作系统开发之外的领域几乎用不到。
|
||||||
|
|
||||||
|
* `Ctrl-c`
|
||||||
|
|
||||||
|
在当前指令处停止机器并打断进入到 GDB。如果 QEMU 有多个虚拟的 CPU,所有的 CPU 都会停止。
|
||||||
|
* `c`(或 `continue`)
|
||||||
|
|
||||||
|
继续运行,直到下一个断点或 `Ctrl-c`。
|
||||||
|
* `si`(或 `stepi`)
|
||||||
|
|
||||||
|
运行一个机器指令。
|
||||||
|
* `b function` 或 `b file:line`(或 `breakpoint`)
|
||||||
|
|
||||||
|
在给定的函数或行上设置一个断点。
|
||||||
|
* `b * addr`(或 `breakpoint`)
|
||||||
|
|
||||||
|
在 EIP 的 addr 处设置一个断点。
|
||||||
|
* `set print pretty`
|
||||||
|
|
||||||
|
启用数组和结构的美化输出。
|
||||||
|
* `info registers`
|
||||||
|
|
||||||
|
输出通用寄存器 `eip`、`eflags`、和段选择器。更多更全的机器寄存器状态转储,查看 QEMU 自己的 `info registers` 命令。
|
||||||
|
* `x/ N x addr`
|
||||||
|
|
||||||
|
以十六进制显示虚拟地址 addr 处开始的 N 个词的转储。如果 N 省略,默认为 1。addr 可以是任何表达式。
|
||||||
|
* `x/ N i addr`
|
||||||
|
|
||||||
|
显示从 addr 处开始的 N 个汇编指令。使用 `$eip` 作为 addr 将显示当前指令指针寄存器中的指令。
|
||||||
|
* `symbol-file file`
|
||||||
|
|
||||||
|
(在实验 3 以后)切换到符号文件 file 上。当 GDB 绑定到 QEMU 后,它并不是虚拟机中进程边界内的一部分,因此我们要去告诉它去使用哪个符号。默认情况下,我们配置 GDB 去使用内核符号文件 `obj/kern/kernel`。如果机器正在运行用户代码,比如是 `hello.c`,你就需要使用 `symbol-file obj/user/hello` 去切换到 hello 的符号文件。
|
||||||
|
|
||||||
|
QEMU 将每个虚拟 CPU 表示为 GDB 中的一个线程,因此你可以使用 GDB 中所有的线程相关的命令去查看或维护 QEMU 的虚拟 CPU。
|
||||||
|
|
||||||
|
* `thread n`
|
||||||
|
|
||||||
|
GDB 在一个时刻只关注于一个线程(即:CPU)。这个命令将关注的线程切换到 n,n 是从 0 开始编号的。
|
||||||
|
* `info threads`
|
||||||
|
|
||||||
|
列出所有的线程(即:CPU),包括它们的状态(活动还是停止)和它们在什么函数中。
|
||||||
|
|
||||||
|
|
||||||
|
#### QEMU
|
||||||
|
|
||||||
|
QEMU 包含一个内置的监视器,它能够有效地检查和修改机器状态。想进入到监视器中,在运行 QEMU 的终端中按入 `Ctrl-a c` 即可。再次按下 `Ctrl-a c` 将切换回串行控制台。
|
||||||
|
|
||||||
|
监视器命令的完整参考资料,请查看 [QEMU 手册][2]。下面是 6.828 课程中用到的一些有用的命令:
|
||||||
|
|
||||||
|
* `xp/ N x paddr`
|
||||||
|
|
||||||
|
显示从物理地址 paddr 处开始的 N 个词的十六进制转储。如果 N 省略,默认为 1。这是 GDB 的 `x` 命令模拟的物理内存。
|
||||||
|
* `info registers`
|
||||||
|
|
||||||
|
显示机器内部寄存器状态的一个完整转储。实践中,对于段选择器,这将包含机器的 _隐藏_ 段状态和局部、全局、和中断描述符表加任务状态寄存器。隐藏状态是在加载段选择器后,虚拟的 CPU 从 GDT/LDT 中读取的信息。下面是实验 1 中 JOS 内核处于运行中时的 CS 信息和每个字段的含义:
|
||||||
|
|
||||||
|
```c
|
||||||
|
CS =0008 10000000 ffffffff 10cf9a00 DPL=0 CS32 [-R-]
|
||||||
|
```
|
||||||
|
|
||||||
|
* `CS =0008`
|
||||||
|
|
||||||
|
代码选择器可见部分。我们使用段 0x8。这也告诉我们参考全局描述符表(0x8&4=0),并且我们的 CPL(当前权限级别)是 0x8&3=0。
|
||||||
|
* `10000000`
|
||||||
|
|
||||||
|
这是段基址。线性地址 = 逻辑地址 + 0x10000000。
|
||||||
|
* `ffffffff`
|
||||||
|
|
||||||
|
这是段限制。访问线性地址 0xffffffff 以上将返回段违规异常。
|
||||||
|
* `10cf9a00`
|
||||||
|
|
||||||
|
段的原始标志,QEMU 将在接下来的几个字段中解码这些对我们有用的标志。
|
||||||
|
* `DPL=0`
|
||||||
|
|
||||||
|
段的权限级别。一旦代码以权限 0 运行,它将就能够加载这个段。
|
||||||
|
* `CS32`
|
||||||
|
|
||||||
|
这是一个 32 位代码段。对于数据段(不要与 DS 寄存器混淆了),另外的值还包括 `DS`,而对于本地描述符表是 `LDT`。
|
||||||
|
* `[-R-]`
|
||||||
|
|
||||||
|
这个段是只读的。
|
||||||
|
|
||||||
|
* `info mem`
|
||||||
|
|
||||||
|
(在实验 2 以后)显示映射的虚拟内存和权限。比如:
|
||||||
|
|
||||||
|
```
|
||||||
|
ef7c0000-ef800000 00040000 urw
|
||||||
|
efbf8000-efc00000 00008000 -rw
|
||||||
|
```
|
||||||
|
|
||||||
|
这告诉我们从 0xef7c0000 到 0xef800000 的 0x00040000 字节的内存被映射为读取/写入/用户可访问,而映射在 0xefbf8000 到 0xefc00000 之间的内存权限是读取/写入,但是仅限于内核可访问。
|
||||||
|
|
||||||
|
* `info pg`
|
||||||
|
|
||||||
|
(在实验 2 以后)显示当前页表结构。它的输出类似于 `info mem`,但与页目录条目和页表条目是有区别的,并且为每个条目给了单独的权限。重复的 PTE 和整个页表被折叠为一个单行。例如:
|
||||||
|
|
||||||
|
```
|
||||||
|
VPN range Entry Flags Physical page
|
||||||
|
[00000-003ff] PDE[000] -------UWP
|
||||||
|
[00200-00233] PTE[200-233] -------U-P 00380 0037e 0037d 0037c 0037b 0037a ..
|
||||||
|
[00800-00bff] PDE[002] ----A--UWP
|
||||||
|
[00800-00801] PTE[000-001] ----A--U-P 0034b 00349
|
||||||
|
[00802-00802] PTE[002] -------U-P 00348
|
||||||
|
```
|
||||||
|
|
||||||
|
这里各自显示了两个页目录条目、虚拟地址范围 0x00000000 到 0x003fffff 以及 0x00800000 到 0x00bfffff。 所有的 PDE 都存在于内存中、可写入、并且用户可访问,而第二个 PDE 也是可访问的。这些页表中的第二个映射了三个页、虚拟地址范围 0x00800000 到 0x00802fff,其中前两个页是存在于内存中的、可写入、并且用户可访问的,而第三个仅存在于内存中,并且用户可访问。这些 PTE 的第一个条目映射在物理页 0x34b 处。
|
||||||
|
|
||||||
|
QEMU 也有一些非常有用的命令行参数,使用 `QEMUEXTRA` 变量可以将参数传递给 JOS 的 makefile。
|
||||||
|
|
||||||
|
* `make QEMUEXTRA='-d int' ...`
|
||||||
|
|
||||||
|
记录所有的中断和一个完整的寄存器转储到 `qemu.log` 文件中。你可以忽略前两个日志条目、“SMM: enter” 和 “SMM: after RMS”,因为这些是在进入引导加载器之前生成的。在这之后的日志条目看起来像下面这样:
|
||||||
|
|
||||||
|
```
|
||||||
|
4: v=30 e=0000 i=1 cpl=3 IP=001b:00800e2e pc=00800e2e SP=0023:eebfdf28 EAX=00000005
|
||||||
|
EAX=00000005 EBX=00001002 ECX=00200000 EDX=00000000
|
||||||
|
ESI=00000805 EDI=00200000 EBP=eebfdf60 ESP=eebfdf28
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
第一行描述了中断。`4:` 只是一个日志记录计数器。`v` 提供了十六进程的向量号。`e` 提供了错误代码。`i=1` 表示它是由一个 `int` 指令(相对一个硬件产生的中断而言)产生的。剩下的行的意思很明显。对于一个寄存器转储而言,接下来看到的就是寄存器信息。
|
||||||
|
|
||||||
|
注意:如果你运行的是一个 0.15 版本之前的 QEMU,日志将写入到 `/tmp` 目录,而不是当前目录下。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://pdos.csail.mit.edu/6.828/2018/labguide.html
|
||||||
|
|
||||||
|
作者:[csail.mit][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[qhwdw](https://github.com/qhwdw)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://pdos.csail.mit.edu
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: http://sourceware.org/gdb/current/onlinedocs/gdb/
|
||||||
|
[2]: http://wiki.qemu.org/download/qemu-doc.html#pcsys_005fmonitor
|
@ -1,34 +1,35 @@
|
|||||||
IssueHunt:一个新的开源软件打赏平台
|
IssueHunt:一个新的开源软件打赏平台
|
||||||
======
|
======
|
||||||
许多开源开发者和公司都在努力解决的问题之一就是资金问题。社区中有一种假想,甚至是期望,必须免费提供自由和开源软件。但即使是 FOSS 也需要资金来继续开发。如果我们不建立让软件持续开发的系统,我们怎能期待更高质量的软件?
|
|
||||||
|
|
||||||
我们已经写了一篇关于[开源资金平台][1]的文章来试图解决这个缺点,截至今年 7 月,市场上出现了一个新的竞争者,旨在帮助填补这个空白:[IssueHunt][2] 。
|
![IssueHunt][4]
|
||||||
|
|
||||||
|
许多开源开发者和公司都在努力解决的问题之一就是资金问题。社区中有一种假想,甚至是期望,必须免费提供自由开源软件(FOSS)。但即使是 FOSS 也需要资金来继续开发。如果我们不建立让软件持续开发的系统,我们怎能期待更高质量的软件?
|
||||||
|
|
||||||
|
我们已经写了一篇关于[开源资金平台][1]的文章来试图解决这个缺点,截至今年 7 月,市场上出现了一个新的竞争者,旨在帮助填补这个空白:[IssueHunt][2]。
|
||||||
|
|
||||||
### IssueHunt: 开源软件打赏平台
|
### IssueHunt: 开源软件打赏平台
|
||||||
|
|
||||||
![IssueHunt website][3]
|
![IssueHunt website][3]
|
||||||
|
|
||||||
IssueHunt 提供了一种服务,支付自由开发者对开源代码的贡献。它通过所谓的赏金来实现:给予解决特定问题的任何人财务奖励。这些奖励的资金来自任何愿意捐赠以修复任何特定 bug 或添加功能的人。
|
IssueHunt 提供了一种服务,对自由开发者的开源代码贡献进行支付。它通过所谓的赏金来实现:给予解决特定问题的任何人财务奖励。这些奖励的资金来自任何愿意捐赠以修复任何特定 bug 或添加功能的人。
|
||||||
|
|
||||||
如果你想修复的某个开源软件存在问题,你可以根据自己选择的方式提供奖励金额。
|
如果你想修复的某个开源软件存在问题,你可以根据自己选择的方式提供奖励金额。
|
||||||
|
|
||||||
想要自己的产品被争抢解决么?在 IssueHunt 上向任何解决问题的人提供奖金就好了。就这么简单。
|
想要自己的产品被争抢解决么?在 IssueHunt 上向任何解决问题的人提供奖金就好了。就这么简单。
|
||||||
|
|
||||||
如果你是程序员,则可以浏览未解决的问题。解决这个问题(如果你可以的话),在 GitHub 存储库上提交 pull request,如果你的 pull request 被合并,那么你就会得到了钱。
|
如果你是程序员,则可以浏览未解决的问题。解决这个问题(如果你可以的话),在 GitHub 存储库上提交拉取请求,如果你的拉取请求被合并,那么你就会得到了钱。
|
||||||
|
|
||||||
#### IssueHunt 最初是 Boostnote 的内部项目
|
#### IssueHunt 最初是 Boostnote 的内部项目
|
||||||
|
|
||||||
![IssueHunt][4]
|
|
||||||
|
|
||||||
当笔记应用 [Boostnote][5] 背后的开发人员联系社区为他们的产品做出贡献时,该产品出现了。
|
当笔记应用 [Boostnote][5] 背后的开发人员联系社区为他们的产品做出贡献时,该产品出现了。
|
||||||
|
|
||||||
在使用 IssueHunt 的前两年,Boostnote 通过数百名贡献者和压倒性的捐款收到了超过 8,400 个 Github star。
|
在使用 IssueHunt 的前两年,Boostnote 通过数百名贡献者和压倒性的捐款收到了超过 8,400 个 Github star。
|
||||||
|
|
||||||
该产品非常成功,团队决定将其开放给社区的其他成员。
|
该产品非常成功,团队决定将其开放给社区的其他成员。
|
||||||
|
|
||||||
今天,[列表中在使用这个服务的项目][6]提供了数千美元的赏金。
|
如今,[列表中在使用这个服务的项目][6]提供了数千美元的赏金。
|
||||||
|
|
||||||
Boostnote 号称有 [$2,800 的总赏金] [7],而 Settings Sync,以前称为 Visual Studio Code Settings Sync,提供了[超过 $1,600 的赏金][8]。
|
Boostnote 号称有 [$2,800 的总赏金][7],而 Settings Sync,以前称为 Visual Studio Code Settings Sync,提供了[超过 $1,600 的赏金][8]。
|
||||||
|
|
||||||
还有其他服务提供类似于 IssueHunt 在此提供的内容。也许最引人注目的是 [Bountysource][9],它提供与 IssueHunt 类似的赏金服务,同时还提供类似于 [Librepay][10] 的订阅支付处理。
|
还有其他服务提供类似于 IssueHunt 在此提供的内容。也许最引人注目的是 [Bountysource][9],它提供与 IssueHunt 类似的赏金服务,同时还提供类似于 [Librepay][10] 的订阅支付处理。
|
||||||
|
|
||||||
@ -36,7 +37,7 @@ Boostnote 号称有 [$2,800 的总赏金] [7],而 Settings Sync,以前称为
|
|||||||
|
|
||||||
在撰写本文时,IssueHunt 还处于起步阶段,但我非常高兴看到这个项目在这些年里的成果。
|
在撰写本文时,IssueHunt 还处于起步阶段,但我非常高兴看到这个项目在这些年里的成果。
|
||||||
|
|
||||||
我不了解你,但我非常乐意为 FOSS 付款。如果产品质量高,并为我的生活增添价值,那么我很乐意向开发者支付产品费用。特别是 FOSS 的开发者正在创造尊重我自由的产品。
|
我不知道你会怎么看,但我非常乐意为 FOSS 付款。如果产品质量高,并为我的生活增添价值,那么我很乐意向开发者支付产品费用。特别是 FOSS 的开发者正在创造尊重我自由的产品。
|
||||||
|
|
||||||
话虽如此,我一定会关注 IssueHunt 的继续前进,我可以用自己的钱或者在需要贡献的地方传播这个它来支持社区。
|
话虽如此,我一定会关注 IssueHunt 的继续前进,我可以用自己的钱或者在需要贡献的地方传播这个它来支持社区。
|
||||||
|
|
||||||
@ -49,15 +50,15 @@ via: https://itsfoss.com/issuehunt/
|
|||||||
作者:[Phillip Prado][a]
|
作者:[Phillip Prado][a]
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
译者:[geekpi](https://github.com/geekpi)
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
[a]: https://itsfoss.com/author/phillip/
|
[a]: https://itsfoss.com/author/phillip/
|
||||||
[1]: https://itsfoss.com/open-source-funding-platforms/
|
[1]: https://itsfoss.com/open-source-funding-platforms/
|
||||||
[2]: https://issuehunt.io
|
[2]: https://issuehunt.io
|
||||||
[3]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/09/issuehunt-website.png
|
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/09/issuehunt-website.png?w=799&ssl=1
|
||||||
[4]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/09/issuehunt.jpg
|
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/09/issuehunt.jpg?w=800&ssl=1
|
||||||
[5]: https://itsfoss.com/boostnote-linux-review/
|
[5]: https://itsfoss.com/boostnote-linux-review/
|
||||||
[6]: https://issuehunt.io/repos
|
[6]: https://issuehunt.io/repos
|
||||||
[7]: https://issuehunt.io/repos/53266139
|
[7]: https://issuehunt.io/repos/53266139
|
@ -1,17 +1,17 @@
|
|||||||
将 Grails 与 jQuery 和 DataTables 一起使用
|
在 Grails 中使用 jQuery 和 DataTables
|
||||||
======
|
======
|
||||||
|
|
||||||
本文介绍如何构建一个基于 Grails 的数据浏览器来可视化复杂的表格数据。
|
> 本文介绍如何构建一个基于 Grails 的数据浏览器来可视化复杂的表格数据。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_container_block.png?itok=S8MbXEYw)
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_container_block.png?itok=S8MbXEYw)
|
||||||
|
|
||||||
我是 [Grails][1] 的忠实粉丝。当然,我主要是热衷于利用命令行工具来探索和分析数据的数据人。数据人经常需要_查看_数据,这也意味着他们通常拥有优秀的数据浏览器。利用 Grails,[jQuery][2],以及 [DataTables jQuery 插件][3],我们可以制作出非常友好的表格数据浏览器。
|
我是 [Grails][1] 的忠实粉丝。当然,我主要是热衷于利用命令行工具来探索和分析数据的数据从业人员。数据从业人员经常需要*查看*数据,这也意味着他们通常拥有优秀的数据浏览器。利用 Grails、[jQuery][2],以及 [DataTables jQuery 插件][3],我们可以制作出非常友好的表格数据浏览器。
|
||||||
|
|
||||||
[DataTables 网站][3]提供了许多“食谱风格”的教程文档,展示了如何组合一些优秀的示例应用程序,这些程序包含了完成一些非常漂亮的东西所必要的 JavaScript,HTML,以及偶尔出现的 [PHP][4]。但对于那些宁愿使用 Grails 作为后端的人来说,有必要进行一些说明示教。此外,样本程序中使用的数据是虚构公司的员工的单个平面表数据,因此处理这些复杂的表关系可以作为读者的一个练习项目。
|
[DataTables 网站][3]提供了许多“食谱式”的教程文档,展示了如何组合一些优秀的示例应用程序,这些程序包含了完成一些非常漂亮的东西所必要的 JavaScript、HTML,以及偶尔出现的 [PHP][4]。但对于那些宁愿使用 Grails 作为后端的人来说,有必要进行一些说明示教。此外,样本程序中使用的数据是一个虚构公司的员工的单个平面表格数据,因此处理这些复杂的表关系可以作为读者的一个练习项目。
|
||||||
|
|
||||||
本文中,我们将创建具有略微复杂的数据结构和 DataTables 浏览器的 Grails 应用程序。我们将介绍 Grails 标准 [Groovy][5]-fied Java Hibernate 标准。我已将代码托管在 [GitHub][6] 上方便大家访问,因此本文主要是对代码细节的解读。
|
本文中,我们将创建具有略微复杂的数据结构和 DataTables 浏览器的 Grails 应用程序。我们将介绍 Grails 标准,它是 [Groovy][5] 式的 Java Hibernate 标准。我已将代码托管在 [GitHub][6] 上方便大家访问,因此本文主要是对代码细节的解读。
|
||||||
|
|
||||||
首先,你需要配置 Java,Groovy,Grails 的使用环境。对于 Grails,我倾向于使用终端窗口和 [Vim][7],本文也使用它们。为获得现代 Java,建议下载并安装 Linux 发行版提供的 [Open Java Development Kit][8] (OpenJDK)(应该是 Java 8,9,10或11,撰写本文时,我正在使用 Java 8)。从我的角度来看,获取最新的 Groovy 和 Grails 的最佳方法是使用 [SKDMAN!][9]。
|
首先,你需要配置 Java、Groovy、Grails 的使用环境。对于 Grails,我倾向于使用终端窗口和 [Vim][7],本文也使用它们。为获得现代的 Java 环境,建议下载并安装 Linux 发行版提供的 [Open Java Development Kit][8] (OpenJDK)(应该是 Java 8、9、10 或 11 之一,撰写本文时,我正在使用 Java 8)。从我的角度来看,获取最新的 Groovy 和 Grails 的最佳方法是使用 [SDKMAN!][9]。
|
||||||
|
|
||||||
从未尝试过 Grails 的读者可能需要做一些背景资料阅读。作为初学者,推荐文章 [创建你的第一个 Grails 应用程序][10]。
|
从未尝试过 Grails 的读者可能需要做一些背景资料阅读。作为初学者,推荐文章 [创建你的第一个 Grails 应用程序][10]。
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ grails create-domain-class com.nuevaconsulting.embrow.Employeecd embrowgrails cr
|
|||||||
|
|
||||||
这种方式构建的域类没有属性,因此必须按如下方式编辑它们:
|
这种方式构建的域类没有属性,因此必须按如下方式编辑它们:
|
||||||
|
|
||||||
Position 域类:
|
`Position` 域类:
|
||||||
|
|
||||||
```
|
```
|
||||||
package com.nuevaconsulting.embrow
|
package com.nuevaconsulting.embrow
|
||||||
@ -51,7 +51,7 @@ class Position {
|
|||||||
}com.Stringint startingstatic constraintsnullableblankstarting nullable
|
}com.Stringint startingstatic constraintsnullableblankstarting nullable
|
||||||
```
|
```
|
||||||
|
|
||||||
Office 域类:
|
`Office` 域类:
|
||||||
|
|
||||||
```
|
```
|
||||||
package com.nuevaconsulting.embrow
|
package com.nuevaconsulting.embrow
|
||||||
@ -72,7 +72,7 @@ class Office {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Enployee 域类:
|
`Enployee` 域类:
|
||||||
|
|
||||||
```
|
```
|
||||||
package com.nuevaconsulting.embrow
|
package com.nuevaconsulting.embrow
|
||||||
@ -98,7 +98,7 @@ class Employee {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
请注意,虽然 Position 和 Office 域类使用了预定义的 Groovy 类型 String 以及 int,但 Employee 域类定义了 Position 和 Office 字段(以及预定义的 Date)。这会导致创建数据库表,其中存储的 Employee 实例中包含了指向存储 Position 和 Office 实例表的引用或者外键。
|
请注意,虽然 `Position` 和 `Office` 域类使用了预定义的 Groovy 类型 `String` 以及 `int`,但 `Employee` 域类定义了 `Position` 和 `Office` 字段(以及预定义的 `Date`)。这会导致创建数据库表,其中存储的 `Employee` 实例中包含了指向存储 `Position` 和 `Office` 实例表的引用或者外键。
|
||||||
|
|
||||||
现在你可以生成控制器,视图,以及其他各种测试组件:
|
现在你可以生成控制器,视图,以及其他各种测试组件:
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ grails generate-all com.nuevaconsulting.embrow.Office
|
|||||||
grails generate-all com.nuevaconsulting.embrow.Employeegrails generateall com.grails generateall com.grails generateall com.
|
grails generate-all com.nuevaconsulting.embrow.Employeegrails generateall com.grails generateall com.grails generateall com.
|
||||||
```
|
```
|
||||||
|
|
||||||
此时,你已经准备好基本的 create-read-update-delete(CRUD)应用程序。我在**grails-app/init/com/nuevaconsulting/BootStrap.groovy**中包含了一些基础数据来填充表格。
|
此时,你已经准备好了一个基本的增删改查(CRUD)应用程序。我在 `grails-app/init/com/nuevaconsulting/BootStrap.groovy` 中包含了一些基础数据来填充表格。
|
||||||
|
|
||||||
如果你用如下命令来启动应用程序:
|
如果你用如下命令来启动应用程序:
|
||||||
|
|
||||||
@ -116,43 +116,44 @@ grails generate-all com.nuevaconsulting.embrow.Employeegrails generateall com.gr
|
|||||||
grails run-app
|
grails run-app
|
||||||
```
|
```
|
||||||
|
|
||||||
在浏览器输入**<http://localhost:8080/:>**,你将会看到如下界面:
|
在浏览器输入 `http://localhost:8080/`,你将会看到如下界面:
|
||||||
|
|
||||||
![Embrow home screen][12]
|
![Embrow home screen][12]
|
||||||
|
|
||||||
Embrow 应用程序主界面。
|
*Embrow 应用程序主界面。*
|
||||||
|
|
||||||
单击 OfficeController,会跳转到如下界面:
|
单击 “OfficeController” 链接,会跳转到如下界面:
|
||||||
|
|
||||||
![Office list][14]
|
![Office list][14]
|
||||||
|
|
||||||
Office 列表
|
*Office 列表*
|
||||||
|
|
||||||
注意,此表由 **OfficeController index** 生成,并由视图 `office/index.gsp` 显示。
|
注意,此表由 `OfficeController` 的 `index` 方式生成,并由视图 `office/index.gsp` 显示。
|
||||||
|
|
||||||
同样,单击 **EmployeeController** 跳转到如下界面:
|
同样,单击 “EmployeeController” 链接 跳转到如下界面:
|
||||||
|
|
||||||
![Employee controller][16]
|
![Employee controller][16]
|
||||||
|
|
||||||
employee controller
|
*employee 控制器*
|
||||||
|
|
||||||
好吧,这很丑陋: Position 和 Office 链接是什么?
|
好吧,这很丑陋: Position 和 Office 链接是什么?
|
||||||
|
|
||||||
上面的命令 `generate-all` 生成的视图创建了一个叫 **index.gsp** 的文件,它使用 Grails <f:table/> 标签,该标签默认会显示类名(**com.nuevaconsulting.embrow.Position**)和持久化示例标识符(**30**)。这个操作可以自定义用来产生更好看的东西,并且自动生成链接,自动生成分页以及自动生成可拍序列的一些非常简洁直观的东西。
|
上面的命令 `generate-all` 生成的视图创建了一个叫 `index.gsp` 的文件,它使用 Grails `<f:table/>` 标签,该标签默认会显示类名(`com.nuevaconsulting.embrow.Position`)和持久化示例标识符(`30`)。这个操作可以自定义用来产生更好看的东西,并且自动生成链接,自动生成分页以及自动生成可排序列的一些非常简洁直观的东西。
|
||||||
|
|
||||||
但该员工信息浏览器功能也是有限的。例如,如果想查找 position 信息中包含 “dev” 的员工该怎么办?如果要组合排序,以姓氏为主排序关键字,office 为辅助排序关键字,该怎么办?或者,你需要将已排序的数据导出到电子表格或 PDF 文档以便通过电子邮件发送给无法访问浏览器的人,该怎么办?
|
但该员工信息浏览器功能也是有限的。例如,如果想查找 “position” 信息中包含 “dev” 的员工该怎么办?如果要组合排序,以姓氏为主排序关键字,“office” 为辅助排序关键字,该怎么办?或者,你需要将已排序的数据导出到电子表格或 PDF 文档以便通过电子邮件发送给无法访问浏览器的人,该怎么办?
|
||||||
|
|
||||||
jQuery DataTables 插件提供了这些所需的功能。允许你创建一个完成的表格数据浏览器。
|
jQuery DataTables 插件提供了这些所需的功能。允许你创建一个完成的表格数据浏览器。
|
||||||
|
|
||||||
### 创建员工信息浏览器视图和控制器的方法
|
### 创建员工信息浏览器视图和控制器的方法
|
||||||
|
|
||||||
要基于 jQuery DataTables 创建员工信息浏览器,你必须先完成以下两个任务:
|
要基于 jQuery DataTables 创建员工信息浏览器,你必须先完成以下两个任务:
|
||||||
1. 创建 Grails 视图,其中包含启用 DataTable 所需的 HTML 和 JavaScript
|
|
||||||
|
|
||||||
|
1. 创建 Grails 视图,其中包含启用 DataTable 所需的 HTML 和 JavaScript
|
||||||
|
2. 给 Grails 控制器增加一个方法来控制新视图。
|
||||||
|
|
||||||
#### 员工信息浏览器视图
|
#### 员工信息浏览器视图
|
||||||
|
|
||||||
在目录 **embrow/grails-app/views/employee** 中,首先复制 **index.gsp** 文件,重命名为 **browser.gsp**:
|
在目录 `embrow/grails-app/views/employee` 中,首先复制 `index.gsp` 文件,重命名为 `browser.gsp`:
|
||||||
|
|
||||||
```
|
```
|
||||||
cd Projects
|
cd Projects
|
||||||
@ -160,7 +161,7 @@ cd embrow/grails-app/views/employee
|
|||||||
cp gsp browser.gsp
|
cp gsp browser.gsp
|
||||||
```
|
```
|
||||||
|
|
||||||
此刻,你自定义新的 **browser.gsp** 文件来添加相关的 jQuery DataTables 代码。
|
此刻,你自定义新的 `browser.gsp` 文件来添加相关的 jQuery DataTables 代码。
|
||||||
|
|
||||||
通常,在可能的时候,我喜欢从内容提供商处获得 JavaScript 和 CSS;在下面这行后面:
|
通常,在可能的时候,我喜欢从内容提供商处获得 JavaScript 和 CSS;在下面这行后面:
|
||||||
|
|
||||||
@ -185,7 +186,7 @@ cp gsp browser.gsp
|
|||||||
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/buttons/1.5.1/js/buttons.print.min.js "></script>
|
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/buttons/1.5.1/js/buttons.print.min.js "></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
然后删除 **index.gsp** 中提供数据分页的代码:
|
然后删除 `index.gsp` 中提供数据分页的代码:
|
||||||
|
|
||||||
```
|
```
|
||||||
<div id="list-employee" class="content scaffold-list" role="main">
|
<div id="list-employee" class="content scaffold-list" role="main">
|
||||||
@ -253,7 +254,7 @@ $(this).html('<input type="text" size="15" placeholder="' + title + '?" />');
|
|||||||
});titletitletitletitletitle
|
});titletitletitletitletitle
|
||||||
```
|
```
|
||||||
|
|
||||||
接下来,定义表模型。 这是提供所有表选项的地方,包括界面的滚动,而不是分页,根据 dom 字符串提供的装饰,将数据导出为 CSV 和其他格式的能力,以及建立与服务器的 Ajax 连接。 请注意,使用 Groovy GString 调用 Grails **createLink()** 的方法创建 URL,在 **EmployeeController** 中指向 **browserLister** 操作。同样有趣的是表格列的定义。此信息将发送到后端,后端查询数据库并返回相应的记录。
|
接下来,定义表模型。这是提供所有表选项的地方,包括界面的滚动,而不是分页,根据 DOM 字符串提供的装饰,将数据导出为 CSV 和其他格式的能力,以及建立与服务器的 AJAX 连接。 请注意,使用 Groovy GString 调用 Grails `createLink()` 的方法创建 URL,在 `EmployeeController` 中指向 `browserLister` 操作。同样有趣的是表格列的定义。此信息将发送到后端,后端查询数据库并返回相应的记录。
|
||||||
|
|
||||||
```
|
```
|
||||||
var table = $('#employee_dt').DataTable( {
|
var table = $('#employee_dt').DataTable( {
|
||||||
@ -302,7 +303,7 @@ that.search(this.value).draw();
|
|||||||
|
|
||||||
![](https://opensource.com/sites/default/files/uploads/screen_4.png)
|
![](https://opensource.com/sites/default/files/uploads/screen_4.png)
|
||||||
|
|
||||||
这是另一个屏幕截图,显示了过滤和多列排序(寻找 position 包括字符 “dev” 的员工,先按 office 排序,然后按姓氏排序):
|
这是另一个屏幕截图,显示了过滤和多列排序(寻找 “position” 包括字符 “dev” 的员工,先按 “office” 排序,然后按姓氏排序):
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/uploads/screen_5.png)
|
![](https://opensource.com/sites/default/files/uploads/screen_5.png)
|
||||||
|
|
||||||
@ -314,37 +315,37 @@ that.search(this.value).draw();
|
|||||||
|
|
||||||
![](https://opensource.com/sites/default/files/uploads/screen7.png)
|
![](https://opensource.com/sites/default/files/uploads/screen7.png)
|
||||||
|
|
||||||
好的,视图部分看起来非常简单; 因此,控制器必须做所有繁重的工作,对吧? 让我们来看看…
|
好的,视图部分看起来非常简单;因此,控制器必须做所有繁重的工作,对吧? 让我们来看看……
|
||||||
|
|
||||||
#### 控制器 browserLister 操作
|
#### 控制器 browserLister 操作
|
||||||
|
|
||||||
回想一下,我们看到过这个字符串
|
回想一下,我们看到过这个字符串:
|
||||||
|
|
||||||
```
|
```
|
||||||
"${createLink(controller: 'employee', action: 'browserLister')}"
|
"${createLink(controller: 'employee', action: 'browserLister')}"
|
||||||
```
|
```
|
||||||
|
|
||||||
对于从 DataTables 模型中调用 Ajax 的 URL,是在 Grails 服务器上动态创建 HTML 链接,其 Grails 标记背后通过调用 [createLink()][17] 的方法实现的。这会最终产生一个指向 **EmployeeController** 的链接,位于:
|
对于从 DataTables 模型中调用 AJAX 的 URL,是在 Grails 服务器上动态创建 HTML 链接,其 Grails 标记背后通过调用 [createLink()][17] 的方法实现的。这会最终产生一个指向 `EmployeeController` 的链接,位于:
|
||||||
|
|
||||||
```
|
```
|
||||||
embrow/grails-app/controllers/com/nuevaconsulting/embrow/EmployeeController.groovy
|
embrow/grails-app/controllers/com/nuevaconsulting/embrow/EmployeeController.groovy
|
||||||
```
|
```
|
||||||
|
|
||||||
特别是控制器方法 **browserLister()**。我在代码中留了一些 print 语句,以便在运行时能够在终端看到中间结果。
|
特别是控制器方法 `browserLister()`。我在代码中留了一些 `print` 语句,以便在运行时能够在终端看到中间结果。
|
||||||
|
|
||||||
```
|
```
|
||||||
def browserLister() {
|
def browserLister() {
|
||||||
// Applies filters and sorting to return a list of desired employees
|
// Applies filters and sorting to return a list of desired employees
|
||||||
```
|
```
|
||||||
|
|
||||||
首先,打印出传递给 **browserLister()** 的参数。我通常使用此代码开始构建控制器方法,以便我完全清楚我的控制器正在接收什么。
|
首先,打印出传递给 `browserLister()` 的参数。我通常使用此代码开始构建控制器方法,以便我完全清楚我的控制器正在接收什么。
|
||||||
|
|
||||||
```
|
```
|
||||||
println "employee browserLister params $params"
|
println "employee browserLister params $params"
|
||||||
println()
|
println()
|
||||||
```
|
```
|
||||||
|
|
||||||
接下来,处理这些参数以使它们更加有用。首先,jQuery DataTables 参数,一个名为 **jqdtParams**的 Groovy 映射:
|
接下来,处理这些参数以使它们更加有用。首先,jQuery DataTables 参数,一个名为 `jqdtParams` 的 Groovy 映射:
|
||||||
|
|
||||||
```
|
```
|
||||||
def jqdtParams = [:]
|
def jqdtParams = [:]
|
||||||
@ -363,7 +364,7 @@ println "employee dataTableParams $jqdtParams"
|
|||||||
println()
|
println()
|
||||||
```
|
```
|
||||||
|
|
||||||
接下来,列数据,一个名为 **columnMap**的 Groovy 映射:
|
接下来,列数据,一个名为 `columnMap` 的 Groovy 映射:
|
||||||
|
|
||||||
```
|
```
|
||||||
def columnMap = jqdtParams.columns.collectEntries { k, v ->
|
def columnMap = jqdtParams.columns.collectEntries { k, v ->
|
||||||
@ -386,7 +387,7 @@ println "employee columnMap $columnMap"
|
|||||||
println()
|
println()
|
||||||
```
|
```
|
||||||
|
|
||||||
接下来,从 **columnMap** 中检索的所有列表,以及在视图中应如何排序这些列表,Groovy 列表分别称为 **allColumnList**和 **orderList**:
|
接下来,从 `columnMap` 中检索的所有列表,以及在视图中应如何排序这些列表,Groovy 列表分别称为 `allColumnList` 和 `orderList` :
|
||||||
|
|
||||||
```
|
```
|
||||||
def allColumnList = columnMap.keySet() as List
|
def allColumnList = columnMap.keySet() as List
|
||||||
@ -395,7 +396,7 @@ def orderList = jqdtParams.order.collect { k, v -> [allColumnList[v.column as In
|
|||||||
println "employee orderList $orderList"
|
println "employee orderList $orderList"
|
||||||
```
|
```
|
||||||
|
|
||||||
我们将使用 Grails 的 Hibernate 标准实现来实际选择要显示的元素以及它们的排序和分页。标准要求过滤器关闭; 在大多数示例中,这是作为标准实例本身的创建的一部分给出的,但是在这里我们预先定义过滤器闭包。请注意,在这种情况下,“date hired” 过滤器的相对复杂的解释被视为一年并应用于建立日期范围,并使用 **createAlias** 以允许我们进入相关类别 Position 和 Office:
|
我们将使用 Grails 的 Hibernate 标准实现来实际选择要显示的元素以及它们的排序和分页。标准要求过滤器关闭;在大多数示例中,这是作为标准实例本身的创建的一部分给出的,但是在这里我们预先定义过滤器闭包。请注意,在这种情况下,“date hired” 过滤器的相对复杂的解释被视为一年并应用于建立日期范围,并使用 `createAlias` 以允许我们进入相关类别 `Position` 和 `Office`:
|
||||||
|
|
||||||
```
|
```
|
||||||
def filterer = {
|
def filterer = {
|
||||||
@ -424,14 +425,14 @@ def filterer = {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
是时候应用上述内容了。第一步是获取分页代码所需的所有 Employee 实例的总数:
|
是时候应用上述内容了。第一步是获取分页代码所需的所有 `Employee` 实例的总数:
|
||||||
|
|
||||||
```
|
```
|
||||||
def recordsTotal = Employee.count()
|
def recordsTotal = Employee.count()
|
||||||
println "employee recordsTotal $recordsTotal"
|
println "employee recordsTotal $recordsTotal"
|
||||||
```
|
```
|
||||||
|
|
||||||
接下来,将过滤器应用于 Employee 实例以获取过滤结果的计数,该结果将始终小于或等于总数(同样,这是针对分页代码):
|
接下来,将过滤器应用于 `Employee` 实例以获取过滤结果的计数,该结果将始终小于或等于总数(同样,这是针对分页代码):
|
||||||
|
|
||||||
```
|
```
|
||||||
def c = Employee.createCriteria()
|
def c = Employee.createCriteria()
|
||||||
@ -467,7 +468,7 @@ def filterer = {
|
|||||||
|
|
||||||
要完全清楚,JTable 中的分页代码管理三个计数:数据集中的记录总数,应用过滤器后得到的数字,以及要在页面上显示的数字(显示是滚动还是分页)。 排序应用于所有过滤的记录,并且分页应用于那些过滤的记录的块以用于显示目的。
|
要完全清楚,JTable 中的分页代码管理三个计数:数据集中的记录总数,应用过滤器后得到的数字,以及要在页面上显示的数字(显示是滚动还是分页)。 排序应用于所有过滤的记录,并且分页应用于那些过滤的记录的块以用于显示目的。
|
||||||
|
|
||||||
接下来,处理命令返回的结果,在每行中创建指向 Employee,Position 和 Office 实例的链接,以便用户可以单击这些链接以获取相关实例的所有详细信息:
|
接下来,处理命令返回的结果,在每行中创建指向 `Employee`、`Position` 和 `Office` 实例的链接,以便用户可以单击这些链接以获取相关实例的所有详细信息:
|
||||||
|
|
||||||
```
|
```
|
||||||
def dollarFormatter = new DecimalFormat('$##,###.##')
|
def dollarFormatter = new DecimalFormat('$##,###.##')
|
||||||
@ -490,14 +491,15 @@ def filterer = {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
大功告成
|
大功告成。
|
||||||
|
|
||||||
如果你熟悉 Grails,这可能看起来比你原先想象的要多,但这里没有火箭式的一步到位方法,只是很多分散的操作步骤。但是,如果你没有太多接触 Grails(或 Groovy),那么需要了解很多新东西 - 闭包,代理和构建器等等。
|
如果你熟悉 Grails,这可能看起来比你原先想象的要多,但这里没有火箭式的一步到位方法,只是很多分散的操作步骤。但是,如果你没有太多接触 Grails(或 Groovy),那么需要了解很多新东西 - 闭包,代理和构建器等等。
|
||||||
|
|
||||||
在那种情况下,从哪里开始? 最好的地方是了解 Groovy 本身,尤其是 [Groovy closures][18] 和 [Groovy delegates and builders][19]。然后再去阅读上面关于 Grails 和 Hibernate 条件查询的建议阅读文章。
|
在那种情况下,从哪里开始? 最好的地方是了解 Groovy 本身,尤其是 [Groovy closures][18] 和 [Groovy delegates and builders][19]。然后再去阅读上面关于 Grails 和 Hibernate 条件查询的建议阅读文章。
|
||||||
|
|
||||||
### 结语
|
### 结语
|
||||||
|
|
||||||
jQuery DataTables 为 Grails 制作了很棒的表格数据浏览器。对视图进行编码并不是太棘手,但DataTables 文档中提供的 PHP 示例提供的功能仅到此位置。特别是,它们不是用 Grails 程序员编写的,也不包含探索使用引用其他类(实质上是查找表)的元素的更精细的细节。
|
jQuery DataTables 为 Grails 制作了很棒的表格数据浏览器。对视图进行编码并不是太棘手,但 DataTables 文档中提供的 PHP 示例提供的功能仅到此位置。特别是,它们不是用 Grails 程序员编写的,也不包含探索使用引用其他类(实质上是查找表)的元素的更精细的细节。
|
||||||
|
|
||||||
我使用这种方法制作了几个数据浏览器,允许用户选择要查看和累积记录计数的列,或者只是浏览数据。即使在相对适度的 VPS 上的百万行表中,性能也很好。
|
我使用这种方法制作了几个数据浏览器,允许用户选择要查看和累积记录计数的列,或者只是浏览数据。即使在相对适度的 VPS 上的百万行表中,性能也很好。
|
||||||
|
|
||||||
@ -512,7 +514,7 @@ via: https://opensource.com/article/18/9/using-grails-jquery-and-datatables
|
|||||||
作者:[Chris Hermansen][a]
|
作者:[Chris Hermansen][a]
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
译者:[jrg](https://github.com/jrglinux)
|
译者:[jrg](https://github.com/jrglinux)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
@ -528,11 +530,11 @@ via: https://opensource.com/article/18/9/using-grails-jquery-and-datatables
|
|||||||
[9]: http://sdkman.io/
|
[9]: http://sdkman.io/
|
||||||
[10]: http://guides.grails.org/creating-your-first-grails-app/guide/index.html
|
[10]: http://guides.grails.org/creating-your-first-grails-app/guide/index.html
|
||||||
[11]: https://opensource.com/file/410061
|
[11]: https://opensource.com/file/410061
|
||||||
[12]: https://opensource.com/sites/default/files/uploads/screen_1.png "Embrow home screen"
|
[12]: https://opensource.com/sites/default/files/uploads/screen_1.png
|
||||||
[13]: https://opensource.com/file/410066
|
[13]: https://opensource.com/file/410066
|
||||||
[14]: https://opensource.com/sites/default/files/uploads/screen_2.png "Office list screenshot"
|
[14]: https://opensource.com/sites/default/files/uploads/screen_2.png
|
||||||
[15]: https://opensource.com/file/410071
|
[15]: https://opensource.com/file/410071
|
||||||
[16]: https://opensource.com/sites/default/files/uploads/screen3.png "Employee controller screenshot"
|
[16]: https://opensource.com/sites/default/files/uploads/screen3.png
|
||||||
[17]: https://gsp.grails.org/latest/ref/Tags/createLink.html
|
[17]: https://gsp.grails.org/latest/ref/Tags/createLink.html
|
||||||
[18]: http://groovy-lang.org/closures.html
|
[18]: http://groovy-lang.org/closures.html
|
||||||
[19]: http://groovy-lang.org/dsls.html
|
[19]: http://groovy-lang.org/dsls.html
|
@ -1,7 +1,7 @@
|
|||||||
容器技术对 DevOps 的一些启发
|
容器技术对 DevOps 的一些启发
|
||||||
======
|
======
|
||||||
|
|
||||||
容器技术的使用支撑了目前 DevOps 三大主要实践:工作流,及时反馈,持续学习。
|
> 容器技术的使用支撑了目前 DevOps 三大主要实践:工作流、及时反馈、持续学习。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=Cd2PmDWf)
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=Cd2PmDWf)
|
||||||
|
|
||||||
@ -11,11 +11,11 @@
|
|||||||
|
|
||||||
#### 容器中的工作流
|
#### 容器中的工作流
|
||||||
|
|
||||||
每个容器都可以看成一个独立的运行环境,对于容器内部,不需要考虑外部的宿主环境、集群环境、以及其它基础设施。在容器内部,每个功能看起来都是以传统的方式运行。从外部来看,容器内运行的应用一般作为整个应用系统架构的一部分:比如 web API,web app 用户界面,数据库,任务执行,缓存系统,垃圾回收等。运维团队一般会限制容器的资源使用,并在此基础上建立完善的容器性能监控服务,从而降低其对基础设施或者下游其他用户的影响。
|
每个容器都可以看成一个独立的运行环境,对于容器内部,不需要考虑外部的宿主环境、集群环境,以及其它基础设施。在容器内部,每个功能看起来都是以传统的方式运行。从外部来看,容器内运行的应用一般作为整个应用系统架构的一部分:比如 web API、web app 用户界面、数据库、任务执行、缓存系统、垃圾回收等。运维团队一般会限制容器的资源使用,并在此基础上建立完善的容器性能监控服务,从而降低其对基础设施或者下游其他用户的影响。
|
||||||
|
|
||||||
#### 现实中的工作流
|
#### 现实中的工作流
|
||||||
|
|
||||||
那些跟“容器”一样业务功能独立的团队,也可以借鉴这种容器思维。因为无论是在现实生活中的工作流(代码发布、构建基础设施,甚至制造 [Spacely’s Sprockets][2] 等),还是技术中的工作流(开发、测试、运维、发布)都使用了这样的线性工作流,一旦某个独立的环节或者工作团队出现了问题,那么整个下游都会受到影响,虽然使用这种线性的工作流有效降低了工作耦合性。
|
那些跟“容器”一样业务功能独立的团队,也可以借鉴这种容器思维。因为无论是在现实生活中的工作流(代码发布、构建基础设施,甚至制造 [《杰森一家》中的斯贝斯利太空飞轮][2] 等),还是技术中的工作流(开发、测试、运维、发布)都使用了这样的线性工作流,一旦某个独立的环节或者工作团队出现了问题,那么整个下游都会受到影响,虽然使用这种线性的工作流有效降低了工作耦合性。
|
||||||
|
|
||||||
#### DevOps 中的工作流
|
#### DevOps 中的工作流
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ DevOps 中的第一条原则,就是掌控整个执行链路的情况,努力
|
|||||||
|
|
||||||
> 践行这样的工作流后,可以避免将一个已知缺陷带到工作流的下游,避免局部优化导致可能的全局性能下降,要不断探索如何优化工作流,持续加深对于系统的理解。
|
> 践行这样的工作流后,可以避免将一个已知缺陷带到工作流的下游,避免局部优化导致可能的全局性能下降,要不断探索如何优化工作流,持续加深对于系统的理解。
|
||||||
|
|
||||||
—— Gene Kim,[支撑 DevOps 的三个实践][3],IT 革命,2017.4.25
|
> —— Gene Kim,《[支撑 DevOps 的三个实践][3]》,IT 革命,2017.4.25
|
||||||
|
|
||||||
### 反馈
|
### 反馈
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ DevOps 中的第一条原则,就是掌控整个执行链路的情况,努力
|
|||||||
|
|
||||||
#### 现实中的反馈
|
#### 现实中的反馈
|
||||||
|
|
||||||
在现实中,从始至终同样也需要反馈。一个高效的处理流程中,及时的反馈能够快速地定位事情发生的时间。反馈的关键词是“快速”和“相关”。当一个团队被淹没在大量不相关的事件时,那些真正需要快速反馈的重要信息很容易被忽视掉,并向下游传递形成更严重的问题。想象下[如果露西和埃塞尔][6]能够很快地意识到:传送带太快了,那么制作出的巧克力可能就没什么问题了(尽管这样就不那么搞笑了)。
|
在现实中,从始至终同样也需要反馈。一个高效的处理流程中,及时的反馈能够快速地定位事情发生的时间。反馈的关键词是“快速”和“相关”。当一个团队被淹没在大量不相关的事件时,那些真正需要快速反馈的重要信息很容易被忽视掉,并向下游传递形成更严重的问题。想象下[如果露西和埃塞尔][6]能够很快地意识到:传送带太快了,那么制作出的巧克力可能就没什么问题了(尽管这样就不那么搞笑了)。(LCTT 译注:露西和埃塞尔是上世纪 50 年代的著名黑白情景喜剧《我爱露西》中的主角)
|
||||||
|
|
||||||
#### DevOps 中的反馈
|
#### DevOps 中的反馈
|
||||||
|
|
||||||
@ -41,7 +41,7 @@ DevOps 中的第二条原则,就是快速收集所有相关的有用信息,
|
|||||||
|
|
||||||
> 快速的反馈对于提高技术的质量、可用性、安全性至关重要。
|
> 快速的反馈对于提高技术的质量、可用性、安全性至关重要。
|
||||||
|
|
||||||
—— Gene Kim 及其他,DevOps 手册:如何在技术组织中创造世界级的敏捷性,可靠性和安全性,IT 革命,2016
|
> —— Gene Kim 等人,《DevOps 手册:如何在技术组织中创造世界级的敏捷性,可靠性和安全性》,IT 革命,2016
|
||||||
|
|
||||||
### 持续学习
|
### 持续学习
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ DevOps 中的第二条原则,就是快速收集所有相关的有用信息,
|
|||||||
|
|
||||||
> 实验和冒险让我们能够不懈地改进我们的工作,但也要求我们尝试之前未用过的工作方式。
|
> 实验和冒险让我们能够不懈地改进我们的工作,但也要求我们尝试之前未用过的工作方式。
|
||||||
|
|
||||||
—— Gene Kim 及其他,[凤凰计划:让你了解 IT、DevOps 以及如何取得商业成功][7],IT 革命,2013
|
> —— Gene Kim 等人,《[凤凰计划:让你了解 IT、DevOps 以及如何取得商业成功][7]》,IT 革命,2013
|
||||||
|
|
||||||
### 容器技术带给 DevOps 的启迪
|
### 容器技术带给 DevOps 的启迪
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ via: https://opensource.com/article/18/9/containers-can-teach-us-devops
|
|||||||
作者:[Chris Hermansen][a]
|
作者:[Chris Hermansen][a]
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
译者:[littleji](https://github.com/littleji)
|
译者:[littleji](https://github.com/littleji)
|
||||||
校对:[pityonline](https://github.com/pityonline)
|
校对:[pityonline](https://github.com/pityonline), [wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -0,0 +1,259 @@
|
|||||||
|
使用 Pandoc 将你的书转换成网页和电子书
|
||||||
|
======
|
||||||
|
|
||||||
|
> 通过 Markdown 和 Pandoc,可以做到编写一次,发布两次。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/email_paper_envelope_document.png?itok=uPj_kouJ)
|
||||||
|
|
||||||
|
Pandoc 是一个命令行工具,用于将文件从一种标记语言转换为另一种标记语言。在我 [对 Pandoc 的简介][1] 一文中,我演示了如何把 Markdown 编写的文本转换为网页、幻灯片和 PDF。
|
||||||
|
|
||||||
|
在这篇后续文章中,我将深入探讨 [Pandoc][2],展示如何从同一个 Markdown 源文件生成网页和 ePub 格式的电子书。我将使用我即将发布的电子书《[面向对象思想的 GRASP 原则][3]》为例进行讲解,这本电子书正是通过以下过程创建的。
|
||||||
|
|
||||||
|
首先,我将解释这本书使用的文件结构,然后介绍如何使用 Pandoc 生成网页并将其部署在 GitHub 上;最后,我演示了如何生成对应的 ePub 格式电子书。
|
||||||
|
|
||||||
|
你可以在我的 GitHub 仓库 [Programming Fight Club][4] 中找到相应代码。
|
||||||
|
|
||||||
|
### 设置图书结构
|
||||||
|
|
||||||
|
我用 Markdown 语法完成了所有的写作,你也可以使用 HTML 标记,但是当 Pandoc 将 Markdown 转换为 ePub 文档时,引入的 HTML 标记越多,出现问题的风险就越高。我的书按照每章一个文件的形式进行组织,用 Markdown 的 `H1` 标记(`#`)声明每章的标题。你也可以在每个文件中放置多个章节,但将它们放在单独的文件中可以更轻松地查找内容并在以后进行更新。
|
||||||
|
|
||||||
|
元信息遵循类似的模式,每种输出格式都有自己的元信息文件。元信息文件定义有关文档的信息,例如要添加到 HTML 中的文本或 ePub 的许可证。我将所有 Markdown 文档存储在名为 `parts` 的文件夹中(这对于用来生成网页和 ePub 的 Makefile 非常重要)。下面以一个例子进行说明,让我们看一下目录,前言和关于本书(分为 `toc.md`、`preface.md` 和 `about.md` 三个文件)这三部分,为清楚起见,我们将省略其余的章节。
|
||||||
|
|
||||||
|
关于本书这部分内容的开头部分类似:
|
||||||
|
|
||||||
|
```
|
||||||
|
# About this book {-}
|
||||||
|
|
||||||
|
## Who should read this book {-}
|
||||||
|
|
||||||
|
Before creating a complex software system one needs to create a solid foundation.
|
||||||
|
General Responsibility Assignment Software Principles (GRASP) are guidelines to assign
|
||||||
|
responsibilities to software classes in object-oriented programming.
|
||||||
|
```
|
||||||
|
|
||||||
|
每一章完成后,下一步就是添加元信息来设置网页和 ePub 的格式。
|
||||||
|
|
||||||
|
### 生成网页
|
||||||
|
|
||||||
|
#### 创建 HTML 元信息文件
|
||||||
|
|
||||||
|
我创建的网页的元信息文件(`web-metadata.yaml`)是一个简单的 YAML 文件,其中包含 `<head> ` 标签中的作者、标题、和版权等信息,以及 HTML 文件中开头和结尾的内容。
|
||||||
|
|
||||||
|
我建议(至少)包括 `web-metadata.yaml` 文件中的以下字段:
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
title: <a href="/grasp-principles/toc/">GRASP principles for the Object-oriented mind</a>
|
||||||
|
author: Kiko Fernandez-Reyes
|
||||||
|
rights: 2017 Kiko Fernandez-Reyes, CC-BY-NC-SA 4.0 International
|
||||||
|
header-includes:
|
||||||
|
- |
|
||||||
|
```{=html}
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Inconsolata" rel="stylesheet">
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Gentium+Basic|Inconsolata" rel="stylesheet">
|
||||||
|
```
|
||||||
|
include-before:
|
||||||
|
- |
|
||||||
|
```{=html}
|
||||||
|
<p>If you like this book, please consider
|
||||||
|
spreading the word or
|
||||||
|
<a href="https://www.buymeacoffee.com/programming">
|
||||||
|
buying me a coffee
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
```
|
||||||
|
include-after:
|
||||||
|
- |
|
||||||
|
```{=html}
|
||||||
|
<div class="footnotes">
|
||||||
|
<hr>
|
||||||
|
<div class="container">
|
||||||
|
<nav class="pagination" role="pagination">
|
||||||
|
<ul>
|
||||||
|
<p>
|
||||||
|
<span class="page-number">Designed with</span> ❤️ <span class="page-number"> from Uppsala, Sweden</span>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a>
|
||||||
|
</p>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
```
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
下面几个变量需要注意一下:
|
||||||
|
|
||||||
|
- `header-includes` 变量包含将要嵌入 `<head>` 标签的 HTML 文本。
|
||||||
|
- 调用变量后的下一行必须是 `- |`。再往下一行必须以与 `|` 对齐的三个反引号开始,否则 Pandoc 将无法识别。`{= html}` 告诉 Pandoc 其中的内容是原始文本,不应该作为 Markdown 处理。(为此,需要检查 Pandoc 中的 `raw_attribute` 扩展是否已启用。要进行此检查,键入 `pandoc --list-extensions | grep raw` 并确保返回的列表包含名为 `+ raw_html` 的项目,加号表示已启用。)
|
||||||
|
- 变量 `include-before` 在网页开头添加一些 HTML 文本,此处我请求读者帮忙宣传我的书或给我打赏。
|
||||||
|
- `include-after` 变量在网页末尾添加原始 HTML 文本,同时显示我的图书许可证。
|
||||||
|
|
||||||
|
这些只是其中一部分可用的变量,查看 HTML 中的模板变量(我的文章 [Pandoc简介][1] 中介绍了如何查看 LaTeX 的模版变量,查看 HTML 模版变量的过程是相同的)对其余变量进行了解。
|
||||||
|
|
||||||
|
#### 将网页分成多章
|
||||||
|
|
||||||
|
网页可以作为一个整体生成,这会产生一个包含所有内容的长页面;也可以分成多章,我认为这样会更容易阅读。我将解释如何将网页划分为多章,以便读者不会被长网页吓到。
|
||||||
|
|
||||||
|
为了使网页易于在 GitHub Pages 上部署,需要创建一个名为 `docs` 的根文件夹(这是 GitHub Pages 默认用于渲染网页的根文件夹)。然后我们需要为 `docs` 下的每一章创建文件夹,将 HTML 内容放在各自的文件夹中,将文件内容放在名为 `index.html` 的文件中。
|
||||||
|
|
||||||
|
例如,`about.md` 文件将转换成名为 `index.html` 的文件,该文件位于名为 `about`(`about/index.html`)的文件夹中。这样,当用户键入 `http://<your-website.com>/about/` 时,文件夹中的 `index.html` 文件将显示在其浏览器中。
|
||||||
|
|
||||||
|
下面的 `Makefile` 将执行上述所有操作:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Your book files
|
||||||
|
DEPENDENCIES= toc preface about
|
||||||
|
|
||||||
|
# Placement of your HTML files
|
||||||
|
DOCS=docs
|
||||||
|
|
||||||
|
all: web
|
||||||
|
|
||||||
|
web: setup $(DEPENDENCIES)
|
||||||
|
@cp $(DOCS)/toc/index.html $(DOCS)
|
||||||
|
|
||||||
|
|
||||||
|
# Creation and copy of stylesheet and images into
|
||||||
|
# the assets folder. This is important to deploy the
|
||||||
|
# website to Github Pages.
|
||||||
|
setup:
|
||||||
|
@mkdir -p $(DOCS)
|
||||||
|
@cp -r assets $(DOCS)
|
||||||
|
|
||||||
|
|
||||||
|
# Creation of folder and index.html file on a
|
||||||
|
# per-chapter basis
|
||||||
|
|
||||||
|
$(DEPENDENCIES):
|
||||||
|
@mkdir -p $(DOCS)/$@
|
||||||
|
@pandoc -s --toc web-metadata.yaml parts/$@.md \
|
||||||
|
-c /assets/pandoc.css -o $(DOCS)/$@/index.html
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -rf $(DOCS)
|
||||||
|
|
||||||
|
.PHONY: all clean web setup
|
||||||
|
```
|
||||||
|
|
||||||
|
选项 `- c /assets/pandoc.css` 声明要使用的 CSS 样式表,它将从 `/assets/pandoc.cs` 中获取。也就是说,在 `<head>` 标签内,Pandoc 会添加这样一行:
|
||||||
|
|
||||||
|
```
|
||||||
|
<link rel="stylesheet" href="/assets/pandoc.css">
|
||||||
|
```
|
||||||
|
|
||||||
|
使用下面的命令生成网页:
|
||||||
|
|
||||||
|
```
|
||||||
|
make
|
||||||
|
```
|
||||||
|
|
||||||
|
根文件夹现在应该包含如下所示的文件结构:
|
||||||
|
|
||||||
|
```
|
||||||
|
.---parts
|
||||||
|
| |--- toc.md
|
||||||
|
| |--- preface.md
|
||||||
|
| |--- about.md
|
||||||
|
|
|
||||||
|
|---docs
|
||||||
|
|--- assets/
|
||||||
|
|--- index.html
|
||||||
|
|--- toc
|
||||||
|
| |--- index.html
|
||||||
|
|
|
||||||
|
|--- preface
|
||||||
|
| |--- index.html
|
||||||
|
|
|
||||||
|
|--- about
|
||||||
|
|--- index.html
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 部署网页
|
||||||
|
|
||||||
|
通过以下步骤将网页部署到 GitHub 上:
|
||||||
|
|
||||||
|
1. 创建一个新的 GitHub 仓库
|
||||||
|
2. 将内容推送到新创建的仓库
|
||||||
|
3. 找到仓库设置中的 GitHub Pages 部分,选择 `Source` 选项让 GitHub 使用主分支的内容
|
||||||
|
|
||||||
|
你可以在 [GitHub Pages][5] 的网站上获得更多详细信息。
|
||||||
|
|
||||||
|
[我的书的网页][6] 便是通过上述过程生成的,可以在网页上查看结果。
|
||||||
|
|
||||||
|
### 生成电子书
|
||||||
|
|
||||||
|
#### 创建 ePub 格式的元信息文件
|
||||||
|
|
||||||
|
ePub 格式的元信息文件 `epub-meta.yaml` 和 HTML 元信息文件是类似的。主要区别在于 ePub 提供了其他模板变量,例如 `publisher` 和 `cover-image` 。ePub 格式图书的样式表可能与网页所用的不同,在这里我使用一个名为 `epub.css` 的样式表。
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
title: 'GRASP principles for the Object-oriented Mind'
|
||||||
|
publisher: 'Programming Language Fight Club'
|
||||||
|
author: Kiko Fernandez-Reyes
|
||||||
|
rights: 2017 Kiko Fernandez-Reyes, CC-BY-NC-SA 4.0 International
|
||||||
|
cover-image: assets/cover.png
|
||||||
|
stylesheet: assets/epub.css
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
将以下内容添加到之前的 `Makefile` 中:
|
||||||
|
|
||||||
|
```
|
||||||
|
epub:
|
||||||
|
@pandoc -s --toc epub-meta.yaml \
|
||||||
|
$(addprefix parts/, $(DEPENDENCIES:=.md)) -o $(DOCS)/assets/book.epub
|
||||||
|
```
|
||||||
|
|
||||||
|
用于产生 ePub 格式图书的命令从 HTML 版本获取所有依赖项(每章的名称),向它们添加 Markdown 扩展,并在它们前面加上每一章的文件夹路径,以便让 Pandoc 知道如何进行处理。例如,如果 `$(DEPENDENCIES` 变量只包含 “前言” 和 “关于本书” 两章,那么 `Makefile` 将会这样调用:
|
||||||
|
|
||||||
|
```
|
||||||
|
@pandoc -s --toc epub-meta.yaml \
|
||||||
|
parts/preface.md parts/about.md -o $(DOCS)/assets/book.epub
|
||||||
|
```
|
||||||
|
|
||||||
|
Pandoc 将提取这两章的内容,然后进行组合,最后生成 ePub 格式的电子书,并放在 `Assets` 文件夹中。
|
||||||
|
|
||||||
|
这是使用此过程创建 ePub 格式电子书的一个 [示例][7]。
|
||||||
|
|
||||||
|
### 过程总结
|
||||||
|
|
||||||
|
从 Markdown 文件创建网页和 ePub 格式电子书的过程并不困难,但有很多细节需要注意。遵循以下大纲可能使你更容易使用 Pandoc。
|
||||||
|
|
||||||
|
- HTML 图书:
|
||||||
|
- 使用 Markdown 语法创建每章内容
|
||||||
|
- 添加元信息
|
||||||
|
- 创建一个 `Makefile` 将各个部分组合在一起
|
||||||
|
- 设置 GitHub Pages
|
||||||
|
- 部署
|
||||||
|
- ePub 电子书:
|
||||||
|
- 使用之前创建的每一章内容
|
||||||
|
- 添加新的元信息文件
|
||||||
|
- 创建一个 `Makefile` 以将各个部分组合在一起
|
||||||
|
- 设置 GitHub Pages
|
||||||
|
- 部署
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/18/10/book-to-website-epub-using-pandoc
|
||||||
|
|
||||||
|
作者:[Kiko Fernandez-Reyes][a]
|
||||||
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
|
译者:[jlztan](https://github.com/jlztan)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/kikofernandez
|
||||||
|
[1]: https://linux.cn/article-10228-1.html
|
||||||
|
[2]: https://pandoc.org/
|
||||||
|
[3]: https://www.programmingfightclub.com/
|
||||||
|
[4]: https://github.com/kikofernandez/programmingfightclub
|
||||||
|
[5]: https://pages.github.com/
|
||||||
|
[6]: https://www.programmingfightclub.com/grasp-principles/
|
||||||
|
[7]: https://github.com/kikofernandez/programmingfightclub/raw/master/docs/web_assets/demo.epub
|
@ -1,42 +1,42 @@
|
|||||||
|
|
||||||
Greg Kroah-Hartman 解释内核社区如何保护 Linux
|
Greg Kroah-Hartman 解释内核社区是如何使 Linux 安全的
|
||||||
============================================================
|
============
|
||||||
|
|
||||||
![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/kernel-security_0.jpg?itok=hOaTQwWV)
|
![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/kernel-security_0.jpg?itok=hOaTQwWV)
|
||||||
内核维护者 Greg Kroah-Hartman 谈论内核社区如何保护 Linux 不遭受损害。[Creative Commons Zero][2]
|
|
||||||
|
|
||||||
由于 Linux 使用量持续扩大,内核社区去提高全世界最广泛使用的技术 — Linux 内核的安全性的重要程序越来越高。安全不仅对企业客户很重要,它对消费者也很重要,因为 80% 的移动设备都使用了 Linux。在本文中,Linux 内核维护者 Greg Kroah-Hartman 带我们了解内核社区如何应对威胁。
|
> 内核维护者 Greg Kroah-Hartman 谈论内核社区如何保护 Linux 不遭受损害。
|
||||||
|
|
||||||
|
由于 Linux 使用量持续扩大,内核社区去提高这个世界上使用最广泛的技术 —— Linux 内核的安全性的重要性越来越高。安全不仅对企业客户很重要,它对消费者也很重要,因为 80% 的移动设备都使用了 Linux。在本文中,Linux 内核维护者 Greg Kroah-Hartman 带我们了解内核社区如何应对威胁。
|
||||||
|
|
||||||
### bug 不可避免
|
### bug 不可避免
|
||||||
|
|
||||||
|
|
||||||
![Greg Kroah-Hartman](https://www.linux.com/sites/lcom/files/styles/floated_images/public/greg-k-h.png?itok=p4fREYuj "Greg Kroah-Hartman")
|
![Greg Kroah-Hartman](https://www.linux.com/sites/lcom/files/styles/floated_images/public/greg-k-h.png?itok=p4fREYuj "Greg Kroah-Hartman")
|
||||||
|
|
||||||
Greg Kroah-Hartman [Linux 基金会][1]
|
*Greg Kroah-Hartman [Linux 基金会][1]*
|
||||||
|
|
||||||
正如 Linus Torvalds 曾经说过,大多数安全问题都是 bug 造成的,而 bug 又是软件开发过程的一部分。是个软件就有 bug。
|
正如 Linus Torvalds 曾经说过的,大多数安全问题都是 bug 造成的,而 bug 又是软件开发过程的一部分。是软件就有 bug。
|
||||||
|
|
||||||
Kroah-Hartman 说:“就算是 bug ,我们也不知道它是安全的 bug 还是不安全的 bug。我修复的一个著名 bug,在三年后才被 Red Hat 认定为安全漏洞“。
|
Kroah-Hartman 说:“就算是 bug,我们也不知道它是安全的 bug 还是不安全的 bug。我修复的一个著名 bug,在三年后才被 Red Hat 认定为安全漏洞“。
|
||||||
|
|
||||||
在消除 bug 方面,内核社区没有太多的办法,只能做更多的测试来寻找 bug。内核社区现在已经有了自己的安全团队,它们是由熟悉内核核心的内核开发者组成。
|
在消除 bug 方面,内核社区没有太多的办法,只能做更多的测试来寻找 bug。内核社区现在已经有了自己的安全团队,它们是由熟悉内核核心的内核开发者组成。
|
||||||
|
|
||||||
Kroah Hartman 说:”当我们收到一个报告时,我们就让参与这个领域的核心开发者去修复它。在一些情况下,他们可能是同一个人,让他们进入安全团队可以更快地解决问题“。但他也强调,内核所有部分的开发者都必须清楚地了解这些问题,因为内核是一个可信环境,它必须被保护起来。
|
Kroah-Hartman 说:”当我们收到一个报告时,我们就让参与这个领域的核心开发者去修复它。在一些情况下,他们可能是同一个人,让他们进入安全团队可以更快地解决问题“。但他也强调,内核所有部分的开发者都必须清楚地了解这些问题,因为内核是一个可信环境,它必须被保护起来。
|
||||||
|
|
||||||
Kroah Hartman 说:”一旦我们修复了它,我们就将它放到我们的栈分析规则中,以便于以后不再重新出现这个 bug。“
|
Kroah-Hartman 说:”一旦我们修复了它,我们就将它放到我们的栈分析规则中,以便于以后不再重新出现这个 bug。“
|
||||||
|
|
||||||
除修复 bug 之外,内核社区也不断加固内核。Kroah Hartman 说:“我们意识到,我们需要一些主动的缓减措施。因此我们需要加固内核。”
|
除修复 bug 之外,内核社区也不断加固内核。Kroah-Hartman 说:“我们意识到,我们需要一些主动的缓减措施,因此我们需要加固内核。”
|
||||||
|
|
||||||
Kees Cook 和其他一些人付出了巨大的努力,带来了一直在内核之外的加固特性,并将它们合并或适配到内核中。在每个内核发行后,Cook 都对所有新的加固特性做一个总结。但是只加固内核是不够的,供应商必须要启用这些新特性来让它们充分发挥作用。但他们并没有这么做。
|
Kees Cook 和其他一些人付出了巨大的努力,带来了一直在内核之外的加固特性,并将它们合并或适配到内核中。在每个内核发行后,Cook 都对所有新的加固特性做一个总结。但是只加固内核是不够的,供应商们必须要启用这些新特性来让它们充分发挥作用,但他们并没有这么做。
|
||||||
|
|
||||||
Kroah-Hartman [每周发布一个稳定版内核][5],而为了长周期的支持,公司只从中挑选一个,以便于设备制造商能够利用它。但是,Kroah-Hartman 注意到,除了 Google Pixel 之外,大多数 Android 手机并不包含这些额外的安全加固特性,这就意味着,所有的这些手机都是有漏洞的。他说:“人们应该去启用这些加固特性”。
|
Kroah-Hartman [每周发布一个稳定版内核][5],而为了长期的支持,公司们只从中挑选一个,以便于设备制造商能够利用它。但是,Kroah-Hartman 注意到,除了 Google Pixel 之外,大多数 Android 手机并不包含这些额外的安全加固特性,这就意味着,所有的这些手机都是有漏洞的。他说:“人们应该去启用这些加固特性”。
|
||||||
|
|
||||||
Kroah-Hartman 说:“我购买了基于 Linux 内核 4.4 的所有旗舰级手机,去查看它们中哪些确实升级了新特性。结果我发现只有一家公司升级了它们的内核”。“我在整个供应链中努力去解决这个问题,因为这是一个很棘手的问题。它涉及许多不同的组织 — SoC 制造商、运营商、等等。关键点是,需要他们把我们辛辛苦苦设计的内核去推送给大家。
|
Kroah-Hartman 说:“我购买了基于 Linux 内核 4.4 的所有旗舰级手机,去查看它们中哪些确实升级了新特性。结果我发现只有一家公司升级了它们的内核。……我在整个供应链中努力去解决这个问题,因为这是一个很棘手的问题。它涉及许多不同的组织 —— SoC 制造商、运营商等等。关键点是,需要他们把我们辛辛苦苦设计的内核去推送给大家。”
|
||||||
|
|
||||||
好消息是,与消息电子产品不一样,像 Red Hat 和 SUSE 这样的大供应商,在企业环境中持续对内核进行更新。使用容器、pod、和虚拟化的现代系统做到这一点更容易了。无需停机就可以毫不费力地更新和重启。事实上,现在来保证系统安全相比过去容易多了。
|
好消息是,与消费电子产品不一样,像 Red Hat 和 SUSE 这样的大供应商,在企业环境中持续对内核进行更新。使用容器、pod 和虚拟化的现代系统做到这一点更容易了。无需停机就可以毫不费力地更新和重启。事实上,现在来保证系统安全相比过去容易多了。
|
||||||
|
|
||||||
### Meltdown 和 Spectre
|
### Meltdown 和 Spectre
|
||||||
|
|
||||||
没有任何一个关于安全的讨论能够避免提及 Meltdown 和 Spectre。内核社区一直致力于修改新发现的和已查明的安全漏洞。不管怎样,Intel 已经因为这些事情改变了它们的策略。
|
没有任何一个关于安全的讨论能够避免提及 Meltdown 和 Spectre 缺陷。内核社区一直致力于修改新发现的和已查明的安全漏洞。不管怎样,Intel 已经因为这些事情改变了它们的策略。
|
||||||
|
|
||||||
Kroah-Hartman 说:“他们已经重新研究如何处理安全 bug,以及如何与社区合作,因为他们知道他们做错了。内核已经修复了几乎所有大的 Spectre 问题,但是还有一些小问题仍在处理中”。
|
Kroah-Hartman 说:“他们已经重新研究如何处理安全 bug,以及如何与社区合作,因为他们知道他们做错了。内核已经修复了几乎所有大的 Spectre 问题,但是还有一些小问题仍在处理中”。
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ via: https://www.linux.com/blog/2018/10/greg-kroah-hartman-explains-how-kernel-c
|
|||||||
作者:[SWAPNIL BHARTIYA][a]
|
作者:[SWAPNIL BHARTIYA][a]
|
||||||
选题:[oska874][b]
|
选题:[oska874][b]
|
||||||
译者:[qhwdw](https://github.com/qhwdw)
|
译者:[qhwdw](https://github.com/qhwdw)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -1,13 +1,13 @@
|
|||||||
服务器的 LinuxBoot:告别 UEFI、拥抱开源
|
服务器的 LinuxBoot:告别 UEFI、拥抱开源
|
||||||
============================================================
|
============
|
||||||
|
|
||||||
[LinuxBoot][13] 是私有的 [UEFI][15] 固件的 [替代者][14]。它发布于去年,并且现在已经得到主流的硬件生产商的认可成为他们产品的默认固件。去年,LinuxBoot 已经被 Linux 基金会接受并[纳入][16]开源家族。
|
[LinuxBoot][13] 是私有的 [UEFI][15] 固件的开源 [替代品][14]。它发布于去年,并且现在已经得到主流的硬件生产商的认可成为他们产品的默认固件。去年,LinuxBoot 已经被 Linux 基金会接受并[纳入][16]开源家族。
|
||||||
|
|
||||||
这个项目最初是由 Ron Minnich 在 2017 年 1 月提出,它是 LinuxBIOS 的创造人,并且在 Google 领导 [coreboot][17] 的工作。
|
这个项目最初是由 Ron Minnich 在 2017 年 1 月提出,它是 LinuxBIOS 的创造人,并且在 Google 领导 [coreboot][17] 的工作。
|
||||||
|
|
||||||
Google、Facebook、[Horizon 计算解决方案][18]、和 [Two Sigma][19] 共同合作,在运行 Linux 的服务器上开发 [LinuxBoot 项目][20](以前叫 [NERF][21])。
|
Google、Facebook、[Horizon Computing Solutions][18]、和 [Two Sigma][19] 共同合作,在运行 Linux 的服务器上开发 [LinuxBoot 项目][20](以前叫 [NERF][21])。
|
||||||
|
|
||||||
它开放允许服务器用户去很容易地定制他们自己的引导脚本、修复问题、构建他们自己的[运行时][22] 和用他们自己的密钥去 [刷入固件][23]。他们不需要等待供应商的更新。
|
它的开放性允许服务器用户去很容易地定制他们自己的引导脚本、修复问题、构建他们自己的 [运行时环境][22] 和用他们自己的密钥去 [刷入固件][23],而不需要等待供应商的更新。
|
||||||
|
|
||||||
下面是第一次使用 NERF BIOS 去引导 [Ubuntu Xenial][24] 的视频:
|
下面是第一次使用 NERF BIOS 去引导 [Ubuntu Xenial][24] 的视频:
|
||||||
|
|
||||||
@ -17,40 +17,36 @@ Google、Facebook、[Horizon 计算解决方案][18]、和 [Two Sigma][19] 共
|
|||||||
|
|
||||||
### LinuxBoot 超越 UEFI 的优势
|
### LinuxBoot 超越 UEFI 的优势
|
||||||
|
|
||||||
![LinuxBoot vs UEFI](https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/linuxboot-uefi.png)
|
![LinuxBoot vs UEFI](https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/10/linuxboot-uefi.png?w=800&ssl=1)
|
||||||
|
|
||||||
下面是一些 LinuxBoot 超越 UEFI 的主要优势:
|
下面是一些 LinuxBoot 超越 UEFI 的主要优势:
|
||||||
|
|
||||||
### 启动速度显著加快
|
#### 启动速度显著加快
|
||||||
|
|
||||||
它能在 20 秒钟以内完成服务器启动,而 UEFI 需要几分钟的时间。
|
它能在 20 秒钟以内完成服务器启动,而 UEFI 需要几分钟的时间。
|
||||||
|
|
||||||
### 显著的灵活性
|
#### 显著的灵活性
|
||||||
|
|
||||||
LinuxBoot 可以用在各种设备、文件系统和 Linux 支持的协议上。
|
LinuxBoot 可以用在 Linux 支持的各种设备、文件系统和协议上。
|
||||||
|
|
||||||
### 更加安全
|
#### 更加安全
|
||||||
|
|
||||||
相比 UEFI 而言,LinuxBoot 在设备驱动程序和文件系统方面进行更加严格的检查。
|
相比 UEFI 而言,LinuxBoot 在设备驱动程序和文件系统方面进行更加严格的检查。
|
||||||
|
|
||||||
我们可能主张 UEFI 是使用 [EDK II][25] 而部分开源的,而 LinuxBoot 是部分闭源的。但有人[提出][26],即便有像 EDK II 这样的代码,但也没有做适当的审查级别和像 [Linux 内核][27] 那样的正确性检查,并且在 UEFI 的开发中还大量使用闭源组件。
|
我们可能争辩说 UEFI 是使用 [EDK II][25] 而部分开源的,而 LinuxBoot 是部分闭源的。但有人[提出][26],即便有像 EDK II 这样的代码,但也没有做适当的审查级别和像 [Linux 内核][27] 那样的正确性检查,并且在 UEFI 的开发中还大量使用闭源组件。
|
||||||
|
|
||||||
其它方面,LinuxBoot 有非常少的二进制文件,它仅用了大约一百多 KB,相比而言,UEFI 的二进制文件有 32 MB。
|
另一方面,LinuxBoot 有非常小的二进制文件,它仅用了大约几百 KB,相比而言,而 UEFI 的二进制文件有 32 MB。
|
||||||
|
|
||||||
严格来说,LinuxBoot 与 UEFI 不一样,更适合于[可信计算基础][28]。
|
严格来说,LinuxBoot 与 UEFI 不一样,更适合于[可信计算基础][28]。
|
||||||
|
|
||||||
[建议阅读 Linux 上最好的自由开源的 Adobe 产品的替代者][29]
|
|
||||||
|
|
||||||
LinuxBoot 有一个基于 [kexec][30] 的引导加载器,它不支持启动 Windows/非 Linux 内核,但这影响并不大,因为主流的云都是基于 Linux 的服务器。
|
LinuxBoot 有一个基于 [kexec][30] 的引导加载器,它不支持启动 Windows/非 Linux 内核,但这影响并不大,因为主流的云都是基于 Linux 的服务器。
|
||||||
|
|
||||||
### LinuxBoot 的采用者
|
### LinuxBoot 的采用者
|
||||||
|
|
||||||
自 2011 年, [Facebook][32] 发起了[开源计算项目][31],它的一些服务器是基于[开源][33]设计的,目的是构建的数据中心更加高效。LinuxBoot 已经在下面列出的几个开源计算硬件上做了测试:
|
自 2011 年, [Facebook][32] 发起了[开源计算项目(OCP)][31],它的一些服务器是基于[开源][33]设计的,目的是构建的数据中心更加高效。LinuxBoot 已经在下面列出的几个开源计算硬件上做了测试:
|
||||||
|
|
||||||
* Winterfell
|
* Winterfell
|
||||||
|
|
||||||
* Leopard
|
* Leopard
|
||||||
|
|
||||||
* Tioga Pass
|
* Tioga Pass
|
||||||
|
|
||||||
更多 [OCP][34] 硬件在[这里][35]有一个简短的描述。OCP 基金会通过[开源系统固件][36]运行一个专门的固件项目。
|
更多 [OCP][34] 硬件在[这里][35]有一个简短的描述。OCP 基金会通过[开源系统固件][36]运行一个专门的固件项目。
|
||||||
@ -58,9 +54,7 @@ LinuxBoot 有一个基于 [kexec][30] 的引导加载器,它不支持启动
|
|||||||
支持 LinuxBoot 的其它一些设备有:
|
支持 LinuxBoot 的其它一些设备有:
|
||||||
|
|
||||||
* [QEMU][9] 仿真的 [Q35][10] 系统
|
* [QEMU][9] 仿真的 [Q35][10] 系统
|
||||||
|
|
||||||
* [Intel S2600wf][11]
|
* [Intel S2600wf][11]
|
||||||
|
|
||||||
* [Dell R630][12]
|
* [Dell R630][12]
|
||||||
|
|
||||||
上个月底(2018 年 9 月 24 日),[Equus 计算解决方案][37] [宣布][38] 发行它的 [白盒开放式™][39] M2660 和 M2760 服务器,作为它们的定制的、成本优化的、开放硬件服务器和存储平台的一部分。它们都支持 LinuxBoot 灵活定制服务器的 BIOS,以提升安全性和设计一个非常快的纯净的引导体验。
|
上个月底(2018 年 9 月 24 日),[Equus 计算解决方案][37] [宣布][38] 发行它的 [白盒开放式™][39] M2660 和 M2760 服务器,作为它们的定制的、成本优化的、开放硬件服务器和存储平台的一部分。它们都支持 LinuxBoot 灵活定制服务器的 BIOS,以提升安全性和设计一个非常快的纯净的引导体验。
|
||||||
@ -73,10 +67,10 @@ LinuxBoot 在 [GitHub][40] 上有很丰富的文档。你喜欢它与 UEFI 不
|
|||||||
|
|
||||||
via: https://itsfoss.com/linuxboot-uefi/
|
via: https://itsfoss.com/linuxboot-uefi/
|
||||||
|
|
||||||
作者:[ Avimanyu Bandyopadhyay][a]
|
作者:[Avimanyu Bandyopadhyay][a]
|
||||||
选题:[oska874][b]
|
选题:[oska874][b]
|
||||||
译者:[qhwdw](https://github.com/qhwdw)
|
译者:[qhwdw](https://github.com/qhwdw)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
![](https://fedoramagazine.org/wp-content/uploads/2018/09/steam-proton-816x345.jpg)
|
![](https://fedoramagazine.org/wp-content/uploads/2018/09/steam-proton-816x345.jpg)
|
||||||
|
|
||||||
几周前,Steam 宣布要给 Steam Play 增加一个新组件,用于支持在 Linux 平台上使用 Proton 来玩 Windows 的游戏,这个组件是 WINE 的一个分支。这个功能仍然处于测试阶段,且并非对所有游戏都有效。这里有一些关于 Steam 和 Proton 的细节。
|
之前,Steam [宣布][1]要给 Steam Play 增加一个新组件,用于支持在 Linux 平台上使用 Proton 来玩 Windows 的游戏,这个组件是 WINE 的一个分支。这个功能仍然处于测试阶段,且并非对所有游戏都有效。这里有一些关于 Steam 和 Proton 的细节。
|
||||||
|
|
||||||
据 Steam 网站称,测试版本中有以下这些新功能:
|
据 Steam 网站称,测试版本中有以下这些新功能:
|
||||||
|
|
||||||
@ -13,29 +13,27 @@
|
|||||||
* 改进了对游戏控制器的支持,游戏自动识别所有 Steam 支持的控制器,比起游戏的原始版本,能够获得更多开箱即用的控制器兼容性。
|
* 改进了对游戏控制器的支持,游戏自动识别所有 Steam 支持的控制器,比起游戏的原始版本,能够获得更多开箱即用的控制器兼容性。
|
||||||
* 和 vanilla WINE 比起来,游戏的多线程性能得到了极大的提高。
|
* 和 vanilla WINE 比起来,游戏的多线程性能得到了极大的提高。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 安装
|
### 安装
|
||||||
|
|
||||||
如果你有兴趣,想尝试一下 Steam 和 Proton。请按照下面这些简单的步骤进行操作。(请注意,如果你已经安装了最新版本的 Steam,可以忽略启用 Steam 测试版这个第一步。在这种情况下,你不再需要通过 Steam 测试版来使用 Proton。)
|
如果你有兴趣,想尝试一下 Steam 和 Proton。请按照下面这些简单的步骤进行操作。(请注意,如果你已经安装了最新版本的 Steam,可以忽略启用 Steam 测试版这个第一步。在这种情况下,你不再需要通过 Steam 测试版来使用 Proton。)
|
||||||
|
|
||||||
打开 Steam 并登陆到你的帐户,这个截屏示例显示的是在使用 Proton 之前仅支持22个游戏。
|
打开 Steam 并登陆到你的帐户,这个截屏示例显示的是在使用 Proton 之前仅支持 22 个游戏。
|
||||||
|
|
||||||
![][3]
|
![][3]
|
||||||
|
|
||||||
现在点击客户端顶部的 Steam 选项,这会显示一个下拉菜单。然后选择设置。
|
现在点击客户端顶部的 “Steam” 选项,这会显示一个下拉菜单。然后选择“设置”。
|
||||||
|
|
||||||
![][4]
|
![][4]
|
||||||
|
|
||||||
现在弹出了设置窗口,选择账户选项,并在 Beta participation 旁边,点击更改。
|
现在弹出了设置窗口,选择“账户”选项,并在 “参与 Beta 测试” 旁边,点击“更改”。
|
||||||
|
|
||||||
![][5]
|
![][5]
|
||||||
|
|
||||||
现在将 None 更改为 Steam Beta Update。
|
现在将 “None” 更改为 “Steam Beta Update”。
|
||||||
|
|
||||||
![][6]
|
![][6]
|
||||||
|
|
||||||
点击确定,然后系统会提示你重新启动。
|
点击“确定”,然后系统会提示你重新启动。
|
||||||
|
|
||||||
![][7]
|
![][7]
|
||||||
|
|
||||||
@ -43,11 +41,11 @@
|
|||||||
|
|
||||||
![][8]
|
![][8]
|
||||||
|
|
||||||
在重新启动之后,返回到上面的设置窗口。这次你会看到一个新选项。确定有为提供支持的游戏使用 Stream Play 这个复选框,让所有的游戏都使用 Steam Play 进行运行,而不是 steam 中游戏特定的选项。兼容性工具应该是 Proton。
|
在重新启动之后,返回到上面的设置窗口。这次你会看到一个新选项。确定勾选了“为提供支持的游戏使用 Stream Play” 、“让所有的游戏都使用 Steam Play 运行”,“使用这个工具替代 Steam 中游戏特定的选项”。这个兼容性工具应该就是 Proton。
|
||||||
|
|
||||||
![][9]
|
![][9]
|
||||||
|
|
||||||
Steam 客户端会要求你重新启动,照做,然后重新登陆你的 Steam 账户,你的 Linux 的游戏库就能得到扩展了。
|
Steam 客户端会要求你重新启动,照做,然后重新登录你的 Steam 账户,你的 Linux 的游戏库就能得到扩展了。
|
||||||
|
|
||||||
![][10]
|
![][10]
|
||||||
|
|
||||||
@ -69,7 +67,7 @@ Steam 客户端会要求你重新启动,照做,然后重新登陆你的 Stea
|
|||||||
|
|
||||||
![][16]
|
![][16]
|
||||||
|
|
||||||
一些游戏可能会受到 Proton 测试性质的影响,在下面这个叫 Chantelise 游戏中,没有了声音并且帧率很低。请记住这个功能仍然在测试阶段,Fedora 不会对结果负责。如果你想要了解更多,社区已经创建了一个 Google 文档,这个文档里有已经测试过的游戏的列表。
|
一些游戏可能会受到 Proton 测试性质的影响,在这个叫 Chantelise 游戏中,没有了声音并且帧率很低。请记住这个功能仍然在测试阶段,Fedora 不会对结果负责。如果你想要了解更多,社区已经创建了一个 Google 文档,这个文档里有已经测试过的游戏的列表。
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -79,25 +77,25 @@ via: https://fedoramagazine.org/play-windows-games-steam-play-proton/
|
|||||||
作者:[Francisco J. Vergara Torres][a]
|
作者:[Francisco J. Vergara Torres][a]
|
||||||
选题:[lujun9972](https://github.com/lujun9972)
|
选题:[lujun9972](https://github.com/lujun9972)
|
||||||
译者:[hopefully2333](https://github.com/hopefully2333)
|
译者:[hopefully2333](https://github.com/hopefully2333)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
[a]: https://fedoramagazine.org/author/patxi/
|
[a]: https://fedoramagazine.org/author/patxi/
|
||||||
[1]: https://steamcommunity.com/games/221410/announcements/detail/1696055855739350561
|
[1]: https://steamcommunity.com/games/221410/announcements/detail/1696055855739350561
|
||||||
[2]: https://fedoramagazine.org/third-party-repositories-fedora/
|
[2]: https://fedoramagazine.org/third-party-repositories-fedora/
|
||||||
[3]: https://fedoramagazine.org/wp-content/uploads/2018/09/listOfGamesLinux-300x197.png
|
[3]: https://fedoramagazine.org/wp-content/uploads/2018/09/listOfGamesLinux-768x505.png
|
||||||
[4]: https://fedoramagazine.org/wp-content/uploads/2018/09/1-300x169.png
|
[4]: https://fedoramagazine.org/wp-content/uploads/2018/09/1-768x432.png
|
||||||
[5]: https://fedoramagazine.org/wp-content/uploads/2018/09/2-300x196.png
|
[5]: https://fedoramagazine.org/wp-content/uploads/2018/09/2-768x503.png
|
||||||
[6]: https://fedoramagazine.org/wp-content/uploads/2018/09/4-300x272.png
|
[6]: https://fedoramagazine.org/wp-content/uploads/2018/09/4.png
|
||||||
[7]: https://fedoramagazine.org/wp-content/uploads/2018/09/6-300x237.png
|
[7]: https://fedoramagazine.org/wp-content/uploads/2018/09/6.png
|
||||||
[8]: https://fedoramagazine.org/wp-content/uploads/2018/09/7-300x126.png
|
[8]: https://fedoramagazine.org/wp-content/uploads/2018/09/7.png
|
||||||
[9]: https://fedoramagazine.org/wp-content/uploads/2018/09/10-300x237.png
|
[9]: https://fedoramagazine.org/wp-content/uploads/2018/09/10.png
|
||||||
[10]: https://fedoramagazine.org/wp-content/uploads/2018/09/12-300x196.png
|
[10]: https://fedoramagazine.org/wp-content/uploads/2018/09/12-768x503.png
|
||||||
[11]: https://fedoramagazine.org/wp-content/uploads/2018/09/13-300x196.png
|
[11]: https://fedoramagazine.org/wp-content/uploads/2018/09/13-768x501.png
|
||||||
[12]: https://fedoramagazine.org/wp-content/uploads/2018/09/14-300x195.png
|
[12]: https://fedoramagazine.org/wp-content/uploads/2018/09/14-768x498.png
|
||||||
[13]: https://fedoramagazine.org/wp-content/uploads/2018/09/15-300x196.png
|
[13]: https://fedoramagazine.org/wp-content/uploads/2018/09/15-768x501.png
|
||||||
[14]: https://fedoramagazine.org/wp-content/uploads/2018/09/16-300x195.png
|
[14]: https://fedoramagazine.org/wp-content/uploads/2018/09/16-768x500.png
|
||||||
[15]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-14-59-300x169.png
|
[15]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-14-59-768x432.png
|
||||||
[16]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-19-34-300x169.png
|
[16]: https://fedoramagazine.org/wp-content/uploads/2018/09/Screenshot-from-2018-08-30-15-19-34-768x432.png
|
||||||
[17]: https://docs.google.com/spreadsheets/d/1DcZZQ4HL_Ol969UbXJmFG8TzOHNnHoj8Q1f8DIFe8-8/edit#gid=1003113831
|
[17]: https://docs.google.com/spreadsheets/d/1DcZZQ4HL_Ol969UbXJmFG8TzOHNnHoj8Q1f8DIFe8-8/edit#gid=1003113831
|
@ -31,6 +31,8 @@ Lisp 是怎么成为上帝的编程语言的
|
|||||||
|
|
||||||
> 名字是四个字母的语言。
|
> 名字是四个字母的语言。
|
||||||
|
|
||||||
|
(LCTT 译注:参见 “四个字母”,参见:[四字神名](https://zh.wikipedia.org/wiki/%E5%9B%9B%E5%AD%97%E7%A5%9E%E5%90%8D),致谢 [no1xsyzy](https://github.com/LCTT/TranslateProject/issues/11320))
|
||||||
|
|
||||||
以下这句话我实在不好在人前说;不过,我还是觉得,这样一种 “Lisp 是奥术魔法”的文化模因实在是有史以来最奇异、最迷人的东西。Lisp 是象牙塔的产物,是人工智能研究的工具;因此,它对于编程界的俗人而言总是陌生的,甚至是带有神秘色彩的。然而,当今的程序员们[开始怂恿彼此,“在你死掉之前至少试一试 Lisp”][4],就像这是一种令人恍惚入迷的致幻剂似的。尽管 Lisp 是广泛使用的编程语言中第二古老的(只比 Fortran 年轻一岁)[^1] ,程序员们也仍旧在互相怂恿。想象一下,如果你的工作是为某种组织或者团队推广一门新的编程语言的话,忽悠大家让他们相信你的新语言拥有神力难道不是绝佳的策略吗?—— 但你如何能够做到这一点呢?或者,换句话说,一门编程语言究竟是如何变成人们口中“隐晦知识的载体”的呢?
|
以下这句话我实在不好在人前说;不过,我还是觉得,这样一种 “Lisp 是奥术魔法”的文化模因实在是有史以来最奇异、最迷人的东西。Lisp 是象牙塔的产物,是人工智能研究的工具;因此,它对于编程界的俗人而言总是陌生的,甚至是带有神秘色彩的。然而,当今的程序员们[开始怂恿彼此,“在你死掉之前至少试一试 Lisp”][4],就像这是一种令人恍惚入迷的致幻剂似的。尽管 Lisp 是广泛使用的编程语言中第二古老的(只比 Fortran 年轻一岁)[^1] ,程序员们也仍旧在互相怂恿。想象一下,如果你的工作是为某种组织或者团队推广一门新的编程语言的话,忽悠大家让他们相信你的新语言拥有神力难道不是绝佳的策略吗?—— 但你如何能够做到这一点呢?或者,换句话说,一门编程语言究竟是如何变成人们口中“隐晦知识的载体”的呢?
|
||||||
|
|
||||||
Lisp 究竟是怎么成为这样的?
|
Lisp 究竟是怎么成为这样的?
|
||||||
@ -83,7 +85,7 @@ SICP 究竟有多奇怪这一点值得好好说;因为我认为,时至今日
|
|||||||
|
|
||||||
*SICP 封面上的画作。*
|
*SICP 封面上的画作。*
|
||||||
|
|
||||||
说真的,这上面画的究竟是怎么一回事?为什么桌子会长着动物的腿?为什么这个女人指着桌子?墨水瓶又是干什么用的?我们是不是该说,这位巫师已经破译了宇宙的隐藏奥秘,而所有这些奥秘就蕴含在 eval/apply 循环和 Lambda 微积分之中?看似就是如此。单单是这张图片,就一定对人们如今谈论 Lisp 的方式产生了难以计量的影响。
|
说真的,这上面画的究竟是怎么一回事?为什么桌子会长着动物的腿?为什么这个女人指着桌子?墨水瓶又是干什么用的?我们是不是该说,这位巫师已经破译了宇宙的隐藏奥秘,而所有这些奥秘就蕴含在 eval/apply 循环和 Lambda 演算之中?看似就是如此。单单是这张图片,就一定对人们如今谈论 Lisp 的方式产生了难以计量的影响。
|
||||||
|
|
||||||
然而,这本书的内容通常并不比封面正常多少。SICP 跟你读过的所有计算机科学教科书都不同。在引言中,作者们表示,这本书不只教你怎么用 Lisp 编程 —— 它是关于“现象的三个焦点:人的心智、复数的计算机程序,和计算机”的作品 [^19]。在之后,他们对此进行了解释,描述了他们对如下观点的坚信:编程不该被当作是一种计算机科学的训练,而应该是“<ruby>程序性认识论<rt>procedural epistemology</rt></ruby>”的一种新表达方式 [^20]。程序是将那些偶然被送入计算机的思想组织起来的全新方法。这本书的第一章简明地介绍了 Lisp,但是之后的绝大部分都在讲述更加抽象的概念。其中包括了对不同编程范式的讨论,对于面向对象系统中“时间”和“一致性”的讨论;在书中的某一处,还有关于通信的基本限制可能会如何带来同步问题的讨论 —— 而这些基本限制在通信中就像是光速不变在相对论中一样关键 [^21]。都是些高深难懂的东西。
|
然而,这本书的内容通常并不比封面正常多少。SICP 跟你读过的所有计算机科学教科书都不同。在引言中,作者们表示,这本书不只教你怎么用 Lisp 编程 —— 它是关于“现象的三个焦点:人的心智、复数的计算机程序,和计算机”的作品 [^19]。在之后,他们对此进行了解释,描述了他们对如下观点的坚信:编程不该被当作是一种计算机科学的训练,而应该是“<ruby>程序性认识论<rt>procedural epistemology</rt></ruby>”的一种新表达方式 [^20]。程序是将那些偶然被送入计算机的思想组织起来的全新方法。这本书的第一章简明地介绍了 Lisp,但是之后的绝大部分都在讲述更加抽象的概念。其中包括了对不同编程范式的讨论,对于面向对象系统中“时间”和“一致性”的讨论;在书中的某一处,还有关于通信的基本限制可能会如何带来同步问题的讨论 —— 而这些基本限制在通信中就像是光速不变在相对论中一样关键 [^21]。都是些高深难懂的东西。
|
||||||
|
|
||||||
@ -97,7 +99,7 @@ SICP 究竟有多奇怪这一点值得好好说;因为我认为,时至今日
|
|||||||
|
|
||||||
理所当然地,确定人们对 Lisp 重新燃起热情的具体时间并不可能;但这多半是保罗·格雷厄姆发表他那几篇声称 Lisp 是首选入门语言的短文之后的事了。保罗·格雷厄姆是 Y-Combinator 的联合创始人和《Hacker News》的创始者,他这几篇短文有很大的影响力。例如,在短文《<ruby>[胜于平庸][20]<rt>Beating the Averages</rt></ruby>》中,他声称 Lisp 宏使 Lisp 比其它语言更强。他说,因为他在自己创办的公司 Viaweb 中使用 Lisp,他得以比竞争对手更快地推出新功能。至少,[一部分程序员][21]被说服了。然而,庞大的主流程序员群体并未换用 Lisp。
|
理所当然地,确定人们对 Lisp 重新燃起热情的具体时间并不可能;但这多半是保罗·格雷厄姆发表他那几篇声称 Lisp 是首选入门语言的短文之后的事了。保罗·格雷厄姆是 Y-Combinator 的联合创始人和《Hacker News》的创始者,他这几篇短文有很大的影响力。例如,在短文《<ruby>[胜于平庸][20]<rt>Beating the Averages</rt></ruby>》中,他声称 Lisp 宏使 Lisp 比其它语言更强。他说,因为他在自己创办的公司 Viaweb 中使用 Lisp,他得以比竞争对手更快地推出新功能。至少,[一部分程序员][21]被说服了。然而,庞大的主流程序员群体并未换用 Lisp。
|
||||||
|
|
||||||
实际上出现的情况是,Lisp 并未流行,但越来越多 Lisp 式的特性被加入到广受欢迎的语言中。Python 有了列表理解。C# 有了 Linq。Ruby……嗯,[Ruby 是 Lisp 的一种][22]。就如格雷厄姆之前在 2001 年提到的那样,“在一系列常用语言中所体现出的‘默认语言’正越发朝着 Lisp 的方向演化” [^23]。尽管其它语言变得越来越像 Lisp,Lisp 本身仍然保留了其作为“很少人了解但是大家都该学的神秘语言”的特殊声望。在 1980 年,Lisp 的诞生二十周年纪念日上,麦卡锡写道,Lisp 之所以能够存活这么久,是因为它具备“编程语言领域中的某种近似局部最优” [^24]。这句话并未充分地表明 Lisp 的真正影响力。Lisp 能够存活超过半个世纪之久,并非因为程序员们一年年地勉强承认它就是最好的编程工具;事实上,即使绝大多数程序员根本不用它,它还是存活了下来。多亏了它的起源和它的人工智能研究用途,说不定还要多亏 SICP 的遗产,Lisp 一直都那么让人着迷。在我们能够想象上帝用其它新的编程语言创造世界之前,Lisp 都不会走下神坛。
|
实际上出现的情况是,Lisp 并未流行,但越来越多 Lisp 式的特性被加入到广受欢迎的语言中。Python 有了列表推导式。C# 有了 Linq。Ruby……嗯,[Ruby 是 Lisp 的一种][22]。就如格雷厄姆之前在 2001 年提到的那样,“在一系列常用语言中所体现出的‘默认语言’正越发朝着 Lisp 的方向演化” [^23]。尽管其它语言变得越来越像 Lisp,Lisp 本身仍然保留了其作为“很少人了解但是大家都该学的神秘语言”的特殊声望。在 1980 年,Lisp 的诞生二十周年纪念日上,麦卡锡写道,Lisp 之所以能够存活这么久,是因为它具备“编程语言领域中的某种近似局部最优” [^24]。这句话并未充分地表明 Lisp 的真正影响力。Lisp 能够存活超过半个世纪之久,并非因为程序员们一年年地勉强承认它就是最好的编程工具;事实上,即使绝大多数程序员根本不用它,它还是存活了下来。多亏了它的起源和它的人工智能研究用途,说不定还要多亏 SICP 的遗产,Lisp 一直都那么让人着迷。在我们能够想象上帝用其它新的编程语言创造世界之前,Lisp 都不会走下神坛。
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
@ -1,15 +1,15 @@
|
|||||||
什么是 SRE?它和 DevOps 是怎么关联的?
|
什么是 SRE?它和 DevOps 是怎么关联的?
|
||||||
=====
|
=====
|
||||||
|
|
||||||
大型企业里 SRE 角色比较常见,不过小公司也需要 SRE。
|
> 大型企业里 SRE 角色比较常见,不过小公司也需要 SRE。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/toolbox-learn-draw-container-yearbook.png?itok=xDbwz1pP)
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/toolbox-learn-draw-container-yearbook.png?itok=xDbwz1pP)
|
||||||
|
|
||||||
虽然站点可靠性工程师(SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题,这篇文章解释了 SRE 的含义,还有 SRE 怎样关联 DevOps,以及在工程师团队规模不大的组织里 SRE 该如何工作。
|
虽然<ruby>站点可靠性工程师<rt>site reliability engineer</rt></ruby>(SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题,这篇文章解释了 SRE 的含义,还有 SRE 怎样关联 DevOps,以及在工程师团队规模不大的组织里 SRE 该如何工作。
|
||||||
|
|
||||||
### 什么是站点可靠性工程?
|
### 什么是站点可靠性工程?
|
||||||
|
|
||||||
谷歌的几个工程师写的《 [SRE:谷歌运维解密][1]》被认为是站点可靠性工程的权威书籍。谷歌的工程副总裁 Ben Treynor Sloss 在二十一世纪初[创造了这个术语][2]。他是这样定义的:“当你让软件工程师设计运维功能时,SRE 就产生了。”
|
谷歌的几个工程师写的《[SRE:谷歌运维解密][1]》被认为是站点可靠性工程的权威书籍。谷歌的工程副总裁 Ben Treynor Sloss 在二十一世纪初[创造了这个术语][2]。他是这样定义的:“当你让软件工程师设计运维功能时,SRE 就产生了。”
|
||||||
|
|
||||||
虽然系统管理员从很久之前就在写代码,但是过去的很多时候系统管理团队是手动管理机器的。当时他们管理的机器可能有几十台或者上百台,不过当这个数字涨到了几千甚至几十万的时候,就不能简单的靠人去解决问题了。规模如此大的情况下,很明显应该用代码去管理机器(以及机器上运行的软件)。
|
虽然系统管理员从很久之前就在写代码,但是过去的很多时候系统管理团队是手动管理机器的。当时他们管理的机器可能有几十台或者上百台,不过当这个数字涨到了几千甚至几十万的时候,就不能简单的靠人去解决问题了。规模如此大的情况下,很明显应该用代码去管理机器(以及机器上运行的软件)。
|
||||||
|
|
||||||
@ -19,13 +19,13 @@
|
|||||||
|
|
||||||
### SRE 和 DevOps
|
### SRE 和 DevOps
|
||||||
|
|
||||||
站点可靠性工程的核心,就是对 DevOps 范例的实践。[DevOps 的定义][3]有很多种方式。开发团队(“devs”)和运维(“ops”)团队相互分离的传统模式下,写代码的团队在服务交付给用户使用之后就不再对服务状态负责了。开发团队“把代码扔到墙那边”让运维团队去部署和支持。
|
站点可靠性工程的核心,就是对 DevOps 范例的实践。[DevOps 的定义][3]有很多种方式。开发团队(“dev”)和运维(“ops”)团队相互分离的传统模式下,写代码的团队在将服务交付给用户使用之后就不再对服务状态负责了。开发团队“把代码扔到墙那边”让运维团队去部署和支持。
|
||||||
|
|
||||||
这种情况会导致大量失衡。开发和运维的目标总是不一致 —— 开发希望用户体验到“最新最棒”的代码,但是运维想要的是变更尽量少的稳定系统。运维是这样假定的,任何变更都可能引发不稳定,而不做任何变更的系统可以一直保持稳定。(减少软件的变更次数并不是避免故障的唯一因素,认识到这一点很重要。例如,虽然你的 web 应用保持不变,但是当用户数量涨到十倍时,服务可能就会以各种方式出问题。)
|
这种情况会导致大量失衡。开发和运维的目标总是不一致 —— 开发希望用户体验到“最新最棒”的代码,但是运维想要的是变更尽量少的稳定系统。运维是这样假定的,任何变更都可能引发不稳定,而不做任何变更的系统可以一直保持稳定。(减少软件的变更次数并不是避免故障的唯一因素,认识到这一点很重要。例如,虽然你的 web 应用保持不变,但是当用户数量涨到十倍时,服务可能就会以各种方式出问题。)
|
||||||
|
|
||||||
DevOps 理念认为通过合并这两个岗位就能够消灭争论。如果开发团队时刻都想把新代码部署上线,那么他们也必须对新代码引起的故障负责。就像亚马逊的 [Werner Vogels 说的][4]那样,“谁开发,谁运维”(生产环境)。但是开发人员已经有一大堆问题了。他们不断的被推动着去开发老板要的产品功能。再让他们去了解基础设施,包括如何部署、配置还有监控服务,这对他们的要求有点太多了。所以就需要 SRE 了。
|
DevOps 理念认为通过合并这两个岗位就能够消灭争论。如果开发团队时刻都想把新代码部署上线,那么他们也必须对新代码引起的故障负责。就像亚马逊的 [Werner Vogels 说的][4]那样,“谁开发,谁运维”(生产环境)。但是开发人员已经有一大堆问题了。他们不断的被推动着去开发老板要的产品功能。再让他们去了解基础设施,包括如何部署、配置还有监控服务,这对他们的要求有点太多了。所以就需要 SRE 了。
|
||||||
|
|
||||||
开发一个 web 应用的时候经常是很多人一起参与。有用户界面设计师,图形设计师,前端工程师,后端工程师,还有许多其他工种(视技术选型的具体情况而定)。如何管理写好的代码也是需求之一(例如部署,配置,监控)—— 这是 SRE 的专业领域。但是,就像前端工程师受益于后端领域的知识一样(例如从数据库获取数据的方法),SRE 理解部署系统的工作原理,知道如何满足特定的代码或者项目的具体需求。
|
开发一个 web 应用的时候经常是很多人一起参与。有用户界面设计师、图形设计师、前端工程师、后端工程师,还有许多其他工种(视技术选型的具体情况而定)。如何管理写好的代码也是需求之一(例如部署、配置、监控)—— 这是 SRE 的专业领域。但是,就像前端工程师受益于后端领域的知识一样(例如从数据库获取数据的方法),SRE 理解部署系统的工作原理,知道如何满足特定的代码或者项目的具体需求。
|
||||||
|
|
||||||
所以 SRE 不仅仅是“写代码的运维工程师”。相反,SRE 是开发团队的成员,他们有着不同的技能,特别是在发布部署、配置管理、监控、指标等方面。但是,就像前端工程师必须知道如何从数据库中获取数据一样,SRE 也不是只负责这些领域。为了提供更容易升级、管理和监控的产品,整个团队共同努力。
|
所以 SRE 不仅仅是“写代码的运维工程师”。相反,SRE 是开发团队的成员,他们有着不同的技能,特别是在发布部署、配置管理、监控、指标等方面。但是,就像前端工程师必须知道如何从数据库中获取数据一样,SRE 也不是只负责这些领域。为了提供更容易升级、管理和监控的产品,整个团队共同努力。
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ DevOps 理念认为通过合并这两个岗位就能够消灭争论。如果开
|
|||||||
|
|
||||||
让开发人员做 SRE 最显著的优点是,团队规模变大的时候也能很好的扩展。而且,开发人员将会全面地了解应用的特性。但是,许多初创公司的基础设施包含了各种各样的 SaaS 产品,这种多样性在基础设施上体现的最明显,因为连基础设施本身也是多种多样。然后你们在某个基础设施上引入指标系统、站点监控、日志分析、容器等等。这些技术解决了一部分问题,也增加了复杂度。开发人员除了要了解应用程序的核心技术(比如开发语言),还要了解上述所有技术和服务。最终,掌握所有的这些技术让人无法承受。
|
让开发人员做 SRE 最显著的优点是,团队规模变大的时候也能很好的扩展。而且,开发人员将会全面地了解应用的特性。但是,许多初创公司的基础设施包含了各种各样的 SaaS 产品,这种多样性在基础设施上体现的最明显,因为连基础设施本身也是多种多样。然后你们在某个基础设施上引入指标系统、站点监控、日志分析、容器等等。这些技术解决了一部分问题,也增加了复杂度。开发人员除了要了解应用程序的核心技术(比如开发语言),还要了解上述所有技术和服务。最终,掌握所有的这些技术让人无法承受。
|
||||||
|
|
||||||
另一种方案是聘请专家专职做 SRE。他们专注于发布部署、配置管理、监控和指标,可以节省开发人员的时间。这种方案的缺点是,SRE 的时间必须分配给多个不同的应用(就是说 SRE 需要贯穿整个工程部门)。 这可能意味着 SRE 没时间对任何应用深入学习,然而他们可以站在一个能看到服务全貌的高度,知道各个部分是怎么组合在一起的。 这个“ 三万英尺高的视角”可以帮助 SRE 从系统整体上考虑,哪些薄弱环节需要优先修复。
|
另一种方案是聘请专家专职做 SRE。他们专注于发布部署、配置管理、监控和指标,可以节省开发人员的时间。这种方案的缺点是,SRE 的时间必须分配给多个不同的应用(就是说 SRE 需要贯穿整个工程部门)。 这可能意味着 SRE 没时间对任何应用深入学习,然而他们可以站在一个能看到服务全貌的高度,知道各个部分是怎么组合在一起的。 这个“三万英尺高的视角”可以帮助 SRE 从系统整体上考虑,哪些薄弱环节需要优先修复。
|
||||||
|
|
||||||
有一个关键信息我还没提到:其他的工程师。他们可能很渴望了解发布部署的原理,也很想尽全力学会使用指标系统。而且,雇一个 SRE 可不是一件简单的事儿。因为你要找的是一个既懂系统管理又懂软件工程的人。(我之所以明确地说软件工程而不是说“能写代码”,是因为除了写代码之外软件工程还包括很多东西,比如编写良好的测试或文档。)
|
有一个关键信息我还没提到:其他的工程师。他们可能很渴望了解发布部署的原理,也很想尽全力学会使用指标系统。而且,雇一个 SRE 可不是一件简单的事儿。因为你要找的是一个既懂系统管理又懂软件工程的人。(我之所以明确地说软件工程而不是说“能写代码”,是因为除了写代码之外软件工程还包括很多东西,比如编写良好的测试或文档。)
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ via: https://opensource.com/article/18/10/sre-startup
|
|||||||
作者:[Craig Sebenik][a]
|
作者:[Craig Sebenik][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[BeliteX](https://github.com/belitex)
|
译者:[BeliteX](https://github.com/belitex)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -1,9 +1,11 @@
|
|||||||
监测数据库的健康和行为: 有哪些重要指标?
|
监测数据库的健康和行为:有哪些重要指标?
|
||||||
======
|
======
|
||||||
对数据库的监测可能过于困难或者没有监测到关键点。本文将讲述如何正确的监测数据库。
|
|
||||||
|
> 对数据库的监测可能过于困难或者没有找到关键点。本文将讲述如何正确的监测数据库。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_graph_stats_blue.png?itok=OKCc_60D)
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_graph_stats_blue.png?itok=OKCc_60D)
|
||||||
|
|
||||||
我们没有足够的讨论数据库。在这个充满监测仪器的时代,我们监测我们的应用程序、基础设施、甚至我们的用户,但有时忘记我们的数据库也值得被监测。这很大程度是因为数据库表现的很好,以至于我们单纯地信任它能把任务完成的很好。信任固然重要,但能够证明它的表现确实如我们所期待的那样就更好了。
|
我们没有对数据库讨论过多少。在这个充满监测仪器的时代,我们监测我们的应用程序、基础设施、甚至我们的用户,但有时忘记我们的数据库也值得被监测。这很大程度是因为数据库表现的很好,以至于我们单纯地信任它能把任务完成的很好。信任固然重要,但能够证明它的表现确实如我们所期待的那样就更好了。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image1_-_bffs.png?itok=BZQM_Fos)
|
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image1_-_bffs.png?itok=BZQM_Fos)
|
||||||
|
|
||||||
@ -13,11 +15,11 @@
|
|||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image5_fire.png?itok=wsip2Fa4)
|
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image5_fire.png?itok=wsip2Fa4)
|
||||||
|
|
||||||
更具体地说,数据库是系统健康和行为的重要标志。数据库中的异常行为能够指出应用程序中出现问题的区域。另外,当应用程序中有异常行为时,你可以利用数据库的指标来迅速完成排除故障的过程。
|
更具体地说,数据库是系统健康和行为的重要标志。数据库中的异常行为能够指出应用程序中出现问题的区域。另外,当应用程序中有异常行为时,你可以利用数据库的指标来迅速完成排除故障的过程。
|
||||||
|
|
||||||
### 问题
|
### 问题
|
||||||
|
|
||||||
最轻微的调查揭示了监测数据库的一个问题:数据库有很多指标。说“很多”只是轻描淡写,如果你是Scrooge McDuck,你可以浏览所有可用的指标。如果这是Wrestlemania,那么指标就是折叠椅。监测所有指标似乎并不实用,那么你如何决定要监测哪些指标?
|
最轻微的调查揭示了监测数据库的一个问题:数据库有很多指标。说“很多”只是轻描淡写,如果你是<ruby>史高治<rt>Scrooge McDuck</rt></ruby>(LCTT 译注:史高治,唐老鸭的舅舅,以一毛不拔著称),你不会放过任何一个可用的指标。如果这是<ruby>摔角狂热<rt>Wrestlemania</rt></ruby> 比赛,那么指标就是折叠椅。监测所有指标似乎并不实用,那么你如何决定要监测哪些指标?
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image2_db_metrics.png?itok=Jd9NY1bt)
|
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image2_db_metrics.png?itok=Jd9NY1bt)
|
||||||
|
|
||||||
@ -29,11 +31,11 @@
|
|||||||
|
|
||||||
开始检测数据库的最好方法是跟踪它所接到请求的数量。我们对数据库有较高期望;期望它能稳定的存储数据,并处理我们抛给它的所有查询,这些查询可能是一天一次大规模查询,或者是来自用户一天到晚的数百万次查询。吞吐量可以告诉我们数据库是否如我们期望的那样工作。
|
开始检测数据库的最好方法是跟踪它所接到请求的数量。我们对数据库有较高期望;期望它能稳定的存储数据,并处理我们抛给它的所有查询,这些查询可能是一天一次大规模查询,或者是来自用户一天到晚的数百万次查询。吞吐量可以告诉我们数据库是否如我们期望的那样工作。
|
||||||
|
|
||||||
你也可以将请求安照类型(读,写,服务器端,客户端等)分组,以开始分析流量。
|
你也可以将请求按照类型(读、写、服务器端、客户端等)分组,以开始分析流量。
|
||||||
|
|
||||||
### 执行时间:数据库完成工作需要多长时间?
|
### 执行时间:数据库完成工作需要多长时间?
|
||||||
|
|
||||||
这个指标看起来很明显,但往往被忽视了。 你不仅想知道数据库收到了多少请求,还想知道数据库在每个请求上花费了多长时间。 然而,参考上下文来讨论执行时间非常重要:像InfluxDB这样的时间序列数据库中的慢与像MySQL这样的关系型数据库中的慢不一样。InfluxDB中的慢可能意味着毫秒,而MySQL的“SLOW_QUERY”变量的默认值是10秒。
|
这个指标看起来很明显,但往往被忽视了。你不仅想知道数据库收到了多少请求,还想知道数据库在每个请求上花费了多长时间。 然而,参考上下文来讨论执行时间非常重要:像 InfluxDB 这样的时间序列数据库中的慢与像 MySQL 这样的关系型数据库中的慢不一样。InfluxDB 中的慢可能意味着毫秒,而 MySQL 的 `SLOW_QUERY` 变量的默认值是 10 秒。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image4_slow_is_relative.png?itok=9RkuzUi8)
|
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image4_slow_is_relative.png?itok=9RkuzUi8)
|
||||||
|
|
||||||
@ -43,7 +45,7 @@
|
|||||||
|
|
||||||
一旦你知道数据库正在处理多少请求以及每个请求需要多长时间,你就需要添加一层复杂性以开始从这些指标中获得实际值。
|
一旦你知道数据库正在处理多少请求以及每个请求需要多长时间,你就需要添加一层复杂性以开始从这些指标中获得实际值。
|
||||||
|
|
||||||
如果数据库接收到十个请求,并且每个请求需要十秒钟来完成,那么数据库是否忙碌了100秒、10秒,或者介于两者之间?并发任务的数量改变了数据库资源的使用方式。当你考虑连接和线程的数量等问题时,你将开始对数据库指标有更全面的了解。
|
如果数据库接收到十个请求,并且每个请求需要十秒钟来完成,那么数据库是忙碌了 100 秒、10 秒,还是介于两者之间?并发任务的数量改变了数据库资源的使用方式。当你考虑连接和线程的数量等问题时,你将开始对数据库指标有更全面的了解。
|
||||||
|
|
||||||
并发性还能影响延迟,这不仅包括任务完成所需的时间(执行时间),还包括任务在处理之前需要等待的时间。
|
并发性还能影响延迟,这不仅包括任务完成所需的时间(执行时间),还包括任务在处理之前需要等待的时间。
|
||||||
|
|
||||||
@ -53,15 +55,15 @@
|
|||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image6_telephone.png?itok=YzdpwUQP)
|
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image6_telephone.png?itok=YzdpwUQP)
|
||||||
|
|
||||||
该指标对于确定数据库的整体健康和性能特别有用。如果只能在80%的时间内响应请求,则可以重新分配资源、进行优化工作,或者进行更改以更接近高可用性。
|
该指标对于确定数据库的整体健康和性能特别有用。如果只能在 80% 的时间内响应请求,则可以重新分配资源、进行优化工作,或者进行更改以更接近高可用性。
|
||||||
|
|
||||||
### 好消息
|
### 好消息
|
||||||
|
|
||||||
监测和分析似乎非常困难,特别是因为我们大多数人不是数据库专家,我们可能没有时间去理解这些指标。但好消息是,大部分的工作已经为我们做好了。许多数据库都有一个内部性能数据库(Postgres:pg_stats、CouchDB:Runtime_.、InfluxDB:_internal等),数据库工程师设计该数据库来监测与该特定数据库有关的指标。你可以看到像慢速查询的数量一样广泛的内容,或者像数据库中每个事件的平均微秒一样详细的内容。
|
监测和分析似乎非常困难,特别是因为我们大多数人不是数据库专家,我们可能没有时间去理解这些指标。但好消息是,大部分的工作已经为我们做好了。许多数据库都有一个内部性能数据库(Postgres:`pg_stats`、CouchDB:`Runtime_Statistics`、InfluxDB:`_internal` 等),数据库工程师设计该数据库来监测与该特定数据库有关的指标。你可以看到像慢速查询的数量一样广泛的内容,或者像数据库中每个事件的平均微秒一样详细的内容。
|
||||||
|
|
||||||
### 结论
|
### 结论
|
||||||
|
|
||||||
数据库创建了足够的指标以使我们需要长时间研究,虽然内部性能数据库充满了有用的信息,但并不总是使你清楚应该关注哪些指标。 从吞吐量,执行时间,并发性和利用率开始,它们为你提供了足够的信息,使你可以开始了解你的数据库中的情况。
|
数据库创建了足够的指标以使我们需要长时间研究,虽然内部性能数据库充满了有用的信息,但并不总是使你清楚应该关注哪些指标。从吞吐量、执行时间、并发性和利用率开始,它们为你提供了足够的信息,使你可以开始了解你的数据库中的情况。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image3_3_hearts.png?itok=iHF-OSwx)
|
![](https://opensource.com/sites/default/files/styles/medium/public/uploads/image3_3_hearts.png?itok=iHF-OSwx)
|
||||||
|
|
||||||
@ -74,7 +76,7 @@ via: https://opensource.com/article/18/10/database-metrics-matter
|
|||||||
作者:[Katy Farmer][a]
|
作者:[Katy Farmer][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[ChiZelin](https://github.com/ChiZelin)
|
译者:[ChiZelin](https://github.com/ChiZelin)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -1,27 +1,27 @@
|
|||||||
让系统崩溃的黑天鹅分类
|
让系统崩溃的黑天鹅分类
|
||||||
======
|
======
|
||||||
|
|
||||||
在严重的故障发生之前,找到引起问题的异常事件,并修复它。
|
> 在严重的故障发生之前,找到引起问题的异常事件,并修复它。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/black-swan-pair_0.png?itok=MkshwqVg)
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/black-swan-pair_0.png?itok=MkshwqVg)
|
||||||
|
|
||||||
黑天鹅用来比喻造成严重影响的小概率事件(比如 2008 年的金融危机)。在生产环境的系统中,黑天鹅是指这样的事情:它引发了你不知道的问题,造成了重大影响,不能快速修复或回滚,也不能用值班说明书上的其他标准响应来解决。它是事发几年后你还在给新人说起的事件。
|
<ruby>黑天鹅<rt>Black swan</rt></ruby>用来比喻造成严重影响的小概率事件(比如 2008 年的金融危机)。在生产环境的系统中,黑天鹅是指这样的事情:它引发了你不知道的问题,造成了重大影响,不能快速修复或回滚,也不能用值班说明书上的其他标准响应来解决。它是事发几年后你还在给新人说起的事件。
|
||||||
|
|
||||||
从定义上看,黑天鹅是不可预测的,不过有时候我们能找到其中的一些模式,针对有关联的某一类问题准备防御措施。
|
从定义上看,黑天鹅是不可预测的,不过有时候我们能找到其中的一些模式,针对有关联的某一类问题准备防御措施。
|
||||||
|
|
||||||
例如,大部分故障的直接原因是变更(代码、环境或配置)。虽然这种方式触发的 bug 是独特的,不可预测的,但是常见的金丝雀发布对避免这类问题有一定的作用,而且自动回滚已经成了一种标准止损策略。
|
例如,大部分故障的直接原因是变更(代码、环境或配置)。虽然这种方式触发的 bug 是独特的、不可预测的,但是常见的金丝雀发布对避免这类问题有一定的作用,而且自动回滚已经成了一种标准止损策略。
|
||||||
|
|
||||||
随着我们的专业性不断成熟,一些其他的问题也正逐渐变得容易理解,被归类到某种风险并有普适的预防策略。
|
随着我们的专业性不断成熟,一些其他的问题也正逐渐变得容易理解,被归类到某种风险并有普适的预防策略。
|
||||||
|
|
||||||
### 公布出来的黑天鹅事件
|
### 公布出来的黑天鹅事件
|
||||||
|
|
||||||
所有科技公司都有生产环境的故障,只不过并不是所有公司都会分享他们的事故分析。那些公开讨论事故的公司帮了我们的忙。下列事故都描述了某一类问题,但它们绝对不是只属于一个类别。我们的系统中都有黑天鹅在潜伏着,只是有些人还不知道而已。
|
所有科技公司都有生产环境的故障,只不过并不是所有公司都会分享他们的事故分析。那些公开讨论事故的公司帮了我们的忙。下列事故都描述了某一类问题,但它们绝对不是只一个孤例。我们的系统中都有黑天鹅在潜伏着,只是有些人还不知道而已。
|
||||||
|
|
||||||
#### 达到上限
|
#### 达到上限
|
||||||
|
|
||||||
达到任何类型的限制都会引发严重事故。这类问题的一个典型例子是 2017 年 2 月 [Instapaper 的一次服务中断][1]。我把这份事故报告给任何一个运维工作者看,他们读完都会脊背发凉。Instapaper 生产环境的数据库所在的文件系统有 2 TB 的大小限制,但是数据库服务团队并不知情。在没有任何报错的情况下,数据库不再接受任何写入了。完全恢复需要好几天,而且还得迁移数据库。
|
达到任何类型的限制都会引发严重事故。这类问题的一个典型例子是 2017 年 2 月 [Instapaper 的一次服务中断][1]。我把这份事故报告给任何一个运维工作者看,他们读完都会脊背发凉。Instapaper 生产环境的数据库所在的文件系统有 2 TB 的大小限制,但是数据库服务团队并不知情。在没有任何报错的情况下,数据库不再接受任何写入了。完全恢复需要好几天,而且还得迁移数据库。
|
||||||
|
|
||||||
资源限制有各式各样的触发场景。Sentry 遇到了 [Postgres 的最大事务 ID 限制][2]。Platform.sh 遇到了[管道缓冲区大小限制][3]。SparkPost [触发了 AWS 的 DDos 保护][4]。Foursquare 在他们的一个 [MongoDB 耗尽内存][5]时遭遇了性能骤降。
|
资源限制有各式各样的触发场景。Sentry 遇到了 [Postgres 的最大事务 ID 限制][2]。Platform.sh 遇到了[管道缓冲区大小限制][3]。SparkPost [触发了 AWS 的 DDoS 保护][4]。Foursquare 在他们的一个 [MongoDB 耗尽内存][5]时遭遇了性能骤降。
|
||||||
|
|
||||||
提前了解系统限制的一个办法是定期做测试。好的压力测试(在生产环境的副本上做)应该包含写入事务,并且应该把每一种数据存储都写到超过当前生产环境的容量。压力测试时很容易忽略的是次要存储(比如 Zookeeper)。如果你是在测试时遇到了资源限制,那么你还有时间去解决问题。鉴于这种资源限制问题的解决方案可能涉及重大的变更(比如数据存储拆分),所以时间是非常宝贵的。
|
提前了解系统限制的一个办法是定期做测试。好的压力测试(在生产环境的副本上做)应该包含写入事务,并且应该把每一种数据存储都写到超过当前生产环境的容量。压力测试时很容易忽略的是次要存储(比如 Zookeeper)。如果你是在测试时遇到了资源限制,那么你还有时间去解决问题。鉴于这种资源限制问题的解决方案可能涉及重大的变更(比如数据存储拆分),所以时间是非常宝贵的。
|
||||||
|
|
||||||
@ -32,7 +32,7 @@
|
|||||||
#### 扩散的慢请求
|
#### 扩散的慢请求
|
||||||
|
|
||||||
> “这个世界的关联性远比我们想象中更大。所以我们看到了更多 Nassim Taleb 所说的‘黑天鹅事件’ —— 即罕见事件以更高的频率离谱地发生了,因为世界是相互关联的”
|
> “这个世界的关联性远比我们想象中更大。所以我们看到了更多 Nassim Taleb 所说的‘黑天鹅事件’ —— 即罕见事件以更高的频率离谱地发生了,因为世界是相互关联的”
|
||||||
> — [Richard Thaler][6]
|
> —— [Richard Thaler][6]
|
||||||
|
|
||||||
HostedGraphite 的负载均衡器并没有托管在 AWS 上,却[被 AWS 的服务中断给搞垮了][7],他们关于这次事故原因的分析报告很好地诠释了分布式计算系统之间存在多么大的关联。在这个事件里,负载均衡器的连接池被来自 AWS 上的客户访问占满了,因为这些连接很耗时。同样的现象还会发生在应用的线程、锁、数据库连接上 —— 任何能被慢操作占满的资源。
|
HostedGraphite 的负载均衡器并没有托管在 AWS 上,却[被 AWS 的服务中断给搞垮了][7],他们关于这次事故原因的分析报告很好地诠释了分布式计算系统之间存在多么大的关联。在这个事件里,负载均衡器的连接池被来自 AWS 上的客户访问占满了,因为这些连接很耗时。同样的现象还会发生在应用的线程、锁、数据库连接上 —— 任何能被慢操作占满的资源。
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ HostedGraphite 的负载均衡器并没有托管在 AWS 上,却[被 AWS 的服
|
|||||||
|
|
||||||
重试的间隔应该用指数退避来限制一下,并加入一些时间抖动。Square 有一次服务中断是 [Redis 存储的过载][9],原因是有一段代码对失败的事务重试了 500 次,没有任何重试退避的方案,也说明了过度重试的潜在风险。另外,针对这种情况,[断路器][10]设计模式也是有用的。
|
重试的间隔应该用指数退避来限制一下,并加入一些时间抖动。Square 有一次服务中断是 [Redis 存储的过载][9],原因是有一段代码对失败的事务重试了 500 次,没有任何重试退避的方案,也说明了过度重试的潜在风险。另外,针对这种情况,[断路器][10]设计模式也是有用的。
|
||||||
|
|
||||||
应该设计出监控仪表盘来清晰地展示所有资源的[使用率,饱和度和报错][11],这样才能快速发现问题。
|
应该设计出监控仪表盘来清晰地展示所有资源的[使用率、饱和度和报错][11],这样才能快速发现问题。
|
||||||
|
|
||||||
#### 突发的高负载
|
#### 突发的高负载
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ HostedGraphite 的负载均衡器并没有托管在 AWS 上,却[被 AWS 的服
|
|||||||
|
|
||||||
在预定时刻同时发生的事件并不是突发大流量的唯一原因。Slack 经历过一次短时间内的[多次服务中断][12],原因是非常多的客户端断开连接后立即重连,造成了突发的大负载。 CircleCI 也经历过一次[严重的服务中断][13],当时 Gitlab 从故障中恢复了,所以数据库里积累了大量的构建任务队列,服务变得饱和而且缓慢。
|
在预定时刻同时发生的事件并不是突发大流量的唯一原因。Slack 经历过一次短时间内的[多次服务中断][12],原因是非常多的客户端断开连接后立即重连,造成了突发的大负载。 CircleCI 也经历过一次[严重的服务中断][13],当时 Gitlab 从故障中恢复了,所以数据库里积累了大量的构建任务队列,服务变得饱和而且缓慢。
|
||||||
|
|
||||||
几乎所有的服务都会受突发的高负载所影响。所以对这类可能出现的事情做应急预案——并测试一下预案能否正常工作——是必须的。客户端退避和[减载][14]通常是这些方案的核心。
|
几乎所有的服务都会受突发的高负载所影响。所以对这类可能出现的事情做应急预案 —— 并测试一下预案能否正常工作 —— 是必须的。客户端退避和[减载][14]通常是这些方案的核心。
|
||||||
|
|
||||||
如果你的系统必须不间断地接收数据,并且数据不能被丢掉,关键是用可伸缩的方式把数据缓冲到队列中,后续再处理。
|
如果你的系统必须不间断地接收数据,并且数据不能被丢掉,关键是用可伸缩的方式把数据缓冲到队列中,后续再处理。
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ HostedGraphite 的负载均衡器并没有托管在 AWS 上,却[被 AWS 的服
|
|||||||
> “复杂的系统本身就是有风险的系统”
|
> “复杂的系统本身就是有风险的系统”
|
||||||
> —— [Richard Cook, MD][15]
|
> —— [Richard Cook, MD][15]
|
||||||
|
|
||||||
过去几年里软件的运维操作趋势是更加自动化。任何可能降低系统容量的自动化操作(比如擦除磁盘,退役设备,关闭服务)都应该谨慎操作。这类自动化操作的故障(由于系统有 bug 或者有不正确的调用)能很快地搞垮你的系统,而且可能很难恢复。
|
过去几年里软件的运维操作趋势是更加自动化。任何可能降低系统容量的自动化操作(比如擦除磁盘、退役设备、关闭服务)都应该谨慎操作。这类自动化操作的故障(由于系统有 bug 或者有不正确的调用)能很快地搞垮你的系统,而且可能很难恢复。
|
||||||
|
|
||||||
谷歌的 Christina Schulman 和 Etienne Perot 在[用安全规约协助保护你的数据中心][16]的演讲中给了一些例子。其中一次事故是将谷歌整个内部的内容分发网络(CDN)提交给了擦除磁盘的自动化系统。
|
谷歌的 Christina Schulman 和 Etienne Perot 在[用安全规约协助保护你的数据中心][16]的演讲中给了一些例子。其中一次事故是将谷歌整个内部的内容分发网络(CDN)提交给了擦除磁盘的自动化系统。
|
||||||
|
|
||||||
@ -69,11 +69,11 @@ Schulman 和 Perot 建议使用一个中心服务来管理规约,限制破坏
|
|||||||
|
|
||||||
### 防止黑天鹅事件
|
### 防止黑天鹅事件
|
||||||
|
|
||||||
可能在等着击垮系统的黑天鹅可不止上面这些。有很多其他的严重问题是能通过一些技术来避免的,像金丝雀发布,压力测试,混沌工程,灾难测试和模糊测试——当然还有冗余性和弹性的设计。但是即使用了这些技术,有时候你的系统还是会有故障。
|
可能在等着击垮系统的黑天鹅可不止上面这些。有很多其他的严重问题是能通过一些技术来避免的,像金丝雀发布、压力测试、混沌工程、灾难测试和模糊测试 —— 当然还有冗余性和弹性的设计。但是即使用了这些技术,有时候你的系统还是会有故障。
|
||||||
|
|
||||||
为了确保你的组织能有效地响应,在服务中断期间,请保证关键技术人员和领导层有办法沟通协调。例如,有一种你可能需要处理的烦人的事情,那就是网络完全中断。拥有故障时仍然可用的通信通道非常重要,这个通信通道要完全独立于你们自己的基础设施和基础设施的依赖。举个例子,假如你使用 AWS,那么把故障时可用的通信服务部署在 AWS 上就不明智了。在和你的主系统无关的地方,运行电话网桥或 IRC 服务器是比较好的方案。确保每个人都知道这个通信平台,并练习使用它。
|
为了确保你的组织能有效地响应,在服务中断期间,请保证关键技术人员和领导层有办法沟通协调。例如,有一种你可能需要处理的烦人的事情,那就是网络完全中断。拥有故障时仍然可用的通信通道非常重要,这个通信通道要完全独立于你们自己的基础设施及对其的依赖。举个例子,假如你使用 AWS,那么把故障时可用的通信服务部署在 AWS 上就不明智了。在和你的主系统无关的地方,运行电话网桥或 IRC 服务器是比较好的方案。确保每个人都知道这个通信平台,并练习使用它。
|
||||||
|
|
||||||
另一个原则是,确保监控和运维工具对生产环境系统的依赖尽可能的少。将控制平面和数据平面分开,你才能在系统不健康的时候做变更。不要让数据处理和配置变更或监控使用同一个消息队列,比如——应该使用不同的消息队列实例。在 [SparkPost: DNS 挂掉的那一天][4] 这个演讲中,Jeremy Blosser 讲了一个这类例子,很关键的工具依赖了生产环境的 DNS 配置,但是生产环境的 DNS 出了问题。
|
另一个原则是,确保监控和运维工具对生产环境系统的依赖尽可能的少。将控制平面和数据平面分开,你才能在系统不健康的时候做变更。不要让数据处理和配置变更或监控使用同一个消息队列,比如,应该使用不同的消息队列实例。在 [SparkPost: DNS 挂掉的那一天][4] 这个演讲中,Jeremy Blosser 讲了一个这类例子,很关键的工具依赖了生产环境的 DNS 配置,但是生产环境的 DNS 出了问题。
|
||||||
|
|
||||||
### 对抗黑天鹅的心理学
|
### 对抗黑天鹅的心理学
|
||||||
|
|
||||||
@ -83,7 +83,7 @@ Schulman 和 Perot 建议使用一个中心服务来管理规约,限制破坏
|
|||||||
|
|
||||||
### 了解更多
|
### 了解更多
|
||||||
|
|
||||||
关于黑天鹅(或者以前的黑天鹅)事件以及应对策略,还有很多其他的事情可以说。如果你想了解更多,我强烈推荐你去看这两本书,它们是关于生产环境中的弹性和稳定性的:Susan Fowler 写的[生产微服务][19],还有 Michael T. Nygard 的 [Release It!][20]。
|
关于黑天鹅(或者以前的黑天鹅)事件以及应对策略,还有很多其他的事情可以说。如果你想了解更多,我强烈推荐你去看这两本书,它们是关于生产环境中的弹性和稳定性的:Susan Fowler 写的《[生产微服务][19]》,还有 Michael T. Nygard 的 《[Release It!][20]》。
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ via: https://opensource.com/article/18/10/taxonomy-black-swans
|
|||||||
作者:[Laura Nolan][a]
|
作者:[Laura Nolan][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[BeliteX](https://github.com/belitex)
|
译者:[BeliteX](https://github.com/belitex)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -1,40 +1,38 @@
|
|||||||
Android 9.0 概览
|
Android 9.0 概览
|
||||||
======
|
======
|
||||||
|
|
||||||
|
> 第九代 Android 带来了更令人满意的用户体验。
|
||||||
|
|
||||||
![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/android-pie.jpg?itok=Sx4rbOWY)
|
![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/android-pie.jpg?itok=Sx4rbOWY)
|
||||||
|
|
||||||
我们来谈论一下 Android。尽管 Android 只是一款内核经过修改的 Linux,但经过多年的发展,Android 开发者们(或许包括正在阅读这篇文章的你)已经为这个平台的演变做出了很多值得称道的贡献。当然,可能很多人都已经知道,但我们还是要说,Android 并不完全开源,当你使用 Google 服务的时候,就已经接触到闭源的部分了。Google Play 商店就是其中之一,它不是一个开放的服务,不过这与 Android 是否开源没有太直接的联系,而是为了让你享用到美味、营养、高效、省电的馅饼(注:Android 9.0 代号为 Pie)。
|
我们来谈论一下 Android。尽管 Android 只是一款内核经过修改的 Linux,但经过多年的发展,Android 开发者们(或许包括正在阅读这篇文章的你)已经为这个平台的演变做出了很多值得称道的贡献。当然,可能很多人都已经知道,但我们还是要说,Android 并不完全开源,当你使用 Google 服务的时候,就已经接触到闭源的部分了。Google Play 商店就是其中之一,它不是一个开放的服务。不过无论 Android 开源与否,这就是一个美味、营养、高效、省电的馅饼(LCTT 译注:Android 9.0 代号为 Pie)。
|
||||||
|
|
||||||
我在我的 Essential PH-1 手机上运行了 Android 9.0(我真的很喜欢这款手机,也很了解这家公司的境况并不好)。在我自己体验了一段时间之后,我认为它是会被大众接受的。那么 Android 9.0 到底好在哪里呢?下面我们就来深入探讨一下。我们的出发点是用户的角度,而不是开发人员的角度,因此我也不会深入探讨太底层的方面。
|
我在我的 Essential PH-1 手机上运行了 Android 9.0(我真的很喜欢这款手机,也知道这家公司的境况并不好)。在我自己体验了一段时间之后,我认为它是会被大众接受的。那么 Android 9.0 到底好在哪里呢?下面我们就来深入探讨一下。我们的出发点是用户的角度,而不是开发人员的角度,因此我也不会深入探讨太底层的方面。
|
||||||
|
|
||||||
### 手势操作
|
### 手势操作
|
||||||
|
|
||||||
Android 系统在新的手势操作方面投入了很多,但实际体验却不算太好。这个功能确实引起了我的兴趣。在这个功能发布之初,大家都对它了解甚少,纷纷猜测它会不会让用户使用多点触控的手势来浏览 Android 界面?又或者会不会是一个完全颠覆人们认知的东西?
|
Android 系统在新的手势操作方面投入了很多,但实际体验却不算太好。这个功能确实引起了我的兴趣。在这个功能发布之初,大家都对它了解甚少,纷纷猜测它会不会让用户使用多点触控的手势来浏览 Android 界面?又或者会不会是一个完全颠覆人们认知的东西?
|
||||||
|
|
||||||
实际上,手势操作比大多数人设想的要更加微妙和简单,因为很多功能都浓缩到了 Home 键上。打开手势操作功能之后,Recent 键的功能就合并到 Home 键上了。因此,如果需要查看最近打开的应用程序,就不能简单地通过 Recent 键来查看,而应该从 Home 键向上轻扫一下。(图1)
|
实际上,手势操作比大多数人设想的要更加微妙而简单,因为很多功能都浓缩到了 Home 键上。打开手势操作功能之后,Recent 键的功能就合并到 Home 键上了。因此,如果需要查看最近打开的应用程序,就不能简单地通过 Recent 键来查看,而应该从 Home 键向上轻扫一下。(图 1)
|
||||||
|
|
||||||
![Android Pie][2]
|
![Android Pie][2]
|
||||||
|
|
||||||
图 1:Android 9.0 中的”最近的应用程序“界面。
|
*图 1:Android 9.0 中的”最近的应用程序“界面。*
|
||||||
|
|
||||||
另一个不同的地方是 App Drawer。类似于查看最近打开的应用,需要在 Home 键向上滑动才能打开 App Drawer。
|
另一个不同的地方是 App Drawer。类似于查看最近打开的应用,需要在 Home 键向上滑动才能打开 App Drawer。
|
||||||
|
|
||||||
而后退按钮则没有去掉。在应用程序需要用到后退功能时,它就会出现在屏幕的左下方。有时候即使应用程序自己带有后退按钮,Android 的后退按钮也会出现。
|
而后退按钮则没有去掉。在应用程序需要用到后退功能时,它就会出现在主屏幕的左下方。有时候即使应用程序自己带有后退按钮,Android 的后退按钮也会出现。
|
||||||
|
|
||||||
当然,如果你不喜欢使用手势操作,也可以禁用这个功能。只需要按照下列步骤操作:
|
当然,如果你不喜欢使用手势操作,也可以禁用这个功能。只需要按照下列步骤操作:
|
||||||
|
|
||||||
|
|
||||||
1. 打开”设置“
|
1. 打开”设置“
|
||||||
|
2. 向下滑动并进入“系统 > 手势”
|
||||||
2. 向下滑动并进入 系统 > 手势
|
|
||||||
|
|
||||||
3. 从 Home 键向上滑动
|
3. 从 Home 键向上滑动
|
||||||
|
4. 将 On/Off 滑块(图 2)滑动至 Off 位置
|
||||||
4. 将 On/Off 滑块(图2)滑动至 Off 位置
|
|
||||||
|
|
||||||
![](https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_2.png?itok=cs2tqZut)
|
![](https://www.linux.com/sites/lcom/files/styles/floated_images/public/pie_2.png?itok=cs2tqZut)
|
||||||
|
|
||||||
图 2:关闭手势操作。
|
*图 2:关闭手势操作。*
|
||||||
|
|
||||||
### 电池寿命
|
### 电池寿命
|
||||||
|
|
||||||
@ -42,25 +40,19 @@ Android 系统在新的手势操作方面投入了很多,但实际体验却不
|
|||||||
|
|
||||||
对于这个功能的唯一一个警告是,如果人工智能出现问题并导致电池电量过早耗尽,就只能通过恢复出厂设置来解决这个问题了。尽管有这样的缺陷,在电池续航时间方面,Android 9.0 也比 Android 8.0 有所改善。
|
对于这个功能的唯一一个警告是,如果人工智能出现问题并导致电池电量过早耗尽,就只能通过恢复出厂设置来解决这个问题了。尽管有这样的缺陷,在电池续航时间方面,Android 9.0 也比 Android 8.0 有所改善。
|
||||||
|
|
||||||
### 分屏功能
|
### 分屏功能的变化
|
||||||
|
|
||||||
分屏对于 Android 来说不是一个新功能,但在 Android 9.0 上,它的使用方式和以往相比略有不同,而且只对于手势操作有影响,不使用手势操作的用户不受影响。要在 Android 9.0 上使用分屏功能,需要按照下列步骤操作:
|
分屏对于 Android 来说不是一个新功能,但在 Android 9.0 上,它的使用方式和以往相比略有不同,而且只对于手势操作有影响,不使用手势操作的用户不受影响。要在 Android 9.0 上使用分屏功能,需要按照下列步骤操作:
|
||||||
|
|
||||||
|
1. 从 Home 键向上滑动,打开“最近的应用程序”。
|
||||||
|
2. 找到需要放置在屏幕顶部的应用程序。
|
||||||
|
3. 长按应用程序顶部的图标以显示新的弹出菜单。(图 3)
|
||||||
|
4. 点击分屏,应用程序会在屏幕的上半部分打开。
|
||||||
|
5. 找到要打开的第二个应用程序,然后点击它添加到屏幕的下半部分。
|
||||||
|
|
||||||
![Adding an app][5]
|
![Adding an app][5]
|
||||||
|
|
||||||
图 3:在 Android 9.0 上将应用添加到分屏模式中。
|
*图 3:在 Android 9.0 上将应用添加到分屏模式中。*
|
||||||
|
|
||||||
[Used with permission][3]
|
|
||||||
|
|
||||||
1. 从 Home 键向上滑动,打开“最近的应用程序”。
|
|
||||||
|
|
||||||
2. 找到需要放置在屏幕顶部的应用程序。
|
|
||||||
|
|
||||||
3. 长按应用程序顶部的图标以显示新的弹出菜单。(图 3)
|
|
||||||
|
|
||||||
4. 点击分屏,应用程序会在屏幕的上半部分打开。
|
|
||||||
|
|
||||||
5. 找到要打开的第二个应用程序,然后点击它添加到屏幕的下半部分。
|
|
||||||
|
|
||||||
使用分屏功能关闭应用程序的方法和原来保持一致。
|
使用分屏功能关闭应用程序的方法和原来保持一致。
|
||||||
|
|
||||||
@ -72,7 +64,7 @@ Android 系统在新的手势操作方面投入了很多,但实际体验却不
|
|||||||
|
|
||||||
![Actions][7]
|
![Actions][7]
|
||||||
|
|
||||||
图 4:Android 应用操作。
|
*图 4:Android 应用操作。*
|
||||||
|
|
||||||
### 声音控制
|
### 声音控制
|
||||||
|
|
||||||
@ -82,17 +74,17 @@ Android 9.0 这次优化针对的是设备上快速控制声音的按钮。如
|
|||||||
|
|
||||||
![Sound control][9]
|
![Sound control][9]
|
||||||
|
|
||||||
图 5:Android 9.0 上的声音控制。
|
*图 5:Android 9.0 上的声音控制。*
|
||||||
|
|
||||||
### 屏幕截图
|
### 屏幕截图
|
||||||
|
|
||||||
由于我要撰写关于 Android 的文章,所以我会常常需要进行屏幕截图。而 Android 9.0 有意向我最喜欢的更新,就是分享屏幕截图。Android 9.0 可以在截取屏幕截图后,直接共享、编辑,或者删除不喜欢的截图,而不需要像以前一样打开 Google 相册、找到要共享的屏幕截图、打开图像然后共享图像。
|
由于我要撰写关于 Android 的文章,所以我会常常需要进行屏幕截图。而 Android 9.0 有一项我最喜欢的更新,就是分享屏幕截图。Android 9.0 可以在截取屏幕截图后,直接共享、编辑,或者删除不喜欢的截图,而不需要像以前一样打开 Google 相册、找到要共享的屏幕截图、打开图像然后共享图像。
|
||||||
|
|
||||||
|
如果你想分享屏幕截图,只需要在截图后等待弹出菜单,点击分享(图 6),从标准的 Android 分享菜单中分享即可。
|
||||||
|
|
||||||
![Sharing ][11]
|
![Sharing ][11]
|
||||||
|
|
||||||
图 6:共享屏幕截图变得更加容易。
|
*图 6:共享屏幕截图变得更加容易。*
|
||||||
|
|
||||||
如果你想分享屏幕截图,只需要在截图后等待弹出菜单,点击分享(图 6),从标准的 Android 分享菜单中分享即可。
|
|
||||||
|
|
||||||
### 更令人满意的 Android 体验
|
### 更令人满意的 Android 体验
|
||||||
|
|
||||||
@ -105,7 +97,7 @@ via: https://www.linux.com/learn/2018/10/overview-android-pie
|
|||||||
作者:[Jack Wallen][a]
|
作者:[Jack Wallen][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[HankChow](https://github.com/HankChow)
|
译者:[HankChow](https://github.com/HankChow)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -0,0 +1,367 @@
|
|||||||
|
我们如何得知安装的包来自哪个仓库?
|
||||||
|
==========
|
||||||
|
|
||||||
|
有时候你可能想知道安装的软件包来自于哪个仓库。这将帮助你在遇到包冲突问题时进行故障排除。
|
||||||
|
|
||||||
|
因为[第三方仓库][1]拥有最新版本的软件包,所以有时候当你试图安装一些包的时候会出现兼容性的问题。
|
||||||
|
|
||||||
|
在 Linux 上一切都是可能的,因为你可以安装一个即使在你的发行版系统上不能使用的包。
|
||||||
|
|
||||||
|
你也可以安装一个最新版本的包,即使你的发行版系统仓库还没有这个版本,怎么做到的呢?
|
||||||
|
|
||||||
|
这就是为什么出现了第三方仓库。它们允许用户从库中安装所有可用的包。
|
||||||
|
|
||||||
|
几乎所有的发行版系统都允许第三方软件库。一些发行版还会官方推荐一些不会取代基础仓库的第三方仓库,例如 CentOS 官方推荐安装 [EPEL 库][2]。
|
||||||
|
|
||||||
|
下面是常用的仓库列表和它们的详细信息。
|
||||||
|
|
||||||
|
* CentOS: [EPEL][2]、[ELRepo][3] 等是 [Centos 社区认证仓库](4)。
|
||||||
|
* Fedora: [RPMfusion 仓库][5] 是经常被很多 [Fedora][6] 用户使用的仓库。
|
||||||
|
* ArchLinux: ArchLinux 社区仓库包含了来自于 Arch 用户仓库的可信用户审核通过的软件包。
|
||||||
|
* openSUSE: [Packman 仓库][7] 为 openSUSE 提供了各种附加的软件包,特别是但不限于那些在 openSUSE Build Service 应用黑名单上的与多媒体相关的应用和库。它是 openSUSE 软件包的最大外部软件库。
|
||||||
|
* Ubuntu:个人软件包归档(PPA)是一种软件仓库。开发者们可以创建这种仓库来分发他们的软件。你可以在 PPA 导航页面找到相关信息。同时,你也可以启用 Cananical 合作伙伴软件仓库。
|
||||||
|
|
||||||
|
### 仓库是什么?
|
||||||
|
|
||||||
|
软件仓库是存储特定的应用程序的软件包的集中场所。
|
||||||
|
|
||||||
|
所有的 Linux 发行版都在维护他们自己的仓库,并允许用户在他们的机器上获取和安装包。
|
||||||
|
|
||||||
|
每个厂商都提供了各自的包管理工具来管理它们的仓库,例如搜索、安装、更新、升级、删除等等。
|
||||||
|
|
||||||
|
除了 RHEL 和 SUSE 以外大部分 Linux 发行版都是自由软件。要访问付费的仓库,你需要购买其订阅服务。
|
||||||
|
|
||||||
|
### 为什么我们需要启用第三方仓库?
|
||||||
|
|
||||||
|
在 Linux 里,并不建议从源代码安装包,因为这样做可能会在升级软件和系统的时候产生很多问题,这也是为什么我们建议从库中安装包而不是从源代码安装。
|
||||||
|
|
||||||
|
### 在 RHEL/CentOS 系统上我们如何得知安装的软件包来自哪个仓库?
|
||||||
|
|
||||||
|
这可以通过很多方法实现。我们会给你所有可能的选择,你可以选择一个对你来说最合适的。
|
||||||
|
|
||||||
|
#### 方法-1:使用 yum 命令
|
||||||
|
|
||||||
|
RHEL 和 CentOS 系统使用 RPM 包,因此我们能够使用 [Yum 包管理器][8] 来获得信息。
|
||||||
|
|
||||||
|
YUM 即 “Yellodog Updater, Modified” 是适用于基于 RPM 的系统例如 RHEL 和 CentOS 的一个开源命令行前端包管理工具。
|
||||||
|
|
||||||
|
`yum` 是从发行版仓库和其他第三方库中获取、安装、删除、查询和管理 RPM 包的一个主要工具。
|
||||||
|
|
||||||
|
```
|
||||||
|
# yum info apachetop
|
||||||
|
Loaded plugins: fastestmirror
|
||||||
|
Loading mirror speeds from cached hostfile
|
||||||
|
* epel: epel.mirror.constant.com
|
||||||
|
Installed Packages
|
||||||
|
Name : apachetop
|
||||||
|
Arch : x86_64
|
||||||
|
Version : 0.15.6
|
||||||
|
Release : 1.el7
|
||||||
|
Size : 65 k
|
||||||
|
Repo : installed
|
||||||
|
From repo : epel
|
||||||
|
Summary : A top-like display of Apache logs
|
||||||
|
URL : https://github.com/tessus/apachetop
|
||||||
|
License : BSD
|
||||||
|
Description : ApacheTop watches a logfile generated by Apache (in standard common or
|
||||||
|
: combined logformat, although it doesn't (yet) make use of any of the extra
|
||||||
|
: fields in combined) and generates human-parsable output in realtime.
|
||||||
|
```
|
||||||
|
|
||||||
|
`apachetop` 包来自 EPEL 仓库。
|
||||||
|
|
||||||
|
#### 方法-2:使用 yumdb 命令
|
||||||
|
|
||||||
|
`yumdb info` 提供了类似于 `yum info` 的信息但是它又提供了包校验和数据、类型、用户信息(谁安装的软件包)。从 yum 3.2.26 开始,yum 已经开始在 rpmdatabase 之外存储额外的信息(user 表示软件是用户安装的,dep 表示它是作为依赖项引入的)。
|
||||||
|
|
||||||
|
```
|
||||||
|
# yumdb info lighttpd
|
||||||
|
Loaded plugins: fastestmirror
|
||||||
|
lighttpd-1.4.50-1.el7.x86_64
|
||||||
|
checksum_data = a24d18102ed40148cfcc965310a516050ed437d728eeeefb23709486783a4d37
|
||||||
|
checksum_type = sha256
|
||||||
|
command_line = --enablerepo=epel install lighttpd apachetop aria2 atop axel
|
||||||
|
from_repo = epel
|
||||||
|
from_repo_revision = 1540756729
|
||||||
|
from_repo_timestamp = 1540757483
|
||||||
|
installed_by = 0
|
||||||
|
origin_url = https://epel.mirror.constant.com/7/x86_64/Packages/l/lighttpd-1.4.50-1.el7.x86_64.rpm
|
||||||
|
reason = user
|
||||||
|
releasever = 7
|
||||||
|
var_contentdir = centos
|
||||||
|
var_infra = stock
|
||||||
|
var_uuid = ce328b07-9c0a-4765-b2ad-59d96a257dc8
|
||||||
|
```
|
||||||
|
|
||||||
|
`lighttpd` 包来自 EPEL 仓库。
|
||||||
|
|
||||||
|
#### 方法-3:使用 rpm 命令
|
||||||
|
|
||||||
|
[RPM 命令][9] 即 “Red Hat Package Manager” 是一个适用于基于 Red Hat 的系统(例如 RHEL、CentOS、Fedora、openSUSE & Mageia)的强大的命令行包管理工具。
|
||||||
|
|
||||||
|
这个工具允许你在你的 Linux 系统/服务器上安装、更新、移除、查询和验证软件。RPM 文件具有 .rpm 后缀名。RPM 包是用必需的库和依赖关系构建的,不会与系统上安装的其他包冲突。
|
||||||
|
|
||||||
|
```
|
||||||
|
# rpm -qi apachetop
|
||||||
|
Name : apachetop
|
||||||
|
Version : 0.15.6
|
||||||
|
Release : 1.el7
|
||||||
|
Architecture: x86_64
|
||||||
|
Install Date: Mon 29 Oct 2018 06:47:49 AM EDT
|
||||||
|
Group : Applications/Internet
|
||||||
|
Size : 67020
|
||||||
|
License : BSD
|
||||||
|
Signature : RSA/SHA256, Mon 22 Jun 2015 09:30:26 AM EDT, Key ID 6a2faea2352c64e5
|
||||||
|
Source RPM : apachetop-0.15.6-1.el7.src.rpm
|
||||||
|
Build Date : Sat 20 Jun 2015 09:02:37 PM EDT
|
||||||
|
Build Host : buildvm-22.phx2.fedoraproject.org
|
||||||
|
Relocations : (not relocatable)
|
||||||
|
Packager : Fedora Project
|
||||||
|
Vendor : Fedora Project
|
||||||
|
URL : https://github.com/tessus/apachetop
|
||||||
|
Summary : A top-like display of Apache logs
|
||||||
|
Description :
|
||||||
|
ApacheTop watches a logfile generated by Apache (in standard common or
|
||||||
|
combined logformat, although it doesn't (yet) make use of any of the extra
|
||||||
|
fields in combined) and generates human-parsable output in realtime.
|
||||||
|
```
|
||||||
|
|
||||||
|
`apachetop` 包来自 EPEL 仓库。
|
||||||
|
|
||||||
|
#### 方法-4:使用 repoquery 命令
|
||||||
|
|
||||||
|
`repoquery` 是一个从 YUM 库查询信息的程序,类似于 rpm 查询。
|
||||||
|
|
||||||
|
```
|
||||||
|
# repoquery -i httpd
|
||||||
|
|
||||||
|
Name : httpd
|
||||||
|
Version : 2.4.6
|
||||||
|
Release : 80.el7.centos.1
|
||||||
|
Architecture: x86_64
|
||||||
|
Size : 9817285
|
||||||
|
Packager : CentOS BuildSystem
|
||||||
|
Group : System Environment/Daemons
|
||||||
|
URL : http://httpd.apache.org/
|
||||||
|
Repository : updates
|
||||||
|
Summary : Apache HTTP Server
|
||||||
|
Source : httpd-2.4.6-80.el7.centos.1.src.rpm
|
||||||
|
Description :
|
||||||
|
The Apache HTTP Server is a powerful, efficient, and extensible
|
||||||
|
web server.
|
||||||
|
```
|
||||||
|
|
||||||
|
`httpd` 包来自 CentOS updates 仓库。
|
||||||
|
|
||||||
|
### 在 Fedora 系统上我们如何得知安装的包来自哪个仓库?
|
||||||
|
|
||||||
|
DNF 是 “Dandified yum” 的缩写。DNF 是使用 hawkey/libsolv 库作为后端的下一代 yum 包管理器(yum 的分支)。从 Fedora 18 开始 Aleš Kozumplík 开始开发 DNF,并最终在 Fedora 22 上得以应用/启用。
|
||||||
|
|
||||||
|
[dnf 命令][10] 用于在 Fedora 22 以及之后的系统上安装、更新、搜索和删除包。它会自动解决依赖并使安装包的过程变得顺畅,不会出现任何问题。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ dnf info tilix
|
||||||
|
Last metadata expiration check: 27 days, 10:00:23 ago on Wed 04 Oct 2017 06:43:27 AM IST.
|
||||||
|
Installed Packages
|
||||||
|
Name : tilix
|
||||||
|
Version : 1.6.4
|
||||||
|
Release : 1.fc26
|
||||||
|
Arch : x86_64
|
||||||
|
Size : 3.6 M
|
||||||
|
Source : tilix-1.6.4-1.fc26.src.rpm
|
||||||
|
Repo : @System
|
||||||
|
From repo : updates
|
||||||
|
Summary : Tiling terminal emulator
|
||||||
|
URL : https://github.com/gnunn1/tilix
|
||||||
|
License : MPLv2.0 and GPLv3+ and CC-BY-SA
|
||||||
|
Description : Tilix is a tiling terminal emulator with the following features:
|
||||||
|
:
|
||||||
|
: - Layout terminals in any fashion by splitting them horizontally or vertically
|
||||||
|
: - Terminals can be re-arranged using drag and drop both within and between
|
||||||
|
: windows
|
||||||
|
: - Terminals can be detached into a new window via drag and drop
|
||||||
|
: - Input can be synchronized between terminals so commands typed in one
|
||||||
|
: terminal are replicated to the others
|
||||||
|
: - The grouping of terminals can be saved and loaded from disk
|
||||||
|
: - Terminals support custom titles
|
||||||
|
: - Color schemes are stored in files and custom color schemes can be created by
|
||||||
|
: simply creating a new file
|
||||||
|
: - Transparent background
|
||||||
|
: - Supports notifications when processes are completed out of view
|
||||||
|
:
|
||||||
|
: The application was written using GTK 3 and an effort was made to conform to
|
||||||
|
: GNOME Human Interface Guidelines (HIG).
|
||||||
|
```
|
||||||
|
|
||||||
|
`tilix` 包来自 Fedora updates 仓库。
|
||||||
|
|
||||||
|
### 在 openSUSE 系统上我们如何得知安装的包来自哪个仓库?
|
||||||
|
|
||||||
|
Zypper 是一个使用 libzypp 的命令行包管理器。[Zypper 命令][11] 提供了存储库访问、依赖处理、包安装等功能。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ zypper info nano
|
||||||
|
|
||||||
|
Loading repository data...
|
||||||
|
Reading installed packages...
|
||||||
|
|
||||||
|
|
||||||
|
Information for package nano:
|
||||||
|
-----------------------------
|
||||||
|
Repository : Main Repository (OSS)
|
||||||
|
Name : nano
|
||||||
|
Version : 2.4.2-5.3
|
||||||
|
Arch : x86_64
|
||||||
|
Vendor : openSUSE
|
||||||
|
Installed Size : 1017.8 KiB
|
||||||
|
Installed : No
|
||||||
|
Status : not installed
|
||||||
|
Source package : nano-2.4.2-5.3.src
|
||||||
|
Summary : Pico editor clone with enhancements
|
||||||
|
Description :
|
||||||
|
GNU nano is a small and friendly text editor. It aims to emulate
|
||||||
|
the Pico text editor while also offering a few enhancements.
|
||||||
|
```
|
||||||
|
|
||||||
|
`nano` 包来自于 openSUSE Main 仓库(OSS)。
|
||||||
|
|
||||||
|
### 在 ArchLinux 系统上我们如何得知安装的包来自哪个仓库?
|
||||||
|
|
||||||
|
[Pacman 命令][12] 即包管理器工具(package manager utility ),是一个简单的用来安装、构建、删除和管理 Arch Linux 软件包的命令行工具。Pacman 使用 libalpm 作为后端来执行所有的操作。
|
||||||
|
|
||||||
|
```
|
||||||
|
# pacman -Ss chromium
|
||||||
|
extra/chromium 48.0.2564.116-1
|
||||||
|
The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
|
||||||
|
extra/qt5-webengine 5.5.1-9 (qt qt5)
|
||||||
|
Provides support for web applications using the Chromium browser project
|
||||||
|
community/chromium-bsu 0.9.15.1-2
|
||||||
|
A fast paced top scrolling shooter
|
||||||
|
community/chromium-chromevox latest-1
|
||||||
|
Causes the Chromium web browser to automatically install and update the ChromeVox screen reader extention. Note: This
|
||||||
|
package does not contain the extension code.
|
||||||
|
community/fcitx-mozc 2.17.2313.102-1
|
||||||
|
Fcitx Module of A Japanese Input Method for Chromium OS, Windows, Mac and Linux (the Open Source Edition of Google Japanese
|
||||||
|
Input)
|
||||||
|
```
|
||||||
|
|
||||||
|
`chromium` 包来自 ArchLinux extra 仓库。
|
||||||
|
|
||||||
|
或者,我们可以使用以下选项获得关于包的详细信息。
|
||||||
|
|
||||||
|
```
|
||||||
|
# pacman -Si chromium
|
||||||
|
Repository : extra
|
||||||
|
Name : chromium
|
||||||
|
Version : 48.0.2564.116-1
|
||||||
|
Description : The open-source project behind Google Chrome, an attempt at creating a safer, faster, and more stable browser
|
||||||
|
Architecture : x86_64
|
||||||
|
URL : http://www.chromium.org/
|
||||||
|
Licenses : BSD
|
||||||
|
Groups : None
|
||||||
|
Provides : None
|
||||||
|
Depends On : gtk2 nss alsa-lib xdg-utils bzip2 libevent libxss icu libexif libgcrypt ttf-font systemd dbus
|
||||||
|
flac snappy speech-dispatcher pciutils libpulse harfbuzz libsecret libvpx perl perl-file-basedir
|
||||||
|
desktop-file-utils hicolor-icon-theme
|
||||||
|
Optional Deps : kdebase-kdialog: needed for file dialogs in KDE
|
||||||
|
gnome-keyring: for storing passwords in GNOME keyring
|
||||||
|
kwallet: for storing passwords in KWallet
|
||||||
|
Conflicts With : None
|
||||||
|
Replaces : None
|
||||||
|
Download Size : 44.42 MiB
|
||||||
|
Installed Size : 172.44 MiB
|
||||||
|
Packager : Evangelos Foutras
|
||||||
|
Build Date : Fri 19 Feb 2016 04:17:12 AM IST
|
||||||
|
Validated By : MD5 Sum SHA-256 Sum Signature
|
||||||
|
```
|
||||||
|
|
||||||
|
`chromium` 包来自 ArchLinux extra 仓库。
|
||||||
|
|
||||||
|
### 在基于 Debian 的系统上我们如何得知安装的包来自哪个仓库?
|
||||||
|
|
||||||
|
在基于 Debian 的系统例如 Ubuntu、LinuxMint 上可以使用两种方法实现。
|
||||||
|
|
||||||
|
#### 方法-1:使用 apt-cache 命令
|
||||||
|
|
||||||
|
[apt-cache 命令][13] 可以显示存储在 APT 内部数据库的很多信息。这些信息是一种缓存,因为它们是从列在 `source.list` 文件里的不同的源中获得的。这个过程发生在 apt 更新操作期间。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ apt-cache policy python3
|
||||||
|
python3:
|
||||||
|
Installed: 3.6.3-0ubuntu2
|
||||||
|
Candidate: 3.6.3-0ubuntu3
|
||||||
|
Version table:
|
||||||
|
3.6.3-0ubuntu3 500
|
||||||
|
500 http://in.archive.ubuntu.com/ubuntu artful-updates/main amd64 Packages
|
||||||
|
*** 3.6.3-0ubuntu2 500
|
||||||
|
500 http://in.archive.ubuntu.com/ubuntu artful/main amd64 Packages
|
||||||
|
100 /var/lib/dpkg/status
|
||||||
|
```
|
||||||
|
|
||||||
|
`python3` 包来自 Ubuntu updates 仓库。
|
||||||
|
|
||||||
|
#### 方法-2:使用 apt 命令
|
||||||
|
|
||||||
|
[APT 命令][14] 即 “Advanced Packaging Tool”,是 `apt-get` 命令的替代品,就像 DNF 是如何取代 YUM 一样。它是具有丰富功能的命令行工具并将所有的功能例如 `apt-cache`、`apt-search`、`dpkg`、`apt-cdrom`、`apt-config`、`apt-ket` 等包含在一个命令(APT)中,并且还有几个独特的功能。例如我们可以通过 APT 轻松安装 .dpkg 包,但我们不能使用 `apt-get` 命令安装,更多类似的功能都被包含进了 APT 命令。`apt-get` 因缺失了很多未被解决的特性而被 `apt` 取代。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ apt -a show notepadqq
|
||||||
|
Package: notepadqq
|
||||||
|
Version: 1.3.2-1~artful1
|
||||||
|
Priority: optional
|
||||||
|
Section: editors
|
||||||
|
Maintainer: Daniele Di Sarli
|
||||||
|
Installed-Size: 1,352 kB
|
||||||
|
Depends: notepadqq-common (= 1.3.2-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
|
||||||
|
Download-Size: 356 kB
|
||||||
|
APT-Sources: http://ppa.launchpad.net/notepadqq-team/notepadqq/ubuntu artful/main amd64 Packages
|
||||||
|
Description: Notepad++-like editor for Linux
|
||||||
|
Text editor with support for multiple programming
|
||||||
|
languages, multiple encodings and plugin support.
|
||||||
|
|
||||||
|
Package: notepadqq
|
||||||
|
Version: 1.2.0-1~artful1
|
||||||
|
Status: install ok installed
|
||||||
|
Priority: optional
|
||||||
|
Section: editors
|
||||||
|
Maintainer: Daniele Di Sarli
|
||||||
|
Installed-Size: 1,352 kB
|
||||||
|
Depends: notepadqq-common (= 1.2.0-1~artful1), coreutils (>= 8.20), libqt5svg5 (>= 5.2.1), libc6 (>= 2.14), libgcc1 (>= 1:3.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.7.0), libqt5network5 (>= 5.2.1), libqt5printsupport5 (>= 5.2.1), libqt5webkit5 (>= 5.6.0~rc), libqt5widgets5 (>= 5.2.1), libstdc++6 (>= 5.2)
|
||||||
|
Homepage: http://notepadqq.altervista.org
|
||||||
|
Download-Size: unknown
|
||||||
|
APT-Manual-Installed: yes
|
||||||
|
APT-Sources: /var/lib/dpkg/status
|
||||||
|
Description: Notepad++-like editor for Linux
|
||||||
|
Text editor with support for multiple programming
|
||||||
|
languages, multiple encodings and plugin support.
|
||||||
|
```
|
||||||
|
|
||||||
|
`notepadqq` 包来自 Launchpad PPA。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.2daygeek.com/how-do-we-find-out-the-installed-packages-came-from-which-repository/
|
||||||
|
|
||||||
|
作者:[Prakash Subramanian][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[zianglei](https://github.com/zianglei)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.2daygeek.com/author/prakash/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.2daygeek.com/category/repository/
|
||||||
|
[2]: https://www.2daygeek.com/install-enable-epel-repository-on-rhel-centos-scientific-linux-oracle-linux/
|
||||||
|
[3]: https://www.2daygeek.com/install-enable-elrepo-on-rhel-centos-scientific-linux/
|
||||||
|
[4]: https://www.2daygeek.com/additional-yum-repositories-for-centos-rhel-fedora-systems/
|
||||||
|
[5]: https://www.2daygeek.com/install-enable-rpm-fusion-repository-on-centos-fedora-rhel/
|
||||||
|
[6]: https://fedoraproject.org/wiki/Third_party_repositories
|
||||||
|
[7]: https://www.2daygeek.com/install-enable-packman-repository-on-opensuse-leap/
|
||||||
|
[8]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
|
||||||
|
[9]: https://www.2daygeek.com/rpm-command-examples/
|
||||||
|
[10]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
|
||||||
|
[11]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
|
||||||
|
[12]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
|
||||||
|
[13]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
|
||||||
|
[14]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
|
@ -1,10 +1,11 @@
|
|||||||
如何从 Windows OS 7、8 和 10 创建可启动的 Linux USB 盘?
|
如何从 Windows 7、8 和 10 创建可启动的 Linux USB 盘?
|
||||||
======
|
======
|
||||||
|
|
||||||
如果你想了解 Linux,首先要做的是在你的系统上安装 Linux 系统。
|
如果你想了解 Linux,首先要做的是在你的系统上安装 Linux 系统。
|
||||||
|
|
||||||
它可以通过两种方式实现,使用 Virtualbox、VMWare 等虚拟化应用,或者在你的系统上安装 Linux。
|
它可以通过两种方式实现,使用 Virtualbox、VMWare 等虚拟化应用,或者在你的系统上安装 Linux。
|
||||||
|
|
||||||
如果你倾向从 Windows 系统迁移到 Linux 系统或计划在备用机上安装 Linux 系统,那么你须为此创建可启动的 USB 盘。
|
如果你倾向于从 Windows 系统迁移到 Linux 系统或计划在备用机上安装 Linux 系统,那么你须为此创建可启动的 USB 盘。
|
||||||
|
|
||||||
我们已经写过许多[在 Linux 上创建可启动 USB 盘][1] 的文章,如 [BootISO][2]、[Etcher][3] 和 [dd 命令][4],但我们从来没有机会写一篇文章关于在 Windows 中创建 Linux 可启动 USB 盘的文章。不管怎样,我们今天有机会做这件事了。
|
我们已经写过许多[在 Linux 上创建可启动 USB 盘][1] 的文章,如 [BootISO][2]、[Etcher][3] 和 [dd 命令][4],但我们从来没有机会写一篇文章关于在 Windows 中创建 Linux 可启动 USB 盘的文章。不管怎样,我们今天有机会做这件事了。
|
||||||
|
|
||||||
@ -22,29 +23,32 @@
|
|||||||
|
|
||||||
有许多程序可供使用,但我的首选是 [Universal USB Installer][6],它使用起来非常简单。只需访问 Universal USB Installer 页面并下载该程序即可。
|
有许多程序可供使用,但我的首选是 [Universal USB Installer][6],它使用起来非常简单。只需访问 Universal USB Installer 页面并下载该程序即可。
|
||||||
|
|
||||||
### 步骤3:如何使用 Universal USB Installer 创建可启动的 Ubuntu ISO
|
### 步骤3:创建可启动的 Ubuntu ISO
|
||||||
|
|
||||||
这个程序在使用上不复杂。首先连接 USB 盘,然后点击下载的 Universal USB Installer。启动后,你可以看到类似于我们的界面。
|
这个程序在使用上不复杂。首先连接 USB 盘,然后点击下载的 Universal USB Installer。启动后,你可以看到类似于我们的界面。
|
||||||
|
|
||||||
![][8]
|
![][8]
|
||||||
|
|
||||||
* **`步骤 1:`** 选择Ubuntu 系统。
|
* 步骤 1:选择 Ubuntu 系统。
|
||||||
* **`步骤 2:`** 选择 Ubuntu ISO 下载位置。
|
* 步骤 2:选择 Ubuntu ISO 下载位置。
|
||||||
* **`步骤 3:`** 默认它选择的是 USB 盘,但是要验证一下,接着勾选格式化选项。
|
* 步骤 3:它默认选择的是 USB 盘,但是要验证一下,接着勾选格式化选项。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
![][9]
|
![][9]
|
||||||
|
|
||||||
当你点击 `Create` 按钮时,它会弹出一个带有警告的窗口。不用担心,只需点击 `Yes` 继续进行此操作即可。
|
当你点击 “Create” 按钮时,它会弹出一个带有警告的窗口。不用担心,只需点击 “Yes” 继续进行此操作即可。
|
||||||
|
|
||||||
![][10]
|
![][10]
|
||||||
|
|
||||||
USB 盘分区正在进行中。
|
USB 盘分区正在进行中。
|
||||||
|
|
||||||
![][11]
|
![][11]
|
||||||
|
|
||||||
要等待一会儿才能完成。如你您想将它移至后台,你可以点击 `Background` 按钮。
|
要等待一会儿才能完成。如你您想将它移至后台,你可以点击 “Background” 按钮。
|
||||||
|
|
||||||
![][12]
|
![][12]
|
||||||
|
|
||||||
好了,完成了。
|
好了,完成了。
|
||||||
|
|
||||||
![][13]
|
![][13]
|
||||||
|
|
||||||
现在你可以进行[安装 Ubuntu 系统][14]了。但是,它也提供了一个 live 模式,如果你想在安装之前尝试,那么可以使用它。
|
现在你可以进行[安装 Ubuntu 系统][14]了。但是,它也提供了一个 live 模式,如果你想在安装之前尝试,那么可以使用它。
|
||||||
@ -56,7 +60,7 @@ via: https://www.2daygeek.com/create-a-bootable-live-usb-drive-from-windows-usin
|
|||||||
作者:[Prakash Subramanian][a]
|
作者:[Prakash Subramanian][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[geekpi](https://github.com/geekpi)
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -1,35 +1,38 @@
|
|||||||
CPod:一个开源、跨平台播客应用
|
CPod:一个开源、跨平台播客应用
|
||||||
======
|
======
|
||||||
|
|
||||||
播客是一个很好的娱乐和获取信息的方式。事实上,我会听十几个不同的播客,包括技术、神秘事件、历史和喜剧。当然,[Linux 播客][1]也在此列表中。
|
播客是一个很好的娱乐和获取信息的方式。事实上,我会听十几个不同的播客,包括技术、神秘事件、历史和喜剧。当然,[Linux 播客][1]也在此列表中。
|
||||||
|
|
||||||
今天,我们将看一个简单的跨平台应用来收听你的播客。
|
今天,我们将看一个简单的跨平台应用来收听你的播客。
|
||||||
|
|
||||||
![][2]
|
![][2]
|
||||||
推荐的播客和播客搜索
|
|
||||||
|
*推荐的播客和播客搜索*
|
||||||
|
|
||||||
### 应用程序
|
### 应用程序
|
||||||
|
|
||||||
[CPod][3] 是 [Zack Guard(z -----)][4] 的作品。**它是一个 [Election][5] 程序**,这使它能够在最大的操作系统(Linux、Windows、Mac OS)上运行。
|
[CPod][3] 是 [Zack Guard(z-------------)][4] 的作品。**它是一个 [Election][5] 程序**,这使它能够在大多数操作系统(Linux、Windows、Mac OS)上运行。
|
||||||
|
|
||||||
一个小事:CPod 最初被命名为 Cumulonimbus。
|
> 一个小事:CPod 最初被命名为 Cumulonimbus。
|
||||||
|
|
||||||
应用的大部分被两个面板占用,来显示内容和选项。屏幕左侧的小条让你可以使用应用的不同功能。CPod 的不同栏目包括主页、队列、订阅、浏览和设置。
|
应用的大部分被两个面板占用,来显示内容和选项。屏幕左侧的小条让你可以使用应用的不同功能。CPod 的不同栏目包括主页、队列、订阅、浏览和设置。
|
||||||
|
|
||||||
![cpod settings][6]
|
![cpod settings][6]
|
||||||
设置
|
|
||||||
|
*设置*
|
||||||
|
|
||||||
### CPod 的功能
|
### CPod 的功能
|
||||||
|
|
||||||
以下是 CPod 提供的功能列表:
|
以下是 CPod 提供的功能列表:
|
||||||
|
|
||||||
* 简洁,干净的设计
|
* 简洁,干净的设计
|
||||||
* 可在顶级计算机平台上使用
|
* 可在主流计算机平台上使用
|
||||||
* 有 Snap 包
|
* 有 Snap 包
|
||||||
* 搜索 iTunes 的播客目录
|
* 搜索 iTunes 的播客目录
|
||||||
* 下载以及无需下载播放节目
|
* 可下载也可无需下载就播放节目
|
||||||
* 查看播客信息和节目
|
* 查看播客信息和节目
|
||||||
* 搜索播客的个别节目
|
* 搜索播客的个别节目
|
||||||
* 黑暗模式
|
* 深色模式
|
||||||
* 改变播放速度
|
* 改变播放速度
|
||||||
* 键盘快捷键
|
* 键盘快捷键
|
||||||
* 将你的播客订阅与 gpodder.net 同步
|
* 将你的播客订阅与 gpodder.net 同步
|
||||||
@ -39,13 +42,13 @@ CPod:一个开源、跨平台播客应用
|
|||||||
* 多语言支持
|
* 多语言支持
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
![search option in cpod application][7]
|
![search option in cpod application][7]
|
||||||
搜索 ZFS 节目
|
|
||||||
|
*搜索 ZFS 节目*
|
||||||
|
|
||||||
### 在 Linux 上体验 CPod
|
### 在 Linux 上体验 CPod
|
||||||
|
|
||||||
我最后在两个系统上安装了 CPod:ArchLabs 和 Windows。[Arch 用户仓库][8] 中有两个版本的 CPod。但是,它们都已过时,一个是版本 1.14.0,另一个是 1.22.6。最新版本的 CPod 是 1.27.0。由于 ArchLabs 和 Windows 之间的版本差异,我不得已而有不同的体验。在本文中,我将重点关注 1.27.0,因为它是最新且功能最多的。
|
我最后在两个系统上安装了 CPod:ArchLabs 和 Windows。[Arch 用户仓库][8] 中有两个版本的 CPod。但是,它们都已过时,一个是版本 1.14.0,另一个是 1.22.6。最新版本的 CPod 是 1.27.0。由于 ArchLabs 和 Windows 之间的版本差异,我的体验有所不同。在本文中,我将重点关注 1.27.0,因为它是最新且功能最多的。
|
||||||
|
|
||||||
我马上能够找到我最喜欢的播客。我可以粘贴 RSS 源的 URL 来添加 iTunes 列表中没有的那些播客。
|
我马上能够找到我最喜欢的播客。我可以粘贴 RSS 源的 URL 来添加 iTunes 列表中没有的那些播客。
|
||||||
|
|
||||||
@ -55,7 +58,7 @@ CPod:一个开源、跨平台播客应用
|
|||||||
|
|
||||||
### 安装 CPod
|
### 安装 CPod
|
||||||
|
|
||||||
在 [GitHub][11]上,你可以下载适用于 Linux 的 AppImage 或 Deb 文件,适用于 Windows 的 .exe 文件或适用于 Mac OS 的 .dmg 文件。
|
在 [GitHub][11] 上,你可以下载适用于 Linux 的 AppImage 或 Deb 文件,适用于 Windows 的 .exe 文件或适用于 Mac OS 的 .dmg 文件。
|
||||||
|
|
||||||
你可以使用 [Snap][12] 安装 CPod。你需要做的就是使用以下命令:
|
你可以使用 [Snap][12] 安装 CPod。你需要做的就是使用以下命令:
|
||||||
|
|
||||||
@ -63,14 +66,15 @@ CPod:一个开源、跨平台播客应用
|
|||||||
sudo snap install cpod
|
sudo snap install cpod
|
||||||
```
|
```
|
||||||
|
|
||||||
就像我之前说的那样,CPod 的 [Arch 用户仓库][8]的版本已经过时了。我已经给其中一个打包者发了消息。如果你使用 Arch(或基于 Arch 的发行版),我建议你这样做。
|
就像我之前说的那样,CPod 的 [Arch 用户仓库][8]的版本已经过时了。我已经给其中一个打包者发了消息。如果你使用 Arch(或基于 Arch 的发行版),我建议你这样做。
|
||||||
|
|
||||||
![cpod for Linux pidcasts][13]
|
![cpod for Linux pidcasts][13]
|
||||||
播放其中一个我最喜欢的播客
|
|
||||||
|
*播放其中一个我最喜欢的播客*
|
||||||
|
|
||||||
### 最后的想法
|
### 最后的想法
|
||||||
|
|
||||||
总的来说,我喜欢 CPod。它外观漂亮,使用简单。事实上,我更喜欢原来的名字 (Cumulonimbus),但是它有点拗口。
|
总的来说,我喜欢 CPod。它外观漂亮,使用简单。事实上,我更喜欢原来的名字(Cumulonimbus),但是它有点拗口。
|
||||||
|
|
||||||
我刚刚在程序中遇到两个问题。首先,我希望每个播客都有评分。其次,在打开黑暗模式后,根据长度、日期、下载状态和播放进度对剧集进行排序的菜单不起作用。
|
我刚刚在程序中遇到两个问题。首先,我希望每个播客都有评分。其次,在打开黑暗模式后,根据长度、日期、下载状态和播放进度对剧集进行排序的菜单不起作用。
|
||||||
|
|
||||||
@ -85,23 +89,23 @@ via: https://itsfoss.com/cpod-podcast-app/
|
|||||||
作者:[John Paul][a]
|
作者:[John Paul][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[geekpi](https://github.com/geekpi)
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
[a]: https://itsfoss.com/author/john/
|
[a]: https://itsfoss.com/author/john/
|
||||||
[b]: https://github.com/lujun9972
|
[b]: https://github.com/lujun9972
|
||||||
[1]: https://itsfoss.com/linux-podcasts/
|
[1]: https://itsfoss.com/linux-podcasts/
|
||||||
[2]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod1.1.jpg
|
[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod1.1.jpg?w=800&ssl=1
|
||||||
[3]: https://github.com/z-------------/CPod
|
[3]: https://github.com/z-------------/CPod
|
||||||
[4]: https://github.com/z-------------
|
[4]: https://github.com/z-------------
|
||||||
[5]: https://electronjs.org/
|
[5]: https://electronjs.org/
|
||||||
[6]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod2.1.png
|
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod2.1.png?w=800&ssl=1
|
||||||
[7]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod4.1.jpg
|
[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod4.1.jpg?w=800&ssl=1
|
||||||
[8]: https://aur.archlinux.org/packages/?O=0&K=cpod
|
[8]: https://aur.archlinux.org/packages/?O=0&K=cpod
|
||||||
[9]: https://latenightlinux.com/
|
[9]: https://latenightlinux.com/
|
||||||
[10]: https://itsfoss.com/what-is-zfs/
|
[10]: https://itsfoss.com/what-is-zfs/
|
||||||
[11]: https://github.com/z-------------/CPod/releases
|
[11]: https://github.com/z-------------/CPod/releases
|
||||||
[12]: https://snapcraft.io/cumulonimbus
|
[12]: https://snapcraft.io/cumulonimbus
|
||||||
[13]: https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/10/cpod3.1.jpg
|
[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/10/cpod3.1.jpg?w=800&ssl=1
|
||||||
[14]: http://reddit.com/r/linuxusersgroup
|
[14]: http://reddit.com/r/linuxusersgroup
|
@ -1,24 +1,24 @@
|
|||||||
命令行快捷提示:如何定位一个文件
|
命令行快速技巧:如何定位一个文件
|
||||||
======
|
======
|
||||||
|
|
||||||
![](https://fedoramagazine.org/wp-content/uploads/2018/10/commandlinequicktips-816x345.jpg)
|
![](https://fedoramagazine.org/wp-content/uploads/2018/10/commandlinequicktips-816x345.jpg)
|
||||||
|
|
||||||
我们都会有文件存储在电脑里 —— 目录,相片,源代码等等。它们是如此之多。也无疑超出了我的记忆范围。要是毫无目标,找到正确的那一个可能会很费时间。在这篇文章里我们来看一下如何在命令行里找到需要的文件,特别是快速找到你想要的那一个。
|
我们都会有文件存储在电脑里 —— 目录、相片、源代码等等。它们是如此之多。也无疑超出了我的记忆范围。要是毫无目标,找到正确的那一个可能会很费时间。在这篇文章里我们来看一下如何在命令行里找到需要的文件,特别是快速找到你想要的那一个。
|
||||||
|
|
||||||
好消息是 Linux 命令行专门设计了很多非常有用的命令行工具在你的电脑上查找文件。下面我们看一下它们其中三个:ls、tree 和 tree。
|
好消息是 Linux 命令行专门设计了很多非常有用的命令行工具在你的电脑上查找文件。下面我们看一下它们其中三个:`ls`、`tree` 和 `find`。
|
||||||
|
|
||||||
### ls
|
### ls
|
||||||
|
|
||||||
如果你知道文件在哪里,你只需要列出它们或者查看有关它们的信息,ls 就是为此而生的。
|
如果你知道文件在哪里,你只需要列出它们或者查看有关它们的信息,`ls` 就是为此而生的。
|
||||||
|
|
||||||
只需运行 ls 就可以列出当下目录中所有可见的文件和目录:
|
只需运行 `ls` 就可以列出当下目录中所有可见的文件和目录:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ls
|
$ ls
|
||||||
Documents Music Pictures Videos notes.txt
|
Documents Music Pictures Videos notes.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
添加 **-l** 选项可以查看文件的相关信息。同时再加上 **-h** 选项,就可以用一种人们易读的格式查看文件的大小:
|
添加 `-l` 选项可以查看文件的相关信息。同时再加上 `-h` 选项,就可以用一种人们易读的格式查看文件的大小:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ls -lh
|
$ ls -lh
|
||||||
@ -30,7 +30,7 @@ drwxr-xr-x 2 adam adam 4.0K Nov 2 13:07 Videos
|
|||||||
-rw-r--r-- 1 adam adam 43K Nov 2 13:12 notes.txt
|
-rw-r--r-- 1 adam adam 43K Nov 2 13:12 notes.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
**ls** 也可以搜索一个指定位置:
|
`ls` 也可以搜索一个指定位置:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ls Pictures/
|
$ ls Pictures/
|
||||||
@ -44,7 +44,7 @@ $ ls *.txt
|
|||||||
notes.txt
|
notes.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
少了点什么?想要查看一个隐藏文件?没问题,使用 **-a** 选项:
|
少了点什么?想要查看一个隐藏文件?没问题,使用 `-a` 选项:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ls -a
|
$ ls -a
|
||||||
@ -52,7 +52,7 @@ $ ls -a
|
|||||||
.. .bash_profile .vimrc Music Videos
|
.. .bash_profile .vimrc Music Videos
|
||||||
```
|
```
|
||||||
|
|
||||||
**ls** 还有很多其他有用的选项,你可以把它们组合在一起获得你想要的效果。可以使用以下命令了解更多:
|
`ls` 还有很多其他有用的选项,你可以把它们组合在一起获得你想要的效果。可以使用以下命令了解更多:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ man ls
|
$ man ls
|
||||||
@ -60,13 +60,13 @@ $ man ls
|
|||||||
|
|
||||||
### tree
|
### tree
|
||||||
|
|
||||||
如果你想查看你的文件的树状结构,tree 是一个不错的选择。可能你的系统上没有默认安装它,你可以使用包管理 DNF 手动安装:
|
如果你想查看你的文件的树状结构,`tree` 是一个不错的选择。可能你的系统上没有默认安装它,你可以使用包管理 DNF 手动安装:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo dnf install tree
|
$ sudo dnf install tree
|
||||||
```
|
```
|
||||||
|
|
||||||
如果不带任何选项或者参数地运行 tree,将会以当前目录开始,显示出包含其下所有目录和文件的一个树状图。提醒一下,这个输出可能会非常大,因为它包含了这个目录下的所有目录和文件:
|
如果不带任何选项或者参数地运行 `tree`,将会以当前目录开始,显示出包含其下所有目录和文件的一个树状图。提醒一下,这个输出可能会非常大,因为它包含了这个目录下的所有目录和文件:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ tree
|
$ tree
|
||||||
@ -89,7 +89,7 @@ $ tree
|
|||||||
`-- notes.txt
|
`-- notes.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
如果列出的太多了,使用 -L 选项,并在其后加上你想查看的层级数,可以限制列出文件的层级:
|
如果列出的太多了,使用 `-L` 选项,并在其后加上你想查看的层级数,可以限制列出文件的层级:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ tree -L 2
|
$ tree -L 2
|
||||||
@ -118,13 +118,13 @@ Documents/work/
|
|||||||
`-- status-reports.txt
|
`-- status-reports.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
如果使用 tree 列出的是一个很大的树状图,你可以把它跟 less 组合使用:
|
如果使用 `tree` 列出的是一个很大的树状图,你可以把它跟 `less` 组合使用:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ tree | less
|
$ tree | less
|
||||||
```
|
```
|
||||||
|
|
||||||
再一次,tree 有很多其他的选项可以使用,你可以把他们组合在一起发挥更强大的作用。man 手册页有所有这些选项:
|
再一次,`tree` 有很多其他的选项可以使用,你可以把他们组合在一起发挥更强大的作用。man 手册页有所有这些选项:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ man tree
|
$ man tree
|
||||||
@ -134,13 +134,13 @@ $ man tree
|
|||||||
|
|
||||||
那么如果不知道文件在哪里呢?就让我们来找到它们吧!
|
那么如果不知道文件在哪里呢?就让我们来找到它们吧!
|
||||||
|
|
||||||
要是你的系统中没有 find,你可以使用 DNF 安装它:
|
要是你的系统中没有 `find`,你可以使用 DNF 安装它:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo dnf install findutils
|
$ sudo dnf install findutils
|
||||||
```
|
```
|
||||||
|
|
||||||
运行 find 时如果没有添加任何选项或者参数,它将会递归列出当前目录下的所有文件和目录。
|
运行 `find` 时如果没有添加任何选项或者参数,它将会递归列出当前目录下的所有文件和目录。
|
||||||
|
|
||||||
```
|
```
|
||||||
$ find
|
$ find
|
||||||
@ -167,7 +167,7 @@ $ find
|
|||||||
./Music
|
./Music
|
||||||
```
|
```
|
||||||
|
|
||||||
但是 find 真正强大的是你可以使用文件名进行搜索:
|
但是 `find` 真正强大的是你可以使用文件名进行搜索:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ find -name do-things.sh
|
$ find -name do-things.sh
|
||||||
@ -184,6 +184,7 @@ $ find -name "*.txt"
|
|||||||
./Documents/work/project-abc/project-notes.txt
|
./Documents/work/project-abc/project-notes.txt
|
||||||
./notes.txt
|
./notes.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
你也可以根据大小寻找文件。如果你的空间不足的时候,这种方法也许特别有用。现在来列出所有大于 1 MB 的文件:
|
你也可以根据大小寻找文件。如果你的空间不足的时候,这种方法也许特别有用。现在来列出所有大于 1 MB 的文件:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -207,7 +208,7 @@ $ find Documents -name "*project*" -type f
|
|||||||
Documents/work/project-abc/project-notes.txt
|
Documents/work/project-abc/project-notes.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
最后再一次,find 还有很多供你使用的选项,要是你想使用它们,man 手册页绝对可以帮到你:
|
最后再一次,`find` 还有很多供你使用的选项,要是你想使用它们,man 手册页绝对可以帮到你:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ man find
|
$ man find
|
||||||
@ -220,7 +221,7 @@ via: https://fedoramagazine.org/commandline-quick-tips-locate-file/
|
|||||||
作者:[Adam Šamalík][a]
|
作者:[Adam Šamalík][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[dianbanjiu](https://github.com/dianbanjiu)
|
译者:[dianbanjiu](https://github.com/dianbanjiu)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -1,67 +1,65 @@
|
|||||||
2018 重温 Unix 哲学
|
2018 重温 Unix 哲学
|
||||||
======
|
======
|
||||||
在现代微服务环境中,构建小型,集中应用程序的旧策略又再一次流行了起来。
|
> 在现代微服务环境中,构建小型、单一的应用程序的旧策略又再一次流行了起来。
|
||||||
|
|
||||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_data.png?itok=RH6NA32X)
|
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_data.png?itok=RH6NA32X)
|
||||||
|
|
||||||
1984年,Rob Pike 和 Brian W 在 AT&T 贝尔实验室技术期刊上发表了名为 “[Unix 环境编程][1]” 的文章,其中他们使用 BSD 的 **cat -v** 例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型,单一的应用程序——不管用什么语言——只做一件小而美的事情,用 **stdin** / **stdout** 进行通信,并通过管道进行连接。
|
1984 年,Rob Pike 和 Brian W. Kernighan 在 AT&T 贝尔实验室技术期刊上发表了名为 “[Unix 环境编程][1]” 的文章,其中他们使用 BSD 的 `cat -v` 例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型、单一的应用程序 —— 不管用什么语言 —— 只做一件小而美的事情,用 `stdin` / `stdout` 进行通信,并通过管道进行连接。
|
||||||
|
|
||||||
听起来是不是有点耳熟?
|
听起来是不是有点耳熟?
|
||||||
|
|
||||||
是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的 [微服务的定义][2] 。
|
是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的 [微服务的定义][2] 。
|
||||||
|
|
||||||
> 简单来说,微服务架构的风格是将应用程序开发为一套单一,小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。
|
> 简单来说,微服务架构的风格是将单个 应用程序开发为一套小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。
|
||||||
|
|
||||||
虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有趣,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。
|
虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有用,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。
|
||||||
|
|
||||||
### *nix程序 vs 微服务
|
### *nix程序 vs 微服务
|
||||||
|
|
||||||
下面的表格对比了 *nix 环境中的程序(例如 **cat** 或 **lsof**)与微服务环境中的程序。
|
下面的表格对比了 *nix 环境中的程序(例如 `cat` 或 `lsof`)与微服务环境中的程序。
|
||||||
|
|
||||||
| | *nix 程序 | 微服务 |
|
| | *nix 程序 | 微服务 |
|
||||||
| ----------------------------------- | -------------------------- | ---------------------------------- |
|
| ------------- | ------------------------- | ----------------------- |
|
||||||
| 执行单元 | 程序使用 `stdin/stdout` | 使用 HTTP 或 gRPC API |
|
| 执行单元 | 程序使用 `stdin`/`stdout` | 使用 HTTP 或 gRPC API |
|
||||||
| 数据流 | 管道 | ? |
|
| 数据流 | 管道 | ? |
|
||||||
| 可配置和参数化 | 命令行参数 | |
|
| 可配置和参数化 | 命令行参数、环境变量和配置文件 | JSON/YAML 文档 |
|
||||||
| 环境变量和配置文件 | JSON/YAML 文档 | |
|
| 发现 | 包管理器、man、make | DNS、环境变量、OpenAPI |
|
||||||
| 发现 | 包管理器, man, make | DNS, 环境变量, OpenAPI |
|
|
||||||
|
|
||||||
让我们详细的看看每一行。
|
让我们详细的看看每一行。
|
||||||
|
|
||||||
#### 执行单元
|
#### 执行单元
|
||||||
|
|
||||||
*nix 系统(像 Linux)中的执行单元是一个可执行的文件(二进制或者是脚本),理想情况下,它们从 `stdin` 读取输入并将输出写入 `stdout`。而微服务通过暴露一个或多个通信接口来提供服务,比如 HTTP 和 gRPC APIs。在这两种情况下,你都会发现无状态示例(本质上是纯函数行为)和有状态示例,除了输入之外,还有一些内部(持久)状态决定发生了什么。
|
*nix 系统(如 Linux)中的执行单元是一个可执行的文件(二进制或者是脚本),理想情况下,它们从 `stdin` 读取输入并将输出写入 `stdout`。而微服务通过暴露一个或多个通信接口来提供服务,比如 HTTP 和 gRPC API。在这两种情况下,你都会发现无状态示例(本质上是纯函数行为)和有状态示例,除了输入之外,还有一些内部(持久)状态决定发生了什么。
|
||||||
|
|
||||||
#### 数据流
|
#### 数据流
|
||||||
|
|
||||||
传统的,*nix 程序能够通过管道进行通信。换名话说,我们要感谢 [Doug McIlroy][3],你不需要创建临时文件来传递,而可以在每个进程之间处理无穷无尽的数据流。据我所知,除了 [2017 年做的基于 `Apache Kafka` 小实验][4],没有什么能比得上管道化的微服务了。
|
传统的,*nix 程序能够通过管道进行通信。换句话说,我们要感谢 [Doug McIlroy][3],你不需要创建临时文件来传递,而可以在每个进程之间处理无穷无尽的数据流。据我所知,除了我在 [2017 年做的基于 Apache Kafka 小实验][4],没有什么能比得上管道化的微服务了。
|
||||||
|
|
||||||
#### 可配置和参数化
|
#### 可配置和参数化
|
||||||
|
|
||||||
你是如何配置程序或者服务的,无论是永久性的服务还是即时的服务?是的,在 *nix 系统上,你通常有三种方法:命令行参数,环境变量,或全面化的配置文件。在微服务架构中,典型的做法是用 YAML ( 或者甚至是worse,JSON ) 文档,定制好一个服务的布局和配置以及依赖的组件和通信,存储,和运行时配置。例如 [ Kubernetes 资源定义][5],[Nomad 工作规范][6],或 [Docker 组件][7] 文档。这些可能参数化也可能不参数化;也就是说,除非你知道一些模板语言,像 Kubernetes 中的 [Helm][8],否则你会发现你使用了很多 **sed -i** 这样的命令。
|
你是如何配置程序或者服务的,无论是永久性的服务还是即时的服务?是的,在 *nix 系统上,你通常有三种方法:命令行参数、环境变量,或全面的配置文件。在微服务架构中,典型的做法是用 YAML(或者甚至是 JSON)文档,定制好一个服务的布局和配置以及依赖的组件和通信、存储和运行时配置。例如 [Kubernetes 资源定义][5]、[Nomad 工作规范][6] 或 [Docker 编排][7] 文档。这些可能参数化也可能不参数化;也就是说,除非你知道一些模板语言,像 Kubernetes 中的 [Helm][8],否则你会发现你使用了很多 `sed -i` 这样的命令。
|
||||||
|
|
||||||
#### 发现
|
#### 发现
|
||||||
|
|
||||||
你怎么知道有哪些程序和服务可用,以及如何使用它们?在 *nix 系统中通常都有一个包管理器和一个很好用的 man 页面;使用他们,应该能够回答你所有的问题。在微服务的设置中,在寻找一个服务的时候会相对更自动化一些。除了像 [Airbnb 的 SmartStack][9] 或 [Netflix 的 Eureka][10] 等可以定制以外,通常还有基于环境变量或基于 DNS 的[方法][11],允许您动态的发现服务。同样重要的是,事实上 [OpenAPI][12] 为 HTTP API 提供了一套标准文档和设计模式,[gRPC][13] 为一些耦合性强的高性能项目也做了同样的事情。最后非常重要的一点是,考虑到开发人员的经验(DX),应该从写一份好的 [Makefiles][14] 开始,并以编写符合 [**风格**][15] 的文档结束。
|
你怎么知道有哪些程序和服务可用,以及如何使用它们?在 *nix 系统中通常都有一个包管理器和一个很好用的 man 页面;使用它们,应该能够回答你所有的问题。在微服务的设置中,在寻找一个服务的时候会相对更自动化一些。除了像 [Airbnb 的 SmartStack][9] 或 [Netflix 的 Eureka][10] 等可以定制以外,通常还有基于环境变量或基于 DNS 的[方法][11],允许您动态的发现服务。同样重要的是,事实上 [OpenAPI][12] 为 HTTP API 提供了一套标准文档和设计模式,[gRPC][13] 为一些耦合性强的高性能项目也做了同样的事情。最后非常重要的一点是,考虑到开发者经验(DX),应该从写一份好的 [Makefile][14] 开始,并以编写符合 [风格][15] 的文档结束。
|
||||||
|
|
||||||
### 优点和缺点
|
### 优点和缺点
|
||||||
|
|
||||||
*nix 系统和微服务都提供了许多挑战和机遇
|
*nix 系统和微服务都提供了许多挑战和机遇。
|
||||||
|
|
||||||
#### 模块性
|
#### 模块性
|
||||||
|
|
||||||
设计一个简洁,有清晰的目的并且能够很好的和其它模块配合是很困难的。甚至是在不同版本中实现并引入相应的异常处理流程都很困难的。在微服务中,这意味着重试逻辑和超时机制,或者将这些功能外包到服务网格( service mesh )是不是一个更好的选择呢?这确实比较难,可如果你做好了,那它的可重用性是巨大的。
|
要设计一个简洁、有清晰的目的,并且能够很好地和其它模块配合的某个东西是很困难的。甚至是在不同版本中实现并引入相应的异常处理流程都很困难的。在微服务中,这意味着重试逻辑和超时机制,或者将这些功能外包到<ruby>服务网格<rt>service mesh</rt></ruby>是不是一个更好的选择呢?这确实比较难,可如果你做好了,那它的可重用性是巨大的。
|
||||||
|
|
||||||
#### Observability
|
#### 可观测性
|
||||||
|
|
||||||
#### 预测
|
在一个<ruby>独石<rt>monolith</rt></ruby>(2018 年)或是一个试图做任何事情的大型程序(1984 年),当情况恶化的时候,应当能够直接的找到问题的根源。但是在一个
|
||||||
|
|
||||||
在一个巨型(2018年)或是一个试图做任何事情的大型程序(1984)年,当事情开始变坏的时候,应当能够直接的找到问题的根源。但是在一个
|
|
||||||
|
|
||||||
```
|
```
|
||||||
yes | tr \\n x | head -c 450m | grep n
|
yes | tr \\n x | head -c 450m | grep n
|
||||||
```
|
```
|
||||||
|
|
||||||
或者在一个微服务设置中请求一个路径,例如,涉及20个服务,你怎么弄清楚是哪个服务的问题?幸运的是,我们有很多标准,特别是 [OpenCensus][16] 和 [OpenTracing][17]。如果您希望转向微服务,可预测性仍然可能是最大的问题。
|
或者在一个微服务设置中请求一个路径,例如,涉及 20 个服务,你怎么弄清楚是哪个服务的问题?幸运的是,我们有很多标准,特别是 [OpenCensus][16] 和 [OpenTracing][17]。如果您希望转向微服务,可预测性仍然可能是最大的问题。
|
||||||
|
|
||||||
#### 全局状态
|
#### 全局状态
|
||||||
|
|
||||||
@ -77,8 +75,8 @@ via: https://opensource.com/article/18/11/revisiting-unix-philosophy-2018
|
|||||||
|
|
||||||
作者:[Michael Hausenblas][a]
|
作者:[Michael Hausenblas][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[Jamkr](https://github.com/Jamkr)
|
译者:[Jamskr](https://github.com/Jamskr)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user