Merge pull request #2 from LCTT/master

Update from LCTT
This commit is contained in:
jx.zeng 2022-11-29 05:39:03 +08:00 committed by GitHub
commit 5626611e1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3777 changed files with 402972 additions and 180319 deletions

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1 @@
blank_issues_enabled: true

18
.github/ISSUE_TEMPLATE/questions.yml vendored Normal file
View File

@ -0,0 +1,18 @@
name: Ask Questions | 提问
description: Please describe your problem. | 请描述您的问题。
labels: ["question"]
assignees: []
body:
- type: markdown
attributes:
value: |
Please answer these questions before you submit the desired feature. | 请在您提交期望的功能之前,回答以下这些问题
- type: textarea
attributes:
label: Your Questions
description: Please describe your problem. | 请描述您的问题。
placeholder: I have a question...
validations:
required: true

67
.github/ISSUE_TEMPLATE/topics.yml vendored Normal file
View File

@ -0,0 +1,67 @@
name: 推荐选题
description: 推荐一个选题
title: "[推荐类型] 文章日期 文章标题"
labels: []
assignees:
- lkxed
body:
- type: markdown
attributes:
value: |
标题请使用 **`[推荐类型] 文章日期 文章标题`** 格式,选题类型、文章日期和文章标题中间有一个 **空格**。
完整示例:
- [推荐选题] 20220823 The Lost Art of the Makefile
- [推荐选题] 20220905 Linus Torvalds Uses Apple MacBook Hardware to Release Linux Kernel 5.19
- type: input
id: url
attributes:
label: 原文链接地址
description: 填写原文章的链接地址
placeholder: https://......
validations:
required: true
- type: dropdown
id: terms
attributes:
label: 版权协议
description: 填写原文章的版权协议
multiple: false
options:
- CC-SA-BY
- 其它公域许可证
- 已获取作者授权
validations:
required: true
- type: dropdown
id: difficulty
attributes:
label: 文章难度
description: 选择文章的难度
multiple: false
options:
- 困难
- 一般
- 容易
validations:
required: true
- type: dropdown
id: category
attributes:
label: 文章分类
description: 选择文章的分类
multiple: false
options:
- 新闻news
- 观点talk
- 技术tech
validations:
required: true
- type: textarea
id: reason
attributes:
label: 推荐理由
description: 填写你的推荐理由
placeholder:
validations:
required: false

View File

@ -0,0 +1,27 @@
name: LCTT Article Badge
on:
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: checkout old pages branch
uses: actions/checkout@v2
with:
repository: lctt/translateproject
path: build
ref: gh-pages
- name: remove pages .git
run: rm -rf ./build/.git
- name: run badge
run: sh ./scripts/badge.sh;
- uses: crazy-max/ghaction-github-pages@v2.2.0
with:
build_dir: ./build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -0,0 +1,18 @@
name: LCTT Article Checker
on:
pull_request:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
env:
PULL_REQUEST_ID: ${{ github.event.number }}
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: "checkout master branch & return to pull request branch"
run: CURRENT=$(echo ${{github.ref}} | sed "s|refs/|refs/remotes/|") && git checkout master && git checkout $CURRENT
- name: run check
run: sh ./scripts/check.sh;

View File

@ -0,0 +1,28 @@
name: LCTT Article Status
on:
schedule:
- cron: "*/30 * * * *"
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: checkout old pages branch
uses: actions/checkout@v2
with:
repository: lctt/translateproject
path: build
ref: gh-pages
- name: remove pages .git
run: rm -rf ./build/.git
- name: run status
run: sh ./scripts/status.sh;
- uses: crazy-max/ghaction-github-pages@v2.2.0
with:
build_dir: ./build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,27 +0,0 @@
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:
- 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then sh ./scripts/check.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:
only:
- master
# - status
except:
- gh-pages
git:
submodules: false
depth: false
deploy:
provider: pages
skip_cleanup: true
github_token: $GITHUB_TOKEN
local_dir: build
on:
branch:
- master
# - status

64
lctt2020.md Normal file
View File

@ -0,0 +1,64 @@
# Linux 中国旗下贡献者组织 LCTT 七年回顾和展望
> 这是一篇 LCTT 七周年的纪念文章,也是 LCTT 承前启后的一个里程碑。
### 写在 LCTT 七年之际
在 7 年前的今天,我并没有想到,在一个偶然的机会下诞生的 LCTT它能走过这么长的时间留下这么多的印痕。是的一些老朋友或许记得LCTT 这个 Linux 中国旗下的最主要的开源活动/组成部分,最初只是我发心想完善 man 的中文翻译而产生的副产品。结果man 中文翻译项目没有做成,而 LCTT 却持续地运营了下来。
虽然,这些年 LCTT 屡有改进和完善但是总体来说还是相对保守。当然LCTT 这些年已经陆续有 400 多位贡献者实质性的参与了贡献,并在此基础上创建了几个 SIG特别兴趣小组如[红帽代码英雄 SIG](https://linux.cn/article-12436-1.html)、漫画 SIG、LFS SIG 等。
作为回顾,我来介绍一下 LCTT 这 7 年间在主项目TranslateProject上取得的成就
- 贡献者: [435 位](https://linux.cn/lctt-list)
- 翻译文章:[5687 篇](https://linux.cn/)
- GitHub 提交:[54629 次](https://github.com/LCTT/TranslateProject)
- GitHub 拉取请求:[19243 次](https://github.com/LCTT/TranslateProject/pulls)
这是 LCTT 主项目的提交图:
![](https://postimg.aliavv.com/mbp/uglsc.png)
这其中,[钻石级的贡献者有 5 名,五星级贡献者有 6 名13 位 4 星贡献者](https://linux.cn/lctt-list)。那么,请让我来用一段视频展示一下 LCTT 七年来的历程:
![](https://img.linux.net.cn/static/video/LCTT%207%20Years.mp4)
当然,整体的贡献水平呈现长尾分布,大部分贡献者浅尝辄止,我想除了贡献者存在着体验的心态之外,也与 LCTT 没有建立起来合适的社区引导和激励机制有关。此外,就开源社区/开源项目而言,我们也存在一些不足,比如,按 GitHub 建议,我们在如下社区建设方面还缺乏:
- 社区行为准则
- 贡献指南
- 议题模板
- 拉取请求模板
因此,在写这篇文章时,我也要宣布一件事,就是我会逐渐淡出 LCTT 的日常管理,改组 LCTT 管理团队,将更多未来的可能交给社区成员来建设,也希望新的社区管理团队可以为 LCTT 创造出一个不同的明天。
以下,请我们的 Linux 中国的核心合伙人 Bestony 来介绍一下今后 LCTT 的发展计划。
---
大家好,我是 Bestony感谢老王数年来的坚持不懈的投入正是有老王的坚守才能有我们如今的成就。在接下来的时间里我将会帮助老王更好的运作 LCTT让老王可以喘口气也为 LCTT 带来一些新的气象。
在过去的七年里,我们 LCTT 做了很多事情,我们翻译了数千篇文章,有数百位技能精湛的贡献者。如今,到了 7 年的这个节点上,我也在思考,我们下一步应该怎么走。
其实在过去的一年里LCTT 的问题在不断的浮现:选题方向单一、译者进入门槛较高、大家翻译的质量水平参差不齐、校对的人手不足、译稿外发的反馈不足,这些问题都是我们在过去遇见,但一直没有足够的精力和人力来解决的问题。不过,如今我将加入到 LCTT 的管理团队中,配合老王,一起一个个的解决这些过去遇见的问题。
![](https://postimg.aliavv.com/mbp/3kfwy.png)
对于这些问题,有一些我们已经在解决,比如“**选题方向单一**”在今年的年初LCTT 与红帽公司RedHat[联合建立了 LCRH SIG](https://linux.cn/article-12436-1.html),面向红帽旗下的原创播客《<ruby>[代码英雄](https://www.redhat.com/en/command-line-heroes) <rt>Command Line Heroes</rt></ruby>》进行定向的翻译,目前,第一季度的翻译成功已经全部在 Linux 中国公众号上发布,而第二、三季度的内容,也正在不断的发布过程中。
![](https://postimg.aliavv.com/mbp/71eup.png)
LCTT - SIG 将是后续的新的发展方向。**我们将会在保留 LCTT 主体的基础上,鼓励各位译者探索更多的兴趣方向,通过建立起不同的 SIG引入更多的翻译内容来帮助大家更好的达成自己想要的翻译目标。** 并且,通过 LCTT 的技术和经验,赋能每一位译者,帮助译者更好的学习、了解各种不同领域的知识。
而在“**进入门槛较高**”方面,一直以来 Github 的访问慢问题、Git 的概念不熟悉等问题,都是困扰不少新同学的点。而也正是这些点,在不断制约着 LCTT 的发展。在将来,我希望 LCTT 可以打造出自己的翻译工具(也将会为之而奋斗),通过工具辅助的方式,帮助更多人走上翻译的道路,让更多的爱好者们,可以为中文的技术环境贡献一份力。
![](https://postimg.aliavv.com/mbp/8183e.png)
后续,我们将会引入翻译工具、自建关键词表、多轮校对手段等方案,帮助更多的译者完成自己的翻译文章,通过翻译,学到自己想要的知识。
当然,问题并不止我点出来的这些,我们能发展到今天,一定有很多做对了的地方,但同样,我们也有做错了的地方。欢迎你随时联系我,讨论你对于 LCTT 下一步的想法,我相信,你的意见能够帮助 LCTT 变得更好。
![](https://postimg.aliavv.com/mbp/aq5m9.png)
最后,**千里之行,始于足下**,刚刚走过 7 年的 LCTT 希望我们可以在下一个七年,再次相遇。

42
lctt2022.md Normal file
View File

@ -0,0 +1,42 @@
开源贡献者翻译组 LCTT 九岁啦
======
九年前,也是这个上午,我创建了 LCTT 及其第一个项目 [TranslateProject](https://github.com/LCTT/TranslateProject/)。从最初只是有感于 Unix/Linux 上的中文手册页实在太糟糕,希望做一些事情;到最后变成了一个以翻译国外各个开源社区的技术文章和开源资讯/讨论的“流水”式项目LCTT 已经走过了令我自己都非常吃惊的九年。
人的一生几十年而已能在一件事上持续投入九年时光这是我从未想过的事情。驻足回望LCTT 其实并没有完成我最初的想法,这是缺憾;但是 LCTT 就这样变成了另外一种并非在我计划中的样子或许也有其必然性。现在看来LCTT 做了一些事情,也有一些存在的意义。我试着总结一下:
LCTT 的主项目 TranslateProject选题广泛参与门槛低从某种意义上为初识开源的小伙伴提供一种成为开源贡献者的方式。一些人就是通过这个项目迈出了成为开源贡献者的第一步并在日后的学习和工作中成为了开源爱好者、专业技术人员。
LCTT 持续翻译了数千篇(截至今日,已经翻译发布了 6395 篇文章),这些文章的专业程度横跨了入门到精通等不同难度,内容方向涉猎了开发、运维、使用和文化等各个方面。虽然,有些文章仅堪一读,但也有不少文章值得收藏、一再细读。我屡屡能从读者那里得到反馈,这些文章对他们提供了很大的帮助,我想这就是 LCTT 的存世价值之一吧。唯独可惜的是,这些文章,没有以很好的方式组织起来,甚憾。
LCTT 有数百成员(截至今日,成功地在仓库中进行了贡献的贡献者有 311 位),他们的年龄不等,最年轻的有初中的学生、最老的,嗯这个不需要说了;他们的职业各异,比较多的是大学生,也有很多从事技术工作的专业人员,甚至还有完全不从事技术工作的贡献者。但是,他们都有一个共同的身份就是 LCTT 贡献者,因此,他们都有很多开源兄弟姐妹。
按照惯例,每两年,我会写一篇 LCTT 总结。今年又快到这个时间了我却有些不知道该如何下笔。恍惚间我突然想到LCTT 是一个贡献者组织,是大家的 LCTT那么为什么不让大家来为 LCTT 写两句话呢?于是,我在 LCTT 群内发起了号召,请诸位成员写写自己参与 LCTT 的经历、感受或收获,也可以是祝愿、建议。下面,是我收集到的其中一些成员的留言(以留言时的顺序列出):
- **译者-acyanbird**Linux 中国是我的开源引路人,让我有机会从零开始参与开源社区,认识到了开源精神,见到了世界的另一个可能性。也借此机会参与不少活动,认识了很多开源人士。目前在组长的帮助下,我也开始自己建立社区,十分感谢您给我这个机会~希望我们都越来越好,有更多的人也来一起参与开源
- **译者-mandeler**LCTT community forever
- **译者-Kira-Pgr**For a better open source world!
- **译者-mengxinayan**LCTT 不仅可以用来锻炼翻译能力同时有专人进行校对能有效找到自身不足。此外还可以用来接触新知新方向最重要的是可以培养自身英文阅读的习惯。Thanks LCTT
- **译者-aftermath0703**:从 LCTT 我收获到了许多知识,有时间我就会去 GitHub 上读读新的文章,有更多时间我就会去翻译一篇。翻译过程中先自己翻译一遍,再用翻译网站翻译一遍,有偏差的地方相互比对,我觉得这对我的各项英语能力都有很大的帮助。希望 LCTT 蓬勃发展,越办越好!
- **译者-MFGJT**:虽然因为工作原因很久没有翻译了,但是还是每天在看微信公众号。感觉到大家都很努力,希望今年有机会继续参加翻译 🌹
- **译者-stevending1st**:加入 LCTT 最大的惊叹是核心贡献者能够做到维护一个几百人的贡献者群体,背后是他们巨大的努力。希望能在 LCTT 不断学习,努力提升自己的能力。也祝愿 LCTT 越来越好。
- **译者-aREversez**:作为一个学翻译的学生,能参与到 LCTT 这样一个项目,了解更多关于开源与技术的知识,见识更宽阔的世界和更深远的历史,让自己能尽己所能为开源贡献一份力量,实属荣幸之至。希望咱们社区能够一直繁荣下去,传播更加丰富多彩的开源技术与思想!
- **译者-mcfd**LCTT 翻译的许多实用的技术文章,能够简明、易懂地为广大小白答疑解惑,扫除学习、日常中遇到的坑,间接且不断地为开源社区注入生机。清风不解凌云志,明月无声照九州​。
- **核心-lkxed**:在裸辞考研失败之后,我曾一度陷入迷茫。偶然间读到老王写的《如何以翻译贡献参与开源社区》,决心加入进来。自此,我从一个连 Git 和 GitHub 都搞不大懂的小白,成长为一名熟练的译者,又成长为一名熟练的选题。踏踏实实地做好一件小事,每天如此,不正是对抗焦虑和迷茫的好办法吗?感谢开源,给了我这个成长的机会;感谢 LCTT领着我敲开了开源的大门感谢老王在我困惑时指点迷津。祝愿 LCTT 越办越好,我们一路与你同行!
- **核心-bestony**:刚刚专门回到网站上看了一下,我参与 LCTT 已经 8 年了8 年来LCTT 见证了我从小透明到半透明,也经历了我人生的三分之一。希望在未来的时间里,我可以和 LCTT 共成长,也可以与 LCTT 共人生。
- **核心-Locez**:今天是 LCTT 的生日也是我的生日一种奇妙的缘分。LCTT 是我接触 LC接触开源以后第一个比较正式贡献的项目对我来说意义比较非凡重要的是通过这个项目在 LC 以及 LCTT 结识到了热爱分享的大家特别是老王vizbestony 等人,很感谢大家在我学生时代起,就对我的一些耐心引导与帮助。
- **译者-robsean**:科教兴国,实干兴邦
- **译者-TravinDreek**:作为一位自由软件活动者,我主要从事技术伦理相关文章的翻译。我在 LCTT 的翻译动机,不止在于增进自己对当今技术伦理问题的认识,更在于让人们有机会了解到并利用自由(和开源)软件来应对这些问题。希望 LCTT 今后能在传播 FLOSS 方面起到更大的作用。Happy hacking.
- **译者-Wlzzzz-del**:之前备考考研时,偶然接触到 LCTT。为了多了解一些 Linux 知识,同时提高自己的英语水平,因此选择加入了 LCTT这也是我第一次参与开源项目。虽然因为很多原因翻译的文章不多但是 LCTT 发布的文章我都会认真阅读。在未来我希望能多抽出时间来,参与到翻译活动中来。
- **译者-Veryzzj**:今年年初在朋友的介绍下认识了 LCTT 并参与到了其中,仔细回想 LCTT 的意义于我是什么?是打破开源项目于我的神秘面纱,是从申领到翻译每一篇收获的成就感,是发布了文章感受到的正反馈,是在翻译群中和大家交流时的友好气氛。正是这些点滴,是我对抗生命无意义感的武器。我们用语言打破边界,也用语言拓宽世界。预祝 LCTT 越来越好!
- **译者-Chao-zhi**:加入 LCTT 已经六年了,我已经不记得自己是怎么加入 LCTT 了。但我一直记得我是通过 LCTT 的 wiki 学会使用 GitHub 的。也是通过 LCTT 慢慢了解开源世界的。希望能继续和 LCTT 一起成长。
- **核心-MjSeven**:但愿 LCTT 长久,千里共婵娟
- **译者-mudongliang**LCTT 是早期我参与的开源项目,通过这个项目我学会了很多开源知识,熟练使用 Git 使用,为后期在内核项目贡献,奠定了坚实基础 😁
- **译者-Northurland**:感谢 LC 治好了我的网友见面恐惧症(笑)。这是我在校园外参与的第一个项目,很感谢组长和 LC 的大家给予我这个机会。希望我们珍视的这个社区在未来能让更多人了解开源、参与开源。
说实话LCTT 和 Linux 中国能走到今天,全赖这些贡献者的支持,这让我每每感觉吃力时,都有了不能放弃的理由。
那么,你是不是也想加入 LCTT 呢?很简单,访问 LCTT 官网https://linux.cn/lctt/ 即可了解如何成为一名 LCTT 贡献者了。
最后,感谢大家九年来的支持和信任!顺祝大家中秋节、教师节快乐!

0
published/201610/20160812 What is copyleft.md Executable file → Normal file
View File

View File

View File

View File

@ -0,0 +1,501 @@
50 个绝佳的必备 Ubuntu 应用
======
> 摘要:这是一份详尽清单,给所有用户的优秀的 Ubuntu 应用。这些应用将帮助你获得更好的 Linux 桌面使用体验。
过去,我已经多次写过关于 [安装 Ubuntu 之后该做什么][1]。每次我都建议在 Ubuntu 上安装某些关键的应用程序。
那么问题来了,什么是关键的 Ubuntu 应用程序?没有绝对的答案。这取决于你的需要和你在 Ubuntu 上要做的工作。
然而还是有很多读者请我推荐一些优秀的 Ubuntu 应用。这就是为什么我创建了这个全面的Ubuntu应用程序列表你可以经常使用。
为了方便阅读和理解,清单划分为不同应用种类。
### 提供更好使用体验的优秀 Ubuntu 应用
![优秀 Ubuntu 应用][2]
当然,你不必使用以下全部应用。只须浏览这份 Ubuntu 关键应用清单,阅读描述并安装你需要或想要的应用。将这篇文章保存在你的浏览器收藏夹以备将来参考或者通过搜索引擎搜索即可。
这份 Ubuntu 优秀应用清单是准备给普通 Ubuntu 用户的,因此这些应用不全是开源的。我也标记了某些可能不适合新手的稍微复杂的应用。清单适用于 Ubuntu 16.04、18.04 和其他版本。
除非特别声明,所有列出的软件都可以在 Ubuntu 软件中心获得。
如果你没有在软件中心找到应用或者缺失安装说明,请告知我,我会补充安装步骤。
话不多说!让我们看看有哪些优秀 Ubuntu 应用。
#### 浏览器
Ubuntu 以 Firefox 为默认浏览器。自从 Quantum 版本发布以来Firefox 已有显著提升。就个人而言,我经常使用多个浏览器来应对不同的工作。
##### Google Chrome
![Google Chrome Logo][3]
由于某种原因Google Chrome 是最为广泛使用的浏览器。使用 Google 账号,你可以在不同设备无缝同步。大量拓展和应用进一步增强 Chrome 的能力。你可以 [点击此处在 Ubuntu 上安装 Chrome][4]。
##### Brave
![brave browser][5]
Google Chrome 可能是最广泛使用的浏览器,但也是隐私窥探者。一个 [替代浏览器][6] 是 [Brave][7],它可以默认拦截广告和追踪脚本。它为你提供了更快、更安全的浏览体验。
#### 音乐应用
![Ubuntu 优秀音乐应用][8]
Ubuntu 将 Rhythmbox 作为默认音乐播放器,这是个相当不坏的选择。不过,你当然可以安装更好的音乐播放器。
##### Sayonara
[Sayonara][9] 是一个小型、轻量并具备漂亮的深色用户界面的音乐播放器。它拥有所有你期望的标准音乐播放器应有的关键功能。它与 Ubuntu 桌面环境整合良好并且不会大量消耗你的内存。
##### Audacity
[Audacity][10] 与其说是音频播放器,不如说是音频编辑器。你可以使用这款自由且开源的工具录制和编辑音频。它支持 Linux、Windows 和 macOS。你可以从软件中心安装它。
##### MusicBrainz Picard
[Picard][11] 不是一个音乐播放器而是个音乐标签软件。如果你有大量本地音乐文件Picard 可以帮助你自动更新音乐文件的正确的曲目、专辑、艺人资料和专辑封面。
#### 流媒体音乐应用
![Streaming Music app Ubuntu][12]
在这个时代的互联网,听音乐的方式显然发生了改变。现在的人更依赖于流媒体音乐播放器而不是收藏上百首本地音乐文件。让我们看看你可以用于收听流媒体音乐的一些应用吧。
##### Spotify
[Spotify][13] 是流媒体音乐之王。好消息是它具有官方 Linux 版本。[Ubuntu 上的 Spotify 应用][14] 与媒体键和声音菜单以及桌面通知中心整合良好。请注意Spotify 服务可能在你的国家有,也可能没有。
##### Nuvola 音乐播放器
[Nuvola][15] 不是像 Spotify 那样的流媒体音乐服务。它是一款在单一应用内支持多个流媒体音乐服务的桌面音乐播放器。你可以使用 Spotify、Deezer、Google Play Music、Amazon Cloud Player 和更多类似服务。
#### 视频播放器
![Linux 视频播放器][16]
Ubuntu 有默认的 GNOME 视频播放器(从前名为 Totem表现尚可但不支持多种视频编码。当然有很多播放器比 GNOME 视频播放器更优秀。
##### VLC
自由开源的 [VLC][17] 摘得视频播放器桂冠。它几乎支持全部的视频编码。它还允许你将音量增至最高的 200%。它也支持从最后一个已知位置继续播放。有很多 [VLC 使用技巧][18] 供你参考以尽兴使用。
##### MPV
[MPV][19] 是款值得更多关注的视频播放器。别致轻量的界面和丰富的功能MPV 拥有你对一个好的视频播放器的一切期望。你甚至可以在命令行使用它。如果你对 VLC 不够满意,你完全可以尝试 MPV。
#### 云端存储服务
本地备份很好,但云端存储给你更多维度的自由。使用云存储,你再也不必总是随身携带 U 盘或担心硬盘故障。
##### Dropbox
![Dropbox logo][20]
[Dropbox][21] 是最流行的云存储提供商之一。你会获得 2GB 免费存储空间并通过推介给他人得到更多存储空间。Dropbox 提供了一个原生的 Linux 客户端,你可以从官网下载获得。它会在你的系统创建一个本地文件夹,以和云端服务器同步。
##### pCloud
![pCloud icon][22]
[pCloud][23] 是另一个优秀的 Linux 云存储提供商。它也拥有原生的 Linux 客户端,你可以从官网下载。你可以获得高达 20GB 的免费存储空间,如果你需要更多,价格也比 Dropbox 实惠。pCloud 总部位于瑞士,这个国家以严格的数据隐私法而闻名。
#### 图片编辑器
我相信你一定会在某个时间点上需要一个照片编辑器。这里有些优秀的 Ubuntu 图片编辑应用。
##### GIMP
![gimp icon][24]
[GIMP][25] 是一个自由开源的图片编辑器,它支持 Linux、Windows 和 macOS。它是 Adobe Photoshop 在 Linux 上最优秀的替代软件。你可以使用它执行任何图片编辑。网上有许多资源帮助你使用 GIMP。
##### Inkscape
![inkscape icon][26]
[Inkscape][27] 也是一个自由开源的图片编辑器,专用于矢量图形编辑。你可以在 Inkscape 上设计矢量图形和徽标。你可以把它比做 Adobe Illustrator。与 GIMP 一样,网上也有诸多 Inkscape 教程。
#### 绘图应用
![Painting apps for Ubuntu Linux][28]
绘图应用和图片编辑器不完全等同,尽管它们有时功能重叠。以下是你能在 Ubuntu 使用的一些绘图应用。
##### Krita
[Krita][29] 是一款自由开源的数字绘图应用。你可以用它创建数字绘画、漫画和动画。这是款专业软件,甚至被美术学校作为主要软件使用。
##### Pinta
[Pinta][30] 虽然不像 Krita 功能强大,但也可圈可点。你可以把它视为 Linux 端的微软画图软件。你可以绘制、画图、添加文字和执行绘图应用可行的其他诸如此类的小任务。
#### 摄影应用
摄影爱好者还是专家?你将随手获得大量 [摄影工具][31],以下是一些推荐应用。
##### digiKam
![digikam][32]
使用开源软件 [digKam][33]你可以专业地处理你的高品质摄影作品。digKam 提供用于查看、管理、编辑、增强、组织、标记和分享照片所需的所有工具。
##### Darktable
![Darktable icon][34]
[darktable][35] 是一款开源的摄影工作流应用程序,特别是专注于 raw 图像的开发。这会是你取代 Adobe Lightroom 的最佳替代品。它同样支持 Windows 和 macOS。
#### 视频编辑器
![Video editors Ubuntu][36]
[Linux 上的视频编辑器][37] 并不匮乏,毋庸赘述。看看 Ubuntu 中一些功能丰富但相对简单的视频编辑器。
##### Kdenlive
[Kdenlive][38] 是 Linux 端最好的全能型视频编辑器。它与 iMovie 或 Movie Maker 相比功能毫不逊色。
##### Shotcut
[Shotcut][39] 是视频编辑的另一个好选择。它是一款开源软件,拥有标准视频编辑器的所有功能。
#### 图片和视频格式转换器
如果你需要为你的图片和视频 [转换文件格式][40],这些是我的推荐。
##### Xnconvert
![xnconvert logo][41]
[Xnconvert][42] 是一款优秀的批量图像转换工具。你可以批量调整图片尺寸、转换文件类型并重命名。
##### Handbrake
![Handbrake Logo][43]
[HandBrake][44] 是一款易用的开源工具,用于将多种格式的视频转换为一些现代流行的格式。
#### 截图和录屏工具
![Screenshot and recorders Ubuntu][45]
以下是截图和录屏的优秀 Ubuntu 应用。
##### Shutter
[Shutter][46] 是我截图的常用工具。你也可以对这些截图进行一些快速编辑,比如添加箭头、文字或调整图片尺寸。你在我们网站看到的截图都是用 Shutter 编辑的。绝对是 Ubuntu 上最好的应用程序之一。
##### Kazam
[Kazam][47] 是我最喜欢的 [Linux 上的录屏工具][48]。这个是小巧的工具,可以让你录制全屏、某个应用程序窗口或选定区域。你也可以使用快捷键暂停或恢复录屏。[我们的 YouTube 频道][49] 上的教程都是用 Kazam 录制的。
#### 办公套件
我无法想象你在使用计算机时没有文档编辑器。又何必把自己局限在一个文档编辑器上呢?去寻找一个完整的办公套件吧。
##### LibreOffice
![LibreOffice logo][50]
Ubuntu 预装了 [LibreOffice][51],它无疑是 [最佳的开源办公软件][52]。它是个组件完整的办公软件,包括文档编辑器、电子表格工具、演示软件、数学工具和作图工具。你甚至可以用它编辑部分 PDF 文件。
##### WPS Office
![WPS Office logo][53]
[WPS Office][54] 因酷似微软 Office 而广受欢迎。它的界面与微软 Office 几乎一样并且号称与微软 Office 更加兼容。如果你正在寻找类似微软 Office 的办公软件WPS Office 是个好选择。
#### 下载工具
![Downloading software Ubuntu][55]
如果你经常从网上下载视频或其他大型文件,这些工具会帮助你。
##### youtube-dl
这是本清单少有的基于命令行的 Ubuntu 应用之一。如果你想从 YouTube、DailyMotion 或其他视频网站下载视频youtube-dl 是个绝好的选择。它提供了大量 [视频下载高级选项][56]。
##### uGet
[uGet][57] 是一款功能丰富的 [Linux 下载管理器][58]。它允许你暂停和恢复下载、定时下载、监控剪贴板上的可下载内容。如果你的网络速度很慢、不稳定,或者每天的流量有限,这是一个完美的应对工具。
#### 代码编辑器
![Coding apps for Ubuntu][59]
如果你喜欢编程,默认的 Gedit 文本编辑器可能无法满足你的编程需求。下面就为你介绍一些比较好用的代码编辑器。
##### Atom
[Atom][60] 是一款由 GitHub 推出的 [自由开源的代码编辑器][61]。早在它推出第一个稳定版之前,它就因其用户界面、功能和海量插件而成为程序员的至宠。
##### Visual Studio Code
[VS Code][62] 是一款微软出品的开源代码编辑器。别忌惮微软之名VS Code 是款很棒的 Web 开发编辑器,它还支持许多其他编程语言。
#### PDF 和电子书相关应用
![eBook Management tools in Ubuntu][63]
在这个数字时代,你不能只依靠真正的纸质书籍,特别是当有大量的免费电子书唾手可得。这里有一些 Ubuntu 应用以供管理 PDF 和电子书。
##### Calibre
如果你是个书虫,并收集电子书,你应该使用 [Calibre][64]。它是一个电子书管理器,拥有 [创建电子书][65]、转换电子书格式和管理电子书库的所有必要组件。
##### Okular
Okular 主要是一个 PDF 查看器,有编辑 PDF 文件的选项。你可以用 Okular 在 Linux 上做一些基本的 [PDF 编辑][66],如添加弹出式备注、内联式备注、手绘、荧光笔、印章等。
#### 通讯应用
![Messaging apps for Ubuntu][67]
我相信你在 Linux 上使用至少一款 [通讯应用][68]。以下是我的推荐。
##### Skype
[Skype][69] 是最流行的视频通讯应用。它也被许多公司和企业用于面试和会议。这使得 Skype 成为 Ubuntu 必备的应用程序之一。
##### Rambox
[Rambox][70] 本身不是一个通讯应用,但它允许你从单一窗口中使用 Skype、Viber、Facebook Messanger、WhatsApp、Slack 和其他一些通讯应用。
#### 笔记和待办事项应用
需要一个待办事项应用或简单的应用来做笔记吗?看看这些吧。
##### Simplenote
![Simplenote logo][71]
[Simplenote][72] 是 WordPress 创建者 [Automattic][73] 推出的一款自由开源的笔记应用。它适用于 Windows、Linux、macOS、iOS 和 Android。你的笔记会同步到云服务器上你可以在任何设备上访问它们。你可以从官网下载 DEB 文件。
##### Remember The Milk
![Remember The Milk logo][74]
[Remember The Milk][75] 是一款流行的待办事项应用。它适用于 Windows、Linux、macOS、iOS 和 Android。你可以在拥有的所有设备上访问你的待办事项。你也可以从浏览器访问它。它还有一个官方的 Linux 原生版本,你可以从官网下载。
#### 密码保护和加密
![Encryption software Ubuntu][76]
如果有其他人经常使用你的电脑,也许你会考虑通过密码保护文件和文件夹来增加额外的安全。
##### EncryptPad
[EncryptPad][77] 是一个开源文本编辑器,它允许你用密码锁定你的文件。你可以选择加密的类型。这个工具也有一个命令行版本。
##### Gnome Encfs Manager
Gnome Encfs Manager 允许你 [在 Linux 中用密码锁定文件夹][78]。你可以将任何你想要的文件保存在一个加密文件夹中,然后用密码锁定它。
#### 游戏
![Gaming on Ubuntu][79]
[Linux 上的游戏][80] 体验比几年前改进很多。你可以在 Linux 上畅玩大量游戏,而不用回到 Windows 了。
##### Steam
[Steam][81] 是一个数字发行平台允许你购买游戏如果需要的话。Steam 拥有超过 1500 款 [Linux 游戏][82]。你可以从软件中心下载 Steam 客户端。
##### PlayOnLinux
[PlayOnLinux][83] 允许你在 Linux 上通过 WINE 兼容层运行 Windows 游戏。不要对它抱有太高的期望,因为并不是每个游戏都能在 PlayOnLinux 下完美运行。
#### 软件包管理工具 [中高级用户]
![Package Management tools Ubuntu][84]
Ubuntu 软件中心满足普通 Ubuntu 用户的软件需求,但你可以使用以下应用程序对其进行更多的深入操作。
##### Gdebi
Gedbi 是一款小巧的软件包管理器,你可以用它来安装 DEB 文件。它比软件中心更快,而且还能处理依赖问题。
##### Synaptic
十年前Synaptic 是大多数 Linux 发行版的默认 GUI 软件包管理器。在一些 Linux 发行版中,它仍然是默认的软件包管理器。这个强大的软件包管理器在 [查找已安装的应用程序并删除它们][85] 方面特别有用。
#### 备份和恢复工具
![Backup and data recovery tools for Ubuntu][86]
任何操作系统都应该有备份和恢复工具。让我们来看看 Ubuntu 上有哪些软件是你必须拥有的。
##### Timeshift
Timeshift 是一个帮助你 [对系统进行快照][87] 的工具。这可以让你在系统配置混乱的情况下在发生不幸的事时将系统恢复到以前的状态。不过要注意的是它并不是你个人数据备份的最佳工具。对此你可以使用U buntu 默认的 Deja Dup也叫做“备份”
##### TestDisk [中级用户]
这是本清单里另一个命令行工具。[TestDisk][88] 可以让你 [恢复 Linux 上的数据][89]。如果你不小心删除了文件,使用 TestDisk 还有机会找回来。
#### 系统调整和管理工具
![System Maintenance apps Ubuntu][90]
##### GNOME/Unity Tweak Tool
这些调整工具是每个 Ubuntu 用户必备的。它们允许你访问一些高级系统设置。最重要的是,你可以使用这些调整工具 [改变 Ubuntu 的主题][91]。
##### UFW Firewall
[UFW][92] 意指“不复杂的防火墙”这一点是贴切的。UFW 为家庭、工作和公共网络预先定义了防火墙设置。
##### Stacer
如果你想释放 Ubuntu 的存储空间,可以试试 Stacer。这个图形化工具可以让你通过删除不必要的文件和完全卸载软件来 [优化你的 Ubuntu 系统][93]。可以从 [官网][94] 下载 Stacer。
#### 其他工具
![Utilities Ubuntu][95]
最后,我会列一些其他我很喜欢但无法归类的 Ubuntu 应用。
##### Neofetch
又多了一个命令行工具Neofetch 可以显示你的系统信息,如 [Ubuntu 版本][96]、桌面环境、主题、图标、内存和其他信息,并附有 [发行版的 ASCII 徽标][97]。使用以下命令安装 Neofetch。
```
sudo apt install neofetch
```
##### Etcher
Ubuntu 已经带有一个即用 USB 创建工具,但 Etcher 能更好地完成这项任务。它同样支持 Windows 和 macOS。你可以 [点击这里][98] 下载 Etcher。
##### gscan2pdf
我使用这个小工具的唯一目的是 [将图片转换为 PDF][99]。你也可以用它将多张图片合并成一个 PDF 文件。
##### 音频记录器
另一个小巧而又必不可少的 Ubuntu 应用,用于 [在 Ubuntu 上录制音频][100]。你可以用它来录制来自系统麦克风、音乐播放器或任何其他来源的声音。
### 你对 Ubuntu 关键应用的建议?
我想在这里结束我的优秀 Ubuntu 应用清单。我知道你可能不需要或使用所有的应用,但我确信你会喜欢这里列出的大部分应用。
你是否找到几款以前从未知道的应用呢?如果要你推荐最爱的 Ubuntu 应用,你会选择哪个呢?
最后,如果你觉得这篇文章有用,请把它分享到社交媒体或其他你常访问的社区或论坛。这样,你也帮助了我们的成长 :)
--------------------------------------------------------------------------------
via: https://itsfoss.com/best-ubuntu-apps/
作者:[Abhishek Prakash][a]
选题:[lujun9972](https://github.com/lujun9972)
译者:[LikChung](https://github.com/LikChung)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://itsfoss.com/author/abhishek/
[1]:https://linux.cn/article-12183-1.html
[2]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/best-ubuntu-apps-featured.jpeg
[3]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/google-chrome.jpeg
[4]:https://www.google.com/chrome/
[5]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/brave-browser-icon.jpeg
[6]:https://itsfoss.com/open-source-browsers-linux/
[7]:https://brave.com/
[8]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/music-apps-ubuntu.jpeg
[9]:https://itsfoss.com/sayonara-music-player/
[10]:https://www.audacityteam.org/
[11]:https://itsfoss.com/musicbrainz-picard/
[12]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/streaming-music-apps-ubuntu.jpeg
[13]:https://www.spotify.com//
[14]:https://linux.cn/article-9415-1.html
[15]:https://tiliado.eu/nuvolaplayer/
[16]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/Video-Players-linux.jpg
[17]:https://www.videolan.org/index.html
[18]:https://linux.cn/article-11776-1.html
[19]:https://mpv.io/
[20]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/dropbox-icon.jpeg
[21]:https://www.dropbox.com/
[22]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/pcloud-icon.jpeg
[23]:https://itsfoss.com/recommends/pcloud/
[24]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/gimp-icon.jpeg
[25]:https://www.gimp.org/
[26]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/inkscape-icon.jpeg
[27]:https://inkscape.org/en/
[28]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/paint-apps-ubuntu.jpeg
[29]:https://krita.org/en/
[30]:https://pinta-project.com/pintaproject/pinta/
[31]:https://itsfoss.com/image-applications-ubuntu-linux/
[32]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/digikam-icon.jpeg
[33]:https://www.digikam.org/
[34]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/darktable-icon.jpeg
[35]:https://www.darktable.org/
[36]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/video-editing-apps-ubuntu.jpeg
[37]:https://linux.cn/article-10185-1.html
[38]:https://kdenlive.org/en/
[39]:https://shotcut.org/
[40]:https://itsfoss.com/format-factory-alternative-linux/
[41]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/xnconvert-logo.jpeg
[42]:https://www.xnview.com/en/xnconvert/
[43]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/handbrake-logo.jpeg
[44]:https://handbrake.fr/
[45]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/screen-recording-ubuntu-apps.jpeg
[46]:http://shutter-project.org/
[47]:https://launchpad.net/kazam
[48]:https://itsfoss.com/best-linux-screen-recorders/
[49]:https://www.youtube.com/c/itsfoss?sub_confirmation=1
[50]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/libre-office-logo.jpeg
[51]:https://www.libreoffice.org/download/download/
[52]:https://linux.cn/article-9379-1.html
[53]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/wps-office-logo.jpeg
[54]:http://wps-community.org/
[55]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/download-apps-ubuntu.jpeg
[56]:https://linux.cn/article-9244-1.html
[57]:http://ugetdm.com/
[58]:https://itsfoss.com/4-best-download-managers-for-linux/
[59]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/coding-apps-ubuntu.jpeg
[60]:https://atom.io/
[61]:https://linux.cn/article-7468-1.html
[62]:https://itsfoss.com/install-visual-studio-code-ubuntu/
[63]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/pdf-management-apps-ubuntu.jpeg
[64]:https://calibre-ebook.com/
[65]:https://linux.cn/article-7977-1.html
[66]:https://itsfoss.com/pdf-editors-linux/
[67]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/messaging-apps-ubuntu.jpeg
[68]:https://itsfoss.com/best-messaging-apps-linux/
[69]:https://www.skype.com/en/
[70]:https://rambox.pro/
[71]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/simplenote-logo.jpeg
[72]:http://simplenote.com/
[73]:https://automattic.com/
[74]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/remember-the-milk-logo.jpeg
[75]:https://itsfoss.com/remember-the-milk-linux/
[76]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/encryption-apps-ubuntu.jpeg
[77]:https://linux.cn/article-9377-1.html
[78]:https://itsfoss.com/password-protect-folder-linux/
[79]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/gaming-ubuntu.jpeg
[80]:https://linux.cn/article-7316-1.html
[81]:https://store.steampowered.com/
[82]:https://itsfoss.com/free-linux-games/
[83]:https://www.playonlinux.com/en/
[84]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/package-management-apps-ubuntu.jpeg
[85]:https://itsfoss.com/how-to-add-remove-programs-in-ubuntu/
[86]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/backup-recovery-tools-ubuntu.jpeg
[87]:https://linux.cn/article-11619-1.html
[88]:https://www.cgsecurity.org/wiki/TestDisk
[89]:https://linux.cn/article-7974-1.html
[90]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/system-maintenance-apps-ubuntu.jpeg
[91]:https://itsfoss.com/install-themes-ubuntu/
[92]:https://wiki.ubuntu.com/UncomplicatedFirewall
[93]:https://itsfoss.com/optimize-ubuntu-stacer/
[94]:https://github.com/oguzhaninan/Stacer
[95]:https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/07/utilities-apps-ubuntu.jpeg
[96]:https://itsfoss.com/how-to-know-ubuntu-unity-version/
[97]:https://itsfoss.com/display-linux-logo-in-ascii/
[98]:https://etcher.io/
[99]:https://itsfoss.com/convert-multiple-images-pdf-ubuntu-1304/
[100]:https://itsfoss.com/record-streaming-audio/

View File

@ -0,0 +1,131 @@
[#]: collector: (lujun9972)
[#]: translator: (this-is-name-right)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12448-1.html)
[#]: subject: (How to build a WiFi picture frame with a Raspberry Pi)
[#]: via: (https://opensource.com/article/19/2/wifi-picture-frame-raspberry-pi)
[#]: author: (Manuel Dewald https://opensource.com/users/ntlx)
如何用树莓派制作 WiFi 相框
======
> DIY一个数码相框图片流来自云端。
![](https://img.linux.net.cn/data/attachment/album/202007/24/212836agkae2776gude1cb.jpg)
数码相框真的很好,因为它可以让你查看你自己的相片而不必打印出来。更棒的是,当你想要展示一张新的相片的时候,增加和删除数字图片要比打开传统的相框然后替换里面的相框更简单。不过,这还是需要一点手动的操作,比如从数字相框取出 SD 卡、U 盘或者其他的存储介质,然后把存储介质接入电脑,接着再复制图片进入存储介质。
一个更简单的选项是数字相框通过 WiFi 获得图片,例如从云端服务器获得。下面就是如何制作这样的一个数字相框。
### 需要使用的材料
* 老式 [TFT][1] 的 LCD 显示屏
* HDMI 到 DVI 的转接线(因为 TFT 屏幕支持 DVI
* 树莓派 3
* Micro SD 卡
* 树莓派的电源
* 键盘
* 鼠标(可选)
使用线缆连接树莓派到显示器,并连接电源。
### 安装 Raspbian
按照以下[指示][2]下载并将 Raspbian 烧录到 Micro SD 卡中。将 Micro SD 卡插入树莓派,启动它,并配置你的 WiFi。在安装完 Raspbian 后,我的第一个操作通常是运行 `sudo raspi-config`。在那里,我在网络选项中更改主机名(例如,改为 `picframe`),并在接口选项中启用 SSH 以远程连接到树莓派。使用(例如)`ssh pi@picframe` 连接到树莓派。
### 建立并安装云客户端
我使用 [Nextcloud][3] 来同步我的图片,但是你可以使用 NFS、[Dropbox][4],或者其他的适合你的需求的方式上传图片到相框。
如果你使用 Nextcloud请按照[以下说明][5]在 Raspbian 上安装客户端。这可以很方便的放图片到你的相框,并且你可能很熟悉安装在台式机的这个客户端应用。当连接客户端到 Nextcloud 服务器上的时候,请确保只选择存储你要在相框上显示的图片的文件夹。
### 设置幻灯片放映
我发现设置幻灯片放映最简单的方式是使用一个专门为这个目的建立的[轻量级的幻灯片项目][6]。还有一些备用方案,像是配置屏保,这个应用似乎是最最简单设置幻灯片放映的方式了。
在你的树莓派上下载最新的二进制程序,解包并移动到一个可执行的文件夹里:
```
wget https://github.com/NautiluX/slide/releases/download/v0.9.0/slide_pi_stretch_0.9.0.tar.gz
tar xf slide_pi_stretch_0.9.0.tar.gz
mv slide_0.9.0/slide /usr/local/bin/
```
安装依赖关系:
```
sudo apt install libexif12 qt5-default
```
通过执行下面的命令播放幻灯片(不要忘记修改图片的路径)。如果你通过 SSH 访问你树莓派,设置 `DISPLAY` 变量来在连接到树莓派显示屏上开始播放幻灯片。
```
DISPLAY=:0.0 slide -p /home/pi/nextcloud/picframe
```
### 自动播放幻灯片
为了在 Raspbian Stretch 上自动播放幻灯片,建立如下的文件夹并且添加一个 `autostart` 文件到里面:
```
mkdir -p /home/pi/.config/lxsession/LXDE/
vi /home/pi/.config/lxsession/LXDE/autostart
```
在文件中输入如下的命令来自动开启幻灯片。`slide` 命令可以调整到你需要的地方:
```
@xset s noblank
@xset s off
@xset -dpms
@slide -p -t 60 -o 200 -p /home/pi/nextcloud/picframe
```
禁止屏幕空白,树莓派通常会在 10 分钟后这样做,通过编辑下面的文件修改:
```
vi /etc/lightdm/lightdm.conf
```
添加这两行到文件末尾:
```
[SeatDefaults]
xserver-command=X -s 0 -dpms
```
### 配置上电时间
你可以安排你的相框什么时候打开和关闭通过使用两个简单的定时任务。例如,你想在上午 7 点自动打开,在晚上 11 点自动关闭。运行 `crontab -e` 并且输入下面的两行:
```
0 23 * * * /opt/vc/bin/tvservice -o
0 7 * * * /opt/vc/bin/tvservice -p && sudo systemctl restart display-manager
```
注意这不会打开或关闭树莓派的电源;这只会关闭 HDMI它会关闭屏幕。第一行命令将在晚上 11 点关闭 HDMI。第二行将在早上 7 点打开显示屏并重启显示器管理器。
### 附言
通过这些简单的步骤,你创建了你自己 WiFi 相框。如果你想要让它更好看,为显示屏做一个木质相框吧。
--------------------------------------------------------------------------------
via: https://opensource.com/article/19/2/wifi-picture-frame-raspberry-pi
作者:[Manuel Dewald][a]
选题:[lujun9972][b]
译者:[this-is-name-right](https://github.com/this-is-name-right)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/ntlx
[b]: https://github.com/lujun9972
[1]: https://en.wikipedia.org/wiki/Thin-film-transistor_liquid-crystal_display
[2]: https://www.raspberrypi.org/documentation/installation/installing-images/README.md
[3]: https://nextcloud.com/
[4]: http://dropbox.com/
[5]: https://github.com/nextcloud/client_theming#building-on-debian
[6]: https://github.com/NautiluX/slide/releases/tag/v0.9.0

View File

@ -0,0 +1,86 @@
[#]: collector: (lujun9972)
[#]: translator: (JonnieWayy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12441-1.html)
[#]: subject: (Book Review: A Byte of Vim)
[#]: via: (https://itsfoss.com/book-review-a-byte-of-vim/)
[#]: author: (John Paul https://itsfoss.com/author/john/)
《A Byte of Vim》书评
======
[Vim][1] 是一个简单而又强大的文本编辑工具。大多数新用户都会被它吓倒因为它不像常规的图形化文本编辑器那样“工作”。Vim “不寻常”的键盘快捷键让人不知道[如何保存并退出 Vim][2]。但一旦你掌握了 Vim就没有什么能比得上它了。
网上有大量的 [Vim 资源][3]。我们也在介绍了一些 Vim 技巧。除了线上资源,也有很多书致力于介绍这个编辑器。今天,我们要介绍的是一本旨在使大多数用户轻松理解 Vim 的书。我们将讨论的书是 [Swaroop C H][5] 撰写的《[A Byte of Vim][4]》。
本书作者 [Swaroop C H][5] 已经在计算机领域工作了十余年,他曾在 Yahoo 和 Adobe 工作过。大学毕业后,他卖过 Linux CD也曾多次创业也是一个创建了一个名为 ion 的 iPod 充电器的团队的联合创始人。他目前是 [Helpshift][7] AI 团队的工程经理。
### 《A Byte of Vim》
![][8]
像所有好书一样《A Byte of Vim》一开始就谈到了什么是 Vim“一个用于写各类文本的计算机程序。”他接着说“Vim 之所以与众不同,是因为它是为数不多的既简单又强大的软件之一。”
在深入讲解如何使用 Vim 之前Swaroop 先告诉读者如何在 Windows、Mac、Linux 和 BSD 上安装 Vim。安装完成后他进而指导读者完成如何启动 Vim以及如何创建第一个文件。
接着Swaroop 讨论了 Vim 的不同模式,以及如何通过 Vim 的键盘快捷键来浏览文档。接着是使用 Vim 编辑文档的基础知识,包括如何在 Vim 中剪切/复制/粘帖以及撤销/重做。
在介绍了编辑基础知识后Swaroop 介绍了如何使用 Vim 来编辑单个文档的多个部分。你也可以使用多个标签和窗口来同时编辑多个文档。
本书还涵盖了通过编写脚本和安装插件来扩展 Vim 的功能。在 Vim 中使用脚本有两种方法,一种是使用 Vim 的内置脚本语言,另一种是使用 Python 或 Perl 等编程语言来访问 Vim 的内核。可以编写或下载五种类型的 Vim 插件vimrc、全局插件、文件类型插件、语法高亮插件和编译器插件。
在一个单独的章节中Swaroop C H 介绍了使 Vim 更适合编程的特点。这些功能包括语法高亮、智能缩进、对 Shell 命令的支持、全局补全以及可用作 IDE 使用的功能。
#### 获取《A Byte of Vim》一书并为之贡献
《A Byte of Vim》按照 [共创协议 4.0][10]授权。读者可以在[作者的主页][4]上免费阅读其在线版本。你也可以免费下载其 [PDF][11]、[Epub][12] 或者 [Mobi][13] 版本。
- [免费获取《A Byte of Vim》][4]
如果你更喜欢阅读[纸质版本][14],你也可以选择该方式。
请注意,**《A Byte of Vim》的初始版本写于 2008**,并转换为 PDf。不幸的是Swaroop CH丢失了原始源文件。他正在努力将该书转换为 [Markdown][15]。如果你想提供帮助,请访问[该书的 GitHub 页面][16]。
#### 结语
当我初次对着 Vim 生气时我不知道该怎么办。我希望那时候我就知道《A Byte of Vim》这本书。对于任何学习 Linux 的人来说,这本书都是不错的资源,特别是当你开始学习命令行的时候。
你读过 Swaroop C H 的《[A Byte of Vim][4]》吗?如果读过,你是如何找到它的?如果不是,那么你最喜欢关于开源主题的是哪本书?请在下方评论区告诉我们。
--------------------------------------------------------------------------------
via: https://itsfoss.com/book-review-a-byte-of-vim/
作者:[John Paul][a]
选题:[lujun9972][b]
译者:[JonnieWayy](https://github.com/JonnieWayy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/john/
[b]: https://github.com/lujun9972
[1]: https://www.vim.org/
[2]: https://itsfoss.com/how-to-exit-vim/
[3]: https://linuxhandbook.com/basic-vim-commands/
[4]: https://vim.swaroopch.com/
[5]: https://swaroopch.com/
[6]: https://swaroopch.com/about/
[7]: https://www.helpshift.com/
[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/06/Byte-of-vim-book.png?resize=800%2C450&ssl=1
[9]: https://itsfoss.com/4mlinux-review/
[10]: https://creativecommons.org/licenses/by/4.0/
[11]: https://www.gitbook.com/download/pdf/book/swaroopch/byte-of-vim
[12]: https://www.gitbook.com/download/epub/book/swaroopch/byte-of-vim
[13]: https://www.gitbook.com/download/mobi/book/swaroopch/byte-of-vim
[14]: https://swaroopch.com/buybook/
[15]: https://itsfoss.com/best-markdown-editors-linux/
[16]: https://github.com/swaroopch/byte-of-vim#status-incomplete
[17]: https://i2.wp.com/images-na.ssl-images-amazon.com/images/I/41itW8furUL._SL160_.jpg?ssl=1
[18]: https://www.amazon.com/Mastering-Vim-Quickly-WTF-time/dp/1983325740?SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=1983325740 (Mastering Vim Quickly: From WTF to OMG in no time)
[19]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 (Amazon Prime)
[20]: https://www.amazon.com/Mastering-Vim-Quickly-WTF-time/dp/1983325740?SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=1983325740 (Buy on Amazon)
[21]: https://itsfoss.com/iridium-browser-review/
[22]: http://reddit.com/r/linuxusersgroup

View File

@ -0,0 +1,268 @@
[#]: collector: (lujun9972)
[#]: translator: (silentdawn-zz)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12452-1.html)
[#]: subject: (Sending custom emails with Python)
[#]: via: (https://opensource.com/article/19/8/sending-custom-emails-python)
[#]: author: (Brian "bex" Exelbierd https://opensource.com/users/bexelbie)
使用 Mailmerge 发送定制邮件
======
> Mailmerge 是一个可以定制群发邮件的命令行程序,它可以处理简单和复杂的邮件。
![](https://img.linux.net.cn/data/attachment/album/202007/25/233710lqkvko0jdbh1jzul.jpg)
电子邮件还是生活的一部分,尽管有种种不足,它仍然是大多数人发送信息的最佳方式,尤其是在按队列将邮件发送给收件人的自动化方式中。
作为 [Fedora 社区行动和影响协调员][2],我的工作之一就是给人们发送资助旅行相关的好消息,我经常通过电子邮件做这些事。这里,我将给你展示如何使用 [Mailmerge][3] 向一群人发送定制邮件的Mailmerge 是一个可以处理简单和复杂的邮件的命令行程序。
### 安装 Mailmerge
在 Fedora 中Mailmerge 已经打包可用,你可以通过在命令行中运行 `sudo dnf install python3-mailmerge` 来安装它。你还可以使用 `pip` 命令从 PyPi 中安装,具体可以参阅该项目的 [README][4]。
### 配置 Mailmerge
三个配置文件控制着 Mailmerge 的工作模式。运行 `mailmerge --sample`,将生成配置文件模板。这些文件包括:
* `mailmerge_server.conf:` 这里保存着 SMTP 服务端邮件发送相关详细配置,但你的密码 *不* 在这里保存。
* `mailmerge_database.csv:` 这里保存每封邮件的定制数据,包括收件人的电子邮件地址。
* `mailmerge_template.txt:` 这里保存电子邮件的文本,文本中包含占位符,这些占位符会使用 `mailmerge_database.csv` 中的数据替换。
#### Server.conf
配置模板文件 `mailmerge_server.conf` 包含几个大家应该很熟悉的例子。如果你曾经往手机上添加过电子邮件或者设置过桌面电子邮件客户端,那你就应该看到过这些数据。需要提醒的是要记得把你的用户名更新到这个文件中,尤其是在你使用模板所提供的配置时。
#### Database.csv
`mailmerge_database.csv` 这个配置文件稍微有点复杂。最起码要将邮件接收者的电子邮件地址保存在这里,其它在电子邮件中任何需要替换的定制信息也要保存在这里。推荐在创建本文件的占位符列表时,同步编辑 `mailmerge_template.txt` 文件。我发现一个有效的做法是,使用电子表格软件录入这些数据,完成后导出为 CSV 文件。使用下面的示例文件:
```
email,name,number
myself@mydomain.com,"Myself",17
bob@bobdomain.com,"Bob",42
```
可以你向这两个人发送电子邮件,使用他们的名字并告诉他们一个数字。这个示例文件虽然不是特别有趣,但应用了一个重要的原则,那就是:始终让自己处于邮件接收列表的首位。这样你可以在向列表全员发送邮件之前,先给自己发送一个测试邮件,以验证邮件的效果是否如你预期。
任何包含半角逗号的值,都 **必须** 以半角双引号(`"`)封闭。如果恰好在半角双引号封闭的区域需要有一个半角双引号,那就在同一行中连续使用两个半角双引号。引号的规则比较有趣,去 [Python 3 中关于 CSV 的内容中][7] 一探究竟吧。
#### Template.txt
我的工作之一,就是为我们 Fedora 贡献者会议 [Flock][8] 发送与旅行基金有关的信息。通过简单的邮件告诉有关的人,他被选中为旅行基金支持的幸运者,以及相应基金支持的详细信息。与接收者相关的具体信息之一就是我们可以为他的旅行提供多少资助。下面是一份我的节略后的模板文件(为了简洁,已经移除大量的文本):
```
$ cat mailmerge_template.txt
TO: {{Email}}
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <bexelbie@redhat.com>
Hi {{Name}},
I am writing you on behalf of the Flock funding committee. You requested funding for your attendance at Flock. After careful consideration we are able to offer you the following funding:
Travel Budget: {{Travel_Budget}}
<<snip>>
```
模板的起头定义了邮件的接收者、发送者和主题。在空行之后,是邮件的内容。该邮件需要从 `database.csv` 文件中获取接收者的 `Email` 、`Name` 和 `Travel_Budget` 。注意,上述这些占位符是由双大括弧( `{{`、`}}` )封闭的。相应的 `mailmerge_database.csv` 如下:
```
$ cat mailmerge_database.csv
Name,Email,Travel_Budget
Brian,bexelbie@redhat.com,1000
PersonA,persona@fedoraproject.org,1500
PèrsonB,personb@fedoraproject.org,500
```
注意,我把自己的信息放在了首条,这是为了测试方便。除了我,还有另外两个人的信息在文档中。列表中的第二个人 PèrsonB他的名字中有一个包含变音符号的字母Mailmerge 会对这类字母自动编码。
以上包含了模板的全部知识点:写上你自己的电子邮件信息,并编写好以双大括弧封闭的占位符。接下来创建用来提供前述占位符具体值的数据文件。现在测试一下电子邮件的效果。
### 测试并发送简单邮件
#### 试运行
测试从邮件的试运行开始,试运行就是讲邮件内容显示出来,所有的占位符都会被具体值取代。默认情况下,如果你运行不带参数的命令 `mailmerge`,它将对收件列表中的第一个人进行试运行:
```
$ mailmerge
>>> encoding ascii
>>> message 0
TO: bexelbie@redhat.com
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <bexelbie@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Date: Sat, 20 Jul 2019 18:17:15 -0000
Hi Brian,
I am writing you on behalf of the Flock funding committee. You requested funding for your attendance at Flock. After careful consideration we are able to offer you the following funding:
Travel Budget: 1000
<<snip>>
>>> sent message 0 DRY RUN
>>> No attachments were sent with the emails.
>>> Limit was 1 messages. To remove the limit, use the --no-limit option.
>>> This was a dry run. To send messages, use the --no-dry-run option.
```
从试运行生成的邮件中(列表中的 `message 0` ,和计算机中很多计数场景一样,计数从 0 开始),可以看到我的名字及旅行预算是正确的。如果你想检视所有的邮件,运行 `mailmerge --no-limit`,告诉 Mailmerge 不要仅仅处理第一个收件人的信息。下面是第三个收件人邮件的试运行结果,用来测试特殊字符的编码:
```
>>> message 2
TO: personb@fedoraproject.org
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <bexelbie@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Date: Sat, 20 Jul 2019 18:22:48 -0000
Hi P=E8rsonB,
```
没有问题,`P=E8rsonB` 是 `PèrsonB` 的编码形式。
#### 发送测试信息
现在,运行 `mailmerge --no-dry-run`Mailmerge 将向收件人列表中的第一个人发送电子邮件:
```
$ mailmerge --no-dry-run
>>> encoding ascii
>>> message 0
TO: bexelbie@redhat.com
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <bexelbie@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Date: Sat, 20 Jul 2019 18:25:45 -0000
Hi Brian,
I am writing you on behalf of the Flock funding committee. You requested funding for your attendance at Flock. After careful consideration we are able to offer you the following funding:
Travel Budget: 1000
<<snip>>
>>> Read SMTP server configuration from mailmerge_server.conf
>>> host = smtp.gmail.com
>>> port = 587
>>> username = bexelbie@redhat.com
>>> security = STARTTLS
>>> password for bexelbie@redhat.com on smtp.gmail.com:
>>> sent message 0
>>> No attachments were sent with the emails.
>>> Limit was 1 messages. To remove the limit, use the --no-limit option.
```
在倒数第 4 行,它将要求你输入你的密码。如果你使用的是双因素认证或者域控制登录,那就需要创建应用密码来绕过这些控制。如果你使用的是 Gmail 或者类似的系统,可以直接在界面上完成密码验证。如果不行的话,联系你的邮件系统管理员。上述这些操作不会影响邮件系统的安全性,但是仍然有必要采用复杂的安全性好的密码。
我在我的邮件收件箱中,看到了这封格式美观的测试邮件。如果测试邮件看起来没有问题,那就可以运行 `mailmerge --no-dry-run --no-limit` 发送所有的邮件了。
### 发送复杂邮件
只有充分了解了 [Jinja2 模板][12] ,你才可能充分领略 Mailmerge 真正的威力。在邮件模板中使用条件语句及附带附件,是很有用的。下面就是一个复杂邮件的模板及对应的数据文件:
```
$ cat mailmerge_template.txt
TO: {{Email}}
SUBJECT: Flock 2019 Funding Offer
FROM: Brian Exelbierd <bexelbie@redhat.com>
ATTACHMENT: attachments/{{File}}
Hi {{Name}},
I am writing you on behalf of the Flock funding committee. You requested funding for your attendance at Flock. After careful consideration we are able to offer you the following funding:
Travel Budget: {{Travel_Budget}}
{% if Hotel == "Yes" -%}
Lodging: Lodging in the hotel Wednesday-Sunday (4 nights)
{%- endif %}
<<snip>>
$ cat mailmerge_database.csv
Name,Email,Travel_Budget,Hotel,File
Brian,bexelbie@redhat.com,1000,Yes,visa_bex.pdf
PersonA,persona@fedoraproject.org,1500,No,visa_person_a.pdf
PèrsonB,personb@fedoraproject.org,500,Yes,visa_person_b.pdf
```
在这个邮件中有两项新内容。首先是附件,我需要向参加国际旅行的人发送签证邀请信,帮助他们来 Flock文件头的 `ATTACHMENT` 部分说明了要包含什么文件;为了保持我的文档目录清晰,我将所有需要作为附件的文档保存于附件子目录下。其次是包含了关于宾馆的条件信息,因为有些人的旅行资金包含了住宿费用,我需要对涉及住宿的人员诉及相关信息,而这是通过 `if` 判断实现的:
```
{% if Hotel == "Yes" -%}
Lodging: Lodging in the hotel Wednesday-Sunday (4 nights)
{%- endif %}
```
这和大多数编程语言中的 `if` 判断是一样的。Jinja2 实力非凡,可以实现多级判断。通过包含数据元素控制邮件内容,能大大简化相关的日常工作。空格的正确使用对邮件的易读性很重要。`if` 和 `endif` 语句中的短线( `-` )是 Jinja2 控制 [空白字符][13] 的一部分。这里面选项很多,所以还是要通过试验找到最适合自己的方式。
在上面的例子中,我在数据文件扩充了 `Hotel``File` 两个字段,这些字段的值控制着宾馆信息和附件文件名。另外,在上例中,我和 PèrsonB 有住宿资助,但 PersonA 没有。
对于简单邮件和复杂邮件而言,试运行及正式发送邮件的操作都是相同的。快去试试吧!
你还可以尝试在邮件头中使用条件判断( `if``endif` ),比如你可以使发送给在数据库中的某人的邮件包含附件,或者改变对部分人改变发送人的信息。
### Mailmerge 的优点
Mailmerge 是用来批量发送定制邮件的简洁而高效的工具。每个人只接受到他需要的信息,其它额外的操作和细节都是透明的。
我还发现,即使是在发送简单的集团邮件时,相对于使用 CC 或者 BCC 向一组受众发送一封邮件,采用 Mailmerge 也是非常高效的。很多人使用了邮件过滤,那些不是直接发给他们的邮件,他们一律不会立刻处理。使用 Mailmerge 保证了每名接收者收到的就是自己的邮件。所有的信息会对接收者进行正确过滤,再也不会有人无意间回复到整个邮件组。
--------------------------------------------------------------------------------
via: https://opensource.com/article/19/8/sending-custom-emails-python
作者:[Brian "bex" Exelbierd][a]
选题:[lujun9972][b]
译者:[silentdawn-zz](https://github.com/silentdawn-zz)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/bexelbie
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/email_chat_communication_message.png?itok=LKjiLnQu (Chat via email)
[2]: https://docs.fedoraproject.org/en-US/council/fcaic/
[3]: https://github.com/awdeorio/mailmerge
[4]: https://github.com/awdeorio/mailmerge#install
[5]: mailto:myself@mydomain.com
[6]: mailto:bob@bobdomain.com
[7]: https://docs.python.org/3/library/csv.html
[8]: https://flocktofedora.org/
[9]: mailto:bexelbie@redhat.com
[10]: mailto:persona@fedoraproject.org
[11]: mailto:personb@fedoraproject.org
[12]: http://jinja.pocoo.org/docs/latest/templates/
[13]: http://jinja.pocoo.org/docs/2.10/templates/#whitespace-control

View File

@ -0,0 +1,70 @@
[#]: collector: (lujun9972)
[#]: translator: (silentdawn-zz)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12459-1.html)
[#]: subject: (4 Python tools for getting started with astronomy)
[#]: via: (https://opensource.com/article/19/10/python-astronomy-open-data)
[#]: author: (Gina Helfrich, Ph.D. https://opensource.com/users/ginahelfrich)
开启天文之路的 4 个 Python 工具
======
> 使用 NumPy、SciPy、Scikit-Image 和 Astropy 探索宇宙
![](https://img.linux.net.cn/data/attachment/album/202007/27/223146sjfgbj9jfu9m1z2c.jpg)
### 天文学与 Python
对科学界而言尤其是对天文学界来说Python 是一种伟大的语言工具。各种软件包,如 [NumPy][5]、[SciPy][6]、[Scikit-Image][7] 和 [Astropy][8],(仅举几例) ,都充分证明了 Python 对天文学的适用性而且有很多用例。NumPy、Astropy 和 SciPy 是 NumFOCUS 提供资金支持的项目Scikit-Image 是个隶属项目。我在十几年前脱离天文研究领域成为了软件开发者之后对这些工具包的演进一直很感兴趣。我的很多前天文界同事在他们的研究中使用着前面提到的大部分甚至是全部工具包。以我为例我也曾为位于智利的超大口径望远镜VLT上的仪器编写过专业天文软件工具包。
最近令我吃惊的是Python 工具包竟然演进到如此好用,任何人都可以轻松编写 <ruby>[数据还原][9]<rt>data reduction</rt></ruby> 脚本,产生出高质量的数据产品。天文数据易于获取,而且大部分是可以公开使用的,你要做的只是去寻找相关数据。
比如,负责 VLT 运行的 ESO直接在他们的网站上提供数据下载服务只要访问 [www.eso.org/UserPortal][10] 并在首页创建用户就可以享有数据下载服务。如果你需要 SPHERE 数据,可以下载附近任何一个包含<ruby>系外行星<rt>exoplanet</rt></ruby>或者<ruby>原恒星盘<rt>proto-stellar discs</rt></ruby>的恒星的全部数据集。对任何 Python 高手而言,通过还原数据发现深藏于噪声中的行星或者原恒星盘,实在是件令人兴奋的事。
我鼓励你下载 ESO 或其它天文影像数据,开启你的探索历程。这里提供几条建议:
1. 首先要有一个高质量的数据集。看一些有关包含系外行星或者原恒星盘的较近恒星的论文,然后在 <http://archive.eso.org/wdb/wdb/eso/sphere/query> 之类的网站检索数据。需要注意的是,前述网站上的数据有的标注为红色,有的标注为绿色,标注为红色的数据是尚未公开的,在相应的“发布日期”处会注明数据将来公开的时间。
2. 了解一些用于获取你所用数据的仪器的信息。尽量对数据的获取有一个基本的理解,对标准的数据还原之后应该是什么样子做到心中有数。所有的望远镜和仪器都有这方面的文档供公开获取。
3. 必须考虑天文数据的标准问题,并予以校正:
1. 数据以 FITS 格式文件保存。需要使用 `pyfits` 或者 `astropy` (包含 `pyfits` )将其读入到 `NumPy` 数组。有些情况下,数据是三维的,需要沿 z 轴使用 `numpy.median` 将数据转换为二维数组。有些 SPHERE 数据在同一幅影像中包含了同一片天空的两份拷贝(各自使用了不同的滤波器),这时候需要使用 **索引****切片** 将它们分离出来。
2. <ruby>全黑图<rt>master dark</rt></ruby><ruby>坏点图<rt>bad pixel map</rt></ruby>。所有仪器都有快门全关(完全无光)状态拍摄的特殊图片,使用 **NumPy 掩膜数组** 从中分离出坏点图。坏点图非常重要,你在合成最终的清晰图像过程中,需要持续跟踪坏点。有些情况下,这还有助于你从原始科学数据中扣除暗背景的操作。
3. 一般情况下,天文仪器还要拍<ruby>标准响应图<rt>master flat frame</rt></ruby>。这是对均匀的单色标准光源拍摄的一张或者一组图片。你需要将所有的原始数据除以标准响应之后再做后续处理(同样,使用 Numpy 掩膜数组实现的话,这仅仅是一个简单的除法运算)。
4. 对行星影像,为了使行星在明亮恒星背景下变得可见,需要仰仗<ruby>日冕仪<rt>coronagraph</rt></ruby><ruby>角差分成像<rt>angular differential imaging</rt></ruby>技术。这一步需要识别影像的光学中心,这是比较棘手的环节之一,过程中要使用 `skimage.feature.blob_dog` 从原始影像中寻找一些人工辅助影像作为帮助。
4. 要有耐心。理解数据格式并弄清如何操作需要一些时间,绘出像素数据曲线图或者统计图有助于你的理解。贵在坚持,必有收获!你会从中学到很多关于图像数据及其处理的知识。
综合应用 NumPy、SciPy、Astropy、scikit-image 及其它工具,结合耐心和恒心,通过分析大量可用的天文数据分析实现重大的发现是非常有可能的。说不定,你会成为某个之前被忽略的系外行星的第一发现者呢。祝你好运!
---
NumFOCUS 是个非盈利组织,维护着一套科学计算与数据科学方面的杰出开源工具集。如果想了解我们的任务及代码,可以访问 [numfocus.org][3]。如果你有兴趣以个人身份加入 NumFOCUS 社区,可以关注你所在地区的 [PyData 活动][4]。
本文基于 Pivigo CTO [Ole Moeller-Nilsson][12] 的一次 [谈话][11],最初发布于 NumFOCUS 的博客,蒙允再次发布。如果你有意支持 NumFOCUS可以 [捐赠][13],也可以参与遍布全球的 [PyData 活动][4] 中你身边的那些。
--------------------------------------------------------------------------------
via: https://opensource.com/article/19/10/python-astronomy-open-data
作者:[Gina Helfrich, Ph.D.][a]
选题:[lujun9972][b]
译者:[silentdawn-zz](https://github.com/silentdawn-zz)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/ginahelfrich
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/space_stars_cosmos_person.jpg?itok=XUtz_LyY (Person looking up at the stars)
[2]: https://numfocus.org/blog
[3]: https://numfocus.org
[4]: https://pydata.org/
[5]: http://numpy.scipy.org/
[6]: http://www.scipy.org/
[7]: http://scikit-image.org/
[8]: http://www.astropy.org/
[9]: https://en.wikipedia.org/wiki/Data_reduction
[10]: http://www.eso.org/UserPortal
[11]: https://www.slideshare.net/OleMoellerNilsson/pydata-lonon-finding-planets-with-python
[12]: https://twitter.com/olly_mn
[13]: https://numfocus.org/donate

View File

@ -0,0 +1,73 @@
[#]: collector: (lujun9972)
[#]: translator: (JonnieWayy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12469-1.html)
[#]: subject: (What you need to know about Rust in 2020)
[#]: via: (https://opensource.com/article/20/1/rust-resources)
[#]: author: (Ryan Levick https://opensource.com/users/ryanlevick)
2020 年关于 Rust 你所需要知道的
======
> 尽管许多程序员长期以来一直将 Rust 用于业余爱好项目,但正如许多有关 Rust 的热门文章所解释的那样,该语言在 2019 年吸引了主要技术公司的支持。
![](https://img.linux.net.cn/data/attachment/album/202007/31/001101fkh88966ktvvee99.jpg)
一段时间以来, [Rust][2] 在诸如 Hacker News 之类的网站上引起了程序员大量的关注。尽管许多人一直喜欢在业余爱好项目中[使用该语言][3],但直到 2019 年它才开始在业界流行,直到那会儿情况才真正开始有所转变。
在过去的一年中,包括[微软][4]、 [Facebook][5] 和 [Intel][6] 在内的许多大公司都出来支持 Rust许多[较小的公司][7]也注意到了这一点。2016 年,作为欧洲最大的 Rust 大会 [RustFest][8] 的第一任主持人,除了 Mozilla我没见到任何一个人在工作中使用 Rust。三年后似乎我在 RustFest 2019 所交流的每个人都在不同的公司的日常工作中使用 Rust无论是作为游戏开发人员、银行的后端工程师、开发者工具的创造者或是其他的一些岗位。
在 2019 年, Opensource.com 也通过报道 Rust 日益增长的受欢迎程度而发挥了作用。万一你错过了它们,这里是过去一年里 Opensource.com 上关于 Rust 的热门文章。
### 《使用 rust-vmm 构建未来的虚拟化堆栈》
Amazon 的 [Firecracker][9] 是支持 AWS Lambda 和 Fargate 的虚拟化技术,它是完全使用 Rust 编写的。这项技术的作者之一 Andreea Florescu 在 《[使用 rust-vmm 构建未来的虚拟化堆栈][10]》中对 Firecracker 及其相关技术进行了深入探讨。
Firecracker 最初是 Google [CrosVM][11] 的一个分支,但是很快由于两个项目的不同需求而分化。尽管如此,在这个项目与其他用 Rust 所编写的虚拟机管理器VMM之间仍有许多得到了很好共享的通用片段。考虑到这一点[rust-vmm][12] 项目起初是以一种让 Amazon 和 Google、Intel 和 Red Hat 以及其余开源社区去相互共享通用 Rust “crates” (即程序包)的方式开始的。其中包括 KVM 接口Linux 虚拟化 API、Virtio 设备支持以及内核加载程序。
看到软件行业的一些巨头围绕用 Rust 编写的通用技术栈协同工作,实在是很神奇。鉴于这种和其他[使用 Rust 编写的技术堆栈][13]之间的伙伴关系,到了 2020 年,看到更多这样的情况我不会感到惊讶。
### 《为何选择 Rust 作为你的下一门编程语言》
采用一门新语言,尤其是在有着建立已久技术栈的大公司,并非易事。我很高兴写了《[为何选择 Rust 作为你的下一门编程语言][14]》,书中讲述了微软是如何在许多其他有趣的编程语言没有被考虑的情况下考虑采用 Rust 的。
选择编程语言涉及许多不同的标准——从技术上到组织上,甚至是情感上。其中一些标准比其他的更容易衡量。比方说,了解技术变更的成本(例如适应构建系统和构建新工具链)要比理解组织或情感问题(例如高效或快乐的开发人员将如何使用这种新语言)容易得多。此外,易于衡量的标准通常与成本相关,而难以衡量的标准通常以收益为导向。这通常会导致成本在决策过程中变得越来越重要,即使这不一定就是说成本要比收益更重要——只是成本更容易衡量。这使得公司不太可能采用新的语言。
然而Rust 最大的好处之一是很容易衡量其编写安全且高性能系统软件的能力。鉴于微软 70% 的安全漏洞是由于内存安全问题导致的,而 Rust 正是旨在防止这些问题的,而且这些问题每年都使公司付出了几十亿美元的代价,所以很容易衡量并理解采用这门语言的好处。
是否会在微软全面采用 Rust 尚待观察但是仅凭着相对于现有技术具有明显且可衡量的好处这一事实Rust 的未来一片光明。
### 2020 年的 Rust
尽管要达到 C++ 等语言的流行度还有很长的路要走。Rust 实际上已经开始在业界引起关注。我希望更多公司在 2020 年开始采用 Rust。Rust 社区现在必须着眼于欢迎开发人员和公司加入社区,同时确保将推动该语言发展到现在的一切都保留下来。
Rust 不仅仅是一个编译器和一组库,而是一群想要使系统编程变得容易、安全而且有趣的人。即将到来的这一年,对于 Rust 从业余爱好语言到软件行业所使用的主要语言之一的转型至关重要。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/1/rust-resources
作者:[Ryan Levick][a]
选题:[lujun9972][b]
译者:[JonnieWayy](https://github.com/JonnieWayy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/ryanlevick
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop)
[2]: http://rust-lang.org/
[3]: https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages
[4]: https://youtu.be/o01QmYVluSw
[5]: https://youtu.be/kylqq8pEgRs
[6]: https://youtu.be/l9hM0h6IQDo
[7]: https://oxide.computer/blog/introducing-the-oxide-computer-company/
[8]: https://rustfest.eu
[9]: https://firecracker-microvm.github.io/
[10]: https://opensource.com/article/19/3/rust-virtual-machine
[11]: https://chromium.googlesource.com/chromiumos/platform/crosvm/
[12]: https://github.com/rust-vmm
[13]: https://bytecodealliance.org/
[14]: https://opensource.com/article/19/10/choose-rust-programming-language

View File

@ -0,0 +1,103 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12462-1.html)
[#]: subject: (Foliate: A Modern eBook Reader App for Linux)
[#]: via: (https://itsfoss.com/foliate-ebook-viewer/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
Foliate适用于 Linux 的现代电子书阅读器应用
======
> Foliate 是一款简洁、优雅的开源电子书阅读器,可在 Linux 桌面上提供类似 Kindle 的阅读体验。
![](https://img.linux.net.cn/data/attachment/album/202007/28/230931vpsyu25yua8855u3.jpg)
虽然我们已经有了一个 [Linux 最佳电子书阅读器][2]的列表,但最近我遇到了另一个 Linux 电子书阅读器。它叫 [Foliate][3]。
![][1]
Foliate 是一个现代的 GTK 电子书查看器,它有许多基本功能。如果你拥有亚马逊 Kindle 或其他电子书阅读器,那么你可能会想念那种在桌面上阅读的体验。
![](https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/foliate-library-view.jpg?w=800&ssl=1)
Foliate 解决了那些抱怨。Foliate 会显示书的估计剩余阅读时间和页数。你可以添加书签、高亮文本和添加注释。你可以导出数据,也可以轻松同步它们。
![Foliate Ebook Viewer Features][4]
你也可以使用维基词典和维基百科查询单词。你可以在页面视图和滚动视图之间切换。它还有几个主题,以满足你的阅读偏好。
![][5]
最棒的是,它正在积极维护和开发。
### Foliate 的功能
![][6]
让我们来看看 Foliate 提供的所有功能:
* 支持 .epub、.mobi、.azw、未打包的 EPUB 文件、文本文件、漫画存档cbr、.cbz、.cbt、.cb7小说书.fb2、.fb2.zip和 .azw3 文件。它不支持 PDF 文件。
* 它让你可以在双页浏览模式下阅读电子书,并提供滚动查看模式。
* 能够自定义字体、行距、边距和亮度。
* 图书馆视图,显示最近的书籍和阅读进度。
* 默认主题包括浅色、棕褐色、深色、Solarized 深色/浅色、Gruvbox 浅色/深色、灰色、Nord 和反转模式。
* 你还可以添加自定义主题调整电子书浏览器的外观。
* 带有章节标记的阅读进度滑块。
* 书签和注释支持。
* 能够在书中查找文本。
* 能够放大和缩小。
* 启用/禁用侧边栏进行导航。
* 使用 [维基词典][7] 和 [维基百科][8] 快速查找字典
* 使用谷歌翻译翻译文字
* 触摸板手势,使用两指滑动即可翻页
* 使用 [eSpeak NG][9] 和 [Festival][10] 支持文字转语音
### 在 Linux 上安装 Foliate
对于基于 Ubuntu 和 Debian 的 Linux 发行版,你可以从它的 [GitHub 发布页面][13]获取 .deb 文件。只需双击即可[从 deb 文件安装应用][14]。
对于 Fedora、Arch、SUSE 等其他 Linux 发行版。Foliate 可提供 [Flatpak][15] 和 [Snap][16] 包。如果你不知道如何使用它们,那么你可以按照我们[使用 flatpak][17] 和[使用 snap 包][18]指南来开始使用。
如果需要,你可以浏览它的 [GitHub 页面][19]以从源代码开始构建。
- [下载 Foliate 应用][20]
### 总结
我使用 GitHub 上提供的最新 .deb 文件在 Pop!_OS 19.10 上进行了尝试,并且效果很好。我不喜欢在桌面上阅读很久,但我喜欢它的功能。
你是否尝试过 Foliate请随时分享你的经验。
--------------------------------------------------------------------------------
via: https://itsfoss.com/foliate-ebook-viewer/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/foliate-app.jpg?ssl=1
[2]: https://linux.cn/article-10383-1.html
[3]: https://johnfactotum.github.io/foliate/
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/foliate-ebook-viewer-features.jpg?ssl=1
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/04/foliate-screenshot.jpg?ssl=1
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/foliate-options.jpg?ssl=1
[7]: https://en.wiktionary.org/wiki/Wiktionary:Main_Page
[8]: https://en.wikipedia.org/wiki/Main_Page
[9]: https://github.com/espeak-ng/espeak-ng
[10]: http://www.cstr.ed.ac.uk/projects/festival/
[13]: https://github.com/johnfactotum/foliate/releases
[14]: https://itsfoss.com/install-deb-files-ubuntu/
[15]: https://flathub.org/apps/details/com.github.johnfactotum.Foliate
[16]: https://snapcraft.io/foliate
[17]: https://itsfoss.com/flatpak-guide/
[18]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/
[19]: https://github.com/johnfactotum/foliate
[20]: tmp.6FO70BtAuy

View File

@ -0,0 +1,120 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12433-1.html)
[#]: subject: (Docker and Fedora 32)
[#]: via: (https://fedoramagazine.org/docker-and-fedora-32/)
[#]: author: (Kevin "Eonfge" Degeling https://fedoramagazine.org/author/eonfge/)
在 Fedora 32 上运行 Docker
======
![][1]
随着 Fedora 32 的发布,[Docker][2] 的普通用户面临着一个小挑战。在编写本文时Fedora 32 不支持 Docker。虽然还有其他选择例如 [Podman][3] 和 [Buildah][4],但是对于许多现有用户而言,现在切换可能不是最佳时机。因此,本文可以帮助你在 Fedora 32 上设置 Docker 环境。
### 步骤 0消除冲突
此步骤适用于从 Fedora 30 或 31 升级的任何用户。如果全新安装的 Fedora 32那么可以跳到步骤 1。
删除 docker 及其所有相关组件:
```
sudo dnf remove docker-*
sudo dnf config-manager --disable docker-*
```
### 步骤 1系统准备
在 Fedora 的最后两个版本中,操作系统已迁移到两项新技术: CGroups 和用于防火墙的 NFTables。尽管这些新技术的详细信息不在本教程的讨论范围之内但是令人遗憾的是Docker 还不支持这些新技术。因此,你必须进行一些更改才能在 Fedora 上使用 Docker。
#### 启用旧的 CGroups
Fedora 仍然支持 CGroups 的先前实现,可以使用以下命令启用它:
```
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
```
#### 在防火墙中将 Docker 列入白名单
为了让 Docker 具有网络访问权限,需要两个命令:
```
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0
sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade
```
第一个命令将 Docker 接口添加到受信任的环境,它允许 Docker 建立远程连接。第二个命令将允许 Docker 建立本地连接。当有多个 Docker 容器作为开发环境时,这特别有用。
### 步骤 2安装 Moby
[Moby][5] 是 Docker 的开源白牌版本。它基于相同的代码,但不带商标。它包含在 Fedora 的主仓库中,因此很容易安装:
```
sudo dnf install moby-engine docker-compose
```
这将安装 `moby-engine`、`docker-compose`、`containerd` 和其他一些相关的库。安装完成后,你必须启用系统级守护程序才能运行 Docker
```
sudo systemctl enable docker
```
### 步骤 3重新启动并测试
为了确保正确处理所有系统和设置,你现在必须重启计算机:
```
sudo systemctl reboot
```
之后,你可以使用 Docker hello-world 包来验证安装:
```
sudo docker run hello-world
```
除非遇到问题,不然你就会看到来自 Docker 的问候!
#### 以管理员身份运行
可选地,你现在还可以将用户添加到 Docker 的组帐户中,以便无需输入 `sudo` 即可启动 Docker 镜像:
```
sudo groupadd docker
sudo usermod -aG docker $USER
```
注销并登录以使更改生效。如果以管理员权限运行容器的想法让你有所顾虑,那么你应该研究 Podman。
### 总结
从现在起Docker 将按照你的习惯工作,包括 `docker-compose` 和所有与 `docker` 相关的工具。不要忘记查看官方文档,这在很多情况下可以为你提供帮助。
Fedora 32 上 Docker 的当前状态并不理想。缺少官方软件包可能会困扰一些人,有一个[上游问题][6]对此进行了讨论。对 [CGroups][7] 和 [NFTables][8] 缺少支持更多是技术问题,但是你可以查看它们在其公共问题上的进展。
这些指导应可以让你就像什么都没有发生一样继续工作。如果这不能满足你的需求,请不要忘记到 Moby 或 Docker Github 页面去寻求解决你的技术问题,或者看看 Podman长期来看它可能会更加强大。
--------------------------------------------------------------------------------
via: https://fedoramagazine.org/docker-and-fedora-32/
作者:[Kevin "Eonfge" Degeling][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/eonfge/
[b]: https://github.com/lujun9972
[1]: https://fedoramagazine.org/wp-content/uploads/2020/06/f32-04-twilight-816x459.png
[2]: https://docs.docker.com/
[3]: https://podman.io/getting-started/
[4]: https://buildah.io/
[5]: https://mobyproject.org/
[6]: https://github.com/docker/for-linux/issues/955
[7]: https://github.com/moby/moby/issues/40360
[8]: https://github.com/moby/moby/issues/26824

View File

@ -0,0 +1,77 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12430-1.html)
[#]: subject: (Open source tools for translating British to American English)
[#]: via: (https://opensource.com/article/20/6/british-american-cli-translator)
[#]: author: (Jeff Macharyas https://opensource.com/users/jeffmacharyas)
将英式英语翻译成美式英语的开源工具
======
> 使用这些命令行翻译器将英式英语转换为美式英语(或反之)。
![Red telephone booth on a street in England][1]
去年圣诞节,我和我的妻子去了家乡佛罗里达的皮尔斯堡,并且经常光顾海滩上的一家当地人场所。在那儿,我们遇到了一对来自英国中部地区的夫妇。音乐很响,喝酒也很闹,所以很难听清楚。另外,即使他们“似乎”在说英语,但有时理解他们在说什么仍然是一个挑战。我以为我在澳大利亚的时光会给我足够的语言能力,但是,可惜,很多东西都超出了我的想象。不止是一般的 “soccer 是 football” 或 “trunk是 boot” 之类的困惑。
幸运的是,有开源方案可以将“英式”翻译成“美式”。我们可能使用相同的语言,但是我们共同的言语却比多塞特郡沙夫茨伯里的之字形山要曲折得多!
如果你碰巧在酒吧有 Linux 笔记本,那么你可以使用方便的开源命令行程序,它就叫 [美英英语翻译器][2]MIT 许可证)。
我在我的改造运行 Linux 的 MacBook 上安装这个翻译器:
```
$ npm install -g american-british-english-translator
```
这需要我首先[安装 Node.js][3]。
### 声明!
除了翻译单词和短语,美英英语翻译器还能分析(嗯,剖析)文档。我用一个叫《独立宣言》的流行文件试了一下。它分析并返回了许多结果。其中一个比较有趣的是:
```
fall:
issue: Different meanings意思不同
details:
American English: autumn秋天
British English:
"""
to become pregnant. (Either as in 'I fell pregnant' or as in 'She fell for a baby.');(怀孕 —— 无论是“我怀孕了”还是“她怀孕了”)
```
并非如《宣言》作者所指控的“在公海俘虏”taken captive on the high seas
> ”他在公海上俘虏我们的同胞强迫他们拿起武器来反对自己的国家成为残杀自己亲人和朋友的刽子手或是死于自己的亲人和朋友的手下。“He has constrained our fellow Citizens taken Captive on the high Seas to bear Arms against their Country, to become the executioners of their friends and Brethren, or to fall themselves by their Hands.
### 还有一个
对于简单的单词替换,你可以尝试 [Common_Language][4]这是一个开源MIT 许可Python 脚本。
当然,要与同伴一起喝几杯,你也许需要实际交流,并能理解他们。这就是需要用到 MARY 了。
[MaryTTS][5] 是一个使用 JavaGNU 许可)编写的开源多语言文本到语音合成平台。方便的[基于浏览器的界面][6]使你可以轻松地将美国酒吧谈话内容转换为男声或女声的正确英语(或其他语言)。
现在我可以和我的英国朋友们见面了(可以安全地再来一次),喝几杯!像当地人一样讲英语!大家干杯!
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/6/british-american-cli-translator
作者:[Jeff Macharyas][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/jeffmacharyas
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/england-telephone-booth-street.jpg?itok=JQsc_piX (Red telephone booth on a street in England)
[2]: https://github.com/hyperreality/American-British-English-Translator
[3]: https://nodejs.org/en/download/
[4]: https://github.com/willettk/common_language
[5]: https://github.com/marytts/marytts
[6]: http://mary.dfki.de:59125/

View File

@ -0,0 +1,78 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12427-1.html)
[#]: subject: (How to crop images in GIMP [Quick Tip])
[#]: via: (https://itsfoss.com/crop-images-gimp/)
[#]: author: (Dimitrios Savvopoulos https://itsfoss.com/author/dimitrios/)
GIMP 教程:如何使用 GIMP 裁剪图像
======
你可能想在 [GIMP][1] 中裁剪图像的原因有很多。例如,你可能希望删除无用的边框或信息来改善图像,或者你可能希望最终图像的焦点是在一个特定细节上。
在本教程中,我将演示如何在 GIMP 中快速裁剪图像而又不影响精度。让我们一起来看看吧。
### 如何在 GIMP 中裁剪图像
![][2]
#### 方法 1
裁剪只是一种将图像修整成比原始图像更小区域的操作。裁剪图像的过程很简单。
你可以通过“工具”面板访问“裁剪工具”,如下所示:
![Use Crop Tool for cropping images in GIMP][3]
你还可以通过菜单访问裁剪工具:“<ruby>工具 → 变形工具 → 裁剪<rt>Tools → Transform Tools → Crop</rt></ruby>”。
激活该工具后,你会注意到画布上的鼠标光标会发生变化,以表示正在使用“裁剪工具”。
现在,你可以在图像画布上的任意位置单击鼠标左键,并将鼠标拖到某个位置以创建裁剪边界。此时你不必担心精度,因为你可以在实际裁剪之前修改最终选区。
![Crop Selection][4]
此时,将鼠标光标悬停在所选内容的四个角上会更改鼠标光标并高亮显示该区域。现在,你可以微调裁剪的选区。你可以单击并拖动任何边或角来移动部分选区。
选定完区域后,你只需按键盘上的回车键即可进行裁剪。
如果你想重新开始或者不裁剪,你可以按键盘上的 `Esc` 键。
#### 方法 2
裁剪图像的另一种方法是使用“矩形选择工具”进行选择:“<ruby>工具 → 选择工具 → 选择矩形<rt>Tools → Selection Tools → Rectangle Select</rt></ruby>”。
![][5]
然后,你可以使用与“裁剪工具”相同的方式高亮选区,并调整选区。选择好后,可以通过以下方式裁剪图像来适应选区:“<ruby>图像 → 裁剪为选区<rt>Image → Crop to Selection</rt></ruby>”。
![][6]
### 总结
对于 GIMP 用户而言,精确裁剪图像可以视为一项基本功能。你可以选择哪种方法更适合你的需求并探索其潜力。
如果你对过程有任何疑问,请在下面的评论中告诉我。如果你“渴望”更多 [GIMP 教程][7],请确保在你喜欢的社交媒体平台上订阅!
--------------------------------------------------------------------------------
via: https://itsfoss.com/crop-images-gimp/
作者:[Dimitrios Savvopoulos][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/dimitrios/
[b]: https://github.com/lujun9972
[1]: https://www.gimp.org/
[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Crop-images-in-GIMP.png?ssl=1
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/Crop-tool.png?ssl=1
[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/Crop-selection.jpg?ssl=1
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/select-1.gif?ssl=1
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/crop.gif?ssl=1
[7]: https://itsfoss.com/tag/gimp-tips/

View File

@ -0,0 +1,277 @@
[#]: collector: (lujun9972)
[#]: translator: (nophDog)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12429-1.html)
[#]: subject: (Customizing Bash)
[#]: via: (https://fedoramagazine.org/customizing-bash/)
[#]: author: (Stephen Snow https://fedoramagazine.org/author/jakfrost/)
深入了解定制 Bash
======
![](https://img.linux.net.cn/data/attachment/album/202007/19/110018bl392bj3g3g41a23.jpg)
操作系统的最外层 —— 也就是跟你直接打交道的 —— 叫做 [shell][2]“外壳”。Fedora 预装了好几种不同的 shell。shell 可以是图形界面,或者字符界面。在文档中,你常常能见到两个母缩写词 GUI <ruby>图形用户界面<rt>Graphical User Interface</rt></ruby>)跟 CLI<ruby>命令行界面<rt>Command-Line Interface</rt></ruby>),它们用来区分图形和基于字符的 shell/界面。[GNOME][5] 和 [Bash][6] 分别是 Fedora 默认的图形和命令行界面,不过你也可以使用其它 [GUI][3] 或者 [CLI][4] shell。
接下来在这篇文章中,我们会讨论一些比较推荐的 Bash 字符界面的点文件配置。
### Bash 概览
Bash 参考手册中写道:
> 根本上来说shell 只是一个能执行命令的宏处理器。宏处理器这个词意味着通过扩展文本跟符号,从而构成更复杂的表达式。
>
> **Bash 参考手册**
> **第五版Bash 5.0**
> **2019 年 5 月**
除了能使用其它程序之外Bash shell 还含有一些内置命令和关键字。Bash 内置功能很强大,甚至能够作为一门 [高级语言][7] 独当一面。Bash 的几个关键字和操作符类似于 [C 语言][8]。
Bash 能够以交互式或非交互式模式启动。Bash 的交互模式是一个很多人都熟悉的典型的终端/命令行界面。[GNOME 终端][9] 默认以交互模式打开 Bash。Bash 在非交互模式下运行的例子是,当命令和数据从文件或 shell 脚本通过 [管道][10] 传送到 Bash 时。其它 Bash 可以运行的模式包括:<ruby>登录<rt>login</rt></ruby><ruby>非登录<rt>non-login</rt></ruby><ruby>远程<rt>remote</rt></ruby>、POSIX、Unix sh、<ruby>受限<rt>restricted</rt></ruby>,以及使用与用户不同的 UID/GID 模式。各种模式是可以相互组合的。比如,交互式 + 受限 + POSIX 或者非交互式 + 非登录 + 远程。不同的启动模式,决定着 Bash 所读取的启动文件。理解这些操作模式,有助于帮助我们修改启动文件。
根据 Bash 参考手册,它会:
> 1. 从文件中...、从作为 `-c` 调用选项传入参数的字符...,或者从用户的终端中读取输入。
> 2. 将输入分解成单词和操作符,遵循 [它的] 引用规则。...这些标记使用元字符隔开。这一步执行别名展开。
> 3. 将标记解析成简单与复合命令。
> 4. 执行各种 shell 展开...,将展开之后的标记分解成文件名...以及命令和参数的列表。
> 5. 执行必要的重定向...并从参数列表中去除重定向操作符及其操作数。
> 6. 执行命令。
> 7. 必要时等待命令完成,并收集退出状态。
>
> **Bash 参考文档**
> **第五版Bash 版本 5.0**
> **2019 年 5 月**
当用户开启终端模拟器进入命令行环境时,便启动了一次交互式 shell 会话。GNOME 终端默认以非登录模式为用户打开 Shell。你可以在 “<ruby>编辑 → 首选项 → 配置文件 → 命令<rt>Edit → Preferences → Profilles → Command</rt></ruby>” 中配置 GNOME 终端以何种模式(登录与非登录式)启动。也可以在 Bash 启动时通过向其传递 `-login` 标志来要求进入登录模式。要注意一点Bash 的登录模式与非交互模式并不互斥。可以让 Bash 同时以登录模式和非交互模式运行。
### 启动 Bash
除非传入 `-noprofile` 选项,否则登录模式的 Bash shell 会默认读取并执行某些初始化文件中命令。如果 `/etc/profile` 存在,它会是第一个被执行的文件,紧接着是按 `~/.bash_profile`、`~/.bash_login` 或 `~/.profile` 顺序找到的第一个文件。当用户退出登录模式的 shell 时,或者有脚本在非交互式登录模式的 shell 中调用了内置 `exit` 命令Bash 会读取并执行 `~/.bash_logout` 中的命令,如果 `/etc/bash_logout` 存在的话,会紧接着执行它。通常来说,`/etc/profile` 会<ruby>援引<rt>source</rt></ruby> `/etc/bashrc` 文件,读取并执行其中的命令,然后查找并读取执行 `/etc/profile.d` 目录中以 `.sh` 结尾的文件。同样的,`~/.bash_profile` 通常也会<ruby>援引<rt>source</rt></ruby> `~/.bashrc` 文件。`/etc/bashrc` 和 `~/.bashrc` 都会进行检查,避免重复<ruby>援引<rt>source</rt></ruby>
LCTT 译注:在 Bash 中,脚本会通过 `source``.` 命令来将另外一个脚本引入其中,这个行为称之为 “source”、“sourcing”但是该行为一直没有公认且常用的翻译方法。经过多番斟酌我认为可以译做“援引”理由如下1、“援引”具有“引用、引入”的意思符合该行为2、“援”这个词的发音和“source” 常见的汉语意思“源”同音,便于记忆。以上是我们的愚见,供大家参考讨论。—— 老王2020/7/19
一个交互式的 shell如果不是登录 shell那么当它第一次被调用的时候会执行 `~/.bashrc` 文件。这是用户在 Fedora 上打开终端时通常会进入的 shell 类型。当 Bash 以非交互模式启动 —— 就像运行脚本时那样 —— 它会寻找 `BASH_ENV` 环境变量。如果找到了,就会展开它的值作为文件名,接着读取并执行该文件。效果跟执行以下命令相同:
```
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
```
值得注意的是,不会使用 `PATH` 环境变量的值来搜索该文件名LCTT 译注:意即不会检索搜索路径)。
### 重要的用户点文件
Bash 最广为人知的用户点文件是 `~/.bashrc`。通过编辑该文件可以设置大多数个性化选项。由于我们常常需要设置一些选项会改动上面提及甚至没有提及的文件所以大部分自定义选项会成为一个麻烦事。Bash 环境具有很高的可定制性,正是为了适应不同用户的不同需求。
![][11]
当登录 shell 正常退出时,如果 `~/.bash_logout``/etc/bash_logout` 存在,它们会被调用。下一幅图展示了 Bash 作为交互式 shell 启动时的过程。例如,当用户从桌面环境打开终端模拟器时,会按照以下顺序进行。
![][12]
我们已经知道在不同的启动模式下Bash 会执行不同的命令,所以很明显,只有几种最需要关注的典型启动模式。分别是非交互、交互式登录 shell和非交互式、交互式非登录 shell。如果想定义某些全局环境那么需要将一个具有唯一名称、以 `.sh` 为后缀的文件(例如 `custom.sh`)放置在 `/etc/profile.d` 目录。
对于非交互式非登录启动方式需要特别注意。在这种模式下Bash 会检查 `BASH_ENV` 变量。如果定义了该变量Bash 会援引它所指向的文件。另外,处理 `BASH_ENV` 时并不会使用 `PATH` 变量所存储的值LCTT 译注意即不会检索搜索路径所以它必须包含执行文件的绝对路径。比如说如果有人希望非交互式执行脚本时shell 能读取 `~/.bashrc` 文件中的设置,那么他可以把类似下面这样的内容放在一个名为 `/etc/profile.d/custom.sh` 的文件中...
```
# custom.sh
.
.
.
# 如果使用 Fedora Workstation
BASH_ENV="/home/username/.bashrc"
.
.
.
# 如果使用 Fedora Silverblue Workstation
BASH_ENV="/var/home/username/.bashrc"
export BASH_ENV
```
上面这份脚本会让每个 shell 脚本在运行之前先执行该用户的 `~/.bashrc`
用户一般都会自定义他们的系统环境,以便契合他们自己的工作习惯与偏好。举例来说,用户可以通过别名来实现这种程度的自定义。拥有相同起始参数、需要频繁使用的命令是制作别名的最佳选择。以下展示了一些来自 `~/.bashrc` 文件中定义的别名。
```
# .bashrc
# 执行全局文件
if [ -f /etc/bashrc ];
then . /etc/bashrc
fi
.
.
.
# 用户别名和函数
alias ls='ls -hF --color=auto'
alias la='ls -ahF --color=auto'
# 让 dir 命令用起来像在 Windows 那样
alias dir='ls --color=auto --format=long'
# 用颜色高亮 grep 结果
alias grep='grep --color=auto'
```
在系统中,别名是一种自定义各种命令的方法。它能减少击键次数,而且让命令用起来更方便。针对用户级别的别名通常存放在该用户的 `~/.bashrc` 文件中。
如果你发现自己经常要去历史中查找曾经执行过的某条命令,那可能需要改改历史设置了。你依然可以在 `~/.bashrc` 文件中设置针对用户级别的历史选项。比如说,如习惯同时使用多个终端,那你可能要启用 `histappend` 选项。某些 Bash 相关的 shell 选项本质上是布尔值(接收 `on``off`),通常可以用内置命令 `shopt` 启用或禁用。接收更复杂的值的 Bash 选项(如 `HISTTIMEFORMAT`),常常通过赋值给环境变量来达到配置目的。以下演示如何以 shell 选项和环境变量定制 Bash。
```
# 配置 Bash 历史
# 用制表符扩展目录环境变量,并设置 histappend
shopt -s direxpand histappend
# ignoreboth 等同于 ignorespace 和 ignoredup
HISTCONTROL='ignoreboth'
# 控制 `history` 输出中的时间格式
HISTTIMEFORMAT="[%F %T] "
# 无限历史记录
# NB在新版 Bash 中,任何 < 0 的写法都有效但是在 CentOS/RHEL 只有这样才行得通
HISTSIZE=
HISTFILESIZE=
# 或者对于使用新版 Bash 的人
HISTSIZE=-1
HISTFILESIZE=-1
```
上面例子中的 `direxpand` 选项,可以让 Bash 在文件名补全时,用单词展开结果替换目录名。它会改变 readline 编辑缓冲区的内容,所以你所输入的东西已经被补全得到的结果替换了。
`HISTCONTROL` 变量用于启用或禁用命令历史的某些过滤选项。重复行、以空白打头的行,都能通过该选项将它们从命令历史中过滤掉。引用自 Dusty Mabe这是我从他那儿得到的技巧
> `ignoredup` 可以让历史不记录重复条目(如果你反复执行同一条命令)。`ignorespace` 会忽略前面有空白的条目,当你在设置一个包含敏感信息的环境变量或者执行一条不想被记录进磁盘的命令时,这就很有用。`ignoreboth` 相当于这两条选项的结合体。
>
> **Dusty Mabe Redhat 首席软件工程师2020.6.19**
对于命令行重度用户Bash 有一个 `CDPATH` 环境变量。如果 `CDPATH` 包含一系列供 `cd` 命令搜索的目录,且提供一个相对路径作为第一个参数,那么它会按顺序检查所有列出的目录,寻找匹配的子目录并切换到第一个匹配结果目录。
```
# .bash_profile
# 设置 CDPATH
CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"
# 也可以写成这样
CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"
export CDPATH
```
`CDPATH` 通常像 `PATH` 一样的方式进行更新 —— 通过在赋值右侧引用自身来保留原来的值。
```
# .bash_profile
# 设置 CDPATH
CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"
# 或者写成这样
CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"
CDPATH="$CDPATH:~/favdir4:~/favdir5"
export CDPATH
```
`PATH` 是另一个极其重要的变量。它是系统上的命令的搜索路径。注意,有些应用要求将它们自己的目录加入 `PATH` 变量,这样才能正常使用。跟 `CDPATH` 一样,通过在赋值右侧引用原值来追加新值到 `PATH` 变量。如果你希望将新值前置,只需要把原来的值(`$PATH`)放到列表末尾即可。还有注意的是在 Fedora这一列值通过冒号分隔`:`)。
```
# .bash_profile
# 添加 PATH 值到 PAHT 环境变量
PATH="$PATH:~/bin:~:/usr/bin:/bin:~/jdk-13.0.2:~/apache-maven-3.6.3"
export PATH
```
命令提示符是另一个流行的自定义选项。它有七个可定制的参数:
> - `PROMPT_COMMAND`:如果设置了,会在每一个主提示符(`$PS1`)出现之前执行该值。
> - `PROMPT_DIRTRIM`:如果设置成大于零的数,则该值用作展开 `\w``\W` 提示符字符串转义符时保留的尾随目录组件数量。删除的字符将替换为省略号。
> - `PS0`:这个参数的值像 `PS1` 一样展开,在交互式 shell 读取命令之后、执行命令之前展示。
> - `PS1`:主提示符字符串。默认值是 `\s-\v\$ `
> - `PS2`:次提示符字符串。默认是 `> `。在显示之前,`PS2` 像 `PS1` 那样展开。
> - `PS3`:这个参数的值用作 `select` 命令的提示符。如果这个变量没有设置,`select` 命令会用 `#? ` 作为提示符。
> - `PS4`:这个参数的值像 `PS1` 那样展开,如果设置了 `-x` 选项,这个展开值会在命令行被回显之前作为提示符显示。展开后的值的第一个字符在必要时会复制数次,指示间接层数。默认值是 `+ `
>
> **Bash 参考文档**
> **第五版Bash 版本 5.0**
> **2019 年 5 月**
Bash 的这一个方面就可以用整篇文章来讨论。你可以找到许许多多信息和例子。在本文末尾链接的存储库中提供了一些点文件范例,包括提示符重新配置。你可以随意使用该存储库中的例子进行学习和体验。
### 总结
既然你已经掌握了一些 Bash 的工作原理,那就可以轻松修改你的 Bash 点文件,满足你自己的需求和习惯。美化你的提示符,制作一些别名,这样你的电脑才真的属于你。查看 `/etc/profile`、`/etc/bashrc` 和 `/etc/profile.d/` 这些文件的内容,获得一些启发。
你也可以在这里写一些关于终端模拟器的评论。有很多办法可以将你最喜欢的终端,完全配置成你想要的样子。你或许早就想到了,但是通常可以通过……嗯……用户家目录的点文件实现这个目的。终端模拟器也可以作为登录会话启动,有些人总喜欢用登录环境。你使用终端和电脑的姿势,取决于你如何修改(或不修改)你的点文件。
如果你很好奇自己的命令行处于什么会话状态,使用下面这个脚本来判断一下。
```
#!/bin/bash
case "$-" in
(*i*) echo This shell is interactive ;;
(*) echo This shell is not interactive ;;
esac
```
把这几行放到一个文件里,加上可执行权限,然后运行,就能看到你当前处于何种类型的 shell。`$-` 在 Bash 中是一个变量,如果是交互式 shell它会包含字母 `i`。此外,你可以直接输出 `$-` 变量然后检查它的输出中是否含有 `i` 标记。
```
$ echo $-
```
### 参考信息
可以参考以下资料以获取更多信息和示例。Bash 手册也是一个很好的信息来源。请注意,确保你的本地手册页记录了你当前运行的 Bash 版本的特性,因为在网上找到的信息有时可能太老(过时了)或太新(你的系统还没有安装)。
- <https://opensource.com/tags/command-line>
- <https://opensource.com/downloads/bash-cheat-sheet>(在该网站中,你必须要输入一个有效的电子邮箱地址,或者注册,才能下载。)
- <https://opensource.com/article/19/12/bash-script-template>
对本文有各种形式(点文件示例、提示,以及脚本文件)贡献的社区成员:
* Micah Abbott 首席质量工程师
* John Lebon 首席软件工程师
* Dusty Mabe 首席软件工程师
* Colin Walters 高级首席软件工程师
示例点文件和脚本可以在这个存储库中找到:
- <https://github.com/TheOneandOnlyJakfrost/bash-article-repo>
请仔细检查上面所提供的存储库中的信息。有些可能已经过时了。里面还包含很多开发中的自定义脚本和<ruby>宠物容器<rt>pet container</rt></ruby>配置例子,那些不是点文件。我推荐从 John Lebon 的点文件开始学习,从头到尾都含有完善的解说,它们是我见过的最详细的,并且包含了非常好的描述。祝你学得开心!
--------------------------------------------------------------------------------
via: https://fedoramagazine.org/customizing-bash/
作者:[Stephen Snow][a]
选题:[lujun9972][b]
译者:[nophDog](https://github.com/nophDog)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/jakfrost/
[b]: https://github.com/lujun9972
[1]: https://fedoramagazine.org/wp-content/uploads/2020/05/bashenvironment-816x346.png
[2]: https://en.wikipedia.org/wiki/Shell_(computing)
[3]: https://fedoramagazine.org/fedoras-gaggle-of-desktops/
[4]: https://en.wikipedia.org/wiki/Comparison_of_command_shells
[5]: https://en.wikipedia.org/wiki/GNOME
[6]: https://en.wikipedia.org/wiki/Bash_(Unix_shell)
[7]: https://en.wikipedia.org/wiki/High-level_programming_language
[8]: https://en.wikipedia.org/wiki/C_(programming_language)
[9]: https://en.wikipedia.org/wiki/GNOME_Terminal
[10]: https://en.wikipedia.org/wiki/Pipeline_(Unix)
[11]: https://fedoramagazine.org/wp-content/uploads/2020/06/bash-initialization-1-1024x711.png
[12]: https://fedoramagazine.org/wp-content/uploads/2020/06/bash-initialization-2-1024x544.png
[13]: https://en.wikipedia.org/wiki/Boolean_data_type

View File

@ -0,0 +1,67 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12450-1.html)
[#]: subject: (Customizing my Linux terminal with tmux and Git)
[#]: via: (https://opensource.com/article/20/7/tmux-git)
[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
使用 tmux 和 Git 自定义我的 Linux 终端
======
> 设置你的控制台,以便你能知道身处哪个目录和该做什么
![](https://img.linux.net.cn/data/attachment/album/202007/25/102841u8u6ns4tp9z8bnha.jpg)
我使用 GNOME 终端,主要是因为它是我的发行版的默认设置。但是我终端内远非“默认值”。在我开始解释如何自定义它之前,它现在是这个样子:
![Moshe Zadka's terminal][2]
### 从底部开始
我使用终端多路复用技术 [tmux][4] 管理我的终端体验。
在上图的底部,你可以看到我的绿色 tmux 栏。底部的 `[3]` 表示它是第三个终端:每个终端都运行自己的 tmux 会话。(我创建了一个新会话来放大字体,这样可在截图中更容易看到;这是它与其他终端之间的唯一区别。)
提示符看起来也很有趣,对吧?在提示符中塞入了太多信息后,我喜欢插上一个换行符,这样一来,如果我想即兴进行 shell 编程或编写一个传递了五次的管道,也不会超出屏幕界限。这样做的代价是简单的命令序列(新建、复制、移动)会更快地滚动出我的屏幕。
行末是 <ruby>[阿列夫零][5]<rt>Aleph null</rt></ruby> 字符,它是最小的[无穷基数][6]。我希望内容行的结束很明显,并且当我意识到“阿列夫”和下标 0 都是 Unicode 字符时,我无法抗拒使用“阿列夫零”作为提示符的一部分的诱惑。(数学极客们,团结起来!)
在此之前是我的用户名。由于我在不同用户名的多台计算机上使用相同的[点文件][7](保存在 Git 中),因此这个还算有用。
在我的用户名之前,是我所在目录的最后一部分。完整路径通常太长且无用,而当前目录对于像我这样的经常忘记在做什么人来说是很有用的。在此之前是机器的名称。我所有的机器都以我喜欢的电视节目命名。我的旧笔记本是 `mcgyver`
提示符中的第一位是我最喜欢的:一个让我知道目录的 Git 状态的字母。如果目录为“不在 Git 中”,那么是 `G`。如果目录为“没有问题”OK且无需任何操作那么是 `K`。如果有 Git 未知的文件需要添加或忽略,那么是 `!`。如果需要提交,那么是 `C`。如果没有上游,那么是 `U`。如果存在上游,但我没有推送,那么是 `P`。该方案不是基于当前状态,而是描述了我要做的*下一个动作*。(要回顾 Git 术语,请阅读[本文][8]。)
终端功能是通过一个有趣的 Python 程序完成的。它运行 `python -m howsit`(在我把 [howsit][9] 安装在虚拟环境中之后)。
你可以在上图中看到渲染效果,但是为了完整起见,这是我的 `PS1`
```
[$(~/.virtualenvs/howsit/bin/python -m howsit)]\h:\W \u ℵ₀  
$
```
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/tmux-git
作者:[Moshe Zadka][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/moshez
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop)
[2]: https://opensource.com/sites/default/files/uploads/terminal-tmux-moshezadka.png (Moshe Zadka's terminal)
[3]: https://creativecommons.org/licenses/by-sa/4.0/
[4]: https://opensource.com/article/20/1/tmux-console
[5]: https://simple.wikipedia.org/wiki/Aleph_null
[6]: https://gizmodo.com/a-brief-introduction-to-infinity-5809689
[7]: https://opensource.com/article/19/3/move-your-dotfiles-version-control
[8]: https://opensource.com/article/19/2/git-terminology
[9]: https://pypi.org/project/howsit/

View File

@ -0,0 +1,130 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12425-1.html)
[#]: subject: (openSUSE Leap 15.2 Released With Focus on Containers, AI and Encryption)
[#]: via: (https://itsfoss.com/opensuse-leap-15-2-release/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
openSUSE Leap 15.2 发布重点关注容器、AI 和加密
======
![](https://img.linux.net.cn/data/attachment/album/202007/16/230428vklhwrzllll2eu82.jpg)
[openSUSE][1] Leap 15.2 最终带来了一些有用的变化和改进。
同时,我想到 SUSE 这篇让人激动的公告《[消除 Leap 差异][2]》openSUSE Leap 15.2 的发布使我们下一步将 SLE[SUSE Linux Enterprise][3])二进制文件集成到 openSUSE Leap 15.3 更加近了一步。
让我们看一下 openSUSE Leap 15.2 中发生了哪些变化和改进。
### openSUSE Leap 15.2:关键变化
![][4]
总体而言openSUSE Leap 15.2 发行版涉及安全更新、新的主要软件包、bug 修复以及其他改进。
该项目的开发人员 Marco Varlese 在新闻稿中提到:
>“ Leap 15.2 代表了人工智能领域的巨大进步,我很高兴 openSUSE 用户现在终于可以通过我们的仓库使用机器学习/深度学习框架和应用,以享受稳定和最新的生态系统。”
尽管这暗示了可能涉及的一些变化,以下是 openSUSE Leap 15.2 中的新功能:
#### 添加人工智能AI和机器学习包
毫无疑问人工智能AI和机器学习是最具颠覆性的技术。
为了向用户提供便利openSUSE Leap 15.2 为新的开源技术添加了许多重要的软件包:
* [Tensorflow][5]
* [PyTorch][6]
* [ONNX][7]
* [Grafana][8]
* [Prometheus][9]
#### 引入实时内核
![][10]
在 openSUSE Leap 15.2 中,将引入实时内核来管理[微处理器][11]的时序,以有效处理时间关键的事件。
实时内核的添加对于现实意义重大。项目委员会主席 Gerald Pfeifer 的讲话如下:
>“将实时内核添加到 openSUSE Leap 开启了新的可能性。想想边缘计算、嵌入式设备、数据抓取所有这些都在飞速发展。从历史上看其中很多都是专有领域。现在openSUSE 为有兴趣测试实时功能的开发者、研究人员和公司甚至贡献者将打开了通道。这是另一个开源帮助开放的领域!”
#### 纳入容器技术
在最新版本中,你会注意到 [Kubernetes][12] 作为官方包而纳入其中。这让用户可以轻松地自动化部署、扩展和管理容器化的应用。
[Helm][13]Kubernetes 的包管理器)也是内置的。不仅于此,你还可以在此找到其他一些附加功能,从而可以更轻松地保护和部署容器化应用。
#### 更新的 openSUSE 安装程序
![][14]
openSUSE 的安装程序已经非常不错。但是,在最新的 Leap 15.2 版本中,它们添加了更多信息,兼容从右至左语言(如阿拉伯语)以及一些小的更改,从而在安装时更容易选择。
#### YaST 改进
尽管 [YaST][15] 已经是一个非常强大的安装和配置工具,但是此发行版增加了创建和管理 Btrfs 文件系统以及实施高级加密技术的能力。
当然,你肯定知道 [openSUSE 在 WSL][16] 的可用性。因此,根据 Leap 15.2 的发行说明YaST 与 WSL 的兼容性得到了改善。
#### 桌面环境改进
![][17]
可用的桌面环境已更新为最新版本,包括 [KDE Plasma 5.18 LTS][18] 和 [GNOME 3.34][19]。
你还能发现更新的 [XFCE 4.14][20] 桌面在 openSUSE Leap 15.2 上也是可用的。
如果你想知道最新版本的所有详细信息,可以参考[官方发布公告][21]。
### 下载和可用性
目前,你可以找到 Leap 15.2 的 Linode 云镜像。另外,你会注意到其他云托管服务(如 AWS、Azure 和其他服务)也提供了它。
你还可以从官方网站获取 DVD ISO 或网络镜像文件。
要升级你当前的安装,我建议按照[官方说明][22]操作。
- [openSUSE Leap 15.2][23]
你尝试过 openSUSE Leap 15.2 了么?请随时让我知道你的想法!
--------------------------------------------------------------------------------
via: https://itsfoss.com/opensuse-leap-15-2-release/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://www.opensuse.org/
[2]: https://www.suse.com/c/sle-15-sp2-schedule-and-closing-the-opensuse-leap-gap/
[3]: https://www.suse.com/
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/opensuse-leap-15-2-gnome.png?ssl=1
[5]: https://www.tensorflow.org
[6]: https://pytorch.org
[7]: https://onnx.ai
[8]: https://grafana.com
[9]: https://prometheus.io/docs/introduction/overview/
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/opensuse-leap-15-2-terminal.png?ssl=1
[11]: https://en.wikipedia.org/wiki/Microprocessor
[12]: https://kubernetes.io
[13]: https://helm.sh
[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/opensuse-leap-15-2.png?ssl=1
[15]: https://yast.opensuse.org/
[16]: https://itsfoss.com/opensuse-bash-on-windows/
[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/opensue-leap-15-2-kde.png?ssl=1
[18]: https://itsfoss.com/kde-plasma-5-18-release/
[19]: https://itsfoss.com/gnome-3-34-release/
[20]: https://www.xfce.org/about/news/?post=1565568000
[21]: https://en.opensuse.org/Release_announcement_15.2
[22]: https://en.opensuse.org/SDB:System_upgrade
[23]: https://software.opensuse.org/distributions/leap

View File

@ -0,0 +1,57 @@
[#]: collector: (lujun9972)
[#]: translator: (Yufei-Yan)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12435-1.html)
[#]: subject: (Project OWL: IoT trying to hold connectivity together in disasters)
[#]: via: (https://www.networkworld.com/article/3564980/project-owl-iot-trying-to-hold-connectivity-together-in-disasters.html)
[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/)
OWL 项目:物联网正尝试在灾难中让一切保持联络
======
> 当自然灾害破坏了传统的通信连接时,配置在<ruby>多跳网络<rt>mesh network</rt></ruby>的物联网设备可以迅速部署以提供基本的连接。
![](https://img.linux.net.cn/data/attachment/album/202007/21/135614mwr8rxr6lw5xefjs.jpg)
OWL 项目负责人在最近的开源峰会上说,一个以多跳网络、物联网和 LoRa 连接为中心的开源项目可以帮助急救和受灾人员在自然灾害之后保持联系。
OWL 项目的应用场景是当在自然灾害之后频繁发生的通信中断时。无论是蜂窝网络还是有线网络,大范围的中断会频繁阻碍急救服务、供应和在暴风雨或其他重大灾难后必须解决关键问题的信息流。
该项目通过一大群“<ruby>鸭子<rt>duck</rt></ruby>”(便宜、易于部署且不需要现有基础设施支持的小型无线模块)实现这个目的。一些“鸭子”是太阳能的,其它一些则用的是耐用电池。每只“鸭子”配备一个 LoRa 无线电,用于在网络上和其它“鸭子”进行通信,同时还配备有 Wi-Fi而且可能配备蓝牙和 GPS 来实现其他功能。
这个想法是这样的,当网络瘫痪时,用户可以使用他们的智能手机或者笔记本电脑与“鸭子”建立一个 Wi-Fi 连接,这个“鸭子”可以将小块的信息传递到网络的其他部分。信息向网络后端传递,直到到达“<ruby>鸭子爸爸<rt>papaduck</rt></ruby>”,“鸭子爸爸”装备了可以与云上的 OWL 数据管理系统连接的卫星系统OWL 代表 ”<ruby>组织<rt>organization</rt></ruby><ruby>位置<rt>whereabouts</rt></ruby><ruby>物流<rt>logistics</rt></ruby>”)。信息可以通过云在智能手机或者网页上进行可视化,甚至可以通过 API 插入到现有的系统中。
秘密在于“<ruby>鸭群<rt>ClusterDuck</rt></ruby>” 协议,这是一个开源固件,即使在一些模块不能正常工作的网络中,它仍然能保持信息流通。它就是设计用来工作在大量便宜且容易获取的计算硬件上,类似树莓派的硬件,这样可以更容易且更快捷的建立一个“鸭群”网络。
创始人 Bryan Knouse 表示,这个项目的创建,是因为在 2017 年和 2018 年的毁灭性飓风中,要与受影响社区进行有效的通信而采取救援措施,面临着巨大的困难。
“我们的一些创始成员经历了这些灾难,然后我们会问‘我们该做些什么?’”,他说道。
在马亚圭斯该项目有一批来自波多黎各大学的学生和教授大多数的系统测试都在那里进行。Knouse 说,校园中目前有 17 个太阳能“鸭子”,分布在屋顶和树上,并且计划增加数量。
他说,“这种关系实际上创建了一个开源社区,这些学生和教授正在帮助我们开发这个项目。”
--------------------------------------------------------------------------------
via: https://www.networkworld.com/article/3564980/project-owl-iot-trying-to-hold-connectivity-together-in-disasters.html
作者:[Jon Gold][a]
选题:[lujun9972][b]
译者:[Yufei-Yan](https://github.com/Yufei-Yan)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://www.networkworld.com/author/Jon-Gold/
[b]: https://github.com/lujun9972
[1]: https://images.idgesg.net/images/article/2019/01/owl-face-100785829-large.jpg
[2]: https://creativecommons.org/licenses/by/2.0/legalcode
[3]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html
[4]: https://www.networkworld.com/article/3356838/how-to-determine-if-wi-fi-6-is-right-for-you.html
[5]: https://www.networkworld.com/article/3250268/what-is-mu-mimo-and-why-you-need-it-in-your-wireless-routers.html
[6]: https://www.networkworld.com/article/3402316/when-to-use-5g-when-to-use-wi-fi-6.html
[7]: https://www.networkworld.com/article/3306720/mobile-wireless/how-enterprises-can-prep-for-5g.html
[8]: https://www.networkworld.com/article/3560993/what-is-wi-fi-and-why-is-it-so-important.html
[9]: https://www.facebook.com/NetworkWorld/
[10]: https://www.linkedin.com/company/network-world

View File

@ -0,0 +1,153 @@
[#]: collector: (lujun9972)
[#]: translator: (silentdawn-zz)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12463-1.html)
[#]: subject: (Program IoT systems using Python with this VSCode plugin for RTOS)
[#]: via: (https://opensource.com/article/20/7/python-rt-thread)
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
通过 VSCode RTOS 插件使用 Python 为物联网系统编写程序
======
> RTOS 之类的实时嵌入式操作系统使嵌入式系统的编程更简单
![](https://img.linux.net.cn/data/attachment/album/202007/29/001132c37u7u5qp284wef2.jpg)
物联网IoT无处不在它意味着几乎所有的产品从冰箱到口袋手表都可以连网。为了实现这个目标每个产品都需要拥有一个嵌入式计算机来运行网络栈有些产品几乎是小的不可思议。这就是嵌入式软件出现的场景现代科技打造的非常小的计算机硬编码到硬件芯片不需要任何板外处理器、内存或者存储盘。
就传统视角而言,这种场景意味着没有操作系统可用,但是因为种种 [原因][2],开发者发现,类似于 RTOS 之类的实时嵌入式操作系统能让嵌入式系统的编程变得非常简单。
虽然 RT-Thread 嵌入式操作系统致力于鼓励程序员新手进入物联网领域,但并非所有的人都具备使用 C 语言硬编码微芯片的能力。幸运的是MicroPython 通过让开发者创建运行于嵌入式系统的 Python 代码的方式逐渐填补了这个鸿沟。为了让整个过程更简单RT-Thread 有一个可以用于 VSCode 和 [VSCodium][4] 的插件,为开发者提供了物联网方面的开发环境。其部分特性包括:
* 方便的连接方式,可以很容易的通过串口、网络或者 USB 连接到开发板(如果你使用过 Arduino肯定会很熟悉这个流程
* 支持上传文件或目录到开发板。
* 支持基于 MicroPython 的代码,而且具有智能的代码补完、语法检查功能。
* 支持 MicroPython REPL 交互式环境。
* 丰富的示例代码和演示程序。
* 完整的工程同步功能。
* 快速运行内存中的程序代码。
* 运行函数的代码片段。
* 支持主流的 MicroPython 开发板。
* 支持 Linux 和 Windows 操作系统,并经过充分测试。
### 准备
在开始之前,如果你使用的是 Windows 操作系统,那么必须保证 VSCode 的默认终端是 [PowerShell][5]。运行 VSCodium从 “Terminal” 菜单项启动一个终端. 在显示在 VSCodium 窗口底部的终端界面,从下拉菜单顶端选择 “PowerShell”。
不论你是在 [Windows][6] 还是 Linux 系统下工作,必须保证安装了 Python 3在 Linux 上,它可能已经安装了,否则可以通过软件库安装它)。
还要安装的是微软提供的通用 VSCode Python 插件。安装方法是点击 “File” 菜单,找到 “Preferences” 子菜单,从中打开 “Extensions” 面板。在扩展中,搜索 “Python”找到来自微软的 Python 插件。
![VSCodium Python plugin][7]
当然,在上述操作之前,你要先正确安装 [VSCodium][9] 或 [VSCode][10]。
### 安装插件
安装 MicroPython 开发插件的方法与安装 Python 插件一样,点击 “File” 菜单,找到 “Preferences” 子菜单,选择 “Extensions”。
在扩展中,搜索 “MicroPython”安装 RT-Thread 插件。
![MicroPython plugin for RT-Thread][11]
### 使用插件
你的开发板必须能访问串口,这需要组策略的允许。你可能需要将自己的账户加入该组,通常在默认情况下你的账户可能并不在该组。首先,确认你的账户不在 “dialout” 组:
```
$ groups
tux users
```
本例中用户“tux”只是“tux”组和“users”组的成员所以需要将用户“tux”添加到“dialout”组
```
$ sudo usermod --append --groups dialout tux
```
退出登录或重启以载入你新的组权限。
### 创建 MicroPython 工程
MicroPython 开发的第一步是创建 MicroPython 工程用来编写和运行代码。使用 MicroPython 插件创建工程的方法是,点击左下方的 “Create MicroPython project” 按钮。
![Create MicroPython project][12]
之后会有一些提示,让你选择创建空白工程还是包含例程的工程。
### 连接到开发板
点击 VSCodium 左下方的 “Connection” 按钮,进行 VSCodium 与开发板的连接,在弹出的列表中,选择要连接的物理设备。
### 查看例程
MicroPython 插件提供了许多例程和例库,供学习和调用。获取例程的过程是,激活 MicroPython 之后VSCodium 左侧按钮条会出现“新建”快捷图标,点击该图标就可以了。点击“文档”快捷图标,会显示例程文件列表;点击“文件夹”快捷图标,会显示例库列表。
![MicroPython examples][13]
### 直接在开发板上运行 MicroPython 文件
在 VSCodium 中可以通过在开发板上运行单个程序文件,很方便快捷的进行程序调试。快捷键 `Alt+Q` 会触发一个特定的插件,该插件会将当前的 Python 文件上传到开发板内存中。你还可以在当前 Python 文档界面点击右键,然后选择 “Run the MicroPython file directly on the device” 实现同样的功能。
![Running code on your device][14]
如果你需要以不上传代码的方式检查一组代码,可以使用“代码片段”功能。要运行 MicroPython REPL 环境中的代码片段,在编辑器中选中要运行的片段,右键菜单中点击 “Execute the selected MicroPython code on the device” (也可以使用 `Alt+Q` 快捷键)。
### 加载文件和目录到开发板
如果需要加载文件或目录到开发板,有现成的方法可用:选中工程中要加载到开发板的文件或目录,在选中的对象上右键,点击右键菜单中的 “Download the file/folder to the device”。
注意,如果开发板中已有与要加载的文件或目录同名者,加载操作将导致开发板原有的内容被覆盖。
在 REPL 环境中运行 `os.listdir()` 命令,可以检查文件和目录是否成功加载。当然,也可以通过相应的命令删除 REPL 中的文件或目录。
删除文件的命令如下:
```
os.remove('file_to_delete')
```
删除目录的命令如下:
```
os.rmdir('folder_to_delete')
```
### 工程的同步
点击左下角“同步”按钮可以启动工程同步,该操作将把本地工程中所有的文件和目录同步到开发板的文件系统。建议在完成程序调试之后进行该操作,调试过程中不需要频繁进行同步操作。
工程的同步操作完成后,开发板上的文件列表可以在 “Device Files List” 列看到。
### 放手尝试
RT-Thread 以开源的方式发布 MicroPython 插件,意在为新老开发者提供帮助,它的很多特性,如代码自动补全等,与开源插件之间互有影响和促进。你如果想为嵌入式系统或物联网系统编写软件,这就是最简单的方式,没有之一。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/python-rt-thread
作者:[Seth Kenlon][a]
选题:[lujun9972][b]
译者:[silentdawn-zz](https://github.com/silentdawn-zz)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/seth
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_modules_networking_hardware_parts.png?itok=rPpVj92- (Parts, modules, containers for software)
[2]: https://opensource.com/article/20/6/open-source-rtos
[3]: https://www.rt-thread.io/
[4]: https://opensource.com/article/20/6/open-source-alternatives-vs-code
[5]: https://opensource.com/article/18/2/powershell-people
[6]: https://opensource.com/article/19/8/how-install-python-windows
[7]: https://opensource.com/sites/default/files/uploads/vscodium-python-plugin.jpg (VSCodium Python plugin)
[8]: https://creativecommons.org/licenses/by-sa/4.0/
[9]: http://vscodium.com
[10]: https://github.com/microsoft/vscode
[11]: https://opensource.com/sites/default/files/uploads/vscodium-micropython.jpg (MicroPython plugin for RT-Thread)
[12]: https://opensource.com/sites/default/files/uploads/vscodium-micropython-create.jpg (Create MicroPython project)
[13]: https://opensource.com/sites/default/files/uploads/vscodium-micropython-examples.jpg (MicroPython examples)
[14]: https://opensource.com/sites/default/files/uploads/vscodium-micropython-run.jpg (Running code on your device)

View File

@ -0,0 +1,95 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12455-1.html)
[#]: subject: (Btrfs to be the Default Filesystem on Fedora? Fedora 33 Starts Testing Btrfs Switch)
[#]: via: (https://itsfoss.com/btrfs-default-fedora/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
Fedora 33 开始测试切换到 Btrfs
======
尽管距离 Fedora 的下一个稳定版本([Fedora 33][1])还有几个月的距离,但仍有一些值得关注的变化。
在所有其他 [Fedora 33 接受的系统范围的更改][1]中,最有趣的提议是将 Btrfs 作为桌面的默认文件系统,这个提议现在已经被批准了。
这是 Fedora 对该提案的评价:
> 对于安装 Fedora 的笔记本电脑和工作站我们希望以透明的方式向用户提供文件系统功能。我们希望添加新功能同时减少处理磁盘空间不足之类的情况所需的专业知识。Btrfs 它的设计理念非常适合这个角色,让我们将其设为默认设置。
值得注意的是,在测试的最终投票结果出来之前,这不是系统范围内的更改。
但是,现在测试已经成功完成,投票结果也是赞成的 —— Fedora 33 版本已经接受了这个改动。
那么,为什么 Fedora 提出这一更改?这会有什么用么?这是糟糕的举动吗?对 Fedora 的发行有何影响?让我们在这里谈论下。
![][3]
### 它会影响哪些 Fedora 版本?
根据提议,如果测试成功,那么 Fedora 33 的所有桌面版本、spins 和 labs 都受此影响。
因此,你可以期望[工作站版本][4]将 Btrfs 作为 Fedora 33 上的默认文件系统。
### 实施此更改的潜在好处
为了改进 Fedora 在笔记本和工作站的使用Btrfs 文件系统提供了一些好处。
现在 Fedora 33 将成为默认文件系统 —— 让我来指出使用 Btrfs 作为默认文件系统的好处:
* 延长存储硬件的使用寿命
* 提供一个简单的方案来解决用户耗尽根目录或主目录上的可用空间的情况
* 不易造成数据损坏,易于恢复
* 提供更好的调整文件系统大小的功能
* 通过强制 I/O 限制来确保桌面在高内存压力下的响应能力
* 使复杂的存储设置易于管理
如果你感到好奇,你可能想更深入地了解 [Btrfs][5] 及其总体优点。
不要忘记Btrfs 已经是受支持的选项,它只是不是默认的文件系统而已。
但是总的来说感觉在Fedora 33上引入Btrfs作为默认文件系统是一个有用的变化。
### Red Hat Enterprise Linux 会不会实现它?
很明显Fedora 被认为是 [Red Hat Enterprise Linux][6] 的前沿版本。
因此,如果 Fedora 拒绝更改,那么 Red Hat 将不会实施。另一方面,如果你希望 RHEL 使用 Btrfs那么 Fedora 应该首先同意更改。
为了让你更加清楚Fedora 对其进行了详细介绍:
> Red Hat 在许多方面都很好地支持 Fedora。但是 Fedora 已经与上游紧密合作,并依赖上游。这将是其中之一。这是该提案的重要考虑因素。社区有责任确保它得到支持。如果 Fedora 拒绝,那么 Red Hat 将永远不会支持 Btrfs。Fedora 必然需要成为第一个,并提出令人信服的理由,说明它比替代方案能解决更多的问题。它的负责人相信它确实如此,毫无疑问。
另外,值得注意的是,如果你不想在 Fedora 中使用 btrfs你应该看看 [OpenSUSE][7] 和 [SUSE Linux Enterprise][8]。
### 总结
即使这个更改看起来不会影响任何升级或兼容性,你也可以在 [Fedora 项目的 Wiki 页面][9]中找到有关 Btrfs 的更改的更多信息。
你对针对 Fedora 33 发行版的这一更改有何看法?你是否要将 btrfs 文件系统作为默认文件系统?
请在下面的评论中让我知道你的想法!
--------------------------------------------------------------------------------
via: https://itsfoss.com/btrfs-default-fedora/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://fedoraproject.org/wiki/Releases/33/ChangeSet
[2]: https://fedoraproject.org/wiki/Test_Day:2020-07-08_Btrfs_default?rd=Test_Day:F33_btrfs_by_default_2020-07-08
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/btrfs-default-fedora.png?ssl=1
[4]: https://getfedora.org/en/workstation/
[5]: https://en.wikipedia.org/wiki/Btrfs
[6]: https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux
[7]: https://www.opensuse.org
[8]: https://www.suse.com
[9]: https://fedoraproject.org/wiki/Changes/BtrfsByDefault

View File

@ -0,0 +1,84 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12458-1.html)
[#]: subject: (What you need to know about automation testing in CI/CD)
[#]: via: (https://opensource.com/article/20/7/automation-testing-cicd)
[#]: author: (Taz Brown https://opensource.com/users/heronthecli)
CI/CD 中的自动化测试的概要知识
======
> 持续集成和持续交付是由测试驱动的。以下是如何做到的。
![](https://img.linux.net.cn/data/attachment/album/202007/27/210026blobu65f77accbob.jpg)
> “如果一切似乎都在控制之中,那只是你走的不够快而已。” —Mario Andretti
测试自动化是指在软件开发过程中尽可能早、尽可能快地持续关注检测缺陷、错误和 bug。这是通过使用那些追求质量为最高价值的工具完成的它们旨在*确保*质量,而不仅仅是追求质量。
持续集成/持续交付CI/CD解决方案也称为 DevOps 管道)最引人注目的功能之一是可以更频繁地进行测试,而又不会给开发人员或操作人员增加更多的手动工作。让我们谈谈为什么这很重要。
### 为什么要在 CI/CD 中实现自动化测试?
敏捷团队要更快的迭代,以更高的速度交付软件和客户满意度,而这些压力可能会危及质量。全球竞争制造了对缺陷的*低容忍度*,同时也增加了敏捷团队的压力,要求软件交付的*迭代更快*。减轻这种压力的行业解决方案是什么?是 [DevOps][2]。
DevOps 是一个大概念,有很多定义,但是对 DevOps 成功至关重要的一项技术是 CI/CD。通过软件开发流程设计一个连续的改进循环可以为测试带来新的机会。
### 这对测试人员意味着什么?
对于测试人员,这通常意味着他们必须:
* 更早且更频繁地进行测试(使用自动化)
* 持续测试“真实世界”的工作流(自动和手动)
更具体地说,任何形式的测试,无论是由编写代码的开发人员运行还是由质量保证工程师团队设计,其作用都是利用 CI/CD 基础架构在快速推进的同时提高质量。
### 测试人员还需要做什么?
具体点说,测试人员负责:
* 测试新的和现有的软件应用
* 根据系统要求评估软件来验证和确认功能
* 利用自动化测试工具来开发和维护可重复使用的自动化测试
* 与 scrum 团队的所有成员合作,了解正在开发的功能以及实施的技术设计,以设计和开发准确、高质量的自动化测试
* 分析记录在案的用户需求,并针对中等到高度复杂的软件或 IT 系统制定或协助设计测试计划
* 开发自动化测试,并与功能团队一起审查和评估测试方案
* 与技术团队合作,确定在开发环境中自动化测试的正确方法
* 与团队合作,通过自动化测试来了解和解决软件问题,并回应有关修改或增强的建议
* 参与需求梳理、估算和其他敏捷 scrum 仪式
* 协助制定标准和流程,以支持测试活动和材料(例如脚本、配置、程序、工具、计划和结果)
测试是一项艰巨的工作,但这是有效构建软件的重要组成部分。
### 哪些持续测试很重要?
你可以使用多种测试。不同的类型并不是学科之间的牢固界限。相反,它们是表示如何测试的不同方式。比较测试类型不太重要,更重要的是对每一种测试类型都要有覆盖率。
* **功能测试:** 确保软件具有其要求的功能
* **单元测试:** 独立测试软件的较小单元/组件以检查其功能
* **负载测试:** 测试软件在重负载或使用期间的性能
* **压力测试:** 确定软件承受压力(最大负载)时的断点
* **集成测试:** 测试组合或集成的一组组件的输出
* **回归测试:** 当修改任意组件(无论多么小),测试整个应用的功能
### 总结
任何包含持续测试的软件开发过程都将朝着建立关键反馈环路的方向发展,以实现快速和构建有效的软件。最重要的是,该实践将质量内置到 CI/CD 管道中,并意味着了解在软件开发生命周期中提高速度同时减少风险和浪费之间的联系。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/automation-testing-cicd
作者:[Taz Brown][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/heronthecli
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_analytics_cloud.png?itok=eE4uIoaB (Net catching 1s and 0s or data in the clouds)
[2]: https://opensource.com/resources/devops

View File

@ -0,0 +1,86 @@
[#]: collector: (lujun9972)
[#]: translator: (Yufei-Yan)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12438-1.html)
[#]: subject: (My Linux story: From Linux user to contributor)
[#]: via: (https://opensource.com/article/20/7/linux-user-contributor)
[#]: author: (Taz Brown https://opensource.com/users/heronthecli)
我的 Linux 故事:从用户到贡献者
======
> 开源社区欢迎来自不同背景和技能的贡献者。
![](https://img.linux.net.cn/data/attachment/album/202007/22/114140tfuubuvcfgujrcab.jpg)
我是一名 IT 专业人士,拥有超过 15 年经验,担任过不同职位 —— 包括系统管理员、高级 Linux 管理员、DevOps 工程师、自动化顾问和高级<ruby>敏捷专家<rt>scrum master</rt></ruby>。我开始是在 Ubuntu 上学习 Linux但是后来作为系统管理员转到 CentOS然后我又转到 Fedora 作为个人使用。但是我对技术的喜爱要远比我使用第一个 Linux 发行版要早的多,而且是来自于一部电影。
我最喜欢的电影是《<ruby>黑客<rt>Hackers</rt></ruby>》。最精彩的一幕发生在电影的开头。电影一开始,一群特工冲进一所房子抓捕臭名昭著的黑客 Zero Cool。我们马上发现 Zero Cool 其实是 11 岁的 Dade Murphy他在一天之内成功瘫痪了 1507 台计算机系统。他被指控犯罪,他的家人被处以重罚。而且,在他 18 岁之前,他都被禁止使用电脑或按键式电话。
<ruby>劳伦斯·梅森<rt>Laurence Mason</rt></ruby>扮演的 Paul Cook又名 Nikon 勋爵,是我最喜欢角色。其中一个主要原因是,我从没有看过一个黑客电影里面的人物长的像我,所以我被他的形象深深吸引了。他很神秘。这让我耳目一新,并且感到自豪,我对 IT 充满了热情,我也是一个和他很像的极客。
![Taz with astronaut][2]
### 成为一个 Linux 贡献者
15 年前,我开始使用 Linux。当我成为一个 Linux 管理员的时候Linux 就成了我的激情所在。我一直尝试找到某种方式能够为开源作出贡献当时我还不知道该从哪开始。因为这个社区实在是太大了我不知道自己能否真正成为一个有影响力的人但当我发现一些人认可我的兴趣还对我进行指导我开始彻底打开心扉问各种问题并且从社区中学习。自从那以后Fedora 社区一直是我做贡献的最主要社区。
我现在对于向开源做贡献还是有点稚嫩。当我意识到我可以用代码以外的方式来贡献时,我对开源的想法发生了改变。我更喜欢通过文档做一些贡献,因为我本质上不是一个软件开发人员,而且社区里面最迫切的需求正是文档。请记住:用户的技能和开发人员的技能同样重要。
### 我的硬件是什么?
硬件也很重要,而且现在几乎所有东西都可以运行 Linux。现在我家里的配置包括
* 联想 Thinksever TS14064 GB 内存4 x 1 TB SSD 和一个存储数据的 1 TB 机械硬盘
* 使用 RAID 5 配置的 164 TB Synology NAS
* 输入输出使用罗技 MX Master 和 MX Master 2S
* 一个定制的并且符合人体工学的 Kinesis Advantage 2 键盘
* 两个 38 寸 LG 超宽曲面显示器和一个 34 寸 LG 超宽显示器
* 一台配备 i7 六核十二线程 CPU 和 16.1 英寸 IPS 显示器的 System76 笔记本
我很喜欢 Fedora 处理外置设备的方式,比如说我的鼠标和键盘。一切都完美融合。即插即用工作正常,性能从来不受影响。
![Fedora double monitor setup][4]
### 软件是什么?
使用开源软件对我的工作非常重要。我依赖于:
* Fedora 30 作为我日常使用的 Linux 发行版
* Wekan 作为我的项目的开源<ruby>看板<rt>kanban</rt></ruby>
* [Atom][5] 作为我的文本编辑器
* Terminator 作为我日常使用的终端,因为它的网格布局以及丰富的键盘快捷键
* Neofetch 用来显示每次登录到终端时的系统信息
最后同样重要的是,我把 Powerline、Powerlevel9k 和 Vim-Powerline 搞到我的终端上来跟别人装酷。
![Multiple fedora screens][7]
### Linux 让我们走到一起
美国是个大熔炉,我也是这么看待 Linux 和像 Fedora 项目这样的特定社区的。在每个 Linux 社区中,对于不同的贡献都有很大的空间。也有很多方式可以参与进来,而且对于新的想法,也总是有发挥的空间。通过分享我过去 15 年在开源方面的经验,我希望帮助更多在科技领域的少数族裔体会到来自开源社区对多样性和包容性的认同感。
*编者注:这篇文章改编自[“Taz Brown你怎么搞 Fedora”][8],并得到许可重新发布*
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/linux-user-contributor
作者:[Taz Brown][a]
选题:[lujun9972][b]
译者:[Yufei-Yan](https://github.com/Yufei-Yan)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/heronthecli
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/contributor_spotlight_penguin.jpg?itok=azJA5Cj8 (Penguin, stylized, contributor spotlight)
[2]: https://opensource.com/sites/default/files/uploads/taz_with_astronaut_0.png (Taz with astronaut)
[3]: https://getfedora.org/
[4]: https://opensource.com/sites/default/files/uploads/fedora_double_monitor_setup.jpg (Fedora double monitor setup)
[5]: https://fedoramagazine.org/install-atom-fedora/
[6]: https://fedoramagazine.org/add-power-terminal-powerline/
[7]: https://opensource.com/sites/default/files/uploads/fedora_screens.jpg (Multiple fedora screens)
[8]: https://fedoramagazine.org/taz-brown-how-do-you-fedora/

View File

@ -0,0 +1,83 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12439-1.html)
[#]: subject: (My feature-rich and minimal Linux terminal)
[#]: via: (https://opensource.com/article/20/7/minimal-linux-terminal)
[#]: author: (Sumantro Mukherjee https://opensource.com/users/sumantro)
我的功能丰富却又保持简约的 Linux 终端
======
> 这些应用和主题可以你真正拥有你的终端。
![](https://img.linux.net.cn/data/attachment/album/202007/22/123206g5t5mmz5ozdt5f5m.jpg)
每个人都喜欢以特定的方式设置他们的工作区:它可以帮助你提高效率,并使生活更容易以一种感觉有机的方式组织事物,并拥有一个对你来说感觉良好的环境。这也绝对适用于终端。这可能就是为什么有这么多可用终端的原因。
在使用新的计算机时,我做的第一件事就是设置我的终端,让它成为我自己的终端。
我最喜欢的终端应用是 [Terminator][2],因为它的设计简约,并且内置了窗口选项。但从这里开始变得更加复杂。我将自己喜欢的终端风格描述为“功能丰富却又保持简约”。这种平衡是我经常在微调的。
我使用 zsh 作为默认 shell并使用 Ohmyzsh 来提供额外的功能。可以下载它的安装脚本来安装 Ohmyzsh
```
$ curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh --output install-zsh.sh
```
查看一遍脚本了解它做什么,并确保你有信心在计算机上运行该脚本。完成后,运行脚本:
```
$ sh ./install-zsh.sh
```
我最喜欢的主题/提示符是 [Powerlevel 10k][3],它是一个非常详细的环境视图。它包含了从命令的颜色高亮到运行时间的时间戳等所有内容。所有细节都集成到一个优雅的、具有上下文感知的提示符中。
要安装 Powerlevel10k请先在 `.oh-my-zsh/` 自定义主题目录中下载源码。
```
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git
${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/themes/powerlevel10k
```
但是,为了让 Powerlevel10k 看起来如其存储库中所示,我们需要添加一些默认不包括的字体。它们是:
* [MesloLGS NF Regular.ttf][4]
* [MesloLGS NF Bold.ttf][5]
* [MesloLGS NF Italic.ttf][6]
* [MesloLGS NF Bold Italic.ttf][7]
这将产生一个美观且具有上下文感知的终端(如 [screenfetch][8] 所示):
![terminator terminal shot via screenFetch][9]
我已经习惯了这个特殊的设置,但是,把工作环境变成自己的环境固然重要,但这也并不是一个固执地尝试新事物的理由。新终端的出现,是为了满足新一代用户的需求和要求。这意味着,即使一开始不熟悉,但最近开发的一种终端可能比你的老旧备用机更适合当今的环境和职责。
我最近一直在考虑其他选择。我开始关注 [Starship][10] 的开发情况,它将自己描述为简约的、快速的、可无限定制的提示符,适用于任何 shell。它仍然有很多在视觉上可以身临其境的细节而不会像 Powerlevel10k 那样使人分心。
你最喜欢的终端是什么?为什么?请在评论栏分享!
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/minimal-linux-terminal
作者:[Sumantro Mukherjee][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/sumantro
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_desk_home_laptop_browser.png?itok=Y3UVpY0l (Digital images of a computer desktop)
[2]: https://terminator-gtk3.readthedocs.io/en/latest/
[3]: https://github.com/romkatv/powerlevel10k
[4]: https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf
[5]: https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf
[6]: https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf
[7]: https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf
[8]: https://github.com/KittyKatt/screenFetch
[9]: https://opensource.com/sites/default/files/uploads/osdc00_edit.png (terminator terminal shot via screenFetch )
[10]: https://starship.rs/

View File

@ -0,0 +1,145 @@
[#]: collector: (lujun9972)
[#]: translator: (this-is-name-right)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12453-1.html)
[#]: subject: (Top 5 Open Source Video Conferencing Tools for Remote Working and Online Meetings)
[#]: via: (https://itsfoss.com/open-source-video-conferencing-tools/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
5 个流行的用于远程工作和在线会议的开源视频会议工具
======
你会发现网上有一些视频会议工具。一些是为专业用户量身定制的,另一些是为了日常闲聊的。
然而面对着成百上千的选择,当选择视频会议应用或服务时,安全和隐私是往往是一个重要的点。在众多选择中,哪些是最好最安全的?
所有这些(或大多数)都宣称要提供最好的安全和隐私。但是,你要知道这可不能只看表面。
幸运的是在这里,我们专注于开源和隐私友好的解决方案,所以,让我们看看你可以使用的开源视频会议工具列表。
### 顶级开源视频会议解决方案
![](https://img.linux.net.cn/data/attachment/album/202007/26/104947gyzs2eb5ybeneg5y.jpg)
如果你是商企用户,大多数视频会议解决方案可以被安装在你自己的服务器上。
对于不是系统管理员的普通人来说,其中一些解决方案还提供了现成的、免费的、基于 Web 的视频会议服务。我将在列表中每个项目的描述中提及此信息。
**备注:** 列表中的排名不分先后。
#### 1、Jitsi Meet
![][2]
Jitsi Meet 是一个令人印象深刻的开源视频会议服务。你可以在我们关于 [Jitsi Meet][3] 的单独报道中轻松找到更多信息。
为了给你一个好的开始Jitsi Meet 提供免费[官方公共实例][4]来测试它,只要你需要,就可以免费使用它。
如果你需要将其托管在你的服务器上,同时根据你的需求定制一些选项,你可以从它的[官网][5]下载到你的服务器。
尽管他们在 Linux 上提供了一个基于 Electron 的应用,其实你不必下载一个应用到你的桌面上来设置它。你只需要一个浏览器就足够了。在移动端,安卓和 iOS 都有应用。
- [Jitsi Meet][5]
#### 2、Jami
![][6]
Jami 是一个基于点对点的开源视频会议解决方案。很高兴看到分布式的服务,这意味着不依靠服务器,而只是点对点的连接。
当然了,分布式的服务有优点也有缺点。但是它是自由而开源的,那才是最重要的。
Jami 之前被称为 Ring messenger但它改了名字现在是一个 GNU 项目。
Jami 有 Linux、Windows、macOS、Android 和 iOS 的版本,所以它是一个完全跨平台的安全传送信息和视频会议的解决方案。你可以看看他们的 [GitLab 页面][7]浏览更多信息。
- [Jami][8]
#### 3、Nextcloud Talk
![][9]
[Nextcloud][10] 毫无疑问是开源远程办公工具的瑞士军刀。我们就在使用 Nextcloud。所以如果你已经配置了服务器[Nextcloud Talk][11] 显然是一个优秀的视频会议和聊天工具。
当然了,如果你还没有自己的 Nextcloud 服务器,你需要一些技术知识来进行设置它,然后才能开始使用 Nextcloud Talk。
- [Nextcloud Talk][11]
#### 4、Riot.im
![][12]
Riot.im不久会更名已经是 Slack [最好的开源替代品][13]之一。
它能让你可以创建社区、发送信息,并在一个小组/社区中开始视频会议。你可以通过任何可用的公共 [Matrix 服务器][14]来免费使用它。
如果你想要自己专用的去中心化的 Matrix 网络,你也可以在 [Modular.im][15] 上选择付费托管计划。
- [Riot.im][16]
#### 5、BigBlueButton
![][17]
BigBlueButton 是一个有趣的开源视频会议方案,专门为线上学习打造。
如果你是老师或者经营着一个学校,你也许会想试试。虽然你可以免费试用,但免费演示使用会有一定的限制。所以,最好将其托管到自己的服务器上,并且,如果你有其他的产品/服务的话,你也可以把它整合进其中。
它提供了一套很好的功能,能让你很轻松的教学生。你可以浏览它的 [GitHub 页面][18]以了解更多信息。
- [BigBlueButton][19]
#### 补充Wire
![][20]
Wire 是一个十分流行的开源的安全消息平台,为商企用户量身打造。它也提供视频电话或者网络会议选项。
如果你想要一个为你的企业或团队提供的商业开源方案,你可以试试 Wire并在试用 30 天后决定是否升级它。
就个人而言,我喜欢它的用户体验,但它是要付费的。所以我建议你决定之前,先试试看并浏览它的 [GitHub 页面][21]。
- [Wire][22]
### 总结
现在你知道一些流行开源网络视频会议方案了,你更喜欢使用哪一个?
我是否错过了任何你的最爱?请在下面的评论中告诉我你的想法!
--------------------------------------------------------------------------------
via: https://itsfoss.com/open-source-video-conferencing-tools/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[this-is-name-right](https://github.com/this-is-name-right)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/open-source-video-conferencing-tools.jpg?ssl=1
[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-meet-browser-screenshot.png?ssl=1
[3]: https://itsfoss.com/jitsi-meet/
[4]: https://meet.jit.si/
[5]: https://jitsi.org/jitsi-meet/
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/jami-screenshot.png?ssl=1
[7]: https://git.jami.net/savoirfairelinux/ring-project
[8]: https://jami.net/
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/nextcloud-talk.png?ssl=1
[10]: https://itsfoss.com/nextcloud/
[11]: https://nextcloud.com/talk/
[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/riot-communication-video.png?ssl=1
[13]: https://itsfoss.com/open-source-slack-alternative/
[14]: https://matrix.org/
[15]: https://modular.im/
[16]: https://about.riot.im/
[17]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/big-blue-button.png?ssl=1
[18]: https://github.com/bigbluebutton/bigbluebutton
[19]: https://itsfoss.com/open-source-video-conferencing-tools/bigbluebutton.org/
[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/07/wire-video-conferencing.png?ssl=1
[21]: https://github.com/wireapp
[22]: https://wire.com/en/

View File

@ -0,0 +1,57 @@
[#]: collector: (lujun9972)
[#]: translator: (JonnieWayy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12466-1.html)
[#]: subject: (My Linux story: breaking language barriers with open source)
[#]: via: (https://opensource.com/article/20/7/linux-bengali)
[#]: author: (Dr Anirban Mitra https://opensource.com/users/mitradranirban)
我的 Linux 故事:用开源打破语言壁垒
======
> 开源项目可以通过消除语言和其他障碍来帮着改变世界。
![](https://img.linux.net.cn/data/attachment/album/202007/29/230730e4mb18km1nwn4ibm.jpg)
相较于我的许多同行和同事,我的开源之旅开始得着实很晚。
2000 年,我实现了我从高中开始的梦想 —— 买一台属于我自己的个人计算机,当时我正在攻读医学研究生学位。在那之前,我对计算机的唯一接触是偶尔在图书馆或网吧上网,当时这些地方电脑使用的收费都相当高昂。所以我省下了一部分研究生津贴,设法买了一台 Pentium III 550 Mhz、128MB 内存的电脑,并且像当时大多数印度电脑的标准配置一样,装着盗版的 Windows 98 系统。
我的宿舍房间上不了网。我不得不去附近的网吧,在那里下载软件,然后随身带着几十张软盘。
当我终于拥有了自己的计算机,我非常高兴,但有一点也让我感到困扰,那就是我无法用我的母语孟加拉语写东西。我碰到了 CDAC 提供的资源CDAC 是一个政府机构,它提供的印度语言工具是基于 ISCII 的ISCII 是一个较早的国家标准,而印度语的 Unicode 标准就是基于这个标准。很难学习它的键盘布局。
### 我的第一次贡献
不久后,我遇到了一款名叫 [Yudit][2] 的软件,它使用标准的 QWERTY 键盘布局来提供印地语的拼音输入。正是在通过 Yudit我第一次遇到了诸如开源和自由软件、GNU 和 Linux 之类的术语。Yudit 也允许我把 UI 组件翻译成孟加拉语,当我将翻译提交给开发人员时,他很高兴地将它们合并到了下一个版本中,并在软件的 README 文件中称赞了我的功劳。
第一次看到一款应用程序的用户元素以我的母语呈现,我感到十分兴奋。此外,尽管对写代码的知识几乎为零,我依然能够为软件开发做出贡献。我继续为 Yudit 创建了一个从 ISCII 到 Unicode 的转换器,这个转换器还可以用于各种印度语言之间的直译。我还买了本 Linux 杂志,随刊附赠了一张 Knoppix 的免费 live CD正是通过它我体验到了 Linux 桌面。
我面临的另一个问题是缺乏与 Unicode 兼容的 OpenType Bangla 字体。我使用的字体是共享软件,我需要为它支付许可费用。我在想,“为什么不尝试亲自开发呢?”在此过程中,我通过 bengalinux.org后来更名为 Ankur 小组)接触到了分散在世界各地的孟加拉语使用者,他们正试图在 Linux 操作系统中使用孟加拉语。
我加入了他们的邮件列表,我们在内部与当局之间讨论了孟加拉语的 Unicode 和 OpenType 规范中的各种缺陷,然后在适当的时候进行了纠正。我的贡献是将传统的孟加拉字体转换为兼容 Unicode 的 OpenType 字体,翻译 UI 等。这个小组还发行了世界上第一张带有孟加拉语 UI 的 Live Linux CD。
2003 年我搬家到了一个无法访问互联网的地方。我只有在周日去加尔各答时才能联系到小组。当时Linux 的孟加拉语本地化已经成为了主流。我们的一些志愿者加入了 Red Hat 从事翻译和字体开发工作。我也忙于我的医疗工作,几乎没时间去进行开源开发。
如今,我觉得使用 Linux 做日常工作比其他任何操作系统都要舒服。我也为能与一个能让人们用自己的语言交流的项目联系在一起而感到自豪。它也为长期以来由于不会说英语而被认为处于“<ruby>数字鸿沟<rt>digital divide</rt></ruby>”另一端的人们带来了计算能力。孟加拉语实际上是世界上使用最广泛的语言之一,这个项目消除了全球人口中很大一部分人接触数字科技的主要语言壁垒。
### 加入开源
加入到开源运动中来很容易。主动做一些对自己有用的事情,然后思索一下所做的事情如何能对他人也有帮助。关键在于使它免费可用,它可以给世界带来难以估量的价值。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/linux-bengali
作者:[Dr Anirban Mitra][a]
选题:[lujun9972][b]
译者:[JonnieWayy](https://github.com/JonnieWayy)
校对:[wxy](https://github.com/wxy )
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/mitradranirban
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/india-globe-map.jpg?itok=6sSEL5iO (India on the globe)
[2]: http://www.yudit.org/

View File

@ -0,0 +1,96 @@
[#]: collector: (lujun9972)
[#]: translator: (windgeek)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12449-1.html)
[#]: subject: (What's the difference between DevSecOps and agile software development)
[#]: via: (https://opensource.com/article/20/7/devsecops-vs-agile)
[#]: author: (Sam Bocetta https://opensource.com/users/sambocetta)
DevSecOps 和敏捷软件开发有什么不同?
======
> 你更专注于安全性还是软件交付,还是可以两者兼得?
![](https://img.linux.net.cn/data/attachment/album/202007/24/225337mb44xoe2byvz4x4o.jpg)
技术社区中存在一种趋势,经常互换地使用 DevSecOps 和敏捷软件开发这两个术语。尽管它们有一些相似性,例如都旨在更早地检测风险,但在改变团队的[工作方式层面有很大不同][2]。
DevSecOps 建立在敏捷开发建立的一些原则上。但是DevSecOps 特别专注于[集成安全功能][3],而敏捷开发则专注于交付软件。
知道如何保护你们的网站或应用程序免受勒索程序和其他威胁的侵害,实际上取决于你使用的软件和系统开发。这可能会影响你选择使用 DevSecOps、敏捷软件开发还是两者兼而有之。
### DevSecOps 和敏捷软件开发的不同之处
两者的主要区别可以归结为一个简单的概念:安全性。这取决于你的软件开发实践,你们公司的安全措施 —— 以及何时、何地以及由谁实施,都可能会有很大不同。
每个企业都[需要 IT 安全][4]来保护其重要数据。如果企业真正重视 IT 安全一般都会采取虚拟专用网VPN、数字证书、防火墙保护、多因子身份验证、安全的云存储包括向员工介绍基本的网络安全措施。
当你信任 DevSecOps 时,你就会把公司的安全问题,本质上使其等同于持续集成和交付。 DevSecOps 方法论在开发之初就强调安全性,并使其成为整体软件质量不可或缺的组成部分。
基于 DevSecOps 安全性的三大原则:
* 平衡用户访问难易程度及数据安全性
* 使用 VPN 和 SSL [加密数据][5]可防止数据在传输过程中受到入侵者的攻击
* 使用可以扫描新代码的安全漏洞并能通知开发人员该漏洞的工具来预测防范未来的风险
尽管 DevOps 一直打算包含安全性,但并非每个实践 DevOps 的组织都牢记这一点。DevSecOps 在 DevOps 的演进形式中,可以提供更加清晰的信息。尽管它们的名称相似,但这两个[不应混淆] [6]。在 DevSecOps 模型中,安全性是团队的主要驱动力。
同时,敏捷开发更专注于迭代开发周期,这意味着反馈意见会不断融入到持续的软件开发中。[敏捷的关键原则][7]是拥抱不断变化的环境,为客户和使用者提供竞争优势,让开发人员和利益相关者紧密合作,并在整个过程中始终保持关注技术卓越,以提升效率。换句话说,除非敏捷团队在其定义中包括安全性,否则安全性在敏捷软件开发中算是事后思考。
### 国防机构面临的挑战
如果要说专门致力于最大程度地提高安全性的组织美国国防部DoD就是其中之一。在 2018 年,美国国防部发布了针对软件开发中的“假敏捷”或“以敏捷为名”的[指南][8]。该指南旨在警告美国国防部高管注意不良编程的问题,并说明如何发现它以避免风险。
使用这些方法不仅可以使美国国防部受益。医疗保健和金融部门也[保存着][9]必须保证安全的大量敏感数据。
美国国防部通过其现代化战略(包括采用 DevSecOps来改变防范形式至关重要。尤其在这个连美国国防部容易受到黑客攻击和数据泄露的时代这一点在 2020 年 2 月的[大规模数据泄露][10]中已经得到了证明。
将网络安全最佳实践转化为现实生活中的开发仍然还存在固有的风险。事情不可能 100 完美地进行。最好的状况是稍微有点不舒服,最坏的情况下,它们可能会带来全新的风险。
开发人员,尤其是那些为军用软件编写代码的开发人员,可能对[所有应该采用 DevSecOps 的情境][11]没有透彻的了解。学习曲线会很陡峭,但是为了获得更大的安全性,必须承受这些必不可少的痛苦。
### 自动化时代的新模式
为了解决对先前安全措施日益增长的担忧,美国国防部承包商已开始评估 DevSecOps 模型。关键是将该方法论部署到持续的服务交付环境中。
应对这个问题,出现了三个方向。第一种涉及到自动化,自动化已在大多数隐私和安全工具中[广泛使用][12],包括 VPN 和增强隐私的移动操作系统。大型云基础架构中的自动化无需依赖于人为的检查和平衡,可以自动处理持续的维护和进行安全评估。
第二种专注于对于过渡到 DevSecOps 很重要的安全检查点。而传统上,系统设计初期对于数据在各个组件之间移动时依旧可以访问是不做期望的。
第三种也是最后一种涉及将企业方式用于军用软件开发。国防部的许多承包商和雇员来自商业领域,而不是军事领域。他们的背景为他们提供了为大型企业[提供网络安全][13]的知识和经验,他们可以将其带入政府部门职位中。
### 值得克服的挑战
转向基于 DevSecOps 的方法论也提出了一些挑战。在过去的十年中,许多组织已经完全重新设计了其开发生命周期,以适应敏捷开发实践,在不久之后进行再次转换看起来令人生畏。
企业应该安下心来,因为即使美国国防部也遇到了这种过渡带来的麻烦,他们在应对推出新流程使得商业技术和工具广泛可用的挑战上并不孤独。
展望一下未来,其实切换到 DevSecOps 不会比切换到敏捷软件开发更痛苦。而且通过将[创建安全性的价值][4]添加到开发工作流程中,以及利用现有敏捷开发的优势,企业可以获得很多收益。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/devsecops-vs-agile
作者:[Sam Bocetta][a]
选题:[lujun9972][b]
译者:[windgeek](https://github.com/windgeek)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/sambocetta
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/devops_confusion_wall_questions.png?itok=zLS7K2JG (Brick wall between two people, a developer and an operations manager)
[2]: https://tech.gsa.gov/guides/understanding_differences_agile_devsecops/
[3]: https://www.redhat.com/en/topics/devops/what-is-devsecops
[4]: https://www.redhat.com/en/topics/security
[5]: https://surfshark.com/blog/does-vpn-protect-you-from-hackers
[6]: https://www.infoq.com/articles/evolve-devops-devsecops/
[7]: https://enterprisersproject.com/article/2019/9/agile-project-management-explained
[8]: https://www.governmentciomedia.com/defense-innovation-board-issues-guide-detecting-agile-bs
[9]: https://www.redhat.com/en/solutions/financial-services
[10]: https://www.military.com/daily-news/2020/02/25/dod-agency-suffers-data-breach-potentially-compromising-ssns.html
[11]: https://fcw.com/articles/2020/01/23/dod-devsecops-guidance-williams.aspx
[12]: https://privacyaustralia.net/privacy-tools/
[13]: https://www.securitymagazine.com/articles/88301-cybersecurity-is-standard-business-practice-for-large-companies

View File

@ -0,0 +1,106 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12446-1.html)
[#]: subject: (Ubuntu 19.10 Reaches End of Life. Upgrade to Ubuntu 20.04 As Soon As Possible!)
[#]: via: (https://itsfoss.com/ubuntu-19-10-end-of-life/)
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
Ubuntu 19.10 产品寿命结束,尽快升级到 Ubuntu 20.04
======
> Ubuntu 19.10 Eoan Ermine 产品寿命结束。这意味着它不会获得任何安全或维护更新。继续使用 Ubuntu 19.10 将很危险,因为你的系统将来可能会因为缺少安全更新而变得脆弱。你应该升级到 Ubuntu 20.04。
[2019 年 10 月发布的 Ubuntu 19.10][1] 带来了一些为 [Ubuntu 20.04][2] 做准备的新功能。
作为非 LTS 版本,它有 9 个月的寿命。截至 2020 年 7 月 17 日,它的生命周期结束,并不会再收到任何更新。
### Ubuntu 19.10 生命周期结束
![][3]
我之前已经[详细解释了 Ubuntu 的发布周期和产品寿命结束][4]。如果此后继续使用 Ubuntu 19.10,我会重申这对你和你的系统意味着什么。
[软件通常有预定义的生命周期][5]一旦软件版本到达生命周期结束它将停止获取更新和支持。生命周期结束后Ubuntu 19.10 不再会从 Ubuntu 获得系统更新、安全更新或应用更新。
如果你继续使用它,你的系统可能会成为潜在的网络攻击的受害者,因为黑客往往会利用脆弱的系统。
之后,你可能无法使用 `apt` 命令安装新软件,因为 Ubuntu 将归档 19.10 的仓库。
### 如果你使用的是 Ubuntu 19.10,该怎么办?
首先,[检查你使用的 Ubuntu 版本][6]。这可以在终端中输入此命令完成:
```
lsb_release -a
```
```
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 19.10
Release: 19.10
Codename: Eoan
```
如果你看到 Ubuntu 19.10,你应该做以下两项工作之一:
* 如果你有良好、稳定的互联网连接,从 Ubuntu 19.10 升级到 20.04。你的个人文件和大多数软件保持不变。
* 如果你有着缓慢或不稳定的互联网连接,你应该[全新安装的 Ubuntu 20.04][7]。你的文件和磁盘上的所有内容将被擦除,因此你应该在外部磁盘上备份重要数据。
#### 如何从 19.10 升级到 20.04 (如果你有良好的互联网连接)
我之前已经详细讨论了 Ubuntu 版本升级。我会在这里快速说下步骤。
首先,请确保在“软件和更新”中已设置接收新版本通知。
进入“软件和更新”:
![][8]
进入“更新”选项卡,将“通知我新的 Ubuntu 版本”设置为“对于任何新版本”:
![][9]
现在,安装所有挂起的更新。
现在,再次运行更新管理器工具。你应该可以选择升级到 Ubuntu 20.04。点击升级按钮并按照说明操作。
它会安装大约 1.2GB 的软件包。这就是为什么你需要一个良好和稳定的互联网连接。
![][10]
这样的升级会保持你的家目录。不过,仍建议在外部磁盘进行备份。
### 你仍在使用 Ubuntu 19.10 吗?
如果你仍在使用 Ubuntu 19.10,那么必须为升级或全新安装做好准备。你不能忽视它。
如果你不喜欢这样的频繁版本升级,你应该使用支持五年的 LTS 版本。当前的 LTS 版本是 Ubuntu 20.04,你无论如何都应该升级到它。
你是否正在使用 Ubuntu 19.10?你是否已升级到 Ubuntu 20.04?如果你面临任何问题,或者如果你有任何问题,请让我知道。
--------------------------------------------------------------------------------
via: https://itsfoss.com/ubuntu-19-10-end-of-life/
作者:[Abhishek Prakash][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/abhishek/
[b]: https://github.com/lujun9972
[1]: https://itsfoss.com/ubuntu-19-10-released/
[2]: https://itsfoss.com/download-ubuntu-20-04/
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/ubuntu-19-10-end-of-life.jpg?ssl=1
[4]: https://itsfoss.com/end-of-life-ubuntu/
[5]: https://en.wikipedia.org/wiki/Systems_development_life_cycle
[6]: https://itsfoss.com/how-to-know-ubuntu-unity-version/
[7]: https://itsfoss.com/install-ubuntu/
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/03/upgrade-ubuntu-1.jpeg?ssl=1
[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/11/software-update-any-new-version.jpeg?resize=800%2C378&ssl=1
[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/04/software-updater-focal.jpg?ssl=1

View File

@ -0,0 +1,132 @@
[#]: collector: (lujun9972)
[#]: translator: (Mikedkmilk)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12445-1.html)
[#]: subject: (Why People Are Crazy About Arch Linux? Whats so Special About it?)
[#]: via: (https://itsfoss.com/why-arch-linux/)
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
为什么人们对 Arch Linux 如此着迷?它有什么特别之处?
======
顺便说一句(利益相关),我用 Arch
你或许已经在 Linux 论坛、朋友相互讨论或表情包里看到过这个术语。
你可能想知道为什么 Arch Linux 如此受欢迎,为什么人们这么喜欢它?因为有更容易使用,甚至更好的[基于 Arch 的发行版][1]。
在本文中,我将列出 Linux 用户喜欢使用 [Arch Linux][2] 的一些原因。
### 人们喜欢使用 Arch Linux 的六个原因
![][3]
这些只是我的看法,当然,为什么你应该使用 Arch Linux 并没有固定的原因。这是我在十多年里与 Linux 用户和社区打交道的经验中观察到的。
让我们一起看看为什么 Arch Linux 如此受欢迎。
#### 1、DIY 的方式可以让你掌控操作系统的各个方面
我一直认为 Arch Linux 是一个可以让你自己动手打造的操作系统。从安装到管理Arch Linux 放手让你处理一切。
你可以自己决定使用哪种桌面环境、安装哪些组件和服务。这种精细化的控制能够赋予你一个精简的操作系统,可以让你自由选择所需的组件来构建属于你自己的系统。
如果你是一个 DIY 爱好者,你会喜欢 Arch Linux 的。
#### 2、通过 Arch Linux可以更好地理解 Linux 的工作原理
![Installing Arch Linux by creating partition and making filesystem via command line][4]
如果你曾经尝试过安装 Arch Linux你就会知道它的复杂性。
但这种复杂性同时也意味着你将被迫学习一些在其他发行版中可能永远不会费心学习的东西。
比如说在安装 Arch Linux 过程中配置网络本身就是一个很好的学习课程。
如果开始你有感到有困惑不懂的时候Arch Linux 的[维基][5]可以帮助你。它是互联网上最广泛和最棒的由社区管理的文档。仅仅只是浏览 Arch Linux 的维基,就可以学到很多东西。
#### 3、滚动发行模式可以为你提供最新的内核和软件
![System update in Arch Linux][6]
Arch Linux 是一个滚动发行版,这意味着新的内核和应用程序版本一经发布,就会立即向你推送。
当大多数其他 [Linux 发行版还在提供旧的 Linux 内核版本][7]时Arch 会迅速向你提供最新的内核。
而软件也是如此。如果 Arch 资源库中的软件发布了新版本Arch 用户通常会比其他用户先获得新版本。
在滚动发行模式下,一切都是新鲜和前沿的。你不必把操作系统从一个版本升级到另一个版本,只要使用 [pacman 命令][8],你会始终保持最新的版本。
#### 4、Arch 用户资源库,即 AUR
![][9]
Arch Linux 的资源库中有大量的软件。AUR 扩展了 Arch Linux 的软件产品。在 Arch Linux 中,你可以通过 [AUR][10] 得到相当多的软件。
AUR 是采用社区驱动的方式来提供更新的应用程序。你可以在 [AUR 辅助工具][11]的帮助下搜索和安装应用程序。
#### 5、成就感
![][12]
正如 James Clear 在他的书《<ruby>原子习惯<rt>Atomic Habits</rt></ruby>》中提到的那样,**人类的大脑喜欢挑战,但前提是在一个最理想的困难区域**。
还记得你第一次安装成功 Linux 时的感觉吗?即便你安装的是 Linux Mint。这给了你一种成就感你成功安装了 Linux
如果你已经使用 Ubuntu、Fedora 或其他发行版一段时间了,现在开始感到舒适(或厌倦),你可以尝试安装一下 Arch Linux。
对于一个有一定经验的 Linux 用户来说,[成功安装 Arch Linux][13]本身就会给你一种成就感。
这是一个挑战,但却是可以实现的。如果你建议一个新的 Linux 用户尝试 Arch Linux 或者更复杂的 Linux 发行版比如 [Linux From ScratchLFS][14],这个挑战就太难实现了。
这种成功完成挑战的感觉也是人们使用 Arch Linux 的原因之一。
#### 6、没有企业的参与Arch 是由社区创建、支持和拥有的
Ubuntu 由 Canonical 支持Fedora 来自 Red Hat现在是 IBM 的一部分openSUSE 来自 SUSE。所有这些主流发行版都是企业支持的。
这本身并不是坏事或过错,但是有一些人不喜欢企业参与开源项目。
正如 Debian 一样Arch Linux 是为数不多的仅由社区参与的 Linux 发行项目之一。
你可能会指出,许多其他发行版如 Linux Mint 等不是由企业赞助的。好吧,这可能是真的,但 Linux Mint 本身就是基于 Ubuntu 的,并且使用 Ubuntu 的资源库。而 Arch Linux 不是另一个发行版的衍生物。
从这个意义上说,[Debian][15] 和 Arch Linux 是更纯粹的社区驱动项目。这对很多人来说可能无关紧要,但确实有一些人在意这些事情。
#### 对你来说,为什么 Arch Linux 如此受欢迎?
现在你可能不同意我提出的所有观点,那没关系。我想知道你是怎么看待 Arch Linux 在 Linux 用户中如此受欢迎,并具有崇拜的地位的?
当你写评论时,让我分享一下“我用 Arch”的表情包 :)
![](https://scontent-fml2-1.xx.fbcdn.net/v/t1.0-0/p526x296/109618601_1759578370849589_736435313539592753_o.jpg?_nc_cat=100&_nc_sid=8024bb&_nc_ohc=MYp_pidAMBMAX8z24Mc&_nc_ht=scontent-fml2-1.xx&_nc_tp=6&oh=9c2bf18b620cf90edb2dd32625b03b41&oe=5F3E8F39)
--------------------------------------------------------------------------------
via: https://itsfoss.com/why-arch-linux/
作者:[Abhishek Prakash][a]
选题:[lujun9972][b]
译者:[Mikedkmilk](https://github.com/Mikedkmilk)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/abhishek/
[b]: https://github.com/lujun9972
[1]: https://itsfoss.com/arch-based-linux-distros/
[2]: https://www.archlinux.org/
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/07/why-arch-linux.jpg?ssl=1
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/01/efi_system_partition-1.png?ssl=1
[5]: https://wiki.archlinux.org/
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/04/sudo-pacman-Syu.png?ssl=1
[7]: https://itsfoss.com/why-distros-use-old-kernel/
[8]: https://itsfoss.com/pacman-command/
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/01/AUR.png?resize=800%2C451&ssl=1
[10]: https://itsfoss.com/aur-arch-linux/
[11]: https://itsfoss.com/best-aur-helpers/
[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/07/installed-arch-linux.png?ssl=1
[13]: https://itsfoss.com/install-arch-linux/
[14]: http://www.linuxfromscratch.org/
[15]: https://www.debian.org/

View File

@ -0,0 +1,56 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12461-1.html)
[#]: subject: (Getting started as an open source builder and more industry trends)
[#]: via: (https://opensource.com/article/20/7/open-source-industry-trends)
[#]: author: (Tim Hildred https://opensource.com/users/thildred)
每周开源点评:开源建设者入门,以及更多的行业趋势
======
> 每周关注开源社区和行业趋势。
![](https://img.linux.net.cn/data/attachment/album/202007/28/175317mgsvgtvstvcggsch.jpg)
我在一家采用开源软件开发模型的企业软件公司任高级产品营销经理,我的一部分职责是为产品营销人员、经理和其他相关人定期发布有关开源社区、市场和业界发展趋势的更新。以下是该更新中我和他们最喜欢的五篇文章。
### 《[开放源码建设者:入门][2]》
> "最后,我发现自己想要自己修改代码,"Liz 说。她的第一个贡献是为 Django 框架做了一个授权扩展。她补充说:"我记得当时我很担心维护者可能不希望一个完全陌生的人做的改动,所以当它被接受时,我感到很兴奋,也很欣慰……得到认可,甚至感谢你的贡献,这种感觉总是很好。"
**分析:** 这一系列对开源维护者的采访(引自 [Liz Rice][3])交汇了跳入开源领域的动机和经验。这也是对天才独狼开发者神话的一个点赞,你可以自己走很远的路,但如果你知道如何与其他人很好地合作,你会走得更远,建立更好的东西。如果你知道如何说服和激励他们,你会走得更远。
### 《[Fluent Bit v1.5:轻量级和高性能日志处理器][4]》
> 本次主要版本的最大亮点之一是不同公司与 Fluent Bit 核心维护者的联合工作,为 Google、Amazon、LogDNA、New Relic 和 Sumo Logic 等公司内部提供的可观察性云服务带来了改进和新的连接器。
**分析:** “从不同来源收集数据/日志,统一并将其发送到多个目的地”是一项繁琐的任务,但这是超大规模企业及其客户共同的任务。证据 A一个开源工作完全如其预期的典型例子。祝贺 Fluent Bit 团队的这次发布!
### 《[Kubernetes 如何让 Nubank 工程师每周部署 700 次][5]》
> 因此,生产环境的部署时间从 90 分钟变成了 15 分钟。而 Nobre 说这是“最主要的好处因为它有助于开发人员的体验”。如今Nubank 的工程师每周部署 700 次。“对于一家银行来说你会说这太疯狂了”Capaverde 笑着说。“但这并不疯狂,因为有了 Kubernetes 和金丝雀部署,回滚变化更容易,因为部署速度也更快。人们的出货频率更高,更有信心。”
**分析:** 我觉得这是个赢家,也是个输家。当然,他们降低了做出改变的成本,以一种让人们更有信心去尝试的方式。但他们的开发人员不能再在等待部署完成的同时跑 10 公里,现在只能在一次 TED 演讲中凑合。
希望你喜欢这个列表,下周再见。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/open-source-industry-trends
作者:[Tim Hildred][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/thildred
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
[2]: https://idk.dev/open-source-builders-getting-started/
[3]: https://twitter.com/lizrice
[4]: https://www.cncf.io/blog/2020/07/14/fluent-bit-v1-5-lightweight-and-high-performance-log-processor/
[5]: https://www.cncf.io/blog/2020/07/10/how-kubernetes-empowered-nubank-engineers-to-deploy-200-times-a-week/

View File

@ -0,0 +1,72 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12473-1.html)
[#]: subject: (Defining cloud native, expanding the ecosystem, and more industry trends)
[#]: via: (https://opensource.com/article/20/7/cloud-native-expanding-and-more-industry-trends)
[#]: author: (Tim Hildred https://opensource.com/users/thildred)
每周开源点评:定义云原生、拓展生态系统,以及更多的行业趋势
======
> 每周关注开源社区和行业趋势。
![](https://img.linux.net.cn/data/attachment/album/202007/31/235751f5zd9l3rejd2tjss.jpg)
我在一家采用开源软件开发模型的企业软件公司任高级产品营销经理,我的一部分职责是为产品营销人员、经理和其他相关人定期发布有关开源社区、市场和业界发展趋势的更新。以下是该更新中我和他们最喜欢的几篇文章。
### 《随着云原生计算的兴起,它和代码一样在改变文化》
- [文章链接][2]
> 现在是围绕一套云原生计算的共同原则进行行业整合的时候了,因为许多企业已经意识到,他们最初进入云计算的回报有限。国际数据公司去年的一项调查发现,[80% 的受访者曾将工作负载从公有云环境遣返到企业内部][3],平均而言,他们预计在未来两年内将一半的公有云应用转移到私有场所。
**分析**:在云端的第一次运行主要是大量的“提升和转移”尝试,以提取工作负载并将其投放到云端。第二次运行将涉及更多的工作,以确定转移什么以及如何转移,但随着开发人员对理所当然的事情越来越满意,最终应该会带来更多价值。
### 《为什么云原生基础设施的自动化是所有参与者的胜利》
- [文章链接][4]
> 开发的圣杯是创建和维护安全的应用程序,产生强大的投资回报率和满意的客户。但如果这种开发不是高效、高速和可扩展的,那么这个圣杯很快就会变得遥不可及。如果你发现自己对当前的基础设施有更高的期望,那么可能是时候考虑云原生了。它不仅可以检查所有这些机器,而且为云原生基础设施进行自动化可以提高效率和结果。
**分析**:我还要补充一点,如果没有大量的自动化,真正采用云原生方法是不可能的;涉及的移动部件数量太多,不可能用人的头脑来处理。
### 《Linkerd 案例研究:满足安全要求、减少延迟和从 Istio 迁移》
- [文章链接][5]
> 最后Subspace 分享了其使用 Linkerd 提供“光速”多人游戏的经验。虽然在超低延迟环境中使用服务网状物起初似乎有悖常理,但 Subspace 发现 Linkerd 的战略使用实际上降低了总延迟 —— 服务网状物是如此轻巧以至于它增加的最小延迟被它通过可观察性降低的延迟所掩盖。简而言之Linkerd 的这一独特用例使 Subspace 在运营结果上获得了巨大的净收益。[阅读完整的用户故事][6]。
**分析**:我听说过这样一个观点:你并不能真正降低一个系统的复杂性,你只是把它抽象化,改变它的接触对象。似乎对延迟也有类似的观察:如果你仔细选择你接受延迟的地方,你可以因此减少系统中其他地方的延迟。
### 一位高层管理人员解释了 IBM 的“重要支点”,以赢得开发者、初创企业和合作伙伴的青睐,这是其从微软等竞争对手手中赢得混合云市场计划的一部分
- [文章链接][7]
> 蓝色巨人正在转向一个新的战略,专注于建立一个由开发者、合作伙伴和初创公司组成的生态系统。“我们的服务组织无法接触到所有客户。获取这些客户的唯一方法是激活一个生态系统。”
**分析**:越来越多的公司开始接受这样的理念:有些客户的问题,他们没有帮助就无法解决。也许这可以减少从每个单独客户身上赚到的钱,因为它扩大了更广泛地参与更多问题空间的机会。
希望你喜欢这个列表,下周再见。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/cloud-native-expanding-and-more-industry-trends
作者:[Tim Hildred][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/thildred
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
[2]: https://siliconangle.com/2020/07/18/cloud-native-computing-rises-transforming-culture-much-code/
[3]: https://www.networkworld.com/article/3400872/uptick-in-cloud-repatriation-fuels-rise-of-hybrid-cloud.html
[4]: https://thenewstack.io/why-automating-for-cloud-native-infrastructures-is-a-win-for-all-involved/
[5]: https://www.cncf.io/blog/2020/07/21/linkerd-case-studies-meeting-security-requirements-reducing-latency-and-migrating-from-istio/
[6]: https://buoyant.io/case-studies/subspace/
[7]: https://www.businessinsider.com/ibm-developers-tech-ecosystem-red-hat-hybrid-cloud-bob-lord-2020-7?r=AU&IR=T

View File

@ -0,0 +1,66 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12471-1.html)
[#]: subject: (Beginner-friendly Terminal-based Text Editor GNU Nano Version 5.0 Released)
[#]: via: (https://itsfoss.com/nano-5-release/)
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
适于初学者的基于终端的文本编辑器 GNU Nano 5.0 版发布
======
> 开源文本编辑器 GNU nano 已经达到了 5.0 版本的里程碑。看看这个新版本带来了哪些功能。
Linux 上有很多[基于终端的文本编辑器][1]。像 Emacs 和 Vim 这样的编辑器需要经历陡峭的学习曲线和掌握一堆不寻常的键盘快捷键,但公认 GNU nano 更容易使用。
也许这就是为什么 Nano 是 Ubuntu 和许多其他发行版中默认的基于终端的文本编辑器的原因,而即将发布的 [Fedora 33 版本][2]也将把 Nano 设置为终端的默认文本编辑器。
### GNU nano 5.0 的新功能
![][3]
在 GNU nano 5.0 的[变更日志][4]中提到的一些主要亮点是:
* `-indicator` 选项将在屏幕右侧显示一种滚动条,以指示视口在缓冲区中的位置和覆盖范围。
* 可以用 `Alt+Insert` 键标记行,你可以用 `Alt+Page``Alt+PageDown` 键跳转到这些标记的行。
* 执行命令提示符现在可以直接从主菜单中访问。
* 在支持至少 256 种颜色的终端上,有新的颜色可用。
* 新的 `-bookstyle` 模式,任何以空格开头的行都会被认为是一个段落的开始。
* 用 `^L` 刷新屏幕现在在每个菜单中都可以使用。它还会将行与光标居中。
* 可绑定函数 `curpos` 已经改名为 `location`,长选项 `-tempfile` 已经改名为 `-saveonexit`,短选项 `-S` 现在是 `-softwrap` 的同义词。
* 备份文件将保留其组的所有权(如果可能的话)。
* 数据会在显示 “……行写入” 之前同步到磁盘。
* 增加了 Markdown、Haskell 和 Ada 语法的支持。
### 获取 GNU nano 5.0
目前 Ubuntu 20.04 中的 nano 版本是 4.8,而在这个 LTS 版本中,你不太可能在短时间内获得新版本。如果 Ubuntu 有新版本的话,你应该会通过系统更新得到它。
Arch 用户应该会比其他人更早得到它,就像往常一样。其他发行版也应该迟早会提供新版本。
如果你是少数喜欢[从源代码安装软件][5]的人,你可以从它的[下载页面][6]中获得。
如果你是新手,我强烈推荐这篇 [Nano 编辑器初学者指南][1]。
你喜欢这个新版本吗?你期待使用 Nano 5 吗?
--------------------------------------------------------------------------------
via: https://itsfoss.com/nano-5-release/
作者:[Abhishek Prakash][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/abhishek/
[b]: https://github.com/lujun9972
[1]: https://itsfoss.com/nano-editor-guide/
[2]: https://itsfoss.com/fedora-33/
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/09/Nano.png?ssl=1
[4]: https://www.nano-editor.org/news.php
[5]: https://itsfoss.com/install-software-from-source-code/
[6]: https://www.nano-editor.org/download.php

View File

@ -0,0 +1,79 @@
[#]: collector: (lujun9972)
[#]: translator: (chenmu-kk)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12497-1.html)
[#]: subject: (Developer happiness: What you need to know)
[#]: via: (https://opensource.com/article/19/2/developer-happiness)
[#]: author: (Bart Copeland https://opensource.com/users/bartcopeland)
开发者的福音:你需要知道的事
======
> 开发者需要快速编程的工具和自由,而不会因为合规性和安全性所困扰。
![](https://img.linux.net.cn/data/attachment/album/202008/07/214051ki2zitovo8zzynco.jpg)
一个人需要合适的工具来完成工作。比如说没有比修车修到一半,却发现你没有完成工作的专业工具更沮丧的事情了。同样的道理也适用在开发者身上:你需要工具来发挥你的才能,而不会因为合规性和安全性的需求打断你的工作流程,这样你才可以更快速地编码。
根据 ActiveState 的研究《[2018 年开发者调查:开源运行时的痛苦][1]》显示,超过一半的开发人员(具体为 51%),每天只需要花费 1-4 小时的时间进行编程。换句话说大多数开发人员花费不到一半的时间编程。根据调查一半的开发人员认为安全是他们最大的担忧之一但是由于公司政策方面的原因67% 的开发人员选择在编程时不添加新的语言。
结果是开发人员不得不投入更多的精力在非编码的活动上,例如在构建软件和语言之后检查软件的安全性和合规性标准。而且由于公司政策的原因,他们无法选择适合的开发工具或语言。他们的满意度会下降,同时风险提高。
因此,开发人员无法将时间投入在高价值的工作上。这会带来额外的商业风险,因为他们的软件上市时间变慢了,并且公司因为没有授权开发人员在不受公司政策影响的前提下决定“最佳的”技术的能力,从而增加了技术债务。
### 纳入安全性和合规性的工作流程
我们如何解决这个问题呢?一种方式是通过四个简单的步骤将安全性和合规性的工作流程集成到软件开发中:
#### 1、集中你的力量
获得所有相关人员的支持,这是一个经常被遗忘但却至关重要的第一步。确保考虑到了广泛的利益相关者,包括:
* 开发运维DevOps
* 开发人员
* 信息安全
* 合法/合规
* IT 安全
利益相关者想要了解相关的商业利益,因此要为消除软件构建后的安全和合规性检查点提供坚实的理由。你可以在构建你的商业案例中考虑以下任何一个(或者全部)因素:节省时间、机会成本和开发人员生产力。在开发流程中,你也可以通过集成安全性和合规性来避免语言的改造。
#### 2、寻找可信赖的资源
接下来,选择可使用的可信资源,以及他们的许可证和安全要求。考虑到如下相关信息:
* 基于环境或应用程序类型的使用限制以及每种语言的版本控制
* 允许哪些开源组件,例如,特定的程序包
* 哪种环境类型可以使用哪种许可证(例如,研究与生产)
* 安全级别的定义、可接受的脆弱性风险等级、什么样的风险级别会触发一个措施,这个措施是什么并且谁来负责它的执行
#### 3、从一开始就纳入安全性和合规性
纳入安全性和合规性的工作流程的结果是,它最终将安全性和合规性融入到代码的第一行。它消除了公司政策的拖累,因为你是按照规范进行编码,而不是必须事后解决问题。但要做到这一点,请考虑在构建代码时采用自动扫描代码的机制,以及使用无代理监控你的运行时代码。你可以节省时间,还可以通过编程实施策略来确保整个组织的合规性。
#### 4、监控、报告和更新
出现新的漏洞,新的补丁和版本也会出现。所以,将代码部署到生产中以及运行代码时,需要考虑安全性和合规性。你需要知道哪些(如果有的话)代码存在风险以及该代码在何处运行。所以,部署和运行代码的过程应该包括监视、报告和更新生产中的代码。
通过一开始就在你的软件开发过程中集成安全性和合规性,你还可以在部署后跟踪代码的运行位置,并在新的威胁出现时获得警报。你也能追踪当你的应用程序何时受到攻击,并通过自动执行软件策略做出响应。
如果你的软件开发过程中已经引入了安全性和合规性的工作流程,你将会提高你的生产率。你将能够通过增加编码时间、提高安全性和稳定性、以及在维护和发现安全性和合规性的威胁方面节省的成本和时间来衡量价值。
### 集成所带来的幸福
如果你不开发和更新软件,你的组织将无法前进。开发人员是公司成功的关键,这意味着他们需要快速编写代码的工具和自由。尽管合规性和安全性至关重要,但你不能让这个需求阻碍你的发展。开发人员显然很担心安全性,因此最好的办法就是“左移”,从一开始就集成安全性和合规性的工作流程。你将可以做更多的事情,在第一次就可以完成,而花费更少的时间进行代码更新。
--------------------------------------------------------------------------------
via: https://opensource.com/article/19/2/developer-happiness
作者:[Bart Copeland][a]
选题:[lujun9972][b]
译者:[chenmu-kk](https://github.com/chenmu-kk)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/bartcopeland
[b]: https://github.com/lujun9972
[1]: https://www.activestate.com/company/press/press-releases/activestate-developer-survey-examines-open-source-challenges/

View File

@ -0,0 +1,137 @@
[#]: collector: (lujun9972)
[#]: translator: (chenmu-kk)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12566-1.html)
[#]: subject: (9 open source tools for building a fault-tolerant system)
[#]: via: (https://opensource.com/article/19/3/tools-fault-tolerant-system)
[#]: author: (Bryant Son https://opensource.com/users/brson)
九个用来构建容错系统的开源工具
======
> 这些开源工具可以最大化延长运行时间并且在最大程度上减少问题。
![](https://img.linux.net.cn/data/attachment/album/202008/30/205036eqh1j8hhss9skf57.jpg)
我一直对 Web 开发和软件体系结构很感兴趣,因为我喜欢看到一个工作系统的宏观视图。无论是构建一个移动应用程序还是一个 Web 应用程序,都必须连接到互联网,在不同的模块中交换数据,这意味着你需要 Web 服务。
如果选择云系统作为应用程序的后端,则可以利用更强大的计算能力,因为后端服务将会在水平和垂直方向上进行扩展并编排不同的服务。但无论你是否使用云后端,建造一个灵活、稳定、快速又安全的容错系统是必不可少的。
要了解容错系统,让我们以脸书、亚马逊、谷歌和奈飞为例。数以亿计的用户会同时接入这些平台并通过对等网络和用户-服务器网络传输大量数据你可以肯定这其中还存在许多的带有不法目的的恶意用户例如黑客攻击和拒绝服务DoS攻击。即使如此这些平台无需停机也可以全年无休地运转。
虽然机器学习和智能算法是这些系统的基础,但它们实现持续的服务而不停机一分钟的事实值得称赞。它们昂贵的硬件设备和巨大的数据中心当然十分重要,但是支持服务的精密软件设计也同样重要。而且容错系统是一个构建如此精密系统的法则之一。
### 生产过程中导致错误的两种行为
这是考虑容错系统的另一种方法。当你在本地运行应用程序服务时,每件事似乎都很完美。棒极了!但当你提升服务到生产环境时,一切都会变得一团糟。在这种情况下,容错系统通过解决两个问题来提供帮助:故障停止行为和拜占庭行为。
#### 故障停止行为
故障停止行为是运行中系统突然停止运行或者系统中的某些部分发生了故障。服务器停机时间和数据库不可访问都属于此种类型。举个例子,在下图中,由于服务 2 无法访问,因此服务 1 无法与服务 2 进行通信。
![服务 2 停机导致的故障停止行为][2]
但是,如果服务之间存在网络问题,也会出现此问题,如下图所示:
![网络故障导致的故障停止行为][3]
#### 拜占庭行为
拜占庭行为是指系统在持续运行,但并没有产生预期行为(例如:错误的数据或者无效的数据)。
如果服务 2 的数据(值)已损坏则可能会发生拜占庭故障,即使服务看起来运行得很好,比如下面的例子:
![因服务损坏而导致的拜占庭故障][4]
或者,可能存在恶意的中间人在服务之间进行拦截,并注入了不需要的数据:
![恶意中间人导致的拜占庭故障][5]
无论是故障停止和拜占庭行为,都不是理想的情况,因此我们需要一些预防或修复它们的手段。这里容错系统就起作用了。以下是可以帮助你解决这些问题的 8 个开源工具。
### 构建容错系统的工具
尽管构建一个真正实用的容错系统涉及到深入的“分布式计算理论”和复杂的计算机科学原理,但有许多的软件工具(其中许多是开源软件)通过构建容错系统来减轻不良后果的影响。
#### 断路模式Hystrix 和 Resilience4j
[断路模式][6]是一种技术,它有助于在服务失败时返回准备好的虚拟回应或者简单回应。
![断路模式][7]
奈飞开源的 [Hystrix][8] 是断路模式中最流行的应用。
我之前工作过的很多家公司都在用这款出色的工具。令人意外的是,奈飞宣布将不再更新 Hystrix是的我知道了。相反奈飞建议使用另一种支持 Java 8 和函数式编程的 [Resilence4j][9] 之类的替代解决方案,或者类似于 [Adaptive Concurrency Limit][10] 的替代解决方案。
#### 负载均衡Nginx 和 HaProxy
负载均衡是分布式系统中最基本的概念之一,要想拥有一个生产质量的环境,必须有负载均衡的存在。要理解负载均衡器,首先我们需要明白冗余的概念。每个生产级的 Web 服务都有多个服务器在某个服务器宕机时提供冗余来接管和维持服务。
![负载均衡][11]
想想现代飞机:它们的双引擎提供冗余,使它们即使在一个引擎着火的情况下也能安全的着陆。(这也有助于大多数商用飞机拥有最先进的自动化系统)。但是,拥有多引擎(或者多服务器)也意味着必须存在一些调度机制在故障发生时有效地对系统进行路由。
负载均衡器是一种通过平衡多个服务节点来优化大流量事务的设备或者软件。举个例子,当数以千计的请求涌入时,负载均衡器可以作为中间层在不同的服务器间进行路由和平均分配流量。如果一台服务器宕机,负载均衡器会将请求转发给其它运行良好的服务器。
有许多可用的负载均衡器,但其中最出名的两个就是 Nginx 和 HaProxy。
[Nginx][12] 不仅仅是一个负载均衡器,它还是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。Groupon、Capital One、Adobe 和 NASA 等公司都在使用它。
[HaProxy][13] 也很受欢迎,因为它是一个免费的、非常快且可靠的解决方案,它为基于 TCP 和 HTTP 的应用程序提供高可用性、负载平衡和代理。许多大型网络公司,包括 Github、Reddit、Twitter 和 Stack Overflow 都使用 HaProxy。是的Red Hat Enterprise Linux 同样支持 HaProxy 设置。
#### 参与者模型Akka
[参与者模型][14]是一种并发设计模式,当作为基本计算单位的“参与者”接收到消息时,它会分派责任。一个参与者可以创建更多的参与者,并将消息委派给他们。
[Akka][15] 是最著名的参与者模型实现之一。该框架同时支持基于 JVM 的 Java 和 Scala。
#### 使用消息队列的异步、非阻塞 I/OKafka 和 RabbitMQ
多线程开发在过去很流行,但是现在已经不鼓励这种做法了,取而代之的是异步的、非阻塞的 I/O 模式。对于 Java这一点在 [EnterpriseJavaBeanEJB规范][16]中得到了明确的规定:
> “企业 bean 一定不能使用线程同步原语来同步多个实例的执行。”
>
> “企业 bean 不得试图去管理线程。企业 bean 不得试图启动、停止、挂起或恢复线程,或者去更改线程的优先级或者名称。企业 bean 不得试图管理线程组。”
如今,虽然还有其他做法,如流 API 和参与者模型,但像 [Kafka][17] 和[RabbitMQ][18] 之类的消息队列为异步和非阻塞 I/O 功能提供了开箱即用的支持,同时它们也是功能强大的开源工具,通过处理并发进程可以替代线程。
#### 其他的选择Eureka 和 Chaos Monkey
用于容错系统其它有用的工具包括奈飞的 [Eureka][19] 之类的监控工具,以及像 [Chaos Monkey][20] 这样的压力测试工具。它们旨在通过在较低环境中的测试如集成INT、质量保障QA和用户接受测试UAT来早早发现潜在问题以防止在转移到生产环境之前出现潜在问题。
你在使用什么开源工具来构建一个容错系统呢?请在评论中分享你的最爱。
--------------------------------------------------------------------------------
via: https://opensource.com/article/19/3/tools-fault-tolerant-system
作者:[Bryant Son][a]
选题:[lujun9972][b]
译者:[chenmu-kk](https://github.com/chenmu-kk)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/brson
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga (magnifying glass on computer screen, finding a bug in the code)
[2]: https://opensource.com/sites/default/files/uploads/1_errordowntimeservice.jpg (Fail-stop behavior due to Service 2 downtime)
[3]: https://opensource.com/sites/default/files/uploads/2_errordowntimenetwork.jpg (Fail-stop behavior due to network failure)
[4]: https://opensource.com/sites/default/files/uploads/3_byzantinefailuremalicious.jpg (Byzantine failure due to corrupted service)
[5]: https://opensource.com/sites/default/files/uploads/4_byzantinefailuremiddleman.jpg (Byzantine failure due to malicious middleman)
[6]: https://martinfowler.com/bliki/CircuitBreaker.html
[7]: https://opensource.com/sites/default/files/uploads/5_circuitbreakerpattern.jpg (Circuit breaker pattern)
[8]: https://github.com/Netflix/Hystrix/wiki
[9]: https://github.com/resilience4j/resilience4j
[10]: https://medium.com/@NetflixTechBlog/performance-under-load-3e6fa9a60581
[11]: https://opensource.com/sites/default/files/uploads/7_loadbalancer.jpg (Load balancer)
[12]: https://www.nginx.com
[13]: https://www.haproxy.org
[14]: https://en.wikipedia.org/wiki/Actor_model
[15]: https://akka.io
[16]: https://jcp.org/aboutJava/communityprocess/final/jsr220/index.html
[17]: https://kafka.apache.org
[18]: https://www.rabbitmq.com
[19]: https://github.com/Netflix/eureka
[20]: https://github.com/Netflix/chaosmonkey

View File

@ -0,0 +1,341 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12511-1.html)
[#]: subject: (How to use OpenSSL: Hashes, digital signatures, and more)
[#]: via: (https://opensource.com/article/19/6/cryptography-basics-openssl-part-2)
[#]: author: (Marty Kalin https://opensource.com/users/mkalindepauledu)
如何使用 OpenSSL哈希值、数字签名等
======
> 通过 OpenSSL 深入了解密码学的细节:哈希值、数字签名、数字证书等。
![](https://img.linux.net.cn/data/attachment/album/202008/13/150012t7zwwk6x7wr69wih.jpg)
[本系列的第一篇文章][2]通过 OpenSSL 库和命令行实用程序介绍了哈希、加密/解密、数字签名和数字证书。这第二篇文章将对细节进行深入探讨。让我们从计算中无处不在的哈希开始,并考虑是什么使哈希函数*具备密码学意义*。
### 密码学哈希
OpenSSL 源代码的[下载页面](https://www.openssl.org/source/)包含了一个带有最新版本的表格。每个版本都有两个<ruby>哈希值<rt>hash</rt></ruby>160 位 SHA1 和 256 位 SHA256。这些值可以用来验证下载的文件是否与存储库中的原始文件相匹配下载者在本地重新计算下载文件的哈希值然后将结果与原始文件进行比较。现代系统有计算这种哈希值的实用程序。例如Linux 有 `md5sum``sha256sum`。OpenSSL 本身也提供了类似的命令行实用程序。
哈希值被用于计算的许多领域。例如,比特币区块链使用 SHA256 哈希值作为区块标识符。挖比特币就是生成一个低于指定阈值的 SHA256 哈希值,也就是至少有 N 个前导零的哈希值。N 的值可以上升或下降,这取决于特定时间的挖矿生产力)。作为一个兴趣点,如今的矿机是为并行生成 SHA256 哈希值而设计的硬件集群。在 2018 年的一个高峰期,全球的比特币矿工每秒产生约 7500 万个<ruby>太哈希值<rt>terahash</rt></ruby> —— 这真是一个不可思议的数字。
网络协议也使用哈希值(在这里通常叫做“<ruby>校验和<rt>checksum</rt></ruby>”)来支持消息的完整性;也就是说,保证收到的消息与发送的消息是一样的。消息发送者计算消息的校验和,并将结果与消息一起发送。当消息到达时,接收方重新计算校验和。如果发送的校验和与重新计算的校验和不一致,那么消息在传输过程中可能出现了一些问题,或者发送的校验和出现了问题,或者两者都出现了问题。在这种情况下,应该重新发送消息和它的校验和,或者至少应该触发一个错误情况。(如 UDP 这样的低级网络协议不会理会校验和。)
哈希的其他例子大家都很熟悉。比如一个网站,要求用户用密码进行验证,用户在浏览器中输入密码,然后,他们通过 HTTPS 连接到服务器,密码从浏览器加密发送到服务器。一旦密码到达服务器,就会被解密,然后进行数据库表的查询。
在这个查询表中应该存储什么?存储密码本身是有风险的。风险要小得多的方式是存储一个由密码生成的哈希值,也许在计算哈希值之前“加一些<ruby><rt>salt</rt></ruby>(额外的位)改善口味”。你的密码可能会被发送到 Web 服务器上,但网站可以向你保证,密码不会存储在那里。
哈希值还出现在安全的各个领域。例如,<ruby>基于哈希值的消息认证码<rt>hash-based message authentication code</rt></ruby>[HMAC][3])使用一个哈希值和一个秘密的<ruby>加密密钥<rt>cryptographic key</rt></ruby>来认证通过网络发送的消息。HMAC 码轻量级且易于在程序中使用,在 Web 服务中很受欢迎。一个 X509 数字证书包括一个称为<ruby>指纹<rt>fingerprint</rt></ruby>的哈希值,它可以方便证书验证。一个存放于内存中的<ruby>可信存储<rt>truststore</rt></ruby>可以实现为一个以这种指纹为键的查找表 —— 作为一个支持恒定查找时间的<ruby>哈希映射<rt>hash map</rt></ruby>。来自传入的证书的指纹可以与可信存储中的密钥进行比较,以确定是否匹配。
<ruby>密码学哈希函数<rt>cryptographic hash function</rt></ruby>应该具有什么特殊属性?它应该是<ruby>单向<rt>one-way</rt></ruby>的,这意味着很难被逆转。一个加密哈希函数应该是比较容易计算的,但是计算它的反函数(将哈希值映射回输入位串的函数)在计算上应该是困难的。下面是一个描述,用 `chf` 作为加密哈希函数,我的密码 `foobar` 作为样本输入。
```
+---+
foobar—>|chf|—>hash value ## 简单直接
+--+
```
相比之下,逆向操作是不可行的:
```
+-----------+
hash value—>|chf inverse|—>foobar ## 棘手困难
+-----------+
```
例如,回忆一下 SHA256 哈希函数。对于一个任意长度为 N > 0 的输入位串,这个函数会生成一个 256 位的固定长度的哈希值;因此,这个哈希值甚至不会反映出输入位串的长度 N更不用说字符串中每个位的值了。顺便说一下SHA256 不容易受到<ruby>[长度扩展攻击][4]<rt>length extension attack</rt></ruby>。唯一有效的逆向工程方法是通过蛮力搜索将计算出的 SHA256 哈希值逆向返回到输入位串,这意味着需要尝试所有可能的输入位串,直到找到与目标哈希值匹配的位串。这样的搜索在 SHA256 这样一个完善的加密哈希函数上是不可行的。
现在,最后一个回顾的知识点是<ruby>有序<rt>in order</rt></ruby>。加密哈希值是统计学上的唯一,而不是无条件的唯一,这意味着两个不同的输入位串产生相同的哈希值是不太可能的,但也不是不可能的 —— 这称之为<ruby>碰撞<rt>collision</rt></ruby>。[生日问题][5]提供了一个很好的反直觉的碰撞例子。对各种哈希算法的<ruby>抗碰撞性<rt>collision resistance</rt></ruby>有着广泛的研究。例如MD5128 位哈希值)在大约 2^21 次哈希之后,抗碰撞能力就会崩溃。对于 SHA1160 位哈希值),大约在 2^61 次哈希后开始崩溃。
对于 SHA256 的抗碰撞能力的剖析目前还没有一个很好的估计。这个事实并不奇怪。SHA256 有 2^256 个不同的哈希值范围,这个数字的十进制表示法有 78 位之多! 那么SHA256 哈希会不会发生碰撞呢?当然可能,但可能性极小。
在下面的命令行示例中,有两个输入文件被用作位串源:`hashIn1.txt` 和 `hashIn2.txt`。第一个文件包含 `abc`,第二个文件包含 `1a2b3c`
为了便于阅读,这些文件包含的是文本,但也可以使用二进制文件代替。
在命令行(百分号 `%` 是提示符)使用 Linux `sha256sum` 实用程序对这两个文件进行处理产生以下哈希值(十六进制):
```
% sha256sum hashIn1.txt
9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3 hashIn1.txt
% sha256sum hashIn2.txt
3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13 hashIn2.txt
```
OpenSSL 哈希对应的结果与预期相同:
```
% openssl dgst -sha256 hashIn1.txt
SHA256(hashIn1.txt)= 9e83e05bbf9b5db17ac0deec3b7ce6cba983f6dc50531c7a919f28d5fb3696c3
% openssl dgst -sha256 hashIn2.txt
SHA256(hashIn2.txt)= 3eaac518777682bf4e8840dd012c0b104c2e16009083877675f00e995906ed13
```
这种对密码学哈希函数的研究,为我们仔细研究数字签名及其与密钥对的关系奠定了基础。
### 数字签名
顾名思义,<ruby>数字签字<rt>digital signature</rt></ruby>可以附在文件或其他一些电子<ruby>工件<rt>artifact</rt></ruby>(如程序)上,以证明其真实性。因此,这种签名类似于纸质文件上的手写签名。验证数字签名就是要确认两件事:第一,被担保的工件在签名被附上后没有改变,因为它部分是基于文件的加密学哈希值。第二,签名属于一个人(例如 Alice只有她才能获得一对密钥中的私钥。顺便说一下对代码源码或编译后的代码进行数字签名已经成为程序员的普遍做法。
让我们来了解一下数字签名是如何创建的。如前所述,没有公钥和私钥对就没有数字签名。当使用 OpenSSL 创建这些密钥时,有两个独立的命令:一个是创建私钥,另一个是从私钥中提取匹配的公钥。这些密钥对用 base64 编码,在这个过程中可以指定它们的大小。
<ruby>私钥<rt>private key</rt></ruby>由数值组成,其中两个数值(一个<ruby>模数<rt>modulus</rt></ruby>和一个<ruby>指数<rt>exponent</rt></ruby>)组成了公钥。虽然私钥文件包含了<ruby>公钥<rt>public key</rt></ruby>,但提取出来的公钥并**不会**透露相应私钥的值。
因此,生成的带有私钥的文件包含了完整的密钥对。将公钥提取到自己的文件中是很实用的,因为这两把钥匙有不同的用途,而这种提取方式也将私钥可能被意外公开的危险降到最低。
接下来,这对密钥的私钥被用来生成目标工件(如电子邮件)的哈希值,从而创建签名。在另一端,接收者的系统使用这对密钥的公钥来验证附在工件上的签名。
现在举个例子。首先,用 OpenSSL 生成一个 2048 位的 RSA 密钥对:
```
openssl genpkey -out privkey.pem -algorithm rsa 2048
```
在这个例子中,我们可以舍去 `-algorithm rsa` 标志,因为 `genpkey` 默认为 RSA 类型。文件的名称(`privkey.pem`)是任意的,但是<ruby>隐私增强邮件<rt>Privacy Enhanced Mail</rt></ruby>PEM扩展名 `.pem` 是默认 PEM 格式的惯用扩展名。如果需要的话OpenSSL 有命令可以在各种格式之间进行转换。)如果需要更大的密钥大小(例如 4096那么最后一个参数 `2048` 可以改成 `4096`。这些大小总是二的幂。
下面是产生的 `privkey.pem` 文件的一个片断,它是 base64 编码的:
```
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANnlAh4jSKgcNj/Z
JF4J4WdhkljP2R+TXVGuKVRtPkGAiLWE4BDbgsyKVLfs2EdjKL1U+/qtfhYsqhkK
...
-----END PRIVATE KEY-----
```
接下来的命令就会从私钥中提取出这对密钥的公钥:
```
openssl rsa -in privkey.pem -outform PEM -pubout -out pubkey.pem
```
由此产生的 `pubkey.pem` 文件很小,可以在这里完整地显示出来:
```
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZ5QIeI0ioHDY/2SReCeFnYZJY
z9kfk11RrilUbT5BgIi1hOAQ24LMilS37NhHYyi9VPv6rX4WLKoZCmkeYaWk/TR5
4nbH1E/AkniwRoXpeh5VncwWMuMsL5qPWGY8fuuTE27GhwqBiKQGBOmU+MYlZonO
O0xnAKpAvysMy7G7qQIDAQAB
-----END PUBLIC KEY-----
```
现在,有了密钥对,数字签名就很容易了 —— 在本例中,源文件 `client.c` 是要签名的工件:
```
openssl dgst -sha256 -sign privkey.pem -out sign.sha256 client.c
```
`client.c` 源文件的摘要是 SHA256私钥在前面创建的 `privkey.pem` 文件中。由此产生的二进制签名文件是 `sign.sha256`,这是一个任意的名字。要得到这个文件的可读版本(比如 base64后续命令是
```
openssl enc -base64 -in sign.sha256 -out sign.sha256.base64
```
文件 `sign.sha256.base64` 现在包含如下内容:
```
h+e+3UPx++KKSlWKIk34fQ1g91XKHOGFRmjc0ZHPEyyjP6/lJ05SfjpAJxAPm075
VNfFwysvqRGmL0jkp/TTdwnDTwt756Ej4X3OwAVeYM7i5DCcjVsQf5+h7JycHKlM
o/Jd3kUIWUkZ8+Lk0ZwzNzhKJu6LM5KWtL+MhJ2DpVc=
```
或者,可执行文件 `client` 也可以被签名,由此产生的 base64 编码签名将如预期的不同:
```
VMVImPgVLKHxVBapJ8DgLNJUKb98GbXgehRPD8o0ImADhLqlEKVy0HKRm/51m9IX
xRAN7DoL4Q3uuVmWWi749Vampong/uT5qjgVNTnRt9jON112fzchgEoMb8CHNsCT
XIMdyaPtnJZdLALw6rwMM55MoLamSc6M/MV1OrJnk/g=
```
这一过程的最后一步是用公钥验证数字签名。作为验证的一个重要步骤,应重新计算用于签署工件(在本例中,是可执行的 `client` 程序)的哈希值,因为验证过程应表明工件在签署后是否发生了变化。
有两个 OpenSSL 命令用于这个目的。第一条命令是对 base64 签名进行解码。
```
openssl enc -base64 -d -in sign.sha256.base64 -out sign.sha256
```
第二条是核实签名:
```
openssl dgst -sha256 -verify pubkey.pem -signature sign.sha256 client
```
第二条命令的输出,应该是这样的:
```
Verified OK
```
为了了解验证失败时的情况,一个简短但有用的练习是将最后一个 OpenSSL 命令中的可执行的 `client` 文件替换为源文件 `client.c`,然后尝试验证。另一个练习是改变 `client` 程序,无论多么轻微,然后再试一次。
### 数字证书
<ruby>数字证书<rt>digital certificate</rt></ruby>汇集了到目前为止所分析的各个部分:哈希值、密钥对、数字签名和加密/解密。生产级证书的第一步是创建一个<ruby>证书签名请求<rt>certificate signing request</rt></ruby>CSR然后将其发送给<ruby>证书颁发机构<rt>certificate authority</rt></ruby>CA。在 OpenSSL 的例子中,要做到这一点,请运行:
```
openssl req -out myserver.csr -new -newkey rsa:4096 -nodes -keyout myserverkey.pem
```
这个例子生成了一个 CSR 文档,并将该文档存储在文件 `myserver.csr`base64 文本中。这里的目的是CSR 文档要求 CA 保证与指定域名相关联的身份,域名也就是 CA 所说的<ruby>通用名<rt>common name</rt></ruby>CN
尽管可以使用现有的密钥对,但这个命令也会生成一个新的密钥对。请注意,在诸如 `myserver.csr``myserverkey.pem` 等名称中使用 `server` 暗示了数字证书的典型用途:作为与 www.google.com 等域名相关的 Web 服务器的身份担保。
然而,无论数字证书如何使用,同样使用这个命令都会创建一个 CSR。它还会启动一个问题/回答的交互式会话,提示有关域名的相关信息,以便与请求者的数字证书相连接。这个交互式会话可以通过在命令中提供基本的信息,用反斜杠来续行一步完成。`-subj` 标志提供了所需的信息。
```
% openssl req -new \
-newkey rsa:2048 -nodes -keyout privkeyDC.pem \
-out myserver.csr \
-subj "/C=US/ST=Illinois/L=Chicago/O=Faulty Consulting/OU=IT/CN=myserver.com"
```
产生的 CSR 文件在发送给 CA 之前可以进行检查和验证。这个过程可以创建具有所需格式(如 X509、签名、有效期等的数字证书。
```
openssl req -text -in myserver.csr -noout -verify
```
这是输出的一个片断:
```
verify OK
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ba:36:fb:57:17:65:bc:40:30:96:1b:6e:de:73:
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
```
### 自签证书
在开发 HTTPS 网站的过程中,手头有一个不用经过 CA 流程的数字证书是很方便的。在 HTTPS 握手的认证阶段,<ruby>自签证书<rt>self-signed certificate</rt></ruby>就能满足要求,尽管任何现代浏览器都会警告说这样的证书毫无价值。继续这个例子,自签证书的 OpenSSL 命令(有效期为一年,使用 RSA 公钥)如下:
```
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:4096 -keyout myserver.pem -out myserver.crt
```
下面的 OpenSSL 命令呈现了生成的证书的可读版本:
```
openssl x509 -in myserver.crt -text -noout
```
这是自签证书的部分输出:
```
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 13951598013130016090 (0xc19e087965a9055a)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com
Validity
Not Before: Apr 11 17:22:18 2019 GMT
Not After : Apr 10 17:22:18 2020 GMT
Subject: C=US, ST=Illinois, L=Chicago, O=Faulty Consulting, OU=IT, CN=myserver.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:ba:36:fb:57:17:65:bc:40:30:96:1b:6e:de:73:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
3A:32:EF:3D:EB:DF:65:E5:A8:96:D7:D7:16:2C:1B:29:AF:46:C4:91
X509v3 Authority Key Identifier:
keyid:3A:32:EF:3D:EB:DF:65:E5:A8:96:D7:D7:16:2C:1B:29:AF:46:C4:91
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
3a:eb:8d:09:53:3b:5c:2e:48:ed:14:ce:f9:20:01:4e:90:c9:
...
```
如前所述RSA 私钥包含的值是用来生成公钥的。但是,给定的公钥**不会**泄露匹配的私钥。关于底层数学理论的介绍,见 <https://simple.wikipedia.org/wiki/RSA_algorithm>
数字证书与用于生成该证书的密钥对之间存在着重要的对应关系,即使证书只是自签的:
* 数字证书包含构成公钥的指数和模数值。这些值是最初生成的 PEM 文件中密钥对的一部分,在本例中,是文件 `myserver.pem`
* <ruby>指数<rt>exponent</rt></ruby>几乎总是 65,537如本例中所以可以忽略。
* 密钥对的<ruby>模数<rt>modulus</rt></ruby>应该与数字证书的模数相匹配。
模数是一个很大的值,为了便于阅读,可以进行哈希处理。下面是两个 OpenSSL 命令,它们检查相同的模数,从而确认数字证书是基于 PEM 文件中的密钥对。
```
% openssl x509 -noout -modulus -in myserver.crt | openssl sha1 ## 证书中的模数
(stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769
% openssl rsa -noout -modulus -in myserver.pem | openssl sha1 ## 密钥中的模数
(stdin)= 364d21d5e53a59d482395b1885aa2c3a5d2e3769
```
所产生的哈希值匹配,从而确认数字证书是基于指定的密钥对。
### 回到密钥分发问题上
让我们回到第一部分末尾提出的一个问题:`client` 程序和 Google Web 服务器之间的 TLS 握手。握手协议有很多种,即使是用在 `client` 例子中的 Diffie-Hellman 版本也有不同的方式。尽管如此,`client` 例子遵循了一个共同的模式。
首先,在 TLS 握手过程中,`client` 程序和 Web 服务器就<ruby>加密套件<rt>cipher suite</rt></ruby>达成一致,其中包括要使用的算法。在本例中,该套件是 `ECDHE-RSA-AES128-GCM-SHA256`
现在值得关注的两个要素是 RSA 密钥对算法和 AES128 块密码,用于在握手成功的情况下对消息进行加密和解密。关于加密/解密,这个过程有两种流派:<ruby>对称<rt>symmetric</rt></ruby><ruby>非对称<rt>asymmetric</rt></ruby>。在对称流派中,加密和解密使用的是*相同的*密钥,这首先就引出了<ruby>密钥分发问题<rt>key distribution problem</rt></ruby>。如何将密钥安全地分发给双方?在非对称流派中,一个密钥用于加密(在这种情况下,是 RSA 公钥),但另一个密钥用于解密(在这种情况下,是来自同一对密钥的 RSA 私钥)。
`client` 程序拥有来认证证书的 Google Web 服务器的公钥,而 Web 服务器拥有来自同一对密钥的私钥。因此,`client` 程序可以向 Web 服务器发送加密信息,而 Web 服务器可以单独对该通信进行解密。
在 TLS 的情况下,对称方式有两个显著的优势:
* 在 `client` 程序与 Google Web 服务器之间的互动中认证是单向的。Google Web 服务器向 `client` 程序发送三张证书,但 `client` 程序并没有向 Web 服务器发送证书因此Web 服务器没有来自客户端的公钥,无法加密发给客户端的消息。
* 使用 AES128 的对称加密/解密比使用 RSA 密钥的非对称加密/解密快了**近千倍**。
TLS 握手将两种加密/解密方式巧妙地结合在一起。在握手过程中,`client` 程序会生成随机位,即所谓的<ruby>预主密<rt>pre-master secret</rt></ruby>PMS。然后`client` 程序用服务器的公钥对 PMS 进行加密,并将加密后的 PMS 发送给服务器,服务器再用 RSA 密钥对的私钥对 PMS 信息进行解密:
```
+-------------------+ encrypted PMS +--------------------+
client PMS--->|servers public key|--------------->|servers private key|--->server PMS
+-------------------+ +--------------------+
```
在这个过程结束时,`client` 程序和 Google Web 服务器现在拥有相同的 PMS 位。每一方都使用这些位生成一个<ruby>主密码<rt>master secret</rt></ruby>,并立即生成一个称为<ruby>会话密钥<rt>session key</rt></ruby>的对称加密/解密密钥。现在有两个不同但等价的会话密钥,连接的每一方都有一个。在 `client` 的例子中,会话密钥是 AES128 类的。一旦在 `client` 程序和 Google Web 服务器两边生成了会话密钥,每一边的会话密钥就会对双方的对话进行保密。如果任何一方(例如,`client` 程序或另一方在这种情况下Google Web 服务器)要求重新开始握手,握手协议(如 Diffie-Hellman允许整个 PMS 过程重复进行。
### 总结
在命令行上说明的 OpenSSL 操作也可以通过底层库的 API 完成。这两篇文章重点使用了这个实用程序以保持例子的简短并专注于加密主题。如果你对安全问题感兴趣OpenSSL 是一个很好的开始地方,并值得深入研究。
--------------------------------------------------------------------------------
via: https://opensource.com/article/19/6/cryptography-basics-openssl-part-2
作者:[Marty Kalin][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/mkalindepauledu
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003784_02_os.comcareers_os_rh2x.png?itok=jbRfXinl (A person working.)
[2]: https://linux.cn/article-11810-1.html
[3]: https://en.wikipedia.org/wiki/HMAC
[4]: https://en.wikipedia.org/wiki/Length_extension_attack
[5]: https://en.wikipedia.org/wiki/Birthday_problem
[6]: http://www.google.com

View File

@ -0,0 +1,145 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12477-1.html)
[#]: subject: (Bash Script to Check How Long the High CPU/Memory Consumption Processes Runs on Linux)
[#]: via: (https://www.2daygeek.com/bash-script-to-check-how-long-the-high-cpu-memory-consumption-processes-runs-on-linux/)
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
实用脚本:检查高 CPU / 内存消耗进程
======
![](https://img.linux.net.cn/data/attachment/album/202008/01/205420jllu1nsngu9qszu5.jpg)
过去,我们写了三篇不同的文章来使用 Linux 命令来识别这些进程。
你可以通过下面相关的 URL 立即访问:
* [如何在 Linux 中找出 CPU 占用高的进程][1]
* [如何在 Linux 中找出内存消耗最大的进程][2]
* [在 Linux 中如何查找一个命令或进程的执行时间][3]
本教程中包含两个脚本,它们可以帮助你确定 Linux 上高 CPU/内存消耗进程的运行时间。
该脚本将显示进程 ID、进程的所有者、进程的名称以及进程的运行时间。这将帮助你确定哪些必须事先完成作业正在超时运行。这可以使用 `ps` 命令来实现。
### 什么是 ps 命令
`ps`<ruby>进程状态<rt>processes status</rt></ruby>,它显示有关系统上活动/正在运行的进程的信息。
它提供了当前进程的快照以及详细信息,例如用户名、用户 ID、CPU 使用率、内存使用率、进程开始日期和时间等。
#### 1检查高 CPU 消耗进程在 Linux 上运行了多长时间的 Bash 脚本
该脚本将帮助你确定高 CPU 消耗进程在 Linux 上运行了多长时间。
```
# vi /opt/scripts/long-running-cpu-proc.sh
#!/bin/bash
ps -eo pid,user,ppid,%mem,%cpu,cmd --sort=-%cpu | head | tail -n +2 | awk '{print $1}' > /tmp/long-running-processes.txt
echo "--------------------------------------------------"
echo "UName PID CMD Process_Running_Time"
echo "--------------------------------------------------"
for userid in `cat /tmp/long-running-processes.txt`
do
username=$(ps -u -p $userid | tail -1 | awk '{print $1}')
pruntime=$(ps -p $userid -o etime | tail -1)
ocmd=$(ps -p $userid | tail -1 | awk '{print $4}')
echo "$username $userid $ocmd $pruntime"
done | column -t
echo "--------------------------------------------------"
```
`long-running-cpu-proc.sh` 设置可执行的 [Linux 文件权限][4]。
```
# chmod +x /opt/scripts/long-running-cpu-proc.sh
```
运行此脚本时,你将获得类似以下的输出:
```
# sh /opt/scripts/long-running-cpu-proc.sh
----------------------------------------------------
UName PID CMD Process_Running_Time
----------------------------------------------------
daygeek 5214 Web 01:18:48
daygeek 5748 Web 01:08:20
daygeek 8043 inkscape 22:11
daygeek 5269 Web 01:18:31
daygeek 1712 Web 10:44:50
daygeek 5335 RDD 01:17:54
daygeek 1639 firefox 10:44:51
daygeek 7793 nautilus 24:14
daygeek 6301 Web 57:40
----------------------------------------------------
```
#### 2检查高内存消耗进程在 Linux 上运行了多长时间的 Bash 脚本
该脚本将帮助你确定最大的内存消耗进程在 Linux 上运行了多长时间。
```
# sh /opt/scripts/long-running-memory-proc.sh
#!/bin/bash
ps -eo pid,user,ppid,%mem,%cpu,cmd --sort=-%mem | head | tail -n +2 | awk '{print $1}' > /tmp/long-running-processes-1.txt
echo "--------------------------------------------------"
echo "UName PID CMD Process_Running_Time"
echo "--------------------------------------------------"
for userid in `cat /tmp/long-running-processes-1.txt`
do
username=$(ps -u -p $userid | tail -1 | awk '{print $1}')
pruntime=$(ps -p $userid -o etime | tail -1)
ocmd=$(ps -p $userid | tail -1 | awk '{print $4}')
echo "$username $userid $ocmd $pruntime"
done | column -t
echo "--------------------------------------------------"
```
`long-running-memory-proc.sh` 设置可执行的 Linux 文件权限。
```
# chmod +x /opt/scripts/long-running-memory-proc.sh
```
运行此脚本时,你将获得类似以下的输出:
```
# sh /opt/scripts/long-running-memory-proc.sh
----------------------------------------------------
UName PID CMD Process_Running_Time
----------------------------------------------------
daygeek 1639 firefox 10:44:56
daygeek 2997 Web 10:39:54
daygeek 5269 Web 01:18:37
daygeek 1712 Web 10:44:55
daygeek 8043 inkscape 22:17
daygeek 5214 Web 01:18:54
daygeek 1898 Web 10:44:48
daygeek 1129 Xorg 10:45:07
daygeek 6301 Web 57:45
----------------------------------------------------
```
--------------------------------------------------------------------------------
via: https://www.2daygeek.com/bash-script-to-check-how-long-the-high-cpu-memory-consumption-processes-runs-on-linux/
作者:[Magesh Maruthamuthu][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://www.2daygeek.com/author/magesh/
[b]: https://github.com/lujun9972
[1]: https://linux.cn/article-11678-1.html
[2]: https://linux.cn/article-11542-1.html
[3]: https://linux.cn/article-10261-1.html
[4]: https://www.2daygeek.com/understanding-linux-file-permissions/

View File

@ -0,0 +1,627 @@
[#]: collector: (lujun9972)
[#]: translator: (silentdawn-zz)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12499-1.html)
[#]: subject: (Share data between C and Python with this messaging library)
[#]: via: (https://opensource.com/article/20/3/zeromq-c-python)
[#]: author: (Cristiano L. Fontana https://opensource.com/users/cristianofontana)
使用 ZeroMQ 消息库在 C 和 Python 间共享数据
======
> ZeroMQ 是一个快速灵活的消息库,用于数据收集和不同编程语言间的数据共享。
![](https://img.linux.net.cn/data/attachment/album/202008/08/202106uale11l1qf11slzw.jpg)
作为软件工程师,我有多次在要求完成指定任务时感到浑身一冷的经历。其中有一次,我必须在一些新的硬件基础设施和云基础设施之间写一个接口,这些硬件需要 C 语言,而云基础设施主要是用 Python。
实现的方式之一是 [用 C 写扩展模块][2]Python 支持 C 扩展的调用。快速浏览文档后发现,这需要编写大量的 C 代码。这样做的话,在有些情况下效果还不错,但不是我喜欢的方式。另一种方式就是将两个任务放在不同的进程中,并使用 [ZeroMQ 消息库][3] 在两者之间交换消息。
在发现 ZeroMQ 之前,遇到这种类型的情况时,我选择了编写扩展的方式。这种方式不算太差,但非常费时费力。如今,为了避免那些问题,我将一个系统细分为独立的进程,通过 [通信套接字][4] 发送消息来交换信息。这样,不同的编程语言可以共存,每个进程也变简单了,同时也容易调试。
ZeroMQ 提供了一个更简单的过程:
1. 编写一小段 C 代码,从硬件读取数据,然后把发现的东西作为消息发送出去。
2. 使用 Python 编写接口,实现新旧基础设施之间的对接。
[Pieter Hintjens][5] 是 ZeroMQ 项目发起者之一,他是个拥有 [有趣视角和作品][6] 的非凡人物。
### 准备
本教程中,需要:
* 一个 C 编译器(例如 [GCC][7] 或 [Clang][8]
* [libzmq 库][9]
* [Python 3][10]
* [ZeroMQ 的 Python 封装][11]
Fedora 系统上的安装方法:
```
$ dnf install clang zeromq zeromq-devel python3 python3-zmq
```
Debian 和 Ubuntu 系统上的安装方法:
```
$ apt-get install clang libzmq5 libzmq3-dev python3 python3-zmq
```
如果有问题,参考对应项目的安装指南(上面附有链接)。
### 编写硬件接口库
因为这里针对的是个设想的场景,本教程虚构了包含两个函数的操作库:
* `fancyhw_init()` 用来初始化(设想的)硬件
* `fancyhw_read_val()` 用于返回从硬件读取的数据
将库的完整代码保存到文件 `libfancyhw.h` 中:
```
#ifndef LIBFANCYHW_H
#define LIBFANCYHW_H
#include <stdlib.h>
#include <stdint.h>
// This is the fictitious hardware interfacing library
void fancyhw_init(unsigned int init_param)
{
srand(init_param);
}
int16_t fancyhw_read_val(void)
{
return (int16_t)rand();
}
#endif
```
这个库可以模拟你要在不同语言实现的组件间交换的数据,中间有个随机数发生器。
### 设计 C 接口
下面从包含管理数据传输的库开始,逐步实现 C 接口。
#### 需要的库
开始先加载必要的库(每个库的作用见代码注释):
```
// For printf()
#include <stdio.h>
// For EXIT_*
#include <stdlib.h>
// For memcpy()
#include <string.h>
// For sleep()
#include <unistd.h>
#include <zmq.h>
#include "libfancyhw.h"
```
#### 必要的参数
定义 `main` 函数和后续过程中必要的参数:
```
int main(void)
{
    const unsigned int INIT_PARAM = 12345;
    const unsigned int REPETITIONS = 10;
    const unsigned int PACKET_SIZE = 16;
    const char *TOPIC = "fancyhw_data";
    ...
```
#### 初始化
所有的库都需要初始化。虚构的那个只需要一个参数:
```
fancyhw_init(INIT_PARAM);
```
ZeroMQ 库需要实打实的初始化。首先,定义对象 `context`,它是用来管理全部的套接字的:
```
void *context = zmq_ctx_new();
if (!context)
{
printf("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
```
之后定义用来发送数据的套接字。ZeroMQ 支持若干种套接字,各有其用。使用 `publish` 套接字(也叫 `PUB` 套接字),可以复制消息并分发到多个接收端。这使得你可以让多个接收端接收同一个消息。没有接收者的消息将被丢弃(即不会入消息队列)。用法如下:
```
void *data_socket = zmq_socket(context, ZMQ_PUB);
```
套接字需要绑定到一个具体的地址,这样客户端就知道要连接哪里了。本例中,使用了 [TCP 传输层][15](当然也有 [其它选项][16],但 TCP 是不错的默认选择):
```
const int rb = zmq_bind(data_socket, "tcp://*:5555");
if (rb != 0)
{
printf("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
```
下一步, 计算一些后续要用到的值。 注意下面代码中的 `TOPIC`,因为 `PUB` 套接字发送的消息需要绑定一个主题。主题用于供接收者过滤消息:
```
const size_t topic_size = strlen(TOPIC);
const size_t envelope_size = topic_size + 1 + PACKET_SIZE * sizeof(int16_t);
printf("Topic: %s; topic size: %zu; Envelope size: %zu\n", TOPIC, topic_size, envelope_size);
```
#### 发送消息
启动一个发送消息的循环,循环 `REPETITIONS` 次:
```
for (unsigned int i = 0; i < REPETITIONS; i++)
{
...
```
发送消息前,先填充一个长度为 `PACKET_SIZE` 的缓冲区。本库提供的是 16 个位的有符号整数。因为 C 语言中 `int` 类型占用空间大小与平台相关,不是确定的值,所以要使用指定宽度的 `int` 变量:
```
int16_t buffer[PACKET_SIZE];
for (unsigned int j = 0; j < PACKET_SIZE; j++)
{
buffer[j] = fancyhw_read_val();
}
printf("Read %u data values\n", PACKET_SIZE);
```
消息的准备和发送的第一步是创建 ZeroMQ 消息,为消息分配必要的内存空间。空白的消息是用于封装要发送的数据的:
```
zmq_msg_t envelope;
const int rmi = zmq_msg_init_size(&envelope, envelope_size);
if (rmi != 0)
{
printf("ERROR: ZeroMQ error occurred during zmq_msg_init_size(): %s\n", zmq_strerror(errno));
zmq_msg_close(&envelope);
break;
}
```
现在内存空间已分配,数据保存在 ZeroMQ 消息 “信封”中。函数 `zmq_msg_data()` 返回一个指向封装数据缓存区顶端的指针。第一部分是主题,之后是一个空格,最后是二进制数。主题和二进制数据之间的分隔符采用空格字符。需要遍历缓存区的话,使用类型转换和 [指针算法][18]。(感谢 C 语言,让事情变得直截了当。)做法如下:
```
memcpy(zmq_msg_data(&envelope), TOPIC, topic_size);
memcpy((void*)((char*)zmq_msg_data(&envelope) + topic_size), " ", 1);
memcpy((void*)((char*)zmq_msg_data(&envelope) + 1 + topic_size), buffer, PACKET_SIZE * sizeof(int16_t))
```
通过 `data_socket` 发送消息:
```
const size_t rs = zmq_msg_send(&envelope, data_socket, 0);
if (rs != envelope_size)
{
printf("ERROR: ZeroMQ error occurred during zmq_msg_send(): %s\n", zmq_strerror(errno));
zmq_msg_close(&envelope);
break;
}
```
使用数据之前要先解除封装:
```
zmq_msg_close(&envelope);
printf("Message sent; i: %u, topic: %s\n", i, TOPIC);
```
#### 清理
C 语言不提供 [垃圾收集][20] 功能,用完之后记得要自己扫尾。发送消息之后结束程序之前,需要运行扫尾代码,释放分配的内存:
```
const int rc = zmq_close(data_socket);
if (rc != 0)
{
printf("ERROR: ZeroMQ error occurred during zmq_close(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
const int rd = zmq_ctx_destroy(context);
if (rd != 0)
{
printf("Error occurred during zmq_ctx_destroy(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
```
#### 完整 C 代码
保存下面完整的接口代码到本地名为 `hw_interface.c` 的文件:
```
// For printf()
#include <stdio.h>
// For EXIT_*
#include <stdlib.h>
// For memcpy()
#include <string.h>
// For sleep()
#include <unistd.h>
#include <zmq.h>
#include "libfancyhw.h"
int main(void)
{
const unsigned int INIT_PARAM = 12345;
const unsigned int REPETITIONS = 10;
const unsigned int PACKET_SIZE = 16;
const char *TOPIC = "fancyhw_data";
fancyhw_init(INIT_PARAM);
void *context = zmq_ctx_new();
if (!context)
{
printf("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
void *data_socket = zmq_socket(context, ZMQ_PUB);
const int rb = zmq_bind(data_socket, "tcp://*:5555");
if (rb != 0)
{
printf("ERROR: ZeroMQ error occurred during zmq_ctx_new(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
const size_t topic_size = strlen(TOPIC);
const size_t envelope_size = topic_size + 1 + PACKET_SIZE * sizeof(int16_t);
printf("Topic: %s; topic size: %zu; Envelope size: %zu\n", TOPIC, topic_size, envelope_size);
for (unsigned int i = 0; i < REPETITIONS; i++)
{
int16_t buffer[PACKET_SIZE];
for (unsigned int j = 0; j < PACKET_SIZE; j++)
{
buffer[j] = fancyhw_read_val();
}
printf("Read %u data values\n", PACKET_SIZE);
zmq_msg_t envelope;
const int rmi = zmq_msg_init_size(&envelope, envelope_size);
if (rmi != 0)
{
printf("ERROR: ZeroMQ error occurred during zmq_msg_init_size(): %s\n", zmq_strerror(errno));
zmq_msg_close(&envelope);
break;
}
memcpy(zmq_msg_data(&envelope), TOPIC, topic_size);
memcpy((void*)((char*)zmq_msg_data(&envelope) + topic_size), " ", 1);
memcpy((void*)((char*)zmq_msg_data(&envelope) + 1 + topic_size), buffer, PACKET_SIZE * sizeof(int16_t));
const size_t rs = zmq_msg_send(&envelope, data_socket, 0);
if (rs != envelope_size)
{
printf("ERROR: ZeroMQ error occurred during zmq_msg_send(): %s\n", zmq_strerror(errno));
zmq_msg_close(&envelope);
break;
}
zmq_msg_close(&envelope);
printf("Message sent; i: %u, topic: %s\n", i, TOPIC);
sleep(1);
}
const int rc = zmq_close(data_socket);
if (rc != 0)
{
printf("ERROR: ZeroMQ error occurred during zmq_close(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
const int rd = zmq_ctx_destroy(context);
if (rd != 0)
{
printf("Error occurred during zmq_ctx_destroy(): %s\n", zmq_strerror(errno));
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
```
用如下命令编译:
```
$ clang -std=c99 -I. hw_interface.c -lzmq -o hw_interface
```
如果没有编译错误你就可以运行这个接口了。贴心的是ZeroMQ `PUB` 套接字可以在没有任何应用发送或接受数据的状态下运行,这简化了使用复杂度,因为这样不限制进程启动的次序。
运行该接口:
```
$ ./hw_interface
Topic: fancyhw_data; topic size: 12; Envelope size: 45
Read 16 data values
Message sent; i: 0, topic: fancyhw_data
Read 16 data values
Message sent; i: 1, topic: fancyhw_data
Read 16 data values
...
...
```
输出显示数据已经通过 ZeroMQ 完成发送,现在要做的是让一个程序去读数据。
### 编写 Python 数据处理器
现在已经准备好从 C 程序向 Python 应用传送数据了。
#### 库
需要两个库帮助实现数据传输。首先是 ZeroMQ 的 Python 封装:
```
$ python3 -m pip install zmq
```
另一个就是 [struct 库][21],用于解码二进制数据。这个库是 Python 标准库的一部分,所以不需要使用 `pip` 命令安装。
Python 程序的第一部分是导入这些库:
```
import zmq
import struct
```
#### 重要参数
使用 ZeroMQ 时,只能向常量 `TOPIC` 定义相同的接收端发送消息:
```
topic = "fancyhw_data".encode('ascii')
print("Reading messages with topic: {}".format(topic))
```
#### 初始化
下一步,初始化上下文和套接字。使用 `subscribe` 套接字(也称为 `SUB` 套接字),它是 `PUB` 套接字的天生伴侣。这个套接字发送时也需要匹配主题。
```
with zmq.Context() as context:
    socket = context.socket(zmq.SUB)
    socket.connect("tcp://127.0.0.1:5555")
    socket.setsockopt(zmq.SUBSCRIBE, topic)
    i = 0
    ...
```
#### 接收消息
启动一个无限循环,等待接收发送到 `SUB` 套接字的新消息。这个循环会在你按下 `Ctrl+C` 组合键或者内部发生错误时终止:
```
    try:
        while True:
            ... # we will fill this in next
    except KeyboardInterrupt:
        socket.close()
    except Exception as error:
        print("ERROR: {}".format(error))
        socket.close()
```
这个循环等待 `recv()` 方法获取的新消息,然后将接收到的内容从第一个空格字符处分割开,从而得到主题:
```
binary_topic, data_buffer = socket.recv().split(b' ', 1)
```
#### 解码消息
Python 此时尚不知道主题是个字符串,使用标准 ASCII 编解码器进行解码:
```
topic = binary_topic.decode(encoding = 'ascii')
print("Message {:d}:".format(i))
print("\ttopic: '{}'".format(topic))
```
下一步就是使用 `struct` 库读取二进制数据,它可以将二进制数据段转换为明确的数值。首先,计算数据包中数值的组数。本例中使用的 16 个位的有符号整数对应的是 `struct` [格式字符][22] 中的 `h`
```
packet_size = len(data_buffer) // struct.calcsize("h")
print("\tpacket size: {:d}".format(packet_size))
```
知道数据包中有多少组数据后,就可以通过构建一个包含数据组数和数据类型的字符串,来定义格式了(比如“`16h`”):
```
struct_format = "{:d}h".format(packet_size)
```
将二进制数据串转换为可直接打印的一系列数字:
```
data = struct.unpack(struct_format, data_buffer)
print("\tdata: {}".format(data))
```
#### 完整 Python 代码
下面是 Python 实现的完整的接收端:
```
#! /usr/bin/env python3
import zmq
import struct
topic = "fancyhw_data".encode('ascii')
print("Reading messages with topic: {}".format(topic))
with zmq.Context() as context:
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:5555")
socket.setsockopt(zmq.SUBSCRIBE, topic)
i = 0
try:
while True:
binary_topic, data_buffer = socket.recv().split(b' ', 1)
topic = binary_topic.decode(encoding = 'ascii')
print("Message {:d}:".format(i))
print("\ttopic: '{}'".format(topic))
packet_size = len(data_buffer) // struct.calcsize("h")
print("\tpacket size: {:d}".format(packet_size))
struct_format = "{:d}h".format(packet_size)
data = struct.unpack(struct_format, data_buffer)
print("\tdata: {}".format(data))
i += 1
except KeyboardInterrupt:
socket.close()
except Exception as error:
print("ERROR: {}".format(error))
socket.close()
```
将上面的内容保存到名为 `online_analysis.py` 的文件。Python 代码不需要编译,你可以直接运行它。
运行输出如下:
```
$ ./online_analysis.py
Reading messages with topic: b'fancyhw_data'
Message 0:
        topic: 'fancyhw_data'
        packet size: 16
        data: (20946, -23616, 9865, 31416, -15911, -10845, -5332, 25662, 10955, -32501, -18717, -24490, -16511, -28861, 24205, 26568)
Message 1:
        topic: 'fancyhw_data'
        packet size: 16
        data: (12505, 31355, 14083, -19654, -9141, 14532, -25591, 31203, 10428, -25564, -732, -7979, 9529, -27982, 29610, 30475)
...
...
```
### 小结
本教程介绍了一种新方式,实现从基于 C 的硬件接口收集数据,并分发到基于 Python 的基础设施的功能。借此可以获取数据供后续分析,或者转送到任意数量的接收端去。它采用了一个消息库实现数据在发送者和处理者之间的传送,来取代同样功能规模庞大的软件。
本教程还引出了我称之为“软件粒度”的概念,换言之,就是将软件细分为更小的部分。这种做法的优点之一就是,使得同时采用不同的编程语言实现最简接口作为不同部分之间沟通的组件成为可能。
实践中,这种设计使得软件工程师能以更独立、合作更高效的方式做事。不同的团队可以专注于数据分析的不同方面,可以选择自己中意的实现工具。这种做法的另一个优点是实现了零代价的并行,因为所有的进程都可以并行运行。[ZeroMQ 消息库][3] 是个令人赞叹的软件,使用它可以让工作大大简化。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/3/zeromq-c-python
作者:[Cristiano L. Fontana][a]
选题:[lujun9972][b]
译者:[silentdawn-zz](https://github.com/译者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/cristianofontana
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/email_chat_communication_message.png?itok=LKjiLnQu (Chat via email)
[2]: https://docs.python.org/3/extending/extending.html
[3]: https://zeromq.org/
[4]: https://en.wikipedia.org/wiki/Network_socket
[5]: https://en.wikipedia.org/wiki/Pieter_Hintjens
[6]: http://hintjens.com/
[7]: https://gcc.gnu.org/
[8]: https://clang.llvm.org/
[9]: https://github.com/zeromq/libzmq#installation-of-binary-packages-
[10]: https://www.python.org/downloads/
[11]: https://zeromq.org/languages/python/
[12]: http://www.opengroup.org/onlinepubs/009695399/functions/srand.html
[13]: http://www.opengroup.org/onlinepubs/009695399/functions/rand.html
[14]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html
[15]: https://en.wikipedia.org/wiki/Transmission_Control_Protocol
[16]: http://zguide.zeromq.org/page:all#Plugging-Sockets-into-the-Topology
[17]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html
[18]: https://en.wikipedia.org/wiki/Pointer_%28computer_programming%29%23C_and_C++
[19]: http://www.opengroup.org/onlinepubs/009695399/functions/memcpy.html
[20]: https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
[21]: https://docs.python.org/3/library/struct.html
[22]: https://docs.python.org/3/library/struct.html#format-characters

View File

@ -0,0 +1,62 @@
[#]: collector: (lujun9972)
[#]: translator: (JonnieWayy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12479-1.html)
[#]: subject: (How failure-driven development makes you successful)
[#]: via: (https://opensource.com/article/20/3/failure-driven-development)
[#]: author: (Jessica Cherry https://opensource.com/users/jrepka)
屡屡失败犯错的我为什么没有被开除
======
> 我是词典里 “失败” 一词旁边的插图,这就是为什么我擅长我的工作的原因。
![](https://img.linux.net.cn/data/attachment/album/202008/02/212013q5jjc78ihwd72cij.jpg)
我的职称是高级软件工程师,但我最亲近的同事并不这么称呼我。由于我摧毁一切,他们管我叫“樱桃炸弹”(正巧我姓“樱桃”)。我定期会遇到的失败已经可以影响到我们的季度性收益和停机时间。简单的来说,我就是你所听说过的生产灾难:“别动,啥都别做,无论何时何地。”
我的职业生涯始于支持服务台,在那里我写了一些循环,破坏了高端客户的服务器。我曾在没有警告的情况下将生产应用程序关闭了长达八个小时,并且在试图使得情况好转的过程中摧毁了无数个集群,有几次只是因为我打错了字。
我是我们在 [Kubernetes][2] 中设有灾难恢复DR集群的原因。我是个混乱的工程师我们有一个应用程序它的故障恢复计划还从未测试过而我在没有警告的情况下就教人们如何快速行动和排除故障。我作为可能失败的最好例子而存在这实际上是有史以来最酷的事情。
### 我和消失的 K8s 集群
我的正式职责之一涉及到我们的应用架构。对于任何形式的架构改动,我都要进行代码的编写与测试,看看有什么可能性。近来,据说这成了我老板史诗级的痛苦,这只是轻描淡写。
我们在 Kubernetes 上运行我们的大多数基础架构Kubernetes 以其弹性著称。尽管有这样的声誉,我还是使得两个集群,好吧,消失了。你可能会好奇我是怎么做到的,很容易,`terraform destroy`。我们通过 [Terraform][3] 以代码的方式管理我们的基础架构,并且不需要任何软件知识就知道 `destroy` 可做坏事。在你惊慌失措之前,好吧,是开发集群,所以我还活着。
鉴于此,你们肯定会问我为什么还没丢掉饭碗,以及为什么我要写下这些事情。这很好回答:我仍然有工作,是因为我更新的基础架构代码比起起初的代码工作得更好更快了。我写下这些是因为每个人都会经常性地遭遇失败,这是非常非常正常的。如果你没有时不时遭遇失败,我认为你并没有足够努力地学习。
### 破坏东西并培训人们
你可能还会认为永远不会有人让我去培训任何人。那是最糟糕的主意,因为(就像我的团队开玩笑说的)你永远都不应该做我所做的事情。但是我的老板却让我定期去训练新人。我甚至为整个团队提供使用我们的基础设施或代码的培训,教人们如何建立自己的基础设施。
原因是这样的:失败是你迈向成功的第一步。失败的教训绝不只是“备份是个绝佳的主意”。不,从失败中,你学会了更快地恢复、更快地排除故障并且在你工作中取得惊人的进步。当你在工作中变得惊人的时候,你就可以培训其他人,教给他们什么事情不要做,并且帮助他们去理解一切是如何工作的。由于你的经验,他们会比你开始时更进一步 —— 而且他们也很可能以新的、惊人的、史诗般的方式失败,每个人都可以从中学到东西。
### 你的成功取决于你的失败
没有人生来就具有软件工程和云基础架构方面的天赋,就像没有人天生就会走路。我们都是从滚动和翻爬开始的。从那时起,我们学会爬行,然后能够站立一会儿。当我们开始走路后,我们会跌倒并且擦伤膝盖,撞到手肘,还有,比如像我哥哥,走着走着撞上桌子的尖角,然后在眉毛中间缝了针。
凡事都需要时间去学习。一路上阅读手边能获得的一切来帮助你,但这永远只是个开始。完美是无法实现的幻想,你必须通过失败来取得成功。
每走一步,我的失败都教会我如何把事情做得更好。
最终,你的成功和你累积的失败一样多,这标志着你成功的程度。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/3/failure-driven-development
作者:[Jessica Cherry][a]
选题:[lujun9972][b]
译者:[JonnieWayy](https://github.com/JonnieWayy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/jrepka
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fail_failure_celebrate.png?itok=LbvDAEZF (failure sign at a party, celebrating failure)
[2]: https://www.redhat.com/en/topics/containers/what-is-kubernetes
[3]: https://github.com/hashicorp/terraform

View File

@ -0,0 +1,123 @@
[#]: collector: (lujun9972)
[#]: translator: (robsean)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12487-1.html)
[#]: subject: (24 Linux desktops you need to try)
[#]: via: (https://opensource.com/article/20/5/linux-desktops)
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
24 个值得尝试的 Linux 桌面环境
======
> 我全要!
![](https://img.linux.net.cn/data/attachment/album/202008/04/222604tj9mpc66zyzxppbx.jpg)
Linux 桌面的最大优点之一是它提供给用户选择的权利。如果你不喜欢你屏幕左下角的应用程序菜单,你可以移除它。如果你不喜欢你的文件管理器组织文件的方式,你可以使用另外一个文件管理器。不过,不可否认的是,这对那些不习惯自己选择如何使用计算机的用户来说可能会感到困惑。如果你正在考虑安装 Linux你要做的选择之一就是你想使用哪一个桌面最好的方法就是尝试几个不同的桌面直到你找到感觉适合你的桌面。
### 默认桌面
![][2]
作为在 Fedora、Ubuntu、Debian 和一些其它操作系统上的默认桌面GNOME 桌面可能是最流行的 Linux 桌面。它有一个易于使用和现代化的界面,并带有为手机环境设计的小点缀,因此即使在触摸屏上也感觉很自然。
不过,一些 Linux 发行版选择了不同的桌面环境,如 KDE Plasma、Pantheon、Cinnamon 和 Mate。
* [GNOME][3]: 现代化和易于使用,默认桌面
* [Mate][4]: 传统的 GNOME
* [KDE][5]: 功能强大、可配置的 Plasma 桌面
* [Cinnamon][6]: 经典的 GNOME
* [Pantheon][7]: [ElementaryOS][8] 的默认桌面
* [Budgie][9]: 一个柔和的桌面
* [Trinity][10]: 传统的 KDE
### 传统的 Unix
![运行在 Fedora 上的 Window Maker][11]
Unix 是现代操作系统的鼻祖,也是 Linux 的直接灵感来源,拥有令人吃惊的丰富的桌面历史。大多数人都不熟悉 Unix 桌面设计,因为 Unix 计算机被认为是学术界、科学界和电影界常见的专业机器,而不是家用计算机。如果你是一名 Unix、IRIX 或 NeXT 的用户,那么你可能会对类似于 [CDE][12] 或 NeXTStep 的桌面有着美好的回忆。你很幸运,因为这一传统延续至今:
* [Windowmaker][13]: NeXT 界面的复兴
* [Enlightenment][14]: 一个现代化的改进型 Windowmaker 风格的桌面
* [Fluxbox][15]: 跳出 Blackbox 思维定式
* [Openbox][16]: 改善 Blackbox 的可用性
* [TWM][17]: 与 X11 绑定至死的示例桌面
* [Fvwm][18]: 改进的 TWM
### 轻量级桌面
![XFCE in 2019 年 在 Mageia Linux 上的][19]
你可能想知道为什么 Linux 有那么多的桌面可供选择。你可以把它归结为个人喜好和对效率低下的低容忍度,但优化用户界面也有技术上的好处。例如,老电脑难以跟上用户界面的更新,可以使用轻量级桌面[赋予它新的生命](<https://opensource.com/article/20/2/macbook-linux-elementary>) 。另外,你可能只是想把 CPU 处理能力分配到除桌面以外的其它东西上,所以保持你的主用户界面极简是有意义的。不管你的动机是什么,这里有一些你可以尝试的桌面:
* [XFCE][20]: 熟悉的桌面,极少的性能损失
* [LXQT 和 LXDE][21]: 熟悉的桌面,较少的性能损失
* [PekWM][22]: 一个 Blackbox 式的窗口管理器
* [Joe's Window Manager][23]: 另一个 Blackbox 式的窗口管理器
* [Ratpoison][24]: 不使用鼠标
* [Herbstluftwm][25]: 针对 [Vim 用户][26] 的Ratpoison
* [Lumina][27]: 一个为 PC-BSD 开发的桌面
### 实验性桌面
![Unix 桌面环境][28]
当创建一个桌面并将其集成到一个系统中相对容易的时候,会发生的事情之一就是你会得到一些有趣的概念验证项目和试验性项目。有一些会比其它的更精致,有一些则不是很容易安装。这些很可能注定不会成为你的永久桌面,但是它们可以是很有趣的体验:
* [Unix Desktop Environment][29]: 该桌面的重塑版
* [Rox][30]: 在它那个时代是先进和现代的桌面
* [MLVWM][31]: 要是 Apple IIe 运行 Unix 怎么样?
* [Equinox][32]: 只是个最基础的东西
### 选择你的桌面
如果太多的选择让你不知所措,那么记住:桌面意味着 *可选*。你没有义务来尝试发行版附带的多个桌面。
许多 Linux 的高级用户都会满足于他们的发行版所提供的某个桌面。最重要的是得到一个可以与你的计算机一起工作的 Linux 系统系统,并花费时间来学习它是如何工作的。归根结底,所有的桌面都只是为了做同一件事:帮助你组织和管理你的重要数据。让你了解你的桌面是如何工作的,这才是最重要的。但是如果你已经了解了你的默认桌面的各个方面,那你现在有了可以在周末尝试的大量选择。祝你玩得开心!
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/5/linux-desktops
作者:[Seth Kenlon][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://opensource.com/users/seth
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux-penguins.png?itok=yKOpaJM_ (Penguins)
[2]: https://opensource.com/sites/default/files/advent-gnome.jpg
[3]: https://linux.cn/article-11675-1.html
[4]: https://linux.cn/article-11703-1.html
[5]: https://linux.cn/article-11728-1.html
[6]: https://linux.cn/article-8606-1.html
[7]: https://linux.cn/article-11660-1.html
[8]: https://elementary.io/
[9]: https://linux.cn/article-10547-1.html
[10]: https://opensource.com/article/19/12/linux-trinity-desktop-environment-tde
[11]: https://opensource.com/sites/default/files/uploads/advent-windowmaker.jpg (Window Maker running on Fedora)
[12]: https://sourceforge.net/projects/cdesktopenv/
[13]: https://linux.cn/article-11650-1.html
[14]: https://opensource.com/article/19/12/linux-enlightenment-desktop
[15]: https://linux.cn/article-12082-1.html
[16]: https://linux.cn/article-11698-1.html
[17]: https://linux.cn/article-11734-1.html
[18]: https://linux.cn/article-11712-1.html
[19]: https://opensource.com/sites/default/files/advent-xfce.jpg (XFCE on Mageia Linux in 2019)
[20]: https://linux.cn/article-10413-1.html
[21]: https://opensource.com/article/19/12/lxqt-lxde-linux-desktop
[22]: https://linux.cn/article-11670-1.html
[23]: https://opensource.com/article/19/12/joes-window-manager-linux-desktop
[24]: https://opensource.com/article/19/12/ratpoison-linux-desktop
[25]: https://linux.cn/article-11734-1.html
[26]: https://opensource.com/resources/what-vim
[27]: https://linux.cn/article-11706-1.html
[28]: https://opensource.com/sites/default/files/uploads/advent-ude.jpg (Unix Desktop Environment)
[29]: https://opensource.com/article/19/12/linux-unix-desktop-environment-ude
[30]: https://linux.cn/article-12123-1.html
[31]: https://linux.cn/article-11720-1.html
[32]: https://opensource.com/article/19/12/ede-linux-desktop

View File

@ -0,0 +1,88 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12496-1.html)
[#]: subject: (Easy DNS configuration with PowerDNS for nameservers)
[#]: via: (https://opensource.com/article/20/5/powerdns)
[#]: author: (Jonathan Garrido https://opensource.com/users/jgarrido)
使用 PowerDNS 轻松配置 DNS 名称服务器
======
> 使用 PDNS 为你的项目提供稳定可靠的域名系统DNS服务器。
![](https://img.linux.net.cn/data/attachment/album/202008/07/202953copoqjmkefkdf3j4.jpg)
几个月前,我们接到了一个要求,为一个新项目提供一个稳定可靠的域名系统([DNS][2])服务器。该项目使用容器进行自动部署,每个新环境都会生成唯一的随机 URL。在对可能的方案进行了大量研究之后我们决定尝试一下 [PowerDNS][3]PDNS
一开始,我们发现 PowerDNS 在所有主流 Linux 发行版中都得到了支持,它采用 GPL 许可,且仓库保持更新。我们还在官方网站上发现了整洁、组织良好的[文档][4],以及大量来自真正喜欢和使用该产品的人在网络上的使用方法。看了一些并学习了一些基本命令之后,安装了 PDNS启动并运行我们的旅程开始了。
### 数据库驱动
PowerDNS 将记录保存在 SQL 数据库中。这对我们来说是新变化,不必使用文本文件来保存记录是一个不错的更改。我们选择 MariaDB 作为首选的强大工具,由于有大量的正确地设置来安装名称服务器的信息,我们可以完美地设置和加固我们的数据库。
### 简单配置
其次使我们感兴趣的是 PDNS 的所有功能都在配置文件中。`pdns.conf` 有许多选项,你可以通过添加或删除 `` 号来启用或禁用这些选项。这真是太神奇了,因为它使我们有机会将这项新的服务集成到我们现有的基础架构中,并且只有我们想要的功能,不多也不少。一个简单的例子:
谁可以访问你的网络服务器?
```
webserver-allow-from=172.10.0.1,172.10.1.2
```
我可以转发基于域的请求吗?当然!
```
forward-zones=mylocal.io=127.0.0.1:5300
forward-zones+=example.com=172.10.0.5:53
forward-zones+=lucky.tech=172.10.1.5:53
```
### 包含 API
我们可以使用配置文件进行激活 API 服务,解决了我们开发团队的第一个需求,让我们见识到了 PDNS 的强大。这个功能让我们通过发送请求,简单、干净地创建、修改或删除 DNS 服务器中的记录。
这个 API 有一些基本的安全性参数,因此,只需几步,你就可以基于 IP 地址和预共享密钥验证的组合来控制谁有权与名称服务器进行交互。这是配置文件的样子:
```
api=yes
api-key=lkjdsfpoiernf
webserver-allow-from=172.10.7.13,172.10.7.5
```
### 日志
在日志方面PDNS 做得非常出色。你可以使用日志文件和一个简单的内置 Web 服务器来监控服务器并查看计算机的运行状况。你可以使用浏览器查看服务器不同类型的统计信息,例如 CPU 使用率和收到的 DNS 查询。这非常有价值。例如,我们能够检测到一些“不太健康”的 PC它们正在向我们的服务器发送与恶意流量相关的站点的 DNS 请求。深入查看日志后,我们可以看到流量来自何处,并对这些 PC 进行清理操作。
### 其他功能
这只是你使用 PowerDNS 可以做的所有事情的一点点。它还有更多的功能。它是一个拥有很多功能和特性的完整名称服务器,因此值得一试。
目前,我们尚未部署 [DNSSEC][5]但似乎只需点击一下即可将其快速投入生产环境。另外在将递归服务与名称服务器分离时PowerDNS 有个不错的方法。我了解到它还支持 [DNS RPZ][6](响应策略区域),并且还提供了非常不错且设计良好的前端,可让你使用 Web 浏览器来管理服务器,如下图。
![PowerDNS frontend][7]
信不信由你,你只需花费几个小时了解 PDNS就可以大大提高你对 DNS 和 IT 操作的了解。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/5/powerdns
作者:[Jonathan Garrido][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/jgarrido
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_space_graphic_cosmic.png?itok=wu493YbB (Computer laptop in space)
[2]: https://en.wikipedia.org/wiki/Domain_Name_System
[3]: https://www.powerdns.com/opensource.html
[4]: https://doc.powerdns.com/
[5]: https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions
[6]: https://dnsrpz.info/
[7]: https://opensource.com/sites/default/files/uploads/pdns.jpg (PowerDNS frontend)

View File

@ -0,0 +1,138 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12543-1.html)
[#]: subject: (FreeFileSync: Open Source File Synchronization Tool)
[#]: via: (https://itsfoss.com/freefilesync/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
FreeFileSync开源的文件同步工具
======
> FreeFileSync 是一个开源的文件夹比较和同步工具,你可以使用它将数据备份到外部磁盘、云服务(如 Google Drive或任何其他存储路径。
### FreeFileSync一个免费且开源的同步工具
![](https://img.linux.net.cn/data/attachment/album/202008/23/060523ubx28vyi8qf8sv9d.jpg)
[FreeFileSync][2] 是一个令人印象深刻的开源工具,可以帮助你将数据备份到其他位置。
它们可以是外部 USB 磁盘、Google Drive 或使用 **SFTP 或 FTP** 连接到任何云存储。
你可能之前读过我们的[如何在 Linux 上使用 Google Drive][3] 的教程。不幸的是,没有合适的在 Linux 上原生使用 Google Drive 的 FOSS 方案。有个 [Insync][4],但它是收费软件而非开源软件。
FreeFileSync 可使用 Google Drive 帐户同步文件。事实上,我用它把我的文件同步到 Google Drive 和一个单独的硬盘上。
### FreeFileSync 的功能
![][1]
尽管 FreeFileSync 的 UI 看起来可能很老,但它为普通用户和高级用户提供了许多有用的功能。
我将在此处把所有能重点介绍的功能都介绍出来:
* 跨平台支持Windows、macOS 和 Linux
* 同步前比较文件夹
* 支持 Google Drive、[SFTP][6] 和 FTP 连接
* 提供在不同的存储路径(或外部存储设备)上同步文件的能力
* 多个可用的同步选项(从源更新文件到目标或镜像目标和源之间的文件)
* 支持双向同步(如果目标文件夹或源文件夹有任何修改,将同步更改)
* 适用于高级用户的版本控制
* 可进行实时同步
* 能安排批处理作业
* 同步完成时通过电子邮件收到通知(付费)
* 便携式版(付费)
* 并行文件复制(付费)
如果你看一下它提供的功能,它不仅是普通的同步工具,而且还免费提供了更多功能。
此外,为了让你了解,你还可以在同步文件之前先比较它们。例如,你可以比较文件内容/文件时间,或者简单地比较源文件夹和目标文件夹的文件大小。
![][7]
你还有许多同步选项来镜像或更新数据。如下所示:
![][8]
但是,它也为你提供了捐赠密钥的可选选项,它可解锁一些特殊功能,如在同步完成时通过电子邮件通知你等。
以下是免费版本和付费版本的不同:
![][9]
因此,大多数基本功能是免费的。高级功能主要是针对高级用户,当然,如果你想支持他们也可以。(如果你觉得它有用,请这么做)。
此外,请注意,捐赠版单用户最多可在 3 台设备上使用。所以,这绝对不差!
### 在 Linux 上安装 FreeFileSync
你可以前往它的[官方下载页面][10],并下载 Linux 的 tar.gz 文件。如果你喜欢,你还可以下载源码。
![][11]
接下来,你只需解压并运行可执行文件就可以了(如上图所示)
- [下载 FreeFileSync][2]
### 如何开始使用 FreeFileSync
虽然我还没有成功地尝试过创建自动同步作业,但它很容易使用。
[官方文档][12]应该足以让你获得想要的。
但是,为了让你初步了解,这里有一些事情,你应该记住。
![][13]
如上面的截图所示,你只需选择源文件夹和要同步的目标文件夹。你可以选择本地文件夹或云存储位置。
完成后,你需要选择在同步中文件夹比较的类型(通常是文件时间和大小),在右侧,你可以调整要执行的同步类型。
#### FreeFileSync 的同步类型
当你选择 “更新” 的方式进行同步时,它只需将新数据从源文件夹复制到目标文件夹。因此,即使你从源文件夹中删除了某些东西,它也不会在目标文件夹中被删除。
如果你希望目标文件夹有相同的文件副本,可以选择 “镜像”同步方式。这样,如果你从源文件夹中删除内容,它就会从目标文件夹中删除。
还有一个 “双向” 同步方式,它检测源文件夹和目标文件夹的更改(而不是只监视源文件夹)。因此,如果对源/目标文件夹进行了任何更改,都将同步修改。
有关更高级的用法,我建议你参考[文档][12]。
### 总结
还有一个[开源文件同步工具是 Syncthing][14],你可能想要看看。
FreeFileSync 是一个相当被低估的文件夹比较和同步工具,适用于使用 Google Drive、SFTP 或 FTP 连接以及单独的存储位置进行备份的 Linux 用户。
而且,所有这些功能都免费提供对 Windows、macOS 和 Linux 的跨平台支持。
这难道不令人兴奋吗?请在下面的评论,让我知道你对 Freefilesync 的看法。
--------------------------------------------------------------------------------
via: https://itsfoss.com/freefilesync/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/free-file-sync.jpg?ssl=1
[2]: https://freefilesync.org/
[3]: https://itsfoss.com/use-google-drive-linux/
[4]: https://itsfoss.com/recommends/insync/
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/FreeFileSync.jpg?ssl=1
[6]: https://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-comparison.png?ssl=1
[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-synchronization.png?ssl=1
[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/free-file-sync-donation-edition.jpg?ssl=1
[10]: https://freefilesync.org/download.php
[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-run.jpg?ssl=1
[12]: https://freefilesync.org/manual.php
[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/freefilesync-tips.jpg?ssl=1
[14]: https://itsfoss.com/syncthing/

View File

@ -0,0 +1,117 @@
[#]: collector: (lujun9972)
[#]: translator: (silentdawn-zz)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12518-1.html)
[#]: subject: (Code your hardware using this open source RTOS)
[#]: via: (https://opensource.com/article/20/6/open-source-rtos)
[#]: author: (Zhu Tianlong https://opensource.com/users/zhu-tianlong)
使用 RT-Thread 实时操作系统驱动你的硬件
======
> 编程驱动一个微处理器芯片是相当有难度的,但在嵌入式系统开发上,实时操作系统可以为你解决很多此类的困难。
![](https://img.linux.net.cn/data/attachment/album/202008/15/065451hu3784opp7p74qtp.jpg)
从通用计算的角度,操作系统是提供计算机基本功能的一组软件。操作系统保证了计算机硬件可以探测并响应外围器件(如键盘、屏幕、移动设备、打印机等),并管理内存空间和外部存储空间。
虽然一个 CPU 核心同一时间只能运行单个线程,但现代操作系统可以使多个程序表现的像是在同时运行。每一个任务执行的如此之短,一系列任务切换的如此之快,以至于看起来多个任务像是在并行进行。这一切都是由一个叫做 *调度器* 的子进程来控制的。
操作系统通常是为计算机准备的,安装在硬盘上,管理计算机所要执行的任务。
### 为什么实时操作系统对嵌入式系统而言不可或缺
我曾经在 2008 年接触过嵌入式软件,那时候我还是一名学生,正在学习 [MCS-51][2] 微处理器编程。因为我的主修专业是计算机科学,我在其它课程中的所有程序都是在 PC 上执行的。为微处理器芯片编程是完全不同的体验。人生中第一次,我看到我的程序在裸板上运行,即使到现在我仍然记得,在我看到自己人生中第一个走马灯程序成功运行时的那种兴奋和激动。
但那种兴奋转瞬即逝。随着为裸板写出越来越多的程序,我遇到了越来越多的问题。这种沮丧并不是我独有的。直接为芯片写程序很困难,这也是 PC 要运行操作系统的很重要的原因。不幸的是,微处理器芯片(或嵌入式系统)通常是没有操作系统的,它们只能采用“硬编码”的方式编程,没有操作系统帮助你管理代码的运行。
在以“硬编码”的方式为处理芯片编写代码的时候,可能会遇到下列问题:
#### 并发
在裸板上是没有管理程序运行的现成守护进程的。嵌入式系统软件中,无可避免的要把所有的逻辑功能放在一个巨大的 `while (1)` 循环中。每个功能可能包含一个或多个延时函数。CPU 在运行延时函数的时候是顺序执行的,没有任何办法跨越一个不必要的延时。正因如此,运行事务的复位操作只能是等待。最终结果就是很多的 CPU 处理时间浪费在空循环上,这对任务的并发非常不利。
#### 模块化
从软件工程的角度,高內聚低耦合原则在软件开发过程中被不厌其烦的频频强调,但是嵌入式软件的不同模块之间常常是重度耦合的,很多功能都集中在一个巨大的 `while (1)` 循环中,很难切分为模块。设计低耦合软件在编程上只是繁琐一些,但在嵌入式系统上,要低耦合就难以编写比较大型的软件。
与此同时,如果使用了看门狗定时器,程序员还得在调用延时函数时倍加小心。如果延时时间太长,主程序没有得到及时“喂狗”的时机,那么看门狗将在程序运行过程中被触发。嵌入式系统软件开发过程中,需要考虑的东西太多了,即便是个简单的延时函数,都不能掉以轻心。软件越复杂,就越需要细心。想象一下,试图将这一系列具有精细时间关系的交互功能拆分为模块会怎么样。
#### 软件生态
很多高级的软件组件依赖于其所基于的底层操作系统的实现。举个自身的例子,我曾开发过一个基于 [FreeModbus][3] 的开源项目,原计划将它移植到多种平台上,包括裸板。但与适应不同操作系统的便利性相比,有些功能过于复杂,无法在所有裸机板上实现。更糟糕的是,很多硬件平台因为缺乏一致性,只能各自从头做起。
直至现在,我的 Modbus 栈仍然不支持在裸板上运行。
很多像 Realtek、TI 和 MediaTek 的大厂,所提供的 WiFi 软件开发工具只能在操作系统上运行,且他们不公开固件源码,所以在裸板上根本没法使用这些工具。
#### 实时性
有些应用领域对实时性有要求,比如有些场景中,必须在特定的时间触发特定的软件操作。在工业控制场景,机器实体控制过程中,机械部件必须以确定的时间和确定的顺序执行动作。如果不能保证控制系统的实时性,整个机器可能出现功能异常,甚至危及工人生命。在裸板平台,所有的功能都塞在一个巨大的 `while (1)` 循环中,实时性无从保证。
#### 重用性
重用性依赖于模块化。没谁愿意翻来覆去做一成不变的事,对程序员而言更是如此。这不单单是浪费时间,更要命的是这使得代码的维护异常复杂。尤其是,因为功能的实现依赖于底层的硬件,使用了不同芯片的不同硬件平台上,同样的功能必须适配不同的硬件平台。这种情况下,重新发明轮子是无法避免的。
### 实时操作系统的优势
幸运的是现在有针对各种微处理器芯片的操作系统它们被称为实时操作系统RTOS和大多数操作系统一样它们拥有调度器保证代码以可预见的顺序运行。
我是在 2010 年初次在裸板上使用实时操作系统。那时候,[STM32][4] 系列微处理器MCU开始流行因为这种微处理器性能强大、功能丰富很多人在上面跑操作系统。我使用的是 [RT-Thread][5] 操作系统,有很多基于它的现成组件可用。它使用的是 Apache 2.0 许可,和其它操作系统相比,我觉得这个很舒心。我已经基于它作为平台从事开发工作 10 年了。
使用实时操作系统为裸板编程,操作系统为我们解决了需要处理的大部分问题。
#### 模块化
在操作系统支持下,整个软件可以分割为多个任务(即线程)。每个线程拥有自己独立的运行空间。线程之间互相独立,这促进了软件的模块化。
#### 并发
如果一个线程有延时函数,它将自动让出 CPU 资源给需要 CPU 的线程,这提高了 CPU 的整体利用率,也提升了系统的并发性能。
#### 实时性
实时操作系统从设计上就具备实时性。每个线程都被指定了特定的优先级,比较重要的线程设置为更高的优先级,不重要的线程优先级也低。正是以这种方式,软件整体的实时性得到了保证。
#### 开发效率
操作系统提供了统一的抽象接口,这使得可重用组件得以不断积累,同时提升了开发效率。
操作系统是软件极客集体智慧的结晶。很多通用的软件功能,如信号量、事件提醒、邮箱、环形缓冲、单向链表、双向链表等,被抽象出来并实现了封装,可随时调用。
Linux、RT-Thread 等操作系统为五花八门的硬件实现了一致的硬件接口,也就是常说的设备驱动框架。正因如此,软件工程师可以专注于软件开发,而不用关心底层的硬件,也不用重复造轮子。
#### 软件生态
RT-Thread 丰富的软件生态为大量的从业者带来了巨大的改变。操作系统带来的模块化和重用性,使得程序员可以基于 RT-Thread 封装出方便嵌入式系统开发使用的可重用组件。这些组件可以在其它项目中重用,也可以分享给其他的嵌入式应用开发者,以最大化软件的价值。
比如LkdGui 是个开源的单色显示图形库你可能在工业控制面板上简单而美观的设置界面上见过它。LkdGui 提供了像描点、画线、绘矩形及显示文本、按钮组件、进度条等绘图功能。
![LkdGui][6]
使用像 LkdGui 这样兼具扩展性和健壮性的功能库,程序员们可以在同行已有工作成果的基础上充分施展自己的才能。而这一切,没有实时操作系统这样一个统一的基础,是根本不可能的。
### 试用 RT-Thread
作为开源极客,我已经在 GitHub 上开源了一些嵌入式软件。在发布开源软件之前,我很少对他人谈及自己曾经的项目,因为不同的人在使用各种不同的微处理器芯片和硬件平台,我的代码极可能无法在他人的板子上运行。类似于 RT-Thread 这样的实时操作系统极大的提升了软件的可重用性,所以全世界的不同领域的专家得以就同一个项目展开探讨。这鼓励着越来越多的人分享和交流各自的项目。如果你在做裸板的软件开发,下次可以试试 TR-Thread。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/6/open-source-rtos
作者:[Zhu Tianlong][a]
选题:[lujun9972][b]
译者:[silentdawn-zz](https://github.com/silentdawn-zz)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/zhu-tianlong
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen)
[2]: https://en.wikipedia.org/wiki/Intel_MCS-51
[3]: https://www.embedded-solutions.at/files/freemodbus-v1.6-apidoc/
[4]: https://en.wikipedia.org/wiki/STM32
[5]: https://github.com/RT-Thread/rt-thread
[6]: https://opensource.com/sites/default/files/uploads/lkdgui.jpg (LkdGui)

View File

@ -0,0 +1,185 @@
[#]: collector: (lujun9972)
[#]: translator: (silentdawn-zz)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12493-1.html)
[#]: subject: (Concise data plotting in Python with Altair)
[#]: via: (https://opensource.com/article/20/6/altair-python)
[#]: author: (Shaun Taylor-Morgan https://opensource.com/users/shaun-taylor-morgan)
Python 下使用 Altair 数据制图
======
> Altair 作为一个 Python 数据制图库,提供了优雅的接口及自有的绘图语言。
![](https://img.linux.net.cn/data/attachment/album/202008/06/110441imrz9ajtpshtfq1i.jpg)
Python 中的 [绘图库][2] 提供了呈现数据的多种方式,可以满足你不同的偏好,如灵活性、布局、易用性,或者特殊的风格。
和其它方式相比我发现Altair 提供的是一种不同的解决方案,且总体而言使用起来更为简单。得益于声明式的绘图语言 [Vega][3]Altair 拥有一套优雅的接口,可以直接定义要绘的图应该是什么样子,而不是通过写一大堆循环和条件判断去一步步构建。
### 绘图流程
我通过绘制同一个多柱状图比较了多个 Python 绘图库的差异。正式开始之前,你需要将你的 Python 环境调整到能运行下面代码的状态。具体就是:
* 安装最新版的 Python [Linux][4]、[Mac][5] 和 [Windows][6] 系统下的安装方法)
* 确认该版本 Python 可以运行本教程所使用的库
演示用数据可从网络下载,并且可以用 pandas 直接导入:
```
import pandas as pd
df = pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')
```
准备开始吧。为了做个比较,先看下面这个用 [Matplotlib][7] 做的图:
![Matplotlib UK election results][8]
使用 Matplotlib 需要 16 行代码,图柱的位置需要自己计算。
使用 Altair 绘制相似的图,代码如下:
```
    import altair as alt
    chart = alt.Chart(df).mark_bar().encode(
        x='party',
        y='seats',
        column='year',
        color='party',
    )
    chart.save('altair-elections.html')
```
真是简洁多了!与 [Seaborn][9] 类似Altair 所用数据的组织形式是每个变量一列(即 [数据列][10] )。这种方式下可以将每个变量映射到图的一个属性上 —— Altair 称之为“通道”。在上例中,我们期望每个 “党派” 在 `x` 轴上显示为一组图柱, 其 “席位” 显示在 `y` 轴,且将图柱按照 “年份” 分开为 “列”。我们还想根据 “党派” 给图柱使用不同的 “颜色”。用语言表述需求的话就是上面这个样子,而这也正是代码所要表述的!
现在把图画出来:
![Altair plot with default styling][11]
### 调整样式
这和我们期待的效果有点接近了。与 Matplotlib 方案相比,主要区别在于 Altair 方案中,每个 `year` 组显示的时候,内部之间都有个小空白 —— 这不是问题,这只是 Altair 多柱状图显示的一个特性。
所以说呢,还需要对显示样式再做一些改进。
#### 非整形数据
两个不是整数的年份名称(`Feb 1974` 和 `Oct 1974`)显示为 `NaN` 了。这可以通过将年份数值 `year` 转换为字符串来解决:
```
    df['year'] = df['year'].astype(str)
```
#### 指定数据排序方法
还需要让 Altair 知道如何对数据进行排序。Altair 允许通过传给它一个 `Column` 对象,来设定 `Column` 通道的更多细节。现在让 Altair 按照数据在数据集中出现的顺序排列:
```
    chart = alt.Chart(df).mark_bar().encode(
        # ...
        column=alt.Column('year', sort=list(df['year']), title=None),
        # ...
    )
```
#### 移除坐标轴标签
我们通过设置 `title=None` 移除了图顶的 "year" 标签。下面再一处每列数据的 "party" 标签:
```
    chart = alt.Chart(df).mark_bar().encode(
        x=alt.X('party', title=None),
        # ...
    )
```
#### 指定颜色图
最后我们还想自己指定图柱的颜色。Altair 允许建立 `domain` 中数值与 `range` 中颜色的映射来实现所需功能,太贴心了:
```
    cmap = {
        'Conservative': '#0343df',
        'Labour': '#e50000',
        'Liberal': '#ffff14',
        'Others': '#929591',
    }
    chart = alt.Chart(df).mark_bar().encode(
        # ...
        color=alt.Color('party', scale=alt.Scale(domain=list(cmap.keys()), range=list(cmap.values())))
    )
```
#### 样式调整后的最终代码
应用上述样式调整之后,代码看起来不那么悦目了,但我们仍然是用声明的方式实现的,这正是 Altair 如此有弹性的原因所在。实现过程中,仍然是使用的异于显示数据的独立变量来分离图中不同属性的,而不是像在 Matplotlib 中那样直接对显示数据做复杂的操作。唯一的不同是,我们的变量名字封装在类似 `alt.X()` 的对象中,从而实现对显示效果的控制:
```
    import altair as alt
    from votes import long as df
    cmap = {
        'Conservative': '#0343df',
        'Labour': '#e50000',
        'Liberal': '#ffff14',
        'Others': '#929591',
    }
    df['year'] = df['year'].astype(str)
    # We're still assigning, e.g. 'party' to x, but now we've wrapped it
    # in alt.X in order to specify its styling
    chart = alt.Chart(df).mark_bar().encode(
        x=alt.X('party', title=None),
        y='seats',
        column=alt.Column('year', sort=list(df['year']), title=None),
        color=alt.Color('party', scale=alt.Scale(domain=list(cmap.keys()), range=list(cmap.values())))
    )
    chart.save('altair-elections.html')
```
现在与 Matplotlib 方案扯平了,代码数量达到了 16 行!
下图是使用我们的样式调整方案之后的 Altair 效果图:
![The Altair plot with our custom styling][12]
### 结论
尽管在代码数量上,使用 Altair 绘图没有表现出优势但它的声明式绘图语言使得对图层的操控更为精密这是我比较欣赏的。Altair 还提供了清晰而独立的方式来调校显示样式,这使得 相关代码与绘图的代码块分离开来。Altair 确实是使用 Python 绘图时又一个很棒的工具库。
本文首次发布于 [这里][13],蒙允编辑后再次发布。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/6/altair-python
作者:[Shaun Taylor-Morgan][a]
选题:[lujun9972][b]
译者:[silentdawn-zz](https://github.com/silentdawn-zz)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/shaun-taylor-morgan
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen)
[2]: https://linux.cn/article-12327-1.html
[3]: https://vega.github.io/vega/
[4]: https://opensource.com/article/20/4/install-python-linux
[5]: https://opensource.com/article/19/5/python-3-default-mac
[6]: https://opensource.com/article/19/8/how-install-python-windows
[7]: https://opensource.com/article/20/5/matplotlib-python
[8]: https://opensource.com/sites/default/files/uploads/matplotlib_1_1.png (Matplotlib UK election results)
[9]: https://anvil.works/blog/plotting-in-seaborn
[10]: https://anvil.works/blog/tidy-data
[11]: https://opensource.com/sites/default/files/uploads/altair-first-try.png (Altair plot with default styling)
[12]: https://opensource.com/sites/default/files/uploads/altair_3.png (The Altair plot with our custom styling.)
[13]: https://anvil.works/blog/plotting-in-altair

View File

@ -0,0 +1,254 @@
[#]: collector: (lujun9972)
[#]: translator: (silentdawn-zz)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12474-1.html)
[#]: subject: (Never forget your password with this Python encryption algorithm)
[#]: via: (https://opensource.com/article/20/6/python-passwords)
[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
国王的秘密:如何保护你的主密码
======
> 这种使用 Python 和 Shamir 秘密共享的独特算法可以保护你的主密码,可以有效避免黑客窃取和自己不经意忘记引发的风险和不便。
![](https://img.linux.net.cn/data/attachment/album/202008/01/105831kzxididbld8kdhdb.jpg)
很多人使用密码管理器来保密存储自己在用的各种密码。密码管理器的关键环节之一是主密码,主密码保护着所有其它密码。这种情况下,主密码本身就是风险所在。任何知道你的主密码的人,都可以视你的密码保护若无物,畅行无阻。自然而然,为了保证主密码的安全性,你会选用很难想到的密码,把它牢记在脑子里,并做[所有其他][2]你应该做的事情。
但是万一主密码泄露了或者忘记了,后果是什么?也许你去了个心仪的岛上旅行上个把月,没有现代技术覆盖,在开心戏水之后享用美味菠萝的时刻,突然记不清自己的密码是什么了。是“山巅一寺一壶酒”?还是“一去二三里,烟村四五家”?反正当时选密码的时候感觉浑身都是机灵,现在则后悔当初何必作茧自缚。
![XKCD comic on password strength][3]
*[XKCD][4], [CC BY-NC 2.5][5]*
当然,你不会把自己的主密码告诉其它任何人,因为这是密码管理的首要原则。有没有其它变通的办法,免除这种难以承受的密码之重?
试试 <ruby>[Shamir 秘密共享算法][6]<rt>Shamir's Secret Sharing</rt></ruby>,这是一种可以将保密内容进行分块保存,且只能将片段拼合才能恢复保密内容的算法。
先分别通过一个古代的和一个现代的故事,看看 Shamir 秘密共享算法究竟是怎么回事吧。
这些故事的隐含前提是你对密码学有起码的了解,必要的话,你可以先温习一下 [密码学与公钥基础设施引论][7].
### 一个古代关于加解密的故事
古代某国,国王有个大秘密,很大很大的秘密:
```
def int_from_bytes(s):
    acc = 0
    for b in s:
        acc = acc * 256
        acc += b
    return acc
secret = int_from_bytes("terrible secret".encode("utf-8"))
```
大到连他自己的孩子都不能轻易信任。他有五个子女,但他知道前路危机重重。他的孩子需要在他百年之后用这个秘密来保卫国家,而国王又不能忍受自己的孩子在他们还记得自己的时候就知道这些秘密,尤其是这种状态可能要持续几十年。
所以,国王动用大力魔术,将这个秘密分为了五个部分。他知道,可能有一两个孩子不会遵从他的遗嘱,但绝对不会同时有三个或三个以上会这样:
```
from mod import Mod
from os import urandom
```
国王精通 [有限域][8] 和 *随机* 魔法,当然,对他来说,使用巨蟒分割这个秘密也是小菜一碟。
第一步是选择一个大质数——第 13 个 [梅森质数][9]`2**521 - 1`),他让人把这个数铸造在巨鼎上,摆放在大殿上:
```
P = 2**521 - 1
```
但这不是要保密的秘密:这只是 *公开数据*
国王知道,如果 `P` 是一个质数,用 `P` 对数字取模,就形成了一个数学 [场][10]:在场中可以自由进行加、减、乘、除运算。当然,做除法运算时,除数不能为 0。
国王日理万机,方便起见,他在做模运算时使用了 PyPI 中的 [mod][11] 模块,这个模块实现了各种模数运算算法。
他确认过,自己的秘密比 `P` 要短:
```
secret < P
```
```
TRUE
```
将秘密转换为 `P` 的模,`mod P`
```
secret = mod.Mod(secret, P)
```
为了使任意三个孩子掌握的片段就可以重建这个秘密,他还得生成另外两个部分,并混杂到一起:
```
polynomial = [secret]
for i in range(2):
polynomial.append(Mod(int_from_bytes(urandom(16)), P))
len(polynomial)
```
```
3
```
下一步就是在随机选择的点上计算某 [多项式][12] 的值,即计算 `polynomial[0] + polynomial[1]*x + polynomial[2]*x**2 ...`
虽然有第三方模块可以计算多项式的值,但那并不是针对有限域内的运算的,所以,国王还得亲自操刀,写出计算多项式的代码:
```
def evaluate(coefficients, x):
    acc = 0
    power = 1
    for c in coefficients:
        acc += c * power
        power *= x
    return acc
```
再下一步,国王选择五个不同的点,计算多项式的值,并分别交给五个孩子,让他们各自保存一份:
```
shards = {}
for i in range(5):
    x = Mod(int_from_bytes(urandom(16)), P)
    y = evaluate(polynomial, x)
    shards[i] = (x, y)
```
正如国王所虑,不是每个孩子都正直守信。其中有两个孩子,在他尸骨未寒的时候,就想从自己掌握的秘密片段中窥出些什么,但穷极所能,终无所获。另外三个孩子听说了这个事,合力将这两人永远驱逐:
```
del shards[2]
del shards[3]
```
二十年弹指一挥间,奉先王遗命,三个孩子将合力恢复出先王的大秘密。他们将各自的秘密片段拼合在一起:
```
retrieved = list(shards.values())
```
然后是 40 天没日没夜的苦干。这是个大工程,他们虽然都懂些 Python但都不如前国王精通。
最终,揭示秘密的时刻到了。
用于反算秘密的代码基于 [拉格朗日差值][13],它利用多项式在 `n` 个非 0 位置的值,来计算其在 `0` 处的值。前面的 `n` 指的是多项式的阶数。这个过程的原理是,可以为一个多项式找到一个显示方程,使其满足:其在 `t[0]` 处的值是 `1`,在 `i` 不为 `0` 的时候,其在 `t[i]` 处的值是 `0`。因多项式值的计算属于线性运算,需要计算 *这些* 多项式各自的值,并使用多项式的值进行插值:
```
from functools import reduce
from operator import mul
def retrieve_original(secrets):
    x_s = [s[0] for s in secrets]
    acc = Mod(0, P)
    for i in range(len(secrets)):
        others = list(x_s)
        cur = others.pop(i)
        factor = Mod(1, P)
        for el in others:
            factor *= el * (el - cur).inverse()
        acc += factor * secrets[i][1]
    return acc
```
这代码是在太复杂了40 天能算出结果已经够快了。雪上加霜的是,他们只能利用五个秘密片段中的三个来完成这个运算,这让他们万分紧张:
```
retrieved_secret = retrieve_original(retrieved)
```
后事如何?
```
retrieved_secret == secret
```
```
TRUE
```
数学这个魔术的优美之处就在于它每一次都是那么靠谱,无一例外。国王的孩子们,曾经的孩童,而今已是壮年,足以理解先王的初衷,并以先王的锦囊妙计保卫了国家,并继之以繁荣昌盛!
### 关于 Shamir 秘密共享算法的现代故事
现代,很多人都对类似的大秘密苦不堪言:密码管理器的主密码!几乎没有谁能有足够信任的人去完全托付自己最深的秘密,好消息是,找到至少有三个不会串通起来搞鬼的五人组不是个太困难的事。
同样是在现代,比较幸运的是,我们不必再像国王那样自己动手分割要守护的秘密。拜现代 *开源* 技术所赐,这都可以使用现成的软件完成。
假设你有五个不敢完全信任,但还可以有点信任的人:张三、李四、王五、赵六和钱大麻子。
安装并运行 `ssss` 分割密钥:
```
$ echo 'long legs travel fast' | ssss-split -t 3 -n 5
Generating shares using a (3,5) scheme with dynamic security level.
Enter the secret, at most 128 ASCII characters: Using a 168 bit security level.
1-797842b76d80771f04972feb31c66f3927e7183609
2-947925f2fbc23dc9bca950ef613da7a4e42dc1c296
3-14647bdfc4e6596e0dbb0aa6ab839b195c9d15906d
4-97c77a805cd3d3a30bff7841f3158ea841cd41a611
5-17da24ad63f7b704baed220839abb215f97d95f4f8
```
这确实是个非常牛的主密码:`long legs travel fast`,绝不能把它完整的托付给任何人!那就把五个片段分别交给还比较可靠的伙伴,张三、李四、王五、赵六和钱大麻子。
* 把 `1` 给张三。
* 把 `2` 给李四。
* 把 `3` 给王五。
* 把 `4` 给赵六。
* 把 `5` 给钱大麻子。
然后,你开启你的惬意之旅,整整一个月,流连于海边温暖的沙滩,整整一个月,没碰过任何电子设备。没用多久,把自己的主密码忘到了九霄云外。
李四和王五也在和你一起旅行,你托付给他们保管的密钥片段保存的好好的,在他们各自的密码管理器中,但不幸的是,他们和你一样,也忘了自己的 *主密码*
没关系。
联系张三,他保管的密钥片段是 `1-797842b76d80771f04972feb31c66f3927e7183609`;赵六,一直替你的班,很高兴你能尽快重返岗位,把自己掌握的片段给了你,`4-97c77a805cd3d3a30bff7841f3158ea841cd41a611`;钱大麻子,收到你给的跑腿费才将自己保管的片段翻出来发给你,`5-17da24ad63f7b704baed220839abb215f97d95f4f8`。
有了这三个密钥片段,运行:
```
$ ssss-combine -t 3
Enter 3 shares separated by newlines:
Share [1/3]: 1-797842b76d80771f04972feb31c66f3927e7183609
Share [2/3]: 4-97c77a805cd3d3a30bff7841f3158ea841cd41a611
Share [3/3]: 5-17da24ad63f7b704baed220839abb215f97d95f4f8
Resulting secret: long legs travel fast
```
就这么简单,有了 *开源* 技术加持,你也可以活的像国王一样滋润!
### 自己的安全不是自己一个人的事
密码管理是当今网络生活必备技能,当然要选择复杂的密码,来保证安全性,但这不是全部。来用 Shamir 秘密共享算法,和他人共同安全的存储你的密码吧。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/6/python-passwords
作者:[Moshe Zadka][a]
选题:[lujun9972][b]
译者:[silentdawn-zz](https://github.com/silentdawn-zz)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/moshez
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/search_find_code_python_programming.png?itok=ynSL8XRV (Searching for code)
[2]: https://monitor.firefox.com/security-tips
[3]: https://opensource.com/sites/default/files/uploads/password_strength-xkcd.png (XKCD comic on password strength)
[4]: https://imgs.xkcd.com/comics/password_strength.png
[5]: https://creativecommons.org/licenses/by-nc/2.5/
[6]: https://en.wikipedia.org/wiki/Secret_sharing#Shamir's_scheme
[7]: https://opensource.com/article/18/5/cryptography-pki
[8]: https://en.wikipedia.org/wiki/Finite_field
[9]: https://en.wikipedia.org/wiki/Mersenne_prime
[10]: https://en.wikipedia.org/wiki/Field_(mathematics)
[11]: https://pypi.org/project/mod/
[12]: https://en.wikipedia.org/wiki/Polynomial
[13]: https://www.math.usm.edu/lambers/mat772/fall10/lecture5.pdf

View File

@ -0,0 +1,76 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12505-1.html)
[#]: subject: (3 reasons to contribute to open source now)
[#]: via: (https://opensource.com/article/20/6/why-contribute-open-source)
[#]: author: (Jason Blais https://opensource.com/users/jasonblais)
现在贡献开源的 3 个理由
======
> 现在比以往任何时候都更是为开源做出贡献的理想时机。下面是为什么。
![](https://img.linux.net.cn/data/attachment/album/202008/11/101413or3y9jsjsu0999s4.jpg)
开源软件已经[遍及世界][2]。从 Linux 和 MySQL 的早期开始,开源就以前所未有的方式推动创新,仅 GitHub 上就有 [180,000 个公共仓库][3]。
对于尚未进入开源世界的那些人,下面是如今天开始的三个原因。
### 建立你作为开发人员的信心
如果你还很年轻,在职业生涯初期,甚至只是在学习一种新的编程语言,那么开源是入门的最佳方法。
通过参与一个开源项目,你会立即收到有关你的开发和编程技能的反馈。你可能会获得有关如何选择函数名称、条件逻辑的使用方式或如何使用不了解的 goroutine 来加快程序执行速度的建议。这是你在学习新东西时获得的宝贵反馈。
此外,随着你创建更多的拉取请求并应用从先前提交的内容中学到的知识,你将开始学习如何编写良好的代码并[提交优秀的拉取请求进行代码审查][4]。最后,许多开源项目提供指导计划,以帮助指导你完成前几个贡献。这是一个非常友好、安全的环境,可树立你作为开发人员的信心。
有关例子故事,请阅读 [Allan Guwatudde 作为一名自学开发者在开源方面的经验][5]这篇文章。
### 丰富你的简历
即使你是一位经验丰富的开发人员,你也可能希望丰富自己的简历,以帮助职业发展和未来的寻找工作。也许你有兴趣探索新的前沿框架或新的编程模块,而你却没有机会在工作中用到。
你可以通过报名一个课程或在日常工作中找到一个方式引入这些概念来获得经验。但是,当这些选项不可用(或不希望使用)时,开源将提供绝佳的机会!除了建立技能和提高信心之外,所有开源贡献都是公开的,它们可以证明你已掌握的技能和已完成的项目。实际上,你的开源方面的个人资料本身可以为你提供强大的作品集,从而使你与其他应聘者脱颖而出。
此外,许多开源项目,例如 [Mattermost][6],允许你在 LinkedIn 上添加自己为贡献者,以直接提升自己的专业形象。
[阅读 Siyuan Liu 的旅程][7]这篇文章,了解如何从第一次开源贡献到两次成为 Mattermost 项目 MVP。
### 建立你的专业网络
建立强大的专业网络可以帮助你实现职业目标,了解有关你自己或相邻领域的更多信息,并有助于寻找工作。为开源做贡献是建立该网络的绝佳方法。你加入了一个由成百上千的贡献者组成的温馨社区,在开源空间中与志趣相投的开发人员进行互动,并一路建立联系。你甚至可能会被介绍给行业中的关键人物,例如知名的开源工具的维护者。这样的关系可以变成改变职业生涯的关系。
最后,为开源项目做贡献甚至可以让你找到工作!例如,[Mattermost][8] 已经从它的开源社区聘请了一些贡献者,全职在工程团队中工作。
### 从今天开始为开源做贡献
开源让你能够树立开发者的信心,建立简历和建立专业网络。而且,无论你的贡献大小,它都会对开源项目的未来产生直接影响。因此,许多项目都会向贡献者发放礼物以表示感谢(例如,[为所有首次贡献者送上一个定制的杯子][9])。
准备开始进入开源了吗?查看[这些开源项目][10]来进行首次开源贡献,或了解[如何为 Mattermost 做贡献][11]。
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/6/why-contribute-open-source
作者:[Jason Blais][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/jasonblais
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating)
[2]: https://techcrunch.com/2019/01/12/how-open-source-software-took-over-the-world/
[3]: https://github.com/search?q=stars%3A%3E100&s=stars&type=Repositories
[4]: https://mattermost.com/blog/submitting-great-prs/
[5]: https://mattermost.com/blog/building-confidence-and-gaining-experience-with-good-open-source-projects/
[6]: https://docs.mattermost.com/overview/faq.html#can-contributors-add-themselves-to-the-mattermost-company-page-on-linkedin
[7]: https://mattermost.com/blog/open-source-contributor-journey-with-mattermost/
[8]: https://mattermost.com/careers/
[9]: https://forum.mattermost.org/t/limited-edition-mattermost-mugs/143
[10]: https://firstcontributions.github.io/
[11]: http://mattermost.com/contribute

View File

@ -0,0 +1,142 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12523-1.html)
[#]: subject: (Perform Common PDF Editing Tasks Like Merge, Split, Rotate With Free and Open Source PDF Mix Tool)
[#]: via: (https://itsfoss.com/pdf-mix-tool/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
使用 PDF Mix Tool 执行常见的 PDF 编辑任务
======
> PDF Mix Tool 是一个简单、轻巧的开源 PDF 编辑应用,可让你从 PDF 中提取页面、合并两个 PDF、从 PDF 中删除页面等。
![](https://img.linux.net.cn/data/attachment/album/202008/16/203411puozfr91f1pmzg9z.jpg)
### PDF Mix Tool一个简单的开源 PDF 编辑工具
![][1]
有[几个可以在 Linux 中使用的 PDF 编辑器][2],我通常将它们分为两类:
* 可让你编辑内容(注释、高亮、更改文本、添加/删除图像等)的 PDF 编辑器,
* 可让你通过合并、分割、提取页面等来修改文件的 PDF 编辑器。
[PDF Mix Tool][3] 属于第二类。它是用 C++ 和 Qt5 编写的开源软件。它可让你合并两个或更多 PDF 文件,并为每个文件指定页面,还有旋转页面、添加空白页、删除页面以及从 PDF 文件提取页面。
在本周的开源软件亮点中,让我们看一下使用 PDF Mix Tool。
### 使用 PDF Mix Tool 在 Linux 中编辑 PDF
![][4]
PDF Mix Tool 并没有很多功能,但是有一些非常重要的功能。
#### 合并 PDF 文件
![][5]
你可以轻松合并多个 PDF 文件,同时指定确切的页面。它让你能够调整页面数、旋转,还能使用 “<ruby>交替混合<rt>Alternate mix</rt></ruby>” 反转页面顺序合并。
![][6]
你只需要单击 “<ruby>添加 PDF 文件<rt>Add PDF File</rt></ruby>” 添加文件,然后使用可用的选项对其进行编辑(如上图所示),最后生成编辑的 PDF。
#### 旋转页面
你可以在合并多个文件或仅对单个 PDF 文件进行操作时旋转 PDF 文件的页面。
对于合并文件,你可以参考上面的截图。但是当你选择一个文件时,它看上去像这样:
![][7]
你有多种选择,但是要旋转页面,需要选择 “<ruby>编辑页面布局<rt>Edit page layout</rt></ruby>” 选项,如上截图所示。
#### 添加或删除页面
要从其他 PDF 文件添加新页面,最好利用此选项。
但是,如果要添加空白页,你可以选择一个文件进行添加。不只是添加空白页面,还可以删除特定页面。下面的截图圈出了高亮选项:
![][8]
#### 从 PDF 文件提取页面
![][9]
除了所有其他选项之外,你还可以从给定的 PDF 文件中提取特定页面(或全部)。你还可以为所有提取的页面生成一个新的 PDF 文件,或者为提取的每个页面制作单独的 PDF 文件。在许多场景中,它应该派上用场。
#### 其他功能
利用上面所有功能,你可以生成自己选择的全新 PDF颠倒顺序、提取页面、制作单独的 PDF 文件等等。
它不会减小 PDF 文件的大小。你必须使用其他工具[在 Linux 中压缩 PDF 文件][10]。
因此,当你组合使用可用选项时,它是功能丰富的工具。
### 在 Linux 上安装 PDF Mix Tool
![PDF Mix Tool in Ubuntu Software Center][11]
PDF Mix Tool 存在于 Snap 和 [Flatpak 软件包][12]中。这意味着如果发行版支持这任意一种,你都可以在软件管理器中找到它。
或者,如果你[启用了 Snap 软件包支持][13],那么可以使用以下命令进行安装:
```
sudo snap install pdfmixtool
```
如果你想[使用 Flatpak][14],那么使用:
```
flatpak install flathub eu.scarpetta.PDFMixTool
```
如果你使用的是 Arch Linux那么可以从[社区仓库][15]中获取。
```
sudo pacman -S pdfmixtool
```
你也可以选择查看它的 [GitLab 页面][16]获取源码。
- [下载 PDF Mix Tool 源码][17]
### 总结
它可能不是功能最丰富的 PDF 编辑工具,但考虑到它是轻量级的开源工具,因此它是已安装的应用中非常有用的。过去我们也介绍过类似的工具 [PDF Arranger][18]。你可能会想了解一下。
你如何看待它?你有尝试过么?在下面的评论中让我知道你的想法。
--------------------------------------------------------------------------------
via: https://itsfoss.com/pdf-mix-tool/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool.png?ssl=1
[2]: https://itsfoss.com/pdf-editors-linux/
[3]: https://scarpetta.eu/pdfmixtool/
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool-merge.png?ssl=1
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool-edit.png?ssl=1
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool-merge-edit.png?ssl=1
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool-layout.png?ssl=1
[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool-add-delete.png?ssl=1
[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool-extract.png?ssl=1
[10]: https://itsfoss.com/compress-pdf-linux/
[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/pdf-mix-tool-ubuntu.png?ssl=1
[12]: https://flathub.org/apps/details/eu.scarpetta.PDFMixTool
[13]: https://itsfoss.com/install-snap-linux/
[14]: https://itsfoss.com/flatpak-guide/
[15]: https://www.archlinux.org/packages/community/x86_64/pdfmixtool/
[16]: https://gitlab.com/scarpetta/pdfmixtool
[17]: https://www.scarpetta.eu/pdfmixtool/
[18]: https://itsfoss.com/pdfarranger-app/

View File

@ -0,0 +1,131 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12484-1.html)
[#]: subject: (Jitsi Meet: A Free & Open Source Video Conferencing Solution That is Also Free to Use Without Any Set Up)
[#]: via: (https://itsfoss.com/jitsi-meet/)
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
Jitsi Meet自由开源的视频会议解决方案无需设置即可免费使用
======
> Jitsi Meet 是一个开源视频会议服务,你可以免费使用它来组织在线课程、会议和聚会。你也可以在自己的服务器上托管 Jitsi。
在 COVID-19 大流行期间,远程工作趋势显著增长。无论你是否喜欢,视频会议对于个人和企业都是一个很好的解决方案。
在过去的几个月中,非常流行的视频会议服务之一就是 Zoom。但是[关于 Zoom 视频通话][1]存在很多安全和隐私问题。
因此,选择一个安全且易于使用的视频会议应用来完成工作是很重要的。我敢肯定有很多选择,但是在这里,让我们看一下开源选项 [Jitsi Meet][2]。
### Jitsi Meet免费使用的开源视频会议服务
![][3]
Jitsi Meet 是开源语音、视频会议和即时消息服务 [Jitsi][4] 集合的一部分。
通过 Jitsi Meet你可以即刻主持群组视频通话即视频会议你甚至都不需要建立帐户。
对于桌面端,它是基于浏览器的,但它以 AppImage 的形式为 Linux 提供了一个基于 Electron 的桌面应用。它也可以用在 Windows 和 macOS 上。
对于智能手机,它提供了 iOS 和 Android 应用,你可以分别从 App Store 和 Play Store 进行安装。除了这些,你还可以在开源 Android 应用商店 [F-Droid][5] 中找到它。
如果你想更进一步,你可以在你的服务器上部署 Jitsi Meet。对于那些不想使用第三方服务器的企业来说这是理想的选择即使该服务器来自软件开发商。
### Jitsi Meet 的功能
![][6]
Jitsi Meet 简单但功能丰富。这是你将获得的功能:
* 不需要用户注册
* 使用 Etherpad 共同编辑文档
* 能够自己部署
* 支持集成 Slack 和 Rocket.chat
* 如果需要,提供密码保护
* 端到端加密beta 版)
* 背景模糊beta 版)
* 录音选项
* 直播流支持
* YouTube 视频分享
* 查看用户的网络状态
* 集成 Google 和 Microsoft 日历
* 聊天功能
* 屏幕共享
* 支持国际连接拨入
* 你可以稍后继续视频通话,而无需会议代码
* 低带宽模式选项
* Jitsi 可选的桌面版本
![][7]
出于显而易见的原因,你在移动应用上只能找到较少的功能。
请注意,[端到端加密仍处于 beta 阶段][8]。但是即使没有它Jitsi Meet 也应该是一个隐私友好且安全的视频会议解决方案。
在移动设备上,我只希望它有屏幕共享功能。除此之外,其他所有功能都很好。
### 如何使用 Jitsi Meet
![][9]
要使它在 Linux 上运行,你不需要做任何其他事情。你只需要前往它的[官方 Jitsi Meet 实例][2],然后输入会议名称即可创建或加入。
如果您使用的是基于 Electron的应用程序则完全一样。 使用桌面应用程序时的外观如下:
![](https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-meet-electron.png?w=800&ssl=1)
如你在上面的截图中所见,你还可以找到你最近使用的会议室的列表,这样就不必再次输入或创建会议室。
![][10]
如果你要创建它,那么最好使用唯一的名称,并且如果你不需要其他任何人意外加入,那么还应为其添加密码保护。
![][11]
如果你要参加其他人的会议,只需询问会议名称或会议链接即可使用台式机或智能手机轻松加入。
除了少一些功能,它与桌面端的工作方式相同。我已经使用了一段时间,并且还鼓励和培训了我父亲的单位(我们的附近学校)使用 Jitsi Meet 主持在线课程。
即使有最多 75 名参与者的限制,它的表现也很好,而且工作良好。
[Jitsi Meet][12]
### 总结
如果你希望托管自己的 Jitsi 实例,建议你遵循它的[官方自托管指南][13]来启动并运行它。你还可以在[它的 GitHub 页面中找到实例列表][14]。
Jitsi Meet 是个了不起的开源视频会议应用。它是 Zoom 和其他此类视频通话服务的一种隐私保护替代方案。
我还建议查看 [NextCloud它是 MS Office 365 的开源替代方案][15]。
你如何看待 Jitsi Meet你尝试过了吗你最喜欢的视频会议工具是什么
--------------------------------------------------------------------------------
via: https://itsfoss.com/jitsi-meet/
作者:[Ankush Das][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://itsfoss.com/author/ankush/
[b]: https://github.com/lujun9972
[1]: https://www.tomsguide.com/news/zoom-security-privacy-woes
[2]: https://meet.jit.si/
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-meet-screenshot.png?ssl=1
[4]: https://jitsi.org/
[5]: https://f-droid.org/en/packages/org.jitsi.meet/
[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-meet-smartphones.jpg?ssl=1
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-options-desktop.png?ssl=1
[8]: https://jitsi.org/blog/e2ee/
[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-meet-use.resized.png?ssl=1
[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-meet-browser-screenshot.png?ssl=1
[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/06/jitsi-meet-password.png?ssl=1
[12]: https://meet.jit.si
[13]: https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-quickstart
[14]: https://github.com/jitsi/jitsi-meet/wiki/Jitsi-Meet-Instances
[15]: https://itsfoss.com/nextcloud/

View File

@ -0,0 +1,200 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12530-1.html)
[#]: subject: (Set up Vim as your Rust IDE)
[#]: via: (https://opensource.com/article/20/7/vim-rust-ide)
[#]: author: (Daniel Oh https://opensource.com/users/daniel-oh)
将 Vim 设置为 Rust IDE
======
> Vim 编辑器是很好的 Rust 应用开发环境。
![Ferris the crab under the sea, unofficial logo for Rust programming language][1]
[Rust][2] 语言旨在以 C++ 开发人员熟悉的方式实现具有安全并发性和高内存性能的系统编程。它也是 [Stack Overflow 的 2019 年开发人员调查][3]中最受欢迎的编程语言之一。
文本编辑器和[集成开发环境IDE工具][4]使编写 Rust 代码更加轻松快捷。有很多编辑器可供选择,但是我相信 [Vim 编辑器][5]非常适合作为 Rust IDE。在本文中我将说明如何为 Rust 应用开发设置 Vim。
### 安装 Vim
Vim 是 Linux 和 Unix 中最常用的命令行文本编辑器之一。最新版本(在编写本文时)是 [8.2][6],它在使用方式上提供了前所未有的灵活性。
[Vim 的下载页面][7]提供了多种二进制或软件包形式安装。例如,如果使用 macOS那么可以安装 [MacVim][8] 项目,然后通过[安装 Vim 插件][9] 扩展 Vim 的功能。
要设置 Rust 进行开发,请下载 [Rustup][10],这是一个方便的 Rust 安装器工具,并在你的终端上运行以下命令(如果你使用 macOS、Linux 或任何其他类 Unix 系统):
```
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
在提示中选择安装选项。然后,你将看到如下输出:
```
stable installed - rustc 1.43.1 (8d69840ab 2020-05-04)
Rust is installed now. Great!
To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done
automatically.
To configure your current shell run source $HOME/.cargo/env
```
### 语法高亮
Vim 能让你通过 `.vimrc` 文件配置你的运行时环境。要启用语法高亮,请打开 `.vimrc` 文件(如果不存在就创建一个):
```
$ vim ~/.vimrc
```
`.vimrc` 中添加以下内容并保存:
```
filetype plugin indent on
syntax on
```
第一行同时打开检测、插件和缩进配置。第二行启用语法高亮。这些功能将帮助你在 Rust 中管理开发流程。在 Vim 的[帮助文件][11]中了解更多信息。
### 在 Vim 中创建一个 Rust 应用
要使用 Vim 创建一个新的 Rust HelloWorld 应用(`hello.rs`),请输入:
```
$ vim hello.rs
```
输入以下 Rust 代码在控制台中打印 `Hello World!`
```
fn main() {
  println!("Hello World");
}
```
它看起来应该像这样:
![Rust code with syntax highlighting][12]
没有语法高亮的样子如下:
![Rust code without syntax highlighting][14]
你是否注意到 Vim 自动缩进和组织代码?那是因为你在 `.vimrc` 文件中输入了第一行。
很好!接下来,你将使用 Rust 的包管理器 [Cargo][15] 构建此应用。
### Cargo 集成
Cargo 使创建应用更加容易。要查看操作方法,请创建一个基于 Cargo 的 HelloWorld 应用。如果你尚未在 Linux 或 macOS 系统上安装 Cargo请输入
```
$ curl https://sh.rustup.rs -sSf | sh
```
然后使用 Cargo 创建包:
```
$ cargo new my_hello_world
```
如果查看目录结构,你会看到 Cargo 自动生成一些源码和目录。如果你安装了 `tree`,请运行它查看目录结构:
```
$ tree my_hello_world
my_hello_world
├── Cargo.toml
└── src
    └── main.rs
1 directory, 2 files
```
在 Vim 中打开 `main.rs` 源码文件:
```
$ vim my_hello_world/src/main.rs
```
它与你在上面手动创建的 HelloWorld 示例中的代码相同。用 `Rust with Vim` 代替 `World`
```
 fn main() {
      println!("Hello, Rust with Vim");
 }
```
使用 `:wq` 保存更改并退出 Vim。
### 编译你的应用
现在你可以使用 `cargo build` 编译你的第一个 Rust 应用:
```
$ cd my_hello_world
$ cargo build
```
你的终端输出将类似于以下内容:
```
   Compiling my_hello_world v0.1.0 (/Users/danieloh/cloud-native-app-dev/rust/my_hello_world)
    Finished dev [unoptimized + debuginfo] target(s) in 0.60s
```
你可能会看到一条警告消息,因为你重用了示例包名 `my_hello_world`,但现在可以忽略它。
运行应用:
```
$ target/debug/my_hello_world
Hello, Rust with Vim!
```
你也可以使用 `cargo run` 一次构建和运行应用:
```
$ cargo run
 
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/my_hello_world`
Hello, Rust with Vim!!
```
恭喜!你在本地的 Vim 编辑器中设置了 Rust IDE开发了第一个 Rust 应用,并使用 Cargo 包管理器工具构建、测试和运行了它。如果你想学习其他 Cargo 命令,请运行 `cargo help`
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/vim-rust-ide
作者:[Daniel Oh][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/daniel-oh
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rust_programming_crab_sea.png?itok=2eWLz8A5 (Ferris the crab under the sea, unofficial logo for Rust programming language)
[2]: https://www.rust-lang.org/
[3]: https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages
[4]: https://en.wikipedia.org/wiki/Integrated_development_environment
[5]: https://opensource.com/resources/what-vim
[6]: https://github.com/vim/vim
[7]: https://www.vim.org/download.php
[8]: https://github.com/macvim-dev/macvim
[9]: https://opensource.com/article/20/2/how-install-vim-plugins
[10]: https://rustup.rs/
[11]: http://vimdoc.sourceforge.net/htmldoc/filetype.html#:filetype-overview
[12]: https://opensource.com/sites/default/files/uploads/rust_helloworld.png (Rust code with syntax highlighting)
[13]: https://creativecommons.org/licenses/by-sa/4.0/
[14]: https://opensource.com/sites/default/files/uploads/rust_helloworld_no-syntax.png (Rust code without syntax highlighting)
[15]: https://opensource.com/article/20/3/rust-cargo

View File

@ -0,0 +1,171 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12483-1.html)
[#]: subject: (Use DNS over TLS)
[#]: via: (https://fedoramagazine.org/use-dns-over-tls/)
[#]: author: (Thomas Bianchi https://fedoramagazine.org/author/thobianchi/)
使用 DNS over TLS
======
![][1]
现代计算机用来在互联网种查找资源的[域名系统DNS][2] 是在 [35 年前][3]设计的,没有考虑用户隐私。它会面临安全风险和攻击,例如 [DNS 劫持][4]。它还能让 [ISP][5] 拦截查询。
幸运的是,现在有 [DNS over TLS][6] 和 [DNSSEC][7] 两种技术。DNS over TLS 和 DNSSEC 允许创建从计算机到它配置的 DNS 服务器之间的安全且加密的端到端隧道。在 Fedora 上,部署这些技术的步骤很容易,并且所有必要的工具也很容易获得。
本指南将演示如何使用 `systemd-resolved` 在 Fedora 上配置 DNS over TLS。有关 `systemd-resolved` 服务的更多信息,请参见[文档][8]。
### 步骤 1设置 systemd-resolved
类似于下面所示修改 `/etc/systemd/resolved.conf`。确保启用 DNS over TLS 并配置要使用的 DNS 服务器的 IP 地址。
```
$ cat /etc/systemd/resolved.conf
[Resolve]
DNS=1.1.1.1 9.9.9.9
DNSOverTLS=yes
DNSSEC=yes
FallbackDNS=8.8.8.8 1.0.0.1 8.8.4.4
#Domains=~.
#LLMNR=yes
#MulticastDNS=yes
#Cache=yes
#DNSStubListener=yes
#ReadEtcHosts=yes
```
关于选项的简要说明:
* `DNS`:以空格分隔的 IPv4 和 IPv6 地址列表,用作系统 DNS 服务器。
* `FallbackDNS`:以空格分隔的 IPv4 和 IPv6 地址列表,用作后备 DNS 服务器。
* `Domains`:在解析单标签主机名时,这些域名用于搜索后缀。 `~.` 代表对于所有域名,优先使用 `DNS=` 定义的系统 DNS 服务器。
* `DNSOverTLS`:如果启用,那么将加密与服务器的所有连接。请注意,此模式要求 DNS 服务器支持 DNS-over-TLS并具有其 IP 的有效证书。
> 注意:上面示例中列出的 DNS 服务器是我个人的选择。你要确定要使用的 DNS 服务器。要注意你要向谁请求 IP。
### 步骤 2告诉 NetworkManager 将信息推给 systemd-resolved
`/etc/NetworkManager/conf.d` 中创建一个名为 `10-dns-systemd-resolved.conf` 的文件。
```
$ cat /etc/NetworkManager/conf.d/10-dns-systemd-resolved.conf
[main]
dns=systemd-resolved
```
上面的设置(`dns=systemd-resolved`)让 `NetworkManager` 将从 DHCP 获得的 DNS 信息推送到 `systemd-resolved` 服务。这将覆盖*步骤 1* 中配置的 DNS 设置。这在受信任的网络中没问题,但是也可以设置为 `dns=none` 从而使用 `/etc/systemd/resolved.conf` 中配置的 DNS 服务器。
### 步骤 3 启动和重启服务
若要使上述步骤中的配置生效,请启动并启用 `systemd-resolved` 服务。然后重启 `NetworkManager` 服务。
注意:在 `NetworkManager` 重启时,连接会中断几秒钟。
```
$ sudo systemctl start systemd-resolved
$ sudo systemctl enable systemd-resolved
$ sudo systemctl restart NetworkManager
```
> 注意目前systemd-resolved 服务默认处于禁用状态,是可选使用的。[有计划][33]在 Fedora 33 中默认启用systemd-resolved。
### 步骤 4检查是否一切正常
现在,你应该在使用 DNS over TLS。检查 DNS 解析状态来确认这一点:
```
$ resolvectl status
MulticastDNS setting: yes
DNSOverTLS setting: yes
DNSSEC setting: yes
DNSSEC supported: yes
Current DNS Server: 1.1.1.1
DNS Servers: 1.1.1.1
9.9.9.9
Fallback DNS Servers: 8.8.8.8
1.0.0.1
8.8.4.4
```
`/etc/resolv.conf` 应该指向 `127.0.0.53`
```
$ cat /etc/resolv.conf
# Generated by NetworkManager
search lan
nameserver 127.0.0.53
```
若要查看 `systemd-resolved` 发送和接收安全查询的地址和端口,请运行:
```
$ sudo ss -lntp | grep '\(State\|:53 \)'
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=10410,fd=18))
```
若要进行安全查询,请运行:
```
$ resolvectl query fedoraproject.org
fedoraproject.org: 8.43.85.67 -- link: wlp58s0
8.43.85.73 -- link: wlp58s0
[..]
-- Information acquired via protocol DNS in 36.3ms.
-- Data is authenticated: yes
```
### 额外步骤 5使用 Wireshark 验证配置
首先,安装并运行 [Wireshark][10]
```
$ sudo dnf install wireshark
$ sudo wireshark
```
它会询问你在哪个设备上捕获数据包。在我这里,因为我使用无线接口,我用的是 `wlp58s0`。在 Wireshark 中设置筛选器,`tcp.port == 853`853 是 DNS over TLS 协议端口)。在捕获 DNS 查询之前,你需要刷新本地 DNS 缓存:
```
$ sudo resolvectl flush-caches
```
现在运行:
```
$ nslookup fedoramagazine.org
```
你应该会看到你的计算机和配置的 DNS 服务器之间的 TLS 加密交换:
![][11]
--------------------------------------------------------------------------------
via: https://fedoramagazine.org/use-dns-over-tls/
作者:[Thomas Bianchi][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://fedoramagazine.org/author/thobianchi/
[b]: https://github.com/lujun9972
[1]: https://fedoramagazine.org/wp-content/uploads/2020/06/use-dns-over-tls-816x345.jpg
[2]: https://en.wikipedia.org/wiki/Domain_Name_System
[3]: https://tools.ietf.org/html/rfc1035
[4]: https://en.wikipedia.org/wiki/DNS_hijacking
[5]: https://en.wikipedia.org/wiki/Internet_service_provider
[6]: https://en.wikipedia.org/wiki/DNS_over_TLS
[7]: https://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions
[8]: https://www.freedesktop.org/wiki/Software/systemd/resolved/
[9]: https://fedoraproject.org/wiki/Changes/systemd-resolved
[10]: https://www.wireshark.org/
[11]: https://fedoramagazine.org/wp-content/uploads/2020/06/1-1024x651.png

View File

@ -0,0 +1,114 @@
[#]: collector: (lujun9972)
[#]: translator: (wxy)
[#]: reviewer: (wxy)
[#]: publisher: (wxy)
[#]: url: (https://linux.cn/article-12536-1.html)
[#]: subject: (4 Mac terminal customizations even a curmudgeon can love)
[#]: via: (https://opensource.com/article/20/7/mac-terminal)
[#]: author: (Katie McLaughlin https://opensource.com/users/glasnt)
凯蒂阿姨的自定义 Mac 终端
======
> 开源意味着我可以在任何终端上找到熟悉的 Linux。
![](https://img.linux.net.cn/data/attachment/album/202008/21/002323xqslvqnnmdz487dq.jpg)
十年前,我开始了我的第一份工作,它要求我使用 Linux 作为我的笔记本电脑的操作系统。如果我愿意的话,我可以使用各种 Linux 发行版,包括 Gentoo但由于我过去曾短暂地使用过Ubuntu所以我选择了 Ubuntu Lucid Lynx 10.04。
我的 [Konsole][2] 终端使用的是 [Zenburn][3] 主题,有一个类似于这样的 Bash 提示符:
```
machinename ~/path/to/folder $
```
现在,我使用 Mac具体来说是 macOS Catalina我使用 [iTerm2][4] 与 [Zenburn 主题][5]zsh 提示符是这样的:
```
machinename ~/path/to/folder
$
```
我想,十年来几乎相同的提示符,我已经赢得了*老古板*的称号,不过这只是标志着,我的喜好和习惯与现在耍酷的孩子们不一样而已。
仿佛是为了证明我的古板观点,我想改变我的终端和我的旧终端一样。在 Mac 上获得一个看起来和感觉像 Lucid Lynx 的设置并不简单,而且我很花了一些时间。
我最近最大的改变是从 Bash 转移到 zsh并迁移了我的 [Bash 魔改][6]。但这只是其中一个重大的转变。我学到了许多新式的经验,现在我把这些经验赠送给你,亲爱的读者。
### Coreutils 对选项的顺序更宽容
从 Ubuntu 转移到 macOS 并没有太大的转变,直到我开始觉得我失去了 Unix 范。我试着运行一些基本的操作,比如删除文件夹,但却被告知我错误地调用了 `rm`
事实证明GNU 风格的实用程序可能看起来 BSD 风格的差不多,但最大的可用性差异之一是*参数顺序*。未命名参数的排列顺序并不一致。例如:`rm`。
下面是我们熟悉的 GNU 风格的删除目录的命令:
```
$ rm path/to/folder -rf
```
这与同一命令的 BSD 风格版本形成鲜明对比:
```
$ rm path/to/folder -rf
rm: path/to/folder: is a directory
rm: -rf: No such file or directory
```
我通过 [Homebrew][8] 安装 [Coreutils][7] 解决了这个问题。这将 GNU 实用程序引入到了 macOS并使我不必为那些已经深深扎根于我的肌肉记忆中的命令记住选项顺序从而对选项顺序更加宽容。
### 强大的 iTerm2
我不知道有哪个操作系统的资深用户会对默认终端满意。在 macOS 这块土地上,我选择了 [iTerm2][4],它允许我比基本的操作系统终端应用更灵活。我最喜欢的 iTerm 强大功能之一是能够使用 `Command+D``Command+Shift+D` 来垂直和水平分割窗格。还有很多技巧需要学习,但仅是简单的分割窗格就值得用 iTerm2 换掉默认终端。
### 上下文感知的插件
即使是一个古板的用户也会自定义终端提示,其中一个原因是为了获得一些情境感知。我喜欢终端给我提供上下文,并回答所有想到的问题。不仅仅是我在哪个文件夹里,而是:我在什么机器上?这是个 Git 仓库吗?如果是,我在哪个分支?我是在 Python 虚拟环境中吗?
这些问题的答案最终都归结为一类称之为“上下文感知插件”的终端扩展。
对于当前的 Git 分支,我使用了这个 [parse_git_branch()][9] 方法(如果你使用的是 [Oh My Zsh][10],也有类似的插件)。对于 Python 来说virtualenv 会自动给提示符加前缀。Oh My Zsh 有如此多的[插件][11],你一定能找到改善你生活的东西。
至于我的本地机?我就直接用 `PS1` 格式,因为我喜欢这样的基本信息,而且 macOS 并没有*真正*让你给机器起个名字。
### 多行提示符也不错
观察力强的读者可能会注意到,十年来我的提示符有一个变化,就是现在它是两行。这是最近的一个变化,我慢慢学会了喜欢,因为我前面提到的所有这些插件都让我的提示符变得很长很长。你在文件系统中导航不能太深,要不你试图做任何基本的事情都会输入换行。随之而来的是偶尔的重绘问题和可读性问题。
我收到的关于解决这个问题的建议大多围绕着“哦,你在用 zsh用 [Powerlevel10k][12] 吧!”这对于像我这样不固步自封的人来说是不错的,但我能够从这些主题中学习到一些,并从中获取一点技巧。
我所做的是在我的提示符中的最后一个 `$` 前加一个 `$'\n'`,这样我的上下文信息 —— 当前机器、当前文件夹、当前 GitHub 分支、当前 virtualenv 等等 —— 都可以在一行中出现,然后我的命令就可以顺利输入了。
我发现唯一的问题是学会在哪里*看*。我习惯于让我的眼睛从行的中心开始,因为以前我的提示符就是从那里开始的。我正在慢慢学会向左看提示符,但这是一个缓慢的过程。我有十几年的眼睛习惯要撤销。
### 使用适合你的方法
如果你喜欢某种风格或工具,那么你的这种偏好是绝对有效的。你可以尝试其他的东西,但千万不要认为你必须使用最新和最伟大的,只是为了像很酷的孩子一样。你的风格和喜好可以随着时间的推移而改变,但千万不要被迫做出对你来说不舒服的改变。
*等下一次,凯蒂阿姨再给你吐槽一下 IDE。*
--------------------------------------------------------------------------------
via: https://opensource.com/article/20/7/mac-terminal
作者:[Katie McLaughlin][a]
选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/glasnt
[b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_cafe_brew_laptop_desktop.jpg?itok=G-n1o1-o (Coffee and laptop)
[2]: https://konsole.kde.org/
[3]: https://github.com/brson/zenburn-konsole
[4]: https://www.iterm2.com/
[5]: https://gist.github.com/fooforge/3373215
[6]: https://opensource.com/article/20/1/bash-scripts-aliases
[7]: https://formulae.brew.sh/formula/coreutils
[8]: https://opensource.com/article/20/6/homebrew-mac
[9]: https://gist.github.com/kevinchappell/09ca3805a9531b818579
[10]: https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git
[11]: https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins
[12]: https://github.com/romkatv/powerlevel10k

Some files were not shown because too many files have changed in this diff Show More